CIA 6526

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