X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fmi%2FAssignableMPROM.java;fp=plugins%2Fnet.mograsim.machine%2Fsrc%2Fnet%2Fmograsim%2Fmachine%2Fmi%2FAssignableMPROM.java;h=04050130e5867f25c7575534d368080d9174a84a;hb=d8745744bfff69076608f30e60c0d86d1f115833;hp=0000000000000000000000000000000000000000;hpb=1c5ecbd9dc7fd2f410aeacf9532d57b3637e938e;p=Mograsim.git diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/AssignableMPROM.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/AssignableMPROM.java new file mode 100644 index 00000000..04050130 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/AssignableMPROM.java @@ -0,0 +1,99 @@ +package net.mograsim.machine.mi; + +import java.math.BigInteger; +import java.util.HashSet; +import java.util.Set; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.Memory.MemoryCellModifiedListener; + +public class AssignableMPROM implements MPROM, MemoryCellModifiedListener +{ + + private Set observers = new HashSet<>(); + + private Set reassignmentListeners = new HashSet<>(); + private MPROM real = null; + + public AssignableMPROM(MPROM standardMPROM) + { + real = standardMPROM; + real.registerCellModifiedListener(this); + } + + public void bind(MPROM real) + { + this.real.deregisterCellModifiedListener(this); + this.real = real; + real.registerCellModifiedListener(this); + notifyMemoryChanged(-1); + notifyMemoryReassigned(real); + } + + @Override + public BitVector getCell(long address) + { + return real.getCell(address); + } + + @Override + public void setCell(long address, BitVector data) + { + real.setCell(address, data); + } + + @Override + public BigInteger getCellAsBigInteger(long address) + { + return real.getCellAsBigInteger(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(o -> o.update(address)); + } + + @Override + public MPROMDefinition getDefinition() + { + return real.getDefinition(); + } + + @Override + public void update(long address) + { + notifyMemoryChanged(address); + } + + public void registerMemoryReassignedListener(MPROMReassignedListener listener) + { + reassignmentListeners.add(listener); + } + + public void deregisterMemoryReassignedListener(MPROMReassignedListener listener) + { + reassignmentListeners.remove(listener); + } + + private void notifyMemoryReassigned(MPROM newAssignee) + { + reassignmentListeners.forEach(l -> l.reassigned(newAssignee)); + } + + public static interface MPROMReassignedListener + { + public void reassigned(MPROM newAssignee); + } +}