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 }