Ну, 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, и многие его не загружают. Но, в принципе, возможность такая есть...





Ответить с цитированием