all repos — xyw @ 7eb2ae5a80f0efa16213f104a7f37ce769672b9c

A minimal virtual machine and assembler for terminals.

Refactoring.
h3rald h3rald@h3rald.com
Wed, 03 Dec 2025 16:18:34 +0100
commit

7eb2ae5a80f0efa16213f104a7f37ce769672b9c

parent

b5874c21dc483fa2454b746b486f2ec741d9a82c

1 files changed, 32 insertions(+), 53 deletions(-)

jump to
M xywrun.cxywrun.c

@@ -71,60 +71,18 @@ }

//// Read/write memory helpers -// Device read/write dispatchers -static inline xyw_byte device_read(xyw_word addr, xyw_byte *error) -{ - xyw_byte dev_num = get_device(addr); - if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].read) - { - *error = XYW_ERROR_DEVICE_UNAVAILABLE; - return -1; - } - xyw_byte dev_addr = get_device_address(addr); - return xyw_devices[dev_num].read(dev_addr, error); -} - -static inline xyw_word device_readw(xyw_word addr, xyw_byte *error) -{ - xyw_byte dev_num = get_device(addr); - if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].readw) - { - *error = XYW_ERROR_DEVICE_UNAVAILABLE; - return -1; - } - xyw_byte dev_addr = get_device_address(addr); - return xyw_devices[dev_num].readw(dev_addr, error); -} - -static inline void device_write(xyw_word addr, xyw_byte val, xyw_byte *error) -{ - xyw_byte dev_num = get_device(addr); - if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].write) - { - *error = XYW_ERROR_DEVICE_UNAVAILABLE; - return; - } - xyw_byte dev_addr = get_device_address(addr); - xyw_devices[dev_num].write(dev_addr, val, error); -} - -static inline void device_writew(xyw_word addr, xyw_word val, xyw_byte *error) -{ - xyw_byte dev_num = get_device(addr); - if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].writew) - { - *error = XYW_ERROR_DEVICE_UNAVAILABLE; - return; - } - xyw_byte dev_addr = get_device_address(addr); - xyw_devices[dev_num].writew(dev_addr, val, error); -} - static inline xyw_word readw(xyw_word addr) { if (addr >= DEVICE_AREA_START) { - return device_readw(xyw_memory[addr], error); + xyw_byte dev_num = get_device(addr); + if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].readw) + { + *error = XYW_ERROR_DEVICE_UNAVAILABLE; + return (xyw_word)-1; + } + xyw_byte dev_addr = get_device_address(addr); + return xyw_devices[dev_num].readw(dev_addr, error); } return PEEKW(&xyw_memory[addr]); }

@@ -133,7 +91,14 @@ static inline void writew(xyw_word addr, xyw_word val)

{ if (addr >= DEVICE_AREA_START) { - device_writew(xyw_memory[addr], val, error); + xyw_byte dev_num = get_device(addr); + if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].writew) + { + *error = XYW_ERROR_DEVICE_UNAVAILABLE; + return; + } + xyw_byte dev_addr = get_device_address(addr); + xyw_devices[dev_num].writew(dev_addr, val, error); return; } POKEW(&xyw_memory[addr], val);

@@ -143,7 +108,14 @@ static inline xyw_byte read(xyw_word addr)

{ if (addr >= DEVICE_AREA_START) { - return device_read(addr, error); + xyw_byte dev_num = get_device(addr); + if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].read) + { + *error = XYW_ERROR_DEVICE_UNAVAILABLE; + return (xyw_byte)-1; + } + xyw_byte dev_addr = get_device_address(addr); + return xyw_devices[dev_num].read(dev_addr, error); } return xyw_memory[addr]; }

@@ -152,7 +124,14 @@ static inline void write(xyw_word addr, xyw_byte val)

{ if (addr >= DEVICE_AREA_START) { - device_write(addr, val, error); + xyw_byte dev_num = get_device(addr); + if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].write) + { + *error = XYW_ERROR_DEVICE_UNAVAILABLE; + return; + } + xyw_byte dev_addr = get_device_address(addr); + xyw_devices[dev_num].write(dev_addr, val, error); return; } xyw_memory[addr] = val;