RETRO KUTAK – tehnologija prošlih decenija

C64 ASEMBLER – LEKCIJA 6

Ova lekcija o C64 asembleru obuhvata sve instrukcije 6510 procesora (LDA, STA, TAX, ADC, SBC, JMP, JSR i dr.), njihovo dejstvo na N, Z, C, V i ostale bitove registra procesora, kao i detaljna objašnjenja rada sa stekom, logičkim i aritmetičkim operacijama. Pored instrukcija date su i memorijske adrese za tastaturu, ekransku i kolor memoriju, SID čip (zvuk), VIC-II (grafiku i sprajtove). Tekst je vodič za učenje programiranja na Commodore 64 i praktičnu primenu asemblera u pisanju igara i aplikacija.

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.

  • 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

LokacijaOpisVrednosti
197 / $C5Očitavanje tastature u zavisnosti od pretisnutog tasterasamo za čitanje

Tekstualni mod

LokacijaOpisVrednosti
1024-2023 / $400-$7E7Ekranska memorija (1000 bajta)0-255 / $0-$FF
55296-56295 / $D800-$DBE7Kolor memorija (1000 bajta)0-15 / $0-$F
53280 / $D020Boja okvira0-15 / $0-$F
53281 / $D021Boja pozadine0-15 / $0-$F

Zvuk

LokacijaOpisVrednosti
54272 / $D400Niži bajt visine tona (kanal 1)0-255 / $0-$FF
54273 / $D401Viši bajt visine tona (kanal 1)0-255 / $0-$FF
54276 / $D404Oblik zvuka (kanal 1)17,33,65,129 / $11,$21,$41,$81
54278 / $D406Stalan zvuk i glasnost (kanal 1)0-255 / $0-$FF (npr. 240/$F0)
54279 / $D407Niži bajt visine tona (kanal 2)0-255 / $0-$FF
54296 / $D418Jačina zvuka za sva tri kanala0-15 / $0-$F

(Tabela za zvuk je skraćena radi preglednosti, kompletnu listu možete videti u originalnom tekstu)

Sprajtovi

LokacijaOpisVrednosti
2040-2047 / $7F8-$7FFOdređivanje bloka za 8 sprajtova13-15, 187-191...
$D000, $D002, ...X koordinata za sprajtove 0-70-255 / $0-$FF
$D001, $D003, ...Y koordinata za sprajtove 0-70-255 / $0-$FF
53269 / $D015Uključivanje sprajta (bit po sprajtu)0-255 / $0-$FF
53276 / $D01CUključivanje multikolor sprajta0-255 / $0-$FF
53287-53295 / $D027-$D02FBoje za 8 sprajtova0-15 / $0-$F

(Tabela za sprajtove je skraćena radi preglednosti)

Grafika visoke i multikolor rezolucije

LokacijaOpisVrednosti
53265 / $D011Uključivanje grafike visoke rezolucije59 / $3B
53270 / $D016Uključivanje multikolor rezolucije23 / $17
53272 / $D018Određivanje memorijske lokacije za grafiku28 / $1C
8192-16191 / $2000-$3F3FMemorija za grafiku (8000 bajta)0-255 / $0-$FF

Ostalo

 

 

LokacijaOpisVrednosti
43/44 ($2B/$2C)Niži/viši bajt početka BASIC programa0-255 / $0-$FF
45/46 ($2D/$2E)Niži/viši bajt kraja BASIC programa0-255 / $0-$FF
56320 / $DC00Očitavanje džojstika u portu 1samo za čitanje
56321 / $DC01Očitavanje džojstika u portu 2samo za čitanje
65490 / $FFD2Podprogram za prikaz PETSCII koda iz A registra0-255 / $0-$FF
2-6 /$02-$06 Raspoložive lokacije na nultoj strani0-255 / $0-$FF
251-254/$FB-$FESlobodne lokacije na nultoj strani0-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!

Nebojsa Kostić

Rođen 1976. Bavim se računarima I it poslovima više od 20 godina..Osnivač TechFokusa i tehnološki novinar sa preko 20 godina iskustva. Specijalizovan je za hardver, retro računare i tržišne analize.

Nebojsa Kostić has 423 posts and counting. See all posts by Nebojsa Kostić

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *