Eccolo qui! Con gli sprite avrei fatto decisamente prima ma volevo provare ad impazzire un po' con i raster e lo scroll del VIC. Il risultato mi sembra abbastanza fluido...
processor 6502
org $0800
dc.b $00, $01, $08, $0a, $00
dc.b $9e, $20, "2304"
dc.b $00, $00, $00
org $0900
sei
lda #$0e
jsr $e536
; Disegno le nuvole
lda #$04
sta $0427
sta $0426
sta $0425
sta $0424
lda #$01
sta $049f
sta $049e
ldx #$00
print_text
lda text,x
sta $0753,x
inx
cpx #end_text-text
bne print_text
; Inizializzo i 3 stati utili dello scroll: scroll di default e
; scroll della prima e seconda nuvola
lda $d016
sta default_scroll
and #%11110111
ora #%00000111
sta cloud1_scroll
sta cloud2_scroll
; ----------------------------------------------------------------------
; Scroll della prima nuvola
; ----------------------------------------------------------------------
main
lda #$20
wait_020
cmp $d012
bne wait_020
ldx $d011
bmi wait_020
lda cloud1_scroll ; Se no recupero il valore di $d016 per
sta $d016 ; la prima nuvola
dec cloud1_scrollstat ; E' ora di eseguire lo scroll software?
beq swscroll_cloud1
dec $d016
inc speed_clouds2 ; Comunico alla seconda nuvola che la prima
lda $d016 ; ha scrollato di 1 pixel
sta cloud1_scroll ; Per finire memorizzo lo scroll della nuvola
jmp end_scroll1
swscroll_cloud1
lda $0400 ; Se si' scrollo la riga di un carattere
pha ; a sinistra
ldx #$00
scroll_1row
lda $0401,x
sta $0400,x
inx
cpx #$27
bne scroll_1row
pla
sta $0427
; Risistemo le variabili di controllo e lo stato dello scroll
lda #$08
sta cloud1_scrollstat
lda $d016
ora #%00000111
sta $d016
sta cloud1_scroll
end_scroll1
; ----------------------------------------------------------------------
; Scroll della seconda nuvola
; ----------------------------------------------------------------------
lda #$3b
wait_03b
cmp $d012
bne wait_03b
ldx $d011
bmi wait_03b
; Come nel raster precedente inizializzo lo scroll della seconda nuvola
; allo stato precedente
lda cloud2_scroll
sta $d016
; E' ora di fare uno scroll?
lda speed_clouds2
and #%00000001
beq no_scroll
; Se si' procedo come con la prima nuvola
lda #$00
sta speed_clouds2
dec cloud2_scrollstat
beq swscroll_cloud2
dec $d016
lda $d016
sta cloud2_scroll
jmp no_scroll
swscroll_cloud2
lda $0478
pha
ldx #$00
scroll_3row
lda $0479,x
sta $0478,x
inx
cpx #$27
bne scroll_3row
pla
sta $049f
lda #$08
sta cloud2_scrollstat
lda $d016
ora #%00000111
sta $d016
sta cloud2_scroll
no_scroll
; ----------------------------------------------------------------------
; Tutto quello che sta dopo il raster $0a9 non deve scrollare
; ----------------------------------------------------------------------
lda #$a9
wait_0a9
cmp $d012
bne wait_0a9
ldx $d011
bmi wait_0a9
lda default_scroll
sta $d016
jmp main
rts
default_scroll ds.b 1
cloud1_scroll ds.b 1
cloud2_scroll ds.b 1
cloud1_scrollstat dc.b 8
cloud2_scrollstat dc.b 8
speed_clouds2 dc.b 0
text dc.b 20, 5, 24, 20, 32, 16, 1, 18, 1, 12, 12, 1, 24, 32, 4, 5, 13, 15
end_text