C64 – CAKE 6
Datum objavljivanja: 19. oktobar 2025
Autor: Saša Petrović
C64 – CAKE 6
Dobrodošli u nove cake. Danas radimo sa najmoćnijem registrom VIC II grafičkog čipa, moćnim rasterom. Možemo slobodno reći da je zahvaljujući ovom registru omogućeno mnogo vizuelnih efekata koje srećemo u igrama i introima.
Ovaj registar se nalazi na memorijskoj adresi $D012
i isti kontroliše mlaz iscrtavanja linije piksela od 0 do 255 linije kojom se pokrivaju raster linije cele ekranske pozadine ali ne i celog okvira ekrana. Zato 8 bit raster registra koji se nalazi na memorijskoj lokaciji $D011
(njegov 7 bit 0–7) pokriva kontrolu mlaza iscrtavanja piksela obuhvatajući time ceo okvir ekrana.
U svakom trenutku zahvaljujući ovom registru možemo proveravati i kontrolisati mlaz iscrtavanja, tako da jednostavnim upoređivanjem trenute pozicije možemo promeniti boje okvira i pozadine gde dobijamo efekat presečenog ekrana, dupliciramo sprajtove u presečenim delovima (ako ste videli da u nekom introu izgleda da ima više od osam sprajtova to se postiže na ovaj način), izvršimo promenu dela ekrana tako da jedan deo bude u tekstualnom a drugi u grafičkom delu i još mnogo toga.
Da vidimo primere:
1) Deljenje boje ekrana na dva dela
*= $1000
sei ; setujemo I-bit čime onemogućavamo prekide. Ovo je potrebno zbog
; stabilnosti preseka inače linije preseka trepere
opet ; mesto skoka beskonačne petlje
lda $d012 ; učitavamo u akumulator vrednost raster registra i samim tim saznajemo gde
; se trenutno mlaz iscrtavanja nalazi
cmp #139 ; upoređujemo da li je mlaz dostigao vrednost 139. Ova vrednost daje stabilni
; presek dok neke druge vrednosti mogu izazvati blago talasanje preseka bez
; obzira na uključenu zabranu prekida
bpl dalje ; ukoliko je vrednost veća od uporedne prelazimo na boju pozadine druge
; polovine ekrana
lda #0 ; stavljamo u akumulator vrednost nula koja će nam biti crna boja pozadine
sta $d021 ; smeštamo vrednost iz akumulatora u registar boje pozadine ekrana
jmp opet ; vraćamo se na mesto skoka beskonačne petlje
dalje ; mesto skoka ako je mlaz prešao na drugu polovinu ekrana
lda #1 ; stavljamo u akumulator vrednost nula koja će nam biti bela boja pozadine
sta $d021 ; smeštamo vrednost iz akumulatora u registar boje pozadine ekrana
jmp opet ; vraćamo se na mesto skoka beskonačne petlje
Startovanjem ovog programa pozadina ekrana će se podeliti na dve boje — gornji deo preseka biće crn, a donji beo. To je sve postignuto zahvaljujući raster registru čijom proverom trenutne linije ispisivanja možemo promeniti boju pozadine u pravom trenutku i time dobiti efekat presečenog ekrana.
2) Deljenje okvira na dve boje
*= $1000
sei ; setujemo I-bit čime onemogućavamo prekide. Ovo je potrebno zbog
; stabilnosti preseka inače linije preseka trepere
opet ; mesto skoka beskonačne petlje
lda $d012 ; učitavamo u akumulator vrednost raster registra i samim tim saznajemo gde
; se trenutno mlaz iscrtavanja nalazi
cmp #120 ; upoređujemo da li je mlaz dostigao vrednost 120. Ova vrednost daje stabilni
; presek okvira
bpl dalje ; ukoliko je vrednost veća od uporedne prelazimo na boju okvira druge
; polovine ekrana
lda #2 ; stavljamo u akumulator vrednost 2 koja će nam biti crvena boja okvira
sta $d020 ; smeštamo vrednost iz akumulatora u registar boje pozadine okvira
jmp opet ; vraćamo se na mesto skoka beskonačne petlje
dalje ; mesto skoka ako je mlaz prešao na drugu polovinu okvira
lda #7 ; stavljamo u akumulator vrednost nula koja će nam biti žuta boja okvira
sta $d020 ; smeštamo vrednost iz akumulatora u registar boje pozadine okvira
jmp opet ; vraćamo se na mesto skoka beskonačne petlje
Startovanjem ovog primera dobijamo okvir ekrana u dve boje — crvenu i žutu — ali sa tri preseka. Zašto? Raster koji očitava mlaz ima najveću vrednost 255, dok okvir izlazi iz ovog opsega. Kada se to desi raster počinje ponovo od nule, pa se boja okvira vraća na prvobitnu i dobijamo: crvena do pola ekrana, zatim žuta do kraja opsega registra, pa ponovo crvena.
Da bi se ovo izbeglo, treba uključiti pri proveri 8. bit raster registra koji se nalazi na memorijskoj lokaciji $D011
— proverom njegovog 7. bita (0–7).
Ovo možemo videti iz sledećeg primera:
3) Savršeni presek okvira na dve boje
*= $1000
sei ; setujemo I-bit čime onemogućavamo prekide. Ovo je potrebno zbog
; stabilnosti preseka inače linije preseka trepere
opet ; mesto skoka beskonačne petlje
lda $d012 ; učitavamo u akumulator vrednost raster registra i samim tim saznajemo gde
; se trenutno mlaz iscrtavanja nalazi
cmp #140 ; upoređujemo da li je mlaz dostigao vrednost 140. Ova vrednost daje stabilni
; presek kod savršenog preseka okvira
bpl dalje ; ukoliko je vrednost veća od uporedne prelazimo na boju okvira druge
; polovine ekrana
lda $d011 ; učitavamo u akumulator vrednost registra $D011 gde se nalazi osmi bit
; raster registra
and #$80 ; dajemo filter za njegov 7 bit (8 bit raster registra) da bi se samo on uzeo za
; poređenje
cmp #$80 ; upoređujemo da li je ovaj bit setovan
beq dalje ; ukoliko jeste skačemo na donji deo ekrana i nastavljamo boju okvira od 256
; linije
lda #2 ; stavljamo u akumulator vrednost 2 koja će nam biti crvena boja okvira
sta $d020 ; smeštamo vrednost iz akumulatora u registar boje pozadine okvira
jmp opet ; vraćamo se na mesto skoka beskonačne petlje
dalje ; mesto skoka ako je mlaz prešao na drugu polovinu okvira
lda #7 ; stavljamo u akumulator vrednost nula koja će nam biti žuta boja okvira
sta $d020 ; smeštamo vrednost iz akumulatora u registar boje pozadine okvira
jmp opet ; vraćamo se na mesto skoka beskonačne petlje
Startovanjem ovog programa dobijamo savršeni presek okvira ekrana sa jasnom podelom na gornji deo crveno i donji deo žuto. Vrednost poređenja od 140 je praktično idealna; ako je menjamo, može se opet javiti efekat sa tri preseka jer čitanje/upoređivanje na nižim ili višim linijama „vuče” presek do početka/kraja okvira.
Na kraju ostaje nam program za analizu:
*= $1000
sei
lda #<opet
sta $0314
lda #>opet
sta $0315
cli
rts
lda #0
sta 2
opet
inc 2
lda $02
cmp #145
bpl dalje
lda #155
sta $d011
jmp $ea31
dalje
lda #59
sta $d011
jmp $ea31
Mala pomoć: ima veze sa intervalima i promeni grafičke rezolucije ekrana.
To je sve za danas.
Veliki pozdrav!