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)