all repos — xyw @ cf74ea2e46cd7f9ef5d2bdb1a06d2cfb0dd0b95d

A minimal virtual machine and assembler for terminals.

Updated opcodes and modes to match the docs.
h3rald h3rald@h3rald.com
Fri, 13 Feb 2026 07:30:02 +0100
commit

cf74ea2e46cd7f9ef5d2bdb1a06d2cfb0dd0b95d

parent

f51db9ec11bc6db14ac7d1cc7947de38b3515452

3 files changed, 12 insertions(+), 12 deletions(-)

jump to
M xyw.cxyw.c

@@ -14,8 +14,8 @@ "LDB", "LDW", "STB", "STW",

"INC", "DEC", "SHL", "SHR", "ADD", "SUB", "MUL", "DIV", "EQU", "NEQ", "GTH", "LTH", - "AND", "IOR", "XOR", "NOT", - "SWP", "DUP", "OVR", "ROT", + "NOT", "AND", "IOR", "XOR", + "DUP", "SWP", "OVR", "ROT", "JMP", "JCN", "JSR", "RTS"}; int flag(const char *arg, const char *str)
M xyw.hxyw.h

@@ -1,9 +1,9 @@

#ifndef XYW_H #define XYW_H -#define XYW_MODE_X 0x20 +#define XYW_MODE_X 0x80 #define XYW_MODE_Y 0x40 -#define XYW_MODE_W 0x80 +#define XYW_MODE_W 0x20 #define XYW_TOTAL_INSTRUCTIONS 0x20 #define XYW_TOTAL_DEVICES 0x10 #define XYW_ARGUMENT_SEPARATOR 0x1E
M xywrun.cxywrun.c

@@ -425,14 +425,14 @@ /* EQU */ OPC_SR2(0x10, PUSH(a == b));

/* NEQ */ OPC_SR2(0x11, PUSH(a != b)); /* GTH */ OPC_SR2(0x12, PUSH(a > b)); /* 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(0x17, , SET(~ARG)); - /* NOT */ OPC_SR1r(0x17, SET(~ARGX); SET(~ARGY); ); - /* SWP */ OPC_SR2(0x18, if ((rx||ry)) { SET(b); } else { PUSH(b); PUSH(a); } ); - /* 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))); ); + /* NOT */ OPC_SR1(0x14, , SET(~ARG)); + /* NOT */ OPC_SR1r(0x14, SET(~ARGX); SET(~ARGY); ); + /* AND */ OPC_SR2(0x15, PUSH(a & b)); + /* IOR */ OPC_SR2(0x16, PUSH(a | b)); + /* XOR */ OPC_SR2(0x17, PUSH(a ^ b)); + /* DUP */ OPC_SR1(0x18, , SET(READ(USER_STACK_START + (*u) - (w ? 2 : 1)))); + /* DUP */ OPC_SR1r(0x18, SETX(READ(USER_STACK_START + (*u) - (w ? 2 : 1))); SETY(READ(USER_STACK_START + (*u) - (w ? 2 : 1))); ); + /* SWP */ OPC_SR2(0x19, if ((rx||ry)) { SET(b); } else { PUSH(b); PUSH(a); } ); /* 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;);