commit e17c610d735f45e7397d750ec82f791d0fdb496b
parent a55d94f9dbb7edc71b9299257e582ddf6be0b331
Author: Devine Lu Linvega <aliceffekt@gmail.com>
Date: Tue, 21 Jan 2025 19:34:15 -0800
Optimized expansion ports
Diffstat:
1 file changed, 16 insertions(+), 20 deletions(-)
diff --git a/src/devices/system.c b/src/devices/system.c
@@ -85,30 +85,26 @@ system_deo(Uint8 port)
{
switch(port) {
case 0x3: {
+ Uint16 value;
Uint16 addr = PEEK2(uxn.dev + 2);
+ Uint8 *aptr = uxn.ram + addr;
+ Uint16 length = PEEK2(aptr + 1);
if(uxn.ram[addr] == 0x0) {
- Uint16 i, value = uxn.ram[addr + 7], length = PEEK2(uxn.ram + addr + 1);
- unsigned int dst_page = PEEK2(uxn.ram + addr + 3), dst_addr = PEEK2(uxn.ram + addr + 5);
- unsigned int dst = dst_page * 0x10000;
- if(dst_page < RAM_PAGES)
- for(i = 0; i < length; i++)
- uxn.ram[dst + (Uint16)(dst_addr + i)] = value;
+ unsigned int a = PEEK2(aptr + 3) * 0x10000 + PEEK2(aptr + 5);
+ unsigned int b = a + length;
+ value = uxn.ram[addr + 7];
+ for(; a < b; uxn.ram[a++] = value);
} else if(uxn.ram[addr] == 0x1) {
- Uint16 i, length = PEEK2(uxn.ram + addr + 1);
- unsigned int a_page = PEEK2(uxn.ram + addr + 3), a_addr = PEEK2(uxn.ram + addr + 5);
- unsigned int b_page = PEEK2(uxn.ram + addr + 7), b_addr = PEEK2(uxn.ram + addr + 9);
- unsigned int src = a_page * 0x10000, dst = b_page * 0x10000;
- if(a_page < RAM_PAGES && b_page < RAM_PAGES)
- for(i = 0; i < length; i++)
- uxn.ram[dst + (Uint16)(b_addr + i)] = uxn.ram[src + (Uint16)(a_addr + i)];
+ unsigned int a = PEEK2(aptr + 3) * 0x10000 + PEEK2(aptr + 5);
+ unsigned int b = a + length;
+ unsigned int c = PEEK2(aptr + 7) * 0x10000 + PEEK2(aptr + 9);
+ for(; a < b; uxn.ram[c++] = uxn.ram[a++]);
} else if(uxn.ram[addr] == 0x2) {
- Uint16 i, length = PEEK2(uxn.ram + addr + 1);
- unsigned int a_page = PEEK2(uxn.ram + addr + 3), a_addr = PEEK2(uxn.ram + addr + 5);
- unsigned int b_page = PEEK2(uxn.ram + addr + 7), b_addr = PEEK2(uxn.ram + addr + 9);
- unsigned int src = a_page * 0x10000, dst = b_page * 0x10000;
- if(a_page < RAM_PAGES && b_page < RAM_PAGES)
- for(i = length - 1; i != 0xffff; i--)
- uxn.ram[dst + (Uint16)(b_addr + i)] = uxn.ram[src + (Uint16)(a_addr + i)];
+ unsigned int a = PEEK2(aptr + 3) * 0x10000 + PEEK2(aptr + 5);
+ unsigned int b = a + length;
+ unsigned int c = PEEK2(aptr + 7) * 0x10000 + PEEK2(aptr + 9);
+ unsigned int d = c + length;
+ for(; b >= a; uxn.ram[--d] = uxn.ram[--b]);
} else
fprintf(stderr, "Unknown Expansion Command 0x%02x\n", uxn.ram[addr]);
break;