LC-2-Simulator

Der Little Computer 2 (LC–2) wurde an der Universität von Michigan (USA) für die Ausbildung entwickelt, um Studenten ohne weitere Vorkenntnisse in Rechnerarchitektur und Logikentwurf mit Aufbau und Funktion von Universalrechnern vertraut zu machen. Die Funktionsweise des LC–2 ist durch seine Architektur und seinen Befehlsatz definiert. 

Attribute : 16-Bit-Prozessor; 8 Allzweckregister von je 16 Bit Breite; ein Register ist der Programm-Counter PC, er enthält die Speicheradresse des nächsten Befehls; Arithmetik–Logik–Einheit (ALU) verarbeitet ebenfalls 16–Bit Worte; verfügt neben den Registern R0 bis R7 über drei Flipflops, Flags; 

N Ergebnis der letzten Operation war negativ. Z Ergebnis der letzten Operation war null. P Ergebnis der letzten Operation war positiv.

Die Adressbreite beträgt 16 Bit, so dass die Maschine über 216 (65536 oder 64K) Worte bzw. 128 KB Speicher verfügt. Man kann den Speicher des LC–2 als in 27 = 128 Seiten zu je 29 = 512 Worten unterteilt betrachten. Die oberen 7 Bit der PC Registers bestimmen dabei die Seite. Ein– und Ausgabegeräte erscheinen im Speicher an festgelegten Adressen.  Der Bereich von 0x3000 bis 0xCFFF steht für Programme zur Verfügung.  Die Programme beginnen in der Regel bei Adresse 0x3000.

Zeilenweise Anzeige des Speicherinhalts erfolgt nach folgendem Prinzip:

  Adresse (hex)     Inhalt (binär) Inhalt (hex)     Marke     Assemblermnemonic (bei Befehlen)
Beispiel  0x3001

 0001001000100000    

0x1220 LOOP ADD R1, R0, #0000

ausführliches Script

Der Befehlssatz

Arithmetisch/Logische Operationen:         ADD, AND und NOT
Datentransferbefehle: LD, LDI, LDR, ST, STI, STR, LEA     
Ablaufsteuerung: BR, JSR, JMP, JSRR, RET
Steuerbefehle: RTI, TRAP

Adressierungsarten:

Name der Adressierungsart Bedeutung Beispiel
Register Das Datum befindet sich im angegebenen Register add r1, r2, r3
Immediate (unmittelbar) Das Datum ist Teil des Befehls selbst.  Im Beispiel ist #5 das "immediate" Datum. add r1, r2, #5;    lea r1, LABEL
Direkt Das Datum befindet sich an der angegebenen Adresse auf der aktuellen Seite. ld r1, LABEL
Indirekt Die angegebene Adresse auf der aktuellen Seite enthält die Adresse des Datums. ldi r1, LABEL
Basis+Index Das Datum befindet sich an der Adresse, die sich aus der Summe des Basisregisterinhalts und des null–erweiterten Indexes ergibt. ldr r1, r2, #3

AND  Bitwise Logical AND

