summaryrefslogtreecommitdiff
path: root/romdb.c
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2015-07-02 20:43:01 -0700
committerMichael Pavone <pavone@retrodev.com>2015-07-02 20:43:01 -0700
commit249115277c7f488052e07ccbd91f0df9f24f26b7 (patch)
treeef01d1239226a61ff9c757fe775d444941c8bc36 /romdb.c
parent8f0979a2c4db824e91ead3290d8088d97b20e189 (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.c54
1 files changed, 49 insertions, 5 deletions
diff --git a/romdb.c b/romdb.c
index 0de4af5..fbfcef9 100644
--- a/romdb.c
+++ b/romdb.c
@@ -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
+}