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ň