X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fmi%2FStandardMicroInstructionMemory.java;h=519c9b3af9e1c31a92d1232695b2de2bc29f2540;hb=8bed58cd47f4e53a0a83e066d38864aa6875502f;hp=6ef54bdb1ec0d9a1854fe293726ba21ae68a7f98;hpb=2fe86b9ccd64afbe485b8290db9f11b93d9943bf;p=Mograsim.git diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java index 6ef54bdb..519c9b3a 100644 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java +++ b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java @@ -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 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; }