Magic Disk 64

home to index to html: MD9011-KURSE-CIA-KURS_TEIL_1-2.html
MD9011-KURSE-CIA-KURS_TEIL_1-2.koala.png
            CIA-Kurs Teil 2             
Wie man leicht erkennen  kann  sind  zur
Timerprogrammierung  sechs Register not-
wendig:                                 
* TA-LO (Reg.4)                         
* TA-HI (Reg.5)                         
* TB-LO (Reg.6)                         
* TB-HI (Reg.7)                         
* CRA   (Reg.14)                        
* CRB   (Reg.15)                        
Desweiteren brauchen wir auch  noch  das
Interrupt-Control-Register     (Reg.13).
Ohne dieses Register läuft  interruptmä-
ßig überhaupt nichts mit dem CIA.       
Der System-IRQ benutzt nun Timer A,  der
für  ihn den Auslöser darstellt. Deshalb
können wir die Register TB-LO,TB-HI  und
CRB  vorläufig  einmal  ausschließen und
uns nur den Registern für Timer A zuwen-
den.                                    
Zunächst möchte ich jedoch  den  Begriff
"Timer" definieren. Ein Timer, so wie er
pro  CIA  ja  zweimal vorhanden ist, ist
nichts anderes als ein spezielles  Zähl-
register,  das  ständig,  nach  ganz be-
stimmten Regeln von einem Maximalwert in
Einerschritten heruntergezählt wird. Ist
der Timer bei Null  angelangt,  so  wird
ein Interrupt ausgelöst.                
Den   schon  angesprochenen  Maximalwert
müssen wir, wie Sie sicher schon  vermu-
ten  in LO/HI-Byte aufgespaltet in TA-LO
und TA-HI schreiben. Diese Timerregister
haben quasi ein "Doppelleben".  Sie  be-
stehen nämlich zum Einen aus einem Spei-
cherregister,  dem  sogenannten  "LATCH"
und  einem Zählregister oder auch "COUN-
TER". Schreiben wir nun  einen  Wert  in
die   Timerregister,   so   wird  dieser
zunächst im Latch abgelegt  und  gleich-
zeitig  in  den Counter geladen. Starten
wir anschließend den Timer,  so  beginnt
der  CIA  damit, den Counter herabzuzäh-
len. Hierzu  kann man verschiedene  Sig-
nalquellen  wählen,  die ein Herabzählen
veranlassen. Diese Signalquellen, können
im Control-Register für Timer A  festge-
legt werden. Jedes der acht Bits in die-
sem Register steuert eine ganz bestimmte
Funktion. Desweiteren kann von hier auch
der Timer gestartet und gestoppt werden,
sowie einige bestimmte  Zählmodi  einge-
stellt  werden. Zur Erläuterung habe ich
Ihnen einmal eine Tabelle erstellt:     
Bit0 (START/STOP):                      
Durch Löschen dieses Bits wird der Timer
gestoppt. Setzt man es, so  wird  begon-
nen, den Counter herabzuzählen.         
Bit1 (PB ON/OFF):                       
Dieses  Bit  eignet  sich  besonders für
Hardware-Erweiterungen. Ist es  gesetzt,
so  wird  beim  Unterlauf des Timers ein
Signal auf die Portleitung PB6 (Bit 6 an
Port B) gelegt. Ist es gelöscht, so wer-
den keine Signale ausgegeben.           
Bit2 (TOGGLE-PULSE):                    
Dieses  Bit arbeitet nur in Zusammenhang
mit "PB ON/OFF". Ist dieses gesetzt,  so
gelten  folgende  Bestimmungen für "TOG-
GLE-PULSE":                             
* Wenn  gelöscht, so werden wie bei "PB-
  ON/OFF" beschrieben  Signale  auf  die
  Leitung  PB 7 gelegt. Diese sind übri-
  gens genau  einen  Prozessortaktzyklus
  lang.                                 
