Mercurial > repos > blastem
diff romdb.c @ 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 | 0bf077df45c3 |
children | 8016dbb0fcde |
line wrap: on
line diff
--- 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);