RETRO KUTAK – tehnologija prošlih decenija

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 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!

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

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