* Wenn gesetzt, so wird der Zustand  von
  PB6  bei  jedem Unterlauf des Counters
  in den jeweils anderen Zusand gekippt,
  das heißt von Gesetzt auf Gelöscht und
  umgekehrt. Damit läßt sich  also  ganz
  einfach  ein  Rechtecksignal erzeugen,
  wobei die Pulsbreite von der  Laufzeit
  des Counters abhängt.                 
Wie Sie sehen, sind die Bits 1 und 2 für
ganz spezifische Aufgaben verwendbar und
haben  leider  sehr wenig mit Interrupts
zu tun, zumal  kein  Interruptsignal  an
den  Prozessor  gesand  wird. Für manche
Harwareerweiterungen  sind  Sie   jedoch
bestimmt sinnvoll einzusetzen, da man so
sehr  einfach  beliebige  Taktfrequenzen
für irgendewelche Schaltungen  am  User-
Port  des C64 erzeugen kann, da die Lei-
tung PB6 an selbigem herausgeführt  ist.
Hierzu jedoch in einem späteren Kursteil
mehr.                                   
Bit3 (ONE-SHOT/CONTINOUS):              
Ist dieses  Bit  gelöscht,  so  befindet
sich  der  Timer im CONTINOUS-Modus. Das
heißt, daß der Counter bis  0  herunter-
gezählt,  wieder  mit  dem Wert im Latch
geladen wird und von  neuem  beginnt  zu
zählen.                                 
Bei gesetztem Bit ist der ONE-SHOT-Modus
aktiv - es wird bis 0  gezählt  und  neu
geladen,  jedoch  stoppt der Timer jetzt
automatisch, solange bis man ihn  wieder
mit  Bit0  des  Controlregisters in Gang
setzt.                                  
Bit4 (FORCE-LOAD):                      
Wird dieses Bit  gesetzt,  so  wird  der
Counter,  egal  ob  der  Timer im Moment
läuft oder nicht, mit dem Wert im  Latch
neu geladen.                            
Bit5 (IN MODE):                         
Hier  wird  die   Quelle   des   "Timer-
Triggers"  festgelegt. Der Timer-Trigger
ist die Einrichtung, die  den  CIA  dazu
veranlaßt  den  Counter einmal herunter-
zuzählen.                               
Ist  dieses  Bit  gelöscht  (was bei uns
eigentlich immer der Fall ist), so  wird
der  Systemtakt als Trigger herangezogen
(das werden  wir  im  nächsten  Abschitt
ganz  genau behandeln). Ist es gelöscht,
so ist die CNT-Leitung des CIA der Trig-
ger.  Diese  ist an den Userport heraus-
geführt, so  daß  somit  auch  Hardware-
Erweiterungen  in  der Lage sind die In-
terrupts im 64er extern zu steuern.     
Bit6 (SP-DIRECTION):                    
Dieses Bit hat etwas mit Register 12 der
CIA  zu  tun  (SDR). Dieses Register ist
für die serielle  Datenübertragung  sehr
nützlich.  Hier  kann ein 8-Bit-Wert ge-
speichert werden, der zyklisch  aus  dem
Register  heraus,  an den Pin SP des CIA
(mit  dem  Userport  verbunden)  gerollt
wird, beziehungsweise ein Wert kann über
den  Pin  SP  hereingerollt werden (auch
dazu in einem späteren Kursteil mehr).  
Bit6  von CRA steuert nun die Datenrich-
tung von SDR. Ist es  gelöscht,  so  ist
SDR  auf Eingang geschaltet (Bits werden
hereingerollt), ist es gesetzt, so  wird
SDR  als  Ausgang  benutzt  (Bits werden
herausgerollt).                         
Bit7 (POWER FREQUENCY):                 
Dieses Bit wird benötigt um den Trigger-
frequenz für die Echtzeituhr des CIAs zu
bestimmen. Je nach dem, in welchem  Land
wir  unseren  64er  angeschlossen haben,
beträgt die  Netzfrequenz  des  Wechsel-
stroms aus der Steckdose nämlich 50 oder
60 Hertz (man spricht hier vom sogenann-
ten "technischen Strom"). Diese Frequenz
wird nun benutzt  um  die  Zeiteinheiten
der  Echtzeituhr festzustellen. Ist die-
ses Bit nun gesetzt, so gilt  eine  Fre-
quenz  von  50  Hz  als  Trigger, ist es
gelöscht, eine von 60 Hz. Da wir in  der
Bundesrepublik Deutschland ja die von 50
Hz  haben, sollte bei Uhr-Betrieb dieses
Bit also immer gesetzt sein, da  andern-
falls  unsere  Uhr  schnell  "nachgehen"
könnte.                                 
Na das ist doch schon eine  ganze  Menge
an  Information.  Doch  keine Angst, die
Bits 1 und 2,  die  etwas  komplizierter
erscheinen  mögen,  wollen wir vorläufig
erst einmal wegfallen lassen. Von  ihnen
wird,  ebenso  wie  von  Bit 6 und 7, in
einer späteren Folge dieses Kurses  mehr
die Rede sein.                          
Nun zum Systemtakt, der -in aller Regel-
als  Timer-Trigger dient. Er stellt wohl
einen der wichtigsten Grundbausteine  in
unserem  (wie  auch  in  jedem  anderen)
Rechner dar. Ein Rechensystem, so wie es
von  einem  Computer  verkörpert   wird,
braucht  schlichtweg  IMMER einen Grund-
takt, den alle  miteinander  verknüpften
Bausteine  benutzen  können  um synchron
miteinander zu arbeiten. Er dient  sozu-
sagen  als  "Zeitmaß" für die Geschäfts-
welt in einem  Rechner.  Ein  Taktzyklus
stellt die elementare Zeiteinheit inner-
halb eines Rechner dar, an den sich alle
Bausteine halten  müssen  um  mit  ihren
Signalen  nicht  zu  kollidieren. Solche
Takte werden  von  Quarz-Bausteinen  er-
zeugt, die, je nach chemischer Zusammen-
setzung, eine ganz  bestimmte  Eigenfre-
quenz  haben,  die extrem genau ist (wie
von Quartz-Uhren her  ja  allgemein  be-
kannt).                                 
Ein  Systemtakt ist von Rechner zu Rech-
ner verschieden. Beim AMIGA  beträgt  er
zum  Beispiel 7.16 MHz (Megahertz), beim
ATARI ST 8  MHz,  bei  PCs  mittlerweile
zwischen  4.77 und 33 MHz (und mehr). Je
höher ein Rechner "getaktet" ist,  desto
mehr  Befehle  kann er pro Sekunde abar-
beiten und desto schneller ist er;  wes-
halb  die  Taktfrequenz  häufig auch als
ein Maß  für  die  Rechengeschwindigkeit
eines Rechners herangezogen wird.       
Der C64 schneidet hier, aufgrund  seiner
schon  etwas älteren Entwicklung und dem
Fakt, daß er halt einfach nur ein  Home-
computer  (der  für  jeden erschwindlich
sein soll) ist, relativ schlecht ab. Mit
etwa 1 MHz ist er vergleichsmäßig  lang-
sam,  was jedoch immer noch affenschnell
ist! Um genau zu sein sind  es  985248.4
Hz  (also  knapp  ein Mhz). So zumindest
bei der europäischen Version, die Sie ja
alle haben sollten.  Die  amerikanischen
64er sind sogar noch ein wenig schneller
(nämlich  1022727.1 Hz), was für uns je-
doch unerheblich ist.                   
Doch was bedeutet diese Zahl nun eigent-
lich  für uns. Sie bedeutet schlichtweg,
daß  wir  pro  Sekunde  genau   985248.4
Taktzyklen  haben;  und die brauchen wir
ja als Timer-Trigger. Damit wird es ein-
fach,  die  Dauer zwischen zwei Counter-
Unterläufen  zu  berechnen.  Angenommen,
Sie  wollten (aus welchem Grund auch im-
mer), daß jede 1/16-Sekunde  ein  Inter-
rupt ausgelöst würde. Demnach müßten Sie
den Systemtakt einfach durch 16 dividie-
ren und das Ergebnis in LO/HI-Byte  auf-
gespalten  in die Register TA-LO und TA-
HI schreiben. Konkret wäre das:         
985248.4 / 16 = 61578.025 (dez.)        
                $F08A     (hex.)        
                LO: $8A = 138           
                HI: $F0 = 240           
