changeset 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
files blastem.c romdb.c romdb.h
diffstat 3 files changed, 69 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
--- 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");
--- 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
+}
--- 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_