Fleshed out Am2900MicroInstructionDefinition
[Mograsim.git] / net.mograsim.logic.model.am2900 / src / net / mograsim / logic / model / am2900 / machine / Am2900MicroInstructionDefinition.java
1 package net.mograsim.logic.model.am2900.machine;
2
3 import java.util.Arrays;
4 import java.util.Optional;
5
6 import net.mograsim.logic.core.types.Bit;
7 import net.mograsim.logic.core.types.BitVector;
8 import net.mograsim.machine.mi.MicroInstructionDefinition;
9 import net.mograsim.machine.mi.parameters.BooleanClassification;
10 import net.mograsim.machine.mi.parameters.IntegerClassification;
11 import net.mograsim.machine.mi.parameters.MnemonicFamily;
12 import net.mograsim.machine.mi.parameters.MnemonicFamily.MnemonicPair;
13 import net.mograsim.machine.mi.parameters.ParameterClassification;
14
15 public class Am2900MicroInstructionDefinition implements MicroInstructionDefinition
16 {
17         private final static MnemonicFamily am2910Instructions = new MnemonicFamily(true, "JZ", "CJS", "JMAP", "PUSH", "JSRP", "CJV", "JRP",
18                         "RFCT", "RPCT", "CRTN", "CJPP", "LDCT", "LOOP", "CONT", "TWB");
19         private final static MnemonicFamily am2904StatusInstructions = new MnemonicFamily(true,
20                         new String[] { "MI_Zero", "MI_NotZero", "MI_UGTEQ", "MI_ULT", "MI_UGT", "MI_ULTEQ", "MI_SGTEQ", "MI_SLT", "MI_SGT", "MI_SLTEQ",
21                                         "MA_Zero", "MA_NotZero", "MA_UGTEQ", "MA_ULT", "MA_UGT", "MA_ULTEQ", "MA_SGTEQ", "MA_SLT", "MA_SGT", "MA_SLTEQ" },
22                         new long[] { 0b01_0101, 0b01_0100, 0b01_1101, 0b01_1100, 0b01_1110, 0b01_1111, 0b01_0010, 0b01_0011, 0b01_0000, 0b01_0001,
23                                         0b10_0101, 0b10_0100, 0b10_1101, 0b10_1100, 0b10_1110, 0b10_1111, 0b10_0010, 0b10_0011, 0b10_0000, 0b10_0001 },
24                         6);
25         private final static MnemonicFamily am2904ShiftInstructions = new MnemonicFamily(true, "SL", "SH", "SCONI", "SDH", "SDC", "SDN", "SDL",
26                         "SDCO", "SRCO", "SRCIO", "SR", "SDIC", "SDRCI", "SDRCO", "SDXOR", "SDR");
27         private final static MnemonicFamily am2904CarryInstructions = new MnemonicFamily(true, new String[] { "CI0", "CI1", "CIX", "CIC" },
28                         new long[] { 0b00, 0b01, 0b10, 0b11 }, 2);
29         private final static MnemonicFamily am2901DestInstructions = new MnemonicFamily(true, "QREG", "NOP", "RAMA", "RAMF", "RAMQD", "RAMD",
30                         "RAMQU", "RAMU");
31         private final static MnemonicFamily am2901FuncInstructions = new MnemonicFamily(true, "ADD", "SUBR", "SUBS", "OR", "AND", "NOTRS",
32                         "EXOR", "EXNOR");
33         private final static MnemonicFamily am2901SrcInstructions = new MnemonicFamily(true, "AQ", "AB", "ZQ", "ZB", "ZA", "DA", "DQ", "DZ");
34         private final static MnemonicFamily interruptInstructions = new MnemonicFamily(
35                         new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))/* TODO */);
36         private final static BooleanClassification hL = new BooleanClassification("H", "L");
37         private final static BooleanClassification registerSelect = new BooleanClassification("MR", "IR");
38         private final static IntegerClassification register = new IntegerClassification(4);
39
40         private final static ParameterClassification[] classes = { new BooleanClassification("Dis", "IE"), new IntegerClassification(16),
41                         new BooleanClassification("D", "K"), interruptInstructions, new BooleanClassification("H", "AB"), registerSelect, register,
42                         registerSelect, register, am2901DestInstructions, am2901FuncInstructions, am2901SrcInstructions, new IntegerClassification(12),
43                         am2910Instructions, new BooleanClassification("PS", "C"), am2904StatusInstructions, hL, hL, am2904ShiftInstructions,
44                         am2904CarryInstructions, new BooleanClassification("H", "DB"), new BooleanClassification("H", "E"), hL,
45                         new BooleanClassification("H", "E"), new BooleanClassification("H", "I"), new BooleanClassification("R", "W"), hL };
46
47         private final static String[] paramDesc = { "Allow interrupts?", "Interrupt instructions; omitted for simplicity",
48                         "Get D-input from data bus/constant value", "Constant value", "Operand sources for ALU operation", "ALU operation",
49                         "Destination of ALU calculation", "Register for A-operand", "Get A-operand from instruction register/micro instruction?",
50                         "Register for B-operand", "Get B-operand from instruction register/micro instruction?",
51                         "Put data from Y-output on address bus?", "Put data from Y-output on data bus?", "Source for carry-in", "Shift instructions",
52                         "Modify micro status register?", "Modify macro status register?", "Operations on the status register",
53                         "Is conditional jump enabled?", "Instructions for the micro instruction pointer", "Absolute address of a micro instruction",
54                         "Load instruction pointer from data bus?", "Put instruction pointer on data bus?", "Increment instruction pointer?",
55                         "Put instruction pointer on address bus?", "Load instruction register from data bus?", "Read from/Write to main memory?" };
56
57         @Override
58         public ParameterClassification[] getParameterClassifications()
59         {
60                 return classes;
61         }
62
63         @Override
64         public ParameterClassification getParameterClassification(int index)
65         {
66                 return classes[index];
67         }
68
69         @Override
70         public Optional<String> getParameterDescription(int index)
71         {
72                 return Optional.of(paramDesc[index]);
73         }
74
75         public static void main(String[] args)
76         {
77                 String s = "new BooleanClassification(\"R\", \"W\"), hL, new BooleanClassification(\"H\", \"E\"),\r\n"
78                                 + "                     new BooleanClassification(\"H\", \"I\"), new BooleanClassification(\"H\", \"E\"), hL, new IntegerClassification(12), am2910Instructions,\r\n"
79                                 + "                     new BooleanClassification(\"PS\", \"C\"), am2904StatusInstructions, hL, hL, am2904ShiftInstructions, am2904CarryInstructions,\r\n"
80                                 + "                     new BooleanClassification(\"H\", \"DB\"), new BooleanClassification(\"H\", \"AB\"), registerSelect, register, registerSelect, register,\r\n"
81                                 + "                     am2901DestInstructions, am2901FuncInstructions, am2901SrcInstructions, new IntegerClassification(16),\r\n"
82                                 + "                     new BooleanClassification(\"D\", \"K\"), interruptInstructions, new BooleanClassification(\"Dis\", \"IE\")";
83                 s = s.replaceAll("[\r\n\t]", "");
84                 System.out.print(Arrays.stream(s.split(", new")).reduce((a, b) -> b + ", new" + a));
85 //              System.out.println(Arrays.stream(paramDesc).reduce("", (a, b) -> String.format("\"%s\", %s", b, a)));
86         }
87 }