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/vm.js | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) (limited to 'src/vm/vm.js') diff --git a/src/vm/vm.js b/src/vm/vm.js index 1ec890b..6add546 100644 --- a/src/vm/vm.js +++ b/src/vm/vm.js @@ -31,6 +31,81 @@ class Warrior { class RedcodeVm { constructor(coresize, warriors) { this.core = new Core(coresize); + this.warriors = this.core.initialize(warriors) + .map(start => 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