commit 307d3c1

Devine Lu Linvega  ·  2026-01-07 18:06:23 +0000 UTC
parent cbdfc73
Moved more device ports to handlers
1 files changed,  +41, -19
+41, -19
 1@@ -990,9 +990,12 @@ datetime_update(void)
 2 #define CONINBUFSIZE 256
 3 
 4 typedef Uint8 (*dei_handler)(void);
 5+typedef void (*deo_handler)(void);
 6 
 7 /* clang-format off */
 8 
 9+static dei_handler dei_handlers[256];
10+
11 Uint8 system_dei_wst(void) { return ptr[0]; }
12 Uint8 system_dei_rst(void) { return ptr[1]; }
13 Uint8 console_dei_childlive(void) { check_child(); return dev[CMD_LIVE]; }
14@@ -1015,13 +1018,45 @@ Uint8 datetime_dei_ydayhb(void) { datetime_update(); return datetime_t->tm_yday
15 Uint8 datetime_dei_ydaylb(void) { datetime_update(); return datetime_t->tm_yday; }
16 Uint8 datetime_dei_dst(void) { datetime_update(); return datetime_t->tm_isdst; }
17 
18-static dei_handler dei_handlers[256];
19+static deo_handler deo_handlers[256];
20+
21+void system_deo_expansion(void) { system_expansion(PEEK2(dev + 2)); }
22+void system_deo_wst(void) { ptr[0] = dev[4]; }
23+void system_deo_rst(void) { ptr[0] = dev[4]; }
24+void system_deo_colorize(void) { screen_colorize(); }
25+void system_deo_print(void) { system_print("WST", 0), system_print("RST", 1); }
26+
27+void console_deo_vector(void) { console_vector = PEEK2(&dev[0x10]); }
28+void console_deo_stdout(void) { fputc(dev[0x18], stdout), fflush(stdout); }
29+void console_deo_stderr(void) { fputc(dev[0x19], stderr), fflush(stderr); }
30+void console_deo_hb(void) { fprintf(stderr, "%02x", dev[0x1a]); }
31+void console_deo_lb(void) { fprintf(stderr, "%02x", dev[0x1b]); }
32+void console_deo_fork(void) { console_start_fork(); }
33 
34 /* clang-format on */
35 
36 void
37 init_devices(void)
38 {
39+	/* DEO */
40+	deo_handlers[0x03] = system_deo_expansion;
41+	deo_handlers[0x04] = system_deo_wst;
42+	deo_handlers[0x05] = system_deo_rst;
43+	deo_handlers[0x08] = system_deo_colorize;
44+	deo_handlers[0x09] = system_deo_colorize;
45+	deo_handlers[0x0a] = system_deo_colorize;
46+	deo_handlers[0x0b] = system_deo_colorize;
47+	deo_handlers[0x0c] = system_deo_colorize;
48+	deo_handlers[0x0d] = system_deo_colorize;
49+	deo_handlers[0x0e] = system_deo_print;
50+	deo_handlers[0x11] = console_deo_vector;
51+	deo_handlers[0x18] = console_deo_stdout;
52+	deo_handlers[0x19] = console_deo_stderr;
53+	deo_handlers[0x1a] = console_deo_hb;
54+	deo_handlers[0x1b] = console_deo_lb;
55+	deo_handlers[0x1f] = console_deo_fork;
56+
57+	/* DEI */
58 	dei_handlers[0x04] = system_dei_wst;
59 	dei_handlers[0x05] = system_dei_rst;
60 	dei_handlers[0x15] = console_dei_childlive;
61@@ -1057,25 +1092,12 @@ void
62 emu_deo(const Uint8 port, const Uint8 value)
63 {
64 	dev[port] = value;
65+	if(deo_handlers[port]) {
66+		deo_handlers[port]();
67+		return;
68+	}
69+
70 	switch(port) {
71-	/* System */
72-	case 0x03: system_expansion(PEEK2(dev + 2)); return;
73-	case 0x04: ptr[0] = dev[4]; return;
74-	case 0x05: ptr[1] = dev[5]; return;
75-	case 0x08:
76-	case 0x09:
77-	case 0x0a:
78-	case 0x0b:
79-	case 0x0c:
80-	case 0x0d: screen_colorize(); return;
81-	case 0x0e: system_print("WST", 0), system_print("RST", 1); return;
82-	/* Console */
83-	case 0x11: console_vector = PEEK2(&dev[0x10]); return;
84-	case 0x18: fputc(dev[0x18], stdout), fflush(stdout); return;
85-	case 0x19: fputc(dev[0x19], stderr), fflush(stderr); return;
86-	case 0x1a: fprintf(stderr, "%02x", dev[0x1a]); break;
87-	case 0x1b: fprintf(stderr, "%02x", dev[0x1b]); break;
88-	case 0x1f: console_start_fork(); return;
89 	/* Screen */
90 	case 0x21: screen_vector = PEEK2(&dev[0x20]); return;
91 	case 0x23: screen_resize(PEEK2(&dev[0x22]) & 0xfff, screen_height & 0xfff); return;