Еще КТ315 не хватает. А зеленая маска и в СССР встречалась, чего уж.
Ну, 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 понятно. Когда то доделаю вышеперечисленные функции.
нада отдельная АФФТАРСКАЯ тема про девайс
с первым пстом в котором будет собрано все что надо с блаблабла
ато щас это уже портянка с херчтонайдешь...
Tronix, попробуйте пожалуйста этот bios на 486й плате. Больше не должен 4 раза перезапускаться. Должен сам находить порт видеокарты.
https://disk.yandex.ru/d/dmQDXNbMAJqr2A
- - - Добавлено - - -
Очень интересно какую скорость Checkit дает на 486?
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 видюхой.
Я там что то сделал.
Тестировал на 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 .
Пока нету ПЗУ-шки на 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
https://i.ibb.co/j6VtY9m/P1140047.jpg
Немного уменьшилась, по сравнению с предыдущей версией BIOS, но оно и понятно - стало mul больше, стали дополнительные вызовы (call) и тд. В целом - все равно очень быстро, быстрее рядовых ISA8 видеокарт.
А вот так выглядит распределение памяти, про которое говорил:
https://i.ibb.co/3pQnvNJ/P1140048.jpg
- - - Добавлено - - -
О, спасибо, взаимно. Сейчас попробую 0.3!