Browse code

Pre-process dei/deo masks

neauoire authored on 17/08/2023 16:25:24
Showing 5 changed files
... ...
@@ -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())