C64 ASEMBLER – LEKCIJA 6
C64 ASEMBLER (C64 ASSEMBLY) – LEKCIJA 6
Dobrodošli u lekciju 6 male škole programiranja u asembleru na Commodore 64.
Napomene, saveti i objašnjenja
Danas ćemo dati spisak svih asemblerskih naredbi 6510 mikroprocesora sa njihovim uticajima na bitove registra procesora. Takođe, uz svaku naredbu daćemo i engleski opis (iz koga su izvučene skraćenice naziva asemblerskih naredbi) i uticaj na registar procesora (ukoliko stoji oznaka „Svi“ naredba ima uticaj na sve bitove registra procesora). Na kraju lekcije ćemo dati i spisak adresa bitnih memorijskih lokacija.
Operacije učitavanja/smeštanja
Ove instrukcije prenose jedan bajt između memorije i jednog od registara. Operacije učitavanja setuju N-bit (negativni predznak) i Z-bit (stanje u akumulatoru ili u registrima je 0) u zavisnosti od prenete vrednosti. Smeštanja u memoriju ne utiču na bitove registra procesora.
LDALoad Accumulator – učitavanje u akumulator A (N,Z)LDXLoad X Register – učitavanje u registar X (N,Z)LDYLoad Y Register – učitavanje u registar Y (N,Z)STAStore Accumulator – smeštanje vrednosti iz akumlatora A u memorijsku lokacijuSTXStore X Register – smeštanje vrednosti iz registra X u memorijsku lokacijuSTYStore Y Register – smeštanje vrednosti iz registra Y u memorijsku lokaciju
Prenos sadržine između akumulatora i registara
Sadržaj X i Y registara može se premestiti u ili iz akumulatora, postavljajući negativni predznak (N) i nulti (Z) bitove u zavisnosti od vrednosti prenosa.
TAXTransfer accumulator to X – premesti/kopiraj vrednost akumulatora u registar X (N,Z)TAYTransfer accumulator to Y – premesti/kopiraj vrednost akumulatora u registar Y (N,Z)TXATransfer X to accumulator – premesti/kopiraj vrednost registra X u akumulator (N,Z)TYATransfer Y to accumulator – premesti/kopiraj vrednost registra Y u akumulator (N,Z)
Operacije steka
Mikroprocesor C64 (6510) podržava stek (mesto odlaganja bajtova) od 256 bajtova koji se nalazi između memorijskih lokacija $0100 i $01FF. Poseban 8-bitni registar (S), koristi se za praćenje sledećeg slobodnog bajta prostora na steku. Ubacivanje bajta na stek dovodi do toga da se vrednost čuva na trenutno slobodnoj lokaciji i smanjuje pokazivač steka za jedan. Operacije „pull“ (prevlačenje) obrće ovaj postupak, vrednost sa steka prelazi u akumulator (ili u retkim slučajevima u registar procesora) i pokazivač steka se uvećava za jedan.
Registru steka se može direktno pristupiti samo prenosom njegove vrednosti u ili iz X registra. Njegova vrednost se automatski menja instrukcijama „push/pull“, pozivima potprograma i povraćajima, prekidima i povratkom iz programskog prekida.
Ulaz podataka na stek i izlaz podataka sa steka se sprovodi po principu zadnji ušao/prvi izlazi.
TSXTransfer stack pointer to X – premeseti/kopiraj vrednost pokazivača steka u registar X (N,Z)TXSTransfer X to stack pointer – premeseti/kopiraj vrednost registra X u pokazivač stekaPHAPush accumulator on stack – premeseti/kopiraj vrednost akumulatora na stekPLAPull accumulator from stack – vrati vrednost sa steka u akumulator (N,Z)PHPPush processor status on stack – premeseti/kopiraj vrednost registra procesora na stekPLPPull processor status from stack – vrati vrednost sa steka u registar prosesa (Svi)
Logičke naredbe
Ove instrukcije izvršavaju logičke operacije nad sadržajem akumulatora sa drugom vrednošću koja se nalazi u memoriji. Naredba BIT izvršava logičko I da bi proverilo stanje 6 i 7 bita u datoj memorijskoj lokaciji i u zavisnosti od njihovih stanja postavlja bitove registre procesora (bit 6 u V, a bit 7 u N-bit registra procesora).
ANDLogical AND – logičko I (N,Z)ORALogical Inclusive OR – logičko ILI (N,Z)EORExclusive OR – logičko isključivo ILI (N,Z)BITBit Test – testiranje 6 i 7 bita akumulatora ili memorije (N,V,Z)
Aritmetika
Aritmetičke operacije koje vrše sabiranje i oduzimanje sadržaja akumulatora.
ADCAdd with Carry – saberi vrednost akumulatora, memorije i C-bita (N,V,Z,C)SBCSubtract with Carry – oduzmi od akumulatora, vrednost memorije i 1-C-bit (N,V,Z,C)
Operacije poređenja
Operacije poređenja omogućavaju poređenje akumulatora i X ili Y registra sa vrednostima memorije.
CMPCompare accumulator – uporedi sadržaj akumulatora sa brojem ili vrednosti memorije (N,Z,C)CPXCompare X register – uporedi sadržaj registra X sa brojem ili vrednosti memorije (N,Z,C)CPYCompare Y register – uporedi sadržaj registra Y sa brojem ili vrednosti memorije (N,Z,C)
Povećanja i smanjenja
Ovo su naredbe koje vrše povećavanje ili smanjivanje vrednosti na datoj memorijskoj lokaciji ili jednog od X ili Y registara za jedan, setujući negativni predznak N-bit i nulti Z-bit zavisno od rezultata.
INCIncrement a memory location – povećanje vrednosti date memorijske lokacije za jedan (N,Z)INXIncrement the X register – povećanje vrednosti registra X za jedan (N,Z)INYIncrement the Y register – povećanje vrednosti registra Y za jedan (N,Z)DECDecrement a memory location – smanjenje vrednosti date memorijske lokacije za jedan (N,Z)DEXDecrement the X register – smanjenje vrednosti registra X za jedan (N,Z)DEYDecrement the Y register – smanjenje vrednosti registra Y za jedan (N,Z)
Šiftovanja/pomeranje bitova
Naredbe za pomeranje pomeraju bitove unutar memorijske lokacije ili akumulatora za jednu poziciju bita levo ili desno. Instrukcije za rotiranje koriste sadržaj C-bita prenosa da popune praznu poziciju generisanu pomeranjem.
ASLArithmetic Shift Left – Aritmetičko pomeranje bitova ulevo (N,Z,C)LSRLogical Shift Right – Logičko pomeranje bitova udesno (N,Z,C)ROLRotate Left – Rotacija bitova u levo (N,Z,C)RORRotate Right – Rotacija bitova udesno (N,Z,C)
Bezuslovni skokovi i pozivi podprograma
Ove naredbe menjaju brojač programa (PC) što uzrokuje prekid normalnog sekvencijalnog izvršavanja. Ove naredbe ne utiču na stanje registra procesora.
JMPJump to another location – Skok na željenu memorijsku adresu (ekvivalentGOTO).JSRJump to a subroutine – Odlazak na podprogram (ekvivalentGOSUB). Pre skoka, adresa povratka se smešta na stek.RTSReturn from subroutine – Povratak iz podprograma. Vraća izvršavanje na instrukciju nakonJSRpoziva.
Granjanja/uslovni skokovi
Instrukcije grananja prekidaju normalan sekvencijalni tok izvršavanja programa promenom brojača programa ako je ispunjen određeni uslov. Svi uslovi se zasnivaju na ispitivanju jednog bita unutar statusa registra procesora.
BCCBranch if carry flag clear – Skok ako je C-bit resetovanBCSBranch if carry flag set – Skok ako je C-bit setovanBEQBranch if zero flag set – Skok ako je Z-bit setovanBNEBranch if zero flag clear – Skok ako je Z-bit resetovanBMIBranch if negative flag set – Skok ako je N-bit setovanBPLBranch if negative flag clear – Skok ako je N-bit resetovanBVSBranch if overflow flag set – Skok ako je V-bit setovanBVCBranch if overflow flag clear – Skok ako je V-bit resetovan
Napomena: Instrukcije za grananje koriste relativnu adresu. Ciljna instrukcija mora biti unutar opsega od -128 do +127 bajtova od trenutne lokacije.
Direktne promene stanja bitova registra procesora
Ove naredbe direktno utiču na promene stanja bitova u registru procesora.
SECSet carry flag – setuj C-bit (prenosni bit) (C)CLCClear carry flag – resetuj C-bit (prenosni bit) (C)SEDSet decimal mode flag – setuj D-bit (rad sa decimalnim sistemom) (D)CLDClear decimal mode flag – resetuj D-bit (rad sa heksadecimalnim sistemom) (D)SEISet interrupt disable flag – setuj I-bit (onemogućavanje programskog prekida) (I)CLIClear interrupt disable flag – resetuj I-bit (omogućavanje programskog prekida) (I)CLVClear overflow flag – resetuj V-bit (obriši bit prekoračenja) (V)
Sistemske funkcije
Ove naredbe se retko koriste ali su bitne za rad u pojedinim situacijama.
BRKForce an interrupt – aktiviranje programskog prekida (B)NOPNo Operation – ne izvršava se nijedna operacijaRTIReturn from Interrupt – povratak iz interaptskog podprograma (Svi)
Važne memorijske adrese
U ovoj lekciji takođe dajemo dopunjene važne memorijske adrese koje smo dali u lekciji 7 standardnog bejzika.
Očitavanje tastature
| Lokacija | Opis | Vrednosti |
|---|---|---|
197 / $C5 | Očitavanje tastature u zavisnosti od pretisnutog tastera | samo za čitanje |
Tekstualni mod
| Lokacija | Opis | Vrednosti |
|---|---|---|
1024-2023 / $400-$7E7 | Ekranska memorija (1000 bajta) | 0-255 / $0-$FF |
55296-56295 / $D800-$DBE7 | Kolor memorija (1000 bajta) | 0-15 / $0-$F |
53280 / $D020 | Boja okvira | 0-15 / $0-$F |
53281 / $D021 | Boja pozadine | 0-15 / $0-$F |
Zvuk
| Lokacija | Opis | Vrednosti |
|---|---|---|
54272 / $D400 | Niži bajt visine tona (kanal 1) | 0-255 / $0-$FF |
54273 / $D401 | Viši bajt visine tona (kanal 1) | 0-255 / $0-$FF |
54276 / $D404 | Oblik zvuka (kanal 1) | 17,33,65,129 / $11,$21,$41,$81 |
54278 / $D406 | Stalan zvuk i glasnost (kanal 1) | 0-255 / $0-$FF (npr. 240/$F0) |
54279 / $D407 | Niži bajt visine tona (kanal 2) | 0-255 / $0-$FF |
| … | … | … |
54296 / $D418 | Jačina zvuka za sva tri kanala | 0-15 / $0-$F |
(Tabela za zvuk je skraćena radi preglednosti, kompletnu listu možete videti u originalnom tekstu)
Sprajtovi
| Lokacija | Opis | Vrednosti |
|---|---|---|
2040-2047 / $7F8-$7FF | Određivanje bloka za 8 sprajtova | 13-15, 187-191... |
$D000, $D002, ... | X koordinata za sprajtove 0-7 | 0-255 / $0-$FF |
$D001, $D003, ... | Y koordinata za sprajtove 0-7 | 0-255 / $0-$FF |
53269 / $D015 | Uključivanje sprajta (bit po sprajtu) | 0-255 / $0-$FF |
53276 / $D01C | Uključivanje multikolor sprajta | 0-255 / $0-$FF |
53287-53295 / $D027-$D02F | Boje za 8 sprajtova | 0-15 / $0-$F |
(Tabela za sprajtove je skraćena radi preglednosti)
Grafika visoke i multikolor rezolucije
| Lokacija | Opis | Vrednosti |
|---|---|---|
53265 / $D011 | Uključivanje grafike visoke rezolucije | 59 / $3B |
53270 / $D016 | Uključivanje multikolor rezolucije | 23 / $17 |
53272 / $D018 | Određivanje memorijske lokacije za grafiku | 28 / $1C |
8192-16191 / $2000-$3F3F | Memorija za grafiku (8000 bajta) | 0-255 / $0-$FF |
Ostalo
| Lokacija | Opis | Vrednosti |
|---|---|---|
43/44 ($2B/$2C) | Niži/viši bajt početka BASIC programa | 0-255 / $0-$FF |
45/46 ($2D/$2E) | Niži/viši bajt kraja BASIC programa | 0-255 / $0-$FF |
56320 / $DC00 | Očitavanje džojstika u portu 1 | samo za čitanje |
56321 / $DC01 | Očitavanje džojstika u portu 2 | samo za čitanje |
65490 / $FFD2 | Podprogram za prikaz PETSCII koda iz A registra | 0-255 / $0-$FF |
2-6 /$02-$06 | Raspoložive lokacije na nultoj strani | 0-255 / $0-$FF |
251-254/$FB-$FE | Slobodne lokacije na nultoj strani | 0-255 / $0-$FF |
Obratite pažnju da neke memorijske lokacije imaju drugačije funkcije, zavisno u kom smo grafičkom modu. Takođe, kod uključivanja grafike visoke i multikolor rezolucije, kao i za određivanje memorijske lokacije za iste, uzeti su parametri koji se najčešće koriste, mada se vrednosti u tim memorijskim lokacijama mogu i drugačije definisati po želji programera.
U sledećoj lekciji daćemo kao primer jednu akcionu igru u asembleru/mašincu. Pomoću nje ćemo objasniti većinu asemblerskih naredbi koje smo prošli i takođe videti koje su prave mogućnosti asemblerskih programa.
Vidimo se u asembler lekciji 7.
Puno pozdrava!

