Mercurial > repos > blastem
comparison romdb.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 |
---|---|
2 #include <string.h> | 2 #include <string.h> |
3 #include "config.h" | 3 #include "config.h" |
4 #include "romdb.h" | 4 #include "romdb.h" |
5 #include "util.h" | 5 #include "util.h" |
6 | 6 |
7 #define TITLE_START 0x150 | |
8 #define TITLE_END (TITLE_START+48) | |
7 #define GAME_ID_OFF 0x183 | 9 #define GAME_ID_OFF 0x183 |
8 #define GAME_ID_LEN 8 | 10 #define GAME_ID_LEN 8 |
9 #define TITLE_START 0x150 | 11 #define REGION_START 0x1F0 |
10 #define TITLE_END (TITLE_START+48) | |
11 | 12 |
12 tern_node *load_rom_db() | 13 tern_node *load_rom_db() |
13 { | 14 { |
14 char *exe_dir = get_exe_dir(); | 15 char *exe_dir = get_exe_dir(); |
15 if (!exe_dir) { | 16 if (!exe_dir) { |
50 *dst = 0; | 51 *dst = 0; |
51 return ret; | 52 return ret; |
52 } | 53 } |
53 } | 54 } |
54 | 55 |
56 char *region_chars = "UB4JEA"; | |
57 uint8_t region_bits[] = {REGION_U, REGION_U, REGION_U, REGION_J, REGION_E, REGION_E}; | |
58 | |
59 uint8_t translate_region_char(uint8_t c) | |
60 { | |
61 for (int i = 0; i < sizeof(region_bits); i++) | |
62 { | |
63 if (c == region_chars[i]) { | |
64 return region_bits[i]; | |
65 } | |
66 } | |
67 return 0; | |
68 } | |
69 | |
70 uint8_t get_header_regions(uint8_t *rom) | |
71 { | |
72 uint8_t regions = 0; | |
73 for (int i = 0; i < 3; i++) | |
74 { | |
75 regions |= translate_region_char(rom[REGION_START + i]); | |
76 } | |
77 return regions; | |
78 } | |
79 | |
80 | |
55 rom_info configure_rom_heuristics(uint8_t *rom) | 81 rom_info configure_rom_heuristics(uint8_t *rom) |
56 { | 82 { |
57 rom_info info; | 83 rom_info info; |
58 info.name = get_header_name(rom); | 84 info.name = get_header_name(rom); |
59 | 85 info.regions = get_header_regions(rom); |
86 return info; | |
60 } | 87 } |
61 | 88 |
62 rom_info configure_rom(tern_node *rom_db, void *vrom) | 89 rom_info configure_rom(tern_node *rom_db, void *vrom) |
63 { | 90 { |
64 uint8_t product_id[GAME_ID_LEN+1]; | 91 uint8_t product_id[GAME_ID_LEN+1]; |
76 tern_node * entry = tern_find_prefix(rom_db, product_id); | 103 tern_node * entry = tern_find_prefix(rom_db, product_id); |
77 if (!entry) { | 104 if (!entry) { |
78 return configure_rom_heuristics(rom); | 105 return configure_rom_heuristics(rom); |
79 } | 106 } |
80 rom_info info; | 107 rom_info info; |
81 info.name = strdup(tern_find_ptr_default(entry, "name", "UNKNOWN")); | 108 info.name = tern_find_ptr(entry, "name"); |
109 if (info.name) { | |
110 info.name = strdup(info.name); | |
111 } else { | |
112 info.name = get_header_name(rom); | |
113 } | |
114 | |
115 char *dbreg = tern_find_ptr(entry, "regions"); | |
116 info.regions = 0; | |
117 if (dbreg) { | |
118 while (*dbreg != 0) | |
119 { | |
120 info.regions |= translate_region_char(*(dbreg++)); | |
121 } | |
122 } | |
123 if (!info.regions) { | |
124 info.regions = get_header_regions(rom); | |
125 } | |
82 return info; | 126 return info; |
83 } | 127 } |