commit c6bc097

Devine Lu Linvega  ·  2025-07-01 02:22:33 +0000 UTC
parent a320538
Wrap memory banks
2 files changed,  +50, -58
+24, -28
 1@@ -181,38 +181,34 @@ system_reboot(const unsigned int soft)
 2 }
 3 
 4 static void
 5-system_expansion(const Uint16 addr)
 6+system_expansion(const Uint16 exp)
 7 {
 8-	Uint8 *aptr = ram + addr;
 9-	Uint16 length = PEEK2(aptr + 1);
10-	if(ram[addr] == 0x0) {
11-		unsigned int src_bank = PEEK2(aptr + 3);
12-		unsigned int src_addr = PEEK2(aptr + 5);
13-		unsigned int src_value = ram[addr + 7];
14-		unsigned int a = src_bank * 0x10000 + src_addr;
15-		unsigned int b = a + length;
16-		for(b = b < BANKS_CAP ? b : BANKS_CAP; a < b; ram[a++] = src_value);
17-	} else if(ram[addr] == 0x1) {
18-		unsigned int src_bank = PEEK2(aptr + 3);
19-		unsigned int src_addr = PEEK2(aptr + 5);
20-		unsigned int dst_bank = PEEK2(aptr + 7);
21+	Uint8 *aptr = ram + exp;
22+	unsigned short length = PEEK2(aptr + 1), limit;
23+	unsigned int bank = PEEK2(aptr + 3) * 0x10000;
24+	unsigned int addr = PEEK2(aptr + 5);
25+	if(ram[exp] == 0x0) {
26+		unsigned int dst_value = ram[exp + 7];
27+		unsigned short a = addr;
28+		if(bank < BANKS_CAP)
29+			for(limit = a + length; a < limit; a++)
30+				ram[bank + a] = dst_value;
31+	} else if(ram[exp] == 0x1) {
32+		unsigned int dst_bank = PEEK2(aptr + 7) * 0x10000;
33 		unsigned int dst_addr = PEEK2(aptr + 9);
34-		unsigned int a = src_bank * 0x10000 + src_addr;
35-		unsigned int b = a + length;
36-		unsigned int c = dst_bank * 0x10000 + dst_addr;
37-		for(b = b < BANKS_CAP ? b : BANKS_CAP; a < b; ram[c++] = ram[a++]);
38-	} else if(ram[addr] == 0x2) {
39-		unsigned int src_bank = PEEK2(aptr + 3);
40-		unsigned int src_addr = PEEK2(aptr + 5);
41-		unsigned int dst_bank = PEEK2(aptr + 7);
42+		unsigned short a = addr, c = dst_addr;
43+		if(bank < BANKS_CAP && dst_bank < BANKS_CAP)
44+			for(limit = a + length; a < limit; c++, a++)
45+				ram[dst_bank + c] = ram[bank + a];
46+	} else if(ram[exp] == 0x2) {
47+		unsigned int dst_bank = PEEK2(aptr + 7) * 0x10000;
48 		unsigned int dst_addr = PEEK2(aptr + 9);
49-		unsigned int a = src_bank * 0x10000 + src_addr;
50-		unsigned int b = a + length;
51-		unsigned int c = dst_bank * 0x10000 + dst_addr;
52-		unsigned int d = c + length;
53-		for(; b > a; ram[--d] = ram[--b]);
54+		unsigned short a = addr + length - 1, c = dst_addr + length - 1;
55+		if(bank < BANKS_CAP && dst_bank < BANKS_CAP)
56+			for(limit = addr - 1; a > limit; a--, c--)
57+				ram[dst_bank + c] = ram[bank + a];
58 	} else
59-		fprintf(stderr, "Unknown command: %s\n", &ram[addr]);
60+		fprintf(stderr, "Unknown command: %s\n", &ram[exp]);
61 }
62 
63 /*
+26, -30
 1@@ -158,38 +158,34 @@ system_boot(char *rom_path, unsigned int has_args)
 2 }
 3 
 4 static void
 5-system_expansion(const Uint16 addr)
 6-{
 7-	Uint8 *aptr = ram + addr;
 8-	Uint16 length = PEEK2(aptr + 1);
 9-	if(ram[addr] == 0x0) {
10-		unsigned int src_bank = PEEK2(aptr + 3);
11-		unsigned int src_addr = PEEK2(aptr + 5);
12-		unsigned int src_value = ram[addr + 7];
13-		unsigned int a = src_bank * 0x10000 + src_addr;
14-		unsigned int b = a + length;
15-		for(b = b < BANKS_CAP ? b : BANKS_CAP; a < b; ram[a++] = src_value);
16-	} else if(ram[addr] == 0x1) {
17-		unsigned int src_bank = PEEK2(aptr + 3);
18-		unsigned int src_addr = PEEK2(aptr + 5);
19-		unsigned int dst_bank = PEEK2(aptr + 7);
20+system_expansion(const Uint16 exp)
21+{
22+	Uint8 *aptr = ram + exp;
23+	unsigned short length = PEEK2(aptr + 1), limit;
24+	unsigned int bank = PEEK2(aptr + 3) * 0x10000;
25+	unsigned int addr = PEEK2(aptr + 5);
26+	if(ram[exp] == 0x0) {
27+		unsigned int dst_value = ram[exp + 7];
28+		unsigned short a = addr;
29+		if(bank < BANKS_CAP)
30+			for(limit = a + length; a < limit; a++)
31+				ram[bank + a] = dst_value;
32+	} else if(ram[exp] == 0x1) {
33+		unsigned int dst_bank = PEEK2(aptr + 7) * 0x10000;
34 		unsigned int dst_addr = PEEK2(aptr + 9);
35-		unsigned int a = src_bank * 0x10000 + src_addr;
36-		unsigned int b = a + length;
37-		unsigned int c = dst_bank * 0x10000 + dst_addr;
38-		for(b = b < BANKS_CAP ? b : BANKS_CAP; a < b; ram[c++] = ram[a++]);
39-	} else if(ram[addr] == 0x2) {
40-		unsigned int src_bank = PEEK2(aptr + 3);
41-		unsigned int src_addr = PEEK2(aptr + 5);
42-		unsigned int dst_bank = PEEK2(aptr + 7);
43+		unsigned short a = addr, c = dst_addr;
44+		if(bank < BANKS_CAP && dst_bank < BANKS_CAP)
45+			for(limit = a + length; a < limit; c++, a++)
46+				ram[dst_bank + c] = ram[bank + a];
47+	} else if(ram[exp] == 0x2) {
48+		unsigned int dst_bank = PEEK2(aptr + 7) * 0x10000;
49 		unsigned int dst_addr = PEEK2(aptr + 9);
50-		unsigned int a = src_bank * 0x10000 + src_addr;
51-		unsigned int b = a + length;
52-		unsigned int c = dst_bank * 0x10000 + dst_addr;
53-		unsigned int d = c + length;
54-		for(; b > a; ram[--d] = ram[--b]);
55+		unsigned short a = addr + length - 1, c = dst_addr + length - 1;
56+		if(bank < BANKS_CAP && dst_bank < BANKS_CAP)
57+			for(limit = addr - 1; a > limit; a--, c--)
58+				ram[dst_bank + c] = ram[bank + a];
59 	} else
60-		fprintf(stderr, "Unknown command: %s\n", &ram[addr]);
61+		fprintf(stderr, "Unknown command: %s\n", &ram[exp]);
62 }
63 
64 /*
65@@ -695,7 +691,7 @@ main(int argc, char **argv)
66 {
67 	int i = 1;
68 	if(argc == 2 && argv[1][0] == '-' && argv[1][1] == 'v')
69-		return !fprintf(stdout, "Uxn11 - Varvara Emulator(cli), 18 May 2025.\n");
70+		return !fprintf(stdout, "Uxn11 - Varvara Emulator(cli), 30 May 2025.\n");
71 	else if(argc == 1)
72 		return !fprintf(stdout, "usage: %s [-v] file.rom [args..]\n", argv[0]);
73 	else if(!system_boot(argv[i++], argc > 2))