fliline sty $ d018 ; Video-Map0 einschalt.
ldx $02 ; Vert. Versch.=0($38) stx $ d011 ; schreiben
lda #$18 ;VideoMap1-Wert laden ldx $03 ;Vert.Versch.=1 ($39) nop ;Verzögern... nop nop nop sta $d018 ;Werte zeitgenau in nop ; $d018 und $d011 stx $d011 ; eintragen lda #$28 ;VideoMap2-Wert laden ldx $04 ;Ver.Versch.=1 ($3A) nop ;Verzögern... nop nop nop sta $d018 ;Werte zeitgenau in nop ; $d018 und $d011 stx $d011 ; eintragen lda #$38 ;Dito f. die folgenden ldx $05 ; 6 Rasterzeilen nop nop nop nop sta $d018 nop stx $d011 lda #$48 ldx $06 nop nop nop nop sta $d018 nop stx $d011 lda #$58 ldx $07 nop nop nop nop sta $d018 nop stx $d011 lda #$68 ldx $08 nop nop nop nop sta $d018 nop stx $d011 lda #$78 ldx $09 nop nop nop nop sta $d018 ldy #$08 stx $d011 rts
Dieser etwas merkwürdige Aufbau der Routine ist mal wieder absolut unerläßlich
für die richtige Funktionsweise des FLI-Effektes. Wie immer muß hier extrem
zeitgenau gearbeitet werden, damit die
einzelnen Befehle zum richtigen Zeitpunkt ausgeführt werden. Durch die NOPs
innerhalb der eigentlichen IRQ-Routine
wird die FLILINE-Routine zum ersten Mal
genau dann angesprungen, wenn sich der
Rasterstrahl kurz vor dem Beginn einer
neuen Charakterzeile befindet. Durch den
" STY $ D018"- Befehl am Anfang der Routine
wird nun gleich auf Video-Map 0 geschaltet, deren Ihnhalt für die Farbgebung
der Grafikpixel in dieser Rasterzeile
zuständig ist. Gleichzeitig setzen wir
den vertikalen Verschiebeoffset auf
Null, wobei mit dem Wert von $38, der
sich in der Zeropageadresse $02 befin- det, gleichzeitig die Grafikdarstellung
eingeschaltet wird. Genau nachdem diese
beiden Werte geschrieben wurden beginnt
nun die Charakterzeile, in der der VIC, wie wir ja wissen, den Prozessor, und
damit unser Programm, für 42 Taktzyklen
anhält. Hiernach haben wir noch 21 Taktzyklen Zeit, die Werte für die nächste Rasterzeile einzustellen, wobei auch
dies exakt vor Beginn derselben geschehen muß. Hierzu wird zunächst der Akku
mit dem Wert $18 geladen ( Wert für Register $ D018), wobei die oberen vier Bits
die Lage der Video-Map bestimmen. Sie
enthalten den Wert 1 und bezeichnen damit Video-Map1 bei Adresse $4400 . Die
unteren vier Bits bestimmen die Lage des
Zeichensatzes und könnten eigentlich
jeden beliebigen Wert enthalten. Da Sie
normalerweise den Wert 8 enthalten, benutzen wir ihn ebenfalls. Der LDA-Befehl
verbraucht nun 2 Taktzyklen. Als Nächstes wird das X-Register mit dem Wert
für Register $ D011 inititalisiert. Er ist diesmal $39, was der Vertikal-Verschiebung des Bildschirms um eine
Rasterzeile entspricht. Hierbei wird der
Wert aus Speicherzelle $03 der Zeropage
ausgelesen. Vielleicht wird Ihnen jetzt
auch klar, warum wir die Wertetabelle
überhaupt, und dann ausgerechnet in der
Zeropage angelegt haben: Durch die ZP-Adressierung verbraucht der LDX-Befehl
nämlich 3 Taktzyklen, anstelle von nur
zweien ( bei direktem Laden mit " LDX
#$39"), was für unser Timing besonders
wichtig ist! Es folgen nun 4 NOP-Befehle, die einfach nur 8 Taktzyklen
verbrauchen sollen, damit wir zum richtigen Zeitpunkt in die VIC-Register
schreiben. Was dann auch tatsächlich
geschieht, wobei wir mit den Befehlen
" STA"," STX" und " NOP" nochmals 10 Takte
" verbraten" und uns wieder genau am Beginn der nächsten Rasterzeile befinden.
Durch die im letzten Moment vorgegaukelte Vertikal-Verschiebung um eine Rasterzeile, meint der VIC nun, daß er sich wieder am Anfang einer Charakterzeile
befindet, weswegen er sie auch prompt
einliest. Sinnigerweise jedoch aus der
neu eingeschalteten Video-Map Nr.1 ! ! !
Dies setzt sich so fort, bis auch die
letzte der acht Rasterzeilen, nach Beginn der eigentlichen Charakterzeile, abgearbeitet wurde. Nun wird zum Haupt-IRQ zurückverzweigt, wo " FLILINE" sogleich zur Bearbeitung der nächsten Charakterzeile aufgerufen wird.
Wenn Sie übrigens einmal die Summe der
verbrauchten Taktzyklen pro Rasterzeile
berechnen, so wird Ihnen auffallen, daß
wir 23(=2+3+10+8), anstelle von 21 Taktzyklen verbraucht haben, so daß unser Programm also 2 Zyklen länger
dauert, als es eigentlich sollte. Dies
liegt an einem kleinen " Nebeneffekt" von
FLI. Dadurch, daß wir den VIC austricksen, scheint er etwas " verwirrt" zu
sein, weswegen er nicht gleich die 40 Zeichen der neuen Video-Map einliest,
sondern 24 Pixel lang erstmal gar nicht
weiß, was er machen soll ( vermutlich
liest er sie zu spät, weswegen er nichts
darstellen kann) . Aus diesem Grund können auch die ersten 24 Pixel einer FLI-Grafik nicht dargestellt werden. Wenn
Sie sich das Beispielbild einmal genauer
ansehen, so werden Sie merken, daß es
nur 296 Pixel breit ist (3 Charakter
fehlen auf der linken Seite) . Erst danach kann der VIC die Grafik mit aktiviertem FLI-Effekt darstellen. In den 3 Charaktern davor ist dann wieder das
Bitmuster der letzten Speicherzelle seines Adressierungsbereiches zu sehen
( normalerweise $3 FFF - im Beispiel aber
durch die Bereichsverschiebung $7 FFF) .
Gleichzeitig scheint der Prozessor dadurch aber wieder 2 Zyklen mehr zu haben, was die einzige Erklärung für die
oben aufgezeigte Diskkrepanz sein kann
( Sie sehen: selbst wenn man einen solchen Effekt programmieren kann - bleiben
manche Verhaltensweisen der Hardware selbst dem Programmierer ein Rätsel) .
4) WEITERE PROGRAMMBEISPIELE Das war es dann wieder einmal für diesen
Monat. Ich hoffe, daß Sie meinen, manchmal etwas komplizierten, Ausführungen
folgen konnten. Mit der Erfahrung aus
den letzten Kursteilen sollte das jedoch
kein Problem für Sie gewesen sein. Wenn
Sie sich ein paar FLI-Bilder anschauen
möchten, so werfen Sie einen Blick auf
diese Ausgabe der MD. Außer dem oben
schon angesprochenen " GO-FLIPIC", haben
wir Ihnen noch zwei weitere FLI-Bilder
mit auf die Diskette kopiert." FULL-FLIPIC", ist ein Multicolor-FLI- Bild, daß über den gesamten Bildschirm geht.
Viel mehr als es anzuschauen können Sie
nicht damit machen, da sich der Prozessor während des annähernd gesamten Bildaufbaus im FLI-Interrupt befindet, und
dadurch wenig Rechenzeit für andere Effekte übrigbleibt. Das dritte Beispiel
ist ein FLI-Bild in HIRES-Darstellung(" HIRES-FLIPIC") . Hier sehen Sie wie
Eindrucksvoll der FLI-Effekt sein kann, da durch die hohe Auflösung noch bessere
Farbeffekte erzielt werden. Zu jedem der
drei Bilder müssen Sie das gleichnamige
Programm laden ( erkennbar an der Endung
"- CODE"), das immer mit " SYS4096" gestartet und durch einen ' SPACE'- Tastendruck beendet wird. Das Prinzip
der einzelnen Routinen ist immer ähnlich, nur daß bei " FULL" noch mehr Rasterzeilen in FLI-Darstellung erscheinen, und bei " HIRES" zusätzlich der Hires- Modus zur Darstellung verwendet
wird. Am Besten Sie disassemblieren sich
die drei Programme mit Hilfe eines Speichermonitors und manipulieren sie ein
wenig, um die Vielfalt und Funktionsweise von FLI-Effekten besser zu erlernen.
Übrigens: Der FLI-Effekt funktioniert
auch im normalen Textmodus. Hierbei werden dann immer nur die oberen acht Pixel
eines Zeichens in allen acht Rasterzei- len wiederholt. Man könnte damit einen
recht eindrucksvollen Texteinund ausblend- Effekt programmieren, bei dem die
einzelnen Zeichen quasi auf den Bildschirm " fließen"( oder von ihm " wegschmelzen") . Dies als Anregung für ein
eigenes FLI-Projekt. . .
(ih/ub)