From dc0b596e2d9fce961c67f1395f5432a6c9d4d683 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 29 Sep 2019 18:46:13 +0300 Subject: [PATCH] Rewrite debugger memory bank scanning. --- debug.cpp | 187 ++++++++++++++++-------------------------------------- 1 file changed, 53 insertions(+), 134 deletions(-) diff --git a/debug.cpp b/debug.cpp index dc63871c..ab4b6f57 100644 --- a/debug.cpp +++ b/debug.cpp @@ -1034,141 +1034,60 @@ int notinrom (void) static uae_u32 lastaddr (void) { - for (int i = MAX_RAM_BOARDS - 1; i >= 0; i--) { - if (currprefs.z3fastmem[i].size) - return z3fastmem_bank[i].start + currprefs.z3fastmem[i].size; - } - if (currprefs.z3chipmem_size) - return z3chipmem_bank.start + currprefs.z3chipmem_size; - if (currprefs.mbresmem_high_size) - return a3000hmem_bank.start + currprefs.mbresmem_high_size; - if (currprefs.mbresmem_low_size) - return a3000lmem_bank.start + currprefs.mbresmem_low_size; - if (currprefs.bogomem_size) - return bogomem_bank.start + currprefs.bogomem_size; - for (int i = MAX_RAM_BOARDS - 1; i >= 0; i--) { - if (currprefs.fastmem[i].size) - return fastmem_bank[i].start + currprefs.fastmem[i].size; + int lastbank = currprefs.address_space_24 ? 255 : 65535; + + for (int i = lastbank; i >= 0; i--) { + addrbank *ab = get_mem_bank_real(i << 16); + if (ab->baseaddr && (ab->flags & ABFLAG_RAM)) { + return (i + 1) << 16; + } } - return currprefs.chipmem_size; + return 0; } -static uaecptr nextaddr2 (uaecptr addr, int *next) +static uaecptr nextaddr (uaecptr addr, uaecptr last, uaecptr *endp, bool verbose) { - uaecptr prev, prevx; - int size, sizex; + addrbank *ab; + int lastbank = currprefs.address_space_24 ? 255 : 65535; - if (addr >= lastaddr ()) { - *next = -1; - return 0xffffffff; + if (addr != 0xffffffff) { + addr++; + ab = get_mem_bank_real(addr); + if (ab->baseaddr && (ab->flags & ABFLAG_RAM)) + return addr; + } else { + addr = 0; } - prev = currprefs.z3autoconfig_start + currprefs.z3fastmem[0].size; - size = currprefs.z3fastmem[1].size; - if (currprefs.z3fastmem[0].size) { - prevx = prev; - sizex = size; - size = currprefs.z3fastmem[0].size; - prev = z3fastmem_bank[0].start; - if (addr == prev + size) { - *next = prevx + sizex; - return prevx; - } + while (addr < (lastbank << 16)) { + ab = get_mem_bank_real(addr); + if (ab->baseaddr && (ab->flags & ABFLAG_RAM)) + break; + addr += 65536; } - if (currprefs.z3chipmem_size) { - prevx = prev; - sizex = size; - size = currprefs.z3chipmem_size; - prev = z3chipmem_bank.start; - if (addr == prev + size) { - *next = prevx + sizex; - return prevx; - } - } - if (currprefs.mbresmem_high_size) { - sizex = size; - prevx = prev; - size = currprefs.mbresmem_high_size; - prev = a3000hmem_bank.start; - if (addr == prev + size) { - *next = prevx + sizex; - return prevx; - } - } - if (currprefs.mbresmem_low_size) { - prevx = prev; - sizex = size; - size = currprefs.mbresmem_low_size; - prev = a3000lmem_bank.start; - if (addr == prev + size) { - *next = prevx + sizex; - return prevx; - } - } - if (currprefs.bogomem_size) { - sizex = size; - prevx = prev; - size = currprefs.bogomem_size; - prev = bogomem_bank.start; - if (addr == prev + size) { - *next = prevx + sizex; - return prevx; - } - } - if (currprefs.fastmem[0].size) { - sizex = size; - prevx = prev; - size = currprefs.fastmem[0].size; - prev = fastmem_bank[0].start; - if (addr == prev + size) { - *next = prevx + sizex; - return prevx; - } - } - sizex = size; - prevx = prev; - size = currprefs.chipmem_size; - if (addr == size) { - *next = prevx + sizex; - return prevx; - } - if (addr == 1) - *next = size; - return addr; -} - -static uaecptr nextaddr (uaecptr addr, uaecptr last, uaecptr *end) -{ - static uaecptr old; - int next = last; - if (last && addr >= last) { - old = 0xffffffff; + if (addr >= (lastbank << 16)) { + if (endp) + *endp = 0xffffffff; return 0xffffffff; } - if (addr == 0xffffffff) { - if (end) - *end = currprefs.chipmem_size; - return 0; - } - if (end) - next = *end; - addr = nextaddr2 (addr + 1, &next); - if (end) - *end = next; - if (old != next) { - if (addr != 0xffffffff) - console_out_f (_T("Scanning.. %08x - %08x (%s)\n"), addr & 0xffffff00, next, get_mem_bank (addr).name); - old = next; + + uaecptr start = addr; + + while (addr <= (lastbank << 16)) { + ab = get_mem_bank_real(addr); + if ((last && last != 0xffffffff && addr >= last) || !ab->baseaddr || !(ab->flags & ABFLAG_RAM)) { + if (endp) + *endp = addr; + break; + } + addr += 65536; } -#if 0 - if (next && addr != 0xffffffff) { - uaecptr xa = addr; - if (xa == 1) - xa = 0; - console_out_f ("%08X -> %08X (%08X)...\n", xa, xa + next - 1, next); + + if (verbose) { + console_out_f(_T("Scanning.. %08x - %08x (%s)\n"), start, addr, get_mem_bank(start).name); } -#endif - return addr; + + return start; } uaecptr dumpmem2 (uaecptr addr, TCHAR *out, int osize) @@ -2372,7 +2291,7 @@ static void deepcheatsearch (TCHAR **c) xfree (memtmp); memsize = 0; addr = 0xffffffff; - while ((addr = nextaddr (addr, 0, &end)) != 0xffffffff) { + while ((addr = nextaddr (addr, 0, &end, false)) != 0xffffffff) { memsize += end - addr; addr = end - 1; } @@ -2383,7 +2302,7 @@ static void deepcheatsearch (TCHAR **c) memset (memtmp + memsize, 0xff, memsize2); p1 = memtmp; addr = 0xffffffff; - while ((addr = nextaddr (addr, 0, &end)) != 0xffffffff) { + while ((addr = nextaddr (addr, 0, &end, true)) != 0xffffffff) { for (i = addr; i < end; i++) *p1++ = get_byte_debug (i); addr = end - 1; @@ -2403,7 +2322,7 @@ static void deepcheatsearch (TCHAR **c) addrcnt = 0; cnt = 0; addr = 0xffffffff; - while ((addr = nextaddr (addr, 0, NULL)) != 0xffffffff) { + while ((addr = nextaddr (addr, 0, NULL, true)) != 0xffffffff) { uae_s32 b, b2; int doremove = 0; int addroff = addrcnt >> 3; @@ -2446,7 +2365,7 @@ static void deepcheatsearch (TCHAR **c) } else { p1[addrcnt] = b >> 8; p1[addrcnt + 1] = b >> 0; - addr = nextaddr (addr, 0, NULL); + addr = nextaddr (addr, 0, NULL, true); if (addr == 0xffffffff) break; addrcnt += 2; @@ -2463,7 +2382,7 @@ static void deepcheatsearch (TCHAR **c) cnt = 0; addrcnt = 0; addr = 0xffffffff; - while ((addr = nextaddr(addr, 0, NULL)) != 0xffffffff) { + while ((addr = nextaddr(addr, 0, NULL, true)) != 0xffffffff) { int addroff = addrcnt >> 3; int addrmask = (size == 1 ? 1 : 3) << (addrcnt & 7); if (p2[addroff] & addrmask) @@ -2492,7 +2411,7 @@ static void cheatsearch (TCHAR **c) memsize = 0; addr = 0xffffffff; - while ((addr = nextaddr (addr, 0, &end)) != 0xffffffff) { + while ((addr = nextaddr (addr, 0, &end, false)) != 0xffffffff) { memsize += end - addr; addr = end - 1; } @@ -2526,7 +2445,7 @@ static void cheatsearch (TCHAR **c) clearcheater (); addr = 0xffffffff; prevmemcnt = memcnt = 0; - while ((addr = nextaddr (addr, 0, &end)) != 0xffffffff) { + while ((addr = nextaddr (addr, 0, &end, true)) != 0xffffffff) { if (addr + size < end) { for (i = 0; i < size; i++) { int shift = (size - i - 1) * 8; @@ -2612,7 +2531,7 @@ static void illg_init (void) return; } addr = 0xffffffff; - while ((addr = nextaddr (addr, 0, &end)) != 0xffffffff) { + while ((addr = nextaddr (addr, 0, &end, false)) != 0xffffffff) { if (end < 0x01000000) { memset (illgdebug + addr, c, end - addr); } else { @@ -4930,7 +4849,7 @@ static void searchmem (TCHAR **cc) if (sslen == 0) return; ignore_ws (cc); - addr = 0; + addr = 0xffffffff; endaddr = lastaddr (); if (more_params (cc)) { addr = readhex (cc); @@ -4938,7 +4857,7 @@ static void searchmem (TCHAR **cc) endaddr = readhex (cc); } console_out_f (_T("Searching from %08X to %08X..\n"), addr, endaddr); - while ((addr = nextaddr (addr, endaddr, NULL)) != 0xffffffff) { + while ((addr = nextaddr (addr, endaddr, NULL, true)) != 0xffffffff) { if (addr == endaddr) break; for (i = 0; i < sslen; i++) { @@ -5296,7 +5215,7 @@ static void find_ea (TCHAR **inptr) } console_out_f (_T("Searching from %08X to %08X\n"), addr, end); end2 = 0; - while((addr = nextaddr (addr, end, &end2)) != 0xffffffff) { + while((addr = nextaddr (addr, end, &end2, true)) != 0xffffffff) { if ((addr & 1) == 0 && addr + 6 <= end2) { sea = 0xffffffff; dea = 0xffffffff; -- 2.47.3