C64 – CAKE 4
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!

