diff --git a/src/devices/system.c b/src/devices/system.c index 622fedd..9cecf53 100644 --- a/src/devices/system.c +++ b/src/devices/system.c @@ -68,38 +68,34 @@ system_reboot(int soft) } static void -system_expansion(const Uint16 addr) +system_expansion(const Uint16 exp) { - Uint8 *aptr = uxn.ram + addr; - Uint16 length = PEEK2(aptr + 1); - if(uxn.ram[addr] == 0x0) { - unsigned int src_bank = PEEK2(aptr + 3); - unsigned int src_addr = PEEK2(aptr + 5); - unsigned int src_value = uxn.ram[addr + 7]; - unsigned int a = src_bank * 0x10000 + src_addr; - unsigned int b = a + length; - for(b = b < BANKS_CAP ? b : BANKS_CAP; a < b; uxn.ram[a++] = src_value); - } else if(uxn.ram[addr] == 0x1) { - unsigned int src_bank = PEEK2(aptr + 3); - unsigned int src_addr = PEEK2(aptr + 5); - unsigned int dst_bank = PEEK2(aptr + 7); + Uint8 *aptr = uxn.ram + exp; + unsigned short length = PEEK2(aptr + 1), limit; + unsigned int bank = PEEK2(aptr + 3) * 0x10000; + unsigned int addr = PEEK2(aptr + 5); + if(uxn.ram[exp] == 0x0) { + unsigned int dst_value = uxn.ram[exp + 7]; + unsigned short a = addr; + if(bank < BANKS_CAP) + for(limit = a + length; a != limit; a++) + uxn.ram[bank + a] = dst_value; + } else if(uxn.ram[exp] == 0x1) { + unsigned int dst_bank = PEEK2(aptr + 7) * 0x10000; unsigned int dst_addr = PEEK2(aptr + 9); - unsigned int a = src_bank * 0x10000 + src_addr; - unsigned int b = a + length; - unsigned int c = dst_bank * 0x10000 + dst_addr; - for(b = b < BANKS_CAP ? b : BANKS_CAP; a < b; uxn.ram[c++] = uxn.ram[a++]); - } else if(uxn.ram[addr] == 0x2) { - unsigned int src_bank = PEEK2(aptr + 3); - unsigned int src_addr = PEEK2(aptr + 5); - unsigned int dst_bank = PEEK2(aptr + 7); + unsigned short a = addr, c = dst_addr; + if(bank < BANKS_CAP && dst_bank < BANKS_CAP) + for(limit = a + length; a != limit; c++, a++) + uxn.ram[dst_bank + c] = uxn.ram[bank + a]; + } else if(uxn.ram[exp] == 0x2) { + unsigned int dst_bank = PEEK2(aptr + 7) * 0x10000; unsigned int dst_addr = PEEK2(aptr + 9); - unsigned int a = src_bank * 0x10000 + src_addr; - unsigned int b = a + length; - unsigned int c = dst_bank * 0x10000 + dst_addr; - unsigned int d = c + length; - for(; b > a; uxn.ram[--d] = uxn.ram[--b]); + unsigned short a = addr + length - 1, c = dst_addr + length - 1; + if(bank < BANKS_CAP && dst_bank < BANKS_CAP) + for(limit = addr - 1; a != limit; a--, c--) + uxn.ram[dst_bank + c] = uxn.ram[bank + a]; } else - fprintf(stderr, "Unknown command: %s\n", &uxn.ram[addr]); + fprintf(stderr, "Unknown command: %s\n", &uxn.ram[exp]); } /* IO */ diff --git a/src/uxncli.c b/src/uxncli.c index b8ef114..2699efe 100644 --- a/src/uxncli.c +++ b/src/uxncli.c @@ -48,7 +48,7 @@ main(int argc, char **argv) { int i = 1; if(argc == 2 && argv[1][0] == '-' && argv[1][1] == 'v') - return !fprintf(stdout, "Uxn(cli) - Varvara Emulator, 27 Jun 2025.\n"); + return !fprintf(stdout, "Uxn(cli) - Varvara Emulator, 30 Jun 2025.\n"); else if(argc == 1) return !fprintf(stdout, "usage: %s [-v] file.rom [args..]\n", argv[0]); else if(!system_boot((Uint8 *)calloc(PAGE_SIZE * BANKS, sizeof(Uint8)), argv[i++], argc > 2)) diff --git a/src/uxnemu.c b/src/uxnemu.c index de8a19d..6bea293 100644 --- a/src/uxnemu.c +++ b/src/uxnemu.c @@ -469,7 +469,7 @@ main(int argc, char **argv) /* flags */ if(argc > 1 && argv[i][0] == '-') { if(!strcmp(argv[i], "-v")) - return system_error("Uxn(gui) - Varvara Emulator", "27 Jun 2025."); + return system_error("Uxn(gui) - Varvara Emulator", "30 Jun 2025."); else if(!strcmp(argv[i], "-2x")) set_zoom(2, 0); else if(!strcmp(argv[i], "-3x"))