Added active instruction preview to LogicUIPart
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / mi / AssignableMicroInstructionMemory.java
index b0ab5a4..a366ae0 100644 (file)
@@ -3,25 +3,31 @@ package net.mograsim.machine.mi;
 import java.util.HashSet;
 import java.util.Set;
 
-import net.mograsim.machine.MemoryObserver;
+import net.mograsim.machine.Memory.MemoryCellModifiedListener;
+import net.mograsim.machine.mi.MicroInstructionMemory.ActiveMicroInstructionChangedListener;
 
-public class AssignableMicroInstructionMemory implements MicroInstructionMemory, MemoryObserver
+public class AssignableMicroInstructionMemory
+               implements MicroInstructionMemory, MemoryCellModifiedListener, ActiveMicroInstructionChangedListener
 {
-       private Set<MemoryObserver> observers = new HashSet<>();
-       MicroInstructionMemory real = null;
+
+       private Set<MemoryCellModifiedListener> observers = new HashSet<>();
+       private Set<ActiveMicroInstructionChangedListener> activeInstructionListeners = new HashSet<>();
+       private Set<MIMemoryReassignedListener> reassignmentListeners = new HashSet<>();
+       private MicroInstructionMemory real = null;
 
        public AssignableMicroInstructionMemory(StandardMicroInstructionMemory standardMicroInstructionMemory)
        {
                real = standardMicroInstructionMemory;
-               real.registerObserver(this);
+               real.registerCellModifiedListener(this);
        }
 
        public void bind(MicroInstructionMemory real)
        {
-               this.real.deregisterObserver(this);
+               this.real.deregisterCellModifiedListener(this);
                this.real = real;
-               real.registerObserver(this);
-               notifyObservers(-1);
+               real.registerCellModifiedListener(this);
+               notifyMemoryChanged(-1);
+               notifyMemoryReassigned(real);
        }
 
        @Override
@@ -37,23 +43,39 @@ public class AssignableMicroInstructionMemory implements MicroInstructionMemory,
        }
 
        @Override
-       public void registerObserver(MemoryObserver ob)
+       public void registerCellModifiedListener(MemoryCellModifiedListener ob)
        {
                observers.add(ob);
        }
 
        @Override
-       public void deregisterObserver(MemoryObserver ob)
+       public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
        {
                observers.remove(ob);
        }
 
        @Override
-       public void notifyObservers(long address)
+       public void registerActiveMicroInstructionChangedListener(ActiveMicroInstructionChangedListener ob)
+       {
+               activeInstructionListeners.add(ob);
+       }
+
+       @Override
+       public void deregisterActiveMicroInstructionChangedListener(ActiveMicroInstructionChangedListener ob)
+       {
+               activeInstructionListeners.remove(ob);
+       }
+
+       private void notifyMemoryChanged(long address)
        {
                observers.forEach(o -> o.update(address));
        }
 
+       private void notifyActiveInstructionChanged(long address)
+       {
+               activeInstructionListeners.forEach(o -> o.activeMicroInstructionChanged(address));
+       }
+
        @Override
        public MicroInstructionMemoryDefinition getDefinition()
        {
@@ -63,6 +85,38 @@ public class AssignableMicroInstructionMemory implements MicroInstructionMemory,
        @Override
        public void update(long address)
        {
-               notifyObservers(address);
+               notifyMemoryChanged(address);
+       }
+
+       @Override
+       public void setActiveInstruction(long address)
+       {
+               real.setActiveInstruction(address);
+       }
+
+       @Override
+       public void activeMicroInstructionChanged(long address)
+       {
+               notifyActiveInstructionChanged(address);
+       }
+
+       public void registerMemoryReassignedListener(MIMemoryReassignedListener listener)
+       {
+               reassignmentListeners.add(listener);
+       }
+
+       public void deregisterMemoryReassignedListener(MIMemoryReassignedListener listener)
+       {
+               reassignmentListeners.remove(listener);
+       }
+
+       private void notifyMemoryReassigned(MicroInstructionMemory newAssignee)
+       {
+               reassignmentListeners.forEach(l -> l.reassigned(newAssignee));
+       }
+
+       public static interface MIMemoryReassignedListener
+       {
+               public void reassigned(MicroInstructionMemory newAssignee);
        }
 }