1 package net.mograsim.machine.mi;
3 import java.util.HashSet;
6 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
7 import net.mograsim.machine.mi.MicroInstructionMemory.ActiveMicroInstructionChangedListener;
9 public class AssignableMicroInstructionMemory
10 implements MicroInstructionMemory, MemoryCellModifiedListener, ActiveMicroInstructionChangedListener
13 private Set<MemoryCellModifiedListener> observers = new HashSet<>();
14 private Set<ActiveMicroInstructionChangedListener> activeInstructionListeners = new HashSet<>();
15 private Set<MIMemoryReassignedListener> reassignmentListeners = new HashSet<>();
16 private MicroInstructionMemory real = null;
18 public AssignableMicroInstructionMemory(StandardMicroInstructionMemory standardMicroInstructionMemory)
20 real = standardMicroInstructionMemory;
21 real.registerCellModifiedListener(this);
24 public void bind(MicroInstructionMemory real)
26 this.real.deregisterCellModifiedListener(this);
28 real.registerCellModifiedListener(this);
29 notifyMemoryChanged(-1);
30 notifyMemoryReassigned(real);
34 public MicroInstruction getCell(long address)
36 return real.getCell(address);
40 public void setCell(long address, MicroInstruction data)
42 real.setCell(address, data);
46 public void registerCellModifiedListener(MemoryCellModifiedListener ob)
52 public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
58 public void registerActiveMicroInstructionChangedListener(ActiveMicroInstructionChangedListener ob)
60 activeInstructionListeners.add(ob);
64 public void deregisterActiveMicroInstructionChangedListener(ActiveMicroInstructionChangedListener ob)
66 activeInstructionListeners.remove(ob);
69 private void notifyMemoryChanged(long address)
71 observers.forEach(o -> o.update(address));
74 private void notifyActiveInstructionChanged(long address)
76 activeInstructionListeners.forEach(o -> o.activeMicroInstructionChanged(address));
80 public MicroInstructionMemoryDefinition getDefinition()
82 return real.getDefinition();
86 public void update(long address)
88 notifyMemoryChanged(address);
92 public void setActiveInstruction(long address)
94 real.setActiveInstruction(address);
98 public void activeMicroInstructionChanged(long address)
100 notifyActiveInstructionChanged(address);
103 public void registerMemoryReassignedListener(MIMemoryReassignedListener listener)
105 reassignmentListeners.add(listener);
108 public void deregisterMemoryReassignedListener(MIMemoryReassignedListener listener)
110 reassignmentListeners.remove(listener);
113 private void notifyMemoryReassigned(MicroInstructionMemory newAssignee)
115 reassignmentListeners.forEach(l -> l.reassigned(newAssignee));
118 public static interface MIMemoryReassignedListener
120 public void reassigned(MicroInstructionMemory newAssignee);