Schreiben Sie diese beiden Werte nun  in
die  Register  4 und 5 des CIA1, so wird
der Systeminterrupt, der ja durch  Timer
A  der  CIA1  gesteuert  wird, eindeutig
verlangsamt (normalerweise tritt er näm-
lich  jede  1/60-Sekunde  auf). Erkennen
können Sie dies am  langsameren  Cursor-
blinken, da auch das vom Systeminterrupt
erledigt  wird.  Probieren  Sie  es doch
einfach einmal, also:                   
POKE 56320+4,138:POKE 56320+5,240       
(56320 ist die Basisadresse von CIA1!)  
So.  Nun  wissen  Sie  also, wie man den
Timer A eines CIA programmiert. Da  die-
ser für IRQs jedoch schon vom Betriebsy-
stem benutzt wird, und es da  möglicher-
weise  Timing-Probleme  gibt,  wenn  wir
eine eigene IRQ-Routine  schreiben  wol-
len,  die  zwar  parallel zum Betriebsy-
stem-IRQ läuft, aber öfter oder  weniger
oft  als  dieser auftreten soll, so gibt
es für uns auch die Möglichkeit auf  Ti-
mer  B  auszuweichen. Dieser ist absolut
analog zu bedienen,  nur,  daß  wir  die
Timerwerte diesmal in die Register 6 und
7  der  CIA  schreiben müssen (TB-LO und
TB-HI). Desweiteren wird er vom Control-
Register-Timer-B (CRB) gesteuert - Regi-
ster 15 der CIA also. Bis  auf  kleinere
Unterschiede,  ist  der Aufbau der Regi-
ster CRA und  CRB  identisch.  Hier  die
Unterschiede:                           
1) Grundsätzlich sind die Funktionen der
   Bits  0  bis 4 gleich, jedoch mit dem
   Unterschied, daß sich die Bits 1  und
   2  nicht mehr auf PB6 sondern auf PB7
   beziehen.                            
