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 Tabelle " AD017" verändert, so daß dasselbe
Sprite ein anderes Aussehen erlangt.
Technisch gesehen wurde dieses Beispiel
jedoch um ein zusätzliches Feature erweitert: 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 Unterroutine, 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 angeben, die eine jede der 21 Spritezeilen
wiederholt werden soll. Die Tabelle
liegt ab Adresse $1700 und sieht folgendermaß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 Tabelle " AD017" ablegen, so daß wir lediglich 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 1 x 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 lediglich die AD017- Tabelle so oft mit $01- Werten, wie der Bytewert einer Spritezeile aus LSTRETCH groß ist. Auf diese
Weise können wir die Verzerrung einfacher 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 beiden Programmen legten, auf." STRET-CHER.3" ist ein Programm, in dem Sie
einen kleinen Flugsaurier auf dem Bildschirm flattern sehen. Diesen können Sie
nun mit Hilfe eines Joysticks in Port 2 nach links und rechts über den Bildschirm 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 Joystick 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 Joystickroutine direkt in die AD017- Tabelle übertragen, womit ein quasi stufenloser Dehnund Staucheffekt entsteht. Hierbei ist
es übrigens wichtig, die richtige Spritezeile für eine Vergrößerung zu wählen.
In der Regel nimmt man dazu ein iteratives Verfahren, das die Anzahl der Spritezeilen, die eine Rasterzeile mehr dargestellt werden als Andere, so gleichmäßig verteilt, daß der Dehneffekt besonders 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 kleinen Flugsaurier auf dem Bildschirm, der
in Sinuswellenform quasi über den Bildschirm " schwabbelt" . Hierbei haben wir
uns eines einfachen Tricks bedient: Wir
nahmen zunächst die LSTRETCH-Tabelle aus
" STRETCHER.2", die eine Art runde Verzerrung in Vertikalrichtung erzeugt.
Diese Tabelle wird nun zyklisch durchgerollt. 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 Reflektion auf einer gewellten Wasseroberfläche sichtbar sein!
Diese einfache Variation zeigt, mit welch simplen Methoden man eindrucksvolle Effekte durch Spritedehnung erzielen
kann. Sie soll Sie wieder anregen, eigene Experimente mit unserer neuen Raster-Effekt- Routine durchzuführen.
(ih/ub)