all repos — xyw @ 44d2ed8f1828af626bfd09a31fc29bc71da0ea4e

A minimal virtual machine and assembler for terminals.

Implementing new macro to support SHL/SHR.
h3rald h3rald@h3rald.com
Sun, 07 Dec 2025 08:06:23 +0100
commit

44d2ed8f1828af626bfd09a31fc29bc71da0ea4e

parent

ae85fee3a63c0b579da793d745f635416f8af57b

1 files changed, 14 insertions(+), 2 deletions(-)

jump to
M xywrun.cxywrun.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));