Benutzer:Berni/Rastertrick/Spritevergrößerung in X-Richtung
Geeignete Sprites können in X-Richtung gestreckt werden, indem die X-Koordinate für das Sprite in jeder Zeile geändert wird. Dadurch entstehen Sprites die breiter wirken, als sie sind.
Im nachfolgenden Beispiel wurde das Sprite mit Hilfe von Register $D01D zusätzlich noch in X-Richting vergrößert. Mit Hilfe des Rasterzeilen-Interrupts wird auf das obere Ende des Sprites gewartet. Danach wird zeilenweise auf den Zeilensprung des Rasterstrahls gewartet und dann sofort die X-Koordinate des Sprites angepasst. Bei den beiden Badlines, die innerhalb der Spriteausgabe auftreten, muss eine Sonderbehandlung stattfinden, damit das Timing stimmt. Nachdem das ganze Sprite auf dem Bildschirm ist, wird die Interrupt-Routine wieder verlassen, damit der Computer anderen Tätigkeiten nachgehen kann.
*=$c000 lda #147 ; Bildschirm leer jsr $ffd2 lda #00 ; Hintergrund schwarz sta $d020 sta $d021 lda #99 ; Sprite initialisieren sta $d001 lda #1 sta $d015 sta $d01d lda #13 sta 2040 ldx #62 - lda .sprite,x sta 832,x dex bpl - sei lda #98 ; Interrupt auf Zeile 98 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 bad1 nop ; Spezialbehandlung für nop ; Badlines nop nop nop bad2 nop iny lda .indent,y sta $d000 inc x+1 ; Modifikation des Codes bne next vic_irq ldy #$00 ; Index in die .indent-Tabelle loop lda .indent,y - ldx $d012 ; Auf Rasterzeile warten x cpx #100 bne - sta $d000 ; X-Koordinate von Sprite 1 setzen next cpy #6 beq bad1 cpy #14 beq bad2 iny inc x+1 ; Modifikation des Codes cpy #23 bne loop lda #145 ; Für neuen Durchlauf vorbereiten sta $d000 lda #100 sta x+1 lda $d019 ; VIC-Interrupt bestätigen sta $d019 pla ; Interrupt geordnet beenden tay pla tax pla rti ; Sprite-Daten .sprite !by 255,255,255,255,255,254,254,63,249,255,203,249,255,249,121,255,255 !by 25,63,255,255,255,255,226,255,255,193,255,255,129,255,255,132,255 !by 255,132,255,255,228,191,255,248,159,255,254,159,255,255,159,255 !by 255,252,1,248,240,0,120,240,0,30,240,0,30 ; X-Koordinaten der einzelnen Zeilen .indent !by 146,137,129,122,116,111,103,104,102,101,100,101,100,101,101,102 !by 103,110,110,108,108