all repos — xyw @ e9b5f0d56ff15cd53b68535be64c840454e5fe25

A minimal virtual machine and assembler for terminals.

Fixes.
h3rald h3rald@h3rald.com
Wed, 03 Dec 2025 16:22:59 +0100
commit

e9b5f0d56ff15cd53b68535be64c840454e5fe25

parent

7eb2ae5a80f0efa16213f104a7f37ce769672b9c

2 files changed, 16 insertions(+), 7 deletions(-)

jump to
M xyw.hxyw.h

@@ -22,6 +22,7 @@ typedef void (*xyw_writew)(xyw_byte addr, xyw_word val, xyw_byte *error);

typedef struct xyw_device { + xyw_byte *data; xyw_read read; xyw_write write; xyw_readw readw;
M xywrun.cxywrun.c

@@ -16,7 +16,8 @@ XYW_ERROR_NONE = 0,

XYW_ERROR_INVALID_INSTRUCTION, XYW_ERROR_STACK_UNDERFLOW, XYW_ERROR_STACK_OVERFLOW, - XYW_ERROR_DEVICE_UNAVAILABLE + XYW_ERROR_DEVICE_UNAVAILABLE, + XYW_ERROR_INVALID_DEVICE_PORT } xyw_error; /* system device */

@@ -64,9 +65,16 @@ {

return (addr - DEVICE_AREA_START) / 16; } -static inline xyw_byte get_device_address(xyw_word addr) +static inline xyw_byte get_device_port(xyw_word addr) { - return (addr - DEVICE_AREA_START) % 16; + // Should return a number between 0 and 15, add validation + xyw_byte port = (addr - DEVICE_AREA_START) % 16; + if (port >= 16) + { + *error = XYW_ERROR_INVALID_DEVICE_PORT; + return 0xFF; + } + return port; } //// Read/write memory helpers

@@ -81,7 +89,7 @@ {

*error = XYW_ERROR_DEVICE_UNAVAILABLE; return (xyw_word)-1; } - xyw_byte dev_addr = get_device_address(addr); + xyw_byte dev_addr = get_device_port(addr); return xyw_devices[dev_num].readw(dev_addr, error); } return PEEKW(&xyw_memory[addr]);

@@ -97,7 +105,7 @@ {

*error = XYW_ERROR_DEVICE_UNAVAILABLE; return; } - xyw_byte dev_addr = get_device_address(addr); + xyw_byte dev_addr = get_device_port(addr); xyw_devices[dev_num].writew(dev_addr, val, error); return; }

@@ -114,7 +122,7 @@ {

*error = XYW_ERROR_DEVICE_UNAVAILABLE; return (xyw_byte)-1; } - xyw_byte dev_addr = get_device_address(addr); + xyw_byte dev_addr = get_device_port(addr); return xyw_devices[dev_num].read(dev_addr, error); } return xyw_memory[addr];

@@ -130,7 +138,7 @@ {

*error = XYW_ERROR_DEVICE_UNAVAILABLE; return; } - xyw_byte dev_addr = get_device_address(addr); + xyw_byte dev_addr = get_device_port(addr); xyw_devices[dev_num].write(dev_addr, val, error); return; }