Fixed bugs related to macro expansions when two registers are used; other fixes.
h3rald h3rald@h3rald.com
Mon, 27 Jul 2026 07:05:07 +0200
2 files changed,
13 insertions(+),
7 deletions(-)
M
devices/system.c
→
devices/system.c
@@ -16,6 +16,7 @@ #define MAX_IMAGE_EXEC_PATH_LENGTH 256
/// Error handler tracking static xyw_byte error_handler_entry_s = 0; +static int error_handler_armed = 0; /// Exec stack management static xyw_vm_snapshot exec_stack[MAX_IMAGE_EXEC_DEPTH];@@ -28,6 +29,7 @@ {
(void)data; srand(time(NULL)); error_handler_entry_s = 0; + error_handler_armed = 0; } xyw_byte system_input(xyw_byte *data, xyw_byte addr, xyw_byte *error)@@ -109,11 +111,12 @@ void system_tick(xyw_byte *data)
{ // Check if returning from error handler (after RTS popped the frame) if ((data[SYSTEM_STATE] & XYW_STATE_ERROR) && - error_handler_entry_s != 0 && + error_handler_armed && xyw_vm_get_system_depth() == error_handler_entry_s) { data[SYSTEM_STATE] &= ~XYW_STATE_ERROR; error_handler_entry_s = 0; + error_handler_armed = 0; } // Check for new error condition@@ -124,6 +127,7 @@ if (on_error_handler != 0)
{ XYW_DBG("Error occurred: %02X, jumping to error handler at %04X\n", data[SYSTEM_ERROR], on_error_handler); data[SYSTEM_STATE] |= XYW_STATE_ERROR; + error_handler_armed = 1; error_handler_entry_s = xyw_vm_get_system_depth(); xyw_vm_push_frame(*pc); *pc = on_error_handler;@@ -143,12 +147,14 @@ void system_save(xyw_byte *data, xyw_byte *state)
{ (void)data; state[0] = error_handler_entry_s; + state[1] = (xyw_byte)error_handler_armed; } void system_restore(xyw_byte *data, const xyw_byte *state) { (void)data; error_handler_entry_s = state[0]; + error_handler_armed = state[1]; } int xyw_system_try_restore_parent(void)
M
xywrun.c
→
xywrun.c
@@ -550,13 +550,13 @@ /* STB */ OPC_SR1r(0x06, xyw_byte val = us_pop(); writeb( ADDR(ARGX), val ); writeb( ADDR(ARGY), val ); );
/* STW */ OPC_SR1(0x07, xyw_word addr = ADDR(ARG); xyw_word val = us_popw(), writew( addr, val )); /* STW */ OPC_SR1r(0x07, xyw_word val = us_popw(); writew( ADDR(ARGX), val ); writew( ADDR(ARGY), val ); ); /* INC */ OPC_SR1(0x08, , SET(ARG + 1)); - /* INC */ OPC_SR1r(0x08, SET(ARGX + 1); SET(ARGY + 1); ); + /* INC */ OPC_SR1r(0x08, SETX(ARGX + 1); SETY(ARGY + 1); ); /* DEC */ OPC_SR1(0x09, , SET(ARG - 1)); - /* DEC */ OPC_SR1r(0x09, SET(ARGX - 1); SET(ARGY - 1); ); + /* DEC */ OPC_SR1r(0x09, SETX(ARGX - 1); SETY(ARGY - 1); ); /* SHL */ OPC_SR1(0x0A, xyw_byte val = us_pop(), SET(ARG << val)); - /* SHL */ OPC_SR1r(0x0A, xyw_byte val = us_pop(); SET(ARGX << val); SET(ARGY << val); ); + /* SHL */ OPC_SR1r(0x0A, xyw_byte val = us_pop(); SETX(ARGX << val); SETY(ARGY << val); ); /* SHR */ OPC_SR1(0x0B, xyw_byte val = us_pop(), SET(ARG >> val)); - /* SHR */ OPC_SR1r(0x0B, xyw_byte val = us_pop(); SET(ARGX >> val); SET(ARGY >> val); ); + /* SHR */ OPC_SR1r(0x0B, xyw_byte val = us_pop(); SETX(ARGX >> val); SETY(ARGY >> val); ); /* ADD */ OPC_SR2(0x0C, PUSH(a + b)); /* SUB */ OPC_SR2(0x0D, PUSH(a - b)); /* MUL */ OPC_SR2(0x0E, PUSH(a * b));@@ -566,13 +566,13 @@ /* NEQ */ OPC_SR2(0x11, us_push(a != b));
/* GTH */ OPC_SR2(0x12, us_push(a > b)); /* LTH */ OPC_SR2(0x13, us_push(a < b)); /* NOT */ OPC_SR1(0x14, , SET(~ARG)); - /* NOT */ OPC_SR1r(0x14, SET(~ARGX); SET(~ARGY); ); + /* NOT */ OPC_SR1r(0x14, SETX(~ARGX); SETY(~ARGY); ); /* AND */ OPC_SR2(0x15, PUSH(a & b)); /* IOR */ OPC_SR2(0x16, PUSH(a | b)); /* XOR */ OPC_SR2(0x17, PUSH(a ^ b)); /* DUP */ OPC_SR1(0x18, , SET(TOP)); /* DUP */ OPC_SR1r(0x18, SETX(TOP); SETY(TOP); ); - /* SWP */ OPC_SR2(0x19, if ((rx||ry)) { SET(b); } else { PUSH(b); PUSH(a); } ); + /* SWP */ OPC_SR2(0x19, if (rx && ry) { SETX(b); SETY(a); } else if (rx) { PUSH(b); SETX(a); } else if (ry) { PUSH(b); SETY(a); } else { PUSH(b); PUSH(a); } ); /* OVR */ OPC_OVR(0x1A); /* ROT */ OPC_ROT(0x1B); /* JMP */ OPC_SR1(0x1C, , *pc = ADDR(ARG)-1;);