]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Rewrite debugger memory bank scanning.
authorToni Wilen <twilen@winuae.net>
Sun, 29 Sep 2019 15:46:13 +0000 (18:46 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 29 Sep 2019 15:46:13 +0000 (18:46 +0300)
debug.cpp

index dc63871ca9efefd1ffe1af7a4fd79116eaba1a58..ab4b6f57140f349b75b4808e1ae3fc430849c869 100644 (file)
--- 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;