//Kommentare beginnen mit zwei Schrägstrichen am Anfang (!) einer Zeile, //Leerzeilen werden übersprungen und alles nach der zweiten Spalte ignoriert, //insb. wären die Schrägstrich vor den Erläuterungen nicht mal notwendig, aber so //sieht es so aus, als hätte der Parser ein bißchen mehr drauf... //Das Format lautet immer: // Adresse Wert //wobei sowohl die Adresse als auch der Wert im Hexadezimal-System anzugeben sind. //Für die Adress- und Wertbereiche bitte das Übungsblatt heranziehen. Eine Ausnahme //stellt der Register-Abschnitt dar; hier lautet das Format: // Registername Wert //wobei als Registername in Frage kommen: AKKU, X, Y, Z, IAR, IR, SAR, SDR //-------------------------------------------------------------------------------------------------------------------------------- [micro program] //Fetch-Programm (ab Adresse 0x00 - das muss immer so sein!) 00 2108801 //IAR -> SAR, IAR -> X, R = 1 01 1400802 //Eins -> Y, R = 1 02 0001803 //Alu addieren, R = 1 03 0A00004 //Z -> IAR 04 0090005 //SDR -> IR 05 0000100 //D=1 ("Dekodierphase") //LDC-Programm (Adresse 0x06) 06 8040000 //IR -> Akku //ADD-Programm (Adresse 0x07) 07 0048808 //IR -> SAR, R = 1 08 6000809 //Akku -> X, R = 1 09 000080A //R = 1 0A 101000B //SDR -> Y 0B 000100C //Alu addieren 0C 8800000 //Z -> Akku //NOT-Programm (Adresse 0x0D) 0D 600000E //Akku -> X 0E 000600F //Alu invertieren 0F 8800000 //Z -> Akku //STV-Programm (Adresse 0x10) 10 0048011 //IR -> SAR 11 4020412 //Akku -> SDR, W=1 12 0000413 //W=1 13 0000400 //W=1 //LDV-Programm (Adresse 0x14) 14 0048815 //IR -> SAR, R = 1 15 0000816 //R = 1 16 0000817 //R = 1 17 8010000 //SDR -> Akku //HALT-Programm (Adresse 0x18) 18 0000018 //EQL-Programm (Adresse 0x19) 19 004881A //IR -> SAR, R = 1 1A 600081B //Akku -> X, R = 1 1B 000081C //R = 1 1C 101001D //SDR -> Y 1D 000701E //Alu If (111) 1E 8800000 //Z -> Akku //JMP-Programm (Adresse 0x1F) 1F 0240000 //IR -> IAR //JMN-Programm (Adresse 0x) 20 0000221 //B = 1 21 0240000 //IR -> IAR //-------------------------------------------------------------------------------------------------------------------------------- [micro program addresses] 06 00 //OP-Code 0 -> LDC bei Adresse 0x06 07 03 //OP-Code 3 -> ADD bei Adresse 0x07 0D F1 //OP-Code F1 -> NOT bei Adresse 0x0D 10 02 //OP-Code 2 -> STV bei Adresse 0x10 14 01 //OP-Code 1 -> LDV bei Adresse 0x14 18 F0 //OP-Code F0 -> HALT bei Adresse 0x15 19 07 //OP-Code 7 -> EQL bei Adresse 0x19 1F 08 //OP-Code 8 -> JMP bei Adresse 0x1F 20 09 //OP-Code 9 -> JMN bei Adresse 0x20 //-------------------------------------------------------------------------------------------------------------------------------- [memory] 00000 00000B //Wert 11 00001 00000C //Wert 12 //die folgenden Zeilen inkrementieren den Wert bei Adresse 0x00000 00100 000001 //LDC 0x00001 00101 300000 //ADD 0x00000 00102 200000 //STV 0x00000 00103 F00000 //HALT //Differenz: Berechnet <0x00000> - <0x00001> und speichert das Ergebnis in 0x00002 00200 100001 //LDV 0x00001 00201 F10000 //NOT 00202 200002 //STV 0x00002 00203 000001 //LDC 0x00001 00204 300002 //ADD 0x00002 00205 300000 //ADD 0x00000 00206 200002 //STV 0x00002 00207 F00000 //HALT //EQL-Testprogramm: falls <0x00000> = 15, setze 0x00002 auf -1, sonst auf 0 00300 00000F //LDC 0x0000F 00301 700000 //EQL 0x00000 00302 200002 //STV 0x00002 00303 F00000 //HALT //Maximum: speichere das Maximum von <0x00000> und <0x00001> bei Adresse 0x00002 00400 100001 //LDV 0x00001 Berechne <0x00000> - <0x00001> (siehe oben) 00401 F10000 //NOT 00402 200002 //STV 0x00002 00403 000001 //LDC 0x00001 00404 300002 //ADD 0x00002 00405 300000 //ADD 0x00000 00406 900409 //JMN 0x00409 Wenn Akku < 0: springe zu 0x00409 00407 100000 //LDV 0x00000 übernehme <0x00000> in Akku 00408 80040A //JMP 0x0040A nächste Anweisung überspringen 00409 100001 //LDV 0x00001 übernehme <0x00001> in Akku 0040A 200002 //STV 0x00002 Akku in 0x00002 speichern 0040B F00000 //HALT Programm beenden //Indirekte Adressierung mit der Mima durch selbstmodifizierendes Programm //(es geht auch mit einem neuen Mikrobefehl). //Startadresse des Arrays steht in 0x00040, Index des Elementes steht in 0x00041 //Aufgabe: Wert des ensprechenden Array-Elementes in 0x00042 schreiben 00030 111111 //Array-Elemente 00031 222222 00032 333333 00033 444444 00034 555555 00040 000030 //das Array beginnt ab Adresse 00030 00041 000003 //das vierte Element des Arrays (also 444444) soll 00042 000000 //hierhin verschoben werden. 00050 100000 //Kleines Helferlein (der Wert 100000 lässt sich nicht über LDC laden, wird aber im Folgenden benötigt) //Beginn des Programm 00500 100041 //LDV 0x00041 Im Akku steht der Index des fraglichen Elementes 00501 300040 //ADD 0x00040 Im Akku steht die Adresse des fraglichen Elementes 00502 300050 //ADD 0x00050 Im Akku steht jetzt der Befehl das fragliche Element zu laden (OpCode 1 = LDV) 00503 200504 //STV 0x00504 Speichere Befehl zum Laden des Elementes bei 0x00504 (nächster Befehl!) 00504 000000 //hier wird später der LDV Befehl stehen 00505 200042 //STV 0x00042 Lege Akku-Inhalt (das ist jetzt das fragliche Element!) bei 0x00042 ab 00506 F00000 //HALT //-------------------------------------------------------------------------------------------------------------------------------- [registers] //IAR 00100 //IAR Startwert 0x00100 (Inkrementieren) //IAR 00200 //IAR Startwert 0x00200 (Differenz) //IAR 00300 //IAR Startwert 0x00300 (EQL-Testprogramm) //IAR 00400 //IAR Startwert 0x00400 (Maximum) IAR 00500 //IAR Startwert 0x00500 (Indirekte Adressierung)