2e84000477e9bde203e2df61a8f3436c34fa1f3d
[Mograsim.git] / net.mograsim.logic.model.am2900 / test / net / mograsim / logic / model / am2900 / am2904 / TestableAm2904Impl.java
1 package net.mograsim.logic.model.am2900.am2904;
2
3 import net.mograsim.logic.core.components.BitDisplay;
4 import net.mograsim.logic.core.components.ManualSwitch;
5 import net.mograsim.logic.core.types.Bit;
6 import net.mograsim.logic.core.types.BitVector;
7 import net.mograsim.logic.model.am2900.util.SwitchWithDisplay;
8 import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper;
9 import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState;
10 import net.mograsim.logic.model.model.components.GUIComponent;
11
12 public class TestableAm2904Impl implements TestableAm2904
13 {
14
15         private GUIComponent am2904;
16         private ManualSwitch I;
17         private ManualSwitch C;
18         private ManualSwitch Cx;
19         private ManualSwitch IC, IN, IOVR, IZ;
20         private ManualSwitch _CEM, _CEmu;
21         private ManualSwitch _EC, _EN, _EOVR, _EZ;
22         private ManualSwitch _OECT, _OEY;
23         private ManualSwitch _SE;
24         private BitDisplay C0;
25         private BitDisplay CT;
26         private SwitchWithDisplay SIO0, SIOn, QIO0, QIOn;
27         private SwitchWithDisplay YC, YN, YOVR, YZ;
28
29         private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, "file:components/am2904/GUIAm2904.json");
30
31         @Override
32         public void setup()
33         {
34                 testHelper.setup(DebugState.NO_DEBUG);
35         }
36
37         @Override
38         public Result run()
39         {
40                 return testHelper.run();
41         }
42
43         @Override
44         public void clockOn(boolean isClockOn)
45         {
46                 if (isClockOn)
47                         C.switchFullOn();
48                 else
49                         C.switchFullOff();
50         }
51
52         @Override
53         public void setInstruction(Am2904_Inst inst)
54         {
55                 var old = I.getValues();
56                 var newPart = BitVector.from(inst.ordinal(), 6);
57                 I.setState(old.subVector(0, 7).concat(newPart));
58         }
59
60         @Override
61         public void setShiftCode(String val_4_bit)
62         {
63                 var old = I.getValues();
64                 var newPart = BitVector.parse(val_4_bit);
65                 I.setState(old.subVector(0, 3).concat(newPart).concat(old.subVector(7)));
66         }
67
68         @Override
69         public void setI10(Am2904_ShiftDir dir)
70         {
71                 var old = I.getValues();
72                 var newPart = BitVector.from(dir.ordinal(), 1);
73                 I.setState(old.subVector(0, 2).concat(newPart).concat(old.subVector(3)));
74         }
75
76         @Override
77         public void setCarry(Am2904_Carry carry)
78         {
79                 var old = I.getValues();
80                 var newPart = BitVector.from(carry.ordinal(), 2);
81                 I.setState(newPart.concat(old.subVector(2)));
82         }
83
84         @Override
85         public void setCX(String val_1_bit)
86         {
87                 Cx.setState(BitVector.parse(val_1_bit));
88         }
89
90         @Override
91         public void setY(String z_c_n_ovr)
92         {
93                 var bv = BitVector.parse(z_c_n_ovr);
94                 // correct order apparently unknown, most likely Z-C-N-OVR
95                 YZ.setState(bv.getLSBit(3).toVector());
96                 YC.setState(bv.getLSBit(2).toVector());
97                 YN.setState(bv.getLSBit(1).toVector());
98                 YOVR.setState(bv.getLSBit(0).toVector());
99         }
100
101         @Override
102         public void setIZ(String val_1_bit)
103         {
104                 IZ.setState(BitVector.parse(val_1_bit));
105         }
106
107         @Override
108         public void setIC(String val_1_bit)
109         {
110                 IC.setState(BitVector.parse(val_1_bit));
111         }
112
113         @Override
114         public void setIOVR(String val_1_bit)
115         {
116                 IOVR.setState(BitVector.parse(val_1_bit));
117         }
118
119         @Override
120         public void setIN(String val_1_bit)
121         {
122                 IN.setState(BitVector.parse(val_1_bit));
123         }
124
125         @Override
126         public void set_CEM(String val_1_bit)
127         {
128                 _CEM.setState(BitVector.parse(val_1_bit));
129         }
130
131         @Override
132         public void set_CEĀµ(String val_1_bit)
133         {
134                 _CEmu.setState(BitVector.parse(val_1_bit));
135         }
136
137         @Override
138         public void set_OEY(String val_1_bit)
139         {
140                 _OEY.setState(BitVector.parse(val_1_bit));
141         }
142
143         @Override
144         public void set_OECT(String val_1_bit)
145         {
146                 _OECT.setState(BitVector.parse(val_1_bit));
147         }
148
149         @Override
150         public void set_SE(String val_1_bit)
151         {
152                 _SE.setState(BitVector.parse(val_1_bit));
153         }
154
155         @Override
156         public void set_EZ(String val_1_bit)
157         {
158                 _EZ.setState(BitVector.parse(val_1_bit));
159         }
160
161         @Override
162         public void set_EC(String val_1_bit)
163         {
164                 _EC.setState(BitVector.parse(val_1_bit));
165         }
166
167         @Override
168         public void set_EOVR(String val_1_bit)
169         {
170                 _EOVR.setState(BitVector.parse(val_1_bit));
171         }
172
173         @Override
174         public void set_EN(String val_1_bit)
175         {
176                 _EN.setState(BitVector.parse(val_1_bit));
177         }
178
179         @Override
180         public void setSIO0(String val_1_bit)
181         {
182                 SIO0.setState(BitVector.parse(val_1_bit));
183         }
184
185         @Override
186         public void setSIO3(String val_1_bit)
187         {
188                 SIOn.setState(BitVector.parse(val_1_bit));
189         }
190
191         @Override
192         public void setQIO0(String val_1_bit)
193         {
194                 QIO0.setState(BitVector.parse(val_1_bit));
195         }
196
197         @Override
198         public void setQIO3(String val_1_bit)
199         {
200                 QIOn.setState(BitVector.parse(val_1_bit));
201         }
202
203         @Override
204         public void setDirectly(Register r, String val_1_bit)
205         {
206                 var bv = (BitVector) am2904.getHighLevelState(regToStateID(r));
207                 bv = bv.withBitChanged(r.ordinal() % 4, b -> Bit.parse(val_1_bit));
208                 am2904.setHighLevelState(regToStateID(r), bv);
209         }
210
211         @Override
212         public String getC0()
213         {
214                 return C0.getDisplayedValue().toString();
215         }
216
217         @Override
218         public String getCT()
219         {
220                 return CT.getDisplayedValue().toString();
221         }
222
223         @Override
224         public String getY()
225         {
226                 // correct order apparently unknown, most likely Z-C-N-OVR
227                 var y3 = YZ.getDisplayedValue();
228                 var y2 = YC.getDisplayedValue();
229                 var y1 = YN.getDisplayedValue();
230                 var y0 = YOVR.getDisplayedValue();
231                 return y3.concat(y2).concat(y1).concat(y0).toString();
232         }
233
234         @Override
235         public String getSIO0()
236         {
237                 return SIO0.getDisplayedValue().toString();
238         }
239
240         @Override
241         public String getSIO3()
242         {
243                 return SIOn.getDisplayedValue().toString();
244         }
245
246         @Override
247         public String getQIO0()
248         {
249                 return QIO0.getDisplayedValue().toString();
250         }
251
252         @Override
253         public String getQIO3()
254         {
255                 return QIOn.getDisplayedValue().toString();
256         }
257
258         @Override
259         public String getDirectly(Register r)
260         {
261                 var bv = (BitVector) am2904.getHighLevelState(regToStateID(r));
262                 return bv.getMSBit(r.ordinal() % 4).getSymbol();
263         }
264
265         private static String regToStateID(Register r)
266         {
267                 if (r.ordinal() > 3)
268                         return "msr.q";
269                 return "musr.q";
270         }
271
272         @Override
273         public TestEnvironmentHelper getTestEnvironmentHelper()
274         {
275                 return testHelper;
276         }
277 }