comparison 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
comparison
equal deleted inserted replaced
764:bb60259e8edf 765:dc54387ee1cd
1069 } 1069 }
1070 } 1070 }
1071 1071
1072 char *title; 1072 char *title;
1073 1073
1074 #define TITLE_START 0x150
1075 #define TITLE_END (TITLE_START+48)
1076
1077 void update_title(char *rom_name) 1074 void update_title(char *rom_name)
1078 { 1075 {
1079 if (title) { 1076 if (title) {
1080 free(title); 1077 free(title);
1081 title = NULL; 1078 title = NULL;
1082 } 1079 }
1083 title = alloc_concat(rom_name, " - BlastEm"); 1080 title = alloc_concat(rom_name, " - BlastEm");
1084 } 1081 }
1085 1082
1086 #define REGION_START 0x1F0 1083 void set_region(rom_info *info, uint8_t region)
1087 1084 {
1088 int detect_specific_region(char region) 1085 if (!region) {
1089 { 1086 char * def_region = tern_find_ptr(config, "default_region");
1090 return (cart[REGION_START/2] & 0xFF) == region || (cart[REGION_START/2] >> 8) == region || (cart[REGION_START/2+1] & 0xFF) == region; 1087 if (def_region && (!info->regions || (info->regions & translate_region_char(toupper(*def_region))))) {
1091 } 1088 region = translate_region_char(toupper(*def_region));
1092 1089 } else {
1093 void detect_region() 1090 region = info->regions;
1094 { 1091 }
1095 if (detect_specific_region('U')|| detect_specific_region('B') || detect_specific_region('4')) { 1092 }
1093 if (region & REGION_E) {
1094 version_reg = NO_DISK | EUR;
1095 } else if (region & REGION_J) {
1096 version_reg = NO_DISK | JAP;
1097 } else {
1096 version_reg = NO_DISK | USA; 1098 version_reg = NO_DISK | USA;
1097 } else if (detect_specific_region('J')) { 1099 }
1098 version_reg = NO_DISK | JAP; 1100 }
1099 } else if (detect_specific_region('E') || detect_specific_region('A')) { 1101
1100 version_reg = NO_DISK | EUR;
1101 } else {
1102 char * def_region = tern_find_ptr(config, "default_region");
1103 if (def_region) {
1104 switch(*def_region)
1105 {
1106 case 'j':
1107 case 'J':
1108 version_reg = NO_DISK | JAP;
1109 break;
1110 case 'u':
1111 case 'U':
1112 version_reg = NO_DISK | USA;
1113 break;
1114 case 'e':
1115 case 'E':
1116 version_reg = NO_DISK | EUR;
1117 break;
1118 }
1119 }
1120 }
1121 }
1122 #ifndef NO_Z80 1102 #ifndef NO_Z80
1123 const memmap_chunk z80_map[] = { 1103 const memmap_chunk z80_map[] = {
1124 { 0x0000, 0x4000, 0x1FFF, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, z80_ram, NULL, NULL, NULL, NULL }, 1104 { 0x0000, 0x4000, 0x1FFF, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, z80_ram, NULL, NULL, NULL, NULL },
1125 { 0x8000, 0x10000, 0x7FFF, 0, 0, NULL, NULL, NULL, z80_read_bank, z80_write_bank}, 1105 { 0x8000, 0x10000, 0x7FFF, 0, 0, NULL, NULL, NULL, z80_read_bank, z80_write_bank},
1126 { 0x4000, 0x6000, 0x0003, 0, 0, NULL, NULL, NULL, z80_read_ym, z80_write_ym}, 1106 { 0x4000, 0x6000, 0x0003, 0, 0, NULL, NULL, NULL, z80_read_ym, z80_write_ym},
1187 i++; 1167 i++;
1188 if (i >= argc) { 1168 if (i >= argc) {
1189 fputs("-r must be followed by region (J, U or E)\n", stderr); 1169 fputs("-r must be followed by region (J, U or E)\n", stderr);
1190 return 1; 1170 return 1;
1191 } 1171 }
1192 switch (argv[i][0]) 1172 force_version = translate_region_char(toupper(argv[i][0]));
1193 { 1173 if (!force_version) {
1194 case 'j':
1195 case 'J':
1196 force_version = NO_DISK | JAP;
1197 break;
1198 case 'u':
1199 case 'U':
1200 force_version = NO_DISK | USA;
1201 break;
1202 case 'e':
1203 case 'E':
1204 force_version = NO_DISK | EUR;
1205 break;
1206 default:
1207 fprintf(stderr, "'%c' is not a valid region character for the -r option\n", argv[i][0]); 1174 fprintf(stderr, "'%c' is not a valid region character for the -r option\n", argv[i][0]);
1208 return 1; 1175 return 1;
1209 } 1176 }
1210 break; 1177 break;
1211 case 's': 1178 case 's':
1257 return 1; 1224 return 1;
1258 } 1225 }
1259 tern_node *rom_db = load_rom_db(); 1226 tern_node *rom_db = load_rom_db();
1260 rom_info info = configure_rom(rom_db, cart); 1227 rom_info info = configure_rom(rom_db, cart);
1261 byteswap_rom(); 1228 byteswap_rom();
1262 if (force_version) { 1229 set_region(&info, force_version);
1263 version_reg = force_version;
1264 } else {
1265 detect_region();
1266 }
1267 update_title(info.name); 1230 update_title(info.name);
1268 int def_width = 0; 1231 int def_width = 0;
1269 char *config_width = tern_find_ptr(config, "videowidth"); 1232 char *config_width = tern_find_ptr(config, "videowidth");
1270 if (config_width) { 1233 if (config_width) {
1271 def_width = atoi(config_width); 1234 def_width = atoi(config_width);