summaryrefslogtreecommitdiff
path: root/src/vm/instruction.js
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2023-05-22 23:43:39 -0500
committersanine <sanine.not@pm.me>2023-05-22 23:43:39 -0500
commitc1709249728cb9ad7011b0d39d18ad87d4636f4b (patch)
treed4fae900af8cc4ee2956bbbe3c5c70c1664b193f /src/vm/instruction.js
parentd6e89d16d332954dde3fc4c5ee7549af7c8bb556 (diff)
begin testing and make grammar more spec-compliant
Diffstat (limited to 'src/vm/instruction.js')
-rw-r--r--src/vm/instruction.js111
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];
- }
- }
-}
-
-