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 Rou- tine 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 Zeit- punkt 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 geschal- tet, 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äch- ste Rasterzeile einzustellen, wobei auch dies exakt vor Beginn derselben gesche- hen muß. Hierzu wird zunächst der Akku mit dem Wert $18 geladen (Wert für Regi- ster $D018), wobei die oberen vier Bits die Lage der Video-Map bestimmen. Sie enthalten den Wert 1 und bezeichnen da- mit 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, be- nutzen wir ihn ebenfalls. Der LDA-Befehl verbraucht nun 2 Taktzyklen. Als Näch- stes 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 rich- tigen 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 Be- ginn der nächsten Rasterzeile befinden. Durch die im letzten Moment vorgegaukel- te Vertikal-Verschiebung um eine Raster- zeile, 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 Be- ginn der eigentlichen Charakterzeile, abgearbeitet wurde. Nun wird zum Haupt- IRQ zurückverzweigt, wo "FLILINE" so- gleich zur Bearbeitung der nächsten Cha- rakterzeile 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ß un- ser Programm also 2 Zyklen länger dauert, als es eigentlich sollte. Dies liegt an einem kleinen "Nebeneffekt" von FLI. Dadurch, daß wir den VIC austrick- sen, 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ön- nen 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 da- nach kann der VIC die Grafik mit akti- viertem FLI-Effekt darstellen. In den 3 Charaktern davor ist dann wieder das Bitmuster der letzten Speicherzelle sei- nes Adressierungsbereiches zu sehen (normalerweise $3FFF - im Beispiel aber durch die Bereichsverschiebung $7FFF). Gleichzeitig scheint der Prozessor da- durch aber wieder 2 Zyklen mehr zu ha- ben, was die einzige Erklärung für die oben aufgezeigte Diskkrepanz sein kann (Sie sehen: selbst wenn man einen sol- chen 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, manch- mal 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 Prozes- sor während des annähernd gesamten Bil- daufbaus im FLI-Interrupt befindet, und dadurch wenig Rechenzeit für andere Ef- fekte ü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" ge- startet und durch einen 'SPACE'- Tastendruck beendet wird. Das Prinzip der einzelnen Routinen ist immer ähn- lich, nur daß bei "FULL" noch mehr Ra- sterzeilen in FLI-Darstellung erschei- nen, und bei "HIRES" zusätzlich der Hi- res-Modus zur Darstellung verwendet wird. Am Besten Sie disassemblieren sich die drei Programme mit Hilfe eines Spei- chermonitors und manipulieren sie ein wenig, um die Vielfalt und Funktionswei- se von FLI-Effekten besser zu erlernen. Übrigens: Der FLI-Effekt funktioniert auch im normalen Textmodus. Hierbei wer- den dann immer nur die oberen acht Pixel eines Zeichens in allen acht Rasterzei- len wiederholt. Man könnte damit einen recht eindrucksvollen Textein- und aus- blend-Effekt programmieren, bei dem die einzelnen Zeichen quasi auf den Bild- schirm "fließen" (oder von ihm "weg- schmelzen"). Dies als Anregung für ein eigenes FLI-Projekt...
(ih/ub)