Ну, 80x43 ega, или он же 80x50 на vga - более менее стандартный, и в Norton Commander есть и в Volcov Commander (ALT+F9). Правда, волков как-то определяет, есть такой режим или нет, и если нет - то и комбинацию alt+F9 запрещает. В Turbo Pascal есть, Borland C.
Да, удивительно, но я что-то как то тоже сходу не очень нашел. Единственное, что нашел что-то такое:
Скрытый текст
Код:Procedure VGA43(md:byte); Assembler; asm mov ax,1201h mov bl,30h int 10h mov al,md xor ah,ah int 10h mov ax,1112h mov bl,0 int 10h end; Procedure VGA25(md:byte); Assembler; asm mov ax,1202h mov bl,30h int 10h mov al,md xor ah,ah int 10h end; Procedure VGA28(md:byte); Assembler; asm mov ax,1202h mov bl,30h int 10h mov al,md xor ah,ah int 10h mov ax,1111h mov bl,0 int 10h end; Procedure VGA50(md:byte); Assembler; asm mov ax,1202h mov bl,30h int 10h mov al,md xor ah,ah int 10h mov ax,1112h mov bl,0 int 10h end; Procedure VGA12(md:byte); Assembler; asm mov ax,1200h mov bl,30h int 10h mov al,md xor ah,ah int 10h mov ax,1114h mov bl,0 int 10h end;[свернуть]
Видно, что оперируют функцией AH=12h/BL=30h SELECT VERTICAL RESOLUTION и функцией AH=11h/AL=11h,12h,14h (SET ROM 8x14 GRAPHICS CHARACTERS, SET ROM 8x8 DOUBLE-DOT CHARACTERS, LOAD ROM 8x16 CHARACTER SET).
Но, действительно, похоже это для VGA годится... Как именно VC.COM переключает режимы не знаю, можно попробовать дизасмить, но видимо определяют наличие EGA так:
Я думал примерно так:Код:mov ah,012 mov bx,0FF10 ;' ►' int 010 cmp bx,0FF10 ;' ►'
Есть в Bios Data Area такое:
Где хранится кол-во строк scan line (200,350,400). По идее, при старте надо заполнить его чем-то вродеКод:video_dda equ 89h ; byte - video display data area (MCGA and VGA)
А далее в обработчике int 10h/AH=00 нужно лезть туда и устанавливать параметры из таблички в соответствии с..Код:; Store VGA active, 400 scanline mov ax,biosdseg mov es,ax mov byte ptr es:[video_dda],00010001b
Скрытый текст
Код:; CRTC init crtc_ini: ; get scan line from VGA display data area mov al, byte ptr ds:[video_dda] mov ah,al ; save al shr al,4 ; extract 4 bit shr ah,6 ; extract 7 bit or al,ah ; al = scan line; 0=350;1=400;2=200 ; calculate parameters table adress mov si,offset cs:mode_table xor ah,ah shl al,3 ; scan line mul 8 add si,ax push cs pop ds ; DS:SI = mode table offset mov dx,vg75_cmd ; Reset CRTC cmd mov al,0 out dx,al dec dx mov al,79 out dx,al ;mov al,10011000b lodsb out dx,al ;mov al,0fh lodsb out dx,al mov al,00001001b out dx,al inc dx ; Reset counters mov al,11100000b out dx,al lodsw mov bx,ax call run_DMA ; Used to time delay for previous cmd mov dx,vg75_cmd ; Start display ;mov al,00100101b lodsb out dx,al mov cx,5 wait_frame: in al,dx test al,00000010b ; Check DMA underrun jnz crtc_ini ; Reinit CRTC if is it test al,00100000b ; Checkin end of current frame jz wait_frame loop wait_frame ;Checking until 5 frame complited call run_DMA ; Start DMA service ...skip.... ;enable default charset page xor al,al test byte ptr ds:[video_dda],00010000b je fnt8x16 mov al,2 ; set 8x8 font fnt8x16: mov dx,base_io ; Set 0 charset page out dx,al ...skip.... mode_table: ;2nd,3rd byte for vg75 init ;dma lo, dma hi ;start display ;dummy 3 bytes for 8 bytes records ;80x50: db 11110001b,07h,03fh,09fh,00100111b,0,0,0 ;80х25 db 10011000b,0fh,09fh,08fh,00100101b,0,0,0 ;80х30 db 10011101b,0fh,0bfh,092h,00100101b,0,0,0 ;80x60: db 11111011b,07h,07fh,0a5h,00100111b,0,0,0 ;80x43: db 11101010b,0ah,0dfh,09ah,00100111b,0,0,0 ....skip.... ;==================================================================== ;DMA run subroutine. Cold start i8257 DMAC ;IN:BH,BL,OUT:None ;-------------------------------------------------------------------- run_DMA proc near ; cli ;Disable interrupts mov dx,vt57_cmd mov al,80h ;Set autoload flag to programming out dx,al ;chanels 2,3 at the same time mov dx,vt57_ch2_adr mov al,0 out dx,al ;set starting adress out dx,al inc dx mov al,bl out dx,al mov al,bh out dx,al mov dx,vt57_cmd ;enable ch2 service mov al,84h out dx,al ; sti ;Enable interrupts ret run_DMA endp[свернуть]
При этом в обработчике AH=12h/BL=30h просто менять кол-во строк в video_dda, или как-то так.... Ну и в 11h типа смотреть какой хотят шрифт и так же править video_dda в зависимости от... Но, наверное это тупо, да. Скорее всего так ничего не заработает.
Ну, не совсем однозначно. В случае 386+ и загруженного EMM386 (проц в режиме виртуального 86) есть возможность перехватывать любые порты IO, соответственно делать какие хочешь заглушки. Таким образом, для 386+ и EMM386 можно написать простенькую утилиту эмуляции портов, которая будет в autoexec.bat грузится. Другое дело, что не всем нравится EMM386, и многие его не загружают. Но, в принципе, возможность такая есть...
До такого не дойдет. Надеюсь. Обойдемся без крайностей. Лучше хитросделанные проги патчить.
Времени подробно дизассемблировать нет. Но всеже в VC все не так и проще.
Вот так определяется VGA карта:
AH=12h,BX=FF10h Int10h. Если при возврате Bx=FF10h, значит не VGA. Правильный ответ BX=0003,CX=0009. Т.е. цветная с 256кб на борту. И положение переключателей нам не важно.
А вот так он спрашивает параметры её режима:
AX=1130h,BH=00 Int10h. Ответ будет CL=10,DL=18, ES:BP укажет куда то в C000:xxxx. Т.е. 16 байт на символ и 25 строк на экране.
Переключает вобще просто:
AX=0003h int10h,AX=1112h Int10h. Т.е. загрузка шрифта 8x8 из ПЗУ. Тут то и происходит перепрограммирование режима видеокарты.
Далее дело техники:
AH=12,BL=20 Int10h (альтернативный print screen)
ax=1130 int10h. Возврат CL=8, DL=31h. Вот и 50 строк с шрифтом 8х8.
Как другие программы делают, времени нет смотреть.
Что делать с BIOS понятно. Когда то доделаю вышеперечисленные функции.
Real Hardware!
Tronix(25.12.2021)
нада отдельная АФФТАРСКАЯ тема про девайс
с первым пстом в котором будет собрано все что надо с блаблабла
ато щас это уже портянка с херчтонайдешь...
Tronix, попробуйте пожалуйста этот bios на 486й плате. Больше не должен 4 раза перезапускаться. Должен сам находить порт видеокарты.
https://disk.yandex.ru/d/dmQDXNbMAJqr2A
- - - Добавлено - - -
Очень интересно какую скорость Checkit дает на 486?
Real Hardware!
Tronix(26.12.2021)
freddy, Пока просто посмотрел листинг, и могу сказать, что будет 4 раза перезапускаться. То есть выводить стартовую надпись, ждать секунду, очишать экран, выводить стартовую надпись, ждать, очищать экран, выводить стартовую надпись, ждать, очищать экран, выводить стартовую надпись, ждать, очищать экран и поехали. Потому что метку already_set: надо перенести куда-то сюда
Но это я поправлю, без проблем. Скорость замеряю на неделе..Код:already_set: vg75_not_found: popf pop ax ;Restore registers pop bx pop cx pop dx pop di pop si pop ds pop es pop bp retf ;Far return to system bios
- - - Добавлено - - -
Я смотрел карту распределения памяти в CheckIt на моей четверке, так вот у меня торчат 4 штуки Ext ROM по адресам C0000, C2000, C4000, C6000, естественно с одинаковым содержанием - это BIOS видюхи. Видимо мой 486 достаточно честный, и при старте он видит, что по C0000 у нас есть extROM на 8Кб - окей, запускаем и сканируем дальше с адреса C2000 - опа, здесь у нас так же торчит extROM на 8Кб - ок, запускаем и тд. Происходит это из-за не полной дешифрации адреса vbROM видюхой.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Я там что то сделал.
Тестировал на DC, VC, TP7. Штатные переключалки "EGA/VGA lines" на месте и работают.
Последняя версия CGA BIOS 0.2b и больше развиваться не будет.
Текущая версия VGA BIOS 0.3, берите https://disk.yandex.ru/d/dLlCl9MxIMF-XA
С наступившим Новым годом!
- - - Добавлено - - -
Также придумал как внедрить 80х30,80х43,80х60. У TVGA9000i есть режимы 50h, 51h, 52h. Если оно надо, могу сделать такое у VG75_ISA .
Real Hardware!
Tronix(01.01.2022)
Пока нету ПЗУ-шки на 32Кб, поэтому мучаем версию 8Кб. Да на ней я думаю и остановимся, ну куда ему 32Кб?
Вообщем, новый BIOS сначала "не пошел".
Как уже писал ранее, первое что превентивно сделал - перенес метку already_set в самый конец на выход, перед восстановлением всех значений из стека. А то надоедает по 4 раза приветствие писать;
Второе - упорно моя мать не желала грузить Ext-ROM, пищала вроде два коротких три длинных или как-то так, пока не добавил в начало вот это:
Не знаю, что конкретно помогло - то-ли ей надо что бы четвертый байт был jump, то ли все-таки что бы по 0x1eh были символы "IBM ", но без этой конструкции ну ни в какую не хочет пускать ExtROM по адресу C0000. Эта конструкция и раньше у меня была в прошлых BIOS, еще в первой версии. Просто перенес на новый.Код:jmp powerup ; ; The letters "IBM" must be at offset 1Eh ; org 01Eh db "IBM VGA Compatible", 000h powerup: ;First start up push bp ;Save all registers to stack push es
Замерял скорость в Checkit на AMD 486-133@160
Немного уменьшилась, по сравнению с предыдущей версией BIOS, но оно и понятно - стало mul больше, стали дополнительные вызовы (call) и тд. В целом - все равно очень быстро, быстрее рядовых ISA8 видеокарт.
А вот так выглядит распределение памяти, про которое говорил:
- - - Добавлено - - -
О, спасибо, взаимно. Сейчас попробую 0.3!
freddy(01.01.2022)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)