2) Bit 5 und 6 steuern den  IN-MODE  von
   Timer  B (bei CRA war das NUR Bit 5).
   Hierzu ergeben  sich  4  verschiedene
   Timer-Trigger-Modi:                  
   Bit 5 6  Funktion                    
   -------------------------------------
       0 0  Zähle Systemtakt            
       0 1  Zähle CNT-Flanken           
       1 0  Zähle Unterläufe von Timer A
       1 1  Zähle Unterläufe  von  Timer
            A, wenn CNT=1               
   Somit  kann  Timer  B  bei  Steuerung
   durch  Hardware  bestens   eingesetzt
   werden,  da  mehr  externe  Steuermö-
   glichkeiten  (durch  CNT)   vorhanden
   sind.                                
3) Bit 7 steuert die  Alarmfunktion  der
   Echtzeituhr.  Ist es gesetzt, so wer-
   den die Werte, die man in  die  Regi-
   ster  der  Echtzeituhr schreibt (dazu
   auch in einem späteren Kursteil)  als
   Alarmzeit  genommen. Ist es gelöscht,
   so kann die  normale  Uhrzeit  einge-
   stellt werden.                       
Da die beiden Register CRA und CRB eben-
falls eine sehr  wichtige  Funktion  bei
den vielseitigsten Anwendungen erfüllen,
habe  ich  Ihnen  einmal  eine grafische
Öbersicht angefertigt:                  
Valid HTML 4.0 Transitional Valid CSS!