Magic Disk 64

home to index to html: MD9502-KURSE-IRQ-KURS_16.2.html
            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)



Valid HTML 4.0 Transitional Valid CSS!