Mercurial > repos > blastem
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); |