Magic Disk 64

home to index to text: MD9502-KURSE-IRQ-KURS_16.2.txt
            IRQ-Kurs - 2.Teil           

Die FLD-Schleife benötigt für einen Durchlauf exakt eine Rasterzeile. In jedem Durchlaub wird vor Beginn der Charakterzeile durch die horizonale Verschiebung in $ D011 der Charakterzeilenanfang vor dem Rasterstrahl hergedrückt. Dies bewähltigen wir mit Hilfe einer Liste namens " Field1" . Sie wurde im Hauptprogramm der AGSP-Routine vorinitialisiert und befindet sich an Adresse $0100 . Es stehen dort Werte für $ D011, die die zur normalen Bildschirmdarstellung notwenidigen Bits gesetzt haben, und deren Bits für der horizontale Bitverschiebung jeweils um eine Rasterzeile 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 ( also auch jedem FLD-Durchlauf) in das Register $ D018, womit wir den Adressbereich des Video-RAMs verschieben. Die Tabelle enthält 20 Einträge, die das Video-RAM an Adresse $0000 legen, gefolgt von 44 Einträgen, die es an Adresse $0400 verschieben. Auf diese Weise schaltet Sie also exakt in der 21 . Rasterzeile nach Beginn der FLD-Routine auf den Bildschirm bei $0400 um, womit wir die Spritepointer auch auf diesen Bereich umschalten. Nach dieser 21 . Rasterzeile 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 Pointern zu zeichnen. Der Grund, warum dies über eine Tabelle geschehen muß, und nicht etwa durch Abpassen der entsprechenden 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 Rasterzeilen lang laufen muß, damit der Bildschirm 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 Umschaltungsaufgabe, 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 FLDoder schon in der VSP-Routine befindet!
d) DIE VSP-ROUTINE Nach FLD folgt die VSP-Routine, die sich von der ersteren nur darin unterscheidet, 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 VICinternen Adresszeiger selbiger erhöht und somit eine Charakterzeile überspringt:

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 ausgelesen und geschreiben werden. Um den VSP-Effekt zu erzielen kann dies hier nicht mehr direkt aufeinanderfolgen.
Ausserdem wird hier nicht mehr der nächste Tabellenwert von " Field1" gelesen, sondern der dritte Wert danach. Dies tun wir, um in jedem Fall eine $ D011- Wert zu schreiben, der die Charakterzeile mindestens 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 ( wieviele Rasterzeilen wir die Charakterzeile 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 geschriebenen $ 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 Charakterzeilenbeginn 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 Ausgleichen eines ggf. ungeraden Verzögerungszeitraums. Das Label " tt" wird von der Timingroutine verändert um so verschiedene 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 Horizonalen 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" eingetragen:
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. Allerdings muß sie auch irgendwie mit Basiswerten gefüttert werden, um das Timing für alle Fälle genau aufeinander anzustimmen. Dies übernehmen weitere Steuerroutinen, die wir im nächsten, und dann auch letzten Teil dieses Kurses besprechen werden.

                                    (ub)

Valid HTML 4.0 Transitional Valid CSS!