diff options
author | Michael Pavone <pavone@retrodev.com> | 2015-07-02 20:43:01 -0700 |
---|---|---|
committer | Michael Pavone <pavone@retrodev.com> | 2015-07-02 20:43:01 -0700 |
commit | 249115277c7f488052e07ccbd91f0df9f24f26b7 (patch) | |
tree | ef01d1239226a61ff9c757fe775d444941c8bc36 | |
parent | 8f0979a2c4db824e91ead3290d8088d97b20e189 (diff) |
Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
-rw-r--r-- | blastem.c | 71 | ||||
-rw-r--r-- | romdb.c | 54 | ||||
-rw-r--r-- | romdb.h | 1 |
3 files changed, 67 insertions, 59 deletions
@@ -1071,9 +1071,6 @@ void init_run_cpu(genesis_context * gen, FILE * address_log, char * statefile, u char *title; -#define TITLE_START 0x150 -#define TITLE_END (TITLE_START+48) - void update_title(char *rom_name) { if (title) { @@ -1083,42 +1080,25 @@ void update_title(char *rom_name) title = alloc_concat(rom_name, " - BlastEm"); } -#define REGION_START 0x1F0 - -int detect_specific_region(char region) -{ - return (cart[REGION_START/2] & 0xFF) == region || (cart[REGION_START/2] >> 8) == region || (cart[REGION_START/2+1] & 0xFF) == region; -} - -void detect_region() +void set_region(rom_info *info, uint8_t region) { - if (detect_specific_region('U')|| detect_specific_region('B') || detect_specific_region('4')) { - version_reg = NO_DISK | USA; - } else if (detect_specific_region('J')) { - version_reg = NO_DISK | JAP; - } else if (detect_specific_region('E') || detect_specific_region('A')) { - version_reg = NO_DISK | EUR; - } else { + if (!region) { char * def_region = tern_find_ptr(config, "default_region"); - if (def_region) { - switch(*def_region) - { - case 'j': - case 'J': - version_reg = NO_DISK | JAP; - break; - case 'u': - case 'U': - version_reg = NO_DISK | USA; - break; - case 'e': - case 'E': - version_reg = NO_DISK | EUR; - break; - } + if (def_region && (!info->regions || (info->regions & translate_region_char(toupper(*def_region))))) { + region = translate_region_char(toupper(*def_region)); + } else { + region = info->regions; } } + if (region & REGION_E) { + version_reg = NO_DISK | EUR; + } else if (region & REGION_J) { + version_reg = NO_DISK | JAP; + } else { + version_reg = NO_DISK | USA; + } } + #ifndef NO_Z80 const memmap_chunk z80_map[] = { { 0x0000, 0x4000, 0x1FFF, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, z80_ram, NULL, NULL, NULL, NULL }, @@ -1189,21 +1169,8 @@ int main(int argc, char ** argv) fputs("-r must be followed by region (J, U or E)\n", stderr); return 1; } - switch (argv[i][0]) - { - case 'j': - case 'J': - force_version = NO_DISK | JAP; - break; - case 'u': - case 'U': - force_version = NO_DISK | USA; - break; - case 'e': - case 'E': - force_version = NO_DISK | EUR; - break; - default: + force_version = translate_region_char(toupper(argv[i][0])); + if (!force_version) { fprintf(stderr, "'%c' is not a valid region character for the -r option\n", argv[i][0]); return 1; } @@ -1259,11 +1226,7 @@ int main(int argc, char ** argv) tern_node *rom_db = load_rom_db(); rom_info info = configure_rom(rom_db, cart); byteswap_rom(); - if (force_version) { - version_reg = force_version; - } else { - detect_region(); - } + set_region(&info, force_version); update_title(info.name); int def_width = 0; char *config_width = tern_find_ptr(config, "videowidth"); @@ -4,10 +4,11 @@ #include "romdb.h" #include "util.h" -#define GAME_ID_OFF 0x183 -#define GAME_ID_LEN 8 #define TITLE_START 0x150 #define TITLE_END (TITLE_START+48) +#define GAME_ID_OFF 0x183 +#define GAME_ID_LEN 8 +#define REGION_START 0x1F0 tern_node *load_rom_db() { @@ -52,11 +53,37 @@ char *get_header_name(uint8_t *rom) } } +char *region_chars = "UB4JEA"; +uint8_t region_bits[] = {REGION_U, REGION_U, REGION_U, REGION_J, REGION_E, REGION_E}; + +uint8_t translate_region_char(uint8_t c) +{ + for (int i = 0; i < sizeof(region_bits); i++) + { + if (c == region_chars[i]) { + return region_bits[i]; + } + } + return 0; +} + +uint8_t get_header_regions(uint8_t *rom) +{ + uint8_t regions = 0; + for (int i = 0; i < 3; i++) + { + regions |= translate_region_char(rom[REGION_START + i]); + } + return regions; +} + + rom_info configure_rom_heuristics(uint8_t *rom) { rom_info info; info.name = get_header_name(rom); - + info.regions = get_header_regions(rom); + return info; } rom_info configure_rom(tern_node *rom_db, void *vrom) @@ -78,6 +105,23 @@ rom_info configure_rom(tern_node *rom_db, void *vrom) return configure_rom_heuristics(rom); } rom_info info; - info.name = strdup(tern_find_ptr_default(entry, "name", "UNKNOWN")); + info.name = tern_find_ptr(entry, "name"); + if (info.name) { + info.name = strdup(info.name); + } else { + info.name = get_header_name(rom); + } + + char *dbreg = tern_find_ptr(entry, "regions"); + info.regions = 0; + if (dbreg) { + while (*dbreg != 0) + { + info.regions |= translate_region_char(*(dbreg++)); + } + } + if (!info.regions) { + info.regions = get_header_regions(rom); + } return info; -}
\ No newline at end of file +} @@ -16,5 +16,6 @@ typedef struct { tern_node *load_rom_db(); rom_info configure_rom(tern_node *rom_db, void *vrom); +uint8_t translate_region_char(uint8_t c); #endif //ROMDB_H_ |