 Wane informacje (2:482/33)  -WANE- 
 Msg  : 115 of 116                          Loc
 From : Marcin Macinski                     2:482/33        Thu, 12 Jun, 21:15
 To   : All
 Subj : Assembler, the story begins [part 10, "stars" animation]

Vitay All!

 Dzisiaj czas na co bardziej "profesjonalnego" i ju jako-tako wygldajcego.
Niecierpliwym polecam kompilacj i uruchomienie zaczonego rda, pozostaych
zapraszam do lektury, bo poznamy dzi zasad animacji tzw. gwiazdek, ktre to
przesuwa si bd w kilku poziomach, przy czym poziom pierwszy przesuwa si
najszybciej, drugi nieco wolniej itd. a do poziomu ostatniego.
 Jak wic wyglda algorytm tworzenia i animacji takich gwiazdek?
 Tworzymy sobie tablic, ktra zawiera pozycje wszystkich gwiazdek - na razie
nie zwracamy uwagi na to, ktra gwiazdka naley do ktrego poziomu.
  * Tablic tak najatwiej przygotowa sobie zawczasu generujc odpowiedni *
  * ilo losowych wartoci z zakresu (0,63999) pod Pascalem i doczy j   *
  * po prostu do pliku, ale w tym przykadzie posuymy si do tego celu     *
  * asemblerem.                                                              *

 W notacji pseudopascalowej cao wyglda bdzie tak:

   var tablica_pozycji[1..ilo_gwiazdek_na_poziomie*ilo_poziomw] of word;
   [tutaj przypisanie losowych wartoci pozycjom pocztkowym gwiazdek]

   repeat
     indeks:=1;
     for a:=1 to ilo_gwiazdek_na_poziomie do
     for aktualny_poziom:=1 to ilo_poziomw downto do
     begin
          kasuj_punkt(tablica_pozycji[indeks]);
          tablica_pozycji[indeks]:=tablica_pozycji[indeks]+aktualny_poziom;
          rysuj_punkt(tablica_pozycji[indeks]);
          indeks:=indeks+1;
     end;
  until keypressed;

 "kasuj_punkt" oraz "rysuj_punkt" s chyba zrozumiae, ale dlaczego w ptli
dodajemy do pozycji kolejnej gwiazdki warto aktualnego poziomu? To proste -
gwiazdki na kadym poziomie poruszaj si z rnymi prdkociami - te "z tyu"
(na poziomie 1) najwolniej, za te "najbliej nas" - najszybciej. Prdko
poruszania si okrelonego poziomu to nic innego, jak wielko przesunicia w
pikselach (im szybciej ma si porusza gwiazdka, tym wiksze przesunicie naley
zastosowa). Zauwamy zatem nastpujc zaleno:
             poziom      przesunicie w kroku animacji
               1                    1 piksel
               2                    2 piksele
              ...                      ...
               5                    5 pikseli
 Czy ju jasne? (:

 Procedura tworzca pseudolosowe wartoci nie wymaga chyba wyjanienia.

 W rdle zastosowaem oprcz tego przydatn procedur, a mianowicie czekanie na
zakoczenie powrt plamki w pionie. Jest to konieczne do zachowania pynnoci
animacji ("synchronizujemy" w ten sposb wywietlanie jednego kroku animacji z
ekranem). Znana z poprzednich odcinkw metoda wykorzystania int 15h da
nieprzyjemny dla oka rezultat "skakania" (mona sprawdzi (: ). W procedurze tej
wykorzystaem nowy mnemonik:

 >TEST X,Y
    stosuje AND dla wszystkich odpowiadajcych sobie par bitw z argumentw
    X i Y. Na tej podstawie ustawia flagi (podobnie jak BT).

 Dodatkowo opisz mnemoniki CMPSB, SCASB, INSB, OUTSB, ktre - cho nie s
stosowany w tym programie - dopeniaj list instrukcji operujcych na pamici z
wykorzystaniem rejestru CX jako licznika.

>CMPSB
   poczenie MOVSB i CMP, a wic nic nie przenosi, jedynie porwnuje komrki
   pamici.

>SCASB
  odejmuje od AL warto spod ES:[DI]. Na tej podstawie ustawiane s znaczniki.

>INSB
  poczenie LODSB i IN - pobiera z portu DX i wkada pod ES:[DI]. Flaga DF
  dziaa tak samo, jak poprzednio.

>OUTSB
  poczenie STOSB i OUT - wysya do DX zawarto ES:[DI]. Flaga DF jak wyej.

 Wszystkie mnemoniki typu *SB maj swoje wersje operujce na sowach i
podwjnych sowach (w rdle jest np. STOSW). Tak dla przykadu (zakadajc
DF=0):

 mnemonik     modyfikuje     rejestr SI     rejestr DI
 LODSB            AL             +1             -
 LODSW            AX             +2             -
 LODSD           EAX             +4             -
 MOVSB      ES:[DI], bajt        +1             +1
 MOVSW         ES:[DI]           +2             +2
 MOVSD        ES:[EDI]           +4             +4

 Oczywicie REP/REPE/REPNE mona stosowa dla wszystkich wersji (:


 Zadanie domowe: napisa "gwiazdki" pynce w drug stron.

  ,
 /;`\ koniu
 ` | \____
 .-(_ ___ ):.
  `  | ,-'| ;
     ^    ^
--- GoldED/386 2.50+
 * Origin: Ja to tylko: manga - nie manga, cyce - nie cyce (2:482/33)
