Refactoring macros.
h3rald h3rald@h3rald.com
Mon, 08 Dec 2025 21:45:53 +0100
1 files changed,
15 insertions(+),
25 deletions(-)
jump to
M
xywrun.c
→
xywrun.c
@@ -220,17 +220,7 @@ case XYW_MODE_X|XYW_MODE_Y|XYW_MODE_W|opc: { const int w = 1; xyw_word a = *xw; xyw_word b = *yw; body; } break; \
} //// Operations that support stack and one register -#define OPC_SR1(opc, body) { \ - case opc: { const int w=0; xyw_byte a = us_pop(); body; } break; \ - case XYW_MODE_X|opc: { const int w=0; xyw_byte a = *x; body; } break; \ - case XYW_MODE_Y|opc: { const int w=0; xyw_byte a = *y; body; } break; \ - case XYW_MODE_W|opc: { const int w=1; xyw_word a = us_popw(); body; } break; \ - 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 stack and one register -#define OPC_SR1_new(opc, init, body) { \ +#define OPC_SR1(opc, init, body) { \ case opc: { const int w=0, rx=0, ry=0; init; body; } break; \ case XYW_MODE_X|opc: { const int w=0, rx=1, ry=0; init; body; } break; \ case XYW_MODE_Y|opc: { const int w=0, rx=0, ry=1; init; body; } break; \@@ -322,15 +312,15 @@ // clang-format off
/* BRK */ case 0x00: return 0; // Halting execution for now /* PSH */ OPC_PSH(0x01); /* POP */ OPC_POP(0x02); - /* CLR */ OPC_SR1_new(0x03, , SET(0)); - /* LDB */ OPC_SR1_new(0x04, , us_push(read( ADDR(ARG)) )); - /* LDW */ OPC_SR1_new(0x05, , us_pushw(readw( ADDR(ARG)) )); - /* STB */ OPC_SR1(0x06, write( ADDR(a), us_pop() )); - /* STW */ OPC_SR1(0x07, writew( ADDR(a), us_popw() )); - /* INC */ OPC_SR1_new(0x08, , SET(ARG + 1)); - /* DEC */ OPC_SR1_new(0x09, , SET(ARG - 1)); - /* SHL */ OPC_SR1_new(0x0A, xyw_byte b = us_pop(), PUSH(ARG << b)); - /* SHR */ OPC_SR1_new(0x0B, xyw_byte b = us_pop(), PUSH(ARG >> b)); + /* CLR */ OPC_SR1(0x03, , SET(0)); + /* LDB */ OPC_SR1(0x04, , us_push(read( ADDR(ARG)) )); + /* LDW */ OPC_SR1(0x05, , us_pushw(readw( ADDR(ARG)) )); + /* STB */ OPC_SR1(0x06, xyw_word addr = ADDR(ARG), write( addr, us_pop() )); + /* STW */ OPC_SR1(0x07, xyw_word addr = ADDR(ARG), writew( addr, us_popw() )); + /* INC */ OPC_SR1(0x08, , SET(ARG + 1)); + /* DEC */ OPC_SR1(0x09, , SET(ARG - 1)); + /* SHL */ OPC_SR1(0x0A, xyw_byte b = us_pop(), PUSH(ARG << b)); + /* SHR */ OPC_SR1(0x0B, xyw_byte b = us_pop(), PUSH(ARG >> b)); /* ADD */ OPC_SR2(0x0C, PUSH(a + b)); /* SUB */ OPC_SR2(0x0D, PUSH(a - b)); /* MUL */ OPC_SR2(0x0E, PUSH(a * b));@@ -342,14 +332,14 @@ /* LTH */ OPC_SR2(0x13, PUSH(a < b));
/* AND */ OPC_SR2(0x14, PUSH(a & b)); /* IOR */ OPC_SR2(0x15, PUSH(a | b)); /* XOR */ OPC_SR2(0x16, PUSH(a ^ b)); - /* NOT */ OPC_SR1_new(0x17, , SET(~ARG)); + /* NOT */ OPC_SR1(0x17, , SET(~ARG)); /* SWP */ OPC_SWP(0x18); - /* DUP */ OPC_SR1_new(0x19, , PUSH(ARG)); + /* DUP */ OPC_SR1(0x19, , PUSH(ARG)); /* OVR */ OPC_SR2(0x1A, PUSH(b); PUSH(a); PUSH(b)); /* ROT */ OPC_SR2(0x1B, PUSH(b); PUSH(POP()); PUSH(a)); - /* JMP */ OPC_SR1_new(0x1C, , *pc = ADDR(ARG)-1;); - /* JCN */ OPC_SR1_new(0x1D, xyw_word addr = ADDR(ARG), if (us_pop()) { *pc = addr-1; }); - /* JSR */ OPC_SR1_new(0x1E, xyw_word addr = ADDR(ARG), ss_pushw(*pc+1); *pc = addr-1;); + /* JMP */ OPC_SR1(0x1C, , *pc = ADDR(ARG)-1;); + /* JCN */ OPC_SR1(0x1D, xyw_word addr = ADDR(ARG), if (us_pop()) { *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; // clang-format on }