diff blastem.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/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");