aboutsummaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/utils/test-utils.ts17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/utils/test-utils.ts b/src/utils/test-utils.ts
index ca483f3..2bec178 100644
--- a/src/utils/test-utils.ts
+++ b/src/utils/test-utils.ts
@@ -2,6 +2,8 @@ import { CPU } from '../cpu/cpu';
import { assemble } from './assembler';
import { avrInstruction } from '../cpu/instruction';
+const BREAK_OPCODE = 0x9598;
+
export function asmProgram(source: string) {
const { bytes, errors, lines } = assemble(source);
if (errors.length) {
@@ -20,7 +22,7 @@ export class TestProgramRunner {
runInstructions(count: number) {
const { cpu, peripheral, onBreak } = this;
for (let i = 0; i < count; i++) {
- if (cpu.progMem[cpu.pc] === 0x9598) {
+ if (cpu.progMem[cpu.pc] === BREAK_OPCODE) {
onBreak?.(cpu);
throw new Error('BREAK instruction encountered');
}
@@ -28,4 +30,17 @@ export class TestProgramRunner {
peripheral.tick();
}
}
+
+ runToBreak(maxIterations = 5000) {
+ const { cpu, peripheral, onBreak } = this;
+ for (let i = 0; i < maxIterations; i++) {
+ if (cpu.progMem[cpu.pc] === BREAK_OPCODE) {
+ onBreak?.(cpu);
+ return;
+ }
+ avrInstruction(cpu);
+ peripheral.tick();
+ }
+ throw new Error('Program ran for too long without a BREAK instruction');
+ }
}