JAK SOBĚ VYROBITI DEMO GRAFICKÉ
                     KU POTĚŠE VLASTNÍ I OSOB OSTATNÍCH
                                 (potřetí)

                            Petr Klimovič l.p.1996

            Dneska bych nadhodil něco, co se jmenuje  vertikální zatemění.
      K čemu je to  dobré?  Pokud jste si s paletou trošku vyhráli, určitě
      jste se dostali do situace, kdy jste si všimli sněžení. Sněžení jsou
      poruchy  v  obraze.  Prostě sněžení.  Kdo to viděl, ví o čem mluvím,
      kdo to neviděl, časem uvidí. Co s tím? Odkud še beue? (nový JAR).
            Obraz  na monitoru je vykreslován elektronovým paprskem. Je to
      princip, na kterém fungují všechny obrazovky, tedy i televizní.
            Paprsek  lítá  po  stínítku  stejným stylem jako se čte kniha.
      První  řádek  zleva  doprava,  na konci řádku bleskové přeskočení na
      začátek  dalšího, atd... Na konci obrazovky se paprsek vrací zase na
      start do levého horního rohu.
            V  době, kdy  paprsek  přeskakuje  mezi  řádky,  nebo  z konce
      obrazovky na její začátek, musí být zatemněn. Pokud by paprsek nebyl
      zatemněný, nechával  by za  sebou stopu,  takže by  na monitoru byly
      vidět jeho přeskoky mezi řádky.
            Jestliže změníte barvu, kterou paprsek vykresluje, zrovna když
      je  někde  uprostřed  v  obrazovém  poli, bude se objevovat sněžení.
      Barvu  můžete  měnit  pouze  v době, kdy je paprsek zatemněný, to se
      totiž  nic  nekreslí  a až začne paprsek zase vykreslovat, kreslí už
      novou barvou.
            Na změnu barvy můžete využít horizontální zatemění, to je doba
      přeskoku  o  řádek  níž,  tento časový interval je ale velmi krátký.
      Jednodušší je počkat si na vertikální zatemnění, to je doba návratu z
      pravého dolního do levého horního rohu obrazovky. Tato doba je delší
      a dá se v ní tedy stihnout více věcí.
            Běžné monitory mají vertikální frekvenci cca 70Hz, to znamená,
      že  zobrazí za sekundu 70 obrazovek, to je 70 vertikálních zatemnění
      (vert.  zatemnění  se  provádí  po  každém  vykreslení obrazovky) za
      sekundu.
            V  době  zatemnění si můžete s obrazovkou dělat co je libo. Až
      zatemnění  skončí, začne paprsek kreslit novou obrazovku, která bude
      ukazovat výsledek vaší činnosti.

            Takže, jak se čeká na vertikální zatemnění (vertical retrace)?

            Na  portu  3DAh  najdete  hodnotu,  jejíž třetí bit udává, zda
      zrovna probíhá zatemnění. Je-li bit nastaven, znamená to, že paprsek
      je zrovna zatemněn.
            Procedura  čekající  na  začátek zatemnění  tedy nejdříve musí
      zjistit, zda retrace zrovna neprobíhá, počkat na jeho případný konec
      a  pak  čekat  na  začátek.  Pokud  by  se  nečekalo  na konec právě
      probíhajícího  zatemnění,  nemám  zaručeno, že jsem nechytil retrace
      třeba  těsně před koncem, pak bych nestihl to, co chci během retrace
      udělat.

      procedure CekejVert;
      var
        Bajt : byte;
      begin
        repeat until (Port [3DA] and 8) = 0      {Cekam na konec retrace}
        repeat until (Port [3DA] and 8) > 0      {Cekam na zacatek retrace}
      end;

            Četnost, s  jakou  váš  počítač generuje vertikalní zatemnění,
      nezávisí na rychlosti vašeho procesoru, je to záležitost VGA karty a
      monitoru.  Většina  dnešních karet zobrazuje 70 obrázků za vteřinu a
      tedy  se  objevuje  retrace  také 70 krát za vteřinu. Zkuste si výše
      uvedenou  proceduru  zacyklit  ve  smyčče  700krát. Provedení tohoto
      programu by pak mělo na všech počítačích trvat 10 sekund.
            Zkuste  následující  prográmek.  Vyrobil  jsem  ho,  když jsem
      zjistil, jak je to všechno rychlé. Chtěl jsem tedy zjistit jak přesně
      to je rychlé.

      Var Citac : longint;
      begin
        Citac := 0;
        Inline(FA);                          {Toto je assembler, zakaz preruseni
        Repeat Until (Port[3DA] and 8) = 0;  {Cekani na vertikalni synch.}
        Repeat Until (Port[3DA] and 8) > 0;  {cekam na zacatek synch.}
        Repeat
           Inc (Citac);
        Until (Port[3DA] and 8) = 0;         {Pockam do konce synch.}
        Inline (FB); {STI}                   {Opet preruseni povolim}
        writeln ('Citac Zatemnene doby : ',Citac);
        Citac := 0;
        Inline(FA);
        Repeat Until (Port[3DA] and 8) > 0;  {Cekani na vertikalni synch.}
        Repeat Until (Port[3DA] and 8) = 0;  {cekam na konec synch.}
        Repeat
           Inc (Citac);
        Until (Port[3DA] and 8) > 0;
        Inline (FB);
        writeln ('Ctac kresleni : ',Citac);
      end.

            Na mém 386 SXku 33MHz získám následující hodnoty:

                             Citac Zatemnene doby : 17
                             Citac kresleni : 3647
            486 DX/2 66MHz   Citac Zatemnene doby : 31
                             Citac kresleni : 7531
            486 DX/2 80MHz   Citac Zatemnene doby : 71
                             Citac kresleni : 16782
            Pentium 75 MHz   Citac Zatemnene doby : 79
                             Citac kresleni : 17762
            AMD K5 166MHz    Citac Zatemnene doby : 123
                             Citac kresleni : 27645

            Tedy  poměr  kreslení  : tma je asi 1 : 214, tedy retrace trvá
      214 krát méně, než vykreslení obrazovky. Uvědomte si při tom, jak je
      vaše mašina ďábelsky rychlá.
            70 obrázků za vteřinu, to je jeden obrázek 1/70 = 0.0142857142
      sekundy,  čili  zhruba  1.4  setiny  sekundy.  Retrace trvá tedy asi
      0.000065   sekundy.   To   máme  65  milióntin  sekundy,  neboli  65
      mikrosekund,  kreslení  potom  ten zbytek, tedy něco přes 1.3 setiny
      sekundy,  to  je opět převedeno do rozumných jednotek 13 milisekund.
      Během  13  milisekund napočítá moje 386 SX 33MHz do 3647. Zajímá mě,
      jaká  čísla  vám  to hodí na jiných strojích. Pošlete mi prosím vaše
      výsledky. Díky.

            Jak je vidět, moc času na zatemnění nemáme.

            Můžeme si to ještě taky zkusit v assembleru:

      label
       l1, l2, l3, l4, l5, l6;
      var
        Svetlo, Tma : word;
      begin
      asm
             cli
             mov bx, 0
             mov dx,3DAh
      l1:
             in al,dx
             and al,08h
             jnz l1
      l2:
             in al,dx
             and al,08h
             jz  l2
      l3:
             inc bx
             in al, dx
             and al, 08
             jnz l3
             mov [Tma], bx
             mov bx, 0
      l4:
             in al, dx
             and al, 8
             jz l4
      l5:
             in al, dx
             and al, 8
             jnz l5
      l6:
             inc bx
             in al, dx
             and al, 8
             jz l6
             mov [Svetlo], bx
             sti
      end;
      writeln ('Svetlo: ',Svetlo);
      writeln ('Tma: ', Tma);
      end.

            Pak z toho vyleze tohle:

                 Svetlo: 5882
                 Tma: 25

            5882/3647 = 1.612832465 krát rychlejší
            25/17     = 1.470588235 krát rychlejší

            Assembler  je  asi  o  polovinu  rychlejší.  Pozor! To neplatí
      univerzálně - o polovinu  rychlejší  v tomto případě, jindy může být
      ještě   rychlejší,   nebo  i  méně  rychlejší,  nikdy  ovšem  nebude
      pomalejší.
            Takže máme proceduru, která čeká na zatemnění. Práce s paletou
      tedy  bude  fungovat  teď  tak, že nejdříve počkáte na retrace a pak
      teprve můžete měnit paletu.
            Retrace   a   práce  s  paletou  nám  umožní  v  příštím  díle
      naprogramovat  efekt,  který  znáte z šetřiče dos navigátora, nebo z
      různých  dem.  Budeme  vyrábět barevný pruh pohybující se v textovém
      režimu přes písmo...

            +------------------------------------------------------+
            |                  Petr Klimovič                       |
            |                  Masarykova 857                      |
            |          735 14  Orlová-Lutyně                       |
            |                                                      |
            | Internet: http://buut.home.ml.org                    |
            | BBS:      69-6512397 (21-16 hod. Víkendy 21-09 hod.) |
            +------------------------------------------------------+


            výheň