1 package net.mograsim.logic.model.am2900.am2904;
\r
3 import java.util.Collections;
\r
4 import java.util.HashMap;
\r
5 import java.util.Map;
\r
7 import net.mograsim.logic.model.am2900.TestableCircuit;
\r
9 public interface TestableAm2904 extends TestableCircuit
\r
12 void setInstruction(Am2904_Inst inst);
\r
14 void setCarry(Am2904_Carry carry);
\r
16 void setShiftCode(String val_4_bit);
\r
18 void setI10(Am2904_ShiftDir dir);
\r
20 void setCX(String val_1_bit);
\r
22 void setY3(String val_1_bit);
\r
24 void setIZ(String val_1_bit);
\r
26 void setIC(String val_1_bit);
\r
28 void setIOVR(String val_1_bit);
\r
30 void setIN(String val_1_bit);
\r
32 default void setI(String z_c_ovr_n)
\r
34 setIZ(z_c_ovr_n.substring(0, 1));
\r
35 setIC(z_c_ovr_n.substring(1, 2));
\r
36 setIOVR(z_c_ovr_n.substring(2, 3));
\r
37 setIN(z_c_ovr_n.substring(3, 4));
\r
40 void set_CEM(String val_1_bit);
\r
42 void set_CEµ(String val_1_bit);
\r
44 void set_OEY(String val_1_bit);
\r
46 void set_OECT(String val_1_bit);
\r
48 void set_SE(String val_1_bit);
\r
50 void set_EZ(String val_1_bit);
\r
52 void set_EC(String val_1_bit);
\r
54 void set_EOVR(String val_1_bit);
\r
56 void set_EN(String val_1_bit);
\r
58 default void set_E(String z_c_ovr_n)
\r
60 set_EZ(z_c_ovr_n.substring(0, 1));
\r
61 set_EC(z_c_ovr_n.substring(1, 2));
\r
62 set_EOVR(z_c_ovr_n.substring(2, 3));
\r
63 set_EN(z_c_ovr_n.substring(3, 4));
\r
66 void setSIO0(String val_1_bit);
\r
68 void setSIO3(String val_1_bit);
\r
70 void setQIO0(String val_1_bit);
\r
72 void setQIO3(String val_1_bit);
\r
88 public enum Am2904_ShiftDir
\r
93 public enum Am2904_Carry
\r
95 CI0, CI1, CX, USE_SR;
\r
100 * [microSR]_[machineSR]_[condCodeSource]_[condCode]<br>
\r
102 * <li>Load = load from I inputs (Am2904s)</li>
\r
103 * <li>condCodeSource = µ, M, I (and a special case: I and M)</li>
\r
104 * <li>condCode = the boolean term defining the CT output</li>
\r
107 public enum Am2904_Inst
\r
110 LoadM_LoadY_µ_NxorOVRorZ(0_00),
\r
111 Set_Set_µ_NxnorOVRornotZ(0_01),
\r
112 Swap_Swap_µ_NxorOVR(0_02),
\r
113 Reset_Reset_µ_NxnorOVR(0_03),
\r
114 Load_LoadForShiftThroughOvr_µ_Z(0_04),
\r
115 Load_Invert_µ_notZ(0_05),
\r
116 LoadOvrRetain_Load_µ_OVR(0_06),
\r
117 LoadOvrRetain_Load_µ_notOVR(0_07),
\r
118 ResetZ_LoadCarryInvert_µ_CorZ(0_10),
\r
119 SetZ_LoadCarryInvert_µ_notCandnotZ(0_11),
\r
120 ResetC_Load_µ_C(0_12),
\r
121 SetC_Load_µ_notC(0_13),
\r
122 ResetN_Load_µ_notCorZ(0_14),
\r
123 SetN_Load_µ_CandnotZ(0_15),
\r
124 ResetOvr_Load_IM_NxorN(0_16),
\r
125 SetOvr_Load_IM_NxnorN(0_17),
\r
126 Load_Load_µ_NxorOVRorZ(0_20),
\r
127 Load_Load_µ_NxnorOVRornotZ(0_21),
\r
128 Load_Load_µ_NxorOVR(0_22),
\r
129 Load_Load_µ_NxnorOVR(0_23),
\r
130 Load_Load_µ_Z(0_24),
\r
131 Load_Load_µ_notZ(0_25),
\r
132 Load_Load_µ_OVR(0_26),
\r
133 Load_Load_µ_notOVR(0_27),
\r
134 LoadCarryInvert_LoadCarryInvert_µ_CorZ(0_30),
\r
135 LoadCarryInvert_LoadCarryInvert_µ_notCandnotZ(0_31),
\r
136 Load_Load_µ_C(0_32),
\r
137 Load_Load_µ_notC(0_33),
\r
138 Load_Load_µ_notCorZ(0_34),
\r
139 Load_Load_µ_CandnotZ(0_35),
\r
140 Load_Load_µ_N(0_36),
\r
141 Load_Load_µ_notN(0_37),
\r
142 Load_Load_M_NxorOVRorZ(0_40),
\r
143 Load_Load_M_NxnorOVRornotZ(0_41),
\r
144 Load_Load_M_NxorOVR(0_42),
\r
145 Load_Load_M_NxnorOVR(0_43),
\r
146 Load_Load_M_Z(0_44),
\r
147 Load_Load_M_notZ(0_45),
\r
148 Load_Load_M_OVR(0_46),
\r
149 Load_Load_M_notOVR(0_47),
\r
150 LoadCarryInvert_LoadCarryInvert_M_CorZ(0_50),
\r
151 LoadCarryInvert_LoadCarryInvert_M_notCandnotZ(0_51),
\r
152 Load_Load_M_C(0_52),
\r
153 Load_Load_M_notC(0_53),
\r
154 Load_Load_M_notCorZ(0_54),
\r
155 Load_Load_M_CandnotZ(0_55),
\r
156 Load_Load_M_N(0_56),
\r
157 Load_Load_M_notN(0_57),
\r
158 Load_Load_I_NxorOVRorZ(0_60),
\r
159 Load_Load_I_NxnorOVRornotZ(0_61),
\r
160 Load_Load_I_NxorOVR(0_62),
\r
161 Load_Load_I_NxnorOVR(0_63),
\r
162 Load_Load_I_Z(0_64),
\r
163 Load_Load_I_notZ(0_65),
\r
164 Load_Load_I_OVR(0_66),
\r
165 Load_Load_I_notOVR(0_67),
\r
166 LoadCarryInvert_LoadCarryInvert_I_notCorZ(0_70),
\r
167 LoadCarryInvert_LoadCarryInvert_I_CandnotZ(0_71),
\r
168 Load_Load_I_C(0_72),
\r
169 Load_Load_I_notC(0_73),
\r
170 Load_Load_I_notCorZ(0_74),
\r
171 Load_Load_I_CandnotZ(0_75),
\r
172 Load_Load_I_N(0_76),
\r
173 Load_Load_I_notN(0_77);
\r
176 public final int code;
\r
178 private Am2904_Inst(int code)
\r
183 private static final Map<Integer, Am2904_Inst> instCodes;
\r
187 Map<Integer, Am2904_Inst> instCodesMod = new HashMap<>();
\r
188 Am2904_Inst[] vals = values();
\r
189 for (Am2904_Inst inst : vals)
\r
191 assert inst.code == inst.ordinal();
\r
192 instCodesMod.put(inst.code, inst);
\r
194 if (instCodesMod.size() != 64)
\r
195 throw new IllegalStateException("There must be exactly 64 Am2904 instruction codes, but was " + instCodesMod.size());
\r
196 instCodes = Collections.unmodifiableMap(instCodesMod);
\r
199 public static Am2904_Inst getInstFor(int I_543210)
\r
201 Am2904_Inst inst = instCodes.get(I_543210);
\r
204 throw new IllegalArgumentException("Invaild Am2904 instruction code: " + I_543210);
\r
207 public int getBlock()
\r
212 public boolean isLoadCarryInvert()
\r
214 return (code & 0b001_110) == 0b001_000;
\r