all repos — xyw @ 32dd9979ac97267c51760c0b4e71aea1d8f54012

A minimal virtual machine and assembler for terminals.

Fixed STA/STP (for now)
h3rald h3rald@h3rald.com
Wed, 03 Dec 2025 07:09:18 +0100
commit

32dd9979ac97267c51760c0b4e71aea1d8f54012

parent

621df338b913aa322dc0a1ef02513b4fee09f4b4

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

jump to
M xywrun.cxywrun.c

@@ -171,6 +171,26 @@ case XYW_MODE_X|XYW_MODE_W|opc: { const xyw_byte w = 1; xyw_word a = *xw; body; } break; \

case XYW_MODE_Y|XYW_MODE_W|opc: { const xyw_byte w = 1; xyw_word a = *yw; body; } break; \ } +//// STA +#define OPC_STA(opc, body) { \ + case opc: { const xyw_word a = us_popw(); const xyw_byte w = 0, b = us_pop(); body; } break; \ + case XYW_MODE_X|opc: { const xyw_word a = us_popw(); const xyw_byte w = 0, b = *x; body; } break; \ + case XYW_MODE_Y|opc: { const xyw_word a = us_popw(); const xyw_byte w = 0, b = *y; body; } break; \ + case XYW_MODE_W|opc: { const xyw_word a = us_popw(); const xyw_byte w = 1; xyw_word b = us_popw(); body; } break; \ + case XYW_MODE_X|XYW_MODE_W|opc: { const xyw_byte w = 1; xyw_word a = us_popw(), b = *xw; body; } break; \ + case XYW_MODE_Y|XYW_MODE_W|opc: { const xyw_byte w = 1; xyw_word a = us_popw(), b = *yw; body; } break; \ +} + +//// STP +#define OPC_STP(opc, body) { \ + case opc: { const xyw_word a = DIRECT_PAGE | us_pop(); const xyw_byte w = 0, b = us_pop(); body; } break; \ + case XYW_MODE_X|opc: { const xyw_word a = DIRECT_PAGE | us_pop(); const xyw_byte w = 0, b = *x; body; } break; \ + case XYW_MODE_Y|opc: { const xyw_word a = DIRECT_PAGE | us_pop(); const xyw_byte w = 0, b = *y; body; } break; \ + case XYW_MODE_W|opc: { const xyw_word a = DIRECT_PAGE | us_pop(); const xyw_byte w = 1; xyw_word b = us_popw(); body; } break; \ + case XYW_MODE_X|XYW_MODE_W|opc: { const xyw_byte w = 1; xyw_word a = DIRECT_PAGE | us_pop(), b = *xw; body; } break; \ + case XYW_MODE_Y|XYW_MODE_W|opc: { const xyw_byte w = 1; xyw_word a = DIRECT_PAGE | us_pop(), b = *yw; body; } break; \ +} + //// Operations that support one register only and no stack #define OPC_R1(opc, body) { \ case XYW_MODE_X|opc: { const xyw_byte w = 0, a = *x; body; } break; \

@@ -280,9 +300,9 @@ /* PSH */ OPC_PSH(0x01);

/* POP */ OPC_POP(0x02); /* LDR */ OPC_R1(0x03, PUSH(READ(a))); /* LDA */ OPC_S(0x04, READ(us_popw())); - /* STA */ OPC_SR1(0x05, WRITE(us_popw(), a)); + /* STA */ OPC_STA(0x05, WRITE(a, b)); /* LDP */ OPC_S(0x06, READ(DIRECT_PAGE | us_pop())); - /* STP */ OPC_SR1(0x07, WRITE(DIRECT_PAGE | us_pop(), a)); + /* STP */ OPC_STP(0x07, WRITE(a, b)); /* INC */ OPC_IDC(0x08, +1); /* DEC */ OPC_IDC(0x09, -1); /* SHL */ OPC_SR2(0x0A, PUSH(b << a));