Magic Disk 64

home to index to html: MD9103-KURSE-CIA-KURS_TEIL_5-3.html
Na? Wissen Sie  wo?  Natürlich!  Ab  dem
Befehl  "STA CIA2+14"  war der Timer ak-
tiv. Der anschließende JSR-Befehl gehört
nun aber noch nicht in die  zu  testende
Routine, wurde aber trotzdem mitgezählt.
Ebenso  wie  die  Befehle "LDA #$80" und
"STA CIA2+14". Erst dann war  der  Timer
wieder  aus.  Die hier erwähnten Befehle
wurden  also  alle  mitgezählt.  Deshalb
müssen  wir  nun noch von unserem Gesam-
tergebnis die Anzahl der Takte  die  sie
verbrauchten   subtrahieren.   Ein  JSR-
Befehl braucht immer 6  Taktzyklen,  das
direkte  Laden des Akkus 2 und das abso-
lute Entleeren des Akkus 4. Demnach  ha-
ben wir also 6+2+4=12 Taktzyklen zuviel,
die  nun von der folgenden Subtraktions-
routine von dem  Gesamtwert  subtrahiert
werden:                                 
-------------------                     
     SEC           Carry setzen.        
     SBC #12       Vom Akku (=TALO, in  
                   $65) 12 subtrahieren.
     BCS L1        Wenn kein Unterlauf, 
                   dann auf Ende ver-   
                   zweigen.             
     DEC $64       Sonst nächsthöheres  
                   Byte -1.             
     LDX $64       Prüfen, ob dieses    
     CPX #$FF      untergelaufen ist,   
     BNE L1        Nö, also zum Ende.   
     DEC $63       Ja, also nächsthöhe- 
                   res Byte -1          
     LDX $63       Prüfen, ob dieses    
     CPX #$FF      untergelaufen ist,   
     BNE L1        Nö, also zum Ende.   
     DEC $62       Sonst, das höchste   
                   Byte -1 (ohne Prü-   
                   fung, weil es nicht  
                   unterlaufen kann!)   
L1   STA $65       Alles klar, also Akku
                   im niedrigsten Byte  
                   sichern.             
-------------------                     
Ich erspare mir  hier  einen  Kommentar,
weil  Sie bestimmt schon wissen, wie man
zwei Integerzahlen in  Assembler  vonei-
nander  subtrahiert.  Ich  will nur noch
darauf hinweisen, daß am  Anfang  dieses
Programmteils  der  Inhalt von Speicher-
zelle $65 ja immer noch im  Akku  steht,
da   die  Komplementierungsschleife  von
vorhin ihn dort  noch  hat  stehen  las-
sen...                                  
So. Nun hätten wir also die tatsächliche
Anzahl  der  Taktzyklen  als Longword im
FAC stehen. Nun müssen wir sie nur  noch
ausgeben. Hierzu möchte ich eine Routine
des  Betriebssystems  benutzen,  die den
Inhalt des FAC in  ASCII-Code  umwandelt
und  ihn  anschließend  ab $0100 ablegt.
Nach dem letzten ASCII-Zeichen fügt  sie
noch  ein  Nullbyte  ein, was später von
Bedeutung sein wird.                    
Zunächst haben wir noch ein kleines Pro-
blem - die  erwähnte  Umwandlungsroutine
("FACTOASC" ist übrigens ihr Name), ver-
langt  nämlich   reine   Floating-Point-
Zahlen  im  FAC. Diese haben ein eigenes
Format, nämlich das MFLPT-Format. Leider
entspricht  unser  32-Bit-Integer   aber
noch  nicht  diesem  Format, weshalb wir
ihn erst "normieren" müssen.  Was  dabei
passiert,  und wie das MFLPT-Format aus-
sieht möchte ich hier auslassen, weil es
den Rahmen dieses Kurses sprengen würde.
Geben Sie sich einfach zufrieden  damit,
daß  der  nun folgende Programmabschnitt
von EVAL einfach eine 32-Bit-Zahl im FAC
normiert:                               
-----------------                       
      LDA #$A0   Exponent initialisie-  
      STA $61    ren.                   
