CIA

Aus C64-Wiki

Wechseln zu: Navigation, Suche
Produktionsdatum dieses CIA: 1985 - Kalenderwoche 13
Produktionsdatum dieses CIA: 1985 - Kalenderwoche 13

Inhaltsverzeichnis

[bearbeiten] Beschreibung

Der CIA (Complex Interface Adapter) ist ein Interface-Chip der in Commodore Heimcomputern eingebaut ist und die meisten Ein- und Ausgabevorgänge steuert, sowie den internen Timer (Uhr) des Computers enthält. Der CIA wurde von dem Halbleiterhersteller MOS Technology entwickelt, der 1976 von Commodore übernommen wurde. Im C64 befinden sich zwei CIA 6526.

[bearbeiten] Einzelheiten des CIA 6526

  • 16 einzeln programmierbare Ein- und Ausgabeleitungen
    • Die Leitungen sind als Open Collector mit internen Pullups herausgeführt.
    • Im C64 werden einige dieser Leitungen zur Abfrage/Ansteuerung der Ein-/Ausgabegeräte (Tastatur, Joystick, IEC etc.) benutzt, einige sind mit dem VIC verbunden und legen den für ihn sichtbaren Speicherbereich fest, andere stehen zur freien Verfügung und sind am Userport herausgeführt.
  • 8- oder 16-Bit Datentransport (lesend und schreibend) mit Handshaking
  • 2 unabhängige 16-Bit Intervalltimer
    • jeder Timer besteht aus einem 16 Bit-Latch (Startwert) und dem eigentlichen 16 Bit-Timer
    • das Latch kann man direkt setzen, den Timer nur lesen bzw. indirekt über das Latch setzen
  • 24-Stunden-Zeituhr (AM/PM) mit programmierbarem Alarm
  • 8-Bit Schiebregister für serielle Ein- und Ausgabe
  • 2 TTL-Eingänge
  • CMOS-kompatibel
  • Taktung: 1 MHz (6526) oder 2 MHz (6526A)

[bearbeiten] Speicheradressen der CIAs

Folgende Speicheradressen werden von den beiden CIA-Chips im C64 belegt:

[bearbeiten] CIA 1

Adressbereich: $DC00-$DCFF, 56320-56575 Aufgaben: Tastatur, Joystick, Paddles, Datasette, IRQ Steuerung
Adresse
Hex
Adresse
Dez
Register Funktion Bemerkung
$DC00563200
PRA
Daten Port AAbfrage/Steuerung der acht Datenleitungen von Port A. Die Leitungen sind mehrfach belegt:

Lesen/Schreiben: Bit 0..7 Tastaturmatrixspalten
Lesen: Joystick Port 2: Bit 0..3 Richtung (Links/Rechts/Hoch/Runter), Bit 4 Feuerknopf. 0 = aktiviert.
Lesen: Lightpen: Bit 4 (wie Feuerknopf), auch mit "/LP" (Pin 9) des VIC verbunden
Lesen: Paddles: Bit 2..3 Feuerknöpfe, Bit 6..7 Umschaltung Controlport 1 (%01=Paddles A) oder 2 (%10=Paddles B)

$DC01563211
PRB
Daten Port BAbfrage/Steuerung der acht Datenleitungen von Port B. Die Leitungen sind mehrfach belegt:

Lesen/Schreiben: Bit 0..7 Tastaturmatrixzeilen
Lesen: Joystick Port 1: Bit 0..3 Richtung (Links/Rechts/Hoch/Runter), Bit 4 Feuerknopf. 0 = aktiviert.
Lesen: Bit 6: Timer A: Toggle/Impulsausgang (siehe Register 14 Bit 2)
Lesen: Bit 7: Timer B: Toggle/Impulsausgang (siehe Register 15 Bit 2)

$DC02563222
DDRA
Datenrichtung
Port A
Bit X: 0=Eingang (nur lesen), 1=Ausgang (lesen und schreiben)
$DC03563233
DDRB
Datenrichtung
Port B
Bit X: 0=Eingang (nur lesen), 1=Ausgang (lesen und schreiben)
$DC04563244
TA LO
Timer A
Low Byte
Lesen: aktueller Wert Timer A (Low Byte)

Schreiben: Latch des Timers A setzen (Low Byte)

$DC05563255
TA HI
Timer A
High Byte
Lesen: aktueller Wert Timer A (High Byte)

Schreiben: Latch des Timers A setzen (High Byte) - falls der Timer gestoppt ist, wird gleichzeitig das High Byte des Timers neu gesetzt

$DC06563266
TB LO
Timer B
Low Byte
Lesen: aktueller Wert Timer B (Low Byte)

Schreiben: Latch des Timers B setzen (Low Byte)

$DC07563277
TB HI
Timer B
High Byte
Lesen: aktueller Wert Timer B (High Byte)

Schreiben: Latch des Timers B setzen (High Byte) - falls der Timer gestoppt ist, wird gleichzeitig das High Byte des Timers neu gesetzt

