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 /romdb.c | |
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.
Diffstat (limited to 'romdb.c')
-rw-r--r-- | romdb.c | 54 |
1 files changed, 49 insertions, 5 deletions
@@ -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 +} |