commit c6bd7f0

neauoire  ·  2023-08-17 16:27:33 +0000 UTC
parent b405d8c
Pre-process dei/deo masks
5 files changed,  +30, -27
+7, -2
 1@@ -64,15 +64,20 @@ system_inspect(Uxn *u)
 2 }
 3 
 4 void
 5-system_connect(Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo)
 6+system_connect(Uxn *u, Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo)
 7 {
 8+	int i, d = (device << 0x4);
 9+	for(i = 0; i < 0x10; i++) {
10+		u->dei_masks[d + i] = (dei >> i) & 0x1;
11+		u->deo_masks[d + i] = (deo >> i) & 0x1;
12+	}
13 	dev_vers[device] = ver;
14 	dei_mask[device] = dei;
15 	deo_mask[device] = deo;
16 }
17 
18 int
19-system_version(char *name, char *date)
20+system_version(Uxn *u, char *name, char *date)
21 {
22 	int i;
23 	printf("%s, %s.\n", name, date);
+2, -2
 1@@ -17,10 +17,10 @@ WITH REGARD TO THIS SOFTWARE.
 2 
 3 extern char *boot_rom;
 4 
 5-void system_connect(Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo);
 6+void system_connect(Uxn *u, Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo);
 7 void system_reboot(Uxn *u, char *rom, int soft);
 8 void system_inspect(Uxn *u);
 9-int system_version(char *emulator, char *date);
10+int system_version(Uxn *u, char *emulator, char *date);
11 int system_error(char *msg, const char *err);
12 int system_init(Uxn *u, Uint8 *ram, char *rom);
13 
+6, -8
 1@@ -11,10 +11,10 @@ WITH REGARD TO THIS SOFTWARE.
 2 
 3 /* clang-format off */
 4 
 5-#define POKE2(d, v) { (d)[0] = (v) >> 8; (d)[1] = (v); }
 6-#define PEEK2(d) ((d)[0] << 8 | (d)[1])
 7-#define DEO(p, v) { u->dev[p] = v; if((deo_mask[p >> 4] >> (p & 0xf)) & 0x1) emu_deo(u, p); }
 8-#define DEI(p) ((dei_mask[(p) >> 4] >> ((p) & 0xf)) & 0x1 ? emu_dei(u, (p)) : u->dev[(p)])
 9+#define POKE2(d, v) { *(d) = (v) >> 8; (d)[1] = (v); }
10+#define PEEK2(d) (*(d) << 8 | (d)[1])
11+#define DEI(p) (u->dei_masks[p] ? emu_dei(u, (p)) : u->dev[(p)])
12+#define DEO(p, v) { u->dev[p] = v; if(u->deo_masks[p]) emu_deo(u, p); }
13 
14 /* clang-format on */
15 
16@@ -27,14 +27,12 @@ typedef signed short Sint16;
17 typedef unsigned int Uint32;
18 
19 typedef struct {
20-	Uint8 dat[255], ptr;
21+	Uint8 dat[0x100], ptr;
22 } Stack;
23 
24 typedef struct Uxn {
25-	Uint8 *ram, dev[256];
26+	Uint8 *ram, dev[0x100], dei_masks[0x100], deo_masks[0x100];
27 	Stack wst, rst;
28-	Uint8 (*dei)(struct Uxn *u, Uint8 addr);
29-	void (*deo)(struct Uxn *u, Uint8 addr);
30 } Uxn;
31 
32 /* required functions */
+9, -9
 1@@ -258,17 +258,17 @@ main(int argc, char **argv)
 2 	if(i == argc)
 3 		return system_error("usage", "uxn11 [-v] file.rom [args...]");
 4 	/* Connect Varvara */
 5-	system_connect(0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK);
 6-	system_connect(0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK);
 7-	system_connect(0x2, SCREEN_VERSION, SCREEN_DEIMASK, SCREEN_DEOMASK);
 8-	system_connect(0x8, CONTROL_VERSION, CONTROL_DEIMASK, CONTROL_DEOMASK);
 9-	system_connect(0x9, MOUSE_VERSION, MOUSE_DEIMASK, MOUSE_DEOMASK);
10-	system_connect(0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK);
11-	system_connect(0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK);
12-	system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK);
13+	system_connect(&u, 0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK);
14+	system_connect(&u, 0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK);
15+	system_connect(&u, 0x2, SCREEN_VERSION, SCREEN_DEIMASK, SCREEN_DEOMASK);
16+	system_connect(&u, 0x8, CONTROL_VERSION, CONTROL_DEIMASK, CONTROL_DEOMASK);
17+	system_connect(&u, 0x9, MOUSE_VERSION, MOUSE_DEIMASK, MOUSE_DEOMASK);
18+	system_connect(&u, 0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK);
19+	system_connect(&u, 0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK);
20+	system_connect(&u, 0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK);
21 	/* Read flags */
22 	if(argv[i][0] == '-' && argv[i][1] == 'v')
23-		return system_version("Uxn11 - Graphical Varvara Emulator", "16 Aug 2023");
24+		return system_version(&u, "Uxn11 - Graphical Varvara Emulator", "17 Aug 2023");
25 	if(!emu_init())
26 		return system_error("Init", "Failed to initialize varvara.");
27 	if(!system_init(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++]))
+6, -6
 1@@ -66,14 +66,14 @@ main(int argc, char **argv)
 2 	if(i == argc)
 3 		return system_error("usage", "uxncli [-v] file.rom [args..]");
 4 	/* Connect Varvara */
 5-	system_connect(0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK);
 6-	system_connect(0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK);
 7-	system_connect(0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK);
 8-	system_connect(0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK);
 9-	system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK);
10+	system_connect(&u, 0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK);
11+	system_connect(&u, 0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK);
12+	system_connect(&u, 0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK);
13+	system_connect(&u, 0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK);
14+	system_connect(&u, 0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK);
15 	/* Read flags */
16 	if(argv[i][0] == '-' && argv[i][1] == 'v')
17-		return system_version("Uxncli - Console Varvara Emulator", "15 Aug 2023");
18+		return system_version(&u, "Uxncli - Console Varvara Emulator", "17 Aug 2023");
19 	if(!system_init(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++]))
20 		return system_error("Init", "Failed to initialize uxn.");
21 	/* Game Loop */