commit 7250a2a

Devine Lu Linvega  ·  2025-01-22 00:38:25 +0000 UTC
parent 2fe1517
Cleaning up system device
1 files changed,  +24, -14
+24, -14
 1@@ -83,32 +83,42 @@ system_dei(Uint8 addr)
 2 void
 3 system_deo(Uint8 port)
 4 {
 5+	Uint16 i, length, value;
 6 	switch(port) {
 7 	case 0x3: {
 8 		Uint16 addr = PEEK2(uxn.dev + 2);
 9+		Uint16 aptr = uxn.ram + addr;
10 		if(uxn.ram[addr] == 0x0) {
11-			Uint16 i, value = uxn.ram[addr + 7], length = PEEK2(uxn.ram + addr + 1);
12-			unsigned int dst_page = PEEK2(uxn.ram + addr + 3), dst_addr = PEEK2(uxn.ram + addr + 5);
13+			value = uxn.ram[addr + 7];
14+			length = PEEK2(aptr + 1);
15+			unsigned int dst_page = PEEK2(aptr + 3);
16+			unsigned int dst_addr = PEEK2(aptr + 5);
17 			unsigned int dst = dst_page * 0x10000;
18 			if(dst_page < RAM_PAGES)
19 				for(i = 0; i < length; i++)
20 					uxn.ram[dst + (Uint16)(dst_addr + i)] = value;
21 		} else if(uxn.ram[addr] == 0x1) {
22-			Uint16 i, length = PEEK2(uxn.ram + addr + 1);
23-			unsigned int a_page = PEEK2(uxn.ram + addr + 3), a_addr = PEEK2(uxn.ram + addr + 5);
24-			unsigned int b_page = PEEK2(uxn.ram + addr + 7), b_addr = PEEK2(uxn.ram + addr + 9);
25-			unsigned int src = a_page * 0x10000, dst = b_page * 0x10000;
26-			if(a_page < RAM_PAGES && b_page < RAM_PAGES)
27+			length = PEEK2(aptr + 1);
28+			unsigned int src_page = PEEK2(aptr + 3);
29+			unsigned int src_addr = PEEK2(aptr + 5);
30+			unsigned int dst_page = PEEK2(aptr + 7);
31+			unsigned int dst_addr = PEEK2(aptr + 9);
32+			unsigned int src = src_page * 0x10000;
33+			unsigned int dst = dst_page * 0x10000;
34+			if(src_page < RAM_PAGES && dst_page < RAM_PAGES)
35 				for(i = 0; i < length; i++)
36-					uxn.ram[dst + (Uint16)(b_addr + i)] = uxn.ram[src + (Uint16)(a_addr + i)];
37+					uxn.ram[dst + (Uint16)(dst_addr + i)] = uxn.ram[src + (Uint16)(src_addr + i)];
38 		} else if(uxn.ram[addr] == 0x2) {
39-			Uint16 i, length = PEEK2(uxn.ram + addr + 1);
40-			unsigned int a_page = PEEK2(uxn.ram + addr + 3), a_addr = PEEK2(uxn.ram + addr + 5);
41-			unsigned int b_page = PEEK2(uxn.ram + addr + 7), b_addr = PEEK2(uxn.ram + addr + 9);
42-			unsigned int src = a_page * 0x10000, dst = b_page * 0x10000;
43-			if(a_page < RAM_PAGES && b_page < RAM_PAGES)
44+			length = PEEK2(aptr + 1);
45+			unsigned int src_page = PEEK2(aptr + 3);
46+			unsigned int src_addr = PEEK2(aptr + 5);
47+			unsigned int dst_page = PEEK2(aptr + 7);
48+			unsigned int dst_addr = PEEK2(aptr + 9);
49+			unsigned int src = src_page * 0x10000;
50+			unsigned int dst = dst_page * 0x10000;
51+			if(src_page < RAM_PAGES && dst_page < RAM_PAGES)
52 				for(i = length - 1; i != 0xffff; i--)
53-					uxn.ram[dst + (Uint16)(b_addr + i)] = uxn.ram[src + (Uint16)(a_addr + i)];
54+					uxn.ram[dst + (Uint16)(dst_addr + i)] = uxn.ram[src + (Uint16)(src_addr + i)];
55 		} else
56 			fprintf(stderr, "Unknown Expansion Command 0x%02x\n", uxn.ram[addr]);
57 		break;