4 Bit Prozessor, Teil 4 – Erweiterungen

Ich habe einen Simulator in Java geschrieben damit man den Instruktionssatz der 4 Bit CPU einen Praxistest unterziehen kann, ohne dass man Hardware aufbauen und verändern muss. Und erste Gehversuche haben gleich ein paar Schwächen aufgedeckt.

Als ich den Entwurf gestartet habe, hatte ich die Register R1 bis R4 als general purpose Register angesehen und darum den Befehlssatz gebaut. Allerdings hätte eine 2-Adress-Maschine zu viele Bits für die Quell- und Zielregister verbraucht. Deshalb habe ich einen Akkumulator eingeführt, welcher bei Operationen mit zwei Operanden implizit den ersten Operanden enthält und somit zwei Bit spart. Dabei habe ich aber nicht ausreichend darauf geachtet, dass der Akku nun auch ein general purpose Register sein sollte, so fehlte z.B. ein Indexregister indirect load. Wenn der Akku aus der Indexregister Adresse geladen werden sollte, wurde ein temporäres Register benötigt und die beiden Befehle ld R1 [IX1] und ld A R1. Das ist jetzt nach der Erweiterung nicht mehr notwendig, man kann direkt ld A [IX1] ausführen.

Weiterhin waren die Indexregister für streaming Aufgaben gedacht – man kann sie hoch- oder runterzählen. Wenn man sie aber für einen Zugriff innerhalb einer Struktur verwenden will, dann muss man auf eine Basisadresse einen Offset aufaddieren. Das war nur mit Umwegen über den Speicher möglich. Nach der Erweiterung können die drei Digits des Indexregisters einzeln in den Akku übernommen werden und nach der Berechnung wieder eingefügt werden.

Noch eine – hoffentlich nicht fehlgeleitete – Optimierung hat sich aus den ersten Programmierversuchen ergeben. Das Carry/ Borrow Flag wurde von allen ALU Funktionen aktualisiert, auch von einem einfachen Increment oder Decrement. Das ist aber bei Berechnungen, die in einer Schleife laufen, unpraktisch.

Für eine 32 Bit Addition wird in einer Schleife mit acht Runden jeweils das nächste Digit aufaddiert und dabei der Überlauf – das Carry Flag – in der nächsten Runde mit einbezogen. Allerdings finden nach der Addition noch inc und dec Aktionen statt zur Kontrolle der Schleife und zum Weiterzählen der Wertezeiger. Diese hatten in der ursprünglichen Version das Carry Flag verändert, es hätte also irgendwo geeignet zwischengespeichert und wieder abgefragt werden müssen. Dadurch, dass inc/ dec das Carry Flag nicht mehr verändern, spart man diesen Aufwand. Ich hoffe nicht, dass mir diese Entscheidung später auf die Füße fällt, aktuell sehe ich aber keine Probleme.

Im User Interface gibt es auch ein paar Erweiterungen. Zeilen mit einer besonderen Bedeutung werden nun farblich hervorgehoben.

Sprungziele werden Türkis markiert, lokale Sprünge Orange und Subroutine Aufrufe Grün. Fehlerhafte Zeilen werden Rot eingefärbt. Somit kann man im Assembler-Code schneller bestimmte Stellen auffinden.