Added a constructor for ModelSplitterParams; added a TODO
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / launch / MainMemoryBlockExtension.java
index 8d16998..16c6db0 100644 (file)
@@ -1,5 +1,7 @@
 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;
@@ -21,11 +23,11 @@ import net.mograsim.machine.MainMemory;
 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;
@@ -71,7 +73,7 @@ public class MainMemoryBlockExtension extends PlatformObject implements IMemoryB
 
                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<>();
@@ -79,7 +81,8 @@ public class MainMemoryBlockExtension extends PlatformObject implements IMemoryB
                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;
        }
@@ -194,7 +197,7 @@ public class MainMemoryBlockExtension extends PlatformObject implements IMemoryB
        @Override
        public int getAddressSize() throws DebugException
        {
-               return Long.BYTES;
+               return (getBigLength().bitLength() + 7) / 8;
        }
 
        @Override
@@ -242,9 +245,9 @@ public class MainMemoryBlockExtension extends PlatformObject implements IMemoryB
                                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);