 Wane informacje (2:482/33)  -WANE- 
 Msg  : 89 of 93                            Snt Loc
 From : Marcin Macinski                     2:482/33        Tue, 19 Nov, 19:48
 To   : All                                                 Tue, 19 Nov, 22:36
 Subj : Assembler, the story begins [part 7, displaying fonts]

Vitay All!

 Z gry uprzedzam, e o ile poprzednie odcinki mogy przej gadko, ten jest
raczej do trudny... trzeba po prostu nad tym troch posiedzie. W kadym razie
- jak zawsze - czekam na pytania i postaram si na nie odpowiedzie.

 Tytu dzisiejszego odcinka zapowiada si interesujco. Bdziemy wywietla
literki. Nie przez jakietam badziewne przerwania (bo byoby to po pierwsze
pjciem na atwizn, a po drugie praktycznie niczego by nie wnioso do nauki
assemblera), ale "okrn drog".
 Innymi sowy, postaram si dzi wytumaczy, jak wywietli _dowolny_ obiekt na
ekranie, a zrobi to na przykadzie czcionek znajdujcych si w pamici ROM
karty graficznej. Do tego wszystkiego przydatna nam bdzie jednak znajomo
kilku komend.

>LODSB
    kopiuje 1 bajt z komrki pod adresem DS:SI do rejestru AX. Jeli DF jest
    ustawione, zmniejsza SI o 1, w przeciwnym wypadku zwiksza SI o 1.

przy okazji

>LODSW
    kopiuje 1 sowo z komrki pod adresem DS:SI do rejestru AX. Jeli DF jest
    ustawione, zmniejsza SI o 2, w przeciwnym wypadku zwiksza SI o 2.

>CALL etykieta
   skok do procedury ETYKIETA
>RET
   powrt z procedury

>BT X,Y
    kopiuje bit o indeksie Y z argumentu X do znacznika CF {instrukcja 386}

 Okay, teraz trzeba si zabra za mechanizm wywietlania czegokolwiek w trybie
13h. Punkt ju umiemy postawi - i to w dowolnym miejscu ekranu (patrz poprzedni
odcinek). Ale punkt ma tylko jeden wymiar... jak zatem wywietli obiekt
dwuwymiarowy? Nie trzeba chyba wielu godzin rozmyla, by doj do wniosku, e
kady obiekt skada si z punktw (: Dla uzmysowienia sobie tego proponuj
wywietli kwadrat o boku 3. Wyglda to bdzie tak:

[...]
 poz_x db 0     ;pozycja X pocztkowa
 poz_y db 0     ;pozycja Y pocztkowa
[...]
 mov cx,3       ;dugo kwadratu
 pion:
    push cx
    mov cx,3    ;szeroko kwadratu
    poziom:
           [wywietl punkt na pozycji (poz_x,poz_y)]
           inc poz_x
    loop poziom
    inc poz_y
    pop cx
 loop pion

 Po "wykonaniu" tego programu otrzymamy na ekranie zamalowany kwadracik o boku
3. Polecam przyjrzenie si i _zrozumienie_ powyszego programiku - bez tego nie
sposb zrozumie dalszych moich wywodw, a tym bardziej rda!

 Podobnie jak nasz kwadrat 3x3 wywietla si cokolwiek innego, niejako
"zamykajc" obiekt w prostokcie i wywietlajc tylko te jego punkty, ktre
speniaj okrelone warunki (moe trudno to zrozumie - sprbuj wobec tego
narysowa (: ):

        bity     matry-
      76543210    ca
  1       0         Litera Q jest "zamknita" w prostokcie o wymiarach
  2       0         8x16. Gdyby narysowa wszystkie punkty tego
  3       124       prostoktu, otrzymalibymy zapeniony obszar.
  4       198       Rysowane s wobec tego jedynie te punkty, ktre
  5       198       speniaj warunek:
  6       198                   "nale do obrysu litery Q"
  7       198
  8       198       Poniewa jednemu wierszowi litery w pamici karty
  9       198       graficznej odpowiada jeden bajt, wic caa literka
 10       214       skada si z bajtw 16.
 11       222
 12       124
 13       12
 14       14
 15       0
 16       0

 Wywietlenie przykadowej litery Q polega wobec tego bdzie na:
 1. Ustaleniu pozycji pocztku litery w pamici (patrz *),
 2. Odczytaniu bajtu (patrz **)
 3. Sprawdzeniu, ktre bity w bajcie s ustawione i na tej podstawie
    narysowaniu 8 punktw na ekranie (patrz ***)
 4. Dodaniu 1 do pocztkowej pozycji i skoku do 2 (i tak 16 razy).

(*)
 Po wykonaniu
 mov ax,1130h
 mov bh,6
 int 10h
 dostajemy w ES:BP wskanik do pocztku matrycy 256 znakw ASCII karty VGA. Znak
#0 bdzie pod adresem ES:BP, znak #1 pod ES:BP+16, #2 - ES:BP+32 itd. Wobec tego
znak #X bdzie pod adresem ES:BP+16*X.

(**)
 Polega to na pobraniu bajtu spod adresu
 ES:BP+16*X+aktualnie_rysowana_linia

(***)
 Przykad dla linii 10 narysowanej przeze mnie litery Q:
 - czy bit 7 ustawiony? tak -> stawiamy punkt w pozycji A; A:=A+1;
 - czy bit 6 ustawiony? tak -> stawiamy punkt z pozycji A; A:=A+1;
 - czy bit 5 ustawiony? nie -> nie stawiamy nic; A:=A+1;
 - czy bit 4 ustawiony? tak -> stawiamy punkt w pozycji A; A:=A+1;
 ... i tak dalej a do bitu 0.


 Ufff... brzmi to troch zawile, ale zapewniam, e wcale takie trudne nie jest,
cho szczerze powiedziawszy wtpi, by komukolwiek chciao si dogbnie
analizowa kod rdowy podany w nastpnym licie. Pomoe on jednak tym, ktrzy
ju sami zaczynaj co pisa w assemblerze (a po 5 odcinkach "kursu" ju mona,
a nawet _trzeba_ pokusi si np. o wiksze modyfikacje poprzednich rde czy o
wasn implementacj problemw).

 Dla tych, ktrzy zaapali, o co w tym wszystkim chodzi, jest zadanie domowe -
zmodyfikowa tak rdo, aby kady wiersz wywietlanych liter by innego koloru
oraz - ewentualnie - aby napis wywietlany by na rodku ekranu. Powodzenia (:


 BTW, przepraszam za takie dugie przerwy pomidzy kolejnymi "wykadami" - ale
sami wiecie, czas... ):

  ,
 /;`\ koniu
 ` | \____
 .-(_ ___ ):.
  `  | ,-'| ;
     ^    ^
--- GoldED/386 2.50+
 * Origin: By taki pikny dzie, e szkoda byo wstawa (2:482/33)
