Der Commodore 64 enthält zwei 6526 "Complex Interface Adaptor" (CIA) Chips, die große Ähnlichkeit zu den
6522 VIAs aufweisen. Eingabegeräte (Knöpfe und ähnliches) oder Ausgabegeräte (wie Lichter) können über einen
Puffer direkt mit dem Chip verbunden werden, und können direkt über eine Speicherstelle angesprochen werden.
Diese Chips haben auch andere interessante Fähigkeiten wie die zwei eingebauten 16-Bit Timer und eine
Echtzeituhr mit Alarm.
Die Parallelports
Die Register 0 und 1 des Chips sind acht Bit breite parallele Datenanschlüsse. Mittels der Datenrichtungsregister
(Register 2 und 3 des CIA-Chips) kann jedes der Bits individuell auf Eingabe oder Ausgabe programmiert werden.
Wenn ein Bit im Datenrichtungsregister 2 gesetzt ist, ist das entsprechende Bit in Register 0 auf Ausgabe programmiert.
Wenn ein Bit im Datenrichtungsregister 2 gelöscht ist, ist das entsprechende Bit in Register 0 auf Eingabe programmiert.
Dasselbe gilt für die Register 1 und 3.
Die Echtzeituhren
Die Echtzeituhr ist eine auf eine Zehntelsekunde genaue 24 Stunden Uhr. Jede Uhr ist in vier Register
aufgeteilt: Zehntel, Sekunden, Minuten, Stunden. Ein AM/PM flag befindet sich beim MSP des Stundenregisters.
Jedes Register ist im BCD-Format. Zusätzlich zur Zeitanzeige kann auch eine Alarmfunktion eingestellt werden.
Diese erzeugt zu einer gegebenen Zeit einen Interrupt. Da die Uhren ihren Referenztakt von der Netzfrequenz
beziehen, sind sie recht genau.
Die Timer
Jede 6526 CIA enthält zwei 16-Bit Intervalltimer: Timer A und Timer B. Diese Timer können unabhängig
voneinander verwendet oder gekoppelt werden, um einen 32-Bit Timer zu erhalten. Diese TImer können auf eine
Vielzahl von Timingmodi eingestellt werden, um Zeitverzögerungen, Wellelformen mit variabler Frequenz und
ähnliches zu erzeugen. Sie können auch verwendet werden um externe Eingaben zu zählen, Pulsbreiten oder
Verzögerungszeiten von externen Quellen zu messen. All diese Funktionen werden völlig unabhängig von der
CPU abgearbeitet. Diese Zähler können auch dafür verwendet werden die internen Taktzyklen des Rechners zu
zählen. Mittels des eingebauten 1 Mhz Taktgenerators können Ereignisse bei einer auflösung von bis zu einer
Mikrosekunde (.000001 second) getimed werden.
Register
Register 0 (PRA) / $0: |
76543210 |
RW |
Entsprechen dem Zustand der Pins PA 0-7 |
|
|
Register 1 (PRB) / $1: |
76543210 |
RW |
Entsprechen dem Zustand der Pins PB 0-7 |
|
|
Register 2 (DDRA) / $2: |
76543210 |
RW |
Bestimmen die Datenrichtung der Pins von Port A: |
0 = Eingang 1 = Ausgang |
|
Register 3 (DDRB) / $3: |
76543210 |
RW |
Bestimmen die Datenrichtung der Pins von Port B: |
0 = Eingang 1 = Ausgang |
|
Register 4 (TA LO) / $4: |
76543210 |
R |
Niederwertiges Byte von Timer A lesen |
|
76543210 |
W |
Niederwertiges Byte von Timer A neu setzen |
|
|
Register 5 (TA HI) / $5: |
76543210 |
R |
Höherwertiges Byte von Timer A lesen |
|
76543210 |
W |
Höherwertiges Byte von Timer A neu setzen |
|
|
Register 6 (TB LO) / $6: |
76543210 |
R |
Niederwertiges Byte von Timer B lesen |
|
76543210 |
W |
Niederwertiges Byte von Timer B neu setzen |
|
|
Register 7 (TB HI) / $7: |
76543210 |
R |
Höherwertiges Byte von Timer B lesen |
|
76543210 |
W |
Höherwertiges Byte von Timer B neu setzen |
|
|
Register 8 (TOD 10) / $8: |
....3210 |
R |
Zehntelsekunden der Echtzeituhr im BCD-Format |
|
....3210 |
W und CRB Bit 7 gelöscht |
Zehntelsekunden im BCD-Format |
|
....3210 |
W und CRB Bit 7 gesetzt |
Vorwahl der Zehntelsekunden der Alarmzeit im BCD-Format |
|
7654.... |
R |
Immer 0 |
|
|
Register 9 (TOD SEC) Schreibzugriffe analog zu Register 8 / $9: |
....3210 |
R |
Einersekunden der Uhr im BCD-Format |
|
.654.... |
R |
Zehnersekunden der Uhr im BCD-Format |
|
7....... |
R |
Immer 0 |
|
|
Register 10 (TOD MIN) Schreibzugriffe analog zu Register 8 / $a: |
....3210 |
R |
Einerminuten der Uhr im BCD-Format |
|
.654.... |
R |
Zehnerminuten der Uhr im BCD-Format |
|
7....... |
R |
Immer 0 |
|
|
Register 11 (TOD HR) Schreibzugriffe analog zu Register 8 / $b: |
....3210 |
R |
Einerstunden der Uhr im BCD-Format |
|
.654.... |
R |
Zehnerstunden der Uhr im BCD-Format |
|
7....... |
R |
Immer 0 |
|
|
Register 12 (SDR) / $c: Serial Data Register |
76543210 |
RW |
Aus diesem Register werden die Daten bitweise zum Pin SP hinausgeschoben, bzw. vom Pin SP in dieses Register hineingeschoben |
|
|
Register 13 (ICR) / $d: Interruptkontrollregister |
.......0 |
R |
gesetzt = Unterlauf Timer A |
|
......1. |
R |
gesetzt = Unterlauf Timer B |
|
.....2.. |
R |
gesetzt = Gleichheit von Uhrzeit und gewählter Alarmzeit |
|
....3... |
R |
gesetzt = SDR voll oder leer, abhängig von der Betriebsart |
|
...4.... |
R |
gesetzt = Signal am Pin FLAG aufgetreten |
|
.65..... |
R |
Immer 0 |
|
7....... |
R |
Übereinstimmung mindestens eines Bits von INT MASK und INT DATA aufgetreten |
|
7....... |
W |
Bei Schreibzugriffen und gesetzem 7er Bit setzt jedes gesetzte Bit das korrespondierende Masken-Bit. Die anderen bleiben unberührt. |
|
7....... |
W |
Bei Schreibzugriffen und gelöschtem 7er Bit löscht jedes gelöschte Bit das korrespondierende Masken-Bit. Die anderen bleiben unberührt. |
|
|
Register 14 (CRA) / $e: Kontrollregister A |
.......0 |
RW |
|
gesetzt = Timer A Start gelöscht = Timer A Stop |
......1. |
RW |
|
gesetzt = Unterlauf von Timer A wird an Pin PB6 signalisiert |
.....2.. |
RW |
|
gesetzt = jeder Unterlauf von Timer A kippt PB6 in die jeweils andere Lage gelöscht = jeder Unterlauf von Timer erzeugt an PB6 einen Hi-Impuls mit der Länge eines Systemtakts |
....3... |
RW |
|
gesetzt = Timer A zählt nur einmal vom Ausgangswert auf null und hält dann an gelöscht = Timer A zählt fortlaufend vom Ausgangswert auf null |
...4.... |
RW |
|
gesetzt = Unbedingtes Laden eines neuen Startwertes in Timer A. Dieses Bit fungiert als Strobe. Es muß vor jedem unbedingten Laden neu gesetzt werden. |
..5..... |
RW |
Dieses Bit bestimmt die Quelle des Timer-Triggers. |
gesetzt = Timer zählt steigende CNT-FLanken gelöscht = Timer zählt Systentaktpulse |
.6...... |
RW |
|
gesetzt = SP ist Ausgang gelöscht = SP ist Eingang |
7....... |
RW |
gesetzt = Echtzeituhr-Trigger beträgt 50 hz gelöscht = Echtzeituhr-Trigger beträgt 60 hz |
|
|
Register 15 (CRB) / $f: Kontrollregister B |
...43210 |
RW |
Diese Bits haben die gleiche Bedeutung wie in Register 14, allerdings bezogen auf Timer B und Pin PB7 |
|
.65..... |
RW |
Diese Bits bestimmen die Quelle des Triggers für Timer B. |
00 = Timer zählt Systemtakte 01 = Timer zählt steigende CNT-Flanken 10 = Timer B zählt Unterläufe von Timer A 11 = Timer B zählt Unterläufe von Timer A, wenn CNT gesetzt ist. |
7....... |
RW |
|
gesetzt = Alarm setzen gelöscht = Uhrzeit setzen |
|