@emdzej/inpax-interpreter
v0.5.0
Published
INPA IPO bytecode interpreter
Maintainers
Readme
@emdzej/inpax-interpreter
VM interpreter for INPAX bytecode execution.
Usage
import { Interpreter } from '@emdzej/inpax-interpreter';
import { parseIPO } from '@emdzej/inpax-parser';
import type { IUIProvider, IEdiabasProvider } from '@emdzej/inpax-interfaces';
const ipo = parseIPO(buffer);
const interpreter = new Interpreter({
ipo,
ui: uiProvider,
ediabas: ediabasProvider,
});
// Run entry function
await interpreter.run('inpainit');
// Or step through
interpreter.load('inpainit');
while (!interpreter.halted) {
await interpreter.step();
}VM Architecture
- Stack-based — Operands pushed/popped from stack
- System calls — UI and EDIABAS via numbered syscalls
- Local variables — Per-function local storage
- String table — Shared string pool
Execution Modes
Continuous
await interpreter.run('functionName');Step-by-step
interpreter.load('functionName');
while (!interpreter.halted) {
const instruction = interpreter.current;
console.log(instruction);
await interpreter.step();
}Debug
interpreter.on('instruction', (instr) => {
console.log(`${instr.offset}: ${instr.opcode}`);
});
interpreter.on('syscall', (call) => {
console.log(`SYSCALL: ${call.name}(${call.args})`);
});State
interface VMState {
pc: number; // Program counter
sp: number; // Stack pointer
stack: unknown[]; // Value stack
locals: unknown[]; // Local variables
halted: boolean; // Execution stopped
}