Era da molto tempo che mi chiedevo come avessero fatto i programmatori di "Grand Prix Circuit" a creare quel bellissimo effetto dissolvenza nelle schermate introduttive.
Neanche mi era passato per la testa,ma la tecnica usata è davvero semplice:in pratica si dispongono 7 sprite espansi orizzontalmente per coprire 21 linee di schermo alla volta,e usando le interruzioni del rastrello si copre tutto lo schermo di sprite.
Siccome gli sprite inizialmente sono vuoti (cioè composti da byte $0) si vede tutto ciò che è in background.Riempiendoli mano a mano con bit 1 scompare gradualmente tutto ciò che gli sta sotto (bitmap o testo chessìa);viceversa per la risolvenza.
Il difficile sta nel randomizzare bene lo riempimento in modo da creare un effetto suggestivo
A questo proposito,non conoscendo io nulla di algoritmi grafici ho pensato bene di rabbare le routine,le tabelle di randomizzazione e di masking direttamente dal gioco :D (per una giusta causa però...).
Battete il solito SYS 49152 e guardate che succede.
ptr = $7f8
shp = $f00
yc = $d001
xc = $d000
col = $d027
xexp = $d01d
hx = $d010
on = $d015
off = $02
irqv = $314
;-------------------------------
* = $c000
jsr init
lda #$30
sta off
lda #$7f
sta $dc0d ;interrupt out
lda #<irq
sta irqv
lda #>irq
sta irqv+1 ;dirotta IRQ
lda $d011
and #$7f
sta $d011
lda #$33
sta $d012
lda #1
sta $d01a ;raster in
;----- routines principali -----
;copyright di "Grand Prix Circuit" ^_^
;-------- DISSOLVENZA ----------
again
jsr delay
ldx #7
mainlp1
stx $03
lda mask,x
sta $fb
ldy #0
nlp1
ldx data,y
lda shp,x
ora $fb
sta shp,x
ldx #12
dex
bne *-1
asl $fb
bcc next1
sec
rol $fb
next1
iny
bne nlp1
ldx $03
dex
bpl mainlp1
;--------- RISOLVENZA ----------
jsr delay
ldx #7
mainlp2
stx $03
lda mask+8,x
sta $fb
ldy #0
nlp2
ldx data,y
lda shp,x
and $fb
sta shp,x
ldx #12
dex
bne *-1
sec
rol $fb
bcs next2
asl $fb
next2
iny
bne nlp2
ldx $03
dex
bpl mainlp2
jmp again
;--------- ritardo -------------
delay
tya
pha
txa
pha
ldx #255
ldy #255
dex
bne *-1
dey
bne *-4
pla
tax
pla
tay
rts
;------ inizializzazione -------
init
ldx #6 ;usa 7 sprite
lp1
lda map,x ;mappe @ 3840
sta ptr,x
dex
bpl lp1
ldx #0
txa ;vuoto
lp2
sta shp,x
inx
bne lp2
ldx #12
lda #48 ;y
lp3
sta yc,x
dex
dex
bpl lp3
ldx #12
ldy #6 ;x
lp4
lda xs,y
sta xc,x
dey
dex
dex
bpl lp4
ldx #6
txa ;blu
lp5
sta col,x
dex
bpl lp5
lda #$60
sta hx
lda #127
sta xexp ;espansione
lda #127
sta on ;attiva sprite
rts
;-------------------------------
irq
lsr $d019
clc
lda off
cmp #$ed
bne skip
ldy ptr ;ad ogni quadro scambia
lda ptr+1 ;le mappe per creare
sta ptr ;l'effetto "breeze"
lda ptr+2
sta ptr+1
lda ptr+3
sta ptr+2
lda ptr+4
sta ptr+3
lda ptr+5
sta ptr+4
lda ptr+6
sta ptr+5
sty ptr+6
lda #$15
skip
adc #$15 ;+21 linee
refr
sta yc
sta yc+2
sta yc+4
sta yc+6
sta yc+8
sta yc+10
sta yc+12
sta off
adc #$03
sta $d012 ;prox IRQ
jmp $ea31
;-------------------------------
map
.byte 60,62,60,61,63,62,61
xs
.byte 24,72,120,168,216,8,56
;-- copyright di "Grand Prix Circuit" ^_^ --
mask
.byte $20,$04,$80,$02,$08,$40,$01,$10
.byte $df,$fb,$7f,$fd,$f7,$bf,$fe,$ef
data
.byte $5e,$e7,$58,$5d,$85,$6b,$04,$76
.byte $43,$a4,$da,$b0,$c3,$52,$a2,$77
.byte $d2,$15,$2d,$4d,$2a,$1d,$a5,$90
.byte $2c,$19,$33,$6a,$1e,$28,$44,$41
.byte $03,$05,$9d,$fe,$87,$c4,$0e,$de
.byte $89,$9a,$46,$7a,$a3,$5a,$88,$02
.byte $0c,$d0,$fa,$54,$12,$db,$aa,$a6
.byte $e9,$80,$a0,$b1,$17,$e8,$bf,$35
.byte $8e,$74,$1b,$94,$f3,$39,$00,$e0
.byte $c2,$3e,$ad,$4c,$6f,$66,$10,$a8
.byte $3b,$6c,$07,$4f,$bd,$71,$63,$9c
.byte $dd,$69,$9f,$81,$f5,$7d,$d4,$bb
.byte $31,$ee,$30,$7b,$d6,$73,$f7,$c5
.byte $d7,$dc,$61,$f9,$ef,$ce,$70,$2e
.byte $40,$bc,$b9,$f1,$ea,$72,$cf,$68
.byte $7f,$fb,$cc,$f0,$22,$3f,$cb,$55
.byte $67,$78,$5b,$8a,$79,$11,$3d,$8c
.byte $57,$50,$1c,$99,$e1,$a7,$7e,$fd
.byte $b7,$34,$9b,$32,$98,$d1,$62,$e4
.byte $7c,$59,$25,$c1,$97,$37,$4b,$df
.byte $47,$b5,$c9,$8b,$c6,$6d,$83,$51
.byte $d8,$93,$09,$ed,$48,$75,$2b,$f2
.byte $b3,$b6,$c8,$d5,$f4,$4e,$a1,$06
.byte $36,$d3,$1f,$c7,$24,$5c,$f8,$b8
.byte $af,$fc,$be,$95,$ba,$56,$3a,$84
.byte $60,$d9,$6e,$cd,$e5,$e2,$20,$92
.byte $e3,$4a,$0a,$f6,$42,$ec,$23,$53
.byte $27,$13,$b2,$2f,$29,$ab,$82,$ca
.byte $16,$0d,$86,$3c,$a9,$9e,$8f,$c0
.byte $ae,$26,$1a,$49,$5f,$91,$18,$08
.byte $96,$8d,$0f,$45,$65,$ac,$eb,$38
.byte $e6,$0b,$64,$01,$21,$b4,$14,$ff