Improved RegisterView:
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Sat, 12 Oct 2019 11:48:09 +0000 (13:48 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Sat, 12 Oct 2019 11:48:55 +0000 (13:48 +0200)
Values are now viewed in hex (if they are binary) and can be written in
hex, dec or as BitVector

plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/launch/MachineRegister.java

index d2a2312..59e22f8 100644 (file)
@@ -1,8 +1,10 @@
 package net.mograsim.plugin.launch;
 
+import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.function.Consumer;
 
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.PlatformObject;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.debug.core.DebugEvent;
@@ -95,16 +97,56 @@ public class MachineRegister extends PlatformObject implements IRegister
 
        public String getValueString()
        {
-               // TODO view in hex
-               return getMachine().getRegister(machineRegister).toString();
+               BitVector bitvector = getMachine().getRegister(machineRegister);
+               if (bitvector.isBinary())
+               {
+                       String hexdigits = bitvector.getUnsignedValue().toString(16);
+                       StringBuilder sb = new StringBuilder();
+                       sb.append("0x");
+                       sb.append("0".repeat((machineRegister.getWidth() + 3) / 4 - hexdigits.length()));
+                       sb.append(hexdigits);
+                       return sb.toString();
+               }
+               return bitvector.toString();
        }
 
        @Override
        public void setValue(String expression) throws DebugException
        {
-               // TODO support hex
-               // TODO exception handling
-               getMachine().setRegister(machineRegister, BitVector.parse(expression));
+               BitVector bitvector = parseValue(expression);
+               if (bitvector == null)
+                       throw new DebugException(
+                                       new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, "Couldn't parse value string: " + expression, null));
+               getMachine().setRegister(machineRegister, bitvector);
+       }
+
+       private BitVector parseValue(String expression)
+       {
+               BitVector bitvector = null;
+               if (expression.matches("0x[0-9a-fA-F]+"))
+                       // TODO should we check for overflows?
+                       bitvector = BitVector.from(new BigInteger(expression.substring(2), 16), machineRegister.getWidth());
+               else if (expression.length() == machineRegister.getWidth())
+                       // TODO do this without exceptions
+                       try
+                       {
+                               bitvector = BitVector.parse(expression);
+                       }
+                       catch (@SuppressWarnings("unused") NullPointerException x)
+                       {
+                               // ignore
+                       }
+               if (bitvector == null)
+                       try
+                       {
+                               // TODO should we check for overflows?
+                               bitvector = BitVector.from(new BigInteger(expression), machineRegister.getWidth());
+                       }
+                       catch (@SuppressWarnings("unused") NumberFormatException x)
+                       {
+                               // ignore
+                       }
+               return bitvector;
        }
 
        @Override
@@ -124,16 +166,7 @@ public class MachineRegister extends PlatformObject implements IRegister
        @Override
        public boolean verifyValue(String expression) throws DebugException
        {
-               // TODO do this prettier; also check length too
-               try
-               {
-                       BitVector.parse(expression);
-               }
-               catch (@SuppressWarnings("unused") Exception e)
-               {
-                       return false;
-               }
-               return true;
+               return parseValue(expression) != null;
        }
 
        @Override