1 package net.mograsim.logic.model.am2900.machine;
3 import java.util.ArrayList;
4 import java.util.Collections;
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;
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
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.";
30 public static final List<Register> unsortedRegisters;
31 public static final List<RegisterGroup> registerGroups;
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);
47 public final boolean expert;
49 protected AbstractAm2900MachineDefinition(boolean expert)
57 return expert ? AM2900_EXPERT_MACHINE_ID : AM2900_TEACHING_MACHINE_ID;
61 public String getDescription()
63 return expert ? AM2900_EXPERT_DESCRIPTION : AM2900_TEACHING_DESCRIPTION;
67 public Am2900Machine createNew()
69 return createNew(new LogicModelModifiable());
72 public Am2900Machine createNew(LogicModelModifiable model)
74 return new Am2900Machine(model, this);
78 public ISASchema getISASchema()
80 // TODO Auto-generated method stub
85 public List<Register> getUnsortedRegisters()
87 return unsortedRegisters;
91 public List<RegisterGroup> getRegisterGroups()
93 return registerGroups;
97 public int getAddressBits()
103 public Am2900MainMemoryDefinition getMainMemoryDefinition()
105 return Am2900MainMemoryDefinition.instance;
109 public int hashCode()
111 return expert ? 12345 : 54321;
115 public boolean equals(Object obj)
117 return obj != null && obj instanceof AbstractAm2900MachineDefinition
118 && ((AbstractAm2900MachineDefinition) obj).expert == this.expert;
122 public Am2900MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition()
124 return Am2900MicroInstructionMemoryDefinition.instance;
128 public MPROMDefinition getMPROMDefinition()
130 return Am2900MPROMDefinition.instance;