LOOP2 LDA #$62   Höchstes Byte laden,   
                 und prüfen, ob höchstes
                 Bit gesetzt.           
      BMI L2     Ja, also fertig!       
      DEC $61    Nein, also die ganze   
      ASL $65    Mantisse um 1          
      ROL $64    nach                   
      ROL $63    links                  
      ROL $62    rollen.                
      BCC LOOP2  Wenn Carrybit gelöscht,
                 wiederholen            
-----------------                       
L2    ...        Sonst weiter...        
So. Jetzt können wir aber endlich die   
Taktzyklenanzahl ins ASCII-Format umwan-
deln, also rufen wir FACTOASC auf. Die  
Einsprungsadresse dieser Routine lautet 
übrigens: $BDDD (dez. 48605).           
Nun  haben wir also den ASCII-Text unse-
rer Zahl im Speicher  ab  $0100  stehen.
Jetzt  müssen  wir  ihn nur noch auf den
Bildschirm bringen. Dies geschieht  mit-
tels  der  Routine STROUT. Sie ist eben-
falls  eine  Betriebssystemroutine   und
steht ab $AB1E. Als Parameter müssen wir
ihr die Anfangsadresse des auszugebenden
Textes  in  LO/HI  im  Akku  und  im  Y-
Register übergeben. Das Textende erkennt
sie an einem Nullbyte am Ende  des  Tex-
tes,  das  FACTOASC ja freundlicherweise
schon eingefügt hat. Kommen wir nun also
zum letzten Teil von EVAL:              
--------------------                    
L2    JSR FACTOASC  Erst FAC in ASCII   
                    umwandeln.          
      LDA #<(TXT1)  Jetzt geben wir zu- 
      LDY #>(TXT1)  nächst den Text "BE-
                    NOETIGTE TAKTZY-    
                    KLEN:"              
      JSR TXTOUT    aus.                
      LDA #00       Nun kommt die Takt- 
      LDY #01       zyklenanzahl auf den
      JSR TXTOUT    Bildschirm.         
      LDA #13       Zum Schluß Cursor in
      JMP BSOUT     die nächste Zeile   
                    setzen.             
--------------------                    
TXT1  .TX "BENOETIGTE TAKTZYKLEN:"      
      .BY 0                             
--------------------                    
So. Das wars. Die letzten beiden Befehle
am Ende des Listings geben nun noch  ein
"Carriage  Return" aus, damit der Cursor
nicht am Ende der Taktzyklenzahl stehen-
bleibt.  Mit  dem  JMP  auf  BSOUT  (bei
$FFD2) beenden wir dann EVAL. Der  Rech-
ner  kehrt direkt von dort in den Einga-
bemodus zurück.                         
Damit sind wir dann auch wieder am  Ende
eines  CIA-Kurses  angelangt. Ich hoffe,
Sie kennen sich jetzt mit der  Timerkop-
plung  aus.  Wenn Sie wollen, können Sie
ja einmal versuchen, einen Interrupt von
einem 32-Bit-Timer auslösen  zu  lassen,
das Know-How sollten Sie aus den vorher-
gehenden Kursteilen schon haben.        
In  diesem Sinne möchte ich mich nun bis
nächsten Monat von Ihnen  verabschieden,
wenn wir uns einmal die Echtzeituhren in
den CIAs anschauen wollen.              
Bis dann,                               
                   Ihr Uli Basters (ub).
PS: Zum Test von EVAL laden Sie den As- 
    semblercode bitte absolut in den    
    Speicher und sorgen Sie dafür, daß  
    ihr Testprogramm bei Adresse $C000  
    beginnt. Nun rufen Sie EVAL einfach 
    mit "SYS 36864" auf.                
Valid HTML 4.0 Transitional Valid CSS!