changeset 1863:d60f2d7c02a5

Differentiate between the full Sega mapper and the SRAM only one. Fixes crash on save state load for Phantasy Star IV and other games that use the same mapper
author Michael Pavone <pavone@retrodev.com>
date Tue, 14 May 2019 23:20:35 -0700
parents e07fc3d473b2
children 96323d73b8ab 4c322abd9fa5
files romdb.c romdb.h sega_mapper.c
diffstat 3 files changed, 7 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/romdb.c	Wed May 08 23:44:40 2019 -0700
+++ b/romdb.c	Tue May 14 23:20:35 2019 -0700
@@ -77,6 +77,7 @@
 	switch(gen->mapper_type)
 	{
 	case MAPPER_SEGA:
+	case MAPPER_SEGA_SRAM:
 		sega_mapper_serialize(gen, buf);
 		break;
 	case MAPPER_REALTEC:
@@ -96,13 +97,14 @@
 {
 	genesis_context *gen = vcontext;
 	uint8_t mapper_type = load_int8(buf);
-	if (mapper_type != gen->mapper_type) {
-		warning("Mapper type mismatch, skipping load of mapper state");
+	if (mapper_type != gen->mapper_type && (mapper_type != MAPPER_SEGA || gen->mapper_type != MAPPER_SEGA_SRAM)) {
+		warning("Mapper type mismatch, skipping load of mapper state\n");
 		return;
 	}
 	switch(gen->mapper_type)
 	{
 	case MAPPER_SEGA:
+	case MAPPER_SEGA_SRAM:
 		sega_mapper_deserialize(buf, gen);
 		break;
 	case MAPPER_REALTEC:
@@ -365,7 +367,7 @@
 				info->map[1].buffer = info->save_buffer;
 			} else {
 				//Assume the standard Sega mapper
-				info->mapper_type = MAPPER_SEGA;
+				info->mapper_type = MAPPER_SEGA_SRAM;
 				info->map[0].end = 0x200000;
 				info->map[0].mask = 0xFFFFFF;
 				info->map[0].flags = MMAP_READ;
--- a/romdb.h	Wed May 08 23:44:40 2019 -0700
+++ b/romdb.h	Tue May 14 23:20:35 2019 -0700
@@ -43,6 +43,7 @@
 enum {
 	MAPPER_NONE,
 	MAPPER_SEGA,
+	MAPPER_SEGA_SRAM,
 	MAPPER_REALTEC,
 	MAPPER_XBAND,
 	MAPPER_MULTI_GAME,
--- a/sega_mapper.c	Wed May 08 23:44:40 2019 -0700
+++ b/sega_mapper.c	Tue May 14 23:20:35 2019 -0700
@@ -116,7 +116,7 @@
 				context->mem_pointers[gen->mapper_start_index + i] = gen->cart + 0x40000*gen->bank_regs[i];
 			}
 		}
-	} else {
+	} else if (gen->mapper_type == MAPPER_SEGA) {
 		void *new_ptr = gen->cart + 0x40000*value;
 		if (context->mem_pointers[gen->mapper_start_index + address] != new_ptr) {
 			m68k_invalidate_code_range(gen->m68k, address * 0x80000, (address + 1) * 0x80000);