commit 7dac87d

neauoire  ·  2023-08-16 20:10:42 +0000 UTC
parent 6ebc44b
Standardized varvara boot
10 files changed,  +113, -90
+10, -0
 1@@ -24,6 +24,16 @@ console_input(Uxn *u, char c, int type)
 2 	return uxn_eval(u, PEEK2(d));
 3 }
 4 
 5+void
 6+console_listen(Uxn *u, int i, int argc, char **argv)
 7+{
 8+	for(; i < argc; i++) {
 9+		char *p = argv[i];
10+		while(*p) console_input(u, *p++, CONSOLE_ARG);
11+		console_input(u, '\n', i == argc - 1 ? CONSOLE_END : CONSOLE_EOA);
12+	}
13+}
14+
15 void
16 console_deo(Uint8 *d, Uint8 port)
17 {
+1, -0
1@@ -19,4 +19,5 @@ WITH REGARD TO THIS SOFTWARE.
2 #define CONSOLE_END 0x4
3 
4 int console_input(Uxn *u, char c, int type);
5+void console_listen(Uxn *u, int i, int argc, char **argv);
6 void console_deo(Uint8 *d, Uint8 port);
+1, -1
1@@ -38,7 +38,7 @@ screen_change(Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2)
2 	if(y2 > uxn_screen.y2) uxn_screen.y2 = y2;
3 }
4 
5-static void
6+void
7 screen_fill(Uint8 *layer, int x1, int y1, int x2, int y2, int color)
8 {
9 	int x, y, width = uxn_screen.width, height = uxn_screen.height;
+2, -0
 1@@ -22,10 +22,12 @@ typedef struct UxnScreen {
 2 extern UxnScreen uxn_screen;
 3 extern int emu_resize(int width, int height);
 4 
 5+void screen_fill(Uint8 *layer, int x1, int y1, int x2, int y2, int color);
 6 void screen_palette(Uint8 *addr);
 7 void screen_resize(Uint16 width, Uint16 height);
 8 void screen_change(Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2);
 9 void screen_redraw(void);
10 void screen_debugger(Uxn *u);
11+
12 Uint8 screen_dei(Uxn *u, Uint8 addr);
13 void screen_deo(Uint8 *ram, Uint8 *d, Uint8 port);
+51, -34
  1@@ -15,11 +15,27 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  2 WITH REGARD TO THIS SOFTWARE.
  3 */
  4 
  5+char *boot_rom;
  6+
  7 static const char *errors[] = {
  8 	"underflow",
  9 	"overflow",
 10 	"division by zero"};
 11 
 12+static int
 13+system_load(Uxn *u, char *filename)
 14+{
 15+	int l, i = 0;
 16+	FILE *f = fopen(filename, "rb");
 17+	if(!f)
 18+		return 0;
 19+	l = fread(&u->ram[PAGE_PROGRAM], 0x10000 - PAGE_PROGRAM, 1, f);
 20+	while(l && ++i < RAM_PAGES)
 21+		l = fread(u->ram + 0x10000 * i, 0x10000, 1, f);
 22+	fclose(f);
 23+	return 1;
 24+}
 25+
 26 static void
 27 system_print(Stack *s, char *name)
 28 {
 29@@ -32,19 +48,6 @@ system_print(Stack *s, char *name)
 30 	fprintf(stderr, "\n");
 31 }
 32 
 33-static void
 34-system_cmd(Uint8 *ram, Uint16 addr)
 35-{
 36-	if(ram[addr] == 0x1) {
 37-		Uint16 i, length = PEEK2(ram + addr + 1);
 38-		Uint16 a_page = PEEK2(ram + addr + 1 + 2), a_addr = PEEK2(ram + addr + 1 + 4);
 39-		Uint16 b_page = PEEK2(ram + addr + 1 + 6), b_addr = PEEK2(ram + addr + 1 + 8);
 40-		int src = (a_page % RAM_PAGES) * 0x10000, dst = (b_page % RAM_PAGES) * 0x10000;
 41-		for(i = 0; i < length; i++)
 42-			ram[dst + (Uint16)(b_addr + i)] = ram[src + (Uint16)(a_addr + i)];
 43-	}
 44-}
 45-
 46 int
 47 system_error(char *msg, const char *err)
 48 {
 49@@ -53,20 +56,6 @@ system_error(char *msg, const char *err)
 50 	return 0;
 51 }
 52 
 53-int
 54-system_load(Uxn *u, char *filename)
 55-{
 56-	int l, i = 0;
 57-	FILE *f = fopen(filename, "rb");
 58-	if(!f)
 59-		return 0;
 60-	l = fread(&u->ram[PAGE_PROGRAM], 0x10000 - PAGE_PROGRAM, 1, f);
 61-	while(l && ++i < RAM_PAGES)
 62-		l = fread(u->ram + 0x10000 * i, 0x10000, 1, f);
 63-	fclose(f);
 64-	return 1;
 65-}
 66-
 67 void
 68 system_inspect(Uxn *u)
 69 {
 70@@ -94,6 +83,32 @@ system_version(char *name, char *date)
 71 	return 0;
 72 }
 73 
 74+void
 75+system_reboot(Uxn *u, char *rom, int soft)
 76+{
 77+	int i;
 78+	for(i = 0x100 * soft; i < 0x10000; i++)
 79+		u->ram[i] = 0;
 80+	for(i = 0x0; i < 0x100; i++)
 81+		u->dev[i] = 0;
 82+	u->wst.ptr = 0;
 83+	u->rst.ptr = 0;
 84+	if(system_load(u, boot_rom))
 85+		if(uxn_eval(u, PAGE_PROGRAM))
 86+			boot_rom = rom;
 87+}
 88+
 89+int
 90+system_init(Uxn *u, Uint8 *ram, char *rom)
 91+{
 92+	u->ram = ram;
 93+	if(!system_load(u, rom))
 94+		if(!system_load(u, "boot.rom"))
 95+			return system_error("Init", "Failed to load rom.");
 96+	boot_rom = rom;
 97+	return 1;
 98+}
 99+
100 /* IO */
101 
102 void
103@@ -101,13 +116,15 @@ system_deo(Uxn *u, Uint8 *d, Uint8 port)
104 {
105 	switch(port) {
106 	case 0x3:
107-		system_cmd(u->ram, PEEK2(d + 2));
108-		break;
109-	case 0x5:
110-		if(PEEK2(d + 4)) {
111-			Uxn friend;
112-			uxn_boot(&friend, u->ram);
113-			uxn_eval(&friend, PEEK2(d + 4));
114+		Uint8 *ram = u->ram;
115+		Uint16 addr = PEEK2(d + 2);
116+		if(ram[addr] == 0x1) {
117+			Uint16 i, length = PEEK2(ram + addr + 1);
118+			Uint16 a_page = PEEK2(ram + addr + 1 + 2), a_addr = PEEK2(ram + addr + 1 + 4);
119+			Uint16 b_page = PEEK2(ram + addr + 1 + 6), b_addr = PEEK2(ram + addr + 1 + 8);
120+			int src = (a_page % RAM_PAGES) * 0x10000, dst = (b_page % RAM_PAGES) * 0x10000;
121+			for(i = 0; i < length; i++)
122+				ram[dst + (Uint16)(b_addr + i)] = ram[src + (Uint16)(a_addr + i)];
123 		}
124 		break;
125 	case 0xe:
+6, -2
 1@@ -15,9 +15,13 @@ WITH REGARD TO THIS SOFTWARE.
 2 
 3 #define RAM_PAGES 0x10
 4 
 5+extern char *boot_rom;
 6+
 7 void system_connect(Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo);
 8-int system_version(char *emulator, char *date);
 9-int system_load(Uxn *u, char *filename);
10+void system_reboot(Uxn *u, char *rom, int soft);
11 void system_inspect(Uxn *u);
12+int system_version(char *emulator, char *date);
13 int system_error(char *msg, const char *err);
14+int system_init(Uxn *u, Uint8 *ram, char *rom);
15+
16 void system_deo(Uxn *u, Uint8 *d, Uint8 port);
+0, -11
 1@@ -117,14 +117,3 @@ uxn_eval(Uxn *u, Uint16 pc)
 2 		}
 3 	}
 4 }
 5-
 6-int
 7-uxn_boot(Uxn *u, Uint8 *ram)
 8-{
 9-	Uint32 i;
10-	char *cptr = (char *)u;
11-	for(i = 0; i < sizeof(*u); i++)
12-		cptr[i] = 0;
13-	u->ram = ram;
14-	return 1;
15-}
+0, -1
1@@ -46,5 +46,4 @@ extern Uint16 dev_vers[0x10], dei_mask[0x10], deo_mask[0x10];
2 
3 /* built-ins */
4 
5-int uxn_boot(Uxn *u, Uint8 *ram);
6 int uxn_eval(Uxn *u, Uint16 pc);
+19, -22
 1@@ -32,8 +32,6 @@ static Display *display;
 2 static Visual *visual;
 3 static Window window;
 4 
 5-char *rom_path;
 6-
 7 #define WIDTH (64 * 8)
 8 #define HEIGHT (40 * 8)
 9 #define PAD 2
10@@ -86,7 +84,8 @@ emu_resize(int width, int height)
11 static int
12 emu_start(Uxn *u, char *rom)
13 {
14-
15+	(void)u;
16+	(void)rom;
17 	return 1;
18 }
19 
20@@ -144,7 +143,7 @@ emu_event(Uxn *u)
21 			u->dev[0x0e] = !u->dev[0x0e];
22 		if(sym == XK_F4)
23 			if(!emu_start(u, "boot.rom"))
24-				emu_start(u, rom_path);
25+				emu_start(u, boot_rom);
26 		controller_down(u, &u->dev[0x80], get_button(sym));
27 		controller_key(u, &u->dev[0x80], sym < 0x80 ? sym : (Uint8)buf[0]);
28 	} break;
29@@ -176,6 +175,13 @@ emu_event(Uxn *u)
30 	}
31 }
32 
33+static int
34+emu_init(void)
35+{
36+	screen_resize(WIDTH, HEIGHT);
37+	return 1;
38+}
39+
40 static int
41 emu_run(Uxn *u, char *rom)
42 {
43@@ -259,24 +265,15 @@ main(int argc, char **argv)
44 	/* Read flags */
45 	if(argv[i][0] == '-' && argv[i][1] == 'v')
46 		return system_version("Uxn11 - Graphical Varvara Emulator", "16 Aug 2023");
47-
48-	rom_path = argv[1];
49-	if(!uxn_boot(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8))))
50-		return system_error("boot", "Failed");
51-	/* start sequence */
52-	screen_resize(WIDTH, HEIGHT);
53-
54-	if(!system_load(&u, rom_path))
55-		return 0;
56-	if(!uxn_eval(&u, PAGE_PROGRAM))
57-		return system_error("boot", "Failed to start rom.");
58-
59-	/* console vector */
60-	for(i = 2; i < argc; i++) {
61-		char *p = argv[i];
62-		while(*p) console_input(&u, *p++, CONSOLE_ARG);
63-		console_input(&u, '\n', i == argc ? CONSOLE_END : CONSOLE_EOA);
64+	if(!emu_init())
65+		return system_error("Init", "Failed to initialize varvara.");
66+	if(!system_init(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++]))
67+		return system_error("Init", "Failed to initialize uxn.");
68+	/* Game Loop */
69+	u.dev[0x17] = argc - i;
70+	if(uxn_eval(&u, PAGE_PROGRAM)) {
71+		console_listen(&u, i, argc, argv);
72+		emu_run(&u, boot_rom);
73 	}
74-	emu_run(&u, rom_path);
75 	return emu_end(&u);
76 }
+23, -19
 1@@ -41,6 +41,23 @@ emu_deo(Uxn *u, Uint8 addr)
 2 	}
 3 }
 4 
 5+static void
 6+emu_run(Uxn *u)
 7+{
 8+	while(!u->dev[0x0f]) {
 9+		int c = fgetc(stdin);
10+		if(c == EOF) break;
11+		console_input(u, (Uint8)c, CONSOLE_STD);
12+	}
13+}
14+
15+static int
16+emu_end(Uxn *u)
17+{
18+	free(u->ram);
19+	return u->dev[0x0f] & 0x7f;
20+}
21+
22 int
23 main(int argc, char **argv)
24 {
25@@ -56,27 +73,14 @@ main(int argc, char **argv)
26 	system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK);
27 	/* Read flags */
28 	if(argv[i][0] == '-' && argv[i][1] == 'v')
29-		return system_version("Uxncli - Console Varvara Emulator", "9 Aug 2023");
30-	/* Continue.. */
31-	if(!uxn_boot(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8))))
32-		return system_error("Boot", "Failed");
33-	/* Load rom */
34-	if(!system_load(&u, argv[i++]))
35-		return system_error("Load", "Failed");
36+		return system_version("Uxncli - Console Varvara Emulator", "15 Aug 2023");
37+	if(!system_init(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++]))
38+		return system_error("Init", "Failed to initialize uxn.");
39 	/* Game Loop */
40 	u.dev[0x17] = argc - i;
41 	if(uxn_eval(&u, PAGE_PROGRAM)) {
42-		for(; i < argc; i++) {
43-			char *p = argv[i];
44-			while(*p) console_input(&u, *p++, CONSOLE_ARG);
45-			console_input(&u, '\n', i == argc - 1 ? CONSOLE_END : CONSOLE_EOA);
46-		}
47-		while(!u.dev[0x0f]) {
48-			int c = fgetc(stdin);
49-			if(c == EOF) break;
50-			console_input(&u, (Uint8)c, CONSOLE_STD);
51-		}
52+		console_listen(&u, i, argc, argv);
53+		emu_run(&u);
54 	}
55-	free(u.ram);
56-	return u.dev[0x0f] & 0x7f;
57+	return emu_end(&u);
58 }