C64 Asembler (C64 Assembly) – Lekcija 3
C64 Assembly
Dobrodošli u lekciju 3, male škole programiranja u asembleru na Commodore 64. Za danas ćemo preći još nekoliko važnih komandi, dati primere i bejzik ekvivalente.
Napomene, saveti i objašnjenja
Svi kodovi koje se unose u turbo asembleru se pišu malim slovima. U našim lekcijama pišemo ih velikim radi jasnijeg uvida u napisani kod (primer malo slovo l (L) je veoma slično broju 1 itd.).
Naredbe za prenos sadržaja između registra
Često nam je potrebno u toku asemblerskog programiranja da prenesemo (kopiramo) vrednosti iz jednog u drugi registar. Za to nam služe sledeće naredbe:
- TAX – prenosi vrednost iz akumulatora A u registar X
- TXA – prenosi vrednost iz registra X u akumulator A
- TAY – prenosi vrednost iz akumulatora A u registar Y
- TYA – prenosi vrednost iz registra Y u akumulator A
- TSX – prenosi vrednost pokazivač steka u registar X
- TXS – prenosi vrednost X u pokazivač steka
Druge kombinacije prenosa iz registar u registar, osim ovih datih, nisu dozvoljene. Naredbe za premeštanje utiču na Z i N bitove registra stanja procesora.
Ekvivalentni bejzik naredbi su:
X=A
A=X
Y=A
A=Y
Zadnje dve naredbe nemaju bejzik ekvivalente.
Primer: Učitajmo profi asembler i startujemo sa SYS 36864
. Unesimo sledeći kod:
*= $1000 ; Kompajliranje počinje od adrese $1000 (4096)
LDA #$01 ; Smeštamo vrednost 1 u akumulator
TAX ; Prenosimo vrednost akumulatora A u registar X
TAY ; Prenosimo vrednost akumulatora A u registar Y
STA $0400 ; Smeštamo vrednost akumulatora u ekransku memoriju $400 (1024) (ekranski kod slova "a")
STX $0401 ; Smeštamo vrednost registra X u ekransku memoriju $401 (1025) (ekranski kod slova "a")
STY $0402 ; Smeštamo vrednost registra Y u ekransku memoriju $402 (1026) (ekranski kod slova "a")
RTS ; Kraj programa
Kompajlirajmo ovaj program sa ←3
i startujmo ga pritiskom na taster „s“.
Startovanjem mašinskog programa dobićemo ispisana tri mala slova „a“ jedno do drugog, što dokazuje da su sva tri registra iste vrednosti i da je transfer vrednosti iz akumulatora u druga dva registra uspešno izveden.
Ekvivalentni bejzik program je:
10 A=1
20 X=A
30 Y=A
40 POKE 1024,A
50 POKE 1025,X
60 POKE 1026,Y
70 END
Naredbe steka
Kao što smo kazali da bismo proširili raspon registra, imamo mogućnost da vrednost istih prenesemo na tzv. stek i da te vrednosti posle toga vratimo na dalje korišćenje.
Naredbe su:
- PHA – smesti vrednost akumulatora na stek i uvećaj pokazatelj za jedan u memorijskoj lokaciji steka
- PLA – vrati vrednost sa steka u akumulator i umanji pokazatelj za jedan u memorijskoj lokaciji steka.
- PHP – smesti vrednost registra stanja procesora na stek i uvećaj pokazatelj memorije steka za jedan
- PLP – vrati vrednost sa steka u registar stanja procesora i umanji pokazatelj memorije steka za jedan
Registri stanja procesora Z i N se menjaju u zavisnosti od vrednosti koja se vraća u akumulator.
Napomena: Podaci se smeštaju po sistemu ko zadnji uđe, prvi izlazi. Ne postoje asemblerske naredbe za stavljanje vrednost registra X i Y direktno na stek. Nema bejzik ekvivalenta.
Primer:
*= $1000 ; Krećemo od adrese $1000
LDA #"o" ; Upisujemo u akumulator A kodnu vrednost slova "o". Turbo asembler dozvoljava unos slova među navodnicima koje se odmah konvertuje u ekransku kodnu vrednost istog pre unosa u registar.
PHA ; Vrednost akumulatora A se smešta na stek.
LDY #"n" ; Punimo registar Y kodnom vrednošću slova "n".
TYA ; Prebacujemo vrednost regista iz registra Y u akumulator A. To radimo jer se samo vrednost akumulatora može staviti na stek.
PHA ; Vrednost akumulatora A koja je sada jednaka vrednosti Y se smešta na stek.
LDX #"b" ; Punimo registar X kodnom vrednošću slova "b".
TXA ; Prebacujemo vrednost regista iz registra X u akumulator A. To radimo, kao što smo već rekli, jer se samo vrednost akumulatora može staviti na stek.
PHA ; Vrednost akumulatora A koja je sada jednaka vrednosti X se smešta na stek.
LDA #"p" ; Punimo akumulator A kodnom vrednošću slova "p".
STA $0400 ; Stavljamo vrednost akumulatora A u ekransku memoriju (prvi red, prva kolona).
LDX #"r" ; Punimo registrar X kodnom vrednošću slova "r".
STX $0401 ; Stavljamo vrednost registra X u ekransku memoriju (prvi red, druga kolona).
LDY #"o" ; Punimo registrar Y kodnom vrednošću slova "o".
STY $0402 ; Stavljamo vrednost registra Y u ekransku memoriju (prvi red, treća kolona).
PLA ; Vraćamo sa steka vrednost koja je zadnja (treća) ušla, u našem slučaju to je kodna vrednost slova "b".
STA $0403 ; Stavljamo vrednost akumulatora A u ekransku memoriju (prvi red, četvrta kolona).
PLA ; Vraćamo sa steka vrednost koja je druga ušla, u našem slučaju to je kodna vrednost slova "n".
TAY ; Prebacujemo vrednost akumulatora A u registar Y. To radimo, kao što smo rekli, jer se vrednost sa steka može vratiti samo u akumulator (takođe i u registar stanja procesora, ali to za sada nije bitno).
STY $0404 ; Stavljamo vrednost registra Y u ekransku memoriju (prvi red, peta kolona).
PLA ; Vraćamo sa steka vrednost koja je prva ušla, u našem slučaju to je kodna vrednost slova "o".
TAX ; Prebacujemo vrednost akumulatora A u registar X. To radimo, kao što smo rekli, jer se vrednost sa steka može vratiti samo u akumulator.
STX $0405 ; Stavljamo vrednost registra X u ekransku memoriju (prvi red, šesta kolona).
RTS ; Kraj programa
Prilikom startovanja programa ispisaće se reč „probno“. Obratite pažnju da su prva tri slova koja smo smestili na stek poslednja tri u reči i uneta su obrnutim redosledom. To je iz razloga kao što smo već kazali, kada nešto smeštamo na stek, prvi podatak koji uđe, poslednji izlazi (zadnji podatak koji uđe, prvi izlazi). Takođe, u ovom programu mogli smo sve ovo da izvedemo samo pomoću akumulatora A.
Kod programa premeštanja na stek nemamo ekvivalent u bejziku. Najbliže bi bio rad sa matricama, ali princip nije isti.
Naredbe za uvećanje i smanjenje vrednosti memorije i registra za jedan
- INC adresa – uvećava vrednost memorije na datoj adresi za jedan. Ovoj naredbi se može dodati i registar X koji će uvećati lokaciju adrese za vrednost X.
- INX – uvećanje vrednosti koja se nalazi u registru X za 1.
- INY – uvećanje vrednosti koja se nalazi u registru Y za 1.
- DEC adresa – umanjuje vrednost memorije na datoj adresi za jedan. Ovoj naredbi se takođe može dodati i registar X koji će uvećati lokaciju adrese za vrednost X.
- DEX – umanjuje se vrednost koja se nalazi u registru X za 1.
- DEY – umanjuje se vrednost koja se nalazi u registru Y za 1.
Ove naredbe utiču na registre stanja procesora Z i N.
Napomena: U slučaju da se prilikom povećanja pređe vrednost nekog registra od 255 (FF), vrednost tog registra postaje 0, a ukoliko se prilikom smanjenja smanji više od 0, vrednost postaje 255 (FF) (kružni tok uvećanja/smanjenja vrednosti registra).
Bejzik ekvivalenti su:
M=M+1 (M-vrednost u memorijskoj adresi)
IF M>255 THEN M=0
X=X+1
IF X>255 THEN X=0
Y=Y+1
IF Y>255 THEN Y=0
M=M-1 (M-vrednost u memorijskoj adresi)
IF M<0 THEN M=255
X=X-1
IF X<0 THEN X=255
Y=Y-1
IF Y<0 THEN Y=255
Primer:
*=$1000 ; Kompajliranje/smeštaj našeg programa počinje od $1000 (4096)
LDX #1 ; Unosimo vrednost 1 u registar X
INC $D020 ; Uvećavanje vrednosti za 1 na memorijskoj adresi $D020 (53280)-boja okvira. Boja okvira će poprimiti boju uvećane vrednosti za jedan u odnosu na postojeću (napr. ako je boja okvira crna 0, uvećana za 1 daje belu boju).
INC $D020,X ; Uvećanje vrednosti za 1 na memorijskoj adresi D021 (53281) - boja pozadine (memorijska adresa $D020 (53280) je uvećana za vrednost registra X (1), tako da je vrednost memorijske adrese gde se vrši uvećanje $D020+1). Boja pozadine će poprimiti boju uvećane vrednosti za jedan u odnosu na postojeću.
RTS ; Kraj programa
Startovanjem primera boja okvira i pozadine će se promeniti uvećanjem postojeće vrednosti u njima za 1.
Ekvivalent bejzik program je:
10 X=1
20 M=PEEK(53280)-240
30 M=M+1
40 POKE 53280,M
50 M=PEEK(53280)+X-240
60 M=M+1
70 POKE 53280+X,M
80 END
Da uporedimo veličinu mašinskog koda ovog programa sa bejzik ekvivalentom:
- mašinac:
$1000
(4096) –$1008
(4104), ukupno 9 bajta - bejzik:
$0803
(2051) –$0867
(2151), ukupno 100 bajta
Kao što vidite, memorijska razlika zauzeća je zaista drastična u korist mašinca.
Vidimo se u asembler lekciji 4. Puno pozdrava.
Poslušajte audio rezime ove lekcije: