                          å2°2Assembler - lekcja 2å0°0


 Jeôli  niezbyt dobrze zapamiëtaîeô o co chodzi w ukîadach szesnastkowym
i  dwójkowym  to sië nie martw.  W kaûdym assemblere jest funkcja, która
moûe  Ci  pokazaê  jakâô  liczbë  w  ukîadzie  szesnestkowym, dwójkowym,
dziesiëtnym i ascii!  Gdy jesteô w assemblerze to wpisz np.

å2? 3å0

 i on wyôwietli:

å2$00000003    3    "...." %00000000.00000000.00000000.00000011å0

 szesnastkowy, dziesiëtny, ascii, no i dwójkowy!


 Wróêmy  jeszcze  do  rejestrów.  Czy moûna w nich trzymaê ciâg literek,
np.   XYZ?   Otóû  TAK,  moûna!  Zastanówmy sië co to sâ literki?  Kaûda
"literka"  to  jest  poprostu  liczba!  (na prosty jëzyk - kod znaku!) I
jeôli np.  do d5 chcesz wpisaê literkë "X" (duûe x) to robisz:

        å2move.b  #"X",d5å0

 lub uûywajâc kodu litery "X":

        å2move.b  #88,d5å0

 Oba  sposoby  sâ  prawidîowe  i  oba  powodujâ  dokîadnie  to samo.  Do
rejestrów adresowych moûna wpychaê to samo co do rejestrów danych, tyle,
ûe  sâ  sytuacje, w których nie moûna wykorzystaê np.  rejestrów danych.
Zaîóûmy, ûe w pamiëci (pod etykietâ "chuj") masz kod, który chcesz teraz
wykonaê, to moûesz skoczyê do niej:

        å2bra     chujå0    ;coô jak "goto chuj" w basicu!

 lub:

        å2lea     chuj(pc),a0å0     ; przenieô adres etykiety chuj do a0
        å2jmp     (a0)å0            ; skocz pod adres, który jest w a0

 I  tu  juû  nie  moûna  uûyê  rejestru  danych,  musisz  uûyê  rejestru
adresowego.   Po prostu rejestry danych sâ przystosowane do uûywania ich
do  danych, a rejesty adresowe po to, aby trzymaê w nich adresy pamiëci.
Oczywiôcie   na   chamca  moûna  robiê  na  adresowych  operacje,  które
wypadaîoby  robiê  na  rejestrach  danych, ale...  nie po to one zostaîy
stworzone.

 Lecimy dalej.  Przykîadowo chcesz zrobiê 4+d4 i wepchaê wynik do d5 nie
zmieniajâc d4...

        å2move.l  d4,d5
        add.l   #4,d5å0

 czyli przenosi to, co jest w d4 do d5 i dodaje do tego 4.  Wyszîo jakby
trochë  inaczej,  ale  w  ostatecznoôci  wychodzi na to samo, co nie?  A
jakbyô chciaî to moûna to zrobiê trochë inaczej:

        å2add.l   #4,d4å0   ; dodaje 4 do d4
        å2move.l  d4,d5å0   ; wpycha to co jest w d4 do d5
        å2sub.l   #4,d4å0   ; odejmuje 4 od d4 (aby wynik byî taki sam, co
                        ; przed dodaniem czterech (4)!)

 Jak sam widzisz oba przypadki dajâ to samo, ale drugi bëdzie troszeczkë
wolniejszy...   Zajmijmy sië teraz mnoûeniem.  Otóû mnoûy sië instrukcjâ
"mulu"!
przykîad:

        å2mulu    #2,d3å0   ; mnoûy przez 2 to co jest w d3
                        ; i tam zostawia wynik!

 Operacja  taka  jest  najzupeîniej prawidîowa, lecz nie zapominajmy, ûe
