Ich habe in meinem diesjährigen Urlaub ein Projekt umgesetzt, das ich eigentlich anders geplant hatte - ich wollte meine eigene CPU from scratch bauen...
Ich habe bereits früher Links zu einem Thema gesammelt, das mich schon viele Jahre interessiert und beschäftigt hat: Aus einfachen TTL-Schaltkreisen eine eigene CPU bauen zu können und darauf aufbauend dann einen simplen Computer zu konstruieren. Im Internet gibt es dazu unzählige Anleitungen, von denen ich einige unten in einer Linksammlung zusammengefasst habe.
Ich habe auch damit geliebäugelt, diese Bauanleitungen konkret umzusetzen. Da ich mich ebenfalls seit iniger Zeit für FPGAs interessiere, kam mir die Idee, diese Eigenbau-CPU nicht in TTL-Schaltkreisen zu realisieren, sondern innerhalb eines FPGA.
Da die diversen FPGA-Entwickler- und -Schnupper-Boards aber auch heute noch einen - für mich - zu hohen Anschaffungswiderstand aufweisen, habe ich mit mir selbst folgendes Abkommen abgeschlossen: sobald das erste Assemblerprogramm auf einer simulierten Eigenbau-CPU erfolgreich und korrekt läuft, darf ich darüber nachdenken, ein solches Entwickler-Board anzuschaffen. Nun habe ich bereits einige Male begonnen, einen solchen Simulator zu erstellen, bin aber jedesmal wieder bereits über der ALU abgestorben.
Bereits deren Umsetzung war so komplex, dass ich irgendwann die Lust verloren habe - schließlich mache ich das in meiner Freizeit und ich muss dabei das Gefühl haben, dass es mir Spaß macht...
Dieses Mal habe ich wieder begonnen wie immer: Ich habe zunächst das Internet durchforstet, um herauszufinden, ob es zu diesem Thema neue Literatur oder Projekte gibt. Dabei stolperte ich über einen Artikel, bei dem ich neue Hoffnung fasste, was die Eigenbau-Idee anging:
Hier wird ein RISC-CPU beschrieben, die wirklich die einfachste mögliche darstellt: Sie verfügt über genau eine Operation, die in wenigen Teilschritten beschrieben ist:
Zwei Kunstgriffe, um daraus eine vollwertige turing-vollständige CPU zu bauen werden in dem Original-Artikel noch benannt: Es wird eine einfache Arithmetik-Logik-Einheit an einer bestimmten Adresse im Arbeitsspeicher eingeblendet, so dass ein Schreiben an (oder Lesen aus) eine der ALU-Adressen bestimmte Rechenoperationen auslöst. Weiterhin ist der Programmzähler keine extra Baugruppe, sondern wird an einer bestimmten Adresse im Arbeitsspeicher gehalten. Dadurch ist es Code, der auf dieser CPU ausgeführt wird möglich, diese spezielle Speicherstelle zu überschreiben und man kann somit Sprünge und Verzweigungen im Code realisieren.
Wer das Original-Dokument mit den oben angegebenen Teilschritten vergleicht, wird feststellen, dass meine Implementierung vom Original abweicht. Ich habe an mehreren Stellen des Originaldokument Ungvenauigkeiten und Fehler gefunden, die erst bei der praktischen Simulation zu Tage treten. Ein weiteres Problem neben dem Zeitpunkt der Erhöhung des Programmzählers ist die Beschreibung des bedingten Verzweigungen im Original-Dokument: Meine Simulation zeigte, dass das beschriebene Prinzip zwar korrekt ist, allerdings noch ein Offset berücksichtigt werden muss, damit es tatsächlich in der Praxis funktioniert.
Ich habe sehr schnell gemerkt, dass das Schreiben von Programmen - auch von sehr kleinen - mit reinem Maschinen-Code extrem mühselig ist und - wäre ich dabei geblieben - auf gar keinen Fall zu schnellen Resultaten geführt hätte. Vielleicht hätte der damit verbundene Frust eventuell sogar dazu geführt, dass ich auch dieses Projekt wieder frühzeitig aufgegeben hätte.
Allerdings wurde im Original-Dokument auch auf einen Makro-fähigen Assembler verwiesen, was mich an meine schönen ersten Programmierversuche auf dem KC 85/4 mit dem Modul M027 erinnert hat. Und so fasste ich den Entschluss, für meine CPU einen eigenen Makro-fähigen Assembler zu schreiben.
Damit war es mir möglich, entsprechende Makros zu schreiben, die mir erlaubten, über die im Original-Dokument besprochenen und angedeuteten Möglichkeiten und Fähigkeiten dieser Architektur hinauszugehen: Der Simulator wurde um die angesprochenen Probleme bereinigt und der Assembler beherrscht Makros, die die Implementierung eines Stacks ermöglichen, so dass auch Unterprogrammaufrufe in Assemblercode möglich sind.
Ich habe den bisherigen Stand in einem Projekt veröffentlicht: In dem Projekt sind sowohl der Simulator als auch der Assembler enthalten.
minimal instruction set
Epigrams on Programming
The Ultimate RISC
The SMAL Linker
A Minimal CISC
Die Arithmetisch-Logische Einheit ALU 74181
Microprocessor Design/Wire Wrap
Arithmetic Operations on Binary Numbers
Overflow and Underflow in Java
18.02.2022
Nachdem ich die ersten Beispielprogramme mit meinem Makro-Assembler für den Ultimate RISC geschrieben hatte, wurde mir klar, dass es sehr mühsam wäre, weitere Experimente ohne GUI zu machen...
Multi-User-WebDAV, Docker, GitHub
17.11.2019
Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...
Weiterlesen...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Gui Hardware Java Jupyter Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
In eigener Sache...
Weiterlesen...Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.
Weiterlesen...Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.
Weiterlesen...Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.
Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.
Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...
PS: Meine öffentlichen Codeberg-Repositories findet man hier.