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 programa

Mož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
rts

Ko zna – možda se radi o pomeranju slike vertikalnim skrolom ili nešto slično? 🙂

To je sve za danas. Veliki pozdrav!

Ostavite komentar

Vaša adresa e-pošte neće biti objavljena. Neophodna polja su označena *

Scroll to Top