RETRO KUTAK – tehnologija prošlih decenija

C64 – CAKE 4

Tema: C64 – CAKE 4 (BASIC ↔ Asembler interakcija, POKE i SYS parametri)

Strukturisan prikaz originalnog tutorijala bez izmene teksta: unos podataka iz BASIC-a u mašinski kod pomoću POKE, prosleđivanje parametara preko SYS, primeri listinga i objašnjenja o adresiranju ekranske memorije.

Ključne reči: Commodore 64, C64, BASIC, 6502 asemblerski jezik, POKE, SYS, ekranska memorija, parametri, $1000, retro programiranje.

C64 – CAKE 4

Preslušaj recenzziu ovog teksta:

Dobrodošli u nove cake. Danas ćemo videti kako možemo unositi podatke iz bejzika u mašinac pomoću naredbe POKE kao i direktno putem parametra SYS naredbe koje dajemo u bejzik programskim linijama ili u direktnom načinu rada. Ovo je veoma bitno ako radimo sa kombinovanim programima bejzik/asembler. Da vidimo koje su nam mogućnosti:

1) Unos podataka u memoriju iz bejzika u asembler

Kao prvo za unos podataka iz bejzika u mašinac možemo kao što smo rekli koristiti naredbu POKE.
Pomoću nje unećemo neku vrednost u memoriju koja će se očitati iz mašinca i posle startovanja istog
dobićemo željeni rezultat izvršen brzinom mašinskog programa. Naravno moramo uvek voditi računa da
se memorijska lokacija bejzik programa ne poklopi sa mašinskim programom inače će doći do korupcije
jednog od njih.
Ovaj način unosa može se videti iz sledećeg primera koji popunjava ekran željenim karakterom:
Prvo imamo bejzik program koji unosi željeni kod karaktera i poziva mašinac da izvrši popunu ekrana sa
ovim kodom.

BASIC listing (unos koda i start mašinca)

10 PRINT "UNESITE EKRANSKI KOD KARAKTERA"
20 INPUT A
30 POKE 4,A
40 SYS 4096
50 END

Asemblerski program (popuna ekrana)

*= $1000
lda #0      ; praznimo ekumulator
sta 2       ; smeštamo u memorijsku lokaciju koja će nam biti niži ekranski bajt
lda #4      ; unosimo vrednost 4 u akumulator
sta 3       ; smeštamo u memorijsku lokaciju koja će nam biti viši ekranski bajt
ldy #0      ; praznimo registar Y koji će nam biti brojač
opet        ; mesto skoka
lda 4       ; unosimo vrednost u akumulator iz memorijske lokacije koju vrednost smo dali
              putem bejzik programa i koja vrednost će nam biti ekranski kod karaktera
sta (2),y   ; smeštamo tu vrednost u ekransku memoriju
iny         ; uvećavamo brojač
bne opet    ; petlja dok se ne zadovolji uslov od 255 karaktera
inc 3       ; uvećavamo memorijsku lokaciju višeg ekranskom bajta
ldx 3       ; učitavamo vrednost sa lokacije u registar X
cpx #8      ; provera da li je dostigao kraj ekranske memorije
bne opet    ; petlja dok se ne ispuni ceo ekran datim karakterom
rts         ; kraj programa

Rezultat i napomena

Kada startujemo ovaj primer deo napisan u bejziku zatražiće nam unos ekranskog koda a zatim će se
startovati mašinski deo gde će se ekran trenutno ispuniti zadatim karakterom.
Ovaj način je efikasan ali može to i bolje.

2) Unos parametra putem naredbe SYS

Mnogo efikasniji način je da potrebne parametre unesemo direktno naredbom SYS.

Imamo primer gde želimo da unesemo opseg i željeni bajt ispune memorijskih lokacija. U direktnom ili
programskom modu daćemo naredbu sa parametrima: SYS 4096,1024,2023,1 i ekran će se ispuniti
karakterom slova "A".
Sledeći mašinski program nam ovo omogućava:

Mašinski program (uzimanje parametara i popuna opsega)

*= $1000
jsr uzmi     ; odlazak u podprogram za uzimanje parametra posle naredbe SYS 4096
sty 2        ; niži bajt posle uzimanja ide u registar Y i smeštamo ga u memorijsku adresu
               koja će nam biti niži bajt memorijske adrese početka unosa karaktera
