all repos — xyw @ 1a75d28e1b8dd25ec90a1bdfced283f8f822a9da

A minimal virtual machine and assembler for terminals.

Test program working!
h3rald h3rald@h3rald.com
Thu, 04 Dec 2025 16:08:41 +0100
commit

1a75d28e1b8dd25ec90a1bdfced283f8f822a9da

parent

f3e372ef508e00222024c991003a9a4b5e14ac01

1 files changed, 6 insertions(+), 5 deletions(-)

jump to
M xywrun.cxywrun.c

@@ -261,9 +261,10 @@ case XYW_MODE_X|XYW_MODE_W|opc: { us_pushw(readw(*xw)); } break; \

case XYW_MODE_Y|XYW_MODE_W|opc: { us_pushw(readw(*yw)); } break; \ } +// TODO: Review #define OPC_STB(opc) { \ - case opc: { write(DIRECT_PAGE | us_pop(), us_pop()); } break; \ - case XYW_MODE_W|opc: { write(us_popw(), us_pop()); } break; \ + case opc: { xyw_byte a = us_pop(), v = us_pop(); write(DIRECT_PAGE | a, v); } break; \ + case XYW_MODE_W|opc: { xyw_word a = us_popw(), v = us_pop(); write(a, v); } break; \ case XYW_MODE_X|opc: { write(DIRECT_PAGE | *x, us_pop()); } break; \ case XYW_MODE_Y|opc: { write(DIRECT_PAGE | *y, us_pop()); } break; \ case XYW_MODE_X|XYW_MODE_W|opc: { write(*xw, us_pop()); } break; \

@@ -377,7 +378,7 @@ fclose(fp);

xyw_memory[SYSTEM_STATE] = 1; while (xyw_memory[SYSTEM_STATE] && *pc < SYSTEM_MEMORY_START) { - xyw_dbg("PC: %04X -> %02X (%s) [X:%02X|Y:%02X|XW:%04X|YW:%04X]\n", *pc, xyw_memory[*pc], xyw_instructions[xyw_memory[*pc] & 0x1F], *x, *y, *xw, *yw); + xyw_dbg("PC: %04X -> %02X (%s) [U:%02X|S:%02X|X:%02X|Y:%02X|XW:%04X|YW:%04X]\n", *pc, xyw_memory[*pc], xyw_instructions[xyw_memory[*pc] & 0x1F], *u, *s, *x, *y, *xw, *yw); switch (xyw_memory[*pc]) { // clang-format off

@@ -410,8 +411,8 @@ /* DUP */ OPC_SR1(0x19, , PUSH(ARGXY));

/* 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 */ OPC_SR1(0x1D, , if (ARGXY) { *pc = POP()-1; } ); - /* JSR */ case 0x1E: xyw_word addr = us_popw(); ss_pushw(*pc); *pc = addr-1; break; + /* JCN */ case 0x1D: xyw_word addr1 = us_popw(); if (us_pop()) { *pc = addr1-1; } break; // TODO: parameterize condition + /* JSR */ case 0x1E: xyw_word addr2 = us_popw(); ss_pushw(*pc+1); *pc = addr2-1; break; /* RTS */ case 0x1F: *pc = ss_popw()-1; break; // clang-format on }