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: