Refactoring and simplifying devices (not working yet).
h3rald h3rald@h3rald.com
Thu, 04 Dec 2025 07:36:28 +0100
7 files changed,
29 insertions(+),
101 deletions(-)
M
Makefile
→
Makefile
@@ -1,8 +1,8 @@
CC = gcc CFLAGS = -Wall -Wextra -g LDFLAGS = -SOURCES = xyw.c xywasm.c xywrun.c devices/system.c devices/console.c -OBJS = xyw.o xywasm.o xywrun.o devices/system.o devices/console.o +SOURCES = xyw.c xywasm.c xywrun.c devices/console.c +OBJS = xyw.o xywasm.o xywrun.o devices/console.o .PHONY: clean@@ -20,9 +20,6 @@ $(CC) $(CFLAGS) -c xywasm.c -o xywasm.o
devices/console.o: devices/console.c xyw.h $(CC) $(CFLAGS) -c devices/console.c -o devices/console.o - -devices/system.o: devices/system.c xyw.h - $(CC) $(CFLAGS) -c devices/system.c -o devices/system.o clean: rm -f xyw xyw.exe $(OBJS)
M
devices/console.c
→
devices/console.c
@@ -2,46 +2,23 @@ #include <stdio.h>
#include "../xyw.h" /* console device */ -#define XYW_CONSOLE_INPUT 0x0 -#define XYW_CONSOLE_OUTPUT 0x1 -#define XYW_CONSOLE_ERROR 0x2 -#define XYW_CONSOLE_ON_KEYPRESS 0x3 +#define CONSOLE_INPUT 0x0 +#define CONSOLE_OUTPUT 0x1 +#define CONSOLE_ERROR 0x2 +#define CONSOLE_ON_KEYPRESS 0x3 -xyw_byte console_read(xyw_byte *data, xyw_byte addr, xyw_byte *error) -{ - (void)error; - if (addr == XYW_CONSOLE_INPUT) - { - return (xyw_byte)getchar(); - } - return data[addr]; -} - -void console_write(xyw_byte *data, xyw_byte addr, xyw_byte val, xyw_byte *error) +void console_output(xyw_byte *data, xyw_byte addr, xyw_byte *error) { (void)error; switch (addr) { - case XYW_CONSOLE_OUTPUT: - fputc(val, stdout); + case CONSOLE_OUTPUT: + fputc(data[addr], stdout); fflush(stdout); break; - case XYW_CONSOLE_ERROR: - fputc(val, stderr); + case CONSOLE_ERROR: + fputc(data[addr], stderr); fflush(stderr); break; } - data[addr] = val; -} - -xyw_word console_readw(xyw_byte *data, xyw_byte addr, xyw_byte *error) -{ - (void)error; - return XYW_PEEKW(&data[addr]); -} - -void console_writew(xyw_byte *data, xyw_byte addr, xyw_word val, xyw_byte *error) -{ - (void)error; - XYW_POKEW(&data[addr], val); }
M
devices/console.h
→
devices/console.h
@@ -1,13 +1,3 @@
#include "../xyw.h" -/* console device */ -#define XYW_CONSOLE_INPUT 0x0 -#define XYW_CONSOLE_OUTPUT 0x1 -#define XYW_CONSOLE_ERROR 0x2 -#define XYW_CONSOLE_ON_KEYPRESS 0x3 - -xyw_byte console_read(xyw_byte *data, xyw_byte addr, xyw_byte *error); -void console_write(xyw_byte *data, xyw_byte addr, xyw_byte val, xyw_byte *error); -xyw_word console_readw(xyw_byte *data, xyw_byte addr, xyw_byte *error); -void console_writew(xyw_byte *data, xyw_byte addr, xyw_word val, xyw_byte *error); - +void console_output(xyw_byte *data, xyw_byte addr, xyw_byte *error);
D
devices/system.c
@@ -1,25 +0,0 @@
-#include "../xyw.h" - -xyw_byte system_read(xyw_byte *data, xyw_byte addr, xyw_byte *error) -{ - (void)error; - return data[addr]; -} - -void system_write(xyw_byte *data, xyw_byte addr, xyw_byte val, xyw_byte *error) -{ - (void)error; - data[addr] = val; -} - -xyw_word system_readw(xyw_byte *data, xyw_byte addr, xyw_byte *error) -{ - (void)error; - return XYW_PEEKW(&data[addr]); -} - -void system_writew(xyw_byte *data, xyw_byte addr, xyw_word val, xyw_byte *error) -{ - (void)error; - XYW_POKEW(&data[addr], val); -}
D
devices/system.h
@@ -1,7 +0,0 @@
-#include "../xyw.h" - -xyw_byte system_read(xyw_byte *data, xyw_byte addr, xyw_byte *error); -void system_write(xyw_byte *data, xyw_byte addr, xyw_byte val, xyw_byte *error); -xyw_word system_readw(xyw_byte *data, xyw_byte addr, xyw_byte *error); -void system_writew(xyw_byte *data, xyw_byte addr, xyw_word val, xyw_byte *error); -
M
xyw.h
→
xyw.h
@@ -15,18 +15,14 @@
typedef unsigned char xyw_byte; typedef unsigned short xyw_word; -typedef xyw_byte (*xyw_read)(xyw_byte *data, xyw_byte addr, xyw_byte *error); -typedef void (*xyw_write)(xyw_byte *data, xyw_byte addr, xyw_byte val, xyw_byte *error); -typedef xyw_word (*xyw_readw)(xyw_byte *data, xyw_byte addr, xyw_byte *error); -typedef void (*xyw_writew)(xyw_byte *data, xyw_byte addr, xyw_word val, xyw_byte *error); +typedef xyw_byte (*xyw_input)(xyw_byte *data, xyw_byte addr, xyw_byte *error); +typedef void (*xyw_output)(xyw_byte *data, xyw_byte addr, xyw_byte *error); typedef struct xyw_device { xyw_byte *data; - xyw_read read; - xyw_write write; - xyw_readw readw; - xyw_writew writew; + xyw_input input; + xyw_output output; } xyw_device; // clang-format off
M
xywrun.c
→
xywrun.c
@@ -1,7 +1,6 @@
#include <stdio.h> #include "xyw.h" -#include "devices/system.h" #include "devices/console.h" #define MEMORY_SIZE 0xffff@@ -85,13 +84,16 @@ {
if (addr >= DEVICE_AREA_START) { xyw_byte dev_num = get_device(addr); - if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].readw) + if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].input) { *error = XYW_ERROR_DEVICE_UNAVAILABLE; return (xyw_word)-1; } xyw_byte dev_addr = get_device_address(addr); - return xyw_devices[dev_num].readw(get_device_data(addr), dev_addr, error); + // Read two bytes from device + xyw_byte high = xyw_devices[dev_num].input(get_device_data(addr), dev_addr, error); + xyw_byte low = xyw_devices[dev_num].input(get_device_data(addr), dev_addr + 1, error); + return (xyw_word)((high << 8) | low); } return XYW_PEEKW(&xyw_memory[addr]); }@@ -101,14 +103,13 @@ {
if (addr >= DEVICE_AREA_START) { xyw_byte dev_num = get_device(addr); - if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].writew) + if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].output) { *error = XYW_ERROR_DEVICE_UNAVAILABLE; return; } xyw_byte dev_addr = get_device_address(addr); - xyw_devices[dev_num].writew(get_device_data(addr), dev_addr, val, error); - return; + xyw_devices[dev_num].output(get_device_data(addr), dev_addr, error); } XYW_POKEW(&xyw_memory[addr], val); }@@ -118,13 +119,13 @@ {
if (addr >= DEVICE_AREA_START) { xyw_byte dev_num = get_device(addr); - if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].read) + if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].input) { *error = XYW_ERROR_DEVICE_UNAVAILABLE; return (xyw_byte)-1; } xyw_byte dev_addr = get_device_address(addr); - return xyw_devices[dev_num].read(get_device_data(addr), dev_addr, error); + return xyw_devices[dev_num].input(get_device_data(addr), dev_addr, error); } return xyw_memory[addr]; }@@ -134,14 +135,13 @@ {
if (addr >= DEVICE_AREA_START) { xyw_byte dev_num = get_device(addr); - if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].write) + if (dev_num >= XYW_TOTAL_DEVICES || !xyw_devices[dev_num].output) { *error = XYW_ERROR_DEVICE_UNAVAILABLE; return; } xyw_byte dev_addr = get_device_address(addr); - xyw_devices[dev_num].write(get_device_data(addr), dev_addr, val, error); - return; + xyw_devices[dev_num].output(get_device_data(addr), dev_addr, error); } xyw_memory[addr] = val; }@@ -324,9 +324,9 @@ //// Initialize devices
xyw_device xyw_devices[XYW_TOTAL_DEVICES] = { // System device (not implemented yet) - {&xyw_memory[0xff00], system_read, system_write, system_readw, system_writew}, + {&xyw_memory[0xff00], 0, 0}, // Console device - {&xyw_memory[0xff10], console_read, console_write, console_readw, console_writew}, + {&xyw_memory[0xff10], 0, console_output}, // ... };