RETRO KUTAK – tehnologija prošlih decenija

C64 – CAKE 4

C64 – CAKE 4

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.

Poslušajte audio recenziju ovog teksta:

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.


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

Drugo tu je asemblerski program koji ispunjava ekran željenim kodom unetim iz bejzika.


*= $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

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:


*= $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

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“.

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.

Došli smo i do programa 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ć: SYS 4096,10000,33,10

To je sve za danas.
Veliki pozdrav!

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 454 posts and counting. See all posts by Nebojsa Kostić

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

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