C64 Asembler – Lekcija 2
Audio recencija teksta
Dobrodošli
Dobrodošli u lekciju 2, male škole programiranja u asembleru na Commodore 64. Danas počinjemo sa prvim korakom učenja asemblerskog programskog kompajlera. Posle dužeg razmišljanja kako da uradimo ovo na što je moguće lakši i informativniji način, odlučili smo da idemo od najbitnijih asemblerskih kodova (naredbi) upoređujući iste sa ekvivalentnim naredbama bejzika. Pa da krenemo sa prvim korakom putovanja od 10000 kilometra.
Napomene, saveti i objašnjenja
Programski registri (hardverske promenljive mikroprocesora)
Za početak da se upoznamo sa registrima (promenljivima) kojim operiše mikroprocesor 6510 (procesor koji koristi C64) i koje možemo koristiti u asembleru. Konstruktori centralnog procesora (mozga računara) nisu bili baš izdašni sa istima, pogotovo u poređenju sa nekim drugim mikroprocesorima poput Z80. Štaviše, korisnicima je direktno raspoloživo samo tri osmobitna registra:
- A – glavni registar (koji se još naziva i akumulator)
- X i Y – pomoćni registri
Napomena: Nedostatak registra nadomešta se korišćenjem steka i slobodne memorije.
Pošto se memorijska lokacija proteže od 0 do 65535 (odnosno od 0 do $FFFF
heksadecimalno) odmah vidite problem. Naime, ne postoji šesnaestobitni programski registar kod 6510 mikroprocesora dostupan korisniku koji može učitati šesnaestobitnu vrednost. Zato su konstruktori smislili načine kako da ovo izvedu putem različitih vrstama indeksiranja registra, ali o tom ćemo kasnije.
Za sada da se upoznamo i sa drugim registrima koji nisu direktno raspoloživi korisnicima:
- PC – programski brojač: Jedini šesnaestobitni registar, direktno dostupan računaru. On sadrži vrednost memorijske adrese toka programa koji se trenutno izvršava. Postoji indirektni način kontrolisanja ovog registra od strane korisnika putem naredbi za programski skok.
- SP – pokazivač steka: Ovaj registar je osmobitni i služi za privemeno smeštanje adresa i podataka. Podaci steka se nalaze od memorijske adrese 256 (
$100
) do 511 ($1FF
). - P – registar stanja mikroprocesora: Veoma važan osmobitni registar. Od 8 bita koriste se 7 i svaki od njih ima važnu ulogu u radu sa uslovima, skokovima i proverama.
- bit 0-„C“ – indikator prenosa
- bit 1-„Z“ – indikator nule
- bit 2-„I“ – indikator onemogućavanja programskog prekida
- bit 3-„D“ – indikator rada u decimalnom sistemu
- bit 4-„B“ – indikator BRK softverskog prekida
- bit 5 – ne koristi se
- bit 6-„V“ – indikator premašaja rezultata
- bit 7-„N“ – indikator negativnog predznaka
- DDR – registar smera podataka i DR – Registar prenosa podataka: Koriste se za kontrolu memorije i rada kasetofona i za sada nam nisu posebno bitni.
Memorija slobodna za unos programa
Za početak treba odabrati u kom delu memorije ćemo kompajlirati/prevesti kod a da ne dođe do preklapanja. Za početnike koji rade sa turbo asemblerom preporučujemo da to bude od adrese $1000
(4096) do adrese $8000
(32768), koji opseg je slobodan za korisnika.
Naredbe (kodovi) asemblera
Najzad stigosmo i do glavne stvari. Kao što rekosmo, idemo korak po korak. Prvo ćemo učitati željeni asemblerski program u C64 ili emulator. Ako koristite turbo asembler verzije 6.0, posle učitavanja morate otkucati SYS 9*4096
ili SYS 36864
.
Zatim moramo da unesemo od koje adrese želimo da smestimo program koji će se kompajlirati/prevesti. Najbolje je krenuti od memorijske adrese $1000
(4096 decimalno).
Krećemo sa asemblerskim programom
Pseudo naredba koja kompajleru kaže odakle da kompajlira izvorni kod je oznaka *=
adresa.
Dakle, otkucaćemo: *=$1000
Kompajliranje/prevođenje počinje od adrese $1000
(4096).
Naučimo prvu naredbu: LD
LDregistar #osmobitni broj ili adresa
(osmobitna ili šesnaestobitna) – učitavanje podataka u željeni registar (A, X i Y).
Otkucajmo sledeće: LDA #$05
- Oznaka
#
– označava da želimo da unesemo broj, a ne adresu sa koje će se uzeti neki broj. - Oznaka
$
– označava da unosimo heksadecimalni broj.
Ova naredba utiče na Z i N registre stanja procesora.
Ekvivalentna bejzik naredba je: LET A=5
(ili samo A=5
).
Naredba za skladištenje: ST
STregistar adresa
– skladištenje podataka iz registra (A, X i Y) u datoj adresi memorije računara.
Kucamo: STA $0400
Ekranska memorija kreće od $400
(1024) do $7E7
(2023) ukupno 1000 bajtova. Kada budemo kompajlirali i pokrenuli ovaj program, na samom početku ekrana ispratiće se slovo „E“ jer broj 5 odgovara ekranskom kodu ovog slova.
Ekvivalentna bejzik naredba je: POKE 1024,A
.
Završetak programa: RTS
RTS
– izlaz iz izvršavanja mašinskog programa i povratak u bejzik interpreter ili povratak iz mašinskog podprograma.
Ekvivalentna bejzik naredba je: END
(u našem slučaju) ili RETURN
(kada koristimo podprograme).
Primer: Boja okvira i pozadine
Sada da napravimo asemblerski program za čitanje iz jedne memorijske adrese i prebacivanje očitane vrednosti na drugu memorijsku adresu.
*=$1000
LDA $D021
– U akumulator A se smešta očitana osmobitna vrednost iz memorijske adrese$D021
(53281) – boja pozadine ekrana.STA $D020
– Vrednost iz akumulatora A stavljamo u memorijsku lokaciju$D020
(53280) – boja okvira ekrana.RTS
U ovom primeru čitamo sadržaj boje pozadine ekrana i tu vrednost stavljamo u boju okvira, čime smo dobili da nam boja okvira postane ista kao i boja pozadine.
Ekvivalentni bejzik program za ovaj primer je:
10 A=PEEK(53281)
20 POKE 53280,A
30 END
Dužina asemblerskog programa je 7 bajta, dok je BASIC program 38 bajta, što znači da je asemblerski kod 5,4 puta kraći.
Zaključak
Završavamo sa današnjom lekcijom. Iako nismo došli do primera koji će pokazati superiornost u brzini izvršavanja asemblerskog programa nad bejzikom, videli smo koliko je kraći asemblerski kod u odnosu na bejzik program. Vidimo se u asembler lekciji 3. Puno pozdrava.