Jelajahi Sumber

next step, starting program in emulator

Klaas, Wilfried 6 tahun lalu
induk
melakukan
74d5654e35

+ 59 - 6
src/main/java/de/mcs/tools/sps/AbstractEmulator.java

@@ -13,6 +13,13 @@ import de.mcs.tools.sps.exceptions.WrongProgramSizeException;
  */
 public abstract class AbstractEmulator implements SPSEmulator {
 
+  protected byte[] programMemory;
+  private boolean debug;
+  protected int address;
+  protected int a, b, c, d;
+  private boolean active;
+  private TOutputCallback outputCallback;
+
   @Override
   public abstract List<SPSCommand> getCommands();
 
@@ -25,36 +32,82 @@ public abstract class AbstractEmulator implements SPSEmulator {
       throw new WrongProgramSizeException(
           String.format("the program is to long. Only %d bytes are permitted", getProgramSize()));
     }
-
+    this.programMemory = program;
   }
 
   @Override
   public void startProgram(boolean debug) {
+    this.debug = debug;
+    reset();
+    active = true;
+    if (outputCallback != null) {
+      outputCallback.onOutput(getEmulatorOutput());
+    }
+    if (!debug) {
+      while (active) {
+        callNextCommand();
+      }
+    }
+  }
 
+  protected abstract void callNextCommand();
+
+  protected SPSCommandData getCommandData(byte command) {
+    SPSCommandData commandData = null;
+    byte commandByte = (byte) (command & (byte) 0xF0);
+
+    List<SPSCommand> commands = getCommands();
+    for (SPSCommand c : commands) {
+      if (c.getCommandByte() == commandByte) {
+        for (SPSCommandData cd : c.getCommandDatas()) {
+          if (cd.getCommandByte() == command) {
+            commandData = cd;
+          }
+        }
+      }
+    }
+    return commandData;
+  }
+
+  protected void runCommand(SPSCommandData commandData) {
+    commandData.doWork();
+    if (outputCallback != null) {
+      outputCallback.onOutput(getEmulatorOutput());
+    }
+  }
+
+  protected abstract EmulatorOutput getEmulatorOutput();
+
+  protected void reset() {
+    address = 0;
+    a = 0;
+    b = 0;
+    c = 0;
+    d = 0;
   }
 
   @Override
   public void addCallback(TOutputCallback callback) {
-
+    this.outputCallback = callback;
   }
 
   @Override
   public void nextStep() {
-
+    callNextCommand();
   }
 
   @Override
   public boolean isActive() {
-    return false;
+    return active;
   }
 
   @Override
   public void stop() {
-
+    active = false;
   }
 
   @Override
