OSDev http://osdev.su/ |
|
Как работает биус http://osdev.su/viewtopic.php?f=5&t=456 |
Страница 3 из 3 |
Автор: | Himik [ 03 ноя 2011, 11:34 ] |
Заголовок сообщения: | Re: Как работает биус |
Станислав писал(а): Я понял, что нужно сначало установить нужный видеорежим, потом спрашивая его получить начало видео буфера или памяти. Лучше сначала запросить параметры, а потом уже устанавливать. Дело в том, что по одному номеру разрешение и глубина цвета на разных видеокартах разные. Я использую целый цикл - перебираю все существующие номера от 0x100 и выше, и выбираю подходящий по параметрам. |
Автор: | phantom-84 [ 03 ноя 2011, 12:26 ] |
Заголовок сообщения: | Re: Как работает биус |
Я с функциями VESA с малолетства не работал, но если не ошибаюсь, то нужно сначала получить список доступных режимов, а потом уже по номеру режима (из имеющегося списка) получать параметры этого режима и сравнивать их с требуемыми значениями. Т.е. нет необходимости перебирать все номера, тем более что они 16-разрядные. |
Автор: | Himik [ 03 ноя 2011, 14:18 ] |
Заголовок сообщения: | Re: Как работает биус |
phantom-84 писал(а): Я с функциями VESA с малолетства не работал, но если не ошибаюсь, то нужно сначала получить список доступных режимов Точно, я так и делал, да забыл. С помощью функции AL=0h получается массив с полным списком режимов, а потом уже по этому списку пробегаешься. Номера меньше 0x100 относятся к VGA, их можно пропускать. Так что проверяются номера не от 0 до 255, а от 256 и выше. Номер 0xFFFF признак конца массива. |
Автор: | Станислав [ 03 ноя 2011, 15:02 ] |
Заголовок сообщения: | Re: Как работает биус |
да у меня получилось запросить тип данных весаинфа CType = array[0..255]of char; CPtr = ^CType; WType = array[0..255]of word; WPtr = ^WType; VesaInfoBlock = record VESASignature : array[0..3]of char; {"VESA"} VESAVersion : word; {номер версии VESA} OEMStringPtr : CPtr; {указатель на строку с названием производителя (OEM) } Capabilities : dword; {флаги графических возможностей} VideoModePtr : WPtr; {указатель на список поддерживаемых видеорежимов} TotalMemory : word; {количество видеопамяти в 64-килобайтных блоках} Reserved : array[0..235]of byte; {зарезервировано} END; Собственно переберая VideoModePtr как массив с режимами до FFFF и подставляя его в запрос информации о этом режиме получаеш размеры: ширина, высота, размер пикселя, поддерживает LFB или нет, и многое другое. Кстати режимов много выводит у меня на ноутбуке с ati hd4570 до 1900 на 1600 правдо LFB не потдерживал, хотя мой размер 1366 на 768, его небыло. |
Автор: | Станислав [ 04 ноя 2011, 07:30 ] |
Заголовок сообщения: | Re: Как работает биус |
пытаюсь теперь на фасме org 100h ;Это будет .сом файл mov ax, 4F00h ;функция получения информации о весе в буфер VESAInfoBuffer mov di, VESAInfoBuffer int 10h cmp ax, 004Fh jne .exit mov ah,14 ;функция вывода символов первых четырёх mov bx,VESAInfoBuffer ;из VESAInfoBuffer mov al,[bx] int 10h inc bx mov al,[bx] int 10h inc bx mov al,[bx] int 10h inc bx mov al,[bx] int 10h ;как вывести информацию о производителе? в нашем буфере после 6 байта ;только адрес на строку, я тут не силён ещё mov bx,word[VESAInfoBuffer+6] mov al,[bx] int 10h inc bx mov al,[bx] int 10h inc bx mov al,[bx] int 10h ;здесь также адрес на массив с режимами вбуфере VESAInfoBuffer после 14 байта. как их прочитать mov ax,4F01h mov si,word[VESAInfoBuffer+13] mov cx,[si] mov di,ModeInfoBuffer int 10h cmp ax, 004Fh jne .exit .exit: ret ;Завершим программу VESAInfoBuffer rb 256 ModeInfoBuffer rb 256 |
Автор: | phantom-84 [ 04 ноя 2011, 14:36 ] |
Заголовок сообщения: | Re: Как работает биус |
Код: org 100h
mov ax,4F00h mov di,VESAInfoBlock int 10h cmp ax,4Fh je short @f mov si,errorstr jmp putstr @@: mov al,[major] aam 10 add al,"0" mov [majordigit],al mov al,[minor] aam 10 add al,"0" mov [minordigit],al mov si,vesastr call putstr cmp [major],2 jb short @f inc si call putstr lds si,[productnameptr] call putstr push es pop ds @@: lds si,[modelistptr] xor dx,dx jmp .start .next: push ds push es pop ds add si,2 push si inc dx push dx and dx,0Fh jnz short @f push cx mov si,contstr call putstr mov ah,0 int 16h pop cx @@: mov al,ch call hexbyte mov [high],ax mov al,cl call hexbyte mov [low],ax xor ax,ax ; for ancient versions mov [width],ax mov [height],ax mov [depth],al mov ax,4F01h mov di,ModeInfoBlock int 10h mov si,term cmp ax,4Fh je short @f mov word [si],"?" jmp .display @@: mov ax,[width] call usword mov byte [si],"x" inc si mov ax,[height] call usword mov byte [si],"x" inc si mov al,[depth] ; ah=0 call usword mov [si],ah .display: mov si,modestr call putstr pop dx pop si pop ds .start: mov cx,[si] cmp cx,0FFFFh jne short .next push es pop ds mov si,exitstr call putstr mov ah,0 int 16h ret @@: mov bx,7 mov ah,0Eh push si int 10h pop si inc si putstr: mov al,[si] and al,al jg short @b ret hexbyte: aam 10h cmp al,0Ah sbb al,69h das xchg al,ah cmp al,0Ah sbb al,69h das ret usword: mov bx,10 xor cx,cx @@: xor dx,dx div bx inc cx push dx and ax,ax jnz short @b @@: pop ax add al,"0" mov [si],al inc si loop @b ret errorstr: db 13,10,"Cannot get VESA info!",32,0 vesastr: db 13,10,"VESA ?.?",0,32,"on",32,0 label majordigit byte at vesastr+7 label minordigit byte at vesastr+9 modestr: db 13,10,"0x????:",32,6+6+4 dup ? label high word at modestr+4 label low word at modestr+6 label term word at modestr+10 contstr: db 13,10,"Press any key to continue...",32,0 exitstr: db 13,10,"Press any key to exit...",32,0 align 4 VESAInfoBlock: db "VBE2" rb 508 label minor byte at VESAInfoBlock+4 label major byte at VESAInfoBlock+5 label modelistptr dword at VESAInfoBlock+14 label productnameptr dword at VESAInfoBlock+26 ModeInfoBlock: rb 256 label width word at ModeInfoBlock+18 label height word at ModeInfoBlock+20 label depth byte at ModeInfoBlock+25 |
Автор: | phantom-84 [ 04 ноя 2011, 16:13 ] |
Заголовок сообщения: | Re: Как работает биус |
Стал тестировать на древнем железе и увидел, что в список режимов попали текстовые режимы: При необходимости их можно исключить. Edited. Обновлена ссылка на фотку. |
Автор: | Станислав [ 04 ноя 2011, 17:58 ] |
Заголовок сообщения: | Re: Как работает биус |
Код хороший но мне трудно пока быстро разобраться Как вы читаете значения из адреса modelistptr который в VESAInfoBlock+14 и производителя из адреса на строку в VESAInfoBlock+6 |
Автор: | pavia [ 04 ноя 2011, 18:19 ] |
Заголовок сообщения: | Re: Как работает биус |
Цитата: Код хороший но мне трудно пока быстро разобраться Стиль не очень удобный до восприятия новичком. А именно видно, что автор старался оптимизировал код. Читается оно так lds si,[modelistptr] Хотя я бы сделал через es, а не через ds. Правда сейчас для этого по требуется переделать всю программу. lds si,[modelistptr] - загружает указатель в пару ds:si из памяти modelistptr А затем mov cx,[si] - здесь берётся значение из указателя ds:si и помещается в cx (операция разыменования указателя в паскале) |
Автор: | phantom-84 [ 04 ноя 2011, 20:22 ] |
Заголовок сообщения: | Re: Как работает биус |
Станислав писал(а): Код хороший но мне трудно пока быстро разобраться Подпрограммы отдели горизонтальными разделителями, будет немного проще.Цитата: Как вы читаете значения из адреса modelistptr который в VESAInfoBlock+14 Знаешь, что такое дальний указатель? Он содержит не только внутрисегментное смещение, но и сегментный адрес (или селектор в защищенном режиме). Т.к. в структурах VESA применяются именно дальние указатели, я перезагружал в том числе и сегментный регистр для доступа к данным, на которые этот указатель указывает. И хотя чаще всего эти данные находятся в тех же самых структурах, применение дальних указателей диктует именно такой способ работы с данными.и производителя из адреса на строку в VESAInfoBlock+6 pavia писал(а): Хотя я бы сделал через es, а не через ds. Правда сейчас для этого по требуется переделать всю программу. +1
|
Страница 3 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |