C64 – CAKE 3
C64 – CAKE 3
Preslušaj review ovog teksta:
Dobrodošli u nove cake! Danas donosimo jednu od najpoznatijih programskih rutina na Commodore 64 – čuveni lavirint koji se iscrtava pomoću samo dva karaktera.
BASIC varijanta lavirinta
Ova rutina možda je najpoznatija posle slavnog primera 10 PRINT "NESTO": GOTO 10. Ovog puta u pitanju je “lavirint”:
10 PRINT CHR$(205.5+RND(1));: GOTO 10
i to je sve!
U ovoj liniji BASIC-a ispisuju se PETSCII karakteri 205 ili 206 (nizbrdice i uzbrdice). Funkcija RND(1) daje slučajni decimalni broj između 0 i 1. Kada tu vrednost saberemo sa 205.5, dobijamo slučajan rezultat 205 ili 206. Pošto CHR$ radi samo sa celim brojevima, vrednosti se automatski zaokružuju.
Kada pokrenete program, na ekranu se nasumično ispisuju ta dva znaka, jedan pored drugog i jedan ispod drugog, čime se stvara beskonačni lavirint koji izgleda veoma zanimljivo.
Brža varijanta u asemblerskom jeziku
Isti efekat može da se postigne i pomoću mašinskog jezika. Pogledajmo dva pristupa:
Prvi način – korišćenjem sistemske rutine za ispis ($FFD2)
*= $1000
lda #$ff ; punimo akumulator vrednošću $FF
sta $d40e ; stavljamo tu vrednost na frekvenciju nižeg bita trećeg kanala
sta $d40f ; stavljamo tu vrednost na frekvenciju višeg bita trećeg kanala
lda #$80 ; unosimo u akumulator vrednost &80
sta $d412 ; unosimo ovu vrednost (šum) u oblik zvuka trećeg kanala i na ovaj način
aktiviramo generator šuma da bi smo dobili slučajni broj
opet ; mesto skoka za beskonačnu petlju
lda $d41b ; čitamo slučajnu vrednost koja se stvara na memorijskoj lokaciji trećeg
kanala (beli šum)
and #1 ; dajemo vrednost 1 kao filter za nulti bit tako da će se svaki slučajni broj
svesti samo na dve mogućnosti 0 i 1 (AND %00000001)
adc #205 ; dodajemo vrednost 205 za petascii karakter i dobićemo vrednost 205 ili 206
(karakteri nizbrdice ili uzbrdice)
jsr $ffd2 ; štampamo petascii vrednost iz akumulatora na ekran
jmp opet ; vraćamo se na početak petlje
rts ; kraj programaMožemo uvek prekinuti izvršenje ovog mašinskog programa sa run/stop+restore (u emulatoru esc+page up)
Ova verzija koristi sistemsku rutinu za ispis znakova ($FFD2) i generisanje slučajnih vrednosti iz trećeg kanala SID čipa. Program radi primetno brže od BASIC-a, ali i dalje postoji usporenje zbog poziva KERNAL rutine.
Šta mislite da ceo ekran trenutno ispunimo željenim slučajnim karakterima koji čine lavirint i tako munjevitom brzinom smenjujemo ispisane ekrane sa različitim lavirintskim šablonima u beskonačnoj petlji.
To je sve omogućeno na
Drugi način – direktno popunjavanje ekranske memorije
*= $1000
lda #$ff
sta $d40e
sta $d40f
lda #$80
sta $d412
opetsve
lda #0
sta 2
lda #4
sta 3
ldy #0
opet
lda $d41b ; čitamo slučajnu vrednost koja se stvara na trećem kanalu (beli šum)
and #1 ; dajemo filter za nulti bit 1 tako da će se svaki slučajni broj svesti samo
na dve mogućnosti 0 i 1 (AND %00000001)
adc #77 ; dodajemo vrednost 77 za ekranski karakter i dobićemo vrednost 77 ili 78
(karakteri nizbrdice ili uzbrdice)
sta (2),y
iny
bne opet
inc 3
ldx 3
cpx #8
bne opet
jmp opetsve
rts
Zašto se koriste ekranski kodovi 77 i 78 umesto PETSCII 205 i 206?
Zato što PETSCII kodovi daju inverzne verzije karaktera, dok ekranski
kodovi prikazuju normalne dijagonale.Ova metoda je mnogo brža jer zaobilazi KERNAL rutinu i direktno upisuje znakove u RAM ekrana ($0400 – $07E7).
Mozgalica za kraj
Pogledajte sledeći kratki ASM primer i razmislite šta radi:
*= $1000
opetsve
ldy #0
opet
iny
tya
adc #24
sta $d011
cpy #3
beq opetsve
jmp opet
rtsKo zna – možda se radi o pomeranju slike vertikalnim skrolom ili nešto slično? 🙂

