Implementing new macro to support SHL/SHR.
h3rald h3rald@h3rald.com
Sun, 07 Dec 2025 08:06:23 +0100
1 files changed,
14 insertions(+),
2 deletions(-)
jump to
M
xywrun.c
→
xywrun.c
@@ -229,6 +229,16 @@ 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) { \ + 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; \ + case XYW_MODE_W|opc: { const int w=1, rx=0, ry=0; init; body; } break; \ + case XYW_MODE_X|XYW_MODE_W|opc: { const int w=1, rx=1, ry=0; init; body; } break; \ + case XYW_MODE_Y|XYW_MODE_W|opc: { const int w=1, rx=0, ry=1; init; body; } break; \ +} + //// CLR operations #define OPC_CLR(opc) { \ case opc: { us_pop(); us_push(0); } break; \@@ -289,6 +299,8 @@ // Push a value to stack
#define PUSH(n) do { if (w) { us_pushw(n); } else { us_push(n); } } while(0) // Pop value from stack #define POP() (w ? us_popw() : (xyw_word)us_pop()) +// Get argument from x or y register or stack +#define ARG (rx ? (w ? *xw : *x) : (ry ? (w ? *yw : *y) : (w ? us_popw() : us_pop()))) //// Initialize devices@@ -337,8 +349,8 @@ /* STB */ OPC_SR1(0x06, write( ADDR(a), us_pop() ));
/* STW */ OPC_SR1(0x07, writew( ADDR(a), us_popw() )); /* INC */ OPC_IDC(0x08, +1); /* DEC */ OPC_IDC(0x09, -1); - /* SHL */ OPC_SR2(0x0A, PUSH(a << b)); - /* SHR */ OPC_SR2(0x0B, PUSH(a >> b)); + /* 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)); /* ADD */ OPC_SR2(0x0C, PUSH(a + b)); /* SUB */ OPC_SR2(0x0D, PUSH(a - b)); /* MUL */ OPC_SR2(0x0E, PUSH(a * b));