commit 1c78615

Devine Lu Linvega  ·  2024-11-27 00:06:01 +0000 UTC
parent a904916
(system) Cleanup
1 files changed,  +18, -16
+18, -16
 1@@ -119,26 +119,28 @@ system_deo(Uxn *u, Uint8 port)
 2 	case 0x3: {
 3 		Uint16 addr = PEEK2(u->dev + 2);
 4 		if(u->ram[addr] == 0x0) {
 5-			int i, value = u->ram[addr + 7];
 6-			int length = PEEK2(u->ram + addr + 1);
 7-			int dst_page = PEEK2(u->ram + addr + 3), dst_addr = PEEK2(u->ram + addr + 5);
 8-			int dst = dst_page * 0x10000;
 9-			for(i = 0; i < length; i++)
10-				u->ram[dst + (Uint16)(dst_addr + i)] = value;
11+			Uint16 i, value = u->ram[addr + 7], length = PEEK2(u->ram + addr + 1);
12+			unsigned int dst_page = PEEK2(u->ram + addr + 3), dst_addr = PEEK2(u->ram + addr + 5);
13+			unsigned int dst = dst_page * 0x10000;
14+			if(dst_page < RAM_PAGES)
15+				for(i = 0; i < length; i++)
16+					u->ram[dst + (Uint16)(dst_addr + i)] = value;
17 		} else if(u->ram[addr] == 0x1) {
18 			Uint16 i, length = PEEK2(u->ram + addr + 1);
19-			Uint16 a_page = PEEK2(u->ram + addr + 3), a_addr = PEEK2(u->ram + addr + 5);
20-			Uint16 b_page = PEEK2(u->ram + addr + 7), b_addr = PEEK2(u->ram + addr + 9);
21-			int src = (a_page % (RAM_PAGES + 1)) * 0x10000, dst = (b_page % (RAM_PAGES + 1)) * 0x10000;
22-			for(i = 0; i < length; i++)
23-				u->ram[dst + (Uint16)(b_addr + i)] = u->ram[src + (Uint16)(a_addr + i)];
24+			unsigned int a_page = PEEK2(u->ram + addr + 3), a_addr = PEEK2(u->ram + addr + 5);
25+			unsigned int b_page = PEEK2(u->ram + addr + 7), b_addr = PEEK2(u->ram + addr + 9);
26+			unsigned int src = a_page * 0x10000, dst = b_page * 0x10000;
27+			if(a_page < RAM_PAGES && b_page < RAM_PAGES)
28+				for(i = 0; i < length; i++)
29+					u->ram[dst + (Uint16)(b_addr + i)] = u->ram[src + (Uint16)(a_addr + i)];
30 		} else if(u->ram[addr] == 0x2) {
31 			Uint16 i, length = PEEK2(u->ram + addr + 1);
32-			Uint16 a_page = PEEK2(u->ram + addr + 3), a_addr = PEEK2(u->ram + addr + 5);
33-			Uint16 b_page = PEEK2(u->ram + addr + 7), b_addr = PEEK2(u->ram + addr + 9);
34-			int src = (a_page % (RAM_PAGES + 1)) * 0x10000, dst = (b_page % (RAM_PAGES + 1)) * 0x10000;
35-			for(i = length - 1; i != 0xffff; i--)
36-				u->ram[dst + (Uint16)(b_addr + i)] = u->ram[src + (Uint16)(a_addr + i)];
37+			unsigned int a_page = PEEK2(u->ram + addr + 3), a_addr = PEEK2(u->ram + addr + 5);
38+			unsigned int b_page = PEEK2(u->ram + addr + 7), b_addr = PEEK2(u->ram + addr + 9);
39+			unsigned int src = a_page * 0x10000, dst = b_page * 0x10000;
40+			if(a_page < RAM_PAGES && b_page < RAM_PAGES)
41+				for(i = length - 1; i != 0xffff; i--)
42+					u->ram[dst + (Uint16)(b_addr + i)] = u->ram[src + (Uint16)(a_addr + i)];
43 		} else
44 			fprintf(stderr, "Unknown Expansion Command 0x%02x\n", u->ram[addr]);
45 		break;