... | ... |
@@ -64,15 +64,20 @@ system_inspect(Uxn *u) |
64 | 64 |
} |
65 | 65 |
|
66 | 66 |
void |
67 |
-system_connect(Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo) |
|
67 |
+system_connect(Uxn *u, Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo) |
|
68 | 68 |
{ |
69 |
+ int i, d = (device << 0x4); |
|
70 |
+ for(i = 0; i < 0x10; i++) { |
|
71 |
+ u->dei_masks[d + i] = (dei >> i) & 0x1; |
|
72 |
+ u->deo_masks[d + i] = (deo >> i) & 0x1; |
|
73 |
+ } |
|
69 | 74 |
dev_vers[device] = ver; |
70 | 75 |
dei_mask[device] = dei; |
71 | 76 |
deo_mask[device] = deo; |
72 | 77 |
} |
73 | 78 |
|
74 | 79 |
int |
75 |
-system_version(char *name, char *date) |
|
80 |
+system_version(Uxn *u, char *name, char *date) |
|
76 | 81 |
{ |
77 | 82 |
int i; |
78 | 83 |
printf("%s, %s.\n", name, date); |
... | ... |
@@ -17,10 +17,10 @@ WITH REGARD TO THIS SOFTWARE. |
17 | 17 |
|
18 | 18 |
extern char *boot_rom; |
19 | 19 |
|
20 |
-void system_connect(Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo); |
|
20 |
+void system_connect(Uxn *u, Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo); |
|
21 | 21 |
void system_reboot(Uxn *u, char *rom, int soft); |
22 | 22 |
void system_inspect(Uxn *u); |
23 |
-int system_version(char *emulator, char *date); |
|
23 |
+int system_version(Uxn *u, char *emulator, char *date); |
|
24 | 24 |
int system_error(char *msg, const char *err); |
25 | 25 |
int system_init(Uxn *u, Uint8 *ram, char *rom); |
26 | 26 |
|
... | ... |
@@ -11,10 +11,10 @@ WITH REGARD TO THIS SOFTWARE. |
11 | 11 |
|
12 | 12 |
/* clang-format off */ |
13 | 13 |
|
14 |
-#define POKE2(d, v) { (d)[0] = (v) >> 8; (d)[1] = (v); } |
|
15 |
-#define PEEK2(d) ((d)[0] << 8 | (d)[1]) |
|
16 |
-#define DEO(p, v) { u->dev[p] = v; if((deo_mask[p >> 4] >> (p & 0xf)) & 0x1) emu_deo(u, p); } |
|
17 |
-#define DEI(p) ((dei_mask[(p) >> 4] >> ((p) & 0xf)) & 0x1 ? emu_dei(u, (p)) : u->dev[(p)]) |
|
14 |
+#define POKE2(d, v) { *(d) = (v) >> 8; (d)[1] = (v); } |
|
15 |
+#define PEEK2(d) (*(d) << 8 | (d)[1]) |
|
16 |
+#define DEI(p) (u->dei_masks[p] ? emu_dei(u, (p)) : u->dev[(p)]) |
|
17 |
+#define DEO(p, v) { u->dev[p] = v; if(u->deo_masks[p]) emu_deo(u, p); } |
|
18 | 18 |
|
19 | 19 |
/* clang-format on */ |
20 | 20 |
|
... | ... |
@@ -27,14 +27,12 @@ typedef signed short Sint16; |
27 | 27 |
typedef unsigned int Uint32; |
28 | 28 |
|
29 | 29 |
typedef struct { |
30 |
- Uint8 dat[255], ptr; |
|
30 |
+ Uint8 dat[0x100], ptr; |
|
31 | 31 |
} Stack; |
32 | 32 |
|
33 | 33 |
typedef struct Uxn { |
34 |
- Uint8 *ram, dev[256]; |
|
34 |
+ Uint8 *ram, dev[0x100], dei_masks[0x100], deo_masks[0x100]; |
|
35 | 35 |
Stack wst, rst; |
36 |
- Uint8 (*dei)(struct Uxn *u, Uint8 addr); |
|
37 |
- void (*deo)(struct Uxn *u, Uint8 addr); |
|
38 | 36 |
} Uxn; |
39 | 37 |
|
40 | 38 |
/* required functions */ |
... | ... |
@@ -66,14 +66,14 @@ main(int argc, char **argv) |
66 | 66 |
if(i == argc) |
67 | 67 |
return system_error("usage", "uxncli [-v] file.rom [args..]"); |
68 | 68 |
/* Connect Varvara */ |
69 |
- system_connect(0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK); |
|
70 |
- system_connect(0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK); |
|
71 |
- system_connect(0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
72 |
- system_connect(0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
73 |
- system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK); |
|
69 |
+ system_connect(&u, 0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK); |
|
70 |
+ system_connect(&u, 0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK); |
|
71 |
+ system_connect(&u, 0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
72 |
+ system_connect(&u, 0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
73 |
+ system_connect(&u, 0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK); |
|
74 | 74 |
/* Read flags */ |
75 | 75 |
if(argv[i][0] == '-' && argv[i][1] == 'v') |
76 |
- return system_version("Uxncli - Console Varvara Emulator", "15 Aug 2023"); |
|
76 |
+ return system_version(&u, "Uxncli - Console Varvara Emulator", "17 Aug 2023"); |
|
77 | 77 |
if(!system_init(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++])) |
78 | 78 |
return system_error("Init", "Failed to initialize uxn."); |
79 | 79 |
/* Game Loop */ |
... | ... |
@@ -502,21 +502,21 @@ main(int argc, char **argv) |
502 | 502 |
if(i == argc) |
503 | 503 |
return system_error("usage", "uxnemu [-v][-2x][-3x] file.rom [args...]"); |
504 | 504 |
/* Connect Varvara */ |
505 |
- system_connect(0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK); |
|
506 |
- system_connect(0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK); |
|
507 |
- system_connect(0x2, SCREEN_VERSION, SCREEN_DEIMASK, SCREEN_DEOMASK); |
|
508 |
- system_connect(0x3, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
509 |
- system_connect(0x4, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
510 |
- system_connect(0x5, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
511 |
- system_connect(0x6, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
512 |
- system_connect(0x8, CONTROL_VERSION, CONTROL_DEIMASK, CONTROL_DEOMASK); |
|
513 |
- system_connect(0x9, MOUSE_VERSION, MOUSE_DEIMASK, MOUSE_DEOMASK); |
|
514 |
- system_connect(0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
515 |
- system_connect(0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
516 |
- system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK); |
|
505 |
+ system_connect(&u, 0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK); |
|
506 |
+ system_connect(&u, 0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK); |
|
507 |
+ system_connect(&u, 0x2, SCREEN_VERSION, SCREEN_DEIMASK, SCREEN_DEOMASK); |
|
508 |
+ system_connect(&u, 0x3, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
509 |
+ system_connect(&u, 0x4, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
510 |
+ system_connect(&u, 0x5, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
511 |
+ system_connect(&u, 0x6, AUDIO_VERSION, AUDIO_DEIMASK, AUDIO_DEOMASK); |
|
512 |
+ system_connect(&u, 0x8, CONTROL_VERSION, CONTROL_DEIMASK, CONTROL_DEOMASK); |
|
513 |
+ system_connect(&u, 0x9, MOUSE_VERSION, MOUSE_DEIMASK, MOUSE_DEOMASK); |
|
514 |
+ system_connect(&u, 0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
515 |
+ system_connect(&u, 0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); |
|
516 |
+ system_connect(&u, 0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK); |
|
517 | 517 |
/* Read flags */ |
518 | 518 |
if(argv[i][0] == '-' && argv[i][1] == 'v') |
519 |
- return system_version("Uxnemu - Graphical Varvara Emulator", "15 Aug 2023"); |
|
519 |
+ return system_version(&u, "Uxnemu - Graphical Varvara Emulator", "17 Aug 2023"); |
|
520 | 520 |
if(strcmp(argv[i], "-2x") == 0 || strcmp(argv[i], "-3x") == 0) |
521 | 521 |
set_zoom(argv[i++][1] - '0', 0); |
522 | 522 |
if(!emu_init()) |