$DC08563288
TOD 10THS
Echtzeituhr
1/10s
Lesen:

Bit 0..3: Zehntelsekunden im BCD-Format ($0-$9)
Bit 4..7: immer 0
Schreiben:
Bit 0..3: wenn CRB-Bit7=0: Setzen der Zehntelsekunden im BCD-Format
Bit 0..3: wenn CRB-Bit7=1: Vorwahl der Zehntelsekunden der Alarmzeit im BCD-Format

$DC09563299
TOD SEC
Echtzeituhr
Sekunden
Bit 0..3: Einersekunden im BCD-Format ($0-$9)

Bit 4..6: Zehnersekunden im BCD-Format ($0-$5)
Bit 7: immer 0

$DC0A5633010
TOD MIN
Echtzeituhr
Minuten
Bit 0..3: Einerminuten im BCD-Format( $0-$9)

Bit 4..6: Zehnerminuten im BCD-Format ($0-$5)
Bit 7: immer 0

$DC0B5633111
TOD HR
Echtzeituhr
Stunden
Bit 0..3: Einerstunden im BCD-Format ($0-$9)

Bit 4..6: Zehnerstunden im BCD-Format ($0-$5)
Bit 7: Unterscheidung AM/PM, 0=AM, 1=PM
Schreiben in dieses Register stoppt TOD, bis Register 8 (TOD 10THS) geschrieben wird.
Lesen aus diesem Register friert alle TOD-Register ein (TOD läuft aber weiter), bis Register 8 (TOD 10THS) gelesen wird.

$DC0C5633212
SDR
Serielles
Schieberegister
Am SP-Pin wird das Byte in diesem Register Bitweise mit jeder positiven Flanke am CNT-Pin hinausgeschoben bzw. eingelesen.
$DC0D5633313
ICR
Interrupt Control
und Status
CIA1 ist an die IRQ-Leitung angeschlossen.

Lesen: (Bit0..4 = INT DATA, Herkunft des Interrupts)
Bit 0: 1 = Unterlauf Timer A
Bit 1: 1 = Unterlauf Timer B
Bit 2: 1 = Gleichheit von Uhrzeit und Alarmzeit
Bit 3: 1 = SDR voll oder leer, also vollständiges Byte übertragen, abhängig von der Betriebsart Serielle Schnittstelle
Bit 4: 1 = IRQ Signal am FLAG-Pin aufgetreten (Kassettenport Dateneingang, Serielle Schnittstelle SRQ IN)
Bit 5..6: immer 0
Bit 7: 1 = IRQ Ein Interrupt ist aufgetreten, also Übereinstimmung mindestens eines Bits von INT MASK und INT DATA
Flags werden durch Lesen gelöscht!
Schreiben: (Bit 0..4 = INT MASK, Interruptmaske)
Bit 0: 1 = Interruptfreigabe durch Timer A Unterlauf
Bit 1: 1 = Interruptfreigabe durch Timer B Unterlauf
Bit 2: 1 = Interruptfreigabe wenn Uhrzeit=Alarmzeit
Bit 3: 1 = Interruptfreigabe wenn ein komplettes Byte empfangen/gesendet wurde.
Bit 4: 1 = Interruptfreigabe wenn eine positive Flanke am FLAG-Pin auftritt.
Bit 5..6: unbenutzt
Bit 7: Quellbit. 0 = gesetzte Bits 0..4 löschen das entsprechende Masken-Bit. 1 = gesetzte Bits 0..4 setzen das entsprechende Masken-Bit. Gelösche Bits 0..4 lassen die Maske also in jedem Fall unverändert.

$DC0E5633414
CRA
Control Timer ABit 0: 0 = Stop Timer; 1 = Start Timer

Bit 1: 1 = Zeigt einen Timer Unterlauf an Port B in Bit 6 an
Bit 2: 0 = Bei Timer Unterlauf wird an Port B das Bit 6 invertiert , 1 = Bei Timer-Unterlauf wird an Port B das Bit 6 für einen Zyklus High
Bit 3: 0 = Timer-Neustart nach Unterlauf (Latch wird neu geladen), 1 = Timer stoppt nach Unterlauf
Bit 4: 1 = Einmalig Latch in den Timer laden
Bit 5: 0 = Timer zählt Systemzyklus, 1 = Timer zählt positive Flanke am CNT-Pin
Bit 6: Richtung des seriellen Schieberegisters, 0 = SP-Pin ist Eingang (lesen), 1 = SP-Pin ist Ausgang schreiben
Bit 7: Echtzeituhr, 0 = 60 Hz, 1 = 50 Hz

$DC0F5633515
CRB
Control Timer BBit 0: 0 = Stop Timer; 1 = Start Timer

