diff options
Diffstat (limited to 'src/vm/instruction.js')
-rw-r--r-- | src/vm/instruction.js | 111 |
1 files changed, 2 insertions, 109 deletions
diff --git a/src/vm/instruction.js b/src/vm/instruction.js index 0fe922d..ac4cd83 100644 --- a/src/vm/instruction.js +++ b/src/vm/instruction.js @@ -3,114 +3,7 @@ const { AddrMode } = require('./enum.js'); -function DoDat(core, pc, ins) { - // do nothing +exports.DAT = function(core, pc, ins) { + // do nothing and die 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]; - } - } -} - - |