Wie man einen 8-Bit-Computer aus C-Header-Dateien baut
Stellen Sie sich vor, Sie haben sich entschieden, einen Emulator für den Commodore 64 oder ZX Spectrum zu schreiben. Normalerweise wird das zu einem tiefen Eintauchen in die Z80- oder MOS-6502-Prozessorhandbücher, dem Implementieren von Timings und dem Versuch, alles mit der Grafikausgabe zum Laufen zu bringen. Aber es gibt ein Projekt, das einen anderen Ansatz bietet — es wie den Zusammenbau eines Bausatzes auf einem Steckbrett zu behandeln.
Wir sprechen über das Chips-Repository von Entwickler floooh. Es ist eine Sammlung von 8-Bit-Chip-Emulatoren und vollständigen Systemen, geschrieben in reinem C. Das Haupt-Highlight ist, dass alles in Header-Dateien verpackt ist (Header-Only), und die Interaktion zwischen Komponenten ahmt reale physische Pins nach.
Was ist der Kern dieses Projekts
Wenn wir Code schreiben, sind wir an Objekte, Methoden und Callbacks gewöhnt. In chips funktioniert alles anders. Der Autor hat das Konzept der Pin-Bit-Masken eingeführt. Jeder Chip hat eine Funktion tick, die eine 64-Bit-Zahl annimmt. Jedes Bit in dieser Zahl repräsentiert den Zustand eines bestimmten Chip-„Beins": Adressbus, Datenbus, Lese-/Schreibsignale oder Interrupts.
Sie geben eine Maske als Eingabe, die Funktion berechnet einen Taktzyklus des Chips und gibt eine aktualisierte Maske zurück. Um einen Computer zu bauen, „verdrahten" Sie buchstäblich in Code, kopieren Bits von der Ausgabemaske eines Chips zur Eingabemaske eines anderen Chips. Das fühlt unglaublich logisch an, wenn Sie jemals einen Lötkolben in der Hand gehalten oder sich in alte Hardware-Schaltpläne vertieft haben.
Was befindet sich in der Box
Das Repository enthält eine ordentliche Sammlung von Hardware aus der goldenen Ära der Heimcomputer.
Zum Start — Prozessoren. Da gibt es die Klassiker: Z80, 6502 und 80C80. Zusammen mit ihnen kommen Peripherie-Chips, ohne die ein Computer nicht bootet. Zum Beispiel der i8259-Interrupt-Controller, der i8253-Timer oder der MC6845-Video-Controller.
Neben einzelnen Komponenten hat der Autor auch fertige Zusammenstellungen in das Projekt aufgenommen. Sie können die Emulation von Folgendem ausführen:
- Amstrad CPC 464/6128
- Commodore 64
- ZX Spectrum 48/128
- Acorn Atom
- Und sogar den sowjetischen RK-86 (oder besser gesagt, seinen nahen Verwandten basierend auf dem 80C80)
All dies ist in einem C99-Subset geschrieben, das GCC, Clang und sogar MSVC ohne Probleme verarbeiten. Keine externen Abhängigkeiten — fügen Sie einfach die entsprechende .h-Datei ein und schon kann es losgehen.
Wie es technisch funktioniert
Trotz des Strebens nach „Reinheit" bei der Pin-Simulation hat der Autor vernünftige Kompromisse für die Leistung gemacht. Wenn wir ehrlich jede Logik-Gatter simulieren würden, würde der Emulator selbst auf High-End-Hardware kriechen. Deshalb ist die Adressdecodierung in den System-Emulatoren oft vereinfacht.
Interessant ist, wie das Testen gehandhabt wird. Es gibt keine Tests im Haupt-Repository — sie sind in einem separaten Projekt chips-test. Dort sind auch die Verwendungsbeispiele. Und wenn Sie sehen möchten, was es in einem Browser leisten kann, hat der Autor Demos, die nach WebAssembly kompiliert wurden. Sie laufen sehr schnell, was die Machbarkeit des Header-Only-Ansatzes bestätigt.
Praktischer Nutzen
Warum sollte ein moderner Entwickler dies benötigen, wenn es Dutzende von fertigen Emulatoren gibt?
Erstens ist es eine ideale Grundlage für die Erstellung eigener spezialisierter Tools. Wenn Sie Code für einen alten Prozessor debuggen oder einen benutzerdefinierten Debugger schreiben müssen, bietet chips eine fertige, getestete und sehr kompakte Grundlage.
Zweitens ist es ein ausgezeichnetes Lehrbuch über Computerarchitektur. Anstatt trockene Theorie zu lesen, können Sie genau sehen, wie Daten vom Prozessor über den Bus zum Speicher fließen, indem Sie einfach Breakpoints im Code setzen.
Drittens ist das Projekt für Embedded-System-Enthusiasten nützlich. Dank der fehlenden Abhängigkeiten und des geringen Ressourcenbedarfs können diese Emulatoren auf einem Mikrocontroller laufen und einen „Computer im Computer" erzeugen.
Lohnt es sich, es zu versuchen
Wenn Sie ein Retro-Computing-Fan sind oder einfach sauberen, prägnanten C-Code lieben, sollten Sie sich auf jeden Fall das Repository ansehen. Die Bit-Masken-Architektur ist ein frischer Ansatz für das alte Problem der Emulation.
Das Projekt lebt, wird aktiv aktualisiert und gepflegt. Natürlich ist die Dokumentation in der README selbst ziemlich kurz, aber der Code ist so sauber geschrieben, dass man leicht selbst durchsteigt. Für diejenigen, die noch tiefer graben möchten, hat der Autor sogar eine Sammlung von Schaltplänen und Handbüchern in einem begleitenden Repository emu-info zusammengestellt.
Ein Hinweis — dies ist keine „Plug-and-Play"-Bibliothek für den durchschnittlichen Benutzer. Um ein Bild auf den Bildschirm zu bekommen, müssen Sie ein Grafik-Backend (wie Sokol oder SDL) anschließen und herausfinden, wie man Daten aus dem emulierten Videospeicher in Pixel umwandelt. Aber für diejenigen, die gerne in die „Eingeweide" von Systemsoftware eintauchen, ist das eher ein Plus als ein Minus.
Ähnliche Projekte