In dieser Reihe von Beiträgen habe ich vor, einen C64-Emulator von Grund auf als Webanwendung zu entwickeln.
Die auf dieser Reise gesammelte Erfahrung möchte ich hier dokumentieren. Das Projekt wurde stark von Johan Steenkamp's Blog inspiriert, da ich sein Vorgehen sehr schätze.
Warum beschreibe ich dann mein Vorgehen, wenn es so etwas schon gibt?
Zum einen, weil ich das Projekt in Typescript umsetzen werde und ich nicht immer den gleichen Weg gehen werde.
Zum anderen prüfe ich damit, ob ich das jeweilige Thema verstanden habe, denn wenn ich es verstehe, dann kann ich es auch beschreiben.
Ich werde immer wieder Verweise auf Dokumentation oder andere Blogs einfügen, die mir geholfen haben bestimmte Punkte zu verstehen, die mir noch nicht ganz klar waren.
Also viel Spaß beim lesen ...
NOTE OF THANKS
Hello Johan,
I would like to thank you very much for your blog. So you inspired me to start the journey myself and to write my own C64 emulator.
Your way of explaining the topics that were not known to me until then or only a little bit known helped me to get a better understanding of the subject matter.
I find the implementation of the addressing modes particularly elegant. That helped me a lot, since I first wrote an emulator (Space Invaders Arcade machine with the Intel 8080 CPU) on my first attempt to implement each statement multiple times without a test suite. The debugging was hell, but in the end I was able to run the attract mode, but the cpu had still some bugs that prevented me from playing the game. This is now 3 years ago and at the time I had very little experience of how a CPU works internally.
Today I ventured again to the topic and found your blog. Currently I have reached the point where the emulator boots and I can enter BASIC programs. With that I came further than I ever expected.
Again, many thanks. I will also describe my path in the blog, but in German, because it is easier for me. It should give others the opportunity to devote themselves to this exciting topic.
Greetings from Germany
Sven
My humble beginnings ...
Hintergrund
Damals war der Commodore Amiga 500 mein erster Computer. Auch heute noch fasziniert mich, was damals mit der vorhandenen Technik möglich war. Außerdem wollte ich immer wissen, wie ein solcher Rechner funktioniert.
Daher ist die Möglichkeit, alte Maschinen zu emulieren ein interessantes Thema, mit dem ich mich in meiner Freizeit beschäftige.
Neben der Nutzung von Emulatoren, wollte ich schon immer selbst einen Emulator schreiben. Aber meine bisherige Erfahrung mit der Programmierung von Emulatoren beschränkt sich auf zwei Maschinen.
Einen Chip-8 Emulator und einen Intel 8080 Emulator der die Arcade Maschine Space Invaders emuliert. Dank der reichlich vorhandenen Dokumentation ist das ein guter Einstieg um sich mit der Materie zu beschäftigen.
Neben dem Spaß, den man bei der Programmierung hat, lernt man auch den Frust kennen, wenn sich die Maschine wegen einer Kleinigkeit nicht so verhält, wie man es erwartet.
Meiner Meinung nach ist es eine lohnende Erfahrung.
Für mein nächstes Projekt möchte ich einen Teil des C64 emulieren. Ziel wird es sein, den Emulator als Web-Anwendung zu implementieren bis hin zu der Möglichkeit BASIC Anwendungen in dem Emulator zu programmieren.
Ich habe mich gefragt, geht das überhaupt in JavaScript?
Diese Frage hat sich auch Johan Steenkamp gestellt und startete einen Blog, in dem er die Programmierung eines C64 Emulators beschreibt.
Durch seinen Erfolg bestärkt, werde ich auch versuchen einen C64 Emulator zu schreiben, um so meine TypeScript Kenntnisse zu verbessern.
Beginnen werde ich mit der MOS6510 CPU, die im C64 verbaut wurde.
Der Plan
Als erstes Etappenziel soll die virtuelle CPU einen Befehl inkl. Parameter aus dem virtuellen Speicher auslesen. Der Parameter soll dann mittels einem zweiten Befehl an eine andere Stelle im Speicher geschrieben werden. Dazu werden die beiden Befehle LDA und STA implementiert.
Den Prozessorstatus und der Speicherinhalt wird als Webseite angezeigt. Mittels eines Buttons kann der nächste Befehl ausgeführt werden.
Als Vorlage für die Implementierung der Anweisungen werden die Dokumente 6502/6510/8500/8502 Opcode Matrix, 64doc, v1.8 und Instruction Reference verwendet.
Zu den Instruktionen werden Testfälle geschrieben, um die Implementierung regelmäßig zu prüfen.
Sobald der gesamte Befehlssatz implementiert und hinreichend getestet ist, wird der virtuelle C64 mit seinen ROMs (KERNAL, BASIC und CHARACTER ROM) gebootet.
Im Adressbereich, in dem sich der Bildschirmspeicher befindet, sollte die Willkommensnachricht des BASIC Interpreters erscheinen. Wenn dieser Teil erfolgreich implementiert wurde, wird ein Teil der weiteren Hardware hinzugefügt.
Dazu gehört die einfache Implementierung eines Bildschirms, der den Inhalt des virtuellen Bildschirmspeichers darstellt. Initial wird nur der Textmodus (Schwarz-Weiß) implementiert.
Außerdem wird eine virtuelle Tastatur implementiert, um Eingaben an den virtuellen Rechner weiterzugeben.
Wenn dies alles funktioniert, ist der nächste Schritt die Implementierung des Disketten-Laufwerks VC-1541 oder der Datassette 1530.
Aber fangen wir erst einmal an und schauen, wie weit wir kommen...