all repos — xyw @ cb5922cec8ad98d1f22117c14bd10095582a6d2e

A minimal virtual machine and assembler for terminals.

Refactoring ST* instructions.
h3rald h3rald@h3rald.com
Mon, 01 Dec 2025 16:12:17 +0100
commit

cb5922cec8ad98d1f22117c14bd10095582a6d2e

parent

a7dabec991e09820cd375734d8ae6c03cb4cda3a

1 files changed, 17 insertions(+), 76 deletions(-)

jump to
M xywrun.cxywrun.c

@@ -240,86 +240,28 @@ xyw_word addr = (page << 8) | POPw();

us_pushw(mget(addr)); } -static void STA() +static void STA(xyw_byte val) { - xyw_byte val = POP(); xyw_word addr = POPw(); xyw_memory[addr] = val; } -static void STAx() -{ - xyw_byte addr = POP(); - xyw_memory[addr] = *x; -} - -static void STAy() -{ - xyw_byte addr = POP(); - xyw_memory[addr] = *y; -} - -static void STAw() +static void STAw(xyw_word val) { - xyw_word val = POPw(); xyw_word addr = POPw(); mset(addr, val); } -static void STAxw() +static void STP(xyw_byte val) { - xyw_word addr = POPw(); - mset(addr, *xw); -} - -static void STAyw() -{ - xyw_word addr = POPw(); - mset(addr, *yw); -} - -static void STP() -{ - xyw_byte val = POP(); - xyw_byte page = xyw_memory[SYSTEM_PAGE]; - xyw_word addr = (page << 8) | POP(); + xyw_word addr = (xyw_memory[SYSTEM_PAGE] << 8) | POP(); xyw_memory[addr] = val; } -static void STPx() +static void STPw(xyw_word val) { - xyw_byte page = xyw_memory[SYSTEM_PAGE]; - xyw_word addr = (page << 8) | POP(); - xyw_memory[addr] = *x; -} - -static void STPy() -{ - xyw_byte page = xyw_memory[SYSTEM_PAGE]; - xyw_word addr = (page << 8) | POP(); - xyw_memory[addr] = *y; -} - -static void STPw() -{ - xyw_word val = POPw(); - xyw_byte page = xyw_memory[SYSTEM_PAGE]; - xyw_word addr = (page << 8) | POPw(); + xyw_word addr = (xyw_memory[SYSTEM_PAGE] << 8) | POPw(); mset(addr, val); -} - -static void STPxw() -{ - xyw_byte page = xyw_memory[SYSTEM_PAGE]; - xyw_word addr = (page << 8) | POPw(); - mset(addr, *xw); -} - -static void STPyw() -{ - xyw_byte page = xyw_memory[SYSTEM_PAGE]; - xyw_word addr = (page << 8) | POPw(); - mset(addr, *yw); } static void SWP(xyw_byte a, xyw_byte b)

@@ -399,6 +341,7 @@

//// Macros for instruction implementations // clang-format off +// Infix operations #define InOP(opcode, op) \ case opcode: us_push(POP() op POP()); break; \ case XYW_MODE_X|opcode: us_push(*x op POP()); break; \

@@ -409,6 +352,7 @@ case XYW_MODE_Y|XYW_MODE_W|opcode: us_pushw(*yw op POPw()); break; \

case XYW_MODE_X|XYW_MODE_Y|opcode: us_push(*x op *y); break; \ case XYW_MODE_X|XYW_MODE_Y|XYW_MODE_W|opcode: us_pushw(*xw op *yw); break; +// Unary operations #define UnOP(opcode, op) \ case opcode: us_push(op(POP())); break; \ case XYW_MODE_X|opcode: us_push(op(*x)); break; \

@@ -417,6 +361,7 @@ case XYW_MODE_W|opcode: us_pushw(op(POPw())); break; \

case XYW_MODE_X|XYW_MODE_W|opcode: us_pushw(op(*xw)); break; \ case XYW_MODE_Y|XYW_MODE_W|opcode: us_pushw(op(*yw)); break; +// Postfix-ish operations (INC/DEC) #define PoOP(opcode, op) \ case opcode: us_push(POP() op); break; \ case XYW_MODE_X|opcode: us_push(*x op); break; \

@@ -425,23 +370,27 @@ case XYW_MODE_W|opcode: us_pushw(POPw() op); break; \

case XYW_MODE_X|XYW_MODE_W|opcode: us_pushw(*xw op); break; \ case XYW_MODE_Y|XYW_MODE_W|opcode: us_pushw(*yw op); break; +// Prefix operations with two operands #define PrOP2(opcode, op) \ case opcode: op(POP(), POP()); break; \ case XYW_MODE_X|opcode: op(*x, POP()); break; \ case XYW_MODE_Y|opcode: op(*y, POP()); break; \ case XYW_MODE_X|XYW_MODE_Y|opcode: op(*x, *y); break; \ +// Prefix operations with two 2-byte operands #define PrOP2w(opcode, op) \ case XYW_MODE_W|opcode: op(POPw(), POPw()); break; \ case XYW_MODE_X|XYW_MODE_W|opcode: op(*xw, POPw()); break; \ case XYW_MODE_Y|XYW_MODE_W|opcode: op(*yw, POPw()); break; \ case XYW_MODE_X|XYW_MODE_Y|XYW_MODE_W|opcode: op(*xw, *yw); break; +// Prefix operations with one operand #define PrOP(opcode, op) \ case opcode: op(POP()); break; \ case XYW_MODE_X|opcode: op(*x); break; \ case XYW_MODE_Y|opcode: op(*y); break; +// Prefix operations with one 2-byte operand #define PrOPw(opcode, op) \ case XYW_MODE_W|opcode: op(POPw()); break; \ case XYW_MODE_X|XYW_MODE_W|opcode: op(*xw); break; \

@@ -506,20 +455,12 @@ /* LDRxw */ case XYW_MODE_X|XYW_MODE_W|0x03: LDRxw(); break;

/* LDRyw */ case XYW_MODE_Y|XYW_MODE_W|0x03: LDRyw(); break; /* LDA */ case 0x04: LDA(); break; /* LDAw */ case XYW_MODE_W|0x04: LDAw(); break; - /* STA */ case 0x05: STA(); break; - /* STAx */ case XYW_MODE_X|0x05: STAx(); break; - /* STAy */ case XYW_MODE_Y|0x05: STAy(); break; - /* STAw */ case XYW_MODE_W|0x05: STAw(); break; - /* STAxw */ case XYW_MODE_X|XYW_MODE_W|0x05: STAxw(); break; - /* STAyw */ case XYW_MODE_Y|XYW_MODE_W|0x05: STAyw(); break; + /* STA */ PrOP(0x05, STA); + /* STAw */ PrOPw(0x05, STAw); /* LDP */ case 0x06: LDP(); break; /* LDPw */ case XYW_MODE_W|0x06: LDPw(); break; - /* STP */ case 0x07: STP(); break; - /* STPx */ case XYW_MODE_X|0x07: STPx(); break; - /* STPy */ case XYW_MODE_Y|0x07: STPy(); break; - /* STPw */ case XYW_MODE_W|0x07: STPw(); break; - /* STPxw */ case XYW_MODE_X|XYW_MODE_W|0x07: STPxw(); break; - /* STPyw */ case XYW_MODE_Y|XYW_MODE_W|0x07: STPyw(); break; + /* STP */ PrOP(0x07, STP); + /* STPw */ PrOPw(0x07, STPw); /* INC */ PoOP(0x08, + 1); /* DEC */ PoOP(0x09, - 1); /* SHL */ InOP(0x0A, <<);