all repos — xyw @ d47c74dd74465f347a388b3b2bcf28905a6ee6df

A minimal virtual machine and assembler for terminals.

Updated error handling logic.
h3rald h3rald@h3rald.com
Tue, 03 Feb 2026 16:35:41 +0100
commit

d47c74dd74465f347a388b3b2bcf28905a6ee6df

parent

1b8b6fad6f42d23a89b1366bb246aea77ca8c0cc

1 files changed, 10 insertions(+), 6 deletions(-)

jump to
M xywrun.cxywrun.c

@@ -298,6 +298,8 @@ //// Returns 1 on success, 0 on error

int xyw_eval(xyw_word start_pc) { *pc = start_pc; + xyw_byte handler_entry_s = 0; // Track stack depth when entering error handler + if (xyw_memory[SYSTEM_STATE] & xyw_debug) { xyw_memory[SYSTEM_STATE] |= SYSTEM_STATE_DEBUG;

@@ -305,11 +307,6 @@ }

while ((xyw_memory[SYSTEM_STATE] & SYSTEM_STATE_RUNNING) && *pc < SYSTEM_MEMORY_START) { - if (xyw_memory[SYSTEM_ERROR] == XYW_ERROR_NONE) - { - // Clear error state if no error - xyw_memory[SYSTEM_STATE] &= ~SYSTEM_STATE_ERROR; - } if (xyw_memory[SYSTEM_ERROR] != XYW_ERROR_NONE && !(xyw_memory[SYSTEM_STATE] & SYSTEM_STATE_ERROR)) { // An error has occurred, update state

@@ -318,6 +315,7 @@ xyw_word on_error_handler = XYW_PEEKW(&xyw_memory[SYSTEM_ON_ERROR]);

// If an error handler is set, jump to it if (on_error_handler != 0) { + handler_entry_s = *s; // Record stack depth before pushing return address ss_pushw(*pc); *pc = on_error_handler; }

@@ -375,7 +373,13 @@ /* ROT */ OPC_SR2(0x1B, PUSH(b); PUSH(POP()); PUSH(a));

/* JMP */ OPC_SR1(0x1C, , *pc = ADDR(ARG)-1;); /* JCN */ OPC_SR1(0x1D, , xyw_word addr = ADDR(ARG); xyw_byte cond = us_pop(); if (cond) { *pc = addr-1; }); /* JSR */ OPC_SR1(0x1E, xyw_word addr = ADDR(ARG), ss_pushw(*pc+1); *pc = addr-1;); - /* RTS */ case 0x1F: *pc = ss_popw()-1; break; + /* RTS */ case 0x1F: + *pc = ss_popw()-1; + // If returning from error handler, clear flag to allow re-trigger + if ((xyw_memory[SYSTEM_STATE] & SYSTEM_STATE_ERROR) && *s == handler_entry_s) { + xyw_memory[SYSTEM_STATE] &= ~SYSTEM_STATE_ERROR; + } + break; // clang-format on } (*pc)++;