Установить текстовый режим VGA 80x25 без BIOS

Тема в разделе "WASM.OS.DEVEL", создана пользователем Tronix, 13 окт 2017.

  1. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Здрасте,

    Помогите установить на VGA текстовый режим 80x25 с помощью портов. Нюанс - видео BIOS не загружается из основного BIOS (туда не передается управление), хотя на VGA карте присутствует.

    Скопипастил откуда-то код:

    Код (ASM):
    1. setRegs:                          
    2.          mov si, offset regs825
    3.  
    4.          mov     dx, 3C2h
    5.          lodsb
    6.          out     dx, al
    7.        
    8.          mov     dx, 3DAh
    9.          lodsb
    10.          out     dx, al
    11.  
    12.          xor     cl, cl
    13.          mov     dx, 3C4h
    14.     .l1:
    15.          lodsb
    16.          xchg    al, ah
    17.          mov     al, cl
    18.          out     dx, ax
    19.          inc     cl
    20.          cmp     cl, 4
    21.          jbe     .l1
    22.  
    23.          mov     dx, 3D4h
    24.          mov     ax, 0E11h
    25.          out     dx, ax
    26.  
    27.          xor     cl, cl
    28.          ;mov     dx, 3D4h
    29.     .l2:
    30.          lodsb
    31.          xchg    al, ah
    32.          mov     al, cl
    33.          out     dx, ax
    34.          inc     cl
    35.          cmp     cl, 18h
    36.          jbe     .l2
    37.  
    38.          xor     cl, cl
    39.          mov     dx, 3CEh
    40.     .l3:
    41.          lodsb
    42.          xchg    al, ah
    43.          mov     al, cl
    44.          out     dx, ax
    45.          inc     cl
    46.          cmp     cl, 8
    47.          jbe     .l3
    48.    
    49.          mov     dx, 3DAh
    50.          in      al, dx
    51.  
    52.          xor     cl, cl
    53.          mov     dx, 3C0h
    54.     .l4:
    55.          in      ax, dx
    56.          mov     al, cl
    57.          out     dx, al
    58.          lodsb
    59.          out     dx, al
    60.          inc     cl
    61.          cmp     cl, 14h
    62.          jbe     .l4
    63.  
    64.          mov     al, 20h
    65.          out     dx, al
    66.          ret
    67.  
    68. regs825:
    69. ; MISC
    70. db    67h, 00h
    71. ; SEQ
    72. db    03h, 00h, 03h, 00h, 02h
    73. ; CRTC
    74. db    5Fh, 4Fh, 50h, 82h, 55h, 81h, 0BFh, 01Fh
    75. db    00h, 4Fh, 0Dh, 0Eh, 00h, 00h, 00h, 50h
    76. db    9Ch, 0Eh, 8Fh, 28h, 1Fh, 96h, 0B9h, 0A3h
    77. db    0FFh
    78. ; GC
    79. db    00h, 00h, 00h, 00h, 00h, 10h, 0Eh, 00h
    80. db    0FFh
    81. ; AC
    82. db    00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
    83. db    38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
    84. db    0Ch, 00h, 0Fh, 08h, 00h
    85.  
    86.  
    Да, режим устанавливается. Но текст не виден. Походу надо еще шрифт инициализировать. Тут опять нюанс - я свой шрифт не могу хранить (места нет), поэтому нужно выдернуть шрифт из видео-BIOS или как то указать VGA, чтоб она использовала свой встроенный шрифт. Так можно?
    Спасибо.
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    А как вы проверяете, что режим установился?
    Шрифт текущего видеорежима хранятся во второй плоскости видеопамяти.
    Загрузили с жёсткого в базовую память загнали в видеопамять.
    Базовую память освободили.
    Можно также из Biosa видео карты взять.

    Код (Text):
    1.  
    2.   ;in: es:di=4k buffer
    3.   ;out: buffer filled with font
    4.   push  ds
    5.   push  es
    6.   ;ask BIOS to return VGA bitmap fonts
    7.   mov  ax, 1130h
    8.   mov  bh, 6  // 6 - VGA ROM(VGA BIOS)
    9.   int  10h
    10.   ;copy charmap
    11.   push  es
    12.   pop  ds
    13.   pop  es
    14.   mov  si, bp
    15.   mov  cx, 256*16/4
    16.   rep  movsd
    17.   pop  ds
    18.  
    Хотя бы компьютер указали. Видеокарта ISA, PCI, AGP?
     
  3. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Компьютер 8086 (Поиск-2) с ISA-8. Видеокарта VGA ISA8. Установить текстовый режим нужно в основном BIOS, как только комп включился. Только это не настоящий BIOS, а тестовый (с различными тестами), поэтому он не инициализирует add-ROM биосы, не инициализирует HDD/FDD, не хранит в себе CGA шрифт, прерывания int 10h и другие. Основной RAM считай что тоже нет, либо она может быть не рабочая - стека нет.

    А нельзя просто VGA установить режим и сказать "юзай свой встроенный знакогенератор"?
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Tronix,
    А там случае нужна схема. Дело в том что в таком компьютере возможно либо знакогенератор жёстко сидит как ROM во второй плоскости видео памяти (может и не во второй). А может он там как RAM выполнен.
     
  5. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Да не, это обычный комп, ничем от какого-нибудь Pentium 1 не отличается в принципе. Никаких там ROM нет, кроме того, который я хочу модифицировать в роли BIOS и ROM на видеокарте. Видеокарта - обычная, скажем Trident 9000 ISA-16. RAM есть на видеокарте, и конечно 640Kb в компе. Но я не хочу использовать ту, что в компе (да и зачем)?

    Хорошо, вот еще утащил такой код отсюда : http://wiki.osdev.org/VGA_Fonts

    Код (ASM):
    1.         ;in: edi=4k buffer
    2.         ;out: buffer filled with font
    3.         ;clear even/odd mode
    4.         mov            dx, 03ceh
    5.         mov            ax, 5
    6.         out            dx, ax
    7.         ;map VGA memory to 0A0000h
    8.         mov            ax, 0406h
    9.         out            dx, ax
    10.         ;set bitplane 2
    11.         mov            dx, 03c4h
    12.         mov            ax, 0402h
    13.         out            dx, ax
    14.         ;clear even/odd mode (the other way, don't ask why)
    15.         mov            ax, 0604h
    16.         out            dx, ax
    17.         ;copy charmap
    18.         mov            esi, 0A0000h
    19.         mov            ecx, 256
    20.         ;copy 16 bytes to bitmap
    21. @@:        movsd
    22.         movsd
    23.         movsd
    24.         movsd
    25.         ;skip another 16 bytes
    26.         add            esi, 16
    27.         loop            @b
    28.         ;restore VGA state to normal operation
    29.         mov            ax, 0302h
    30.         out            dx, ax
    31.         mov            ax, 0204h
    32.         out            dx, ax
    33.         mov            dx, 03ceh
    34.         mov            ax, 1005h
    35.         out            dx, ax
    36.         mov            ax, 0E06h
    37.         out            dx, ax
    То есть он мне скопирует шрифт из второй плоскости в буфер... А я не пойму, он (шрифт) там во второй плоскости как появляется? Или он там все время лежит? Или он там появляется только после того, как BIOS видеокарты заинициализится?
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Это зависит от вашей схемы видеокарты. И более того от того какая там микросхема/-мы знакогенератора впаяна/-ны.
    В APPEL 1 к примеру лежало всё сразу там.
    В IBM PC загружался DOC 1 и он загружал свои шрифты с дискеты.
    В IBM PS/2 инициируется BIOS видеокарты и загружает свои шрифты в эту память.
     
  7. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    В России знакогненераторы использовались в основном на RAM. Так что BIOS загружал в них свой шрифт.
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Код (ASM):
    1. WIDTH_SCREEN    equ 640
    2. .data
    3. Hello db "Hello, world!",0
    4.        . . . .
    5. .code
    6.         push 0A000h ; видеосегмент
    7.         pop es
    8.         push 0F000h
    9.         pop gs
    10.         xor di,di   ; левый верхний угол
    11.         mov bx,offset Hello    ; адрес текстовой строки
    12. next:   movzx si,byte ptr [bx]  ; получаем очередной символ из строки Hello
    13.         shl si,3    ; умножаем индекс символа на 8
    14.         jz exit     ; это последний символ?
    15.         add si,0FA6Eh   ; адрес символа в шрифте
    16.         mov cx,8    ; 8 байт на одну букву
    17. @@:     lods byte ptr gs:[si]
    18.     mov ah,al
    19.     rept 8
    20.         add ax,ax;а если бит равен 0 - делаем AL=0
    21.         sbb al,al
    22.         stosb    ;пишем в видеопамять
    23.         endm
    24.     add di,WIDTH_SCREEN - 8; сдвигаемся на следующую строку
    25.         loop @b  
    26.         sub di,8*WIDTH_SCREEN - 8
    27.         inc bx
    28.         jmp next
    29. exit:
     
  9. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Вот..... Я ж помню, что где-то по известному адресу шрифт лежит, а загуглить не смог.. Интересно, а в VGA карте он там 8x16, или по старинке для совместимости 8x8? Просто тогда его оттуда можно в VGA записать:

    Код (ASM):
    1. ;Programming for Direct Access to Character Generator RAM
    2.   ;The following sequence sets up the EGA and VGA for accessing character-
    3.   ;generator memory.  See EGA I/O Ports for related information.
    4.  
    5.     out 3c4H, 0402H   ;Mask reg; enable write to map 2
    6.     out 3c4H, 0704H   ;Memory Mode reg ; alpha, ext mem, non-interleaved
    7.     out 3ceH, 0005H   ;Graphics Mode reg; non-interleaved access
    8.     out 3ceH, 0406H   ;Graphics Misc reg; map char gen RAM to a000:0
    9.     out 3ceH, 0204H   ;Graphics ReadMapSelect reg; enable read chargen RAM
    10.  
    11.   ;After these OUTs, the font data begins at a000:0 and the first byte of
    12.   ;font data for a character begins at the character's ASCII value * 32.
    13.   ;After reading or writing the font data, the following sequence restores
    14.   ;the EGA/VGA to normal operations:
    15.  
    16.     out 3c4H, 0302H   ;Mask reg; disable write to map 2
    17.     out 3c4H, 0304H  ;Memory Mode reg; alpha, ext mem, interleaved
    18.     out 3ceH, 1005H   ;Graphics Mode reg; interleaved access
    19.     out 3ceH, 0e06H   ;Graphics Misc reg; regen buffer to b800:0
    20.     out 3ceH, 0004H   ;Graphics ReadMapSelect reg; disable read chargen RAM
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Tronix,
    дык, пробуйте
     
  11. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    А, стоп, заработался. Какой такой 0FA6Eh, если по этому адресу мой тестовый BIOS (а не стандартный BIOS), и никакого там шрифта и в помине нет.

    Тупик....
     
  12. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Стандартного нету, видимо вы путаете с адресом знакогенераора. Как получить адрес шрифта я код привёл. У знакогенератора он A000h:0000h

    Современный VBIOS содержит 3 шрифта 8x8, 8x14, 8x16 но вот у вашего старья скорее всего один один.
    Вы бы биос видео карты сдампили и отреверсили. Там всего 64 кб.
     
  13. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Во про этот я забыл. Но это БИОС основной платы, там лежи 8х8 на случай если видео биос не загрузится.
     
  14. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Что-то вы меня путаете... A000 - это разве не видео-буффер в mode 13h?

    Видеокарта может быть любая. Я ж не буду все известные биосы реверсить. Понятный пионер, что для конкретной карты с конкретной версией видео-биоса я могу в hiew найти начало шрифта.
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    A000h:0000h видеобуфер для графических режимов и не только для 13h (0Dh, 0Eh, 0Fh, 10h, 11h, 12h, VESA)
     
  16. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Ну я и говорю. При чем здесь знакогенератор.
     
  17. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Tronix,
    Причем? Причем! Самеже код привели с коментариями.
    Char - переводится как знак. gen как генератор. Соединяем получается знакогенератор.
    Изначально знакогенератором называется микросхема содержащая коды символов. Изначально они были жёстко прошиты ROM потом перешли на RAM.
    1) Дешели
    2) Для разных стран можно загружать разные символы.
    Тут ещё историческая путаница правильнее было-бы назвать генератором некоторое устроство которое читает символы из памяти и выводит его. Но почему-то знакогенеатором называют именно микросхему памяти, причем самую обычную.

    Диапазоны адресов называются окнами
    0B0000h - 0BFFFFh
    0A0000h - 0AFFFFh
    Окна отображаются на плоскости видео памяти.
    VGA/EGA содержит 4 "плоскости" по 64Кб. Т.е память 256 кб.
    "Плоскость" устаревший термин по сути это просто участок памяти.
    2 плоскость отводиться под знакогенератор.
    Соответственно 0A0000h , 0B0000h могут отображаться на разные плоскости.
    В тестовом режиме окно A0000h отключено. Оно никуда не ссылается. Зато внутренняя логика видеокарты блок CRT имеет доступ к 2 плоскости.
    Отключение сделано специально для согласование тактов. Экономят время, не тратят его на CPU.

    А при графическом режиме зедействуются до 4 плоскостей.* В зависимости от режима. При этом так как 2-плоскость просто память RAM, то при возврате в текстовый видеобиос просто заружает шрифты повторно. При этом если вы использовали пользовательские шрифты то их адрес сохраняется в 40:xxxh (на память не поню), а сами шрифты вы должны хранить в базовой памяти - т.е в своей программе.

    * там 2 окна отображаются на 4 плоскости про помощи вращений. 0 байт отображается на 0 плоскость 1 байт на 1 плоскость 2 байт на 3 плоскость 4 байт на 4 плоскость.

    Это вот так коротенько.
    Подробно смотри: http://www.mcamafia.de/pdf/ibm_hitrc10.pdf
     
  18. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Да, спасибо, понятно, уже прочитал тоже.
    Ну короче ясно, что без своего шрифта нельзя установить текстовый режим и чтоб буквы выводились. Из видео-карты без инициализации ее BIOS шрифт не выдернешь. А с инициализацией - уже и int 10h доступен.
    Ну и ладно. Не полетела так не полетела. Всем спасибо.