 Wane informacje (2:482/33)  -WANE- 
 Msg  : 86 of 93                            Snt Loc
 From : Marcin Macinski                     2:482/33        Mon, 04 Nov, 19:01
 To   : All                                                 Mon, 04 Nov, 21:57
 Subj : Assembler, the story begins [part 5, graphics]

Vitay All!

 Pewnie kady z Was widzia i podziwia te wszystkie liczne demka... a ja tu
smuc o animacji w trybie tekstowym. Okay, przy niewielkich zmianach source'a z
poprzedniego odcinka bdziemy mieli Prawdziw Animacj W Trybie Graficznym. Do
tego musimy jednak wiedzie, jak w trybie graficznym stawia si punkt na
ekranie. W trybie 13h (320x200x256) najpopularniejsze (bo najatwiejsze do
oprogramowania) s dwie metody rysowania pixela:
 a) wykorzystujc przerwanie 10h przy podanych wczeniej
    AH = 0Ch
    AL = kolor wywietlanego punktu
    BH = numer strony
    CX = pozycja X
    DX = pozycja Y
 b) wpisujc warto bezporednio do pamici.

 Zajm si wycznie tym drugim przypadkiem z trzech powodw:
 - przerwania s wolne,
 - atwo przerobi rdo, aby wykorzysta metod a),
 - poznamy dziki drugiej metodzie kilka nowych i przydatnych mnemonikw oraz
   fajn metod mnoenia (ta fajna metoda w nastpnym odcinku (: )

 Pewnie piszc co w Pascalu spotkalicie si z zapisem
   mem[jaki_segment:jaki_offset]:=blah_blah
 To nic innego, jak wpisanie wartoci blah_blah do komrki pamici. Teraz chcemy
zrobi dokadnie to samo w asmie, do tego potrzeba jednak pozna rejestry
segmentowe oraz indeksowe. Oto i one:

--- (opis nie jest mj, otrzymaem go od MS) ---
Rejestry indeksowe SI, DI:
  SI - (source index register) Suy do adresowania obszaru pamici, z ktrego
       pobieramy dane.
  DI - (destination index register) Do adresowania obszaru, do ktrego wysyamy
       dane.
 Na upartego mona te rejestry wykorzystywa inaczej, ale np. instrukcja MOVSB
wymaga, aby SI wskazywa rdo, a DI miejsce docelowe przesyanych danych.

Rejestry segmentowe CS, DS, ES, SS:
  CS - (code segment register) Znajduje si w nim numer segmentu aktualnie
       wykonywanego programu.
  DS - (data segment register) Wskazuje na segment z danymi.
  ES - (extra segment register) Dodatkowy rejestr segmentowy.
  SS - (stack segment register) Wskazuje na segment, w ktrym znajduje si
       stos.
--- (koniec nie mojego opisu) ---

 Chcc wpisa jak warto do komrki pamici pod adresem p_seg:[p_ofs], musimy
umieci segment p_seg w rejestrze segmentowym (DS lub ES, CS i SS lepiej nie
zmienia) oraz offset p_ofs w rejestrze indeksowym (SI lub DI). Reasumujc,
naley zrobi co takiego:

 mov di,p_ofs
 mov ds,p_seg

 I co? I wyskoczy bd - do rejestrw segmentowych nie mona wpisywa
bezporednio wartoci. Co wobec tego zrobi? Ot naley posuy si innym
rejestrem:

 mov ax,p_seg
 mov ds,ax

 Doszlimy w tej chwili do momentu, kiedy mamy ju ustalon komrk pamici,
teraz wystarczy ju jedynie wpisa do niej jak warto. Wykorzystamy do tego
instytucj nawiasu kwadratowego.
 Zapis
      mov ds:[di],val
 oznacza zapis wartoci val do komrki pamici pod adresem ds:di.

 W tej chwili wiemy ju wszystko, oprcz rzeczy zasadniczej - pod jaki adres
zapisywa warto, aby pojawia si na ekranie punkt? Szperamy po ksice z
opisem trybw karty VGA i w rozdziale powiconemu trybowi 13h (320x200x256)
znajdujemy, e pami karty graficznej zaczyna si dla tego trybu od adresu
0A000h. Wniosek: jeli wpiszemy do 0A000h:0 warto 1, w lewym grnym rogu
ekranu wyskoczy punkt o kolorze 1. I odpowiednio: jeli wpiszemy do 0A000h:1
warto 1, rwnie wyskoczy punkt, ale przesunity o jedno miejsce w prawo. Co
si stanie, jeli wprowadzimy do komrki 0A000:320 warto 1? Jak atwo si
domyli, pixel pojawi si o jedno miejsce w d w porwnaniu do 0A000:0.
Wniosek: podczas gdy wsprzdne X-Y wahaj si odpowiednio pomidzy (0,319) i
(0,199), wsprzdne "bezwzgldne" ekranu przyjmuj wartoci (0,63999).

 Bardzo atwy jest sposb przeliczania wsprzdnych X-Y na bezwzgldne - odbywa
si to tak:
 absolute:=poz_y*320+poz_x

 Jeli zapiszemy powysze przypisanie za pomoc assemblera, bdziemy mieli
praktycznie gotowe rdo (: Ale chwileczk, jeszcze nie umiemy mnoy ani
dodawa... do dodawania uywa si instrukcji

>ADD argument1,argument2
    dodaje warto argument1 do argument2 i umieszcza wynik w argument1.

 do mnoenia natomiast

>MUL argument
    w zalenoci od wielkoci argumentu (8, 16 lub 32 bity) warto jego jest
    przemnaana przez AL, AX lub EAX, a wynik umieszczany odpowiednio w
    AX, DX:AX lub EDX:EAX.

 Krtki i jasny przykad jest w rdle w kolejnym licie (cz midzy znakami
"***").

 Nastpnym razem poznamy lepszy, bo szybszy, sposb mnoenia przez potgi dwjki
- rdo pokazane przeze mnie wrcz idealnie nadaje si do przerbki (:

  ,
 /;`\ koniu
 ` | \____
 .-(_ ___ ):.
  `  | ,-'| ;
     ^    ^
--- GoldED/386 2.50+
 * Origin: Przeczesywaa dugowose zotowosy (2:482/33)
