
                          Ŀ
                         --[ VGA ohjelmointi ]-- 
                         --[ liikkuvat spri  ]-- 
                         --[  tet virtuaali  ]-- 
                         --[    nytss     ]-- 
                          
                                 -- OSA 3 --

Hei jlleen! VGA ohjelmoinnin oppaan kolmannessa osassa ksittelemme
liikkuvia spritej virtuaali nytss.

------------------------------------------------------------------------------
                         --[ Virtuaali spritet ]--

Kuten varmaan muistatkin, niin viime osassa (osa 2) ksitteli spritej
ja virtuaali nytt. Nyt aion kertoa teille miten spritej voi liikuttaa.

Spriten liikuttaminen virtuaali nytss on periaatteessa helppoa hommaa,
joka ky nin: muuta spriten sijaintia ja tyhjenn nytt.
Tss on ers esimerkki, joka on jo valmiina knnettyn:

POIKKI!POIKKI!POIKKI!POIKKI!

  Program Sprit;

  Uses Crt;

  Type VirSize = Array[1..5*320] Of Byte;                 { Virtuaali nytn koko      }
       VirPointer = ^VirSize;                             { Osoittaja                  }

  Var X, Y, Z : Integer;                                  { Muuttujat                  }
      Lii     : Integer;
      VirScr  : VirPointer;
      Vir     : Word;
      Nappain : Char;

  Const Spriten_leveys = 16;                              { Spriten leveys             }
        Spriten_korkeus = 5;                              { Spriten korkeus            }
        Vir_koko = 5*320;                                 { Virtuaali nytn koko      }
        VGA_osoite = $A000;                               { VGA nytn osoite          }

        Sprite : Array[1..Spriten_korkeus*Spriten_leveys] Of Byte =
                 (22,23,22,0,22,23,22,0,22,23,22,0,22,23,22,0,
                  23,20,23,0,20,24,20,0,20,24,20,0,23,20,0,0,
                  24,23,24,0,0,24,0,0,0,24,0,0,23,22,0,0,
                  23,20,23,0,0,23,0,0,0,23,0,0,23,20,0,0,
                  22,0,22,0,0,22,0,0,0,22,0,0,22,24,22,0);

  Procedure Video(Tila : Byte); Assembler;                { Nytt proseduuri          }
  Asm
       MOV    AH,00
       MOV    AL,Tila
       INT    10H
  End;

  Procedure Vertical; Assembler;                          { Vertical retrace, jota     }
  Asm                                                     { tutkitaan seuraavassa      }
         CLI                                              {  osassa                     }
         MOV    DX,3DAH
  @@Yksi:
         IN     AL,DX
         AND    AL,08H
         JNZ    @@Yksi
  @@Kaksi:
         IN     AL,DX
         AND    AL,08H
         JZ     @@Kaksi
         STI
  End;

  Begin
    Video($13);                                           { Asettaa nytn MCGA tilaan }
    Lii := 5;                                             { Sprite liikkuu 5 pikseli  }
    GetMem(VirScr,Vir_koko);                              { Varaa muistia virtuaali
                                                            nytlle                   }
    Vir := Seg(VirScr^);                                  { Virtuaali nytn segmentti }
    FillChar(Mem[Vir:0],Vir_koko,0);                      { Tyhjent virtuaali nytn }
    Repeat                                                { Aloittaa toiston           }
      Nappain := UpCase(ReadKey);                         { Nappain := Napinpainallus  }
      Case Nappain Of                                     { Jos painaa nappia, niin    }
        #77 : Begin                                       { ->                         }
                For Z := Lii-5 to Lii do Begin            { Lii := 5 eteenpin         }
                For X := 0 to Spriten_leveys-1 do         { Spriten leveys             }
                For Y := 0 to Spriten_korkeus-1 do        { Spriten korkeus            }
                If (Mem[Vir:X+Z+(320*Y)]) = 0 Then        { Jos spriten alla on mustaa }
                Mem[Vir:X+Z+(320*Y)] := Sprite[Y*Spriten_leveys+X]; { Niin piirr sprite }
                Move(VirScr^,Mem[VGA_osoite:0],Vir_koko); { Muuttaa virtuaali nytn
                                                            MCGA nytksi              }
                FillChar(Mem[Vir:0],Vir_koko,0);          { Tyhjent virtuaali nytn }
                Delay(5);                                 { Odottaa 0,0005 sekuntia    }
                Vertical;                                 { Vertical retrace (Osa 4)   }
              End;                                        { For lopetus                }
              Inc(Lii,5);                                 { Liikkuu 5 pikseli lis   }
            End;                                          { -> lopetus                 }
        #75 : Begin                                       { <-                         }
                For Z := Lii+5 Downto Lii do Begin        { Lii := 5 taaksepin        }
                For X := 0 to Spriten_leveys-1 do         { Spriten leveys             }
                For Y := 0 to Spriten_korkeus-1 do        { Spriten korkeus            }
                If (Mem[Vir:X+Z+(320*Y)]) = 0 Then        { Jos spriten alla on mustaa }
                Mem[Vir:X+Z+(320*Y)] := Sprite[Y*Spriten_leveys+X]; { Niin piirr sprite }
                Move(VirScr^,Mem[VGA_osoite:0],Vir_koko); { Muuttaa virtuaali nytn
                                                            MCGA nytksi              }
                FillChar(Mem[Vir:0],Vir_koko,0);          { Tyhjent virtuaali nytn }
                Delay(5);                                 { Odottaa  0,0005 sekuntia   }
                Vertical;                                 { Vertical retrace (Osa 4)   }
              End;                                        { For lopetus                }
              Dec(Lii,5);                                 { Liikkuu 5 pikseli taakse  }
            End;                                          { <- lopetus                 }
      End;                                                { Case lopetus               }
    Until Port[$60]=1;                                    { Paina ESC nppint        }
    FreeMem(VirScr,Vir_koko);                             { Vapauta virtuaali muisti   }
  Video($3);                                              { Asettaa nytn teksti
                                                            tilaan                     }
  End.                                                    { Lopettaa ohjelman          }
POIKKI!POIKKI!POIKKI!POIKKI!

Voit liikuttaa yllolevan ohjelman sprite nuolinppimill.
Ohjelmassa on jokaiseen komentoon eri kommentti, joten yrit saada
selv ja muistia harjoitella armottomasti, niin, ett p paisuu.

------------------------------------------------------------------------------

Tss se nyt sitten jlleen kerran olikin. Seuraavassa osassa ksittelemme
Vertical retracea ja MCGA palettia.
Seuraava osa ilmestyy joskus 5.12.1995.

  - Acrobat (Atte)
