From 29ed5eacb80cdfe49bff0d9335241dc3e2188981 Mon Sep 17 00:00:00 2001 From: sanine-a Date: Tue, 23 May 2023 14:15:18 -0500 Subject: add step() --- src/vm/core.js | 21 ++++++++++++++++ src/vm/vm.js | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/src/vm/core.js b/src/vm/core.js index 184be00..a8fbce7 100644 --- a/src/vm/core.js +++ b/src/vm/core.js @@ -81,6 +81,27 @@ class Core { } + initialize(programs) { + const ranges = this.getRanges( + programs.map(p => p.program.length) + ) + + const pc = []; + for (let i=0; i new Warrior(start)); + } + + step() { + let running = 0; + + for (let warrior of this.warriors) { + if (warrior.isDead()) { + continue; + } else { + running += 1; + } + + const pc = warrior.next(); + const ins = this.core.data[pc]; + let next; + switch(ins.opcode) { + case 'DAT': + next = DAT(this.core, pc, ins); + break; + case 'MOV': + next = MOV(this.core, pc, ins); + break; + case 'ADD': + next = ADD(this.core, pc, ins); + break; + case 'SUB': + next = SUB(this.core, pc, ins); + break; + case 'CMP': + next = CMP(this.core, pc, ins); + break; + case 'SLT': + next = SLT(this.core, pc, ins); + break; + case 'JMP': + next = JMP(this.core, pc, ins); + break; + case 'JMZ': + next = JMZ(this.core, pc, ins); + break; + case 'JMN': + next = JMN(this.core, pc, ins); + break; + case 'DJN': + next = DJN(this.core, pc, ins); + break; + case 'SPL': + next = SPL(this.core, pc, ins); + break; + default: + throw `core corruption: bad instruction ${ins}` + } + } + return running; + } + + run(maxSteps) { + let steps = 0; + let running = this.warriors.length; + while(running > 0 && steps < maxSteps) { + running = this.step(); + steps += 1; + } + + if (running !== 0) { + console.log("draw, maximum steps exceeded"); + } + for (let i=0; i