Con l'occasione della festa della repubblica voglio proporre una simpatica bandiera realizzata coi rastersplit.
Che diamine sono i rastersplit?
Il raster impiega 63 cicli a passare da una riga all'altra, normalmente una rasterbar viene fatta settando $d020/$d021, aspettando 63 cicli per far si' che passi alla riga successiva, poi si setta un nuovo colore e cosi' via.
In questo lasso di tempo si puo' colorare lo schermo diverse volte, una STA $d020 impiega SOLO 4 cicli ad essere eseguita. Ogni cambio di colore o modalita' grafica effettuata sulla stessa linea di raster e' un rastersplit.
Con una routine del genere correttamente temporizzata si possono ottenere risultati strabilianti come <a href='
http://noname.c64.org/csdb/release/?id=2879' target='_blank'>questo</a>, anche se questo demo e' una sorta di non plus ultra fuori dalla portata di chiunque, a parte pochi eletti gurus del VIC-II.
Iniziamo a vedere come si fa UN solo rastersplit:
; split raster
; versione 1
; singolo raster, schermo spento
; iAN CooG/HokutoForce
*=$0801
word eop
word 7102
byte $9e,[startprg]d,0
eop
word 0
startprg
sei
lda #$35
sta $01
lda #$7f
sta $dc0d
lda $dc0d
lda #<irq
sta $fffe
lda #>irq
sta $ffff
lda #<nmi
sta $fffa
lda #>nmi
sta $fffb
lda #$80 ; raster irq posizionata circa a meta' schermo
sta $d012
lda #$0b ; schermo spento, ci basta il colore del bordo
sta $d011 ; ed evitiamo le badlines
lda #01
sta $d01a
sta $d019
cli
jmp *
irq ; testato con vice, debug borders
inc $d019 ; 6 |-47 cicli prima che inizi la nuova riga
sta sa+1 ; 3 |
stx sx+1 ; 3 |
sty sy+1 ; 3 |
bit $24 ; 3 |
bit $24 ; 3 |
bit $24 ; 3 |
bit $24 ; 3 |
bit $24 ; 3 |
bit $24 ; 3 |
bit $24 ; 3 |
bit $24 ; 3 |
nop ; 2 |
lda #$05 ; 2 |
ldx #$01 ; 2 |
ldy #$02 ; 2 |-0
sta $d020 ; 4 ok, partiamo da qua a contare i cicli
bit $24 ; 3 qua siamo ancora nell'estrema sinistra
bit $24 ; 3
bit $24 ; 3 < il normale bordo e' visibile da qua
bit $24 ; 3
bit $24 ; 3
bit $24 ; 3
bit $24 ; 3
stx $d020 ; 4
bit $24 ; 3
bit $24 ; 3
bit $24 ; 3
bit $24 ; 3
bit $24 ; 3
bit $24 ; 3
sty $d020 ; 3
bit $24 ; 3
bit $24 ; 3
bit $24 ; 3
lda #$00 ; 2
sta $d020 ; 3; 64
sa lda #00 ; 2; qua siamo GIA' sulla prossima riga
sx ldx #00 ; 2
sy ldy #00 ; 2
nmi rti ; 6
ok, una bandiera di 1 pixel in altezza e' un po' poco.
Abbiamo bisogno di ripetere la stessa sequenza su piu' righe, ma il tempo rimasto per ogni riga e' quasi 0, quindi non ci resta che duplicare il codice, senza usare iterazioni dex.. bne che ruberebbero troppi cicli macchina, ma facendo un loop unrolled, usando un paio di macro
; split raster
; versione 2
; molte righe, unrolled con macro, schermo spento
; iAN CooG/HokutoForce
*=$0801
word eop
word 7102
byte $9e,[startprg]d,0
eop
word 0
startprg
sei
lda #$35
sta $01
lda #$7f
sta $dc0d
lda $dc0d
lda #<irq
sta $fffe
lda #>irq
sta $ffff
lda #<nmi
sta $fffa
lda #>nmi
sta $fffb
lda #$0b
sta $d012
;lda #$0b
sta $d011
lda #01
sta $d01a
sta $d019
cli
jmp *
MAC SPLIT0
nop
REPEAT 11
bit $24
REPEND
endm
MAC SPLIT1
lda #$05
ldx #$01
ldy #$02
sta $d020
bit $24
bit $24
bit $24
bit $24
stx $d020
bit $24
bit $24
bit $24
bit $24
bit $24
sty $d020
bit $24
bit $24
bit $24
lda #$00
sta $d020
bit $24
ENDM
irq
inc $d019
sta sa+1
stx sx+1
sty sy+1
SPLIT0
REPEAT 280
SPLIT1
REPEND
sa lda #00
sx ldx #00
sy ldy #00
nmi rti
Il codice risultante e' ovviamente enorme, quasi 13k, ma con exomizer lo si riduce a 380bytes.