sslxy

c64

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.

System Diagnostic

> C64 ANALYSIS
CPU MOS 6510 – 0,985 MHz (PAL) / 6-Bit-I/O-Port am Chip VIDEO MOS 6569 VIC-II (PAL) – Sprites, Bitmap, Rasterstrahl, 16 Farben AUDIO MOS 6581 / 8580 SID – 3 Stimmen, Filter, Ring-Mod, Sync RAM 64 KB – davon durch ROM-Einblendung teils verdeckt, aber grundsätzlich vorhanden I/O 2× MOS 6526 CIA – Timer, Interrupt, Joystick, serieller Bus SPEICHER Bankschaltung über CPU-Port $01 – ROM/RAM/I/O konfigurierbar MINDSET verstehen, was wirklich möglich ist – nicht nur, was dokumentiert wurde
Ein System, das man erst dann wirklich kennt, wenn man seine versteckten Spielräume ebenfalls kennt.
[hardware/cpu]

MOS 6510 – nicht nur ein 6502

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.

; CPU-Port: Bankschaltung und Datasette
; $0000 = Datenrichtungsregister (1 = Ausgang)
; $0001 = Datenwort
;
; Bit 0 = LORAM / BASIC-ROM-Schaltung
; Bit 1 = HIRAM / KERNAL-ROM-Schaltung
; Bit 2 = CHAREN / I/O oder Zeichen-ROM im Bereich $D000-$DFFF
; Bit 3 = Datasette Write Data
; Bit 4 = Datasette Sense
; Bit 5 = Datasette Motor Control
;
; Wichtig: RAM liegt unter ROM/I/O weiterhin physisch vor – es ist nur verdeckt

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.

Zero Page und Stack

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.

[hardware/memory_model]

Speichermodell und Bankschaltung

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.

AdresseGrößeInhalt im Standardzustand
$0000–$00FF256 BZero Page – CPU-Port in $0000/$0001, KERNAL/BASIC-Variablen
$0100–$01FF256 BStack
$0200–$03FF512 BKERNAL- und BASIC-Systemvariablen, Tastaturpuffer usw.
$0400–$07FF1 KBStandard-Bildschirm-RAM (40×25 Zeichen)
$0800–$9FFF~38 KBFreies RAM / BASIC-Programmbereich
$A000–$BFFF8 KBBASIC-ROM (oder RAM, wenn BASIC abgeschaltet)
$C000–$CFFF4 KBFreies RAM
$D000–$DFFF4 KBI/O-Bereich: VIC-II, SID, CIA1, CIA2, Color-RAM (oder Zeichen-ROM oder RAM)
$E000–$FFFF8 KBKERNAL-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.

VIC-II und Speicherbereiche

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.

[hardware/vic-ii]

VIC-II – wie er wirklich funktioniert

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.

Badlines – wenn der VIC-II die CPU bremst

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.

Grafikmodi

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.

Multicolor-Zeichenmodus

Wie Zeichenmodus, aber jedes Pixel effektiv 2 Bit breit. Vier Farben möglich, dafür halbe horizontale Auflösung.

Hires-Bitmap

320×200 Pixel, 1 Bit pro Pixel. Freie Pixelsetzung, aber nur zwei Farben pro 8×8-Zelle.

Multicolor-Bitmap

160×200 Pixel effektiv. Vier Farben pro 4×8-Block. Grundlage vieler typischer C64-Grafiken.

Color-RAM – die besondere Eigenheit

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.

[programming/raster]

Rasterstrahl-Tricks

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.

Stabiler Raster-IRQ

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.

  • Farb-Split Hintergrundfarbe oder Rahmenfarbe werden in einer Raster-Routine geändert. So entstehen mehrere horizontale Zonen, obwohl das System offiziell nur wenige globale Farbregister bietet.
  • Horizontaler Scrolling-Split Über $D016 kann ein Teil des Bilds scrollen, während ein anderer statisch bleibt – klassische Aufteilung zwischen Spielfeld und Statusbereich.
  • FLD – Flexible Line Distance Durch gezieltes Schreiben in $D011 kurz vor den richtigen Rasterzeilen lässt sich derselbe Bildinhalt mehrfach darstellen. Das dehnt Bereiche vertikal, ohne Bilddaten im Speicher selbst zu verschieben.
  • FLI – Flexible Line Interpretation Im Bitmap-Modus wird pro Rasterzeile eine andere Farbtabelle unterschoben. Dadurch steigt die Farbauflösung deutlich – auf Kosten erheblicher CPU-Zeit und typischer Nebeneffekte.
  • DYCP – Different Y Character Positions Durch wiederholte Y-Scroll-Manipulationen entstehen wellenförmig bewegte Textzeilen. Das ist weniger dekorativ interessant als technisch: Es zeigt, wie stark die Darstellung vom exakten Rastertiming abhängt.

„Der Rasterstrahl ist kein Grafikdetail, sondern eine Taktfrage. Wer das verstanden hat, sieht den VIC-II anders.“

[hardware/sprites]

Sprites und Multiplex

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.

Wie Multiplex funktioniert

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.

; Sprite-Multiplex: Grundprinzip
;
; 1. Raster-IRQ für Y-Position des untersten aktiven Sprites
; 2. Im IRQ: neue Y-Position in $D001/$D003/... schreiben
; 3. Sprite-Pointer aktualisieren (letzte 8 Bytes des Screen-RAM)
; 4. Nächsten IRQ für die Y-Position des nächsten Sprites setzen
; Wichtig: X-Position und Pointer müssen rechtzeitig vor dem neuen Sichtbereich gesetzt sein

Sprite-Priorität und Kollisionserkennung

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.

[programming/border_tricks]

Open Border – den Rahmen aufbrechen

Der C64-Bildschirm hat einen sichtbaren Rahmen, den Border. Offiziell gehört dieser Bereich nicht zum nutzbaren Bild. Praktisch lässt er sich manipulieren.

Unterer und oberer Rahmen – vertikales Open Border

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.

Seitlicher Rahmen – horizontales Open Border

Ä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.

; Vertikales Open Border – unterer Rand
; Timing: muss in passender Rasterphase ausgeführt werden
;
LDA $D011 ; aktuellen Wert lesen
AND #$EF ; Bit 4 löschen (Display off)
STA $D011 ; kurz deaktivieren
NOP ; einen Zyklus warten
ORA #$10 ; Bit 4 setzen (Display on)
STA $D011 ; wieder aktivieren
; Border-Status ändert sich anders als im Standardablauf

Beide Varianten zusammen machen sichtbar, dass der scheinbar feste Bildschirmrahmen in Wahrheit ebenfalls ein Ergebnis interner Zustandslogik ist – und damit prinzipiell veränderbar.

[hardware/sid]

SID – was der Chip wirklich kann

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.

Ring-Modulation und Sync

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.

Kombinierte Wellenformen

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.

Der Voice-3-Trick

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.

; SID Voice 3: Pseudozufall über Rauschgenerator
;
LDA #$FF
STA $D40F ; Voice 3 Freq Hi
LDA #$FF
STA $D40E ; Voice 3 Freq Lo
LDA #$81 ; Noise + Gate
STA $D412 ; Voice 3 Control
LDA $D418
ORA #$80
STA $D418 ; Voice 3 aus dem Ausgangsmix nehmen
; Danach liefert LDA $D41B veränderliche Werte

SID 6581 vs. 8580 – nicht dasselbe

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.

SID als ADC – analoger Eingang

Ü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.

[hardware/cia]

CIA – Timer, Interrupts und was noch daran hängt

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.

Timer-Interrupts und NMI

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.

Tastatur-Matrix

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.

[hardware/1541]

Die 1541 und ihre Probleme

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.

Das Serial-Bus-Problem

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.

Warum die 1541 dennoch interessant ist

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.

; 1541 Spur-Layout: 4 Geschwindigkeitszonen
;
; Spuren 1-17: 21 Sektoren / Zone 3
; Spuren 18-24: 19 Sektoren / Zone 2
; Spuren 25-30: 18 Sektoren / Zone 1
; Spuren 31-35: 17 Sektoren / Zone 0
;
; Spur 18: Directory-Spur / BAM
; Gesamt: 664 Blöcke nutzbar

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.

[programming/fastloader]

Fast Loader – wie und warum

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.

Burst-Übertragung und Parallelanschluss

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.

  • 1541-RAM nutzen Der Loader-Code wird in das RAM der 1541 geschrieben und dort ausgeführt. Erst dadurch bekommt das Laufwerk selbst genug Eigenlogik für schnellere Übertragungswege.
  • Eigenes Protokoll statt KERNAL-Weg Der Standardpfad wird umgangen. Clock- und Data-Leitungen werden mit engerem Timing genutzt, als es die offizielle Routine vorsieht.
  • KERNAL-Bypass Viele Loader biegen Ladevektoren um oder ersetzen KERNAL-Dienste direkt, um den Standardweg vollständig zu vermeiden.

„Ein Fast Loader war keine Spielerei. Er war die sachlich richtige Antwort auf einen unnötig langsamen Standardweg.“

[hardware/disk_tricks]

Disketten lochen und andere Laufwerk-Tricks

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.

Das Lochen

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.

Weitere Disk-Tricks

  • Halbspur-Zugriff Über die feine Kopfpositionierung lassen sich Halbschritte anfahren. Das wurde besonders für Kopierschutz und Sonderformate genutzt.
  • Spur 36 und darüber Offiziell endet die Diskette bei Spur 35. Praktisch lassen sich oft weitere Spuren nutzen – mit sinkender Zuverlässigkeit.
  • Directory-Manipulation Das Verzeichnis ist direkt sektorweise zugänglich. Einträge können versteckt, verändert oder wiederhergestellt werden.
  • BAM direkt beschreiben Wer die Block Availability Map direkt verändert, greift unmittelbar in die Dateisystemlogik des Laufwerks ein.
[programming/techniques]

Maschinensprache-Techniken

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.

  • Selbstverändernder Code Operanden werden zur Laufzeit angepasst, um Adressrechnungen zu sparen. Das ist nicht schön, aber schnell.
  • Unrolled Loops Schleifen werden ausgeschrieben, um Zähler- und Sprungaufwand zu vermeiden. Zeit wird gegen Platz getauscht.
  • Tabellen statt Berechnung Sinus-, Multiplikations- oder andere Werte werden vorbereitet abgelegt. Rechenzeit wird gegen Speicher eingetauscht.
  • Zero-Page-Nutzung maximieren Wer die Zero Page gut kennt, schreibt kürzeren und schnelleren Code.
  • Interrupt-Latenz kennen Wer IRQs nutzen will, muss wissen, was zwischen Auslösung und tatsächlicher Routine vergeht.
  • Stack als temporärer Speicher In engen Spezialfällen lässt sich auch der Stack selbst anders nutzen als nur für Rücksprungadressen.
  • PAL/NTSC unterscheiden Timing-Code ist nie völlig plattformneutral, solange das System in unterschiedlichen Video-Standards existiert.
; Beispiel: schnelle Bildschirmbereinigung (unrolled)
;
LDA #$20
STA $0400
STA $0401
STA $0402
; ... weitere direkte Schreibzugriffe
; Weniger Schleifenlogik, mehr direkter Durchsatz
[meaning/continuity]

Was der C64 gelehrt hat

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.

[Lesson_Transfer] C64 -> langfristiges Denken
> Grenzen sind keine Fehler – sie sind Systemeigenschaften
> Dokumentation beschreibt den vorgesehenen Weg, nicht alle realen Möglichkeiten
> Timing ist real – wer es ignoriert, bekommt instabiles Verhalten
> Weniger Ressourcen erzwingen oft die sauberere Struktur
> Ergebnis: strukturiertes Denken als Grundhaltung, nicht nur als Technik

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.“