JAK SOBĚ VYROBITI DEMO GRAFICKÉ
                     KU POTĚŠE VLASTNÍ I OSOB OSTATNÍCH
                                 (počtvrté)

                            Petr Klimovič l.p.1996

          Od dnešního dílu budou k dispozici i zdrojáky v Céčku.
          Poděkujte za ně panu Aleši Zíkovi.

          Takže,  jak jsem minule slíbil, vrhneme  se dnes na onen efekt s
     proužkem.  Obrazovka  se  vykresluje postupně  zleva  do prava, zhora
     dolů.  Jesliže  si  počkáme na  vertikální  impuls, pak si odpočítáme
     nějakou  dobu, bude paprsek někde  uprostřed obrazovky, změníme barvu
     černé  na  červenou  a  od teď  kreslí  paprsek  místo černého pozadí
     červeně.  Za  chvíli  tam zase dáme  černou  a  zase se kreslí černě,
     vznikl  červený  proužek.  Budeme-li postupně  měnit  dobu  čekání po
     retrace, bude se proužek pohybovat.

     uses crt;                                                                  
                                                                                
     const                                                                      
        HHrana = 300;         {Horni uvrat}                                     
        DHrana = 6000;        {Dolni uvrat}                                     
        Rychlost = 30;        {Rychlost prouzku}                                
        Sirka = 2000;         {Sirka prouzku}                                   
                                                                                
     var Citac, Pozice : integer;                                               
                                                                                
     procedure CekejRet;          {Cekani na retrace}                           
     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;                                                                       
                                                                                
     procedure Cervena;           {Nastavi barvu 0 jako cervenou}               
     begin                                                                      
        Port[3c8] := 0;                                                         
        Port[3c9] := 63;                                                        
        Port[3c9] := 0;                                                         
        Port[3c9] := 0;                                                         
     end;                                                                       
                                                                                
     procedure Cerna;             {Nastavi barvu 0 jako cernou}                 
     begin                                                                      
        Port[3c8] := 0;                                                         
        Port[3c9] := 0;                                                         
        Port[3c9] := 0;                                                         
        Port[3c9] := 0;                                                         
     end;                                                                       
                                                                                
     begin                                                                      
        repeat                          {Hlavni, nekonecna smycka}              
           Pozice := HHrana;            {Zacinam v horni uvrati}                
           repeat                                                               
              asm                                                               
                 cli                    {Zakazu preruseni}                      
              end;                                                              
              CekejRet;              {Cekam na retrace a pocitam pauzu}         
              for Citac := 1 to Pozice do begin end;                            
              Cervena;               {Zacnu cerveny pruh, pocitam sirku}        
              for Citac := 1 to Sirka do begin end;                             
              Cerna;                 {Koncim cerveny pruh}                      
              Pozice := Pozice + Rychlost;                                      
                                 {Vypocitam pristi polohu prouzku}              
              asm                                                               
                 sti                     {Povolim preruseni}                    
              end;                                                              
           until (Pozice > DHrana) or keypressed;   {Az po dolni uvrat}         
           repeat                                                               
              asm                                                               
                 cli                     {Zakaz preruseni}                      
              end;                                                              
              CekejRet;                                                         
              for Citac := 1 to Pozice do begin end;                            
              Cervena;                                                          
              for Citac := 1 to Sirka do begin end;                             
              Cerna;                                                            
              Pozice := Pozice - Rychlost;                                      
              asm                                                               
                 sti                                                            
              end;                                                              
           until (Pozice < HHrana) or keypressed;  {Az po horni uvrat}          
        until keypressed;                                                       
     end.                                                                       

          Tento  program má jednu velkou nevýhodu, na každém počítači bude
     fungovat  jinou  rychlostí. Konstanty na  začátku  si musíte nastavit
     podle  vašeho  počítače.  Tak jak jsou  uvedeny  nyní fungují pro mou
     386SX 33MHz. Jestliže nezakážete přerušení, bude se proužek pohybovat
     trhaně.  Zákaz  přerušení má ovšem  nevýhodu,  zastaví se vám vnitřní
     čas.  Takže  po  vykonání tohoto  programu  budete  mít pravděpodobně
     rozhozený čas. Ten se znovu nastaví až při studeném startu.

          Můžeme to zkusit pomocí delay, to by mělo být na každém počítači
     stejné.

     uses crt;                                                                  
                                                                                
     const                                                                      
        HHrana = 1;         {Horni uvrat}                                       
        DHrana = 12;        {Dolni uvrat}                                       
        Rychlost = 1;        {Rychlost prouzku}                                 
        Sirka = 1;         {Sirka prouzku}                                      
                                                                                
     var Citac, Pozice : integer;                                               
                                                                                
     procedure CekejRet;          {Cekani na retrace}                           
     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;                                                                       
                                                                                
     procedure Cervena;           {Nastavi barvu 0 jako cervenou}               
     begin                                                                      
        Port[3c8] := 0;                                                         
        Port[3c9] := 63;                                                        
        Port[3c9] := 0;                                                         
        Port[3c9] := 0;                                                         
     end;                                                                       
                                                                                
     procedure Cerna;             {Nastavi barvu 0 jako cernou}                 
     begin                                                                      
        Port[3c8] := 0;                                                         
        Port[3c9] := 0;                                                         
        Port[3c9] := 0;                                                         
        Port[3c9] := 0;                                                         
     end;                                                                       
                                                                                
     begin                                                                      
        repeat                          {Hlavni, nekonecna smycka}              
           Pozice := HHrana;            {Zacinam v horni uvrati}                
           repeat                                                               
              asm                                                               
                 cli                    {Zakazu preruseni}                      
              end;                                                              
              CekejRet;            {Cekam na retrace a pocitam pauzu}           
              delay (Pozice);                                                   
              Cervena;              {Zacnu cerveny pruh, pocitam sirku}         
              delay (Sirka);                                                    
              Cerna;                    {Koncim cerveny pruh}                   
              Pozice := Pozice + Rychlost;                                      
              {Vypocitam pristi polohu prouzku}                                 
              asm                                                               
                 sti                     {Povolim preruseni}                    
              end;                                                              
           until (Pozice > DHrana) or keypressed;   {Az po dolni uvrat}         
           repeat                                                               
              asm                                                               
                 cli                     {Zakaz preruseni}                      
              end;                                                              
              CekejRet;                                                         
              delay (Pozice);                                                   
              Cervena;                                                          
              Delay (Sirka);                                                    
              Cerna;                                                            
              Pozice := Pozice - Rychlost;                                      
              asm                                                               
                 sti                                                            
              end;                                                              
           until (Pozice < HHrana) or keypressed;  {Az po horni uvrat}          
        until keypressed;                                                       
     end.                                                                       

          Spusťte  a  zjistíte, že krok po  1  ms je příliš velký. Proužek
     lítá jako splašený.

          Ovšem ještě je tu jedna možnost a tou je horizontální zatemnění.
     Doba kdy paprsek přeskakuje z řádku na řádek. Na známém portu 3DAh je
     třetí bit informace o tom, že probíhá vertikální retrace, ovšem ještě
     tu  je  bit nultý a ten informuje  o  tom, že probíhá retrace obecně,
     jestliže  je  tedy  nastaven  bit 0  a  zároveň  není nastaven bit 3,
     znamená  to, že probíha retrace  horizontální. Místo zběsilého čítání
     naprázdno,  budeme počítat jednotlivé retrace. Ty probíhají na každém
     počítači  stejně rychle, takže se nebudeme muset otravovat s nějakýma
     konstantama.

          Přibyde tedy procedura, která čeká na horizontální retrace:

     procedure CekejHor;                                                        
     begin                                                                      
        repeat until Port [3DA] and 9 = 0; {Cekam na konec retrace}             
        repeat until Port [3DA] and 9 = 1; {Cekam na zacatek retrace}           
     end;                                                                       

          Takže  výsledek  je tento. Tento program  by už měl běhat stejně
     rychle na všech PC.

     uses crt;                                                                  
                                                                                
     const                                                                      
        HHrana =     1;         {Horni uvrat}                                   
        DHrana =   348;         {Dolni uvrat}                                   
        Rychlost =   1;         {Rychlost prouzku}                              
        Sirka =     50;         {Sirka prouzku}                                 
                                                                                
     var Citac, Pozice : integer;                                               
                                                                                
     procedure CekejRet;          {Cekani na KONEC retrace}                     
     var                                                                        
        Bajt : byte;                                                            
     begin                                                                      
        repeat until (Port [3DA] and 8) > 0; {Cekam na zacatek retrace}         
        repeat until (Port [3DA] and 8) = 0; {Cekam na konec retrace}           
     end;                                                                       
                                                                                
     procedure CekejHor;                                                        
     begin                                                                      
        repeat until Port [3DA] and 9 = 0;    {Cekam na konec retrace}          
        repeat until Port [3DA] and 9 = 1;    {Cekam na zacatek retrace}        
     end;                                                                       
                                                                                
     procedure Cervena;           {Nastavi barvu 0 jako cervenou}               
     begin                                                                      
        Port[3c8] := 0;                                                         
        Port[3c9] := 63;                                                        
        Port[3c9] := 0;                                                         
        Port[3c9] := 0;                                                         
     end;                                                                       
                                                                                
     procedure Cerna;             {Nastavi barvu 0 jako cernou}                 
     begin                                                                      
        Port[3c8] := 0;                                                         
        Port[3c9] := 0;                                                         
        Port[3c9] := 0;                                                         
        Port[3c9] := 0;                                                         
     end;                                                                       
                                                                                
     begin                                                                      
        repeat                          {Hlavni, nekonecna smycka}              
           Pozice := HHrana;            {Zacinam v horni uvrati}                
           repeat                                                               
              asm                                                               
                 cli                    {Zakazu preruseni}                      
              end;                                                              
              CekejRet;            {Cekam na retrace a pocitam pauzu}           
              for Citac := 1 to Pozice do                                       
                 CekejHor;                                                      
              Cervena;             {Zacnu cerveny pruh, pocitam sirku}          
              for Citac := 1 to Sirka do                                        
                 CekejHor;                                                      
              Cerna;                    {Koncim cerveny pruh}                   
              Pozice := Pozice + Rychlost;                                      
              {Vypocitam pristi polohu prouzku}                                 
              asm                                                               
                 sti                     {Povolim preruseni}                    
              end;                                                              
           until (Pozice > DHrana) or keypressed;   {Az po dolni uvrat}         
           repeat                                                               
              asm                                                               
                 cli                     {Zakaz preruseni}                      
              end;                                                              
              CekejRet;                                                         
              for Citac := 1 to Pozice do                                       
                 CekejHor;                                                      
              Cervena;                                                          
              for Citac := 1 to Sirka do                                        
                 CekejHor;                                                      
              Cerna;                                                            
              Pozice := Pozice - Rychlost;                                      
              asm                                                               
                 sti                                                            
              end;                                                              
           until (Pozice < HHrana) or keypressed;  {Az po horni uvrat}          
        until keypressed;                                                       
     end.                                                                       

          Upravil  jsem i proceduru pro  čekání na vertikální retrace. Teď
     nečekám na začátek, ale na konec retrace.

          Poslední  úpravou bude ještě vizuální vyhezkání. Uděláme proužek
     odstínovaný.

                                 VIZ DEMO4.PAS nebo
                                 VIZ DEMO4.C

          Zde  se opět objevuje sněžení, protože měním barvu v době kdy se
     kreslí. Kdo ví jak na to, napište.

          V dalším díle bysme konečně mohli šáhnout na kreslení čar.

          Nashle příště

                                   Piži.

          Jó ještě jsem si vzpoměl. Lidi napište mi!!! Potřebuji znát vaše
     názory, na to co to tady píšu. Usměrněte mě. Nebaví mě psát, když ani
     nevím jestli to někdo čte.

            +------------------------------------------------------+
            |                  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.) |
            | Mobil:    0601-535226                                |
            | Email:    sysop@pizi.fido.cz                         |
            | FidoNet:  2:421/59                                   |
            +------------------------------------------------------+


            výheň