IRQ-Kurs - 2.Teil
----------------------------------------
Die FLD-Schleife benötigt für einen
Durchlauf exakt eine Rasterzeile. In
jedem Durchlaub wird vor Beginn der Cha-
rakterzeile durch die horizonale Ver-
schiebung in $D011 der Charakterzeile-
nanfang vor dem Rasterstrahl her-
gedrückt. Dies bewähltigen wir mit Hilfe
einer Liste namens "Field1". Sie wurde
im Hauptprogramm der AGSP-Routine vori-
nitialisiert und befindet sich an Adres-
se $0100. Es stehen dort Werte für
$D011, die die zur normalen Bildschirm-
darstellung notwenidigen Bits gesetzt
haben, und deren Bits für der horizonta-
le Bitverschiebung jeweils um eine Ra-
sterzeile erhöht werden, und bei acht
Rasterzeilen Verschiebung wieder auf 0
zurückgesetzt sind. Die Tabelle ist 64
Einträge lang und enthält somit für jede
Rasterzeile ab dem Beginn der FLD-
Routine einen passenden Wert für die
$D011-Verschiebung. Sie wird ebenso in
der VSP-Routine verwendet. Die Tabelle
"Field2" erfüllt einen ähnlichen Zweck:
Sie enthält Werte für Register $D018,
befindet sich an Adresse $0140 und
enthält ebenfalls 64 Werte. Auch ihre
Werte gelangen in jeder Rasterzeile (al-
so auch jedem FLD-Durchlauf) in das Re-
gister $D018, womit wir den Adressbe-
reich des Video-RAMs verschieben. Die
Tabelle enthält 20 Einträge, die das
Video-RAM an Adresse $0000 legen, ge-
folgt von 44 Einträgen, die es an Adres-
se $0400 verschieben. Auf diese Weise
schaltet Sie also exakt in der 21. Ra-
sterzeile nach Beginn der FLD-Routine
auf den Bildschirm bei $0400 um, womit
wir die Spritepointer auch auf diesen
Bereich umschalten. Nach dieser 21. Ra-
sterzeile hat der VIC nämlich gerade die
erste Spritereihe fertiggezeichnet und
wir bringen ihn so also dazu die auch
noch die zweite Reihe mit anderen Poin-
tern zu zeichnen. Der Grund, warum dies
über eine Tabelle geschehen muß, und
nicht etwa durch Abpassen der entspre-
chenden Position und dem dann folgenden
Umschalten liegt auf der Hand: Braucht
die der FLD-Routine folgende VSP-Routine
z.B. 25 Rasterzeilen, um den Bildschirm
25 Charakterzeilen tiefer darzustellen,
so läuft unsere FLD-Routine nur einmal
durch und endet, wenn die Sprites noch
längst nicht ganz fertig gezeichnet
sind. Umgekehrt kann es auch passieren,
daß die VSP-Routine keine Zeit benötigt,
weil keine Verschiebung notwendig ist,
und deshalb die FLD-Routine 25 Raster-
zeilen lang laufen muß, damit der Bild-
schirm an derselben Position wie im
letzten Frame erscheint. In dem Fall muß
das Umschalten von der FLD-Routine
durchgeführt werden. Benutzen allerdings
beide Routinen ein und dieselbe Tabelle
und denselben Index darauf, so übernimmt
automatisch die Routine die Umschaltung-
saufgabe, die gerade an der Reihe ist,
ohne, daß wir etwas dazutun müssen! Dies
mag verwirrender klingen als es ist: Im
Endeffekt stellt die Tabelle sicher, daß
immer in der 21. Rasterzeile seit FLD-
Beginn, die Spritepointer umgeschaltet
werden - unabhängig davon, ob sich der
Prozessor zu diesem Zeitpunkt noch in
der FLD- oder schon in der VSP-Routine
befindet!
d) DIE VSP-ROUTINE
Nach FLD folgt die VSP-Routine, die sich
von der ersteren nur darin unterschei-
det, daß sie mit zwei Zyklen Verzögerung
die Änderungen in $D011 einträgt und
somit nicht nur den Beginn der nächsten
Charakterzeile, sondern auch den VIC-
internen Adresszeiger selbiger erhöht
und somit eine Charakterzeile über-
springt:
vsp: inx ;Alter FLD-Zähler=
stx <vspcnt ; VSP-Zähler+1
nop ;8 Takte verzögern
nop
nop
nop
vsplp:nop ;8 Takte verzögern
nop
nop
nop
ldx field1+3,y;Wert aus d011-Tab+3
stx $d011 ; nach $D011 kop.
nop ;Nochmals 6 Takte
nop ; verz. (Ausgleich
nop ; zu FLD)
lda field2,y ;Wert aus d018-Tab
sta $d018 ; nach $D018 kop.
nop ;4 Zyklen bis Ende
nop ; verz.
iny ;Tab-Index+1
dec <vspcnt ;VSP-Zähler-1
bne vsplp ;<>0 -> Weiter
bit $ea ;Sonst 7 Takte
nop ; verzögern
nop
Wie Sie sehen, ist dies quasi unsere
FLD-Routine. Einziger Unterschied liegt
in der Art, wie die beiden Tabellen aus-
gelesen und geschreiben werden. Um den
VSP-Effekt zu erzielen kann dies hier
nicht mehr direkt aufeinanderfolgen.
Ausserdem wird hier nicht mehr der näch-
ste Tabellenwert von "Field1" gelesen,
sondern der dritte Wert danach. Dies tun
wir, um in jedem Fall eine $D011-Wert zu
schreiben, der die Charakterzeile minde-
stens 1 Rasterzeile vor den Rasterstrahl
drückt. Durch die Zeit die zwischen FLD
und VSP vergeht haben wir nämlich auch
schon eine Charakterzeile verloren, und
damit der Y-Index nicht unnötig erhöht
werden muß greifen wir einfach auf einen
weiter entfernten Tabellenwert zu (wie-
viele Rasterzeilen wir die Charakterzei-
le vor uns herschieben ist ja egal - es
zählt nur, daß sie vor uns hergeschoben
wird)! Die Anzahl der VSP-
Schleifendurchläufe wird durch den FLD-
Zähler ermittelt. In der FLD-Routine
wurde das X-Register mit dem Wert $27
initialisiert. Nach Abzug der FLD-
Durchläufe enthält das X-Register nun
noch die erforderliche Anzahl VSP-
Durchläufe, die in dem Label "VSPCNT"
(Zeropageadresse $069) bgelegt wird und
von nun an als Zähler dient.
e) DIE HSP-ROUTINE
Nun folgt dem ganzen noch die HSP-
Routine, die Sie ja noch aus dem letzten
Kursteil kennen. Wir schreiben hier
zunächst den nächsten Wert der Field1-
Tabelle in $D011 und verzögern dann bis
zum gewünschten Punkt um den geschriebe-
nen $D011-Wert-1 zu schreiben, mit dem
die horizontale Bildverschiebung erzielt
wird:
HSP: ldx field1+3,y;nächst. d011-Wert
stx $d011 ;schreiben
jsr cycles ;Anfang sichtb.
; Bildschirm abwart.
dex ;d011-Wert-1
redu1:beq redu2 ;Ausgleich für unge-
redu2:bne tt ; rade Zyklen
nop ;Insgesamt 20
... ; NOPs für das
nop ; HSP-Timing
tt stx $d011 ;akt.Z. einschalt.
Hier also drücken wir zunächst den Cha-
rakterzeilenbeginn vor den Rasterstrahl
und warten bis zum benötigten Zeitpunkt
um die vertikale Bildschirmverschiebung
um eine Rasterzeile herunterzustellen
und so den HSP-Effekt zu erzielen. Die
merkwürdige BEQ/BNE-Folge dient dem Aus-
gleichen eines ggf. ungeraden Verzöge-
rungszeitraums. Das Label "tt" wird von
der Timingroutine verändert um so ver-
schiedene Zeitverzögerungen innerhalb
der 20 NOPs zu erreichen.
f) DAS SOFTSCROLLING
Dies ist die leichteste Aufgabe unserer
IRQ-Routine. Es werden hier lediglich
die Softscrollingwerte in der Horizona-
len und Vertikalen in die Register $D016
und $D011 eingetragen. Die zu schreiben-
den Werte wurden von der Timing-Routine
berechnet und in den Operanden der LDA-
Befehle bei "HORIZO" und "VERTIC" einge-
tragen:
horizo lda #$00 ;Versch. vom linken
sta $d016; Bildrand
vertic lda #$00 ;Versch. vom oberen
sta $d011; Bildrand
ldx #$57 ;Verzögerungsschleife
w1 dex ;bis Bildanfang
bne w1
ldy #$17 ;Video-RAM bei $0400
sty $d018; einsch.
lda $d011;$D011 laden
and #$1F ; relev. Bits ausmask.
sta $d011; und schreiben
lda #$0e ;Bildschirmfarben
sta $d020; zurücksetzen
lda #$06
sta $d021
pla ;Prozessorregs. vom
tay ; Stapel holen und IRQ
pla ; beenden.
tax
pla
rti
Soviel nun also zu unserer IRQ-Routine.
Sie eredigt für uns die entsprechenden
Aufgaben zur Bildverschiebung. Aller-
dings muß sie auch irgendwie mit Basis-
werten gefüttert werden, um das Timing
für alle Fälle genau aufeinander anzu-
stimmen. Dies übernehmen weitere Steuer-
routinen, die wir im nächsten, und dann
auch letzten Teil dieses Kurses bespre-
chen werden.
(ub)