diff options
Diffstat (limited to 'src/vm/vm.js')
-rw-r--r-- | src/vm/vm.js | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/src/vm/vm.js b/src/vm/vm.js index 6add546..eea949a 100644 --- a/src/vm/vm.js +++ b/src/vm/vm.js @@ -23,7 +23,12 @@ class Warrior { next() { const pc = this.queue[0]; this.queue = this.queue.slice(1); - return next; + return pc; + } + + peek() { + const pc = this.queue[0]; + return pc; } }; @@ -38,7 +43,8 @@ class RedcodeVm { step() { let running = 0; - for (let warrior of this.warriors) { + for (let i=0; i<this.warriors.length; i++) { + const warrior = this.warriors[i]; if (warrior.isDead()) { continue; } else { @@ -48,6 +54,7 @@ class RedcodeVm { const pc = warrior.next(); const ins = this.core.data[pc]; let next; + console.log(i, this.core.pretty(ins)); switch(ins.opcode) { case 'DAT': next = DAT(this.core, pc, ins); @@ -85,25 +92,30 @@ class RedcodeVm { default: throw `core corruption: bad instruction ${ins}` } + + warrior.append(next); } return running; } + warriorsAlive() { + return this.warriors.reduce( + (count, warrior) => warrior.isDead() ? count : count+1, + 0 + ); + } + run(maxSteps) { let steps = 0; - let running = this.warriors.length; - while(running > 0 && steps < maxSteps) { - running = this.step(); + while(this.warriorsAlive() > 1 && steps < maxSteps) { + this.step(); steps += 1; } - if (running !== 0) { - console.log("draw, maximum steps exceeded"); - } - for (let i=0; i<this.warriors.length; i++) { - console.log(`${i} running: ${!this.warriors[i].isDead()}`); - } + return this.warriors.map( + (w, i) => ({ warrior: i, alive: !w.isDead() }) + ); } }; |