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;