Plynylý scrolling v textovém režimu 

           V  nultém  čísle  Výhně   jsem  uveřejnil  článek  týkající  se
     scrollingu v  grafických režimech VGA karty.  Jestli jste to zkoušeli
     v textovém  režimu, asi  vám výsledný  efekt nepřipadal  moc plynulý.
     Scrolling v texťáku je o trochu složitější. Musíme ho rozdělit na dvě
     části.  První rutina  bude zvyšovat/snižovat  vertikální posun  znaku
     a druhá nastavovat počáteční adresu  zobrazování videopaměti. V praxi
     to bude vypadat asi takto:


                Procedure SetTextLine(L:Word); Assembler;
                asm
                     mov dx,3d4h { CRTC adress register }
                     mov bx,L
                     mov al,ch
                     mov ah,bh   { počáteční adresa - vyšší byte }
                     out dx,ax
                     inc al
                     mov ah,bl   { počáteční adresa - nižšší byte }
                     out dx,ax
                end;

                Procedure SetLineAddr(Addr:Byte); Assembler;
                asm
                     mov  dx,3dah { čekání na paprsek }
                @@1: in   al,dx
                     test al,8
                     jz   @@1
                     mov  dx,3dah
                @@2: in   al,dx
                     test al,8
                     jnz  @@2
                     mov  dx,3d4h { CRTC adress register }
                     mov  ah,Addr
                     mov  al,8    { vertikální posun }
                     out  dx,ax
                end;

          { hlavní program }

          begin
           for y1:=0 to 24 do
               begin
                SetLine(y1);
                for y2:=0 to 15 do SetLineAddr(y2);
               end
          end.

           Tento  prográmek plynule  odscrolluje na  25. řádku  v textovém
     režimu. Stejným způsobem lze dosáhnout  i scrollingu směrem dolů tím
     že změníme hlavní program takto:

          begin
           for y1:=24 downto 0 do
               begin
                SetLine(y1);
                for y2:=15 downto 0 do SetLineAddr(y2);
               end
          end.

           Zjistíte, že se tímto způsobem dá odscrolovat až na 200. řádku.
     Potom  se  většinou  karta  vrátí  na  začátek videopaměti ([B800:0])
     a celkově  se posune  o osm  bajtů. To  znamená, že nelze donekonečna
     scrollovat  aniž  by  se  nemusela  překreslovala  videopamět.  Je to
     podobné  jako v  grafických režimech,  kde například  v módu  320x200
     zbývá  do 64KB  ještě 1535  bajtů, to  znamená, že  se po  návratu na
     začátek  videopaměti  ([A000:0])  posune  nultá  pozice  o  255 bajtů
     doprava.  Ale existují  některé karty  (například některé  Tridenty),
     které jaksi  nemíní skákat na začátek  videopaměti a pokud je  k tomu
     donutíte, tak  vesele scrollují dál, někam na podezřelé adresy. Abych
     se  vyhnul případným  nekompatibilitám grafických  karet, zavedl jsem
     tedy  maximální délku  jedné stránky  na oněch  200 řádek. Proto jsou
     některé články rozděleny na více částí. Pokud bude mít někdo problémy
     nebo  dotazy   ohledně  scrollingu  nebo   nestandardních  grafických
     a textových módů,  můžete se obrátit  na mě. Udělám,  co bude v  mých
     silách.

                                                     ReDox


            výheň