VESA в защищенном режиме

Тема в разделе "WASM.ASSEMBLER", создана пользователем Aloner, 11 апр 2008.

  1. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    ФТП сменил адресс.
    ftp://2001:0:d5c7:a2d6:289f:39e1:c173:2f7/

    Пример того как можно настроить ipv6 в вин XP и FreeBSD
    http://ihtiandr.info/unix/1-unix/90-freebsd-ipv6-configuration-guide-manual-how-to.html

    По просьбе выкладываю и через стандартную сеть.

    http://narod.ru/disk/12349836000/VESA.rar.html
     
  2. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    это все здорово, я тоже много чего нашел. Вопрос (сам пока еще не успел найти), как определить сколько контроллеров, мониторов?
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    NoName
    Берем и перебираем все возможные значения cx. Стандарт это не регулирует встречал такое что cx=0 не выдовал значения. А вот cx=1 выдовал, а бывает что и выдает дубликат.

    Вообщем если хочешь то можно так через PCI находим все видео карты и общаемся к драйверу этого устройства он уже опрашивает устройство.
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Непонятка. Детектирую все разрешения монитора и видеоконтроллера. Выбираю из доступных совместимый, обязательно 32-х битный.

    Пиксель рисую такой тестовой функцией (расчеты на основе http://www.wasm.ru/article.php?article=lfbdos):
    Код (Text):
    1. static void DrawPixel(const WORD PosX, const WORD PosY) {
    2.     const int ColorComponents = 4;
    3.     const DWORD RelBideoAddr =
    4.         (Resolution[HORZ_RESOLUTION] * PosY * ColorComponents) + (PosX * ColorComponents);
    5.  
    6.     const BYTE Blue = 0;
    7.     const BYTE Green = 0;
    8.     const BYTE Red = 100;
    9.     const BYTE Alpha = 0;
    10.  
    11.     AsmWriteB(LFBAddress + RelBideoAddr + 0, Blue);     //Blue
    12.     AsmWriteB(LFBAddress + RelBideoAddr + 1, Green);    //Green
    13.     AsmWriteB(LFBAddress + RelBideoAddr + 2, Red);      //Red
    14.     AsmWriteB(LFBAddress + RelBideoAddr + 3, Alpha);    //Alpha
    15. }/* --------------------------------------------------------------------------------------------- */
    16. /* ---------------------------------------------------------------------------------------------- */
    Непосредственно вызов приведенной функции осуществляется таким способом:

    Код (Text):
    1.     {
    2.        WORD x, y;
    3.        
    4.        for(x = 0; x < Resolution[HORZ_RESOLUTION]; x++) {
    5.           for(y = 0; y < Resolution[VERT_RESOLUTION]; y++) {
    6.              DrawPixel(x, y);
    7.           }
    8.        }
    9.     }
    Экран корректно переключается в новый режим (смотрю через его меню и сопоставлю с тем какой должен быть).
    а. AsmSetVideoMode(CodeOfVideoMode | VESA_SELECT_LFB | VESA_PRESERVE_VIDEO_MEM);
    VESA_SELECT_LFB (14)
    VESA_PRESERVE_VIDEO_MEM (15)

    На экране появляется сверху красная полоска, а остальная часть с предыдущими данными из видеопамяти.
    б. с очисткой (без флага VESA_PRESERVE_VIDEO_MEM)
    На экране появляется сверху такая же красная полоска, остальное черное.

    Непонимаю почему пиксели выводятся не там где надо.
    Resolution[HORZ_RESOLUTION] & Resolution[VERT_RESOLUTION] правильные, есть подозрение что в алгаритме чего-то нехватает.
    LFBAddress тот который дал контроллер (0xD800.0000).

    Код (Text):
    1. _AsmWriteB proc far
    2.     push bp
    3.     mov bp,sp
    4.     push esi
    5.     push ax
    6.     mov esi,dword ptr [bp + 6]
    7.     mov al,byte ptr [bp + 10]
    8.     mov byte ptr gs:[esi],al
    9.     pop ax
    10.     pop esi
    11.     pop bp
    12.     ret
    13. endp
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Resolution[HORZ_RESOLUTION] * ColorComponents может не соотвествовать длине линии. Надо считывать.

    Попробуй другое разрешение. Бывает так что изоброжение не выравненно на мониторе при одном разрешении, а при другом нормально.
     
  6. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Pavia

    1280x1024, два совершенно разных монитора.

    BytesPerScanLine = LinBytesPerScanLine = 3200
    Почему 3200 если должно быть 5120?
    BytesPerScanLine насколько я понял только для не LFB, а для LFB - LinBytesPerScanLine и он только от VBE 3.0, а она не везде есть.
    В любом случае полоска остается такой же (на беглый взгляд).

    Кстати моник второй широкий, выдает по edid низкое разрешение - 1280x1024 когда может держать гораздо больше, это связано как-то с контроллером?
     
  7. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    правильно ли я понимаю что "Maximum Resolution" в EDID определяется через STANDARD TIMING IDENTIFICATION?
     
  8. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Наверно 3200/4=800 ты с разрешением напутал.

    EDID выдает наилучшее разрешение, на который монитор рассщитан я на своем 15" CRT ставил 1600x1200 хотя он рассщитан на 1024х768. Хотя для широко форматных не редкость данные в EDID вшиты не корректные.

    С контроллером это не связанно. Это контроллер под моник подстраивается.
     
  9. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Pavia
    А как это правильно понимать?
     
  10. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Сверху полоски такой же толщины что и полоса раньше, повторяются. Это мне напомнило что когда не очищал видеопамять соответствующим флагом там были маленькие подобия окон с искажениями и дос текстом.
    Код (Text):
    1.     {
    2.        WORD x = 0, y = 0;
    3.        
    4.        //for(x = 0; x < Resolution[HORZ_RESOLUTION]; x++) {
    5.           for(y = 0; y < Resolution[VERT_RESOLUTION]; y++) {
    6.              DrawPixel(x, y);
    7.           }
    8.        //}
    9.     }
     
  11. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Проблема решена переходом из нереального режима в защищенный :)
     
  12. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Подскажите пожалуйста.
    1. Как лучше в случае линейного буффера организовать двойную буферизацию? Проверял простой записью в буфер нескольких изображений, видно что моргает если быстро и если медленно.
    2. Сделал по спецификации запросы:

    и такой.

    Через код:
    Код (Text):
    1. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    2. ;DWORD AsmCheckDCC(const WORD ControllerNumber);
    3. VESA_DDC_CONTROLLER_NUMBER equ 6
    4. ;see VBEDDC11.pdf
    5. _AsmCheckDCC proc far
    6.     push bp
    7.     mov bp,sp
    8.     push es
    9.     push si ; protection
    10.     push di ; protection
    11.     pushf ; protection
    12.  
    13.     push cx
    14.     push bx
    15.  
    16.     mov cx,word ptr [bp + VESA_DDC_CONTROLLER_NUMBER] ; Controller unit number (00 = primary) (*)
    17.  
    18.     mov ax,4F15h    ; VESA VBE/DC (Display Data Channel) - INSTALLATION CHECK / CAPABILITIES
    19.     mov bx,0        ; Report DDC Capabilities
    20.     mov es,bx       ; must be null pointer, reserved
    21.     mov di,bx       ; must be null pointer, reserved
    22.     int 10h         ; All other registers may be destroyed!
    23.  
    24.     ; ignore bh - Approx. time in seconds, rounded up, to transfer one EDID block
    25.     movzx dx, bl ; DDC level supported
    26.  
    27.     ; out dx,ax - ddc version, ddc status
    28.  
    29.     pop bx
    30.     pop cx
    31.  
    32.     popf ; protection
    33.     pop di ; protection
    34.     pop si ; protection
    35.     pop es
    36.     pop bp
    37.     ret
    38. endp
    39. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    40. ;WORD AsmReadEDID(const WORD ControllerNumber, const WORD EDIDBlockNum, EDIDInfo * EdidStructPtr);
    41. ;VESA_DDC_CONTROLLER_NUMBER equ 6
    42. VESA_EDID_BLOCK_NUMBER equ 8
    43. VESA_EDID_STRUCTURE_OFFSET equ 10
    44. ;see VBEDDC11.pdf
    45. _AsmReadEDID proc far
    46.     push bp
    47.     mov bp,sp
    48.     push es
    49.     push si ; protection
    50.     pushf   ; protection
    51.     push di
    52.     push bx
    53.     push cx
    54.     push dx
    55.  
    56.     ; cx - monitors, if not availible - 30 sec lacuna; or controllers see get-edid.c ???
    57.     mov cx,word ptr [bp + VESA_DDC_CONTROLLER_NUMBER]
    58.     mov dx,word ptr [bp + VESA_EDID_BLOCK_NUMBER]       ; EDID Block Number (additional info)
    59.     les di,dword ptr [bp + VESA_EDID_STRUCTURE_OFFSET]  ; pointer to area with space for EDID
    60.  
    61.     mov ax,4F15h    ; VESA VBE/DC (Display Data Channel) - READ EDID
    62.     mov bx,1h       ; Read EDID
    63.     int 10h         ; All other registers may be destroyed!
    64.  
    65.     ;result in ax
    66.  
    67.     pop dx
    68.     pop cx
    69.     pop bx
    70.     pop di
    71.     popf    ; protection
    72.     pop si  ; protection
    73.     pop es
    74.     pop bp
    75.     ret
    76. endp
    77. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    Код (Text):
    1. const WORD GetInfoResult = AsmVesaGetInfo(VESAInfoPtr);
    2. CheckResult(__LINE__, GetInfoResult, __FILE__, "CheckVBE(): VESA is not supported");
    Код (Text):
    1. EDIDInfo * EDIDStructPtr = XCalloc(sizeof(EDIDInfo));
    2. const WORD GetInfoResult = AsmReadEDID(CONTROLLER1, 0, EDIDStructPtr);
    Работает почему то не на всех модулях. Есть модули которые выдают что поддерживают DDC 1 & 2 по первой функции, а сами по второй функции пишут что вызов неудался, но функция поддерживается. Непонимаю как это так, может где-то ошибка? Перепроверял. При всем этом на этих модулях работает венда.
     
  13. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Это два разных вопроса: 1 и 2.

    У меня PM без страничной адресации. Предпологаю сделать буферизацию программно.
     
  14. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Проверил под вендой, видимо этой действительно неправильный EDID, поскольку после установки вендой драйвера все становится нормально.
    Подскажите есть ли нормальные широкоформатные мониторы, может быть это от фирмы зависит?
     
  15. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Можно ли как-нибудь по другому узнать точное максимальное разрешение монитора?
     
  16. reversecode

    reversecode Guest

    Публикаций:
    0
    EDID поддерживаеться даже оооочень старыми мониторами
    так что даже незнаю что вам подсказать

    поставте какойто юникс себе
    и xorg с драйвером vesa
    там все реализовано
    и сравните свои вызовы ирезультаты с ним
    может тогда проясниться
     
  17. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    По второму вопросу покопал биос но вроде там ничего не влияет :dntknw: