Fortsetzung IRQ-Kurs (Teil 13)
----------------------------------------
Kommen wir nun zum Beispiel "STRET-
CHER.2". Rein äußerlich unterscheidet
sich diese Routine nicht von "STRET-
CHER.1". Auch hier wird dasselbe Sprite
wieder verzerrt dargestellt, wobei die
Verzerrung jedoch etwas anders ausfällt.
Rein theroretisch haben wir nur die Ta-
belle "AD017" verändert, so daß dasselbe
Sprite ein anderes Aussehen erlangt.
Technisch gesehen wurde dieses Beispiel
jedoch um ein zusätzliches Feature er-
weitert: Am Ende unserer IRQ-Routine,
genau bevor wir die Prozessorregister
wieder zurückholen und den IRQ mittels
RTI verlassen, haben wir den Befehl "JSR
$1300" hinzugefügt. An dieser Adresse
befindet sich nun eine kleine Unterrou-
tine, die es uns ermöglicht, flexiblere
Dehnungen zu programmieren, ohne, daß
wir uns Gedanken über den Aufbau der
Tabelle "AD017" machen müssen. Sie
greift auf eine Tabelle namens
"LSTRETCH" zu, die 21 Bytes enthält, die
jeweils die Anzahl der Rasterzeilen an-
geben, die eine jede der 21 Spritezeilen
wiederholt werden soll. Die Tabelle
liegt ab Adresse $1700 und sieht folgen-
dermaßen aus:
lstretch:
.byte $01 ;Spriteline01 1x Wdh.
.byte $02 ;Spriteline02 2x Wdh.
.byte $03 ;Spriteline03 3x Wdh.
.byte $04 ;Spriteline04 4x Wdh.
.byte $05 ;Spriteline05 5x Wdh.
.byte $06 ;Spriteline06 6x Wdh.
.byte $06 ;Spriteline07 6x Wdh.
.byte $05 ;Spriteline08 5x Wdh.
.byte $04 ;Spriteline09 4x Wdh.
.byte $03 ;Spriteline10 3x Wdh.
.byte $02 ;Spriteline11 2x Wdh.
.byte $01 ;Spriteline12 1x Wdh.
.byte $01 ;spriteline13 1x Wdh.
.byte $01 ;Spriteline14 1x Wdh.
.byte $01 ;Spriteline15 1x Wdh.
.byte $01 ;Spriteline16 1x Wdh.
.byte $01 ;Spriteline17 1x Wdh.
.byte $01 ;Spriteline18 1x Wdh.
.byte $01 ;Spriteline19 1x Wdh.
.byte $01 ;Spriteline20 1x Wdh.
.byte $00 ;Spriteline21 0x Wdh.
Die Routine bei $1300 ("STCHART" ist ihr
Name) soll nun diese Werte in Folgen von
$00/$01-Bytes umrechnen, und in der Ta-
belle "AD017" ablegen, so daß wir ledi-
glich angeben müssen, welche Spritezeile
wie oft wiederholt werden soll. Hier nun
der Sourcecode der STCHART-Routine:
stchart
ldx #20 ;Zähler in X-Reg. init.
lda #$ff ;Akku mit $FF init.
fill:
sta ad017,x ;AD017-Tab mit $FF
inx ; auffüllen (=letzte
cpx #21*5 ; Spritezeile immer bis
bne fill ; Ende wiederholen)
ldy #$00 ;Index f. LSTRETCH-Tab
ldx #$00 ;Index f. AD017-Tab
nextline:
lda lstretch,y;1. Wert lesen und in
sta $FF ; $FF abl.
double:
dec $FF ;Wert-1
beq normal ;Wert=0 -> nächst.Zeile
lda #$01 ;Sonst 1x wiederholen in
sta ad017,x ; AD017-Tab eintr.
inx ;AD017-Index+1
jmp double ;Und nochmal durchlaufen
normal:
lda #$00 ;Code für "nächste Zeile
sta ad017,x ; lesen" in AD017-Tab
inx ;AD017-Index+1
iny ;LSTRETCH-Index+1
cpy #20 ;Mit Ende vgl.
bne nextline ;Nein, also nochmal
rts ;Sonst Ende
Wie Sie sehen füllt diese Routine ledi-
glich die AD017-Tabelle so oft mit $01-
Werten, wie der Bytewert einer Sprite-
zeile aus LSTRETCH groß ist. Auf diese
Weise können wir die Verzerrung einfa-
cher handhaben, was uns in Beispiel 2
noch nichts nutzt, da hier immer nur
dieselbe LSTRETCH-Tabelle benutzt wird,
was uns aber bei den Beispielen 3 und 4
sehr zugute kommt.
3) PROGRAMMBEISPIELE 3 UND 4
Diese beiden Beispiele bauen nun auf den
Grundstein, den wir mit den ersten bei-
den Programmen legten, auf. "STRET-
CHER.3" ist ein Programm, in dem Sie
einen kleinen Flugsaurier auf dem Bild-
schirm flattern sehen. Diesen können Sie
nun mit Hilfe eines Joysticks in Port 2
nach links und rechts über den Bild-
schirm bewegen. Drücken Sie den Joystick
jedoch nach oben und unten, so können
Sie unseren kleinen Freund wachsen oder
wieder schrumpfen lassen, also fließend
auf 5-fache Größe dehnen und wieder auf
seine Ursprungsgröße zusammenschrumpfen
lassen. Hierzu haben wir lediglich eine
Joystickabfrage miteingebaut, die bei
nach unten gedrücktem Joystick einen der
Werte aus der Tabelle LSTRETCH um 1
erhöht, bei nach oben gedrücktem Joy-
stick einen dieser Werte erniedrigt.
Dadurch, daß nun gleichzeitig auch nach
jedem Rasterdurchlauf die Routine ST-
CHART aufgerufen wird, wird somit die
kleine Änderung durch die Joystickrouti-
ne direkt in die AD017-Tabelle übertra-
gen, womit ein quasi stufenloser Dehn-
und Staucheffekt entsteht. Hierbei ist
es übrigens wichtig, die richtige Spri-
tezeile für eine Vergrößerung zu wählen.
In der Regel nimmt man dazu ein iterati-
ves Verfahren, das die Anzahl der Spri-
tezeilen, die eine Rasterzeile mehr dar-
gestellt werden als Andere, so gleichmä-
ßig verteilt, daß der Dehneffekt beson-
ders flüssig erscheint. Dies sind jedoch
Feinheiten, die wir hier nicht weiter
besprechen möchten, da sie nicht zum
Thema gehören.
Das Beispiel "STRETCHER.4" ist nun eine
weitere Kombination aus den Beispielen 2
und 3. Wir haben hier acht Mal den klei-
nen Flugsaurier auf dem Bildschirm, der
in Sinuswellenform quasi über den Bild-
schirm "schwabbelt". Hierbei haben wir
uns eines einfachen Tricks bedient: Wir
nahmen zunächst die LSTRETCH-Tabelle aus
"STRETCHER.2", die eine Art runde Ver-
zerrung in Vertikalrichtung erzeugt.
Diese Tabelle wird nun zyklisch durchge-
rollt. Pro Rasterdurchlauf kopieren wir
die Bytes 0-19 um ein Byte nach vorne
und setzen den Wert von Byte 20 wieder
bei 0 ein. Dadurch entsteht der Effekt,
als würden die kleinen Saurier als Re-
flektion auf einer gewellten Wassero-
berfläche sichtbar sein!
Diese einfache Variation zeigt, mit
welch simplen Methoden man eindrucksvol-
le Effekte durch Spritedehnung erzielen
kann. Sie soll Sie wieder anregen, eige-
ne Experimente mit unserer neuen Raster-
Effekt-Routine durchzuführen.
(ih/ub)