summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blastem.c71
-rw-r--r--romdb.c54
-rw-r--r--romdb.h1
3 files changed, 67 insertions, 59 deletions
diff --git a/blastem.c b/blastem.c
index 4d7f7cb..727a2d4 100644
--- a/blastem.c
+++ b/blastem.c
@@ -1071,9 +1071,6 @@ void init_run_cpu(genesis_context * gen, FILE * address_log, char * statefile, u
char *title;
-#define TITLE_START 0x150
-#define TITLE_END (TITLE_START+48)
-
void update_title(char *rom_name)
{
if (title) {
@@ -1083,42 +1080,25 @@ void update_title(char *rom_name)
title = alloc_concat(rom_name, " - BlastEm");
}
-#define REGION_START 0x1F0
-
-int detect_specific_region(char region)
-{
- return (cart[REGION_START/2] & 0xFF) == region || (cart[REGION_START/2] >> 8) == region || (cart[REGION_START/2+1] & 0xFF) == region;
-}
-
-void detect_region()
+void set_region(rom_info *info, uint8_t 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 {
+ if (!region) {
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;
- }
+ 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;
+ }
}
+
#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 @@ int main(int argc, char ** argv)
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 @@ int main(int argc, char ** argv)
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");
diff --git a/romdb.c b/romdb.c
index 0de4af5..fbfcef9 100644
--- a/romdb.c
+++ b/romdb.c
@@ -4,10 +4,11 @@
#include "romdb.h"
#include "util.h"
-#define GAME_ID_OFF 0x183
-#define GAME_ID_LEN 8
#define TITLE_START 0x150
#define TITLE_END (TITLE_START+48)
+#define GAME_ID_OFF 0x183
+#define GAME_ID_LEN 8
+#define REGION_START 0x1F0
tern_node *load_rom_db()
{
@@ -52,11 +53,37 @@ char *get_header_name(uint8_t *rom)
}
}
+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 @@ rom_info configure_rom(tern_node *rom_db, void *vrom)
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
+}
diff --git a/romdb.h b/romdb.h
index e204f7d..5a1b4bc 100644
--- a/romdb.h
+++ b/romdb.h
@@ -16,5 +16,6 @@ typedef struct {
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_