RETRO KUTAK – tehnologija prošlih decenijaProgramiranje

C64 Asembler – Lekcija 2

C64 Asembler Lekcija 2 donosi detaljno objašnjenje osnovnih registara mikroprocesora 6510 koji pokreće Commodore 64 računar, uključujući A (akumulator), X i Y (pomoćni registri), kao i PC (programski brojač), SP (pokazivač steka) i P (registar statusa). Lekcija takođe pokriva podešavanje memorijskog prostora za programiranje — preporučeno područje je od $1000 do $8000 — kao i kako se koriste pseudo naredbe poput `*=$1000` za označavanje početka programa.Kroz primere naredbi LDA, STA i RTS, učenici uče kako da učitaju vrednosti u registre i sačuvaju ih na određenim memorijskim adresama, kao i kako da izvrše osnovni program za sinhronizaciju boje okvira sa bojom pozadine. Poređenje sa BASIC kodom ukazuje na kompaktnost i efikasnost asemblerskog jezika. Konkretno, isti program u asembleru zauzima samo 7 bajtova u odnosu na 38 bajtova u BASIC-u.

Ova lekcija je deo serijala o programiranju u asembler jeziku za C64 i predstavlja temelj za razumevanje niskonivovske kontrole računara. Tekst je prilagođen početnicima, uz poređenja sa BASIC jezikom i praktične primere.

Ključne fraze: asembler C64 registri, LDA naredba C64, STA u asembleru, Commodore 64 memorija, programiranje u asembleru Srbija, lekcija asembler 6510, razlika između BASIC i asembler programa, RTS C64, programiranje boje okvira C64, turbo asembler uputstvo.

Ova lekcija o programiranju u asembler jeziku na Commodore 64 optimizovana je za korisnike iz Srbije, Hrvatske, Bosne i Hercegovine i Crne Gore. Sadrži objašnjenja registrâ, memorijske organizacije i osnovnih naredbi kao što su LDA i STA u Turbo Assembleru, uz upoređenja sa BASIC programima. Ključne fraze uključuju C64 asembler, Commodore 64 tutorijal, Turbo Assembler Srbija i retro programiranje.

lekcija 1

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.

 

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

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