VESA

Тема в разделе "WASM.BEGINNERS", создана пользователем pashe4ka13, 6 окт 2010.

  1. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    Здравствуйте!!! Помогите пожалуйсто! Как вывести изображение на экран в высоком разрешении используя функции VESA?
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
  3. Den_Zurin

    Den_Zurin New Member

    Публикаций:
    0
    Регистрация:
    29 фев 2008
    Сообщения:
    4
    pashe4ka13, читай статьи Сергея Андрианова в журнале "Мир ПК". Есть в электронном виде на osp.ru:
    http://www.google.ru/search?q=андрианов+vesa+site:www.osp.ru
    Там описывается и VESA 1.2 в реальном 16-разрядном режиме, и VESA 2.0 в защищенном 32-разрядном.
     
  4. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    Спасибо за ссылки. Написал на 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 '?'

    Вывод на скриншоте. Как перевести символы в шестнадцатиричные числа забыл :dntknw: Буду вспоминать. Но и так видно, что у меня в выводе 256 байт, а не 512. Почему? Это из за того, что я не указал сигнатуру VBE2 ? И еще почему такой вывод у моей проги странный? Ведь 0xB800 это верхний левый угол.
     
  5. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    а картинка где?
    а di кто обнулять будет? поэтому и не в углу, потому что в di непонятно что, а не 0
     
  6. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    Спасибо тебе KIV, xor di,di сделала вывод в начало экрана. А как сюда картинку вставить? Я вроде прикрепил к сообщению фаил
     
  7. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Залить на какой-нить хостинг картинок. Например, itmages.ru (этот тот которым пользуюсь я. есть и другие. чтобы их найти достаточно набрать в гугле "хостинг картинок"). Там тебе дадут bbcode превьюшки, его сюда и вставляешь.
     
  8. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    Понятно. А как на счет 512 байт? Пробую в начало буфера записать сигнатуру VBE2 вывод тот же
     
  9. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Сигнатуру в начало буфера BIOS суёт сам, чтобы доказать, что он VESA.
    Структура VESA выглядит так:
    Код (Text):
    1. typedef struct VBE_VgaInfo  
    2. { char VESASignature[4];
    3.   short VESAVersion;
    4.   char *OemStringPtr;
    5.   ulong Capabilities;
    6.   ulong VideoModePtr;
    7.   short TotalMemory;
    8.   //VBE 2.0
    9.   short OemSoftwareRev;
    10.   char *OemVendorNamePtr;
    11.   char *OemProductNamePtr;
    12.   char *OemProductRevPtr;
    13.   char reserved[222];
    14.   char OemData[256];
    15. };
    reserved и OemData вполне могут быть 0.
     
  10. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Сигнатуру он суёт свою, по-моему "VESA" - это после записи данных.
    Но если перед запросом туда записать "VBE2" - вывод должен быть по стандарту VESA 2+
    Если этого не сделать, данные в буфере будут только о режимах соответствующих VESA 1.0

    VBE30 specification, стр. 26
    Может ты сигнатуру в перевёрнутом виде пишешь?
    И что значит вывод тот же?
    Он и должен быть тот же, добавляются только поля:
     
  11. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    Всем здравствуйте!!! Огромное всем спасибо за подсказки. Отдельное спасибо KIVу за код. Я его немного модифицировал, для своих нужд:
    Код (Text):
    1. org 0x600
    2. use16
    3.     mov   dword [VESASignature],'VBE2'
    4.     mov   ax,0x4f00
    5.     mov   di,VESAI
    6.     int   10h
    7.     xor si,si
    8.     lea si,word ptr VESAI
    9.     mov cx,512
    10. @@:
    11.  
    12.     lodsb
    13.     mov bx,ax
    14.     mov bh,0
    15.     shr bl, 4
    16.     lea di,word ptr digits
    17.     add bx, di
    18.     push ax
    19.     mov al, [bx]
    20.     mov ah, 0x0E
    21.     int 0x10
    22.     pop ax
    23.     mov bl, al
    24.     and bx, 0x0F
    25.     lea di,word ptr digits
    26.     add bx, di
    27.     mov al, [bx]
    28.     mov ah, 0x0E
    29.     int 0x10
    30.     mov al, " "
    31.     int 0x10
    32.     loop @b
    33. stop:
    34.     mov eax,[OemStringPtr]
    35.     lds si, dword ptr eax
    36. @@:
    37.     lodsb
    38.     test al, al
    39.     jz @f
    40.     mov ah, 0x0E
    41.     int 0x10
    42.     jmp @b
    43. @@:
    44.     jmp $
    45.  
    46. digits db "0123456789ABCDEF"
    47. struc VESAInfoBlock
    48.  {
    49. VESASignature  db '++++'      
    50. VESAVersion    dw ?    
    51. OemStringPtr   dd ?    
    52. Capabilities   db 4 dup (?)    
    53.  VideoModePtr   dd ?    
    54. TotalMemory    dw ?    
    55. OemSoftwareRev dw ?    
    56. OemVendorNamePtr       dd ?    
    57. OemProductNamePtr      dd ?    
    58. OemProductRevPtr       dd ?    
    59. Reserved       db 222 dup (?)  
    60. OemData        db 256 dup (?)  
    61. }
    62. VESAI VESAInfoBlock
    функция выдаёт
    Код (Text):
    1. 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
    2.  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
    3. 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
    4. 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
    5.  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
    6. 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
    7. 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
    8.  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
    9. 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
    10. 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
    11.  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
    12. 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
    13. 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
    14.  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
    15. 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
    16. 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
    17.  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
    18. 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
    19. 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
    20.  CC CC CC CC CC
    У меня проблемы с пониманием сегмент:смещение. OemStringPtr = 76 11 00 C8. Как обратиться по данному адресу, что бы прочитать информацию о производителе видеокарты?
     
  12. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    И еще, подскажите пожалуйста, какой использовать отладчик для 16-bit кода реального режима под OS Vista?
     
  13. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    pashe4ka13
    Любой древний отладчик для ДОС (лично я в своё время использовал Turbo Debugger). Кроме того, можно запускать свои программы на каком-нибудь эмуляторе, имеющем собственный отладчик.
     
  14. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Я весой никогда не пользовался, но похоже, что это физический 32-разрядный адрес, а не пара сегмент:смещение. Если я прав, то добраться до информации можно будет лишь в защищённом режиме.
     
  15. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Всё почти верно: вместо mov eax, [OemStringPtr] / lds si, dword ptr eax нужно использовать просто lds si, [OemStringPtr] и тогда в ds:si получится 16:16 адрес строки производителя (C800:1176).

    Скорее всего понадобится эмулятор. В Bochs есть встроенный отладчик.
     
  16. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Это сегмент:смещение - 0xC800:0x1176
     
  17. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    cppasm
    А, в пространстве адресов видеоБИОС. Как-то не допёр сам :) Век живи, век учись -- и дураком помрёшь.
     
  18. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    offtop: Нестандартные окна:
    Код (Text):
    1. include '%fasm%\win32ax.inc'
    2. section '.code' executable writable
    3. start:
    4.         invoke wsprintf,lpBff,'%#80x',[lpData]
    5.         invoke MessageBox,NULL,lpBff,lpData,MB_OK
    6.  
    7. exit:
    8.         invoke ExitProcess,NULL
    9.  
    10.         lpData rw NULL
    11.         lpBff db 256 dup ?
    12.  
    13. .end start
    =)
     
  19. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    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 находится в перевернутом виде и то что может "гавкнуть" видеокарта. Может подскажете как кодируется цвет?
     
  20. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Нужно ещё обратить внимание на биты 6 и 7 в ModeAttributes: доступа через окошки может и не быть, а к линейному фрейм-буферу из real-address mode не так просто дотянуться.

    Формат .BMP достаточно подробно документирован в том же MSDN. Битмэп там может быть как bottom-up, так и top-down, в заголовке об этом сказано. Ну и кодирование, вестимо, зависит от глубины цвета, формата и алгоритма сжатия.