|
@@ -24,6 +24,7 @@ package de.mcs.tools.sps.emulator.holtek;
|
|
|
import de.mcs.tools.sps.emulator.AbstractEmulator;
|
|
|
import de.mcs.tools.sps.emulator.Emulator;
|
|
|
import de.mcs.tools.sps.emulator.model.WebSessionModel;
|
|
|
+import de.mcs.tools.sps.emulator.model.WorkingModel;
|
|
|
|
|
|
/**
|
|
|
* @author wklaa_000
|
|
@@ -31,8 +32,282 @@ import de.mcs.tools.sps.emulator.model.WebSessionModel;
|
|
|
*/
|
|
|
public class HoltekEmulator extends AbstractEmulator implements Emulator {
|
|
|
|
|
|
+ long[] DELAY_TIMES = { 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 30000, 60000 };
|
|
|
+
|
|
|
public HoltekEmulator(WebSessionModel model) {
|
|
|
super(model);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ protected void doSetA(byte data) {
|
|
|
+ getModel().getWork().setRegisterA(data);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doCalc(byte data) {
|
|
|
+ WorkingModel work = getModel().getWork();
|
|
|
+ switch (data) {
|
|
|
+ case 1:
|
|
|
+ work.setRegisterA((byte) (work.getRegisterA() + 1));
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ work.setRegisterA((byte) (work.getRegisterA() - 1));
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ work.setRegisterA((byte) (work.getRegisterA() + work.getRegisterB()));
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ work.setRegisterA((byte) (work.getRegisterA() - work.getRegisterB()));
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ work.setRegisterA((byte) (work.getRegisterA() * work.getRegisterB()));
|
|
|
+ break;
|
|
|
+ case 6:
|
|
|
+ work.setRegisterA((byte) (work.getRegisterA() / work.getRegisterB()));
|
|
|
+ break;
|
|
|
+ case 7:
|
|
|
+ work.setRegisterA((byte) (work.getRegisterA() & work.getRegisterB()));
|
|
|
+ break;
|
|
|
+ case 8:
|
|
|
+ work.setRegisterA((byte) (work.getRegisterA() | work.getRegisterB()));
|
|
|
+ break;
|
|
|
+ case 9:
|
|
|
+ work.setRegisterA((byte) (work.getRegisterA() ^ work.getRegisterB()));
|
|
|
+ break;
|
|
|
+ case 10:
|
|
|
+ work.setRegisterA((byte) (~work.getRegisterA()));
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doCall(byte data) {
|
|
|
+ getModel().getWork().setRaddress(getModel().getWork().getAddress());
|
|
|
+ doJump(data);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doNop(byte data) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doPort(byte data) {
|
|
|
+ getModel().getOutput().setOutput1((data & 0x01) > 0);
|
|
|
+ getModel().getOutput().setOutput2((data & 0x02) > 0);
|
|
|
+ getModel().getOutput().setOutput3((data & 0x04) > 0);
|
|
|
+ getModel().getOutput().setOutput4((data & 0x08) > 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doDelay(byte data) {
|
|
|
+ try {
|
|
|
+ Thread.sleep(DELAY_TIMES[data]);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doJumpBack(byte data) {
|
|
|
+ short address = getModel().getWork().getAddress();
|
|
|
+ address -= data;
|
|
|
+ if (address < 0) {
|
|
|
+ address = 0;
|
|
|
+ }
|
|
|
+ getModel().getWork().setAddress((short) (address - 1));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doAIs(byte data) {
|
|
|
+ WorkingModel work = getModel().getWork();
|
|
|
+ switch (data) {
|
|
|
+ case 1:
|
|
|
+ work.setRegisterA(work.getRegisterB());
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ work.setRegisterA(work.getRegisterC());
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ work.setRegisterA(work.getRegisterD());
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ byte value = (byte) (getModel().getInput().isInput1() ? 1 : 0);
|
|
|
+ value += (byte) (getModel().getInput().isInput2() ? 2 : 0);
|
|
|
+ value += (byte) (getModel().getInput().isInput3() ? 4 : 0);
|
|
|
+ value += (byte) (getModel().getInput().isInput4() ? 8 : 0);
|
|
|
+ work.setRegisterA(value);
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ work.setRegisterA((byte) (getModel().getInput().isInput1() ? 1 : 0));
|
|
|
+ break;
|
|
|
+ case 6:
|
|
|
+ work.setRegisterA((byte) (getModel().getInput().isInput2() ? 1 : 0));
|
|
|
+ break;
|
|
|
+ case 7:
|
|
|
+ work.setRegisterA((byte) (getModel().getInput().isInput3() ? 1 : 0));
|
|
|
+ break;
|
|
|
+ case 8:
|
|
|
+ work.setRegisterA((byte) (getModel().getInput().isInput4() ? 1 : 0));
|
|
|
+ break;
|
|
|
+ case 9:
|
|
|
+ work.setRegisterA((byte) (getModel().getInput().getAdc1()));
|
|
|
+ break;
|
|
|
+ case 10:
|
|
|
+ work.setRegisterA((byte) (getModel().getInput().getAdc2()));
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doIsA(byte data) {
|
|
|
+ WorkingModel work = getModel().getWork();
|
|
|
+ switch (data) {
|
|
|
+ case 0:
|
|
|
+ byte temp = work.getRegisterA();
|
|
|
+ work.setRegisterA(work.getRegisterB());
|
|
|
+ work.setRegisterB(temp);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ work.setRegisterB(work.getRegisterA());
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ work.setRegisterC(work.getRegisterA());
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ work.setRegisterD(work.getRegisterA());
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ doPort(work.getRegisterA());
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ getModel().getOutput().setOutput1((work.getRegisterA() & 0x01) > 0);
|
|
|
+ break;
|
|
|
+ case 6:
|
|
|
+ getModel().getOutput().setOutput2((work.getRegisterA() & 0x02) > 0);
|
|
|
+ break;
|
|
|
+ case 7:
|
|
|
+ getModel().getOutput().setOutput3((work.getRegisterA() & 0x04) > 0);
|
|
|
+ break;
|
|
|
+ case 8:
|
|
|
+ getModel().getOutput().setOutput4((work.getRegisterA() & 0x08) > 0);
|
|
|
+ break;
|
|
|
+ case 9:
|
|
|
+ getModel().getOutput().setPwm1((byte) ((work.getRegisterA() & 0x0F) << 4));
|
|
|
+ break;
|
|
|
+ case 10:
|
|
|
+ getModel().getOutput().setPwm2((byte) ((work.getRegisterA() & 0x0F) << 4));
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doPage(byte data) {
|
|
|
+ byte value = (byte) (data & 0x07);
|
|
|
+ getModel().getWork().setPage(value);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doJump(byte data) {
|
|
|
+ int value = data + (16 * getModel().getWork().getPage());
|
|
|
+ getModel().getWork().setAddress((short) (value - 1));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doCCount(byte data) {
|
|
|
+ byte value = getModel().getWork().getRegisterC();
|
|
|
+ if (value > 0) {
|
|
|
+ value -= 1;
|
|
|
+ getModel().getWork().setRegisterC(value);
|
|
|
+ doJump(data);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doDCount(byte data) {
|
|
|
+ byte value = getModel().getWork().getRegisterD();
|
|
|
+ if (value > 0) {
|
|
|
+ value -= 1;
|
|
|
+ getModel().getWork().setRegisterD(value);
|
|
|
+ doJump(data);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doSkip(byte data) {
|
|
|
+ WorkingModel work = getModel().getWork();
|
|
|
+ boolean skip = false;
|
|
|
+ switch (data) {
|
|
|
+ case 1:
|
|
|
+ skip = (work.getRegisterA() > work.getRegisterB());
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ skip = (work.getRegisterA() < work.getRegisterB());
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ skip = (work.getRegisterA() == work.getRegisterB());
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ skip = getModel().getInput().isInput1();
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ skip = getModel().getInput().isInput2();
|
|
|
+ break;
|
|
|
+ case 6:
|
|
|
+ skip = getModel().getInput().isInput3();
|
|
|
+ break;
|
|
|
+ case 7:
|
|
|
+ skip = getModel().getInput().isInput4();
|
|
|
+ break;
|
|
|
+ case 8:
|
|
|
+ skip = !getModel().getInput().isInput1();
|
|
|
+ break;
|
|
|
+ case 9:
|
|
|
+ skip = !getModel().getInput().isInput2();
|
|
|
+ break;
|
|
|
+ case 10:
|
|
|
+ skip = !getModel().getInput().isInput3();
|
|
|
+ break;
|
|
|
+ case 11:
|
|
|
+ skip = !getModel().getInput().isInput4();
|
|
|
+ break;
|
|
|
+ case 12:
|
|
|
+ skip = !getModel().getInput().isPrg();
|
|
|
+ break;
|
|
|
+ case 13:
|
|
|
+ skip = !getModel().getInput().isSel();
|
|
|
+ break;
|
|
|
+ case 14:
|
|
|
+ skip = getModel().getInput().isPrg();
|
|
|
+ break;
|
|
|
+ case 15:
|
|
|
+ skip = getModel().getInput().isSel();
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (skip) {
|
|
|
+ int value = getModel().getWork().getAddress();
|
|
|
+ getModel().getWork().setAddress((short) (value + 1));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doCallSub(byte data) {
|
|
|
+ if (data == 0) {
|
|
|
+ getModel().getWork().setAddress(getModel().getWork().getRaddress());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void doByte(byte data) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|