Цитата Сообщение от freddy Посмотреть сообщение
А так то это вобще не стандартные режимы, и применяются не часто в софте тех годов. Видеокарты в них переводили также не стандартными способами
Ну, 80x43 ega, или он же 80x50 на vga - более менее стандартный, и в Norton Commander есть и в Volcov Commander (ALT+F9). Правда, волков как-то определяет, есть такой режим или нет, и если нет - то и комбинацию alt+F9 запрещает. В Turbo Pascal есть, Borland C.

Цитата Сообщение от freddy Посмотреть сообщение
Пока не знаю как это лучше внедрить, мало знаний о способах перевода карт.
Да, удивительно, но я что-то как то тоже сходу не очень нашел. Единственное, что нашел что-то такое:

Скрытый текст

Код:
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 такое:
Код:
video_dda       equ     89h     ; byte - video display data area (MCGA and VGA)
Где хранится кол-во строк scan line (200,350,400). По идее, при старте надо заполнить его чем-то вроде
Код:
; Store VGA active, 400 scanline
		mov	ax,biosdseg
		mov	es,ax
		mov	byte ptr es:[video_dda],00010001b
А далее в обработчике int 10h/AH=00 нужно лезть туда и устанавливать параметры из таблички в соответствии с..

Скрытый текст

Код:
; 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 в зависимости от... Но, наверное это тупо, да. Скорее всего так ничего не заработает.

Цитата Сообщение от freddy Посмотреть сообщение
Через порты напрямую если кто лез в каких то программках, то тут мы пролетаем однозначно.
Ну, не совсем однозначно. В случае 386+ и загруженного EMM386 (проц в режиме виртуального 86) есть возможность перехватывать любые порты IO, соответственно делать какие хочешь заглушки. Таким образом, для 386+ и EMM386 можно написать простенькую утилиту эмуляции портов, которая будет в autoexec.bat грузится. Другое дело, что не всем нравится EMM386, и многие его не загружают. Но, в принципе, возможность такая есть...