-  public TEmulatorInternals getInternals() {
+  public EmulatorInternals getInternals() {
     return null;
   }
 

+ 1 - 1
src/main/java/de/mcs/tools/sps/TEmulatorInternals.java → src/main/java/de/mcs/tools/sps/EmulatorInternals.java

@@ -9,6 +9,6 @@ package de.mcs.tools.sps;
  * @author w.klaas
  *
  */
-public interface TEmulatorInternals {
+public interface EmulatorInternals {
 
 }

+ 1 - 1
src/main/java/de/mcs/tools/sps/TEmulatorOutput.java → src/main/java/de/mcs/tools/sps/EmulatorOutput.java

@@ -9,6 +9,6 @@ package de.mcs.tools.sps;
  * @author w.klaas
  *
  */
-public interface TEmulatorOutput {
+public interface EmulatorOutput {
 
 }

+ 5 - 0
src/main/java/de/mcs/tools/sps/SPSCommandData.java

@@ -32,4 +32,9 @@ public interface SPSCommandData {
    */
   byte getCommandByte();
 
+  /**
+   * here the work should be done
+   */
+  void doWork();
+
 }

+ 10 - 0
src/main/java/de/mcs/tools/sps/SPSCommandDataImpl.java

@@ -80,4 +80,14 @@ public class SPSCommandDataImpl implements SPSCommandData {
     return this;
   }
 
+  @Override
+  public String toString() {
+    return String.format("%s (%s): %.2X", getMnemonic(), getName(), getCommandByte());
+  }
+
+  @Override
+  public void doWork() {
+
+  }
+
 }

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

@@ -71,4 +71,8 @@ public class SPSCommandImpl implements SPSCommand {
     return this;
   }
 
+  @Override
+  public String toString() {
+    return String.format("%s (%s): %.2X", getMnemonic(), getName(), getCommandByte());
+  }
 }

+ 1 - 1
src/main/java/de/mcs/tools/sps/SPSEmulator.java

@@ -71,5 +71,5 @@ public interface SPSEmulator {
    * 
    * @return the actual emualtor internals
    */
-  TEmulatorInternals getInternals();
+  EmulatorInternals getInternals();
 }

+ 1 - 1
src/main/java/de/mcs/tools/sps/TOutputCallback.java

@@ -10,5 +10,5 @@ package de.mcs.tools.sps;
  *
  */
 public interface TOutputCallback {
-  void onOutput(TEmulatorOutput output);
+  void onOutput(EmulatorOutput output);
 }

+ 5 - 0
src/main/java/de/mcs/tools/sps/holtec/HoltecEmulator.java

@@ -285,4 +285,9 @@ public class HoltecEmulator extends AbstractEmulator implements SPSEmulator {
     return 128;
   }
 
+  @Override
+  protected void reset() {
+    super.reset();
+    System.out.println("holtec emulator resettet");
+  }
 }

+ 34 - 2
src/test/java/de/mcs/tools/sps/holtec/TestHoltecEmualtor.java

@@ -4,23 +4,28 @@ import static org.junit.Assert.fail;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import de.mcs.tools.sps.EmulatorInternals;
+import de.mcs.tools.sps.EmulatorOutput;
 import de.mcs.tools.sps.SPSCommand;
 import de.mcs.tools.sps.SPSCommandData;
 import de.mcs.tools.sps.SPSEmulator;
+import de.mcs.tools.sps.TOutputCallback;
 import de.mcs.tools.sps.exceptions.WrongProgramSizeException;
 
-class TestHoltecEmualtor {
+class TestHoltecEmualtor implements TOutputCallback {
 
   private SPSEmulator holtectEmulator;
 
   @BeforeEach
   void setUp() throws Exception {
     holtectEmulator = new HoltecEmulator();
+    holtectEmulator.addCallback(this);
   }
 
   @Test
@@ -53,9 +58,12 @@ class TestHoltecEmualtor {
   @Test
   void testCommandArray() {
     List<SPSCommand> commands = holtectEmulator.getCommands();
-    assertEquals(14, commands.size());
+    assertEquals(15, commands.size());
     for (SPSCommand spsCommand : commands) {
       switch (spsCommand.getCommandByte()) {
+      case 0x00:
+        assertEquals(1, spsCommand.getCommandDatas().size());
+        break;
       case 0x10:
         assertEquals(16, spsCommand.getCommandDatas().size());
         break;
@@ -104,4 +112,28 @@ class TestHoltecEmualtor {
       }
     }
   }
+
+  @Test
+  void testNOP() throws WrongProgramSizeException {
+    outputList.clear();
+    internalList.clear();
+    byte[] prg = new byte[] { 0x00, 0x00, 0x00 };
+    holtectEmulator.loadProgram(prg);
+    holtectEmulator.startProgram(true);
+    holtectEmulator.nextStep();
+    holtectEmulator.nextStep();
+    holtectEmulator.nextStep();
+
+    assertEquals(4, outputList.size());
+    assertEquals(4, internalList.size());
+  }
+
+  List<EmulatorOutput> outputList = new ArrayList();
+  List<EmulatorInternals> internalList = new ArrayList<>();
+
+  @Override
+  public void onOutput(EmulatorOutput output) {
+    outputList.add(output);
+    internalList.add(holtectEmulator.getInternals());
+  }
 }