Der mikroprogrammierte Rechner besteht aus einem Leitwerk zur Generierung der Steuersignale für die einzelnen Komponenten des Rechners, einem Rechenwerk zur Verarbeitung von 16 Bit Integer-Daten, einem Speicherwerk mit einem 64K * 16 Bit großen Hauptspeicher und einem Ein/Ausgabewerk, über das die Kommunikation mit dem PC erfolgt. Die einzelnen Werke sind über einen 16 Bit breiten Datenbus und einen 16 Bit breiten Adreßbus miteinander verbunden.
Das Leitwerk besteht aus dem Sequenzerbaustein Am2910, einem 4K * 80 Bit großen Mikroprogrammspeicher und dem Mikroinstrukiosregister. Im Mikroprogrammspeicher sind die Mikroprogramme, bestehend aus einer Folge Mikroinstruktionen, abgelegt. In jedem Taktzyklus wird eine Mikroinstruktion ausgewählt und alle in ihr zusammengefaßten Mikrooperationen werden gleichzeitig zur Ausführung angestoßen. Die Auswahl der im nächsten Taktzyklus auszuführenden Mikroinstruktion erfolgt durch das Mikroleitwerk, das in jedem Taktzyklus eine Speicherzelle des Mikroprogrammspeichers adressiert.
Weiterhin enthält das Mikroleitwerk einen Befehlszähler BZ und ein 16 Bit breites Instruktionsregister für die zu implementierenden Maschinenbefehle. Der Befehlszähler addressiert die Maschinenbefehle im Hauptspeicher. Der Inhalt des Befehlzählers kann inkrementiert werden oder auf den Daten- bzw. den Adressbus ausgegeben werden. Es ist ebenso möglich Adressen vom Datenbus in den Befehlszähler zu laden. Das Instruktionsregister enthält den Maschinenbefehl der gerade ausgeführt wird.
Die Programme, die mit den Maschinenbefehlen der Zielmaschine geschrieben werden können, stehen zusammen mit den zu verarbeitenden Daten im Hauptspeicher.
Zur Verarbeitung der Daten steht ein 16 Bit breites Rechenwerk, auf Basis von 4 kaskadierbaren Rechenwerksbausteinen vom Typ Am2901 und einem Wortrandlogikbaustein Am2904, zur Verfügung. Das Rechenwerk unterstützt einfache arithmetische und logische Operationen. Darüberhinaus können Schiebeoperationen ausgeführt werden. Seine Daten erhält das Rechenwerk aus einer Registerdatei oder vom Datenbus. Ergebnisse können in die Registerdatei zurückgeschrieben werden oder auf den Daten bzw. den Adreßbus ausgegeben werden. Die Registerdatei enthält 16 Register von je 16 Bit.
Der Wortrandlogikbaustein Am2904 enthält zwei unabhängige Statusregister. Ein Maschienenstatusregister, dessen Werte von Maschienenbefehlen verwendet werden können, und ein Mikrostatusregister, das von Mikroprogrammen verwendet werden kann. Sie enthalten folgende Flags:
OVR | Overflow - Flag |
N | Negative - Flag |
Z | Zero - Flag |
C | Carry - Flag |
Die Erstellung der Mikroprogramme erfolgt mit dem Simulationsprogramm der mikroprogrammierbaren Maschine MIC (Version 5.2) auf eigenen Rechnern. Implementierung, Test und Optimierung erfolgen ausschließlich mit diesem Programm.
MOVE IMM RB
Opcode: F41. Takt |
|
2. Takt |
|
Bemerkung: Angegeben wurde als Opcode eigentlich 00. Da aber an dieser Stelle eigentlich das Mikroprogramm IFETCH
steht, wurde
der Opcode in Absprache mit dem Betreuer auf F4 geändert.
DEC RB
Opcode: 441. Takt |
|
Bemerkung: Es ist natürlich ebenso möglich, bei der Subtraktion, statt 0 als zweiten Operanden 1 anzugeben und das CarryIn auf 1 zu setzen. Der zweite Operand müßte dann als Konstante angegeben und über den Datenbus eingelesen werden. Dafür würde aber ein Takt mehr benötigt werden, da es nicht möglich ist den D Eingang der ALU mit einem Register zu verknüpfen das in RB angegeben ist.
CMP IMM RB
Opcode: 301. Takt |
|
2. Takt |
|
3. Takt |
|
Bemerkung: bei einer Subtraktion A - B, bei welcher der Operand A größer oder gleich dem Operanden B, wird im
Maschinenstatusregister das Carry Flag gesetzt. Laut Vorgabe für den Befehl cmp
soll das Carry Flag aber gesetzt werden, wenn gilt,
daß A kleiner B ist. Daher muß das Carry Flag negiert abgespeichert werden. Die Alternative würde darin bestehen das Carry Flag
manuell zu manipulieren, was aber einen zusätzlichen Takt kosten würde.
SCF
Opcode: F51. Takt |
|
Bemerkung: Es wurden für diesen Befehl keine genauen Angaben darüber gemacht, ob im Maschinenstatusregister andere Flags als das Carry gesetzt werden sollen oder nicht. Wir haben uns dafür entschieden, nur das Carry Flag zu setzen und die anderen Flags nicht zu verändern. Da das Carry - Flag im Maschinenstatusregister nicht direkt manipuliert werden kann, muß man den Umweg über die Schiebeoperation gehen. Alternativ bestünde die Möglichkeit, den Inhalt des Maschinenstatusregisters in das Mikrostatusregister zu laden. Nachdem dort das Carry gesetzt wurde, müßte der Inhalt des Mikrostatusregisters in das Maschinenstatusregister zurückgeschrieben werden. Dieses Verfahren nimmt allerdings 3 Takte in Anspruch.
RLC RB
Opcode: 641. Takt |
|
Bemerkung: Es wurden für diesen Befehl keine genauen Angaben darüber gemacht, ob im Maschinenstatusregister andere Flags als das Carry gesetzt werden sollen oder nicht. In der konkreten Implementierung werden diese Flags gesetzt, da sie von nachfolgenden Befehlen (z.B. Bedingte Sprünge) durchaus sinnvoll genutzt werden können.
JMPNC IMM RB
Opcode: 8D1. Takt |
|
Carry-Flag = 0 | |
2. Takt |
|
3. Takt |
|
Carry-Flag = 1 | |
2. Takt "WEITER" |
|
BSCANF
Das Maschinenprogramm das den Befehl BSCANF
implementiert erwartet, daß der zu überprüfende Wert im Register r0
liegt. Im Register r1 steht dann das Ergebnis.
Zunächst wird mittels scf das Carry Flag im Maschinenstatusregister gesetzt. Das ist wichtig, da sonst das Programm nicht terminiert, wenn
der zu überprüfende Wert keine binäre 1 enthält. Mittels MOVE
wird nun die Konstante 10 hex in das Register r1
geschrieben. Der Wert im Register r0 wird nun nach links geschoben. Anschließend wird das Register r1 dekrementiert.
Ist das Carry Flag nun noch nicht gesetzt (d.h. es wurde noch keine binäre 1 in das Carry Bit geschoben), so erfolgt ein Sprung zu dem Befehl
RLC
. Wurde es hingegen gesetzt so stoppt die Ausführung des Programms und das Ergebnis liegt vor.
Pseudocode: