Jelajahi Sumber

adding commandData for A= and ?=A

Wilfried Klaas 6 tahun lalu
induk
melakukan
62e314b537

+ 4 - 0
src/main/java/de/mcs/tools/sps/EmulatorInternals.java

@@ -21,4 +21,8 @@ public interface EmulatorInternals {
 
   long getDelay();
 
+  void setRegister(String register, byte data);
+
+  byte getRegister(String register);
+
 }

+ 39 - 13
src/main/java/de/mcs/tools/sps/holtec/HoltekEmulator.java

@@ -55,11 +55,8 @@ public class HoltekEmulator extends AbstractEmulator implements SPSEmulator {
         @Override
         public EmulatorOutput doWork(EmulatorInput input, EmulatorInternals internals, EmulatorOutput output) {
           byte data = getData();
-          HoltekEmulatorOutput emulatorOutput = (HoltekEmulatorOutput) HoltekEmulator.getInstance().getEmulatorOutput();
-          emulatorOutput.d0 = (data & (byte) 0x01) > 0;
-          emulatorOutput.d1 = (data & (byte) 0x02) > 0;
-          emulatorOutput.d2 = (data & (byte) 0x04) > 0;
-          emulatorOutput.d3 = (data & (byte) 0x08) > 0;
+          HoltekEmulatorOutput emulatorOutput = (HoltekEmulatorOutput) output;
+          emulatorOutput.setOutput(data);
           internals.incAddress(1);
           return emulatorOutput;
         }
@@ -97,8 +94,10 @@ public class HoltekEmulator extends AbstractEmulator implements SPSEmulator {
       SPS_A_EQUALS.getCommandDatas().add(new SPSCommandDataImpl() {
         @Override
         public EmulatorOutput doWork(EmulatorInput input, EmulatorInternals internals, EmulatorOutput output) {
-          ((HoltekEmulatorInternals) internals).address++;
-          return HoltekEmulator.getInstance().getEmulatorOutput();
+          byte data = getData();
+          internals.setRegister("A", data);
+          internals.incAddress(1);
+          return output;
         }
       }.setName("A= " + Integer.toString(i)).setMnemonic(String.format("A%02d", i))
           .setCommandByte((byte) (SPS_A_EQUALS.getCommandByte() + i)).setCommand(SPS_A_EQUALS));
@@ -112,14 +111,16 @@ public class HoltekEmulator extends AbstractEmulator implements SPSEmulator {
     datas.add(new SPSCommandDataImpl() {
       @Override
       public EmulatorOutput doWork(EmulatorInput input, EmulatorInternals internals, EmulatorOutput output) {
+        internals.setRegister("B", internals.getRegister("A"));
         ((HoltekEmulatorInternals) internals).address++;
-        return HoltekEmulator.getInstance().getEmulatorOutput();
+        return output;
       }
     }.setName("B=A").setMnemonic("BEA").setCommandByte((byte) (SPS_EQUALS_A.getCommandByte() + 0x01))
         .setCommand(SPS_EQUALS_A));
     datas.add(new SPSCommandDataImpl() {
       @Override
       public EmulatorOutput doWork(EmulatorInput input, EmulatorInternals internals, EmulatorOutput output) {
+        internals.setRegister("C", internals.getRegister("A"));
         ((HoltekEmulatorInternals) internals).address++;
         return HoltekEmulator.getInstance().getEmulatorOutput();
       }
@@ -128,6 +129,7 @@ public class HoltekEmulator extends AbstractEmulator implements SPSEmulator {
     datas.add(new SPSCommandDataImpl() {
       @Override
       public EmulatorOutput doWork(EmulatorInput input, EmulatorInternals internals, EmulatorOutput output) {
+        internals.setRegister("D", internals.getRegister("A"));
         ((HoltekEmulatorInternals) internals).address++;
         return HoltekEmulator.getInstance().getEmulatorOutput();
       }
@@ -136,6 +138,8 @@ public class HoltekEmulator extends AbstractEmulator implements SPSEmulator {
     datas.add(new SPSCommandDataImpl() {
       @Override
       public EmulatorOutput doWork(EmulatorInput input, EmulatorInternals internals, EmulatorOutput output) {
+        HoltekEmulatorOutput emulatorOutput = (HoltekEmulatorOutput) output;
+        emulatorOutput.setOutput(internals.getRegister("A"));
         ((HoltekEmulatorInternals) internals).address++;
         return HoltekEmulator.getInstance().getEmulatorOutput();
       }
@@ -144,40 +148,62 @@ public class HoltekEmulator extends AbstractEmulator implements SPSEmulator {
     datas.add(new SPSCommandDataImpl() {
       @Override
       public EmulatorOutput doWork(EmulatorInput input, EmulatorInternals internals, EmulatorOutput output) {
+        HoltekEmulatorOutput emulatorOutput = (HoltekEmulatorOutput) output;
+        byte dataNew = internals.getRegister("A");
+        byte dataOld = emulatorOutput.getOutput();
+        byte data = (byte) ((dataOld & 0b00001110) + (dataNew & 0x01));
+        emulatorOutput.setOutput(data);
         ((HoltekEmulatorInternals) internals).address++;
-        return HoltekEmulator.getInstance().getEmulatorOutput();
+        return emulatorOutput;
       }
     }.setName("Output.1=A").setMnemonic("O1EA").setCommandByte((byte) (SPS_EQUALS_A.getCommandByte() + 0x05))
         .setCommand(SPS_EQUALS_A));
     datas.add(new SPSCommandDataImpl() {
       @Override
       public EmulatorOutput doWork(EmulatorInput input, EmulatorInternals internals, EmulatorOutput output) {
+        HoltekEmulatorOutput emulatorOutput = (HoltekEmulatorOutput) output;
+        byte dataNew = internals.getRegister("A");
+        byte dataOld = emulatorOutput.getOutput();
+        byte data = (byte) ((dataOld & 0b00001101) + ((dataNew & 0x01) << 1));
+        emulatorOutput.setOutput(data);
         ((HoltekEmulatorInternals) internals).address++;
-        return HoltekEmulator.getInstance().getEmulatorOutput();
+        return emulatorOutput;
       }
     }.setName("Output.2=A").setMnemonic("O2EA").setCommandByte((byte) (SPS_EQUALS_A.getCommandByte() + 0x06))
         .setCommand(SPS_EQUALS_A));
     datas.add(new SPSCommandDataImpl() {
       @Override
       public EmulatorOutput doWork(EmulatorInput input, EmulatorInternals internals, EmulatorOutput output) {
+        HoltekEmulatorOutput emulatorOutput = (HoltekEmulatorOutput) output;
+        byte dataNew = internals.getRegister("A");
+        byte dataOld = emulatorOutput.getOutput();
+        byte data = (byte) ((dataOld & 0b00001011) + ((dataNew & 0x01) << 2));
+        emulatorOutput.setOutput(data);
         ((HoltekEmulatorInternals) internals).address++;
-        return HoltekEmulator.getInstance().getEmulatorOutput();
+        return emulatorOutput;
       }
     }.setName("Output.3=A").setMnemonic("O3EA").setCommandByte((byte) (SPS_EQUALS_A.getCommandByte() + 0x07))
         .setCommand(SPS_EQUALS_A));
     datas.add(new SPSCommandDataImpl() {
       @Override
       public EmulatorOutput doWork(EmulatorInput input, EmulatorInternals internals, EmulatorOutput output) {
+        HoltekEmulatorOutput emulatorOutput = (HoltekEmulatorOutput) output;
+        byte dataNew = internals.getRegister("A");
+        byte dataOld = emulatorOutput.getOutput();
+        byte data = (byte) ((dataOld & 0b00000111) + ((dataNew & 0x01) << 3));
+        emulatorOutput.setOutput(data);
         ((HoltekEmulatorInternals) internals).address++;
-        return HoltekEmulator.getInstance().getEmulatorOutput();
+        return emulatorOutput;
       }
     }.setName("Output.4=A").setMnemonic("O4EA").setCommandByte((byte) (SPS_EQUALS_A.getCommandByte() + 0x08))
         .setCommand(SPS_EQUALS_A));
     datas.add(new SPSCommandDataImpl() {
       @Override
       public EmulatorOutput doWork(EmulatorInput input, EmulatorInternals internals, EmulatorOutput output) {
+        HoltekEmulatorOutput emulatorOutput = (HoltekEmulatorOutput) output;
+        emulatorOutput.setFeature("PWM", internals.getRegister("A"));
         ((HoltekEmulatorInternals) internals).address++;
-        return HoltekEmulator.getInstance().getEmulatorOutput();
+        return emulatorOutput;
       }
     }.setName("PWM=A").setMnemonic("PEA").setCommandByte((byte) (SPS_EQUALS_A.getCommandByte() + 0x09))
         .setCommand(SPS_EQUALS_A));

+ 32 - 0
src/main/java/de/mcs/tools/sps/holtec/HoltekEmulatorInternals.java

@@ -45,4 +45,36 @@ public class HoltekEmulatorInternals implements EmulatorInternals {
     return delay;
   }
 
+  @Override
+  public void setRegister(String registerName, byte data) {
+    if ("A".equals(registerName.toUpperCase())) {
+      a = data;
+    }
+    if ("B".equals(registerName.toUpperCase())) {
+      b = data;
+    }
+    if ("C".equals(registerName.toUpperCase())) {
+      c = data;
+    }
+    if ("D".equals(registerName.toUpperCase())) {
+      d = data;
+    }
+  }
+
+  @Override
+  public byte getRegister(String register) {
+    if ("A".equals(register.toUpperCase())) {
+      return (byte) a;
+    }
+    if ("B".equals(register.toUpperCase())) {
+      return (byte) b;
+    }
+    if ("C".equals(register.toUpperCase())) {
+      return (byte) c;
+    }
+    if ("D".equals(register.toUpperCase())) {
+      return (byte) d;
+    }
+    return 0;
+  }
 }

+ 17 - 0
src/main/java/de/mcs/tools/sps/holtec/HoltekEmulatorOutput.java

@@ -23,4 +23,21 @@ public class HoltekEmulatorOutput implements EmulatorOutput {
     pwm = 0;
   }
 
+  public void setOutput(byte data) {
+    d0 = (data & (byte) 0x01) > 0;
+    d1 = (data & (byte) 0x02) > 0;
+    d2 = (data & (byte) 0x04) > 0;
+    d3 = (data & (byte) 0x08) > 0;
+  }
+
+  public byte getOutput() {
+    return (byte) ((d0 ? 1 : 0) + (d1 ? 2 : 0) + (d2 ? 4 : 0) + (d3 ? 8 : 0));
+  }
+
+  public void setFeature(String name, byte register) {
+    if ("PWM".equals(name.toUpperCase())) {
+      pwm = register;
+    }
+  }
+
 }