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!