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.
- LDA Load Accumulator – učitavanje u akumulator A (N,Z)
- LDX Load X Register – učitavanje u registar X (N,Z)
- LDY Load Y Register – učitavanje u registar Y (N,Z)
- STA Store Accumulator – smeštanje vrednosti iz akumlatora A u memorijsku lokaciju
- STX Store X Register – smeštanje vrednosti iz registra X u memorijsku lokaciju
- STY Store 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.
- TAX Transfer accumulator to X – premesti/kopiraj vrednost akumulatora u registar X (N,Z)
- TAY Transfer accumulator to Y – premesti/kopiraj vrednost akumulatora u registar Y (N,Z)
- TXA Transfer X to accumulator – premesti/kopiraj vrednost registra X u akumulator (N,Z)
- TYA Transfer 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.
- TSX Transfer stack pointer to X – premeseti/kopiraj vrednost pokazivača steka u registar X (N,Z)
- TXS Transfer X to stack pointer – premeseti/kopiraj vrednost registra X u pokazivač steka
- PHA Push accumulator on stack – premeseti/kopiraj vrednost akumulatora na stek
- PLA Pull accumulator from stack – vrati vrednost sa steka u akumulator (N,Z)
- PHP Push processor status on stack – premeseti/kopiraj vrednost registra procesora na stek
- PLP Pull 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).
- AND Logical AND – logičko I (N,Z)
- ORA Logical Inclusive OR – logičko ILI (N,Z)
- EOR Exclusive OR – logičko isključivo ILI (N,Z)
- BIT Bit 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.
- ADC Add with Carry – saberi vrednost akumulatora, memorije i C-bita (N,V,Z,C)
- SBC Subtract 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.
- CMP Compare accumulator – uporedi sadržaj akumulatora sa brojem ili vrednosti memorije (N,Z,C)
- CPX Compare X register – uporedi sadržaj registra X sa brojem ili vrednosti memorije (N,Z,C)
- CPY Compare 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.
- INC Increment a memory location – povećanje vrednosti date memorijske lokacije za jedan (N,Z)
- INX Increment the X register – povećanje vrednosti registra X za jedan (N,Z)
- INY Increment the Y register – povećanje vrednosti registra Y za jedan (N,Z)
- DEC Decrement a memory location – smanjenje vrednosti date memorijske lokacije za jedan (N,Z)
- DEX Decrement the X register – smanjenje vrednosti registra X za jedan (N,Z)
- DEY Decrement 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.
- ASL Arithmetic Shift Left – Aritmetičko pomeranje bitova ulevo (N,Z,C)
- LSR Logical Shift Right – Logičko pomeranje bitova udesno (N,Z,C)
- ROL Rotate Left – Rotacija bitova u levo (N,Z,C)
- ROR Rotate 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.
- JMP Jump to another location – Skok na željenu memorijsku adresu (ekvivalent GOTO).
- JSR Jump to a subroutine – Odlazak na podprogram (ekvivalent GOSUB). Pre skoka, adresa povratka se smešta na stek.
- RTS Return from subroutine – Povratak iz podprograma. Vraća izvršavanje na instrukciju nakon JSR poziva.
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.
- BCC Branch if carry flag clear – Skok ako je C-bit resetovan
- BCS Branch if carry flag set – Skok ako je C-bit setovan
- BEQ Branch if zero flag set – Skok ako je Z-bit setovan
- BNE Branch if zero flag clear – Skok ako je Z-bit resetovan
- BMI Branch if negative flag set – Skok ako je N-bit setovan
- BPL Branch if negative flag clear – Skok ako je N-bit resetovan
- BVS Branch if overflow flag set – Skok ako je V-bit setovan
- BVC Branch 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.
- SEC Set carry flag – setuj C-bit (prenosni bit) (C)
- CLC Clear carry flag – resetuj C-bit (prenosni bit) (C)
- SED Set decimal mode flag – setuj D-bit (rad sa decimalnim sistemom) (D)
- CLD Clear decimal mode flag – resetuj D-bit (rad sa heksadecimalnim sistemom) (D)
- SEI Set interrupt disable flag – setuj I-bit (onemogućavanje programskog prekida) (I)
- CLI Clear interrupt disable flag – resetuj I-bit (omogućavanje programskog prekida) (I)
- CLV Clear 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.
- BRK Force an interrupt – aktiviranje programskog prekida (B)
- NOP No Operation – ne izvršava se nijedna operacija
- RTI Return 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!