Zeichenmodus (Standard)
40×25 Zeichen, je 8×8 Pixel. Pro Zeichen eine Vordergrundfarbe aus dem Color-RAM, gemeinsame Hintergrundfarbe. Schnell, sparsam, aber farblich je Zeichen eingeschränkt.
Das Fundament. Nicht weil er perfekt war, sondern weil sich an ihm Grenzen und Möglichkeiten unmittelbar lesen ließen.
Der C64 braucht keine Einleitung in dem Sinn, dass man erklären müsste, was er war. Meistverkaufter Heimcomputer der Geschichte, Plattform einer ganzen Generation, Kulturgegenstand. Das alles stimmt, und das alles ist hier nicht das Thema. Was mich am C64 bis heute interessiert, ist das Technische darunter: wie er aufgebaut ist, was seine Chips wirklich können, wo seine Grenzen liegen und vor allem, was Programmierer und Hardwarebastler gefunden haben, um genau diese Grenzen zu verschieben.
Denn das eigentlich Bemerkenswerte am C64 liegt nicht nur im Gerät selbst, sondern in dem, was aus genauer Kenntnis seiner Architektur entstanden ist. Rasterstrahl-Programmierung, Sprite-Multiplex, SID-Missbrauch, stabile IRQs – das sind keine Spielereien, sondern das Resultat davon, dass ein System ernst genommen wurde, bis hinunter auf Register- und Timing-Ebene.
Der MOS 6510 ist kein reiner 6502. Der offensichtliche Unterschied: Er hat einen integrierten 6-Bit-I/O-Port, direkt auf dem Chip, erreichbar über die Adressen $0000 (Datenrichtungsregister) und $0001 (Datenwort). Das klingt wie ein Detail. Es ist keines.
Über diesen Port steuert der C64 die Bankschaltung des gesamten Speichersystems. Bits 0, 1 und 2 von $0001 bestimmen, welche Kombination aus ROM, RAM und I/O im Adressraum sichtbar ist. Zusätzlich hängen dort die Datasette-Leitungen: Bit 3 für Schreibdaten zur Datasette, Bit 4 als Sense-Eingang und Bit 5 für die Motorsteuerung. Das bedeutet: Wer in $0001 schreibt, verändert nicht nur das Speicherlayout, sondern kann zugleich Teile der angeschlossenen Kassettenhardware beeinflussen.
Der 6510 läuft im PAL-C64 mit etwas unter 1 MHz, genauer mit 0,985 MHz. Das liegt daran, dass er mit dem VIC-II synchronisiert läuft, der den Systemtakt vorgibt. Und dieser Takt hängt wiederum am Bildschirmaufbau. Schon daran sieht man: Auf dem C64 ist die CPU nicht von der Darstellung getrennt.
Die wichtigste Konsequenz: Im C64 gibt es kein ROM, hinter dem kein RAM liegt. Das darunter liegende RAM ist immer vorhanden und beschreibbar – es ist nur verdeckt. Schaltet man das ROM ab, wird dieses RAM sichtbar. Genau darauf bauen viele fortgeschrittene Techniken auf.
Die ersten 256 Bytes des Adressraums – die Zero Page ($0000–$00FF) – haben beim 6502/6510 einen besonderen Status. Viele Befehle können Zero-Page-Adressen mit nur einem Byte kodieren statt mit zweien, was kürzere und schnellere Befehle ergibt. KERNAL und BASIC nutzen dabei bereits einen großen Teil dieser Adressen. Wer in Maschinensprache arbeitet, lernt deshalb schnell, dass gute Zero-Page-Kenntnis nicht Komfort, sondern Geschwindigkeit bedeutet.
Der Stack liegt bei $0100–$01FF und ist 256 Bytes groß. Das wirkt zunächst ausreichend, ist es aber nicht in jeder Situation. Tief verschachtelte Unterprogramme, Interrupt-Routinen und unachtsame Register-Sicherungen können ihn schnell an seine Grenze bringen. Stack-Probleme auf dem C64 melden sich selten sauber. Meist zeigt sich nur, dass ein Programm irgendwann nicht mehr tut, was es soll.
Die 64 KB des C64 sind nicht alle gleichzeitig frei nutzbar. Der Adressraum ist aufgeteilt zwischen RAM, ROM-Einblendungen und I/O-Bereichen, und welcher davon sichtbar ist, hängt von der Konfiguration in $0001 ab. Das ist das Grundprinzip des C64-Speichermodells: physisch 64 KB RAM, darübergelegt ROM und I/O.
| Adresse | Größe | Inhalt im Standardzustand |
|---|---|---|
| $0000–$00FF | 256 B | Zero Page – CPU-Port in $0000/$0001, KERNAL/BASIC-Variablen |
| $0100–$01FF | 256 B | Stack |
| $0200–$03FF | 512 B | KERNAL- und BASIC-Systemvariablen, Tastaturpuffer usw. |
| $0400–$07FF | 1 KB | Standard-Bildschirm-RAM (40×25 Zeichen) |
| $0800–$9FFF | ~38 KB | Freies RAM / BASIC-Programmbereich |
| $A000–$BFFF | 8 KB | BASIC-ROM (oder RAM, wenn BASIC abgeschaltet) |
| $C000–$CFFF | 4 KB | Freies RAM |
| $D000–$DFFF | 4 KB | I/O-Bereich: VIC-II, SID, CIA1, CIA2, Color-RAM (oder Zeichen-ROM oder RAM) |
| $E000–$FFFF | 8 KB | KERNAL-ROM (oder RAM, wenn KERNAL abgeschaltet) |
Der I/O-Bereich bei $D000–$DFFF ist besonders interessant. Dort liegen die Register aller wichtigen Chips: VIC-II ab $D000, SID ab $D400, Color-RAM ab $D800, CIA1 ab $DC00, CIA2 ab $DD00. Dieser Bereich kann aber auch auf das Zeichen-ROM umgeschaltet werden – was das Auslesen des eingebauten Zeichensatzes ermöglicht – oder auf das darunter liegende RAM.
Ein weiterer wichtiger Punkt: Der VIC-II sieht den Adressraum nicht so wie die CPU. Er arbeitet mit 16-KB-Bänken, von denen es vier gibt. CIA2 steuert, welche dieser Bänke der VIC-II gerade sieht. Standard ist Bank 0 ($0000–$3FFF).
Innerhalb dieser 16-KB-Bank zeigt der VIC-II auf Bitmap-Daten, Bildschirm-RAM und Zeichensatz. Das bedeutet: Wer den VIC-II auf eine andere Bank schaltet, kann Bilddaten in einem Bereich halten, der für die CPU anders organisiert ist. Genau daraus ergeben sich Double-Buffering- und Scroll-Techniken.
Der MOS 6569 (PAL) – kurz VIC-II – ist das Herzstück des C64. Er erzeugt nicht nur das Bild, er bestimmt auch das Timing des gesamten Systems. Wer den VIC-II versteht, versteht den C64.
Der VIC-II erzeugt das Bild, indem er Zeile für Zeile einen Rasterstrahl simuliert – so wie ein röhrenbasierter Monitor tatsächlich arbeitet. Der PAL-C64 hat insgesamt 312 Rasterzeilen, von denen 200 den sichtbaren Hauptbereich ausmachen. Während der Rasterstrahl eine Zeile durchläuft, liest der VIC-II Daten aus dem RAM. Genau dort beginnt das interessante Zusammenspiel mit der CPU.
Alle 8 Rasterzeilen muss der VIC-II neue Zeichenkodierungen aus dem Bildschirm-RAM lesen. In diesen Zeilen – den sogenannten Badlines – hält er die CPU für viele Taktzyklen an und nutzt den Bus allein. Das passiert automatisch, wenn das Display aktiv ist und die unteren drei Bits der aktuellen Rasterzeile mit den unteren drei Bits des Y-Scrollregisters ($D011, Bits 0–2) übereinstimmen.
Diese CPU-Bremse ist regelmäßig und vorhersehbar. Wer zeitkritischen Code schreibt – etwa für stabile Raster-Interrupts – muss Badlines einkalkulieren. Und wer das Y-Scrollregister verändert, verschiebt damit auch das Badline-Muster. Das wird bewusst genutzt: etwa für FLD-Effekte oder andere vertikale Timing-Tricks.
40×25 Zeichen, je 8×8 Pixel. Pro Zeichen eine Vordergrundfarbe aus dem Color-RAM, gemeinsame Hintergrundfarbe. Schnell, sparsam, aber farblich je Zeichen eingeschränkt.
Wie Zeichenmodus, aber jedes Pixel effektiv 2 Bit breit. Vier Farben möglich, dafür halbe horizontale Auflösung.
320×200 Pixel, 1 Bit pro Pixel. Freie Pixelsetzung, aber nur zwei Farben pro 8×8-Zelle.
160×200 Pixel effektiv. Vier Farben pro 4×8-Block. Grundlage vieler typischer C64-Grafiken.
Das Color-RAM bei $D800–$DBFF ist kein normales RAM. Es ist ein separater 4-Bit-RAM-Baustein, der stets sichtbar bleibt – unabhängig von der Bankschaltung. Das hat Konsequenzen: Man kann ihn nicht einfach verlegen oder ausblenden. Wer den VIC-II-Zeichenmodus nutzt, arbeitet mit dieser festen Farbzuweisung pro Zeichenblock.
Der VIC-II kann einen Interrupt auslösen, wenn der Rasterstrahl eine bestimmte Zeile erreicht. Das ist die Grundlage für einen großen Teil dessen, was den C64 visuell von anderen Rechnern seiner Zeit unterscheidet.
Die Rasterzeile für einen Interrupt wird über $D012 konfiguriert, zusammen mit Bit 7 von $D011. Erreicht der Rasterstrahl diese Position, setzt der VIC-II ein Interrupt-Flag und die CPU springt in eine Service-Routine. Dort können VIC-II-Register in exakt definierten Bildphasen verändert werden.
Das Problem: Der Zeitpunkt, zu dem ein IRQ tatsächlich wirksam wird, variiert leicht – abhängig davon, welchen CPU-Befehl die Maschine gerade ausführt. Für grobe Effekte ist das egal. Für pixelgenaue Wechsel ist es das nicht.
Die Lösung ist der Double-IRQ-Trick. Der erste IRQ fängt die Unschärfe ab, der zweite arbeitet an einer stabileren Position. So erreicht man ein Timing, das für horizontale Farbgrenzen, Splits oder andere empfindliche Effekte ausreichend ruhig ist.
„Der Rasterstrahl ist kein Grafikdetail, sondern eine Taktfrage. Wer das verstanden hat, sieht den VIC-II anders.“
Der VIC-II unterstützt 8 Hardware-Sprites gleichzeitig. Jedes Sprite ist 24×21 Pixel groß, kann horizontal oder vertikal verdoppelt werden, hat eine eigene Position und eine eigene Farbe. Das ist für Spiele und bewegte Objekte ein erheblicher Vorteil gegenüber rein softwaregezeichneter Grafik.
Acht Sprites für ein ganzes Spielfeld sind allerdings wenig. Die Lösung ist Sprite-Multiplex. Dabei wird ein Sprite-Kanal neu positioniert, nachdem der Rasterstrahl an seiner bisherigen Position vorbei ist. Dasselbe Hardware-Sprite erscheint dadurch im selben Bild an mehreren Stellen.
Für jeden neu verwendeten Sprite-Kanal wird ein Raster-IRQ an einer passenden Y-Position gesetzt. In diesem IRQ werden neue Sprite-Daten, neue Zeiger und neue Koordinaten geschrieben. Das funktioniert nur, wenn das Timing stimmt und genügend CPU-Zeit frei bleibt.
Die harte Grenze bleibt: Pro Rasterzeile sind maximal 8 Sprites gleichzeitig darstellbar. Multiplex erhöht also nicht die Zahl pro Zeile, sondern nur die Gesamtzahl im Bild.
Der VIC-II hat Hardware-Kollisionserkennung: ein Register für Sprite-zu-Sprite-Kollisionen und eines für Sprite-zu-Hintergrund-Kollisionen. Das erleichtert einfache Abfragen erheblich. Für präzise Spielphysik reicht es allein nicht, aber als Hardware-Hinweis ist es nützlich.
Der C64-Bildschirm hat einen sichtbaren Rahmen, den Border. Offiziell gehört dieser Bereich nicht zum nutzbaren Bild. Praktisch lässt er sich manipulieren.
Der VIC-II setzt den Border am oberen und unteren Rand abhängig von einem internen Status. Dieser Status lässt sich beeinflussen, wenn man im richtigen Moment das Display-Enable-Bit in $D011 kurz deaktiviert und wieder setzt. Das Ergebnis ist vertikales Open Border: Der normalerweise verdeckte Bereich kann für weitere Darstellung genutzt werden.
Ähnlich arbeitet das horizontale Open Border über $D016. Das Timing ist enger, der Trick empfindlicher. Gelingt er, können auch seitliche Randbereiche sichtbar genutzt werden.
Beide Varianten zusammen machen sichtbar, dass der scheinbar feste Bildschirmrahmen in Wahrheit ebenfalls ein Ergebnis interner Zustandslogik ist – und damit prinzipiell veränderbar.
Der MOS 6581 (später: MOS 8580) ist einer der ungewöhnlichsten Soundchips seiner Zeit. Er hat drei Stimmen, jede mit eigener Wellenformsteuerung, Hüllkurve, Frequenz- und Pulsbreitenregelung. Dazu kommt ein analoger Filter, der den Charakter des Chips wesentlich mitprägt.
Der SID ist aber nicht nur wegen seiner dokumentierten Funktionen interessant. Vieles von dem, was ihn in der Praxis besonders machte, liegt gerade in den Bereichen, die nur durch genaues Ausprobieren oder durch langes Hören wirklich verstanden wurden.
Zwei fortgeschrittene Modulationsmodi sind besonders wichtig: Ring-Modulation und Oscillator-Sync. Beide erzeugen Klangcharaktere, die mit einfachen Grundwellenformen allein nicht erreichbar wären. Gerade dadurch wird der SID mehr als ein Standard-Dreistimmen-Chip.
Dokumentiert sind vier Einzelwellenformen. In der Praxis lassen sich jedoch mehrere Wellenformenbits gleichzeitig setzen. Das Ergebnis sind kombinierte Klänge, die sich nicht allein aus dem Handbuch erklären. Viele typische SID-Klangfarben beruhen genau auf dieser Art von Nutzung.
Die dritte SID-Stimme kann aus dem hörbaren Mix entfernt werden und läuft trotzdem weiter. Ihr Zustand bleibt lesbar. Damit lässt sie sich im Rauschmodus als einfache Quelle für Pseudozufallswerte nutzen – ein bekannter und nützlicher Nebeneffekt der Architektur.
Der ältere 6581 und der neuere 8580 klingen spürbar unterschiedlich. Der 6581 ist rauer und ungenauer, der 8580 sauberer und kontrollierter. Viele Kompositionen und Tricks sind deshalb nicht vollständig zwischen beiden Chips austauschbar.
Über POTX und POTY besitzt der SID zudem zwei analoge Eingänge, ursprünglich für Paddle-Controller gedacht. Auch das zeigt, dass der Chip nicht auf reine Klangsynthese reduziert ist, sondern an mehreren Stellen über seinen offensichtlichen Zweck hinausreicht.
Der C64 hat zwei MOS 6526 CIA-Chips. CIA1 sitzt bei $DC00, CIA2 bei $DD00. Jeder CIA besitzt zwei 16-Bit-Timer, zwei 8-Bit-I/O-Ports, eine Uhrlogik und ein serielles Schieberegister.
CIA1 kümmert sich im Standardbetrieb vor allem um Tastatur-Scanning, Joystick-Port 2 und den normalen KERNAL-Zeittakt. CIA2 steuert unter anderem den seriellen IEC-Bus und die VIC-II-Bankumschaltung. Damit gehören beide CIAs zu den Chips, die im Alltag leicht übersehen werden, für die Gesamtfunktion aber unverzichtbar sind.
CIA1 hängt am normalen IRQ, CIA2 am NMI. Das ist ein erheblicher Unterschied. Ein NMI lässt sich nicht einfach mit SEI unterdrücken. Wer CIA2 nutzt, greift also deutlich tiefer in das Systemverhalten ein.
Die Tastatur ist als 8×8-Matrix organisiert und wird über CIA1 abgefragt. Daraus ergibt sich die bekannte Ghost-Key-Problematik: Bestimmte Tastenkombinationen beeinflussen sich gegenseitig. Wer eigene Abfrageroutinen schreibt, muss diese Matrixlogik selbst sauber berücksichtigen.
Die Commodore 1541 ist in gewisser Weise ein Rechner für sich. Sie enthält eine eigene MOS 6502-CPU, RAM, ROM und zwei MOS 6522 VIA-Chips. Das Laufwerk ist also kein passives Zusatzgerät, sondern ein eigenständiges System mit eigenem Betrieb.
Dieses Design hat Vorteile, aber auch die berühmteste Schwäche des gesamten C64-Umfelds: die langsame Standardkommunikation über den seriellen IEC-Bus.
Beim C64 wurde die serielle Anbindung gegenüber älteren Commodore-Systemen stark vereinfacht. Der Preis dafür war Geschwindigkeit. Wo deutlich mehr möglich gewesen wäre, blieben in der Praxis oft nur etwa 300–400 Bytes/s übrig.
Das ist der eigentliche Grund dafür, warum Fast Loader auf dem C64 so wichtig wurden. Das Problem lag nicht an einzelnen Programmen, sondern tief im offiziellen Übertragungsweg.
Die 1541 nutzt GCR (Group Code Recording) und vier unterschiedliche Geschwindigkeitszonen, um auf verschiedenen Spurgruppen eine sinnvolle Datendichte zu erreichen. Technisch ist das durchdachter, als der Ruf des Laufwerks vermuten lässt.
Das Directory liegt auf Spur 18, ebenso die BAM (Block Availability Map). Schon daran sieht man: Auch das DOS der 1541 ist kein Nebenaspekt, sondern ein technischer Raum, in dem sich viel verstehen und manipulieren lässt.
Die naheliegende Antwort auf die langsame Standardkommunikation der 1541 war: ein eigenes Ladeprotokoll. Genau das ist der Fast Loader.
Ein Fast Loader besteht aus zwei Teilen: einer Routine auf dem C64 und einer Routine, die in das RAM der 1541 übertragen wird. Ab diesem Moment arbeitet das Laufwerk nicht mehr mit seinem normalen Protokoll, sondern mit einem eigens optimierten.
Reine Software-Fast-Loader erreichen meist 1,5 bis 4 KB/s. Mit zusätzlichem Parallelanschluss – also einer direkten Verbindung zwischen C64-User-Port und 1541-Hardware – sind deutlich höhere Raten möglich. Dann nähert man sich den physischen Grenzen des Laufwerks.
„Ein Fast Loader war keine Spielerei. Er war die sachlich richtige Antwort auf einen unnötig langsamen Standardweg.“
Eine 5,25-Zoll-Diskette hat zwei physische Seiten. Die 1541 nutzt standardmäßig nur eine davon. Die andere bleibt ungenutzt – sofern man nichts daran ändert.
Die Lösung war direkt: Auf der Rückseite wurde an passender Stelle eine zweite Schreibschutzkerbe angebracht. Danach ließ sich die Diskette gedreht erneut verwenden. Das ist keine Magie, sondern eine einfache mechanische Antwort auf eine einfache mechanische Sperre.
BASIC auf dem C64 ist für viele Aufgaben zu langsam. Wer Raster stabil halten, Sprites sauber multiplexen oder schnelle Spiellogik bauen wollte, landete zwangsläufig in der Maschinensprache.
Wenn ich auf den C64 zurückblicke, dann nicht zuerst mit Nostalgie, sondern mit der Frage, was von dieser Arbeitshaltung geblieben ist. Die Antwort ist: einiges. Nicht als Registerwissen, sondern als Denkweise.
Der C64 lehrte vor allem, dass Grenzen keine Störung sein müssen, sondern Teil der Architektur. Wer das System ernst nimmt, lernt nicht nur, was offiziell vorgesehen ist, sondern was tatsächlich passiert – auf dem Bus, im Timing, im Speicher, im Zusammenspiel der Chips.
Genau diese Fragehaltung bleibt nützlich: nicht beim ersten offensichtlichen Erklärungsversuch stehen bleiben, sondern darunter schauen. Warum ist etwas langsam? Warum bricht etwas an genau dieser Stelle? Welche Systembedingung steht dahinter? Der C64 hat diese Art des Hinsehens geschärft.
Der C64 zeigt außerdem etwas, das weit über seine eigene Zeit hinausreicht: Gute Technik entsteht nicht automatisch aus vielen Ressourcen. Sie entsteht häufig aus genauer Kenntnis dessen, was bereits da ist.
Auch deshalb bleibt der C64 für mich nicht als Kultobjekt interessant, sondern als ein System, an dem sich sehr klar lernen ließ, wie viel aus einer Architektur herauszuholen ist, wenn man sie wirklich versteht.
„Am C64 lernte man früh, dass Grenzen keine Störung sein müssen, sondern Teil der Architektur.“
Diese Datei gehört zu den Commodore-, Heimcomputer-, Hardware- und Übergangssystem-Seiten im sslxy-Bereich.
Diese Seite liegt im eigenständigen sslxy-Bereich der Domain. Inhaltlich behandelt sie private technische Erinnerungen, historische Rechnerarchitektur und die nüchterne Einordnung des Commodore 64.
Genannte Marken- und Produktnamen dienen ausschließlich der sachlichen technischen und historischen Einordnung. Diese Seite ist keine Herstellerseite und steht in keiner Verbindung zu den genannten Markeninhabern.
Verantwortlich für die Domain ist der Betreiber der Hauptpräsenz. Detaillierte Angaben zum Verantwortlichen sowie Informationen zum Datenschutz stehen auf den offiziellen Hauptseiten der Domain.
Kontakt für technische Rückfragen: mail@sslxy.de
Auch diese Unterseite ist als rein informative, statische HTML-Seite konzipiert. Es werden keine Tracker, keine Analyse-Tools und keine zustimmungspflichtigen Cookies eingesetzt.
Statische Seite. Schlanke Struktur. Technischer Inhalt ohne unnötigen Überbau.