Architekturvorstellung:
Anbei erst einmal ein grobes UML-Diagramm, wie ich mir die grundsätzliche Architektur vorstelle.
Die einzelnen Chips wie die CPU, VIC, SID und die beiden CIAs werden als eigene Klassen implementiert, die sich von einer abstrakten Basisklasse ICChip ableiten.
Wie wohl sofort erkennbar, habe ich nicht zwei separate Busse für Daten und Adressen vorgesehen, sondern alles zu einem zusammengefasst sowie PLA eingespart. Die Idee ist hier, alles in den Datenbus zu intergrieren, welches als eine Schnittstelle zwischen den Memories und den einzelnen Chips agiert. Ob das am Ende auch so klappt, werden wir sehen. Die Kommunikation via den Datenbus soll über Messages erfolgen, die aus Adresse, Daten sowie einem Flag Lesen/Schreiben bestehen und vom Datenbus zum richtigen Objekt geschicht werden.
Ebenso von einer Basisklasse abgeleitet sind die beiden CIAs. Auf dem Diagram habe ich hier die Verbindung zum Datenbus vergessen.
Die RAM-Bereiche sind auch eigene Klassen, die sich von entweder ROM (nur read()) oder RAM (read(), write()) als abstrakte Basis ableiten. Im Diagram ist nur ZeichenROM als Implementierung da, aber die Idee ist, für jeden Memoryblock eine eigene Klasse zu definieren, die in einem Array den relevanten Speicherinhalt hält. Der Datenbus hält die Pointer darauf mit den zugehörigen Memorybereichen und weiß, wohin er die Anfrage der CPU etc. zu schicken hat
Kommunikation nach Außen (Ausgabe GUI, Ausgabe TON, Ports, Tastatur etc) möchte ich über definierte nachrichtenbasierte APIs machen: die Komponenten setzen Nachrichten mit ihren Ausgaben ab und die Peripherienimplementierungen holen diese ab. Also beispielsweise klare Trennung zwischen der errechneten grafischen Darstellung des VICs und dem tatsächlichen grafischen Rendern durch die Implementierung der GUI. Die Idee dahinter ist, dass sich damit Komponenten wie GUI oder Diskettenlaufwerk nach Belieben austauschen gegen anderen sowie auch für andere Projekte recyceln lassen, da sie nur die entsprechende API berücksichtigen müssen.
Die einzelnen Befehle der CPU möchte ich als eigene Klassen implementieren, die von der CPU über eine Map mit opCodes als Key aufgerufen werden. Damit könnte man hier auf endlose If-Baums verzichten und es ist eben wesentlich eleganter. Darüber hinaus ist die Lösung schön erweiterbar durch weitere Befehle oder andere Implementierung der Befehle, sollte es notwendig sein.
Die Bildschirmausgabe wird ein separates Päckchen sein, vermutlich entweder in JavaFX oder doch in gutem, altem Swing.
Über Außeninterfaces wie Diskettenlaufwerk mache ich mir noch keine Gedanken, kommt später im Sprint x+y...
Sodele, dann los ans Aufsetzen des Projektes und die Implementierung...