% PRIMA - Die PRImitive MAschine Architektur: 8-bit Akkumulatormaschine 256 Worte Hauptspeicher, je 8-bit nur direkte Adressierung Zwei Befehlsformate: Klasse 0 (Arithmetische Operationen, Laden, Speichern) bit: 7 6 5 4 3 2 1 0 [0] [WR] [opcode ] [address ] Klasse 1 (Sprungbefehle) bit: 7 6 5 4 3 2 1 0 [1] [ opcode ] [address ] Befehlszyklus ("instruction cycle"): state=0: Befehl lesen, BR = MEM[ PC ], PC = PC + 1 state=1: Adresse lesen, AR = MEM[ PC ], PC = PC + 1 state=2: Befehl ausführen if (KL == 1) then // dies ist ein Sprungbefehl if (condition) then // Bedingung prüfen PC = AR // Sprungbefehl ausführen endif else // ALU oder Speicherzugriff if (WR == 1) then MEM[ AR ] = AKKU // Speichern else AKKU = ALU( AKKU, OV, MEM[AR] ) // ALU Operation endif endif Liste der Befehle ("instruction set"): Mnemonic dezimal binär Operation ADD 0 00000000 AKKU = AKKU + MEM[ AR ], ADD* 32 00100000 OV=0, AKKU = AKKU + MEM[ AR ] SUB 1 00000001 AKKU = AKKU - MEM[ AR ] SUB* 33 00100001 OV=0, AKKU = AKKU - MEM[ AR ] AD1 10 00001010 AKKU = AKKU + 1 (increment) AD1* 42 00101010 OV=0, AKKU = AKKU + 1 (increment) SB1 12 00001100 AKKU = AKKU - 1 (decrement) SB1* 44 00101100 OV=0, AKKU = AKKU - 1 (decrement) OR 2 00000010 AKKU = AKKU OR MEM[ AR ], OR* 34 00100010 OV=0, AKKU = AKKU OR MEM[ AR ], AND 3 00000011 AKKU = AKKU AND MEM[ AR ], AND* 35 00100011 OV=0, AKKU = AKKU AND MEM[ AR ], XOR 4 00000100 AKKU = AKKU XOR MEM[ AR ], XOR* 36 00100100 OV=0, AKKU = AKKU XOR MEM[ AR ], NOP 8 00001000 AKKU = AKKU (no operation) NOP* 40 00101000 OV=0, AKKU = AKKU (clear OV) SL 5 00000101 AKKU = AKKU << 1 (shift left) SL* 37 00100101 OV=0, AKKU = AKKU << 1 (shift left) SR 6 00000110 AKKU = AKKU >>> 1 (shift right) SR* 38 00100110 OV=0, AKKU = AKKU >>> 1 (shift right) RR 7 00000111 AKKU[i] = AKKU[i-1%8] (rotate right) RR* 39 00100111 OV=0, AKKU[i] = AKKU[i-1%8] (rotate right) Laden und Speichern ("load", "store"): LD 9 00001001 AKKU = MEM[ AR ] (load) LD* 41 00101001 OV=0, AKKU = MEM[ AR ] (load) LDI 11 00001011 AKKU = MEM[ AR ] + 1 LDI* 43 00101011 OV=0, AKKU = MEM[ AR ] + 1 LD0 14 00001110 AKKU = 0 LD0* 46 00101110 OV=0, AKKU = 0 LD1 15 00001111 AKKU = 1 LD1* 47 00101111 OV=0, AKKU = 1 ST 72 01001000 MEM[ AR ] = AKKU (store) ST 104 01101000 OV=0, MEM[ AR ] = AKKU (store) Sprungbefehle ("branches"): BU 128 1x0xxxx0 PC = AR (jmp / branch unconditional) BU* 160 1x1xxxx0 BZ 131 10000011 if (AKKU == 0) PC = AR (branch if zero) BZ* 163 10100011 BCY 133 10000101 if (AKKU[8]==1) PC = AR (branch if carry) BCY* 165 10100101 BOD 193 11000001 if (AKKU[0]==1) PC = AR (branch if odd) BOD* 225 11100001 BLS 137 10001001 if (AKKU[7]==1) PC = AR (branch if less) BLS* 169 10101001 BOV --- -------- BOV* 161 10100001 if (OV==1) PC = AR (branch if overflow) BSW 145 10010001 if (SW==1) PC = AR (branch if switch) BSW* 177 10110001