Mercurial > repos > blastem
comparison romdb.c @ 764:bb60259e8edf
Initial work on ROM database
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 02 Jul 2015 19:19:06 -0700 |
parents | |
children | dc54387ee1cd |
comparison
equal
deleted
inserted
replaced
762:206c449eaa81 | 764:bb60259e8edf |
---|---|
1 #include <stdlib.h> | |
2 #include <string.h> | |
3 #include "config.h" | |
4 #include "romdb.h" | |
5 #include "util.h" | |
6 | |
7 #define GAME_ID_OFF 0x183 | |
8 #define GAME_ID_LEN 8 | |
9 #define TITLE_START 0x150 | |
10 #define TITLE_END (TITLE_START+48) | |
11 | |
12 tern_node *load_rom_db() | |
13 { | |
14 char *exe_dir = get_exe_dir(); | |
15 if (!exe_dir) { | |
16 fputs("Failed to find executable path\n", stderr); | |
17 exit(1); | |
18 } | |
19 char *path = alloc_concat(exe_dir, "/rom.db"); | |
20 tern_node *db = parse_config_file(path); | |
21 free(path); | |
22 if (!db) { | |
23 fputs("Failed to load ROM DB\n", stderr); | |
24 } | |
25 return db; | |
26 } | |
27 | |
28 char *get_header_name(uint8_t *rom) | |
29 { | |
30 uint8_t *last = rom + TITLE_END - 1; | |
31 uint8_t *src = rom + TITLE_START; | |
32 | |
33 while (last > src && (*last <= 0x20 || *last >= 0x80)) | |
34 { | |
35 last--; | |
36 } | |
37 if (last == src) { | |
38 //TODO: Use other name field | |
39 return strdup("UNKNOWN"); | |
40 } else { | |
41 last++; | |
42 char *ret = malloc(last - (rom + TITLE_START) + 1); | |
43 uint8_t *dst; | |
44 for (dst = ret; src < last; src++) | |
45 { | |
46 if (*src >= 0x20 && *src < 0x80) { | |
47 *(dst++) = *src; | |
48 } | |
49 } | |
50 *dst = 0; | |
51 return ret; | |
52 } | |
53 } | |
54 | |
55 rom_info configure_rom_heuristics(uint8_t *rom) | |
56 { | |
57 rom_info info; | |
58 info.name = get_header_name(rom); | |
59 | |
60 } | |
61 | |
62 rom_info configure_rom(tern_node *rom_db, void *vrom) | |
63 { | |
64 uint8_t product_id[GAME_ID_LEN+1]; | |
65 uint8_t *rom = vrom; | |
66 product_id[GAME_ID_LEN] = 0; | |
67 for (int i = 0; i < GAME_ID_LEN; i++) | |
68 { | |
69 if (rom[GAME_ID_OFF + i] <= ' ') { | |
70 product_id[i] = 0; | |
71 break; | |
72 } | |
73 product_id[i] = rom[GAME_ID_OFF + i]; | |
74 | |
75 } | |
76 tern_node * entry = tern_find_prefix(rom_db, product_id); | |
77 if (!entry) { | |
78 return configure_rom_heuristics(rom); | |
79 } | |
80 rom_info info; | |
81 info.name = strdup(tern_find_ptr_default(entry, "name", "UNKNOWN")); | |
82 return info; | |
83 } |