changeset 2253:fd68fe5f723e

Add support for mapper used in Super Fighter Team release of Legend of Wukong
author Michael Pavone <pavone@retrodev.com>
date Mon, 12 Dec 2022 20:51:19 -0800
parents 6a07b13894f7
children 8b88d57d1218
files Makefile rom.db romdb.c romdb.h sft_mapper.c sft_mapper.h
diffstat 6 files changed, 83 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Tue Nov 29 21:04:57 2022 -0800
+++ b/Makefile	Mon Dec 12 20:51:19 2022 -0800
@@ -215,12 +215,12 @@
 MAINOBJS=blastem.o system.o genesis.o debug.o gdb_remote.o vdp.o $(RENDEROBJS) io.o romdb.o hash.o menu.o xband.o \
 	realtec.o i2c.o nor.o sega_mapper.o multi_game.o megawifi.o $(NET) serialize.o $(TERMINAL) $(CONFIGOBJS) gst.o \
 	$(M68KOBJS) $(TRANSOBJS) $(AUDIOOBJS) saves.o zip.o bindings.o jcart.o gen_player.o \
-	segacd.o lc8951.o cdimage.o cdd_mcu.o cd_graphics.o cdd_fader.o
+	segacd.o lc8951.o cdimage.o cdd_mcu.o cd_graphics.o cdd_fader.o sft_mapper.o
 
 LIBOBJS=libblastem.o system.o genesis.o debug.o gdb_remote.o vdp.o io.o romdb.o hash.o xband.o realtec.o \
 	i2c.o nor.o sega_mapper.o multi_game.o megawifi.o $(NET) serialize.o $(TERMINAL) $(CONFIGOBJS) gst.o \
 	$(M68KOBJS) $(TRANSOBJS) $(AUDIOOBJS) saves.o jcart.o rom.db.o gen_player.o $(LIBZOBJS) \
-	segacd.o lc8951.o cdimage.o cdd_mcu.o cd_graphics.o cdd_fader.o
+	segacd.o lc8951.o cdimage.o cdd_mcu.o cd_graphics.o cdd_fader.o sft_mapper.o
 
 ifdef NONUKLEAR
 CFLAGS+= -DDISABLE_NUKLEAR
--- a/rom.db	Tue Nov 29 21:04:57 2022 -0800
+++ b/rom.db	Mon Dec 12 20:51:19 2022 -0800
@@ -1508,3 +1508,25 @@
 		}
 	}
 }
+SF-002 {
+	name Legend of Wukong
+	SRAM {
+		size 8192
+		bus odd
+	}
+	map {
+		0 {
+			device sft-wukong-fixed
+			last 1FFFFF
+		}
+		200000 {
+			device sft-wukong-remap
+			offset 200000
+			last 3BFFFF
+		}
+		3C0000 {
+			device SRAM
+			last 3FFFFF
+		}
+	}
+}
--- a/romdb.c	Tue Nov 29 21:04:57 2022 -0800
+++ b/romdb.c	Mon Dec 12 20:51:19 2022 -0800
@@ -14,6 +14,7 @@
 #include "megawifi.h"
 #include "jcart.h"
 #include "blastem.h"
+#include "sft_mapper.h"
 
 #define DOM_TITLE_START 0x120
 #define DOM_TITLE_END 0x150
@@ -980,6 +981,22 @@
 		map->read_16 = jcart_read_w;
 		map->read_8 = jcart_read_b;
 		map->mask = 0xFFFFFF;
+	} else if (!strcmp(dtype, "sft-wukong-fixed") || !strcmp(dtype, "sft-wukong-remap")) {
+		state->info->mapper_type = MAPPER_SFT_WUKONG;
+		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(nearest_pow2(state->rom_size) - offset, start, end);
+		map->write_8 = sft_wukong_write_b;
+		map->write_16 = sft_wukong_write_w;
+		if (!strcmp(dtype, "sft-wukong-remap")) {
+			map->flags = MMAP_READ | MMAP_CODE | MMAP_PTR_IDX;
+			state->info->mapper_start_index = state->ptr_index++;
+		} else {
+			map->flags = MMAP_READ;
+		}
 	} else {
 		fatal_error("Invalid device type %s for ROM DB map entry %d with address %s\n", dtype, state->index, key);
 	}
@@ -1003,7 +1020,7 @@
 	product_id[GAME_ID_LEN] = 0;
 	for (int i = 0; i < GAME_ID_LEN; i++)
 	{
-		if (rom[GAME_ID_OFF + i] <= ' ') {
+		if (i >= 3 && rom[GAME_ID_OFF + i] <= ' ') {
 			product_id[i] = 0;
 			break;
 		}
@@ -1021,6 +1038,9 @@
 		entry = tern_find_node(rom_db, product_id);
 	}
 	if (!entry) {
+		entry = tern_find_node(rom_db, product_id + 3);
+	}
+	if (!entry) {
 		debug_message("Not found in ROM DB, examining header\n\n");
 		if (xband_detect(rom, rom_size)) {
 			return xband_configure_rom(rom_db, rom, rom_size, lock_on, lock_on_size, base_map, base_chunks);
--- a/romdb.h	Tue Nov 29 21:04:57 2022 -0800
+++ b/romdb.h	Mon Dec 12 20:51:19 2022 -0800
@@ -49,7 +49,8 @@
 	MAPPER_XBAND,
 	MAPPER_MULTI_GAME,
 	MAPPER_JCART,
-	MAPPER_SEGA_MED_V2
+	MAPPER_SEGA_MED_V2,
+	MAPPER_SFT_WUKONG
 };
 
 
@@ -82,8 +83,8 @@
 	uint8_t       wants_cd;
 };
 
-#define GAME_ID_OFF 0x183
-#define GAME_ID_LEN 8
+#define GAME_ID_OFF 0x180
+#define GAME_ID_LEN 11
 
 tern_node *get_rom_db();
 rom_info configure_rom(tern_node *rom_db, void *vrom, uint32_t rom_size, void *lock_on, uint32_t lock_on_size, memmap_chunk const *base_map, uint32_t base_chunks);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sft_mapper.c	Mon Dec 12 20:51:19 2022 -0800
@@ -0,0 +1,27 @@
+#include "genesis.h"
+
+void* sft_wukong_write_b(uint32_t address, void *context, uint8_t value)
+{
+	if (!(address & 1)) {
+		return context;
+	}
+	m68k_context *m68k = context;
+	genesis_context *gen = m68k->system;
+	printf("wukong mapper write: %X - %X\n", address, value);
+	uint16_t *old = m68k->mem_pointers[gen->mapper_start_index];
+	if (value & 0x80) {
+		m68k->mem_pointers[gen->mapper_start_index] = gen->cart;
+	} else {
+		m68k->mem_pointers[gen->mapper_start_index] = gen->cart + 1 * 1024 * 1024;
+	}
+	if (old != m68k->mem_pointers[gen->mapper_start_index]) {
+		m68k_invalidate_code_range(m68k, 0x200000, 0x3C0000);
+	}
+
+	return context;
+}
+
+void* sft_wukong_write_w(uint32_t address, void *context, uint16_t value)
+{
+	return sft_wukong_write_b(address | 1, context, value);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sft_mapper.h	Mon Dec 12 20:51:19 2022 -0800
@@ -0,0 +1,7 @@
+#ifndef SFT_MAPPER_H_
+#define SFT_MAPPER_H_
+
+void* sft_wukong_write_b(uint32_t address, void *context, uint8_t value);
+void* sft_wukong_write_w(uint32_t address, void *context, uint16_t value);
+
+#endif // SFT_MAPPER_H_