diff --git a/src/buttons.js b/src/buttons.js index 70c34e3..00d6933 100644 --- a/src/buttons.js +++ b/src/buttons.js @@ -21,11 +21,11 @@ export class ButtonMachine { * @constructor * @param { Array } code -- The array of arrays for the code. */ - constructor(code) { + constructor() { this.stack = []; this.ram = new Array(64).fill(0); this.ip = 0; - this.code = code; + this.code = []; this.max_ticks = 256; this.tick = 0; this.registers = { @@ -66,7 +66,7 @@ export class ButtonMachine { * @return { Array[String] } -- List of registers. */ register_names() { - return Object.entries(this.registers); + return Object.getOwnPropertyNames(this.registers); } /** @@ -434,10 +434,29 @@ export class ButtonMachine { } } + load(code) { + this.code = code; + } + /** * Coming soon. */ - static parse(code) { + parse(code) { + const lines = code.split("\n"); + const result = lines.map(l => { + let t = l.split(" "); + let inst = t.slice(0,1); + let data = t.slice(1).map(i => { + let num = parseInt(i, 10); + + return isNaN(num) ? i : num; + }); + + return inst.concat(data); + }); + + // remove empty operations/lines + return result.filter(t => t[0] !== ""); } } diff --git a/src/runner.js b/src/runner.js new file mode 100644 index 0000000..424b660 --- /dev/null +++ b/src/runner.js @@ -0,0 +1,23 @@ +import { ButtonMachine } from '../src/buttons.js'; +import fs from "fs"; +import assert from "assert"; + +let machine = new ButtonMachine(); + +const ops = ButtonMachine.operations(); +const registers = machine.register_names(); + +assert(process.argv[2] !== undefined, "USAGE: runner.js [source.btn]"); + +const source = fs.readFileSync(process.argv[2]); + +const code = machine.parse(source.toString()); +console.log("CODE", code); + +machine.load(code); +machine.run(); + +console.log("STACK TOP", machine.stack_top); +console.log("REGISTERS", machine.registers); +console.log("STACK", machine.stack); +console.log("RAM", machine.ram); diff --git a/tests/basic.btn b/tests/basic.btn index 8d95f54..c156119 100644 --- a/tests/basic.btn +++ b/tests/basic.btn @@ -1,7 +1,6 @@ PUSH 10 PUSH 1 -SUB -JZ 5 +ADD +JZ 6 JUMP 1 -PUSH 100 HALT diff --git a/tests/basic_tests.js b/tests/basic_tests.js index b0c44e2..01eb39d 100644 --- a/tests/basic_tests.js +++ b/tests/basic_tests.js @@ -1,18 +1,19 @@ import { ButtonMachine } from '../src/buttons.js'; let code = [ - ['PUSH', -10], // start at -10 - ['PUSH', 1], // increment by 1 + ['PUSH', -10], + ['PUSH', 1], ['ADD'], - ['POKE', 1], // put it in ram, IX++ - ['JNZ', 1], // the previous test fails so it jumps to loop again + ['POKE', 1], + ['JNZ', 1], ['STOR', 'IX'], ['POP'], ['PEEK', 1], ['JNZ', 6], ]; -let machine = new ButtonMachine(code); +let machine = new ButtonMachine(); +machine.load(code); const ops = ButtonMachine.operations(); const registers = machine.register_names();