comparison 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
comparison
equal deleted inserted replaced
2252:6a07b13894f7 2253:fd68fe5f723e
12 #include "sega_mapper.h" 12 #include "sega_mapper.h"
13 #include "multi_game.h" 13 #include "multi_game.h"
14 #include "megawifi.h" 14 #include "megawifi.h"
15 #include "jcart.h" 15 #include "jcart.h"
16 #include "blastem.h" 16 #include "blastem.h"
17 #include "sft_mapper.h"
17 18
18 #define DOM_TITLE_START 0x120 19 #define DOM_TITLE_START 0x120
19 #define DOM_TITLE_END 0x150 20 #define DOM_TITLE_END 0x150
20 #define TITLE_START DOM_TITLE_END 21 #define TITLE_START DOM_TITLE_END
21 #define TITLE_END (TITLE_START+48) 22 #define TITLE_END (TITLE_START+48)
978 map->write_16 = jcart_write_w; 979 map->write_16 = jcart_write_w;
979 map->write_8 = jcart_write_b; 980 map->write_8 = jcart_write_b;
980 map->read_16 = jcart_read_w; 981 map->read_16 = jcart_read_w;
981 map->read_8 = jcart_read_b; 982 map->read_8 = jcart_read_b;
982 map->mask = 0xFFFFFF; 983 map->mask = 0xFFFFFF;
984 } else if (!strcmp(dtype, "sft-wukong-fixed") || !strcmp(dtype, "sft-wukong-remap")) {
985 state->info->mapper_type = MAPPER_SFT_WUKONG;
986 uint32_t expanded_size = nearest_pow2(state->rom_size);
987 if (offset >= expanded_size) {
988 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);
989 }
990 map->buffer = state->rom + offset;
991 map->mask = calc_mask(nearest_pow2(state->rom_size) - offset, start, end);
992 map->write_8 = sft_wukong_write_b;
993 map->write_16 = sft_wukong_write_w;
994 if (!strcmp(dtype, "sft-wukong-remap")) {
995 map->flags = MMAP_READ | MMAP_CODE | MMAP_PTR_IDX;
996 state->info->mapper_start_index = state->ptr_index++;
997 } else {
998 map->flags = MMAP_READ;
999 }
983 } else { 1000 } else {
984 fatal_error("Invalid device type %s for ROM DB map entry %d with address %s\n", dtype, state->index, key); 1001 fatal_error("Invalid device type %s for ROM DB map entry %d with address %s\n", dtype, state->index, key);
985 } 1002 }
986 state->index++; 1003 state->index++;
987 } 1004 }
1001 } 1018 }
1002 } 1019 }
1003 product_id[GAME_ID_LEN] = 0; 1020 product_id[GAME_ID_LEN] = 0;
1004 for (int i = 0; i < GAME_ID_LEN; i++) 1021 for (int i = 0; i < GAME_ID_LEN; i++)
1005 { 1022 {
1006 if (rom[GAME_ID_OFF + i] <= ' ') { 1023 if (i >= 3 && rom[GAME_ID_OFF + i] <= ' ') {
1007 product_id[i] = 0; 1024 product_id[i] = 0;
1008 break; 1025 break;
1009 } 1026 }
1010 product_id[i] = rom[GAME_ID_OFF + i]; 1027 product_id[i] = rom[GAME_ID_OFF + i];
1011 1028
1017 bin_to_hex(hex_hash, raw_hash, 20); 1034 bin_to_hex(hex_hash, raw_hash, 20);
1018 debug_message("SHA1: %s\n", hex_hash); 1035 debug_message("SHA1: %s\n", hex_hash);
1019 tern_node * entry = tern_find_node(rom_db, hex_hash); 1036 tern_node * entry = tern_find_node(rom_db, hex_hash);
1020 if (!entry) { 1037 if (!entry) {
1021 entry = tern_find_node(rom_db, product_id); 1038 entry = tern_find_node(rom_db, product_id);
1039 }
1040 if (!entry) {
1041 entry = tern_find_node(rom_db, product_id + 3);
1022 } 1042 }
1023 if (!entry) { 1043 if (!entry) {
1024 debug_message("Not found in ROM DB, examining header\n\n"); 1044 debug_message("Not found in ROM DB, examining header\n\n");
1025 if (xband_detect(rom, rom_size)) { 1045 if (xband_detect(rom, rom_size)) {
1026 return xband_configure_rom(rom_db, rom, rom_size, lock_on, lock_on_size, base_map, base_chunks); 1046 return xband_configure_rom(rom_db, rom, rom_size, lock_on, lock_on_size, base_map, base_chunks);