-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathALU.java
111 lines (97 loc) · 2.81 KB
/
ALU.java
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
import java.math.*;
import java.nio.*;
import java.util.*;
public class ALU
{
Bus bus;
Register a, c;
int wordSize;
int maxImmediate;
Flags flags;
/**
* ALU Constructor
*
* @param a Register a (first input)
* @param c Register c (result)
* @param bus Bus data (second input)
* @param flags Current processor flags, used to set Zero/Sign
*/
public ALU(Register a, Register c, Bus bus, Flags flags, int maxImmediate)
{
this.a = a;
this.c = c;
this.bus = bus;
this.flags = flags;
this.wordSize = a.wordSize();
this.maxImmediate = maxImmediate;
}
public void add(boolean fetch) {
int aData = a.readInt();
int busData = bus.readInt();
int result = aData + busData;
setFlags(result, fetch);
c.writeInt(result);
}
public void add(int val, boolean fetch) {
int busData = bus.readInt();
int result = val + busData;
setFlags(result, fetch);
c.writeInt(result);
}
public void sub(boolean fetch) {
int aData = a.readInt();
int busData = bus.readInt();
int result = aData - busData;
setFlags(result, fetch);
c.writeInt(result);
}
public void sub(int val, boolean fetch) {
int busData = bus.readInt();
int result = busData - val;
setFlags(result, fetch);
c.writeInt(result);
}
public void multiply(boolean fetch) {
int aData = a.readInt();
int busData = bus.readInt();
int result = aData * busData;
setFlags(result, fetch);
c.writeInt(result);
}
public void and(boolean fetch) {
int aData = a.readInt();
int busData = bus.readInt();
int result = aData & busData;
setFlags(result, fetch);
c.writeInt(result);
}
public void or(boolean fetch) {
int aData = a.readInt();
int busData = bus.readInt();
int result = aData | busData;
setFlags(result, fetch);
c.writeInt(result);
}
public void xor(boolean fetch) {
int aData = a.readInt();
int busData = bus.readInt();
int result = aData ^ busData;
setFlags(result, fetch);
c.writeInt(result);
}
public void not(boolean fetch) {
int busData = bus.readInt();
int result = ~busData;
setFlags(result, fetch);
c.writeInt(result);
}
private void setFlags(int result, boolean fetch) {
// if this is a fetch operation then don't set flags
//(to preserve flags from last operation)
if (fetch) return;
// else set flags
flags.setO(result>maxImmediate || result<(-maxImmediate));
flags.setZ(result==0);
flags.setS(result<0);
}
}