Magic Disk 64

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



Valid HTML 4.0 Transitional Valid CSS!