Finished MPROM support. Fixes #10
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / mi / StandardMPROM.java
index 48df165..3d8a8cb 100644 (file)
@@ -1,73 +1,18 @@
 package net.mograsim.machine.mi;
 
-import java.math.BigInteger;
-import java.util.HashSet;
-
 import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.machine.standard.memory.MemoryException;
+import net.mograsim.machine.standard.memory.StandardBitVectorMemory;
 
-public class StandardMPROM implements MPROM
+public class StandardMPROM extends StandardBitVectorMemory<MPROMDefinition> implements MPROM
 {
-       private BitVector[] data;
-       private MPROMDefinition definition;
-       private HashSet<MemoryCellModifiedListener> observers = new HashSet<>();
-
        public StandardMPROM(MPROMDefinition definition)
        {
-               if (definition.size() > Integer.MAX_VALUE)
-                       throw new MemoryException("Size of MPROM must be an int, not a long");
-               this.definition = definition;
-               data = new BitVector[(int) definition.size()];
-       }
-
-       private int translate(long address)
-       {
-               return (int) (address - definition.getMinimalAddress());
-       }
-
-       @Override
-       public BitVector getCell(long address)
-       {
-               int translatedAddress = translate(address);
-               BitVector cell = data[translatedAddress];
-               if (cell == null)
-                       cell = data[translatedAddress] = BitVector.from(address * 16, definition.getMicroInstructionMemoryAddressBits());
-               return cell;
-       }
-
-       @Override
-       public BigInteger getCellAsBigInteger(long address)
-       {
-               return getCell(address).getUnsignedValue();
-       }
-
-       @Override
-       public void setCell(long address, BitVector data)
-       {
-               this.data[translate(address)] = data;
-               notifyMemoryChanged(address);
-       }
-
-       @Override
-       public void registerCellModifiedListener(MemoryCellModifiedListener ob)
-       {
-               observers.add(ob);
-       }
-
-       @Override
-       public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
-       {
-               observers.remove(ob);
-       }
-
-       private void notifyMemoryChanged(long address)
-       {
-               observers.forEach(ob -> ob.update(address));
+               super(definition);
        }
 
        @Override
-       public MPROMDefinition getDefinition()
+       protected BitVector getDefaultValue(long address)
        {
-               return definition;
+               return BitVector.from(address * 16, getDefinition().getCellWidth());
        }
 }