all repos — xyw @ 3af28e170d9eb8d27c3d66eb168ab4abf68f860c

A minimal virtual machine and assembler for terminals.

Parametrized jumps.
h3rald h3rald@h3rald.com
Fri, 05 Dec 2025 16:00:20 +0100
commit

3af28e170d9eb8d27c3d66eb168ab4abf68f860c

parent

f14948a903774a77805fc235a1ba2190989d8cd8

1 files changed, 9 insertions(+), 3 deletions(-)

jump to
M xywrun.cxywrun.c

@@ -229,6 +229,12 @@ 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; \

@@ -342,9 +348,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 */ case 0x1C: *pc = us_popw()-1; break; - /* JCN */ case 0x1D: xyw_word addr1 = us_popw(); if (us_pop()) { *pc = addr1-1; } break; - /* JSR */ case 0x1E: xyw_word addr2 = us_popw(); ss_pushw(*pc+1); *pc = addr2-1; break; + /* 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;); /* RTS */ case 0x1F: *pc = ss_popw()-1; break; // clang-format on }