Implemented some infrastructure for MPROMs
[Mograsim.git] / plugins / net.mograsim.logic.model.am2900 / src / net / mograsim / logic / model / am2900 / machine / AbstractAm2900MachineDefinition.java
1 package net.mograsim.logic.model.am2900.machine;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6
7 import net.mograsim.logic.model.am2900.machine.registers.InstrRegister;
8 import net.mograsim.logic.model.am2900.machine.registers.PCRegister;
9 import net.mograsim.logic.model.am2900.machine.registers.muInstrRegister;
10 import net.mograsim.logic.model.am2900.machine.registers.am2901.Am2901RegisterGroup;
11 import net.mograsim.logic.model.am2900.machine.registers.am2904.Am2904RegisterGroup;
12 import net.mograsim.logic.model.am2900.machine.registers.am2910.Am2910RegisterGroup;
13 import net.mograsim.logic.model.model.LogicModelModifiable;
14 import net.mograsim.machine.ISASchema;
15 import net.mograsim.machine.MachineDefinition;
16 import net.mograsim.machine.mi.MPROMDefinition;
17 import net.mograsim.machine.registers.Register;
18 import net.mograsim.machine.registers.RegisterGroup;
19
20 //we can't use the Singleton pattern here because a MachineDefinition needs a public parameterless constructor
21 //(used for detecting installed machines in plugin.core)
22 public class AbstractAm2900MachineDefinition implements MachineDefinition
23 {
24         public static final String AM2900_TEACHING_MACHINE_ID = "Am2900Teaching";
25         public static final String AM2900_EXPERT_MACHINE_ID = "Am2900Expert";
26         public static final String AM2900_TEACHING_DESCRIPTION = "Am2900 for teaching purposes.\nAll registers are reset to 0 when starting.";
27         public static final String AM2900_EXPERT_DESCRIPTION = "Am2900 \"for experts\".\nOnly the \u00b5PC will be reset to 0 when starting."
28                         + "The microprogram will have to reset the other registers manually, including the PC.";
29
30         public static final List<Register> unsortedRegisters;
31         public static final List<RegisterGroup> registerGroups;
32
33         static
34         {
35                 List<Register> unsortedRegistersModifiable = new ArrayList<>();
36                 unsortedRegistersModifiable.add(muInstrRegister.instance);
37                 unsortedRegistersModifiable.add(InstrRegister.instance);
38                 unsortedRegistersModifiable.add(PCRegister.instance);
39                 unsortedRegisters = Collections.unmodifiableList(unsortedRegistersModifiable);
40                 List<RegisterGroup> registerGroupsModifiable = new ArrayList<>();
41                 registerGroupsModifiable.add(Am2901RegisterGroup.instance);
42                 registerGroupsModifiable.add(Am2904RegisterGroup.instance);
43                 registerGroupsModifiable.add(Am2910RegisterGroup.instance);
44                 registerGroups = Collections.unmodifiableList(registerGroupsModifiable);
45         }
46
47         public final boolean expert;
48
49         protected AbstractAm2900MachineDefinition(boolean expert)
50         {
51                 this.expert = expert;
52         }
53
54         @Override
55         public String getId()
56         {
57                 return expert ? AM2900_EXPERT_MACHINE_ID : AM2900_TEACHING_MACHINE_ID;
58         }
59
60         @Override
61         public String getDescription()
62         {
63                 return expert ? AM2900_EXPERT_DESCRIPTION : AM2900_TEACHING_DESCRIPTION;
64         }
65
66         @Override
67         public Am2900Machine createNew()
68         {
69                 return createNew(new LogicModelModifiable());
70         }
71
72         public Am2900Machine createNew(LogicModelModifiable model)
73         {
74                 return new Am2900Machine(model, this);
75         }
76
77         @Override
78         public ISASchema getISASchema()
79         {
80                 // TODO Auto-generated method stub
81                 return null;
82         }
83
84         @Override
85         public List<Register> getUnsortedRegisters()
86         {
87                 return unsortedRegisters;
88         }
89
90         @Override
91         public List<RegisterGroup> getRegisterGroups()
92         {
93                 return registerGroups;
94         }
95
96         @Override
97         public int getAddressBits()
98         {
99                 return 16;
100         }
101
102         @Override
103         public Am2900MainMemoryDefinition getMainMemoryDefinition()
104         {
105                 return Am2900MainMemoryDefinition.instance;
106         }
107
108         @Override
109         public int hashCode()
110         {
111                 return expert ? 12345 : 54321;
112         }
113
114         @Override
115         public boolean equals(Object obj)
116         {
117                 return obj != null && obj instanceof AbstractAm2900MachineDefinition
118                                 && ((AbstractAm2900MachineDefinition) obj).expert == this.expert;
119         }
120
121         @Override
122         public Am2900MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition()
123         {
124                 return Am2900MicroInstructionMemoryDefinition.instance;
125         }
126
127         @Override
128         public MPROMDefinition getMPROMDefinition()
129         {
130                 return Am2900MPROMDefinition.instance;
131         }
132 }