OSDev

для всех
Текущее время: 30 апр 2024, 09:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Как работает биус
СообщениеДобавлено: 03 ноя 2011, 11:34 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Станислав писал(а):
Я понял, что нужно сначало установить нужный видеорежим, потом спрашивая его получить начало видео буфера или памяти.

Лучше сначала запросить параметры, а потом уже устанавливать. Дело в том, что по одному номеру разрешение и глубина цвета на разных видеокартах разные. Я использую целый цикл - перебираю все существующие номера от 0x100 и выше, и выбираю подходящий по параметрам.


Последний раз редактировалось Himik 03 ноя 2011, 14:34, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работает биус
СообщениеДобавлено: 03 ноя 2011, 12:26 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Я с функциями VESA с малолетства не работал, но если не ошибаюсь, то нужно сначала получить список доступных режимов, а потом уже по номеру режима (из имеющегося списка) получать параметры этого режима и сравнивать их с требуемыми значениями. Т.е. нет необходимости перебирать все номера, тем более что они 16-разрядные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работает биус
СообщениеДобавлено: 03 ноя 2011, 14:18 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
phantom-84 писал(а):
Я с функциями VESA с малолетства не работал, но если не ошибаюсь, то нужно сначала получить список доступных режимов

Точно, я так и делал, да забыл. С помощью функции AL=0h получается массив с полным списком режимов, а потом уже по этому списку пробегаешься. Номера меньше 0x100 относятся к VGA, их можно пропускать. Так что проверяются номера не от 0 до 255, а от 256 и выше. Номер 0xFFFF признак конца массива.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работает биус
СообщениеДобавлено: 03 ноя 2011, 15:02 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
да у меня получилось запросить тип данных весаинфа

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, его небыло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работает биус
СообщениеДобавлено: 04 ноя 2011, 07:30 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
пытаюсь теперь на фасме
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работает биус
СообщениеДобавлено: 04 ноя 2011, 14:36 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Код:
   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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работает биус
СообщениеДобавлено: 04 ноя 2011, 16:13 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Стал тестировать на древнем железе и увидел, что в список режимов попали текстовые режимы:
Изображение
При необходимости их можно исключить.

Edited. Обновлена ссылка на фотку.


Последний раз редактировалось phantom-84 20 апр 2014, 11:46, всего редактировалось 4 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работает биус
СообщениеДобавлено: 04 ноя 2011, 17:58 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
Код хороший но мне трудно пока быстро разобраться

Как вы читаете значения из адреса modelistptr который в VESAInfoBlock+14
и производителя из адреса на строку в VESAInfoBlock+6


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работает биус
СообщениеДобавлено: 04 ноя 2011, 18:19 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
Код хороший но мне трудно пока быстро разобраться

Стиль не очень удобный до восприятия новичком. А именно видно, что автор старался оптимизировал код.


Читается оно так
lds si,[modelistptr]

Хотя я бы сделал через es, а не через ds. Правда сейчас для этого по требуется переделать всю программу.

lds si,[modelistptr] - загружает указатель в пару ds:si из памяти modelistptr

А затем
mov cx,[si] - здесь берётся значение из указателя ds:si и помещается в cx (операция разыменования указателя в паскале)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как работает биус
СообщениеДобавлено: 04 ноя 2011, 20:22 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Станислав писал(а):
Код хороший но мне трудно пока быстро разобраться
Подпрограммы отдели горизонтальными разделителями, будет немного проще.

Цитата:
Как вы читаете значения из адреса modelistptr который в VESAInfoBlock+14
и производителя из адреса на строку в VESAInfoBlock+6
Знаешь, что такое дальний указатель? Он содержит не только внутрисегментное смещение, но и сегментный адрес (или селектор в защищенном режиме). Т.к. в структурах VESA применяются именно дальние указатели, я перезагружал в том числе и сегментный регистр для доступа к данным, на которые этот указатель указывает. И хотя чаще всего эти данные находятся в тех же самых структурах, применение дальних указателей диктует именно такой способ работы с данными.

pavia писал(а):
Хотя я бы сделал через es, а не через ds. Правда сейчас для этого по требуется переделать всю программу.
+1


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB