Tutorial: Commodore 64 Emulation mit einem Arduino

Es gibt zahlreiche C64-Emulatoren für verschiedene Plattformen, darunter PCs, Handhelds und Raspberry Pi. Bei Arduino Boards hingegen sieht es anders aus. Der Grund dafür ist einfach: Die begrenzten Ressourcen dieser kleinen Rechner reichen nicht für diese anspruchsvolle Aufgabe aus. Dennoch hat der Entwickler michalin den Versuch unternommen, den C64 auf einem Arduino Nano oder Mega 2560 zu emulieren. Das Ergebnis ist erstaunlich, auch wenn kein vollwertiger C64 zu erwarten ist, da die erforderlichen Ressourcen fehlen. Das Projekt ist dennoch sehr interessant und zeigt die Möglichkeiten dieser Hardware auf.

Quelle dieser Anleitung: Arduino-C64-Emulator von michalin (License)


Bevor es losgeht, noch ein paar Hinweise (Wichtig!)
  • Achte beim Bau der Hardware darauf, Kurzschlüsse zu vermeiden, da diese den Arduino beschädigen können.
  • Arbeiten an der Hardware dürfen ausschließlich im spannungsfreien Zustand durchgeführt werden.
  • Um statische Aufladungen zu vermeiden, wird die Verwendung eines Antistatik-Armbandes empfohlen.
  • Es wird keine Haftung für Schäden übernommen, die direkt oder indirekt aus der Nutzung dieser Anleitung entstehen.

Was kann dieser Emulator und was nicht

Um Missverständnisse zu vermeiden, wird im Folgenden eine Liste mit den Fähigkeiten dieses kleinen Emulators aufgeführt. Die Funktionen sind stark eingeschränkt, es sind jedoch einige grundlegende Funktionen vorhanden.

Was möglich ist:

  • Das Basic ist funktionsfähig und einfache Basic-Programme können ausgeführt werden
  • Einfache Grafiken, für die eine gewisse Vorbereitung erforderlich ist, können angezeigt werden
Was nicht möglich ist:
  • Keine Farbdarstellung. Die Bilddarstellung erfolgt in Schwarz/Weiß
  • Die Geschwindigkeit erreicht nicht das Niveau des originalen C64
  • Es ist nicht möglich, auf einen Datenträger zuzugreifen
  • Keine Audioausgabe vorhanden
  • Leider ist der verfügbare Speicher äußerst begrenzt. Je nach gewähltem Arduino-Modell steht lediglich ein Kilobyte Speicherplatz für das Basic zur Verfügung
Dieses Projekt zielt nicht darauf ab, einen vollständigen und funktionsfähigen C64-Emulator auf dem Arduino zu erstellen. Vielmehr soll es die Möglichkeiten aufzeigen, die sich aus einem solchen Unterfangen ergeben. Der Entwickler bezeichnet es daher treffend als Fun-Projekt.

Die Komponenten

Für den Aufbau dieses kleinen Projekts werden nur wenige Komponenten benötigt, die in der folgenden Liste aufgeführt sind.
Die Wahl der Arduino-Variante ist nicht entscheidend, da die Emulation auf allen Systemen möglich ist. Der Arduino Mega 2560 bietet jedoch 6 KB Basic-Speicher, wodurch der Hires-Modus aktiviert und einige Bilder dargestellt werden können, was von anderen Versionen nicht unterstützt wird.

Die Verdrahtung

Die Verdrahtung in diesem Beispiel erfolgt auf einer Steckplatine, kann aber auch auf einer Prototypenplatine gelötet werden. Die Verdrahtung erfolgt gemäß dem folgenden Schema.

Original Schaltung von michalin (github.com/michalin/Arduino-C64-Emulator)

Das Pinout des Arduino Mega 2560 ist unter folgendem Link einsehbar: devboards.info.

Die Firmware flashen

Bevor wir uns mit dem Flashen der Firmware befassen, müssen wir sicherstellen, dass Windows den Arduino korrekt erkennt. Dafür benötigen wir einen Treiber, der von der jeweiligen Arduino-Variante abhängt. Für den Arduino Nano finden wir den Treiber unter www.wch-ic.com. Die korrekte Installation können wir im Gerätemanager von Windows überprüfen.


Um die Firmware zu flashen, benötigen wir einige Softwarekomponenten. Zuerst müssen wir die Arduino IDE herunterladen, die wir unter www.arduino.cc finden. Lade anschließend das gesamte Projekt von der GitHub herunter. Entpacke das ZIP-Archiv und öffne den Ordner C64. Öffne die .ino-Datei in diesem Ordner mit der Arduino IDE.


Bevor wir mit dem Flash-Vorgang beginnen, stellen wir sicher, dass die Einstellungen der Arduino IDE korrekt sind. Die Arduino-Variante und der Port müssen gewählt werden.


Starte den Kompiliervorgang. Sobald die Kompilierung abgeschlossen und die Firmware erfolgreich hochgeladen wurde, kann mit dem ersten Test fortgefahren werden, vorausgesetzt, es wurden keine Fehler festgestellt.

Der Funktionstest

Dieser erste Test dient ausschließlich der Überprüfung der Bildanzeige. Der Arduino wird an den Monitor oder Fernseher angeschlossen und mit Strom versorgt. Nach dem kurzen Ladevorgang sollte der C64-Screen auf dem Bildschirm angezeigt werden.


Schließe eine Tastatur an und gib einige Befehle ein. Sollten Probleme auftreten, könnte es an einem der folgenden Punkte liegen:
  • Sollte kein Bild angezeigt werden oder das Bild flackern, ist es möglich, dass der Monitor oder Fernseher nicht mit dem Signal kompatibel ist. Dies habe ich bei meinen Tests selbst festgestellt und musste daher auf einen anderen Monitor zurückgreifen.
  • Eine nicht reagierende Tastatur ist nicht immer auf eine falsche Verdrahtung zurückzuführen. Es ist auch möglich, dass die Tastatur nicht PS/2-kompatibel ist. Von den vier von mir getesteten Tastaturen funktionierten nur zwei.
  • Das Flackern des Bildes bei der Eingabe von Befehlen ist eine normale Folge der Tastatureingabe, wie der Entwickler erklärte.  Jede Tastatureingabe löst einen Interrupt aus, was zu diesem Flackern führt.
An dieser Stelle sind unsere Möglichkeiten eingeschränkt. Wir können nur einige grundlegende Befehle eingeben. Um die Funktion zu testen, geben wir die folgenden Befehle ein:

10 PRINT “TEST ”;
20 GOTO 10
RUN

Das Programm wird zwar ausgeführt, allerdings mit deutlich verringerter Geschwindigkeit.

Ein Bild im Hires-Modus darstellen

Dieses Vorhaben ist ausschließlich mit dem Arduino Mega 2560 kompatibel, da nur dieser über die erforderlichen 6 KB Basic-Speicher verfügt. Der Entwickler stellt mehrere Bilder zur Verfügung, die mit dem Emulator angezeigt werden können. Eines dieser Bilder ist bereits in der Firmware des Arduino integriert. Um es anzuzeigen, wechsle in den Hires-Modus, mit dem folgenden Befehl:

POKE 53265,32

Das Bild eines Tigers wird nun auf dem Bildschirm angezeigt. Um ein anderes Bild anzuzeigen, muss eine kleine Änderung in der Firmware vorgenommen und diese neu geflasht werden. Nach dem Wiederöffnen der Arduino IDE wird im Reiter „Bitmap.h“ eine Liste der verfügbaren Bilder angezeigt. Neben „bnr“ wird die entsprechende Ziffer eingegeben, wobei die Zählung mit Null beginnt. Das erste Bild ist Bild 0, das zweite Bild 1 und so weiter.


Nach dem erneuten Flashen der Firmware und der Aktivierung des Hires-Modus sollte das entsprechende Bild angezeigt werden.

Eigene Bilder erstellen

Jetzt erstellen wir unser eigenes Bild in wenigen Schritten und zeigen dies anschließend mit dem Emulator an. Dafür muss das Bild in ein spezielles, farbloses Format umgewandelt werden. Wähle zunächst ein beliebiges Bild aus. Ein Bild mit hohem Kontrast ist in der Regel besser geeignet, da es die Erkennbarkeit der Details erleichtert. Zum Umwandeln in das entsprechende Format benötigen wir das Bildbearbeitungsprogramm Gimp, das wir unter www.gimp.org herunterladen können. Öffne Gimp und lade das gewünschte Bild.


Skaliere das Bild anschließend auf 320 x 200 Pixel und schneide es nach Wunsch zu.


Nach Abschluss dieser Schritte wird das Bild in das 1-Bit-RAW-Format konvertiert (siehe Bild -> Modus -> Indiziert). Im Dropdown-Menü wählen wir als Dithering-Effekt „Positioniert“. Klick auf „Umwandeln“, um ein Bild zu erhalten, das ausschließlich aus weißen und schwarzen Pixeln besteht, wobei die Erkennbarkeit des Motivs erhalten bleibt.


Um das Bild zu speichern, müssen wir es zunächst exportieren und anschließend mit der Erweiterung „.data“ speichern. Die resultierende Datei sollte genau 64 KB groß sein.


Im letzten Schritt muss das Bild für die Nutzung durch den C64-Emulator weiterverarbeitet werden. Der Entwickler des Projekts stellt auf seiner GitHub-Seite ein praktisches Tool namens „hires.exe” zur Verfügung. Wir laden dieses herunter, öffnen die Eingabeaufforderung (CMD) von Windows und geben den entsprechenden Befehl ein:

hires.exe [bild.data] [NameHiresBild.h]

In meinem Fall sieht das so aus wie in der folgenden Abbildung. Natürlich müssen die Pfade entsprechend angegeben werden.


Das resultierende Bild mit der Endung .h wird in den C64-Ordner des Arduino-IDE-Projektes kopiert. Öffnet man nun das Projekt in der Arduino IDE, sollte oben im Fenster ein neuer Reiter mit dem Namen des erstellten Bildes erscheinen. Klicke darauf und ändere die erste Zeile mit dem Bildnamen, wie in der Abbildung unten gezeigt.


Im Reiter „bitmap.h“ geben wir den Namen unseres neuen Bildes ein.  Neben „bnr“ muss natürlich die entsprechende Ziffer eingefügt werden.


Nach dem Kompilieren und Hochladen der Firmware sollte der Arduino C64 Emulator unser Bild im Hires-Modus anzeigen.