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)