Dieser Anhang beschreibt die Register der im C64 eingesetzten Spezialbausteine. Er richtet sich an interessierte Programmierer, die fremde C64 Programme analysieren oder selbst neue Programme erstellen wollen. Wenn Sie mit Power64 nur Ihre alten Programme nutzen wollen, brauchen Sie sich um diese Details nicht sorgen.
D.1 VIC 6567 (Video Controller) - D000-D02E
D000: Sprite#0 X-Position (Bits 7…0, Bit 8 ist in D010 enthalten)
D001: Sprite#0 Y-Position (Bits 7…0)
Die linke, obere Ecke des Bildschirms hat die
X/Y-Koordinaten 24/50.
D002/D003: wie D000/D001, aber für Sprite#1
D004/D005: wie D000/D001, aber für Sprite#2
D006…D00F: wie D000/D001, aber für Sprites#3…7
D010: Sprite X-Position High Bits
Ein Bit pro Sprite (Bit 0 für Sprite#0, Bit 1 für Sprite#1…)
D011: Control Register 1
Bit 7: Bit 8 für D012
Bit 6: 1: Extended Color Text Modus
Bit 5: 0: Text Modus ~ 1: Bitmap Modus
Bit 4: 0: Bildschirm aus ~ 1: Bildschirm an
Bit 3: 0: 24 Zeilen ~ 1: 25 Zeilen/Bildschirm
Bits 2…0: Soft Scrolling Y-Position
D012: Lesen: Aktuelle Rasterzeile (Bits 7…0, Bit 8 in D011)
Schreiben: Rasterzeile, die einen Interrupt auslöst
D013: Lightpen X-Pos. (Bits 8…1)
D014: Lightpen Y-Pos. (Bits 7…0)
D015: Sprite aktivieren (Bit 0 für Sprite#0, Bit 1 für Sprite#1…)
D016: Control Register 2
Bits 7…5: Ungenutzt
Bit 4: 1: Multi Color Modus
Bit 3: 0: 38 Zeichen/Zeile ~ 1: 40 Zeichen/Zeile
Bits 2…0: Soft Scrolling X-Position
D017: Sprite Skalierung - Doppelte Breite
Ein Bit pro Sprite (Bit 0 für Sprite#0, Bit 1 für Sprite#1…)
D018: Video Address Register
Bits 7…4: Bits 13…10 des VideoRAM Addr.
Bits 3…1: Bits 13…11 des CharacterRAM Addr. für Text Modus
Bits 3: Bit 13 des Bitmap Addr für Bitmap Modus
Bit 0: Ungenutzt
Bits 15…14 der Addr, sind (negiert) in DD00 (CIA2)
gespeichert. Die niederwertigen Bits (9/10…0) sind immer 0.
D019: Interrupt Pending Register
Bit 7: 1: Mindesten ein Interrupt steht an
Bits 6…4: Unbenutzt
Bit 3: 1: Lightpen Interrupt
Bit 2: 1: Sprite/Sprite Kollisions Interrupt (vgl. D01E)
Bit 1: 1: Sprite/Hintergrund Kollisions Interrupt (vgl. D01F)
Bit 0: 1: Raster Interrupt (vgl. D012)
D01A: Interrupt Mask Register
Bits 7…4: Unbenutzt
Bit 3: 1: Lightpen Interrupt Freigabe
Bit 2: 1: Sprite/Sprite Kollisions Interrupt Freigabe
Bit 1: 1: Sprite/Hintergrund Kollisions interrupt Freigabe
Bit 0: 1: Raster Interrupt Freigabe
D01B: Sprite/Background Priority
Ein Bit pro Sprite (Bit 0 für Sprite#0, Bit 1 für Sprite#1…)
0: Sprite ist 'vor' dem Hintergrund
1: Sprite ist 'hinter' dem Hintergrund
D01C: MultiColor Sprite (Bit 0 für Sprite#0, Bit 1 für Sprite#1…)
D01D: Sprite Skalierung - Doppelte Höhe
Ein Bit pro Sprite (Bit 0 für Sprite#0, Bit 1 für Sprite#1…)
D01E: Sprite/Sprite Kollisionserkennung
Ein Bit pro Sprite (Bit 0 für Sprite#0, Bit 1 für Sprite#1…)
D01F: Sprite/Hintergrund Kollisionserkennung
Ein Bit pro Sprite (Bit 0 für Sprite#0, Bit 1 für Sprite#1…)
D020: Rahmenfarbe
Alle Farbregister nutzen nur Bits 3…0;
Bits 7…4 sind unbenutzt.
D021: Hintergrundfarbe
D022: Hintergrundfarbe #1 für Multi Color/Extended Color Modus
D023: Hintergrundfarbe #2 für Multi Color/Extended Color Modus
D024: Hintergrundfarbe #3 für Extended Color Text Modus
D025: Gemeinsame Spritefarbe #0 für Multi Color Sprites
D026: Gemeinsame Spritefarbe #1 für Multi Color Sprites
D027: Spritefarbe für #0
D028: Spritefarbe für #1
D029…D02E: Spritefarbe für Sprites #2…7
Die Zeiger auf die Sprite Bitmaps sind in VideoAddr+03F7…03F8 gespeichert. Ein Byte pro Sprite ergibt die Bits 13…6 der Adresse. Bits 15…14 sind (invertiert) in DD00 Bits 1…0 gespeichert. Bits 5…0 sind immer 0. Die Bitmap besteht aus 21 Zeilen zu je 3 Byte (24 Pixel).
D.2 SID 6581 (Sound Interface Device) - D400-D41C
D400: Stimme#1: Frequenz: Bits 7…0
D401: Stimme#1: Frequenz: Bits 15…8
Um die Frequenzwerte aus den Registern in die 'echte' Frequenz
umzurechnen muß man mit (Systemtakt / 2^24) multiplizieren.
D402: Stimme#1: Pulsverhältnis der Rechteckwelle: Bits 7…0
D403: Stimme#1: Pulsverhältnis der Rechteckwelle: Bits 11…8
D404: Stimme#1 Control
Bits 7…4: Wählt die Wellenform. Es kann immer nur eine
Wellenform gewählt werden (keine Mischung)
Bit 7: Rauschen
Bit 6: Rechteck
Bit 5: Sägezahn
Bit 4: Dreieck
Bit 3: Test Bit - 1: Stimme blockieren
Bit 2: Ringmodulation
Bit 1: Synchronisation
Bit 0: Gate: Stimme aktivieren
Übergang 0->1 startet den Attack-Decay-Sustain-Zyklus
Übergang 1->0 startet die Release Phase
D405: Stimme#1: Hüllkurvenform
Bits 7…4: Attack Geschwindigkeit
Bits 3…0: Decay Geschwindigkeit
D406: Stimme#1: Hüllkurvenform
Bits 7…4: Sustain Niveau
Bits 3…0: Release Geschwindigkeit
D407…D40D: wie D400…D406, aber für Stimme#2
D40E…D414: wie D400…D406, aber für Stimme#3
D415: Filter Frequenz: Bits 2…0
D416: Filter Frequenz: Bits 10…3
Die Grenzfrequenz des Filters ergibt sich als
30 + 5.8*Registerwert Hz.
D417: Filter/Resonanz Steuerung
Bits 7…4: Resonanz Intensität
Bit 3: 1: Filter für externes Signal aktivieren
Bit 2: 1: Filter für Stimme#3 aktivieren
Bit 1: 1: Filter für Stimme#2 aktivieren
Bit 0: 1: Filter für Stimme#1 aktivieren
D418: Filter Steuerung/Lautstärke
Bit 7: 1: Stimme#3 stummschalten
Bit 6: 1: Filter arbeitet als Hochpass-Filter
Bit 5: 1: Filter arbeitet als Bandpass-Filter
Bit 4: 1: Filter arbeitet als Tiefpass-Filter
Bits 3…0: Lautstärke
D419: Paddle 1 Position
D41A: Paddle 2 Position
D41B: Aktueller Zustand der Welle von Stimme#3
D41C: Aktueller Zustand der Hüllkurve von Stimme#3
Dx00: Port A Daten Register
Dx01: Port B Daten Register
Dx02: Port A Daten Richtung Register (0: Eingang ~ 1: Ausgang)
Dx03: Port B Daten Richtung Register (0: Eingang ~ 1: Ausgang)
Dx04: Zähler A Bits 7…0
Lesen: Aktueller Stand des Zählers A
Schreiben: Jener Wert mit der der Zähler beim nächsten
Nulldurchgang geladen wird.
Dx05: Zähler A Bits 15…8
Lesen: Aktueller Stand des Zählers A
Schreiben: Jener Wert mit der der Zähler beim nächsten
Nulldurchgang geladen wird.
Dx06: Zähler B Bits 7…0
Dx07: Zähler B Bits 15…8
Dx08: Tageszeit/Wecker 10tel Sekunde
Lesen: Tageszeit 10tel Sekunde in BCD Format (Bits 3…0)
Schreiben, wenn Control Reg. B Bit 7 = 0:
Tageszeit 10tel Sekunde stellen
Schreiben, wenn Control Reg. B Bit 7 = 1:
Alarmzeit 10tel Sekunde stellen
Dx09: Tageszeit/Wecker Sekunde (BCD Format)
Zugriffe wie Dx08
Dx0A: Tageszeit/Wecker Minute (BCD Format)
Zugriffe wie Dx08
Dx0B: Tageszeit/Wecker Stunde (BCD Format)
Bit 7: 0: AM ~ 1: PM
Zugriffe wie Dx08
Lesen von Dx0B kopiert die Tageszeit in ein Schattenregister
Lesen von Dx08 gibt das Schattenregister wieder frei
Dx0C: Serielles Daten Register
Dx0D: Interrupt Control Register
Bit 7: Lesen: Mindestens eine Interruptquelle ist aktiv.
Schreiben:
0: Jedes 1 Bit löscht das entsprechende Maskenbit.
Alle anderen Bits bleiben unberührt.
1: Jedes 1 Bit setzt das entsprechende Maskenbit.
Alle anderen Bits bleiben unberührt.
Bits 6…5: Unbenutzt (immer 0)
Bit 4: Signal an Pin FLAG
Bit 3: Serial Data Reg. Voll/Leer
Bit 2: Tageszeit ist gleich mit Weckzeit
Bit 1: Zähler B Unterlauf
Bit 0: Zähler A Unterlauf
Das Auslesen des Interrupt Control Reg. löscht alle Bits.
Dx0E: Control Register A
Bit 7: Tageszeit Taktrate: 0: 60 Hz ~ 1: 50 Hz
Bit 6: Serielle Daten Richtung: 0: Eingang ~ 1: Ausgang
Bit 5: Zähler A Takt: 0: Systemtakt ~ 1: CNT-Pin
Bit 4: 1: Laden von Zähler A erzwingen
Bit 3: 0: Zähler A beginnt nach einem Unterlauf automatisch
von vorne
1: Zähler A hält an, wenn er einmal fertig gezählt hat.
Bit 2: 0: Jeder Unterlauf von Zähler A gibt an Pin PB6 einen
Impuls von einem Taktzyklus Länge aus.
1: Jeder Unterlauf von Zähler A ändert PB6.
Bit 1: Unterläufe von Zähler A werden an Pin PB6 angezeigt.
Bit 0: Zähler A Freigabe: 1: Zählen ~ 0: Stop
Dx0F: Control Register B
Bit 7: 0: Tageszeit stellen ~ 1: Weckzeit stellen
Bits 6…5: Zähler B Takt
00: Systemtakt ~ 01: CNT-Pin
10: Zähler A Unterlauf ~ 11: Zähler A Unterlauf bei CNT=1
Bits 4…0: wie DC0E aber für Zähler B und Pin PB7
DC00: CIA1 Port A
Bits 7…0: Tastatur Zeilenauswahl
Bits 7…6: Paddle Set Auswahl (nur ein Bit darf aktiv sein!)
Bit 4: Joystick#2 Feuer
Bit 3: Joystick#2 Rechts
Bit 2: Joystick#2 Links
Bit 1: Joystick#2 Hinunter
Bit 0: Joystick#2 Hinauf
DC01: CIA1 Port B
Bits 7…0: Tastatur Spaltenresultat
Bit 4: Joystick#1 Feuer
Bit 3: Joystick#1 Rechts
Bit 2: Joystick#1 Links
Bit 1: Joystick#1 Hinunter
Bit 0: Joystick#1 Hinauf
DC0D: CIA1 Interr. Control Reg.
Bit 4 (FLAG Pin): Tape Daten Eingang
DD00: CIA2 Port A
Bit 7: IEC-Bus: DATA Eingang
Bit 6: IEC-Bus: CLOCK Eingang
Bit 5: IEC-Bus: DATA Ausgang
Bit 4: IEC-Bus: CLOCK Ausgang
Bit 3: IEC-Bus: ATN Ausgang
Bit 2: RS232: TXD (nur mit RS232 Modul)
Bit 1…0: Höchstwertige Bits (15…14) der Video Addr.
(invertiert)
DD01: CIA2 Port B (nur mit RS232 Modul)
Bit 7: RS232: DSR (Data Set Ready)
Bit 6: RS232: CTS (Clear to Send)
Bit 4: RS232: DCD (Data Carrier Detect)
Bit 3: RS232: RI (Ring Indicator)
Bit 2: RS232: DTR (Data Terminal Ready)
Bit 1: RS232: RTS (Request to Send)
Bit 0: RS232: RXD (Receive Data)
DD0D: CIA2 Interr. Control Reg.
Bit 4 (FLAG Pin): RS232: RXD (nur mit RS232 Modul)
D.4 CPU 6510 Port
0000: CPU Port Daten Richtungs Register: 0: Eingang ~ 1: Ausgang
0001: CPU Port Daten Register
Bits 7…6: Nicht vorhanden
Bit 5: Tape: Motor (invertiert)
Bit 4: Tape: Play Taste
Bit 3: Tape: Daten Ausgang
Bits 2…0: Auswahl der Speicherkonfiguration
Lesen: $A000-BFFF $D000-DFFF $E000-FFFF
000: RAM RAM RAM
001: RAM ROM RAM
010: RAM ROM ROM
011: ROM ROM ROM
100: RAM RAM RAM
101: RAM I/O RAM
110: RAM I/O ROM
111: ROM I/O ROM
Schreiben: $A000-BFFF $D000-DFFF $E000-FFFF
0xx: RAM RAM RAM
100: RAM RAM RAM
101: RAM I/O RAM
11x: RAM I/O RAM