package net.mograsim.plugin.launch;
+import static net.mograsim.plugin.preferences.PluginPreferences.MAX_MEMORY_CHANGE_INTERVAL;
+
import java.math.BigInteger;
import java.util.HashSet;
import java.util.Set;
import net.mograsim.machine.MainMemoryDefinition;
import net.mograsim.machine.Memory.MemoryCellModifiedListener;
import net.mograsim.plugin.MograsimActivator;
-import net.mograsim.preferences.Preferences;
public class MainMemoryBlockExtension extends PlatformObject implements IMemoryBlockExtension
{
- // TODO do we want to make the memory accessible byte-wise?
+ private static final byte MEM_BYTE_FLAGS = (byte) (MemoryByte.READABLE | MemoryByte.WRITABLE | MemoryByte.ENDIANESS_KNOWN
+ | MemoryByte.BIG_ENDIAN);
private final String expression;
private final MachineDebugTarget debugTarget;
if (baseAddrWords.compareTo(minAddrWords) < 0 || baseAddrWords.compareTo(maxAddrWords) > 0)
throwDebugException("Base address out of range");
- if (baseAddrWords.add(lengthWords).compareTo(maxAddrWords) > 0)
+ if (baseAddrWords.add(lengthWords).subtract(BigInteger.ONE).compareTo(maxAddrWords) > 0)
throwDebugException("End address out of range");
this.clients = new HashSet<>();
this.memListener = a -> queueFireContentChangeEvent();
this.memListenerRegistered = new AtomicBoolean();
- this.maxContentChangeInterval = Preferences.current().getInt("net.mograsim.plugin.core.maxmemchangeinterval");
+ // TODO add a listener
+ this.maxContentChangeInterval = MograsimActivator.instance().getPluginPrefs().getInt(MAX_MEMORY_CHANGE_INTERVAL);
this.contentChangeLock = new Object();
this.nextContentChangeAllowedMillis = System.currentTimeMillis() - maxContentChangeInterval - 1;
}
@Override
public int getAddressSize() throws DebugException
{
- return Long.BYTES;
+ return (getBigLength().bitLength() + 7) / 8;
}
@Override
int l = wordBytes[0] == 0 ? 1 : 0;
int k;
for (k = 0; k < cellWidthBytes - wordBytes.length + l; k++)
- bytes[i + k] = new MemoryByte();
+ bytes[i + k] = new MemoryByte((byte) 0, MEM_BYTE_FLAGS);
for (; k < cellWidthBytes; k++, l++)
- bytes[i + k] = new MemoryByte(wordBytes[l]);
+ bytes[i + k] = new MemoryByte(wordBytes[l], MEM_BYTE_FLAGS);
} else
for (int k = 0; k < cellWidthBytes; k++)
bytes[i + k] = new MemoryByte((byte) 0, (byte) 0);