Bit 1: 1 = Zeigt einen Timer Unterlauf an Port B in Bit 7 an
Bit 2: 0 = Bei Timer Unterlauf wird an Port B das Bit 7 invertiert , 1 = Bei Timer-Unterlauf wird an Port B das Bit 7 für einen Zyklus High
Bit 3: 0 = Timer-Neustart nach Unterlauf (Latch wird neu geladen), 1 = Timer stoppt nach Unterlauf
Bit 4: 1 = Einmalig Latch in den Timer laden
Bit 5..6:

  •  %00 = Timer zählt Systemzyklus
  •  %01 = Timer zählt positive Flanke am CNT-Pin
  •  %10 = Timer zählt Unterlauf des Timer A
  •  %11 = Timer zählt Unterlauf des Timer A wenn CNT-Pin High ist

Bit 7: 0 = Schreiben in die TOD-Register setzt die Uhrzeit, 1 = Schreiben in die TOD-Register setzt die Alarmzeit

$DC10-$DCFF56336-56575--Die CIA 1 Register wiederholen sich alle 16 Bytes

[bearbeiten] CIA 2

Der zweite CIA-Chip ist identisch mit dem ersten. Deshalb sind in der folgenden Tabelle nur Einträge zu finden, die sich auf die spezifische Verwendung im C64 beziehen.

Adressbereich: $DD00-$DDFF, 56576-56831 Aufgaben: Serielle Schnittstelle, RS-232, VIC Speicher, NMI Steuerung
Adresse
Hex
Adresse
Dez
Register Funktion Bemerkung
$DD00565760
PRA
Daten Port ABit 0..1: Auswahl der Position des VIC-Speichers
  •  %00, 0: Bank 3: $C000-$FFFF, 49152-65535
  •  %01, 1: Bank 2: $8000-$BFFF, 32768-49151
  •  %10, 2: Bank 1: $4000-$7FFF, 16384-32767
  •  %11, 3: Bank 0: $0000-$3FFF, 0-16383 (Standard)

Bit 2: RS-232: TXD Ausgang, Userport: Daten PA 2 (Pin M)
Bit 3..5: Serielle Schnittstelle Ausgang (0=High/Inactive, 1=Low/Active)

  • Bit 3: ATN OUT
  • Bit 4: CLOCK OUT
  • Bit 5: DATA OUT

Bit 6..7: Serielle Schnittstelle Eingang (0=Low/Active, 1=High/Inactive)

  • Bit 6: CLOCK IN
  • Bit 7: DATA IN
$DD01565771
PRB
Daten Port BBit 0..7: Userport Daten PB 0-7 (Pins C,D,E,F,H,J,K,L)

Der KERNAL bietet einige RS232-Routinen an, die die Pins folgendermaßen benutzen:
Bit 0, 3..7: RS-232: lesen

  • Bit 0: RXD
  • Bit 3: RI
  • Bit 4: DCD
  • Bit 5: Userport Pin J
  • Bit 6: CTS
  • Bit 7: DSR

Bit 1..5: RS-232: schreiben

  • Bit 1: RTS
  • Bit 2: DTR
  • Bit 3: RI
  • Bit 4: DCD
  • Bit 5: Userport Pin J
$DD02565782
DDRA
Datenrichtung
Port A
siehe CIA 1
$DD03565793
DDRB
Datenrichtung
Port B
siehe CIA 1
$DD04565804
TA LO
Timer A
Low Byte
siehe CIA 1
$DD05565815
TA HI
Timer A
High Byte
siehe CIA 1
$DD06565826
TB LO
Timer B
Low Byte
siehe CIA 1
$DD07565837
TB HI
Timer B
High Byte
siehe CIA 1
$DD08565848
TOD 10THS
Echtzeituhr
1/10s
siehe CIA 1
$DD09565859
TOD SEC
Echtzeituhr
Sekunden
siehe CIA 1
$DD0A5658610
TOD MIN
Echtzeituhr
Minuten
siehe CIA 1
$DD0B5658711
TOD HR
Echtzeituhr
Stunden
siehe CIA 1
$DD0C5658812
SDR
Serielles
Schieberegister
siehe CIA 1
$DD0D5658913
ICR
Interrupt Control
und Status
CIA2 ist an die NMI-Leitung angeschlossen.

Bit 4: 1 = NMI Signal am FLAG-Pin aufgetreten (RS-232 Daten empfangen)
Bit 7: 1 = NMI Ein Interrupt ist aufgetreten, also Übereinstimmung mindestens eines Bits von INT MASK und INT DATA

$DD0E5659014
CRA
Control Timer Asiehe CIA 1
$DD0F5659115
CRB
Control Timer Bsiehe CIA 1

[bearbeiten] Links

Wikipedia: MOS Technology CIA
Wikipedia: MOS Technology CIA Sprache:english

Hardware-Aufbau des C64 · Hardware-Portalseite
Komponenten des C64: CPU · VIC · SID · CIA · PLA · RAM · ROM · Farbram

Schnittstellen des C64: Controlport · Expansionsport · Userport · Kassettenport · Netzbuchse · Audio-/Videobuchse · Antennenbuchse · Serielle Schnittstelle
Persönliche Werkzeuge