sta 3        ; viši bajt posle uzimanja ide u akumulator A i smeštamo ga u memorijsku
               adresu koja će nam biti viši bajt memorijske adrese početka unosa karaktera
jsr uzmi     ; ponovni odlazak u podprogram za uzimanje parametra posle drugog zareza
sty 4        ; niži bajt posle uzimanja ide u registar Y i smeštamo ga u memorijsku adresu
               koja će nam biti niži bajt memorijske adrese kraja unosa karaktera
sta 5        ; viši bajt posle uzimanja ide u registar Y i smeštamo ga u memorijsku adresu
               koja će nam biti viši bajt memorijske adrese kraja unosa karaktera
jsr uzmi     ; ponovni odlazak u podprogram za uzimanje parametra posle trećeg zareza
tya          ; ovog puta uzimamo samo niži bajt koja vrednost nam predstavlja željeni
               karakter ispune i prebacujemo ga u akumulator
ldx #0       ; brišemo registar X.
opet         ; mesto skoka
sta (2,x)    ; smeštamo željeni karakter u memoriju željenog opsega. Koristimo
               preindeksirno indeksiranje iz razloga što možemo upoređivati vrednost
               memorijske lokacije 2 gde se nalazi niži bit ekranske memorije
ldy 2        ; učitavamo vrednost memorijske lokacije 2 u registar Y
cpy 4        ; proveramo da li se ova vrednost slaže sa vrednošću iz memorijske lokacije
               4 gde se nalazi niži bajt kraja ekranske memorije
beq proveri  ; ukoliko jeste idemo na proveru da li je i viši bajt identičan
dalje        ; mesto skoka ukoliko nije kraj petlje
inc 2        ; uvećavamo vrednost memorijske lokacije 2 nižeg bajta ekranske memorije
bne opet     ; pravimo petlju za unos svih karaktera u željenom rasponu
inc 3        ; uvećavamo vrednost memorijske lokacije 3 gde je viši bajt ekranske
               memorije
bne opet     ; pravimo petlju za unos svih karaktera u željenom rasponu
rts          ; kraj programa
proveri      ; mesto skoka za proveru
ldy 3        ; učitavamo u registar Y viši bajt ekranske memorije
cpy 5        ; proveramo da li se slaže sa memorijskom lokacijom 5 gde se nalazi kraj
               višeg bajta ekranske memorije
beq kraj     ; ukoliko jeste završavamo program
jmp dalje    ; beskonačna petlja dok uslov ne bude zadovoljen
kraj         ; mesto skoka za kraj programa
rts          ; kraj programa
uzmi         ; mesto skoka za uzimanje parametra putem SYS naredbe.
jsr $aefd    ; zarez za izdvajanje parametara
jsr $ad9e    ; učitavanje parametra
jsr $b7f7    ; niži bajt u registar Y a viši bajt u akumulator A
rts          ; povratak iz podprograma

Napomena o podprogramu „uzmi“ i poruke greške

Ovde je najbitnije obratiti pažnju na podprogramsku sekciju "uzmi" gde se nalaze pozivi podprograma
sistema koji nam omogućavaju uzimanje željenih parametra i stavljanja njihovih šenaestobitnih vrednosti
gde niži bajt parametra ide u registar Y a viši u akumulator A. Svaki put kada iz programa pozovemo ovaj
podprogram uzima se sledeći parametar u nizu. U slučaju da u naredbi SYS nisu uneti dovoljni broj
parametra dobićemo poruku o grešci "Syntax error" a ako izlaze iz opsega $FFFF poruku "illegal quantity
error".

Upozorenja i bezbednost

Ovaj program se može iskoristi za bilo koje filovanje željenom vrednošću datog raspona memorijskih
lokacija. Naravno ako zadavanjem parametra obuhvatimo bitne memorijske adrese i u njima unesemo
svoje vrednosti dovešće do neminovnog kraha računara/emulatora i/ili brisanja unetih programa.

Program za razmišljanje

*= $1000
ldx #0
opet
sta $d400,x
inx
cpx #28
bne opet
jsr uzmi
sty $d400
sta $d401
jsr uzmi
sty $d404
lda #155
sta $d405
lda #10
sta $d406
jsr uzmi
sty $d418
rts
sty $d418
rts
uzmi
jsr $aefd
jsr $ad9e
jsr $b7f7
rts

Mala pomoć i završetak

Mala pomoć: SYS 4096,10000,33,10
To je sve za danas.
Veliki pozdrav!

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

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