Added r/w helpers
h3rald h3rald@h3rald.com
Wed, 03 Dec 2025 10:42:55 +0100
1 files changed,
22 insertions(+),
12 deletions(-)
jump to
M
xywrun.c
→
xywrun.c
@@ -57,19 +57,29 @@ xyw_word *pc = &pc_storage;
xyw_word *xw = &xw_storage; xyw_word *yw = &yw_storage; -//// Helpers to manage 2-byte values to memory (big-endian) +//// Read/write memory helpers -static inline xyw_word mget(xyw_word addr) +static inline xyw_word readw(xyw_word addr) { return ((xyw_word)xyw_memory[addr] << 8) | xyw_memory[addr + 1]; } -static inline void mset(xyw_word addr, xyw_word val) +static inline void writew(xyw_word addr, xyw_word val) { xyw_memory[addr] = (val >> 8) & 0xFF; xyw_memory[addr + 1] = val & 0xFF; } +static inline xyw_byte read(xyw_word addr) +{ + return xyw_memory[addr]; +} + +static inline void write(xyw_word addr, xyw_byte val) +{ + xyw_memory[addr] = val; +} + //// System stack management static xyw_word ss_popw()@@ -79,8 +89,8 @@ {
xyw_memory[SYSTEM_ERROR] = XYW_ERROR_STACK_UNDERFLOW; return -1; } - xyw_word val = mget(SYSTEM_STACK_START + (*s) - 2); - mset(SYSTEM_STACK_START + (*s) - 2, 0); + xyw_word val = readw(SYSTEM_STACK_START + (*s) - 2); + writew(SYSTEM_STACK_START + (*s) - 2, 0); (*s) -= 2; return val; }@@ -92,7 +102,7 @@ {
xyw_memory[SYSTEM_ERROR] = XYW_ERROR_STACK_OVERFLOW; return; } - mset(SYSTEM_STACK_START + *s, val); + writew(SYSTEM_STACK_START + *s, val); (*s) += 2; }@@ -116,7 +126,7 @@ {
xyw_memory[SYSTEM_ERROR] = XYW_ERROR_STACK_OVERFLOW; return; } - mset(USER_STACK_START + *u, val); + writew(USER_STACK_START + *u, val); xyw_dbg(" => %04X\n", val); (*u) += 2; }@@ -141,8 +151,8 @@ {
xyw_memory[SYSTEM_ERROR] = XYW_ERROR_STACK_UNDERFLOW; return -1; } - xyw_word val = mget(USER_STACK_START + (*u) - 2); - mset(USER_STACK_START + (*u) - 2, 0); + xyw_word val = readw(USER_STACK_START + (*u) - 2); + writew(USER_STACK_START + (*u) - 2, 0); (*u) -= 2; return val; }@@ -200,7 +210,7 @@ #define OPC_PSH(opc) { \
case opc: { (*pc)++; us_push(xyw_memory[*pc]); } break; \ case XYW_MODE_X|opc: { us_push(*x); } break; \ case XYW_MODE_Y|opc: { us_push(*y); } break; \ - case XYW_MODE_W|opc: { (*pc)++; us_pushw(mget(*pc)); (*pc)++; } break; \ + case XYW_MODE_W|opc: { (*pc)++; us_pushw(readw(*pc)); (*pc)++; } break; \ case XYW_MODE_X|XYW_MODE_W|opc: { us_pushw(*xw); } break; \ case XYW_MODE_Y|XYW_MODE_W|opc: { us_pushw(*yw); } break; \ }@@ -238,9 +248,9 @@ #define PUSH(n) do { if (w) { us_pushw(n); } else { us_push(n); } } while(0)
// Pop value from stack #define POP() (w ? us_popw() : (xyw_word)us_pop()) // Read value from address -#define READ(addr) (w ? mget(addr) : (xyw_byte)xyw_memory[addr]) +#define READ(addr) (w ? readw(addr) : (xyw_byte)read(addr)) // Write value as word or byte depending on width flag 'w' -#define WRITE(addr, val) do { if (w) { mset(addr, val); } else { xyw_memory[addr] = val; } } while(0) +#define WRITE(addr, val) w ? writew(addr, val) : write(addr, (xyw_byte)(val)) // clang-format on int run(const char *input)