piszâc  np.   jakiô  efekt  zaleûy  nam  na  szybkoôci.  W tym przypadku
zamiast instrukcji mulu wypadaîoby uûyê instrukcji add, czyli dodawania,
która jest szybsza od mulu.

przykîad:

        å2add.l   d3,d3å0   ; dodaje to co jest w d3 do d3, czyli
                        ; robi dokîadnie to samo co mulu  #2,d3!

 No ale wróêmy do mnoûenia, bo tym mieliômy sië zajmowaê.

przykîad:

        å2move.l  #15,d4
        mulu    #3,d4å0

 Jak nie trudno sië domyôliê po takich komendach w d4 bëdzie 45.

 Po mnoûeniu przyszedî czas na dzielenie.  Dzieli sië komendâ "divu".  A
wykonuje  sië  to  w  identyczny sposób jak przy mnoûeniu!  Tyle, ûe jak
masz  np.   5  w  d3  i  podzielisz  przez  2, to wynik bëdzie 2!  Tylko
caîoôci!!!   Pamiëtaj  o  tym,  bo  czasem  moûna sië na to nadziaê, np.
robisz:

        å2divu    #2,d2å0

 I  masz  potrzebne  ci dane.  A potem jak potrzebujesz starego stanu to
robisz:
        å2mulu    #2,d2å0

 Ale  moûe  akurat  tak  wyjôê, ûe przy dzieleniu obetnie ci 0.5 i potem
bëdziesz  miaî  kupë.   Potem moûesz spëdziê póî dnia zanim dojdziesz co
jest grane!  Poprotu gîupstwo, które moûe kosztowaê duûo nerwów!  Lepiej
jest wiëc zrobiê to tak:

        å2move.l  d2,d3å0   ; zapamiëtuje d2 (przesyîajâc d2 do d3 mamy
                        ; w d3 jakby backupa tego co jest w d2!)
        å2divu    #2,d2å0
 No i masz swoje dane!

        å2move.l  d3,d2å0   ; przywrócenie poprzedniego stanu rejestu d2

 I teraz jest wszystko bëdzie w porzâdku!

                         å1* - * - * - * - * - *å0

 Jeôli   chciaîbyô   popróbowaê   jakichô  operacji  na  rejestrach,  to
wypadaîoby  wiedzieê  jaki  wyszedî  nam  wynik,  czyli  ile  jest w tym
rejestrze po naszych operacjach.  Po prostu napisz:

å2? d3å0

 i wyôwieli ci np.:

å2$0000005A       90      "...Z"  %00000000.00000000.00000000.01011010å0

(szesnastkowy,  dziesiëtny,  ascii  no  i dwójkowy!) No i teraz bëdziesz
wiedziaî  co  masz  w tym rejestrze!  Aha, jak bëdziesz próbowaî juû np.
dodawaê, to w edytorze pisz komendy tak:

(jesteô na poczâtku nowej linji)

 å21.å0  naciskasz TAB
 å22.å0  piszesz np:  add.l
 å23.å0  naciskasz TAB
 å24.å0  piszesz np.  #5,d4

 Postëpujâc  w ten sposób potem source zajmuje mniej miejsca (bo zamiast
spacji   (kilku)   stawiasz   jednego   TABa)  i  source  jest  bardziej
czytelniejszy!

 å1I NIE ZAPOMNIJ ZROBIÊ WYJÔCIA ZE SWEGO "programu"!!!å0

        å2rtså0     ;wyjôcie

przykîad sourca:

å1S:å0                      ; etykieta
        å2sub.l   d2,d2å0   ; odejmuje d2 od d2, czyli w d2 po tej operacji
                        ; zostaje 0 (najszybsze czyszczenie rejestru!!!)
        å2move.l  #5,d2å0   ; Dodaje 5 do d2
        å2rtså0             ; Wychodzi!!!
 I jak juû masz coô takiego w edytorze to robisz:

å2aå0 [return]

 Teraz Ci to assembleruje!

