Parametrized jumps.
h3rald h3rald@h3rald.com
Fri, 05 Dec 2025 16:08:50 +0100
1 files changed,
5 insertions(+),
11 deletions(-)
jump to
M
xywrun.c
→
xywrun.c
@@ -229,12 +229,6 @@ case XYW_MODE_X|XYW_MODE_W|opc: { const int w=1; xyw_word a = *xw; body; } break; \
case XYW_MODE_Y|XYW_MODE_W|opc: { const int w=1; xyw_word a = *yw; body; } break; \ } -//// Operations that support word/byte mode only and no registers -#define OPC_S(opc, body) { \ - case opc: { const int w=0; body; } break; \ - case XYW_MODE_W|opc: { const int w=1; body; } break; \ -} - //// POP operations #define OPC_POP(opc) { \ case opc: { us_pop(); } break; \@@ -254,6 +248,7 @@ case XYW_MODE_W|opc: { (*pc)++; us_pushw(readw(*pc)); (*pc)++; } break; \
case XYW_MODE_X|XYW_MODE_W|opc: { us_pushw(*xw); } break; \ case XYW_MODE_Y|XYW_MODE_W|opc: { us_pushw(*yw); } break; \ } + //// Increment/decrement operations #define OPC_IDC(opc, delta) { \ case opc: { us_push(us_pop() + delta);} break; \@@ -292,10 +287,9 @@ // Console device
{&xyw_memory[0xff10], 0, console_output}, // ... }; +// clang-format on //// Main run function - -// clang-format on int xyw_run(const char *input) { // Load bytecode into memory@@ -348,9 +342,9 @@ /* SWP */ OPC_SWP(0x18);
/* DUP */ OPC_SR1(0x19, PUSH(a)); /* OVR */ OPC_SR2(0x1A, PUSH(b); PUSH(a); PUSH(b)); /* ROT */ OPC_SR2(0x1B, PUSH(b); PUSH(POP()); PUSH(a)); - /* JMP */ OPC_S(0x1C, *pc = ADDR(POP())-1;); - /* JCN */ OPC_S(0x1D, xyw_word addr1 = ADDR(POP()); if (us_pop()) { *pc = addr1-1; }); - /* JSR */ OPC_S(0x1E, xyw_word addr2 = ADDR(POP()); ss_pushw(*pc+1); *pc = addr2-1;); + /* JMP */ OPC_SR1(0x1C, *pc = ADDR(a)-1;); + /* JCN */ OPC_SR1(0x1D, xyw_word addr1 = ADDR(a); if (us_pop()) { *pc = addr1-1; }); + /* JSR */ OPC_SR1(0x1E, xyw_word addr2 = ADDR(a); ss_pushw(*pc+1); *pc = addr2-1;); /* RTS */ case 0x1F: *pc = ss_popw()-1; break; // clang-format on }