diff romdb.c @ 765:dc54387ee1cd

Allow regions to be set in ROM DB. Prefer default region if it is one of the valid regions for the ROM.
author Michael Pavone <pavone@retrodev.com>
date Thu, 02 Jul 2015 20:43:01 -0700
parents bb60259e8edf
children 1b2f8280ba81
line wrap: on
line diff
--- 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
+}