-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathComputer.java
More file actions
138 lines (111 loc) · 3.27 KB
/
Copy pathComputer.java
File metadata and controls
138 lines (111 loc) · 3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package part1;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class Computer implements ComputerInterface {
private Adder adder;
private Complementer complementer;
private Bus bus;
private Printer printer;
private Reader reader;
private Register r0;
private Register r1;
private Register r2;
private Register r3;
public Computer() {
build();
}
public void build() {
adder = new Adder();
complementer = new Complementer();
bus = new Bus();
printer = new Printer();
reader = new Reader();
r0 = new Register();
r1 = new Register();
r2 = new Register();
r3 = new Register();
}
public void run() throws FileNotFoundException {
String instruction;
String[] registers;
int regNumber;
Register[] tempRegister = new Register[3];
File programFile= new File("program.txt");
Scanner program = new Scanner(programFile);
while(program.hasNext()) {
instruction = program.next();
instruction = instruction.toLowerCase();
if(instruction.equals("read")) {
readInstruction();
}
else if(instruction.equals("move") || instruction.equals("add")
|| instruction.equals("sub")) {
String registerString = program.nextLine();
registerString = registerString.replaceAll("\\s","");
registers = registerString.split(",");
for(int i = 0; i < registers.length; i++) {
regNumber = Character.getNumericValue(registers[i].charAt(1));
switch(regNumber) {
case 0:
tempRegister[i] = r0;
break;
case 1:
tempRegister[i] = r1;
break;
case 2:
tempRegister[i] = r2;
break;
case 3:
tempRegister[i] = r3;
break;
default:
System.out.println(registers[i] + " does not exist");
}
}
if(instruction.equals("move"))
moveInstruction(tempRegister[0], tempRegister[1]);
else if(instruction.equals("add"))
addInstruction(tempRegister[0], tempRegister[1], tempRegister[2]);
else
subInstruction(tempRegister[0], tempRegister[1], tempRegister[2]);
}
else if(instruction.equals("print")) {
printInstruction();
}
else
System.out.println(instruction.toUpperCase() + "- incompatible instruction");
}
program.close();
}
private void readInstruction(){
try {
reader.storeValue();
} catch (IOException e) {
e.printStackTrace();
}
bus.setValue(reader.getValue());
r0.setValue(bus.getValue());
}
private void moveInstruction(Register ra, Register rb) {
System.err.println("\t\t\tMOVE " + ra + "," + rb + "\n"); //for instruction trace
rb.setValue(ra.getValue());
}
private void addInstruction(Register ra, Register rb, Register rc) {
System.err.println("\t\t\tADD " + ra + "," + rb + "," + rc); //for instruction trace
adder.setValues(ra.getValue(), rb.getValue());
rc.setValue(adder.add());
}
private void printInstruction() {
bus.setValue(r0.getValue());
printer.setValue(bus.getValue());
printer.printValue();
}
private void subInstruction(Register ra, Register rb, Register rc) {
System.err.println("\t\t\tSUBTRACT " + ra + "," + rb + "," + rc); //for instruction trace
complementer.setValue(ra.getValue());
adder.setValues(complementer.getValue(), rb.getValue());
rc.setValue(adder.add());
}
}