Mercurial > repos > blastem
diff romdb.c @ 767:ea525f600b1d
SRAM detection from ROM header is no working correctly again
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 06 Jul 2015 19:46:46 -0700 |
parents | 1b2f8280ba81 |
children | 2f48a3c187c6 |
line wrap: on
line diff
--- a/romdb.c Sun Jul 05 14:21:34 2015 -0700 +++ b/romdb.c Mon Jul 06 19:46:46 2015 -0700 @@ -20,14 +20,14 @@ { genesis_context * gen = context->system; address &= gen->save_ram_mask; - switch(gen->save_flags) + switch(gen->save_type) { case RAM_FLAG_BOTH: - return gen->save_ram[address] << 8 | gen->save_ram[address+1]; + return gen->save_storage[address] << 8 | gen->save_storage[address+1]; case RAM_FLAG_EVEN: - return gen->save_ram[address >> 1] << 8 | 0xFF; + return gen->save_storage[address >> 1] << 8 | 0xFF; case RAM_FLAG_ODD: - return gen->save_ram[address >> 1] | 0xFF00; + return gen->save_storage[address >> 1] | 0xFF00; } return 0xFFFF;//We should never get here } @@ -36,19 +36,19 @@ { genesis_context * gen = context->system; address &= gen->save_ram_mask; - switch(gen->save_flags) + switch(gen->save_type) { case RAM_FLAG_BOTH: - return gen->save_ram[address]; + return gen->save_storage[address]; case RAM_FLAG_EVEN: if (address & 1) { return 0xFF; } else { - return gen->save_ram[address >> 1]; + return gen->save_storage[address >> 1]; } case RAM_FLAG_ODD: if (address & 1) { - return gen->save_ram[address >> 1]; + return gen->save_storage[address >> 1]; } else { return 0xFF; } @@ -61,17 +61,17 @@ genesis_context * gen = context->system; if ((gen->bank_regs[0] & 0x3) == 1) { address &= gen->save_ram_mask; - switch(gen->save_flags) + switch(gen->save_type) { case RAM_FLAG_BOTH: - gen->save_ram[address] = value >> 8; - gen->save_ram[address+1] = value; + gen->save_storage[address] = value >> 8; + gen->save_storage[address+1] = value; break; case RAM_FLAG_EVEN: - gen->save_ram[address >> 1] = value >> 8; + gen->save_storage[address >> 1] = value >> 8; break; case RAM_FLAG_ODD: - gen->save_ram[address >> 1] = value; + gen->save_storage[address >> 1] = value; break; } } @@ -83,19 +83,19 @@ genesis_context * gen = context->system; if ((gen->bank_regs[0] & 0x3) == 1) { address &= gen->save_ram_mask; - switch(gen->save_flags) + switch(gen->save_type) { case RAM_FLAG_BOTH: - gen->save_ram[address] = value; + gen->save_storage[address] = value; break; case RAM_FLAG_EVEN: if (!(address & 1)) { - gen->save_ram[address >> 1] = value; + gen->save_storage[address >> 1] = value; } break; case RAM_FLAG_ODD: if (address & 1) { - gen->save_ram[address >> 1] = value; + gen->save_storage[address >> 1] = value; } break; } @@ -218,6 +218,13 @@ uint32_t ram_flags = info->save_type = rom[RAM_FLAGS] & RAM_FLAG_MASK; ram_start &= 0xFFFFFE; ram_end |= 1; + info->save_mask = ram_end - ram_start; + uint32_t size = info->save_mask + 1; + if (ram_flags != RAM_FLAG_BOTH) { + size /= 2; + } + info->save_size = size; + info->save_buffer = malloc(size); info->map_chunks = base_chunks + (ram_start >= rom_end ? 2 : 3); info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); @@ -232,18 +239,16 @@ info->map[0].buffer = rom; info->map[1].start = ram_start; - info->map[1].mask = ram_end - ram_start; + info->map[1].mask = info->save_mask; info->map[1].end = ram_end + 1; info->map[1].flags = MMAP_READ | MMAP_WRITE; - uint32_t size = info->map[1].mask + 1; + if (ram_flags == RAM_FLAG_ODD) { info->map[1].flags |= MMAP_ONLY_ODD; - size /= 2; } else if (ram_flags == RAM_FLAG_EVEN) { info->map[1].flags |= MMAP_ONLY_EVEN; - size /= 2; } - info->map[1].buffer = malloc(size); + info->map[1].buffer = info->save_buffer; } else { //Assume the standard Sega mapper info->map[0].end = 0x200000;