all repos — xyw @ 0cf83a858b968240d81b1a3dcffafac4184d6e29

A minimal virtual machine and assembler for terminals.

Updated NOT and DUP.
h3rald h3rald@h3rald.com
Mon, 02 Feb 2026 15:14:06 +0100
commit

0cf83a858b968240d81b1a3dcffafac4184d6e29

parent

901c826cbfe0e9d3bc74f925fd40a3da88c757b4

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

jump to
M xywrun.cxywrun.c

@@ -243,7 +243,7 @@ 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; \ } -//// Operations that support both registers +//// Operations that support both registers always set #define OPC_SR1r(opc, body) { \ case XYW_MODE_X|XYW_MODE_Y|opc: { const int w=0, rx=1, ry=1; xyw_byte a = *x; xyw_byte b = *y; body;(void)(w);(void)(a);(void)(b);(void)(rx);(void)(ry); } break; \ case XYW_MODE_X|XYW_MODE_Y|XYW_MODE_W|opc: { const int w=1, rx=1, ry=1; xyw_word a = *xw; xyw_word b = *yw; body;(void)(w);(void)(a);(void)(b);(void)(rx);(void)(ry); } break; \

@@ -334,8 +334,10 @@ /* AND */ OPC_SR2(0x14, PUSH(a & b));

/* IOR */ OPC_SR2(0x15, PUSH(a | b)); /* XOR */ OPC_SR2(0x16, PUSH(a ^ b)); /* NOT */ OPC_SR1(0x17, , SET(~ARG)); + /* NOT */ OPC_SR1r(0x17, SET(~ARGX); SET(~ARGY); ); /* SWP */ OPC_SR2(0x18, if ((rx||ry)) { SET(b); } else { PUSH(a); PUSH(b); } ); - /* DUP */ OPC_SR1(0x19, , PUSH(ARG)); + /* DUP */ OPC_SR1(0x19, , SET(READ(USER_STACK_START + (*u) - (w ? 2 : 1)))); + /* DUP */ OPC_SR1r(0x19, SETX(READ(USER_STACK_START + (*u) - (w ? 2 : 1))); SETY(READ(USER_STACK_START + (*u) - (w ? 2 : 1))); ); /* OVR */ OPC_SR2(0x1A, PUSH(b); PUSH(a); PUSH(b)); /* ROT */ OPC_SR2(0x1B, PUSH(b); PUSH(POP()); PUSH(a)); /* JMP */ OPC_SR1(0x1C, , *pc = ADDR(ARG)-1;);