Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.machine / src / net / mograsim / machine / mi / StandardMicroInstructionMemory.java
index 6ef54bd..519c9b3 100644 (file)
@@ -2,39 +2,44 @@ package net.mograsim.machine.mi;
 
 import java.util.HashSet;
 
-import net.mograsim.machine.MemoryDefinition;
 import net.mograsim.machine.MemoryObserver;
 import net.mograsim.machine.standard.memory.MemoryException;
 
-class StandardMicroInstructionMemory implements MicroInstructionMemory
+public class StandardMicroInstructionMemory implements MicroInstructionMemory
 {
        private MicroInstruction[] data;
-       private MemoryDefinition definition;
+       private MicroInstructionMemoryDefinition definition;
        private HashSet<MemoryObserver> observers = new HashSet<>();
-       
-       StandardMicroInstructionMemory(MemoryDefinition definition)
+
+       public StandardMicroInstructionMemory(MicroInstructionMemoryDefinition definition)
        {
-               if(definition.size() > Integer.MAX_VALUE)
+               if (definition.size() > Integer.MAX_VALUE)
                        throw new MemoryException("Size of MicroInstructionMemory must be an int, not a long");
                this.definition = definition;
                data = new MicroInstruction[(int) definition.size()];
        }
-       
+
        private int translate(long address)
        {
                return (int) (address - definition.getMinimalAddress());
        }
-       
+
        @Override
        public MicroInstruction getCell(long address)
        {
-               return data[translate(address)];
+               int translatedAddress = translate(address);
+               MicroInstruction actual = data[translatedAddress];
+               if (actual == null)
+                       actual = data[translatedAddress] = definition.getMicroInstructionDefinition()
+                                       .createDefaultInstruction(() -> notifyObservers(address));
+               return actual;
        }
 
        @Override
        public void setCell(long address, MicroInstruction data)
        {
                this.data[translate(address)] = data;
+               notifyObservers(address);
        }
 
        @Override
@@ -56,7 +61,7 @@ class StandardMicroInstructionMemory implements MicroInstructionMemory
        }
 
        @Override
-       public MemoryDefinition getDefinition()
+       public MicroInstructionMemoryDefinition getDefinition()
        {
                return definition;
        }