Здравствуйте!!! Помогите пожалуйсто! Как вывести изображение на экран в высоком разрешении используя функции VESA?
pashe4ka13, читай статьи Сергея Андрианова в журнале "Мир ПК". Есть в электронном виде на osp.ru: http://www.google.ru/search?q=андрианов+vesa+site:www.osp.ru Там описывается и VESA 1.2 в реальном 16-разрядном режиме, и VESA 2.0 в защищенном 32-разрядном.
Спасибо за ссылки. Написал на FASM'e код : org 600h use16 xor di,di mov ax,4f00h mov di,message int 0x10 mov ax,3 int 0x10 mov ax,0xB800 mov es,ax cld mov cx,512 lea si,[message] lop: movsb inc di loop lop jmp $ message db 512 dup '?' Вывод на скриншоте. Как перевести символы в шестнадцатиричные числа забыл Буду вспоминать. Но и так видно, что у меня в выводе 256 байт, а не 512. Почему? Это из за того, что я не указал сигнатуру VBE2 ? И еще почему такой вывод у моей проги странный? Ведь 0xB800 это верхний левый угол.
Спасибо тебе KIV, xor di,di сделала вывод в начало экрана. А как сюда картинку вставить? Я вроде прикрепил к сообщению фаил
Залить на какой-нить хостинг картинок. Например, itmages.ru (этот тот которым пользуюсь я. есть и другие. чтобы их найти достаточно набрать в гугле "хостинг картинок"). Там тебе дадут bbcode превьюшки, его сюда и вставляешь.
Сигнатуру в начало буфера BIOS суёт сам, чтобы доказать, что он VESA. Структура VESA выглядит так: Код (Text): typedef struct VBE_VgaInfo { char VESASignature[4]; short VESAVersion; char *OemStringPtr; ulong Capabilities; ulong VideoModePtr; short TotalMemory; //VBE 2.0 short OemSoftwareRev; char *OemVendorNamePtr; char *OemProductNamePtr; char *OemProductRevPtr; char reserved[222]; char OemData[256]; }; reserved и OemData вполне могут быть 0.
Сигнатуру он суёт свою, по-моему "VESA" - это после записи данных. Но если перед запросом туда записать "VBE2" - вывод должен быть по стандарту VESA 2+ Если этого не сделать, данные в буфере будут только о режимах соответствующих VESA 1.0 VBE30 specification, стр. 26 Может ты сигнатуру в перевёрнутом виде пишешь? И что значит вывод тот же? Он и должен быть тот же, добавляются только поля:
Всем здравствуйте!!! Огромное всем спасибо за подсказки. Отдельное спасибо KIVу за код. Я его немного модифицировал, для своих нужд: Код (Text): org 0x600 use16 mov dword [VESASignature],'VBE2' mov ax,0x4f00 mov di,VESAI int 10h xor si,si lea si,word ptr VESAI mov cx,512 @@: lodsb mov bx,ax mov bh,0 shr bl, 4 lea di,word ptr digits add bx, di push ax mov al, [bx] mov ah, 0x0E int 0x10 pop ax mov bl, al and bx, 0x0F lea di,word ptr digits add bx, di mov al, [bx] mov ah, 0x0E int 0x10 mov al, " " int 0x10 loop @b stop: mov eax,[OemStringPtr] lds si, dword ptr eax @@: lodsb test al, al jz @f mov ah, 0x0E int 0x10 jmp @b @@: jmp $ digits db "0123456789ABCDEF" struc VESAInfoBlock { VESASignature db '++++' VESAVersion dw ? OemStringPtr dd ? Capabilities db 4 dup (?) VideoModePtr dd ? TotalMemory dw ? OemSoftwareRev dw ? OemVendorNamePtr dd ? OemProductNamePtr dd ? OemProductRevPtr dd ? Reserved db 222 dup (?) OemData db 256 dup (?) } VESAI VESAInfoBlock функция выдаёт Код (Text): 56 45 53 41 00 02 76 11 00 C8 00 00 00 01 77 01 00 C8 40 00 00 00 00 00 00 00 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CC CC CC CC CC CC CC CC CC CC C CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC C CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC C CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC C CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC C CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC C CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC C CC CC CC CC CC У меня проблемы с пониманием сегмент:смещение. OemStringPtr = 76 11 00 C8. Как обратиться по данному адресу, что бы прочитать информацию о производителе видеокарты?
И еще, подскажите пожалуйста, какой использовать отладчик для 16-bit кода реального режима под OS Vista?
pashe4ka13 Любой древний отладчик для ДОС (лично я в своё время использовал Turbo Debugger). Кроме того, можно запускать свои программы на каком-нибудь эмуляторе, имеющем собственный отладчик.
Я весой никогда не пользовался, но похоже, что это физический 32-разрядный адрес, а не пара сегмент:смещение. Если я прав, то добраться до информации можно будет лишь в защищённом режиме.
Всё почти верно: вместо mov eax, [OemStringPtr] / lds si, dword ptr eax нужно использовать просто lds si, [OemStringPtr] и тогда в ds:si получится 16:16 адрес строки производителя (C800:1176). Скорее всего понадобится эмулятор. В Bochs есть встроенный отладчик.
cppasm А, в пространстве адресов видеоБИОС. Как-то не допёр сам Век живи, век учись -- и дураком помрёшь.
offtop: Нестандартные окна: Код (Text): include '%fasm%\win32ax.inc' section '.code' executable writable start: invoke wsprintf,lpBff,'%#80x',[lpData] invoke MessageBox,NULL,lpBff,lpData,MB_OK exit: invoke ExitProcess,NULL lpData rw NULL lpBff db 256 dup ? .end start =)
baldr прав lds si, [OemStringPtr] вывело IBM SVGA BIOS, (C) 1993 International Business Machines на виртуальной машине Virtual PC и NVIDIA на реальной. Далее я вывел видеомоды. Они отличаются от стандартных видеорежимов VESA 1.2. У меня VESA 3.00. Значит, что бы найти нужный мне видеорежим я должен взять полученные из VideoModePtr видеомоды и передавать их в цикле функции 4f01h int 10h и при этом контролировать нулевой бит ModeAttributes на поддержку даннного видеорежима, а так же Xresolution и Yresolution для выбора нужного разрешения? После чего установить его функцией 4f02h int 10h. Так? И можно будет рисовать? Я хочу вывести на экран картинку в файле формата bmp. Когда то раньше,очень давно, я смог вывести так картинку не используя функции Vesa, но только с низким разрешением и в черно-белом виде, после чего моя видеокарта пришла в негодность. Мне кажется, что своими опытами, я затер флешбиос карты, так как после загрузки оси, она еще немного показывала, правда с сильным шумом. В общем из прошлых опытов я помню, что картинка в файле bmp находится в перевернутом виде и то что может "гавкнуть" видеокарта. Может подскажете как кодируется цвет?
Нужно ещё обратить внимание на биты 6 и 7 в ModeAttributes: доступа через окошки может и не быть, а к линейному фрейм-буферу из real-address mode не так просто дотянуться. Формат .BMP достаточно подробно документирован в том же MSDN. Битмэп там может быть как bottom-up, так и top-down, в заголовке об этом сказано. Ну и кодирование, вестимо, зависит от глубины цвета, формата и алгоритма сжатия.