'use strict'; const { AddrMode } = require('./enum.js'); function DoDat(core, pc, ins) { // do nothing return []; } function DoMov(core, pc, ins) { if (ins.a.mode === AddrMode.Immediate) { let mem = core.getValue(pc, ins.b); mem.b.value = ins.a.value; } else { const src = core.getValue(pc, ins.a); const dstLoc = core.getLocation(pc, ins.b); // hacky deep copy core.data[dstLoc] = JSON.parse(JSON.stringify(src)); } return [pc + 1]; } function DoAdd(core, pc, ins) { if (ins.a.mode === AddrMode.Immediate) { let dst = core.getValue(pc, ins.b); dst.b += ins.a.value; } else { let src = core.getValue(pc, ins.a); let dst = core.getValue(pc, ins.b); dst.a.value += src.a.value; dst.b.value += src.b.value; } return [pc + 1]; } function DoSub(core, pc, ins) { if (ins.a.mode === AddrMode.Immediate) { let dst = core.getValue(pc, ins.b); dst.b -= ins.a.value; } else { let src = core.getValue(pc, ins.a); let dst = core.getValue(pc, ins.b); dst.a.value -= src.a.value; dst.b.value -= src.b.value; } return [pc + 1]; } function DoJmp(core, pc, ins) { return [core.getLocation(pc, ins.a)]; } function DoJmz(core, pc, ins) { let test if (ins.b.mode === AddrMode.Immediate) { test = ins; } else { test = core.getValue(pc, ins.b); } if (test.b.value === 0) { return [core.getLocation(pc, ins.a)]; } else { return [pc + 1]; } } function DoJmn(core, pc, ins) { let test if (ins.b.mode === AddrMode.Immediate) { test = ins; } else { test = core.getValue(pc, ins.b); } if (test.b.value !== 0) { return [core.getLocation(pc, ins.a)]; } else { return [pc + 1]; } } function DoCmp(core, pc, ins) { if (ins.a.mode === AddrMode.Immediate) { const test = core.getValue(pc, ins.b); if (ins.a.value === test.b.value) { return [pc + 2]; } else { return [pc + 1]; } } else { const a = core.getValue(pc, ins.a); const b = core.getValue(pc, ins.b); if ( a.opcode === b.opcode && a.a.value === b.a.value && a.b.value === b.b.value) ) { return [pc + 2]; } else { return [pc + 1]; } } }