Mercurial > repos > blastem
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); |