• Textový režim 80x30 •
Na žádost některých čtenářů jsem zařadil do rubriky
programování rutinku, která nastaví textový režim o třiceti řádcích.
Tento mód je nyní standardním módem Výhně. Poprvé jsem tento mód
objevil v nastavení Dos Navigátoru (mimochodem jde o velice dobrý DOS
shell mnohdy lepší než Norton). Jeho výhoda je, že zachovává velikost
znaku (což je 16 mikrořádek), a že pro něj funguje scrollovací
rutinka, normálně používaná pro standardní textový režim 80x25.
V podstatě jde o to, změnit mikrořádkování ze 400 na 480 mikrořádek
(podobně jako u X-módu 320x240). Vzhledem k tomu, že se jedna řádka
v textovém režimu skládá ze 16 mikrořádků, výsledné prodloužení je
zřejmé 480/16=30 (tedy o pět řádek). Této změny lze docílit pomocí
čtyř instrukcí, ale když si to vyzkoušíte, zjistíte, že to není
zrovna tak, jak má být. Vypadá to, jako kdyby se hardwarově zúžila
výška obrazu na monitoru. A proto zbylých 60 instrukcí donutí VGA
kartu, aby zobrazovala řádku 0 hned v horní části stínítka monitoru.
Tak tady to máte (je to docela dlouhý, ale funguje to):
Procedure TextMode80x30; assembler;
asm
mov ax,3 { nahození módu 80x25 přes BIOS }
int 10h
mov dx,3C4h { sequencer adress register }
mov al,0 { reset }
out dx,al
mov al,1 { synchronní smazání sequenceru }
inc dx
out dx,al { zachovaní obsahu orazovky }
dec dx { sequencer adress register }
mov dx,3D4h
mov al,17h { mode control }
out dx,al
inc dx { mode control register }
in al,dx
and al,7Fh
out dx,al
dec dx { sequencer adress register }
mov al,11h { light pen low }
out dx,al
inc dx { light pen low register }
in al,dx
and al,7Fh
out dx,al
mov dx,3CCh
in al,dx { al <- nastavení miscellaneous output registeru }
or al,0C0h { změna řádkování 400 (80x25) na 480 (80x30) }
mov dx,3C2h { miscellaneous output register }
out dx,al
mov dx,3D4h
mov al,6 { vertical character display }
out dx,al
mov al,0Bh
inc dx { vertical character display register }
out dx,al
dec dx { sequencer adress register }
mov al,7 { vertical synchronisation position }
out dx,al
mov al,3Eh
inc dx { vertical synchronisation position register }
out dx,al
dec dx { sequencer adress register }
mov al,9 { max raster address }
out dx,al
mov al,4Fh
inc dx { max raster address register }
out dx,al
dec dx { sequencer adress register }
mov al,10h { light pen high }
out dx,al
mov al,0EAh
inc dx { light pen high register }
out dx,al
dec dx { sequencer adress register }
mov al,11h { light pen low }
out dx,al
mov al,8Ch
inc dx { light pen low register }
out dx,al
dec dx { sequencer adress register }
mov al,12h { vertical end scan line }
out dx,al
mov al,0DFh
inc dx { vertical end scan line register }
out dx,al
dec dx { sequencer adress register }
mov al,15h { vertical start blanking }
out dx,al
mov al,0E7h
inc dx { vertical start blanking register }
out dx,al
dec dx { sequencer adress register }
mov al,16h { vertical end blanking }
out dx,al
mov al,4
inc dx { vertical end blanking register }
out dx,al
dec dx { sequencer adress register }
mov al,11h { light pen low }
out dx,al
inc dx { light pen low register }
in al,dx
or al,80h
out dx,al
dec dx { sequencer adress register }
mov al,17h { mode control }
out dx,al
inc dx { mode control register }
in al,dx
or al,80h
out dx,al
mov dx,3C4h { sequencer adress register }
mov al,0 { reset sequencer }
out dx,al
mov al,3
inc dx { reset sequencer register }
out dx,al
end;
Pokud se to někomu podaří zkrátit, tak budu rád, když mi zašle
svojí verzi. Ještě se vrátím k problémům s textovými módy ve Výhni.
Výheň je schopná běhat v textových režimech, které mají 80 znaků na
řádce a zachovávají 16 mirořádkovou výšku jednoho znaku. Pokud mód
nesplňuje požadované vlastnosti, dojde k chybě při scrollingu. Tedy
například 50 (8 mikrořádek na znak) nebo 28 (14 mikrořádek na znak)
řádkový mód fungovat nebude. Nepřipadá mi ale důležité nahazovat
podobné módy, když si Výheň můžete spustit buď ve standardním režimu
80x25 nebo v extended módu 80x30. SVGA textmódy Výheň nebude
podporovat, vzhledem k jejich špatné čitelnosti.
ReDox
výheň