1 package net.mograsim.machine.mi;
3 import java.util.HashSet;
6 import net.mograsim.machine.standard.memory.MemoryException;
8 public class StandardMicroInstructionMemory implements MicroInstructionMemory
10 private MicroInstruction[] data;
11 private MicroInstructionMemoryDefinition definition;
12 private HashSet<MemoryCellModifiedListener> observers = new HashSet<>();
13 private Set<ActiveMicroInstructionChangedListener> activeInstructionListeners = new HashSet<>();
14 private long activeInstruction = -1;
16 public StandardMicroInstructionMemory(MicroInstructionMemoryDefinition definition)
18 if (definition.size() > Integer.MAX_VALUE)
19 throw new MemoryException("Size of MicroInstructionMemory must be an int, not a long");
20 this.definition = definition;
21 data = new MicroInstruction[(int) definition.size()];
24 private int translate(long address)
26 return (int) (address - definition.getMinimalAddress());
30 public MicroInstruction getCell(long address)
32 int translatedAddress = translate(address);
33 MicroInstruction actual = data[translatedAddress];
35 actual = data[translatedAddress] = definition.getMicroInstructionDefinition().createDefaultInstruction();
40 public void setCell(long address, MicroInstruction data)
42 this.data[translate(address)] = data;
43 notifyMemoryChanged(address);
47 public void registerCellModifiedListener(MemoryCellModifiedListener ob)
53 public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
59 public void registerActiveMicroInstructionChangedListener(ActiveMicroInstructionChangedListener ob)
61 activeInstructionListeners.add(ob);
65 public void deregisterActiveMicroInstructionChangedListener(ActiveMicroInstructionChangedListener ob)
67 activeInstructionListeners.remove(ob);
70 private void notifyMemoryChanged(long address)
72 observers.forEach(ob -> ob.update(address));
75 private void notifyActiveInstructionChanged(long address)
77 activeInstructionListeners.forEach(o -> o.activeMicroInstructionChanged(address));
81 public MicroInstructionMemoryDefinition getDefinition()
87 public void setActiveInstruction(long address)
89 if (address != activeInstruction)
91 activeInstruction = address;
92 notifyActiveInstructionChanged(address);