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)