changeset 2150:a418fa599b2e

Add ROM DB entry to fix SRAM on Triple Play: Gold Edition and make some code changes so that 3MB dumps will work too
author Michael Pavone <pavone@retrodev.com>
date Wed, 30 Mar 2022 23:15:45 -0700
parents 9209858b2f74
children 01ad74197414
files genesis.c rom.db romdb.c
diffstat 3 files changed, 40 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/genesis.c	Sat Mar 26 23:05:08 2022 -0700
+++ b/genesis.c	Wed Mar 30 23:15:45 2022 -0700
@@ -1943,9 +1943,9 @@
 	rom = info.rom;
 	rom_size = info.rom_size;
 #ifndef BLASTEM_BIG_ENDIAN
-	byteswap_rom(rom_size, rom);
+	byteswap_rom(nearest_pow2(rom_size), rom);
 	if (lock_on) {
-		byteswap_rom(lock_on_size, lock_on);
+		byteswap_rom(nearest_pow2(lock_on_size), lock_on);
 	}
 #endif
 	char *m68k_divider = tern_find_path(config, "clocks\0m68k_divider\0", TVAL_PTR).ptrval;
--- a/rom.db	Sat Mar 26 23:05:08 2022 -0700
+++ b/rom.db	Wed Mar 30 23:15:45 2022 -0700
@@ -1421,3 +1421,26 @@
 		2 gamepad3.2
 	}
 }
+T-172116 {
+	name Triple Play: Gold Edition
+	SRAM {
+		size 32768
+		bus odd
+	}
+	map {
+		0 {
+			device ROM
+			last 1FFFFF
+		}
+		200000 {
+			device SRAM
+			last 2FFFFF
+			mask FFFF
+		}
+		300000 {
+			device ROM
+			last 3FFFFF
+			offset 300000
+		}
+	}
+}
--- a/romdb.c	Sat Mar 26 23:05:08 2022 -0700
+++ b/romdb.c	Wed Mar 30 23:15:45 2022 -0700
@@ -695,8 +695,12 @@
 	map->start = start;
 	map->end = end + 1;
 	if (!strcmp(dtype, "ROM")) {
+		uint32_t expanded_size = nearest_pow2(state->rom_size);
+		if (offset >= expanded_size) {
+			fatal_error("offset of %X is invalid for ROM size of %X in map entry %d with addess %s\n", offset, state->rom_size, state->index, key);
+		}
 		map->buffer = state->rom + offset;
-		map->mask = calc_mask(state->rom_size - offset, start, end);
+		map->mask = calc_mask(nearest_pow2(state->rom_size) - offset, start, end);
 		if (strcmp(tern_find_ptr_default(node, "writeable", "no"), "yes")) {
 			map->flags = MMAP_READ;
 		} else {
@@ -956,6 +960,16 @@
 {
 	uint8_t product_id[GAME_ID_LEN+1];
 	uint8_t *rom = vrom;
+	uint32_t expanded_size = nearest_pow2(rom_size);
+	if (expanded_size > rom_size) {
+		//generally carts with odd-sized ROMs have 2 power of 2 sized ROMs with the larger one first
+		//TODO: Handle cases in which the 2nd ROM/part is a maller power of 2 than just half the first one
+		uint32_t mirror_start = expanded_size >> 1;
+		uint32_t mirror_size = expanded_size >> 2;
+		if (mirror_start + mirror_size >= rom_size) {
+			memcpy(rom + mirror_start + mirror_size, rom + mirror_start, mirror_size);
+		}
+	}
 	product_id[GAME_ID_LEN] = 0;
 	for (int i = 0; i < GAME_ID_LEN; i++)
 	{