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))