diff options
Diffstat (limited to 'src/utils/test-utils.ts')
| -rw-r--r-- | src/utils/test-utils.ts | 17 |
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'); + } } |
