Здрасте, Помогите установить на VGA текстовый режим 80x25 с помощью портов. Нюанс - видео BIOS не загружается из основного BIOS (туда не передается управление), хотя на VGA карте присутствует. Скопипастил откуда-то код: Код (ASM): setRegs: mov si, offset regs825 mov dx, 3C2h lodsb out dx, al mov dx, 3DAh lodsb out dx, al xor cl, cl mov dx, 3C4h .l1: lodsb xchg al, ah mov al, cl out dx, ax inc cl cmp cl, 4 jbe .l1 mov dx, 3D4h mov ax, 0E11h out dx, ax xor cl, cl ;mov dx, 3D4h .l2: lodsb xchg al, ah mov al, cl out dx, ax inc cl cmp cl, 18h jbe .l2 xor cl, cl mov dx, 3CEh .l3: lodsb xchg al, ah mov al, cl out dx, ax inc cl cmp cl, 8 jbe .l3 mov dx, 3DAh in al, dx xor cl, cl mov dx, 3C0h .l4: in ax, dx mov al, cl out dx, al lodsb out dx, al inc cl cmp cl, 14h jbe .l4 mov al, 20h out dx, al ret regs825: ; MISC db 67h, 00h ; SEQ db 03h, 00h, 03h, 00h, 02h ; CRTC db 5Fh, 4Fh, 50h, 82h, 55h, 81h, 0BFh, 01Fh db 00h, 4Fh, 0Dh, 0Eh, 00h, 00h, 00h, 50h db 9Ch, 0Eh, 8Fh, 28h, 1Fh, 96h, 0B9h, 0A3h db 0FFh ; GC db 00h, 00h, 00h, 00h, 00h, 10h, 0Eh, 00h db 0FFh ; AC db 00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h db 38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh db 0Ch, 00h, 0Fh, 08h, 00h Да, режим устанавливается. Но текст не виден. Походу надо еще шрифт инициализировать. Тут опять нюанс - я свой шрифт не могу хранить (места нет), поэтому нужно выдернуть шрифт из видео-BIOS или как то указать VGA, чтоб она использовала свой встроенный шрифт. Так можно? Спасибо.
А как вы проверяете, что режим установился? Шрифт текущего видеорежима хранятся во второй плоскости видеопамяти. Загрузили с жёсткого в базовую память загнали в видеопамять. Базовую память освободили. Можно также из Biosa видео карты взять. Код (Text): ;in: es:di=4k buffer ;out: buffer filled with font push ds push es ;ask BIOS to return VGA bitmap fonts mov ax, 1130h mov bh, 6 // 6 - VGA ROM(VGA BIOS) int 10h ;copy charmap push es pop ds pop es mov si, bp mov cx, 256*16/4 rep movsd pop ds Хотя бы компьютер указали. Видеокарта ISA, PCI, AGP?
Компьютер 8086 (Поиск-2) с ISA-8. Видеокарта VGA ISA8. Установить текстовый режим нужно в основном BIOS, как только комп включился. Только это не настоящий BIOS, а тестовый (с различными тестами), поэтому он не инициализирует add-ROM биосы, не инициализирует HDD/FDD, не хранит в себе CGA шрифт, прерывания int 10h и другие. Основной RAM считай что тоже нет, либо она может быть не рабочая - стека нет. А нельзя просто VGA установить режим и сказать "юзай свой встроенный знакогенератор"?
Tronix, А там случае нужна схема. Дело в том что в таком компьютере возможно либо знакогенератор жёстко сидит как ROM во второй плоскости видео памяти (может и не во второй). А может он там как RAM выполнен.
Да не, это обычный комп, ничем от какого-нибудь Pentium 1 не отличается в принципе. Никаких там ROM нет, кроме того, который я хочу модифицировать в роли BIOS и ROM на видеокарте. Видеокарта - обычная, скажем Trident 9000 ISA-16. RAM есть на видеокарте, и конечно 640Kb в компе. Но я не хочу использовать ту, что в компе (да и зачем)? Хорошо, вот еще утащил такой код отсюда : http://wiki.osdev.org/VGA_Fonts Код (ASM): ;in: edi=4k buffer ;out: buffer filled with font ;clear even/odd mode mov dx, 03ceh mov ax, 5 out dx, ax ;map VGA memory to 0A0000h mov ax, 0406h out dx, ax ;set bitplane 2 mov dx, 03c4h mov ax, 0402h out dx, ax ;clear even/odd mode (the other way, don't ask why) mov ax, 0604h out dx, ax ;copy charmap mov esi, 0A0000h mov ecx, 256 ;copy 16 bytes to bitmap @@: movsd movsd movsd movsd ;skip another 16 bytes add esi, 16 loop @b ;restore VGA state to normal operation mov ax, 0302h out dx, ax mov ax, 0204h out dx, ax mov dx, 03ceh mov ax, 1005h out dx, ax mov ax, 0E06h out dx, ax То есть он мне скопирует шрифт из второй плоскости в буфер... А я не пойму, он (шрифт) там во второй плоскости как появляется? Или он там все время лежит? Или он там появляется только после того, как BIOS видеокарты заинициализится?
Это зависит от вашей схемы видеокарты. И более того от того какая там микросхема/-мы знакогенератора впаяна/-ны. В APPEL 1 к примеру лежало всё сразу там. В IBM PC загружался DOC 1 и он загружал свои шрифты с дискеты. В IBM PS/2 инициируется BIOS видеокарты и загружает свои шрифты в эту память.
Код (ASM): WIDTH_SCREEN equ 640 .data Hello db "Hello, world!",0 . . . . .code push 0A000h ; видеосегмент pop es push 0F000h pop gs xor di,di ; левый верхний угол mov bx,offset Hello ; адрес текстовой строки next: movzx si,byte ptr [bx] ; получаем очередной символ из строки Hello shl si,3 ; умножаем индекс символа на 8 jz exit ; это последний символ? add si,0FA6Eh ; адрес символа в шрифте mov cx,8 ; 8 байт на одну букву @@: lods byte ptr gs:[si] mov ah,al rept 8 add ax,ax;а если бит равен 0 - делаем AL=0 sbb al,al stosb ;пишем в видеопамять endm add di,WIDTH_SCREEN - 8; сдвигаемся на следующую строку loop @b sub di,8*WIDTH_SCREEN - 8 inc bx jmp next exit:
Вот..... Я ж помню, что где-то по известному адресу шрифт лежит, а загуглить не смог.. Интересно, а в VGA карте он там 8x16, или по старинке для совместимости 8x8? Просто тогда его оттуда можно в VGA записать: Код (ASM): ;Programming for Direct Access to Character Generator RAM ;The following sequence sets up the EGA and VGA for accessing character- ;generator memory. See EGA I/O Ports for related information. out 3c4H, 0402H ;Mask reg; enable write to map 2 out 3c4H, 0704H ;Memory Mode reg ; alpha, ext mem, non-interleaved out 3ceH, 0005H ;Graphics Mode reg; non-interleaved access out 3ceH, 0406H ;Graphics Misc reg; map char gen RAM to a000:0 out 3ceH, 0204H ;Graphics ReadMapSelect reg; enable read chargen RAM ;After these OUTs, the font data begins at a000:0 and the first byte of ;font data for a character begins at the character's ASCII value * 32. ;After reading or writing the font data, the following sequence restores ;the EGA/VGA to normal operations: out 3c4H, 0302H ;Mask reg; disable write to map 2 out 3c4H, 0304H ;Memory Mode reg; alpha, ext mem, interleaved out 3ceH, 1005H ;Graphics Mode reg; interleaved access out 3ceH, 0e06H ;Graphics Misc reg; regen buffer to b800:0 out 3ceH, 0004H ;Graphics ReadMapSelect reg; disable read chargen RAM
А, стоп, заработался. Какой такой 0FA6Eh, если по этому адресу мой тестовый BIOS (а не стандартный BIOS), и никакого там шрифта и в помине нет. Тупик....
Стандартного нету, видимо вы путаете с адресом знакогенераора. Как получить адрес шрифта я код привёл. У знакогенератора он A000h:0000h Современный VBIOS содержит 3 шрифта 8x8, 8x14, 8x16 но вот у вашего старья скорее всего один один. Вы бы биос видео карты сдампили и отреверсили. Там всего 64 кб.
Во про этот я забыл. Но это БИОС основной платы, там лежи 8х8 на случай если видео биос не загрузится.
Что-то вы меня путаете... A000 - это разве не видео-буффер в mode 13h? Видеокарта может быть любая. Я ж не буду все известные биосы реверсить. Понятный пионер, что для конкретной карты с конкретной версией видео-биоса я могу в hiew найти начало шрифта.
A000h:0000h видеобуфер для графических режимов и не только для 13h (0Dh, 0Eh, 0Fh, 10h, 11h, 12h, VESA)
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
Да, спасибо, понятно, уже прочитал тоже. Ну короче ясно, что без своего шрифта нельзя установить текстовый режим и чтоб буквы выводились. Из видео-карты без инициализации ее BIOS шрифт не выдернешь. А с инициализацией - уже и int 10h доступен. Ну и ладно. Не полетела так не полетела. Всем спасибо.