å2jså0 [return]

 No i skacze pod etykietë "s", czyli startuje program!

                         å1* - * - * - * - * - *å0

 Source  wczytujesz  komendâ "r", a nagrywasz "w".  Moûna teû zrobiê "u"
(update),  czyli nagranie tego sourca na to samo miejsce, skâd wczeôniej
zostaî   wczytany  (kasuje  starâ  wersjë,  nagrywa  tâ,  którâ  masz  w
edytorze).
                         å1* - * - * - * - * - *å0

 Jeôli podczas assebleracji pokaûe sië jakiô bîâd, np.:

å2**å0 illegal coô tam (np. command)

 To  chyba  wiesz  o co biega?  Komenda zîa, powno gdzieô sië pomyliîeô!
Aha,  no  i  jest  bez  róûnicy,  czy  piszesz komendy duûymi czy maîymi
fontami.  Ja piszë maîymi, ale niektórzy piszâ duûymi...  ûe teû chce im
sië  wîâczaê  ten  capslock  ciâgle,  a  poza  tym  maîymi wydaje mi sië
bardziej czytelniejsze.

 A  moûe  chciaîbyô  zawiesiê  komputer?   Do  tego nie potrzeba ûadnych
specjalnych zdolnoôci!  Hehe!  Jak by Ci sië nudziîo to wpisz komendë:

        å2jmp     0å0

 czyli  skok  pod  adres  0  (poczâtek  pamiëci),  a  tam  siedzâ  róûne
chujowinki...
                         å1* - * - * - * - * - *å0

 Jak  uruchomisz  Trasha  to wybierasz pamiëê.  Wybierz chip (c) a potem
wielkoôê jej, na razie spokojnie Ci styknie 100kb!  Potem wykonaj:

å2oå0 [return]

 i pokaûe ci napisy:

worksp:  odkâd - dokâd (adresy!) masz wolnâ pamiëê (zarezerwowanâ na twe
potrzeby),  tak  wiëc  jeôli pokaûe Ci, ûe masz pamiëê od np.  $50000 to
nie  próbuj raczej nic wpisywaê pod $40000, bo moûe sië to úle skoïczyê!
(zawieszenie i te sprawy...)

 Jeôli  chcesz  zassemblerowaê  swojego  sourca pod adres absolutny (pod
konkretny adres) to na poczâtku wstawiasz:

        å2org     adres
        load    adreså0

 Przy czym å2"adres"å0 jest tym adresem, np.  $50000, ale unikaj absolutnych
adresów!!!  (dobra rada!)

                         å1* - * - * - * - * - *å0

 Co do ksiâûek o assemblerze to jest taka...  zwie sië:

 Motorola 68000, lista rozkazów procesora

 Napisaî jâ   chyba   Kostrzyïski,  czy  jakoô  tak,  juû  nie  pamiëtam
dokîadnie!   (sorry!)  Sâ  tam  wszystkie  komendy itd, ale nie jest (ta
ksiâûka)  konieczna.   Wiëc  jeôli  nie  znajdziesz  jej  nigdzie to nie
rozpaczaj.   Zresztâ  zamiast  ksiâûki bëdziesz miaî moje "Lekcje", wiëc
zamiast do ksiâûki bëdziesz mógî zerknâê tutaj jeôli coô zapomniesz.

 Co  do  mapy  pamiëci  to...   wszystko to to tylko gówna!  Wszystko co
potrzebne  masz  w  Trashu (komenda "=c"), pokaze ci on spis komórek!  A
jak chodzi ci o coô konkretnego to robisz:

å2=c $dffå1xxxå0

å1xxxå2 -å0 adres komórki, o którâ ci chodzi! np. 080 (cop1)

 Wprawdzie  bëdzie  po angielsko-assemblerowemu, ale to nic!  Na razie i
tak  nie  zbyt  ci  sië  to przyda, a jak bëdzie coô trzeba to sam ci to
wytîumaczë.

 Jeôli  jesteô w stanie to skombinuj sobie teû Iffmaster'a, bo to oprócz
