X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.plugin.core%2Fsrc%2Fnet%2Fmograsim%2Fplugin%2Flaunch%2FMachineRegister.java;h=59e22f83dae8fa92cacd4b5cc15ad1aa50893574;hb=369a988586e29afc28857afdb6bd0aab69e26b36;hp=8c0685dc897dca4ba408c1e995529803d344415c;hpb=79fe4ef5f67bdf3b7a9d8002d1759ce87b3f90be;p=Mograsim.git diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/launch/MachineRegister.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/launch/MachineRegister.java index 8c0685dc..59e22f83 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/launch/MachineRegister.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/launch/MachineRegister.java @@ -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; @@ -18,7 +20,7 @@ import org.eclipse.swt.SWT; import net.mograsim.logic.core.types.BitVector; import net.mograsim.machine.Machine; -import net.mograsim.machine.Register; +import net.mograsim.machine.registers.Register; import net.mograsim.plugin.MograsimActivator; public class MachineRegister extends PlatformObject implements IRegister @@ -95,14 +97,56 @@ public class MachineRegister extends PlatformObject implements IRegister public String getValueString() { - 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 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 @@ -122,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