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)
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;
}
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;
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;
} 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;
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)
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;
}
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;
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 {
if (sslen == 0)
return;
ignore_ws (cc);
- addr = 0;
+ addr = 0xffffffff;
endaddr = lastaddr ();
if (more_params (cc)) {
addr = readhex (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++) {
}
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;