# HG changeset patch # User Michael Pavone # Date 1435894981 25200 # Node ID dc54387ee1cd4bd6508fa85c3e33183ff9f151d4 # Parent bb60259e8edf94682d9b123d18c2f900ad1ce340 Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM. diff -r bb60259e8edf -r dc54387ee1cd blastem.c --- a/blastem.c Thu Jul 02 19:19:06 2015 -0700 +++ b/blastem.c Thu Jul 02 20:43:01 2015 -0700 @@ -1071,9 +1071,6 @@ char *title; -#define TITLE_START 0x150 -#define TITLE_END (TITLE_START+48) - void update_title(char *rom_name) { if (title) { @@ -1083,42 +1080,25 @@ title = alloc_concat(rom_name, " - BlastEm"); } -#define REGION_START 0x1F0 - -int detect_specific_region(char region) +void set_region(rom_info *info, uint8_t region) { - return (cart[REGION_START/2] & 0xFF) == region || (cart[REGION_START/2] >> 8) == region || (cart[REGION_START/2+1] & 0xFF) == region; + if (!region) { + char * def_region = tern_find_ptr(config, "default_region"); + 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; + } } -void detect_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 { - 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; - } - } - } -} #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 @@ 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 @@ 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"); diff -r bb60259e8edf -r dc54387ee1cd romdb.c --- a/romdb.c Thu Jul 02 19:19:06 2015 -0700 +++ b/romdb.c Thu Jul 02 20:43:01 2015 -0700 @@ -4,10 +4,11 @@ #include "romdb.h" #include "util.h" +#define TITLE_START 0x150 +#define TITLE_END (TITLE_START+48) #define GAME_ID_OFF 0x183 #define GAME_ID_LEN 8 -#define TITLE_START 0x150 -#define TITLE_END (TITLE_START+48) +#define REGION_START 0x1F0 tern_node *load_rom_db() { @@ -52,11 +53,37 @@ } } +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 @@ 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 +} diff -r bb60259e8edf -r dc54387ee1cd romdb.h --- a/romdb.h Thu Jul 02 19:19:06 2015 -0700 +++ b/romdb.h Thu Jul 02 20:43:01 2015 -0700 @@ -16,5 +16,6 @@ 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_