... | ... |
@@ -12,10 +12,9 @@ WITH REGARD TO THIS SOFTWARE. |
12 | 12 |
|
13 | 13 |
typedef signed int Sint32; |
14 | 14 |
|
15 |
- |
|
16 | 15 |
#define AUDIO_VERSION 1 |
17 |
-#define AUDIO_DEIMASK 0x0000 |
|
18 |
-#define AUDIO_DEOMASK 0x0000 |
|
16 |
+#define AUDIO_DEIMASK 0x0014 |
|
17 |
+#define AUDIO_DEOMASK 0x8000 |
|
19 | 18 |
|
20 | 19 |
#define SAMPLE_FREQUENCY 44100 |
21 | 20 |
#define POLYPHONY 4 |
... | ... |
@@ -11,8 +11,8 @@ WITH REGARD TO THIS SOFTWARE. |
11 | 11 |
*/ |
12 | 12 |
|
13 | 13 |
#define SCREEN_VERSION 1 |
14 |
-#define SCREEN_DEIMASK 0x0000 |
|
15 |
-#define SCREEN_DEOMASK 0x0000 |
|
14 |
+#define SCREEN_DEIMASK 0x003c |
|
15 |
+#define SCREEN_DEOMASK 0xc028 |
|
16 | 16 |
|
17 | 17 |
typedef struct UxnScreen { |
18 | 18 |
int width, height, x1, y1, x2, y2; |
... | ... |
@@ -74,6 +74,15 @@ system_inspect(Uxn *u) |
74 | 74 |
system_print(&u->rst, "rst"); |
75 | 75 |
} |
76 | 76 |
|
77 |
+void |
|
78 |
+system_connect(Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo) |
|
79 |
+{ |
|
80 |
+ /* printf("%02x -> v%d %04x %04x\n", device, ver, dei, deo); */ |
|
81 |
+ dev_vers[device] = ver; |
|
82 |
+ dei_mask[device] = dei; |
|
83 |
+ deo_mask[device] = deo; |
|
84 |
+} |
|
85 |
+ |
|
77 | 86 |
/* IO */ |
78 | 87 |
|
79 | 88 |
void |
... | ... |
@@ -11,10 +11,11 @@ WITH REGARD TO THIS SOFTWARE. |
11 | 11 |
|
12 | 12 |
#define SYSTEM_VERSION 1 |
13 | 13 |
#define SYSTEM_DEIMASK 0x0000 |
14 |
-#define SYSTEM_DEOMASK 0x0000 |
|
14 |
+#define SYSTEM_DEOMASK 0xff28 |
|
15 | 15 |
|
16 | 16 |
#define RAM_PAGES 0x10 |
17 | 17 |
|
18 |
+void system_connect(Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo); |
|
18 | 19 |
int system_load(Uxn *u, char *filename); |
19 | 20 |
void system_inspect(Uxn *u); |
20 | 21 |
int system_error(char *msg, const char *err); |
... | ... |
@@ -42,8 +42,7 @@ typedef struct Uxn { |
42 | 42 |
extern Uint8 emu_dei(Uxn *u, Uint8 addr); |
43 | 43 |
extern void emu_deo(Uxn *u, Uint8 addr); |
44 | 44 |
extern int emu_halt(Uxn *u, Uint8 instr, Uint8 err, Uint16 addr); |
45 |
-extern Uint16 dei_mask[]; |
|
46 |
-extern Uint16 deo_mask[]; |
|
45 |
+extern Uint16 dev_vers[0x10], dei_mask[0x10], deo_mask[0x10]; |
|
47 | 46 |
|
48 | 47 |
/* built-ins */ |
49 | 48 |
|
... | ... |
@@ -18,8 +18,7 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
18 | 18 |
WITH REGARD TO THIS SOFTWARE. |
19 | 19 |
*/ |
20 | 20 |
|
21 |
-Uint16 deo_mask[] = {0xc028, 0x0300, 0xc028, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0xa260, 0xa260, 0x0000, 0x0000, 0x0000, 0x0000}; |
|
22 |
-Uint16 dei_mask[] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07ff, 0x0000, 0x0000, 0x0000}; |
|
21 |
+Uint16 dev_vers[0x10], dei_mask[0x10], deo_mask[0x10]; |
|
23 | 22 |
|
24 | 23 |
Uint8 |
25 | 24 |
emu_dei(Uxn *u, Uint8 addr) |
... | ... |
@@ -53,6 +52,12 @@ main(int argc, char **argv) |
53 | 52 |
return system_error("Boot", "Failed"); |
54 | 53 |
if(!system_load(&u, argv[i++])) |
55 | 54 |
return system_error("Load", "Failed"); |
55 |
+ /* connect devices */ |
|
56 |
+ system_connect(0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK); |
|
57 |
+ system_connect(0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK); |
|
58 |
+ system_connect(0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
59 |
+ system_connect(0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
60 |
+ system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK); |
|
56 | 61 |
u.dev[0x17] = argc - i; |
57 | 62 |
if(uxn_eval(&u, PAGE_PROGRAM)) { |
58 | 63 |
for(; i < argc; i++) { |
... | ... |
@@ -60,8 +60,7 @@ static Uint32 stdin_event, audio0_event, zoom = 1; |
60 | 60 |
static Uint64 exec_deadline, deadline_interval, ms_interval; |
61 | 61 |
static char *rom_path; |
62 | 62 |
|
63 |
-Uint16 deo_mask[] = {0xff28, 0x0300, 0xc028, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0xa260, 0xa260, 0x0000, 0x0000, 0x0000, 0x0000}; |
|
64 |
-Uint16 dei_mask[] = {0x0000, 0x0000, 0x003c, 0x0014, 0x0014, 0x0014, 0x0014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07ff, 0x0000, 0x0000, 0x0000}; |
|
63 |
+Uint16 dev_vers[0x10], dei_mask[0x10], deo_mask[0x10]; |
|
65 | 64 |
|
66 | 65 |
static int |
67 | 66 |
clamp(int v, int min, int max) |
... | ... |
@@ -252,6 +251,19 @@ emu_init(void) |
252 | 251 |
SDL_SetRenderDrawColor(emu_renderer, 0x00, 0x00, 0x00, 0xff); |
253 | 252 |
ms_interval = SDL_GetPerformanceFrequency() / 1000; |
254 | 253 |
deadline_interval = ms_interval * TIMEOUT_MS; |
254 |
+ /* connect devices */ |
|
255 |
+ system_connect(0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK); |
|
256 |
+ system_connect(0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK); |
|
257 |
+ system_connect(0x2, SCREEN_VERSION, SCREEN_DEIMASK, SCREEN_DEOMASK); |
|
258 |
+ system_connect(0x3, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
259 |
+ system_connect(0x4, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
260 |
+ system_connect(0x5, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
261 |
+ system_connect(0x6, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
262 |
+ system_connect(0x8, CONTROL_VERSION, CONTROL_DEIMASK, CONTROL_DEOMASK); |
|
263 |
+ system_connect(0x9, MOUSE_VERSION, MOUSE_DEIMASK, MOUSE_DEOMASK); |
|
264 |
+ system_connect(0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
265 |
+ system_connect(0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
266 |
+ system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK); |
|
255 | 267 |
return 1; |
256 | 268 |
} |
257 | 269 |
|