| ... | ... |
@@ -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 |
|