Ciao Fabbroz,
mi sono permesso di riscrivere un pezzettino del tuo codice perchè secondo me è più semplice da capire della (giustissima) funzione che hai inserito.
Ecco il pezzo:
;muovo gli sprites
lda #$00
inc $d000
bne skspr1
ora #$01
skspr1
inc $d002
bne skspr2
ora #$02
skspr2.
inc $d004
bne skspr3
ora #$04
skspr3
inc $d006
bne skspr4
ora #$08
skspr4
inc $d008
bne skspr5
ora #$10
skspr5
eor $d010
sta $d010
Questo va a sostituire il corrispondente tratto nel tuo codice (fino a "; scrolling $d016" per intenderci.
Come hai evidenziato tu gli sprite hanno 9 bit di movimento orizzontale: gli 8 bit meno significativi son salvati in altrettanti registri $d000+2*x, il 9° bit di ciascuno di essi è "impacchettato" in unico byte in $d010.
E' chiaro che, in termini di complessità di codice, questa cosa rende piuttosto rognoso muovere ogni sprite oltre il primo byte (>255).
Quella che ti ho proposto sopra è una soluzione, ovviamente ce ne sono molte altre, alcune probabilmente più efficienti.
Ti spiego il primo miniblocco (da "lda #$00" a skspr1), gli altri seguono la medesima logica.
- Parto con accumulatore a 0 (vedremo poi perchè)
1) Incremento gli 8 bit meno significativi del primo sprite (l'istruzione "inc" NON modifica l'accumulatore!!)
2) L'incremento ha dato come risultato 0? Se si, significa che abbiamo oltrepassato il valore 255 (overflow), in questo caso proseguo all'istruzione successiva perchè $d010 dev'essere modificato; in caso contrario la skippo.
3*) La "ora #$01" serve a settare il bit 0 dell'accumulatore (che, siccome verrà poi usato in $d010, rappresenta di fatto il MSb dello sprite 0).
Stessa procedura per gli altri 4 sprite, cambia chiaramente il bit da impostare, rispettivamente:
sprite 0: bit 0 => ora #$01
sprite 1: bit 1 => ora #$02
sprite 2: bit 2 => ora #$04
sprite 3: bit 3 => ora #$08
sprite 4: bit 4 => ora #$10
Le ultime due istruzioni fanno le seguenti cose:
- eor $d010 serve per invertire lo stato del MSb degli sprite che hanno appena sorpassato 255. Chiaramente vengono invertiti i soli sprite per i quali è stato attivato il corrispondente bit nelle istruzioni precedenti.
- sta $d010 ovviamente salva il nuovo valore di $d010
Spero di essere stato esauriente, se qualcosa non è chiaro chiedi pure.
Buon coding!