Ich hoffe, Sie nun nicht unnötig mit dem Gerede von Taktzyklenzahlen verwirrt zu haben. Im Endeffekt kommt es darauf an, das Ende der entsprechenden Rasterzeile abgewartet zu haben. Wieviel Verzögerung dazu notwendig ist, muß nicht groß berechnet werden, sondern wird in der Regel einfach ausprobiert. Sie fügen der IRQ-Routine einfach so viele Verzögerun- gen hinzu, bis eine Farbänderung genau in einer Zeile liegt, und nicht irgendwo mitten in der Rasterzeile anfängt. Beachten Sie bitte, daß Sie die Verzöge- ung für eine Nicht-Charakterzeile erweitern müssen, da in diesen Zeilen dem Prozessor ja 42 zusätzliche Taktzyklen zur Verfügung stehen! Kommen wir nun zu den folgenden Instruk- tionen. Auch hier haben wir es nicht einfach mit irgendeinem Programm zu tun, sondern mit einer sorgfältigen Folge von Befehlen, die genau darauf abgestimmt ist, immer solange zu dauern, bis genau eine Rasterzeile beendet ist. Wie ich zuvor erwähnte sind das immer genau 63 Taktzyklen pro Rasterzeile, in denen der Prozessor irgendwie beschäftigt sein muß, damit die nächste Farbänderung zum richtigen Zeitpunkt eintritt. Wie immer funkt uns jede achte Rasterzeile der VIC dazwischen, der den Prozessor dann wieder für 42 Takte anhält, weswegen unsere Routine jede achte Rasterzeile nicht mehr und nicht weniger als 63-42=21 Taktzyklen dauern darf! Da die nun folgende Beschreibung etwas haarig wird, und schnell in arithmetisches Taktzyklenjonglieren ausartet, hier no- cheinmal die Farbänderungsschleife aus unserem Beispielprogramm, wobei ich hier die Kommentare durch die Zyklenzahlen je Befehl ersetzt habe:
LDY #$00 ;2 LOOP1 LDX #$08 ;2 LOOP2 LDA $1100,Y ;4 STA $D020 ;4 STA $D021 ;4 INY ;2 DEX ;2 BEQ LOOP1 ;2 oder 3 LDA VERZ ;4 JSR VERZ ;12 JSR VERZ ;12 JSR VERZ ;12 CPY #$48 ;2 BCC LOOP2 ;2 oder 3
Der LDY-Befehl am Anfang ist eigentlich weniger wichtig, ich habe ihn nur der Vollständigkeit halber aufgeführt. Wir haben hier zwei verschachtelte Schleifen vor uns. Die eine, mit dem Namen "LOOP1" wird immer nur jede achte Rasterzeile aufgerufen, nämlich dann, wenn eine Charakterzeile beginnt. Diese Schleife wird über das X-Register indiziert. Die zweite Schleife wird vom Y-Register ge- steuert, das gleichzeitig Indexregister für unsere Farbtabelle bei $1100 ist. Wichtig ist nun der zeitliche Ablauf der beiden Schleifen. Wie wir ja wissen, müssen wir in einer Charakterzeile mit unserem Programm 21 und in einer normalen Rasterzeile 63 Taktzyklen verbrauchen. Da wir uns beim ersten Schleifendurchlauf genau in Rasterzeile $83 befinden, beginnt die Schleife also zunächst in einer normalen Rasterzeile (eine Zeile nach einer Charakterzeile). Hier wird die Schleife ab dem Label "LOOP2" bis zum Ende ("BCC LOOP2") abge- arbeitet. Wenn Sie jetzt die Taktzyklen am Rand innerhalb dieses Bereichs auf- addieren, so vergehen bis zum BCC-Befehl genau 60 Zyklen. Der BCC-Befehl hat nun eine ganz besondere Funktion. Alle Branch-Befehle verbrauchen nämlich bei nicht zutreffender Abfragebedingung nur zwei Taktzyklen (so auch beim zuvorigen BEQ-Befehl der das X-Register abfrägt). Trifft die Bedingung zu, so wie auch beim abschließenden BCC, so muß ver- zweigt werden, was einen weiteren, dritten Taktzyklus in Anspruch nimmt. Dadurch sind also genau 60+3=63 Takt- zyklen verstrichen, wenn die Schleife das nächste Mal durchlaufen wird. Und das ist genau die Zeit die vergehen muß, bis der Rasterstrahl in der nächsten Zeile ist, wo die Farbe erneut geändert werden kann. Kommt der Strahl nun wieder in eine Chakterzeile, so ist das X- Register auf Null heruntergezählt. Durch die zutreffende Abfragebedingung im BEQ- Befehl dauert die Verzweigung nun drei Takte. Vom Label "LOOP2" bis zu dem BEQ- Befehl verbrauchen wir also nach Adam Riese nun 19 Taktzyklen. Da der Branch- Befehl zum Label "LOOP1" verzweigt, und der dortige LDX-Befehl wiederum 2 Zyklen benötigt, sind genau 21 Takte verstri- chen, wenn sich der Prozessor wieder am Startpunkt, "LOOP2" nämlich, befindet. Und das ist wieder genau die Zeit die verstreichen musste, damit in der Charakterzeile der Rasterstrahl wieder am Anfang der folgenden Zeile steht! Sie sehen also, wie sehr es auf genaues Timing hier ankommt! Fügen Sie dieser Kerschleife auch nur einen Befehl hinzu, oder entfernen Sie einen, so gerät das gesamte Timing ausser Kontrolle und unsere Farbbalken erscheinen verzerrt auf dem Bildschirm. Probieren Sie es ruhig einmal aus! Zum Abschluß des Raster-IRQs schalten wir nun wieder die normalen Bildschirmfarben ein und verzweigen zum Betriebssystems-IRQ.
3) WEITERE PROGRAMMBEISPIELE
Außer den beiden bisher besprochenen Programmen finden Sie auf dieser MD noch drei weitere Beispiele, die lediglich Variationen des letzten Programms darstellen. Alle drei werden wie immer mit ",8,1" geladen und mit "SYS4096" gestartet. "RASTCOLOR2" entspricht haargenau "RASTCOLOR1", nur daß ich hier am Ende eine Routine hinzugefügt habe, die die Farbtabelle um jeweils eine Zeile weiterrotiert. Das Ergebnis des Ganzen sind rollende und nicht stehende Farbbalken. Die Programme "RASTSINUS1" und "-2" funktionieren nach einem ähnlichen Prinzip. Hier wird jedoch nicht die Farbe in den angegebenen Rasterzeilen verändert, sondern der horizontale Verschiebeoffset. Dadurch kann der entsprechende Bildbereich effektvoll verzerrt werden. Starten Sie "RASTSINUS1" und fahren Sie mit dem Cursor in die untere Bildschirmhälfte, so werden dort alle Buchstaben in Form einer Sinuskurve verzerrt. "RASTSINUS2" geht noch einen Schritt weiter. Hier werden die Werte der Sinustabelle, wie auch schon bei "RASTCOLOR2" am Ende der Interruptroutine gerollt, weswegen der gerasterte Bereich, wasserwellenähnlich hin- und her"schlabbert". Schauen Sie sich die Programme ruhig einmal mit Hilfe eines Speichermonitors an, und versuchen Sie ein paar Änderungen daran vorzunehmen. Im nächsten Kursteil werden wir noch ein wenig mehr mit Taktzyklen herumjonglieren und uns mit FLD- und Sideborder-Routinen beschäftigen.
(ub)