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
}
@Override
- public MemoryDefinition getDefinition()
+ public MicroInstructionMemoryDefinition getDefinition()
{
return definition;
}