# HG changeset patch # User Michael Pavone # Date 1670907079 28800 # Node ID fd68fe5f723e47a86641bcd847e07a69ab4c70f4 # Parent 6a07b13894f75590eb879ae5f021091d8512b642 Add support for mapper used in Super Fighter Team release of Legend of Wukong diff -r 6a07b13894f7 -r fd68fe5f723e Makefile --- 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 diff -r 6a07b13894f7 -r fd68fe5f723e rom.db --- 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 + } + } +} diff -r 6a07b13894f7 -r fd68fe5f723e romdb.c --- 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); diff -r 6a07b13894f7 -r fd68fe5f723e romdb.h --- 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); diff -r 6a07b13894f7 -r fd68fe5f723e sft_mapper.c --- /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); +} diff -r 6a07b13894f7 -r fd68fe5f723e sft_mapper.h --- /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_