Magic Disk 64

home to index to text: MD9406-KURSE-IRQ-KURS_8.2.txt

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)

Valid HTML 4.0 Transitional Valid CSS!