assemblera   najbardziej  potrzebna  rzecz  dla  kodera  (nawet  mi  sië
zrymowaîo).
                         å1* - * - * - * - * - *å0


 Jak  juû  pisaîem  wczeôniej  (Lekcja  1)  bajt to zakres od $00 do $ff
(dziesiëtnie od 0 do 255)!

 Rozpisaê to moûna tak (na dwójkowy)

 å2%00000000 å1-å2 %11111111å0

 Gdzie kaûda cyferka to bit (najmniejsza jednostka, np.  1pixel!)


  å2%11111111å0

 jak  widaê  jest  8  jedynek, a to to samo co $ff, a to to samo co 255!
Pierwsza od prawej to bit zerowy (bit0), druga od prawej do bit pierwszy
(bit1),  i  tak  dalej.   W  tym  przypadku pierwsze cztery od prawej to
mîodsze bity, a cztery od lewej to starsze bity!

  å2$ffffffffå0

 A w tym przypakdku pierwsze cztery od prawej to mîodsze sîowo, a cztery
od lewej to starsze sîowo.  Dlatego, ûe to co masz wyûej to dîugie sîowo
(max.  jednostka operacyjna).
                         å1* - * - * - * - * - *å0

 Jak  sprawdziê  czy  zostaî  naciôniëty  lewy przycisk myszy?!  To jest
banalnie  proste,  ale  do  tego celu musimy poznaê dwie nowe instrukcje
(komendy!).

 å2btstå1 -å0 testowanie bitu! (bitu!!!)

przykîad:

        å2btst    #2,d0å0

 czyli testuje, czy bit2 w d0, jest zapalony (1), czy zgaszony (0).

å2%...100å0  <- tam gdzie jest 1 to jest bit2, tu akurat jest zapalony (1).

 Drugâ komendâ jest:

 å2b..å0          - skok, ale...

 å2bneå0   - skok jeôli "NIE"
 å2beqå0   - skok jeôli "TAK"
przykîad:

        å2beq     chujå0    ; jeôli wynik poprzedniej operacji byî
                        ; pozytywny to skacze do etykiety "chuj",
                        ; jeôli zaô byî negatywny to omija tâ
                        ; instrukcjë i wykonuje to co jest za niâ!


Source:
;---------------
å1S:å0
     å2btst    #6,$bfe001å0      ; testuje 6 bit komórki $bfe001
                             ; 6 bit komórki tej odpowiada za lewy myszy!!!
     å2bne     Så0               ; jeôli nie naciôniëty to skocz do etykiety S:
     å2rtså0                     ; rts = wyjdz z programu
                             ; oczywiôcie komputer tu trafi jeôli
                             ; naciôniesz lewy myszy, bo wtedy test
                             ; bëdzie pozytywny i ominie on komendë bne!
End:
;---------------


 Jak sprawdziê prawy myszy?!  To jest tak samo proste!


Source:
;---------------
å1S:å0
     å2btst    #10,$dff016
     bne     S
     rtså0

End:
;---------------

 10 bit komórki $dff016 odpowiada za prawy myszy!  Reszta jak przy lewym
myszy (objaônienia komend, itd, itp!)

å1------------------------------------------------------------------------å0





 I  to  juû  koniec  lekcji  numer  2.   Standardowo:   Jeôli czegoô nie
zrozumiaîeô  to  przeczytaj  ten  artykuî jeszcze raz!!!  Po tej lekcji,
przy  odrobinie  wysiîku,  jesteô  w  stanie  zrobiê  program...   hm...
å2wait_for_both_mouse_buttonså0,   czyli   oczekujâcy   na  naciôniëcie  obu
klawiszy mychy.  Postaraj sië i potraktuj to jako pracë domowâ.

                                                 å2Ranger/Ladybird Designå0