Sprite-Splitting

Unter Sprite-Splitting versteht man die Zerlegung eines Sprites in zwei oder mehrere scheinbar unabhängige Einzelsprites.
Durch Veränderung der X-Koordinate eines Sprites zum richtigen Zeitpunkt kann dieses in zwei oder mehr Teile zerlegt werden, die sich in X-Richtung unabhängig voneinander bewegen können. Anders, als bei einem Sprite-Multiplexer müssen die Sprites in Y-Richtung nicht um mindestens 21 Pixel versetzt sein. Dadurch kann der Eindruck entstehen, dass sich mehr als 8 Sprites in einer Zeile befinden.
Das nachfolgende Beispiel-Programm bewegt abwechselnd die obere und die untere Hälfte des Sprites in X-Richtung. Man sieht ein Auto, welches sich nach rechts bewegt und einen Ball, der nach links wandert (halb so schnell, wie das Auto). Das höchstwertige Bit der X-Koordinate in Register $D010 wurde dabei nicht berücksichtigt, um das Programm einfach zu halten. Dies wäre aber problemlos möglich.
*=$c000
lda #147 ; Bildschirm leer
jsr $ffd2
lda #00 ; Hintergrund schwarz
sta $d020
sta $d021
lda #100 ; Sprite initialisieren
sta $d001
lda #1
sta $d015
lda #13
sta 2040
ldx #62
- lda .sprite,x
sta 832,x
dex
bpl -
sei
lda #99 ; Interrupt auf Zeile 99
sta $d012 ; programmieren
lda $d011
and #$7f
sta $d011
lda $d01a ; Rasterzeilen-Interrupt anschalten
ora #$01
sta $d01a
lda #<irq ; Interrupt-Routine verbiegen
sta $0314
lda #>irq
sta $0315
cli
rts
irq lda $d019 ; Auf VIC-Interrupt testen
bmi vic_irq
lda $dc0d ; Timer-Interrupt bestätigen
cli ; und neuen Interrupt zulassen
jmp $ea31 ; System-Interrupt
vic_irq sta $d019 ; Rasterzeilen-Interrupt bestätigen
lda $d012
cmp #104
bcs +
lda .c1 ; Obere Hälfte um zwei Felder nach
sta $d000 ; rechts
inc .c1
inc .c1
lda #111 ; Rasterzeilen-Interrupt für
sta $d012 ; untere Hälfte programmieren
bne ++
+ lda .c2 ; Untere Hälfte um ein Feld nach
sta $d000 ; links
dec .c2
lda #99 ; Rasterzeilen-Interrupt für
sta $d012 ; obere Hälfte programmieren
++ pla ; Interrupt geordnet beenden
tay
pla
tax
pla
rti
.c1 !by 100 ; X-Koordinate für obere Hälfte
.c2 !by 200 ; X-Koordinate für untere Hälfte
; Sprite-Daten
.sprite !by 0,255,192,15,8,32,62,8,16,127,255,254,241,255,31
!by 238,254,239,223,125,247,223,125,246,31,1,240,14,0
!by 224,0,0,0,0,60,0,0,239,0,1,253,128,3,103,192,3,195
!by 64,2,195,192,3,230,192,1,223,128,0,251,0,0,60,0