if (bit<5> == 0
{DR = SR1 AND SR2 }
else if (bit<5> == 1
{ DR = SR1 AND SEXT(imm5) }
setcc(DR)
Wenn Bit <5> == 0, dann den bitweise UND des Inhalts von SR1 und SR2 durchführen, ansonsten. wenn Bit <5> == 1, dann den bitwise UND des Inhalts von SR1 durchführen  und den unmittelbaren Wert. Das Ergebnis wird in beiden Fällen im DR gestellt und setzt die Bedingungscodes.

AND R2, R3, R4 ; R2 = R3 AND R4

AND R2, R3, #7 ; R2 = R3 AND 7

ADD

if (bit<5> == 0) 
{ DR = SR1 + SR2 }
else if (bit<5> == 1) 
{DR = SR1 + SEXT(imm5)}
setcc(DR)
Wenn Bit <5> == 0, dann den Inhalt von SR1 und SR2 hinzufügen, sonst, wenn Bit <5> == 1, dann den Inhalt von SR1  und den Wert  hinzufügen.                                                 

Das Ergebnis wird in beiden Fällen im DR gestellt und setzt die Bedingungscodes.

ADD R2, R3, R4           ;  R2 = R3 + R4

ADD R2, R3, #7 ; R2 = R3 + 7

Ein Erstes Programm : Addieren von Zahlen

(0000) 3000  0011 0000 0000 0000   (   1) 	    .ORIG x3000			;Start
(3000) 5260  0101 001 001 1 00 000 (   2)            AND   R1 R1 #0		;Löschen Register R1
(3001) 54A0  0101 010 010 1 00 000 (   3)            AND   R2 R2 #0		;Löschen Register R2
(3002) 126A  0001 001 001 1 01010  (   4)            ADD   R1 R1 #10		;R1 := R1 + 10
(3003) 1441  0001 010 001 0 00 001 (   5)            ADD   R2 R1 R1		;R2 := R1 + R2
(3004) F025  1111 0000 0010 0101   (   6)            TRAP  x25			;Ende
Ein Zweites Programm Subtraktion 
Lösung erfolgt über Zweierkomplement
1011 - 0100 = 1011+ 1011 + 0001 = 0111
(0000) 3000  0011  0000  0000 0000 (   1) 		 .ORIG x3000		; Start
(3000) 5260  0101 001 001 1 00 000 (   2)                 AND   R1 R1 #0
(3001) 54A0  0101 010 010 1 00 000 (   3)                 AND   R2 R2 #0
(3002) 56E0  0101 011 011 1 00 000 (   4)                 AND   R3 R3 #0
(3003) 126B  0001 001 001 1 01 011 (   5)                 ADD   R1 R1 #11	; Einlesen der Zahl 11 in R1
(3004) 14A4  0001 010 010 1 00 100 (   6)                 ADD   R2 R2 #4	; Einlesen der Zahl 4 in R2
(3005) 94BF  1001 010 010 1 11 111 (   7)                 NOT   R2 R2		; Negation von R2 (Einerkompliment)
(3006) 14A1  0001 010 010 1 00 001 (   8)                 ADD   R2 R2 #1	; +1 --> Zweierkompliment
(3007) 1642  0001 011 001 0 00 010 (   9)                 ADD   R3 R1 R2	; Addition von R1 + R2
(3008) F025  1111  0000  0010 0101 (  10)                 TRAP  x25		; Stop
Übersetzung eines Binärcodes (Interpretation)
3000
56E0
5920
1921
5A84
0406
1643
1241
1904
0A03
F025
0011 0000 0000 0000
0101 011 011 1 00000
0101 100 100 1 00000
0001 100 100 1 00001
0101 101 010 0 00 100
0000 010 0 0000 0110
0001 011 001 0 00 011
0001 001 001 0 00 001
0001 100 100 0 00 100
0000 101 0 0000 0011
1111 0000 0010 0101
ST
AND
AND
ADD
AND
BR
ADD
ADD
ADD
BR
TRAP
Store Direct from Register to Memory
R3 := R3 ^ 0
R4 := R4 ^ 0
R4 := R4 + 1
R5 := R2 ^ R4
Zweig zurPos. x3006(*) [110-->BRZ]
R3 := R1 + R3
R1 := R1 + R1
R4 := R4 + R4
Zweig zur Pos. x3003(°) [101-->BRNP]
Ende
.orig x3000
AND R3,R3,#0
AND R4,R4,#0
ADD R4,R4,#1
And R5,R3,R4
BRZ $6
ADD R3,R3,R1
ADD R1,R1,R1
ADD R4,R4,R4
BRNP $3
.END
 BR Branch to Location on Current Page ;
 *  010 --> gleich Null
 °  101 --> ungleich negativ oder positiv
weiter