remove one of the hacks
[pcsx_rearmed.git] / libpcsxcore / database.c
1 #include "misc.h"
2 #include "sio.h"
3 #include "ppf.h"
4 #include "new_dynarec/new_dynarec.h"
5
6 /* It's duplicated from emu_if.c */
7 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
8
9 static const char * const MemorycardHack_db[] =
10 {
11         /* Lifeforce Tenka, also known as Codename Tenka */
12         "SLES00613", "SLED00690", "SLES00614", "SLES00615",
13         "SLES00616", "SLES00617", "SCUS94409"
14 };
15
16 static const char * const cdr_read_hack_db[] =
17 {
18         /* T'ai Fu - Wrath of the Tiger */
19         "SLUS00787",
20 };
21
22 static const char * const gpu_slow_llist_db[] =
23 {
24         /* Bomberman Fantasy Race */
25         "SLES01712", "SLPS01525", "SLPS91138", "SLPM87102", "SLUS00823",
26         /* Crash Bash */
27         "SCES02834", "SCUS94570", "SCUS94616", "SCUS94654",
28         /* Final Fantasy IV */
29         "SCES03840", "SLPM86028", "SLUS01360",
30         /* Point Blank - calibration cursor */
31         "SCED00287", "SCES00886", "SLUS00481",
32         /* Simple 1500 Series Vol. 57: The Meiro */
33         "SLPM86715",
34         /* Spot Goes to Hollywood */
35         "SLES00330", "SLPS00394", "SLUS00014",
36         /* Tiny Tank */
37         "SCES01338", "SCES02072", "SCES02072", "SCES02072", "SCES02072", "SCUS94427",
38         /* Vampire Hunter D */
39         "SLES02731", "SLPS02477", "SLPS03198", "SLUS01138",
40 };
41
42 static const char * const gpu_centering_hack_db[] =
43 {
44         /* Gradius Gaiden */
45         "SLPM86042", "SLPM86103", "SLPM87323",
46         /* Sexy Parodius */
47         "SLPM86009",
48 };
49
50 static const char * const dualshock_timing1024_hack_db[] =
51 {
52         /* Judge Dredd - could also be poor cdrom+mdec+dma timing */
53         "SLUS00630", "SLES00755",
54 };
55
56 static const char * const dualshock_init_analog_hack_db[] =
57 {
58         /* Formula 1 Championship Edition */
59         "SLUS00546",
60 };
61
62 #define HACK_ENTRY(var, list) \
63         { #var, &Config.hacks.var, list, ARRAY_SIZE(list) }
64
65 static const struct
66 {
67         const char *name;
68         boolean *var;
69         const char * const * id_list;
70         size_t id_list_len;
71 }
72 hack_db[] =
73 {
74         HACK_ENTRY(cdr_read_timing, cdr_read_hack_db),
75         HACK_ENTRY(gpu_slow_list_walking, gpu_slow_llist_db),
76         HACK_ENTRY(gpu_centering, gpu_centering_hack_db),
77         HACK_ENTRY(gpu_timing1024, dualshock_timing1024_hack_db),
78         HACK_ENTRY(dualshock_init_analog, dualshock_init_analog_hack_db),
79 };
80
81 static const struct
82 {
83         int mult;
84         const char * const id[4];
85 }
86 cycle_multiplier_overrides[] =
87 {
88         /* note: values are = (10000 / gui_option) */
89         /* Internal Section - fussy about timings */
90         { 202, { "SLPS01868" } },
91         /* Super Robot Taisen Alpha - on the edge with 175,
92          * changing memcard settings is enough to break/unbreak it */
93         { 190, { "SLPS02528", "SLPS02636" } },
94         /* Brave Fencer Musashi - cd sectors arrive too fast */
95         { 170, { "SLUS00726", "SLPS01490" } },
96 #if defined(DRC_DISABLE) || defined(LIGHTREC) /* new_dynarec has a hack for this game */
97         /* Parasite Eve II - internal timer checks */
98         { 125, { "SLUS01042", "SLUS01055", "SLES02558", "SLES12558" } },
99 #endif
100         /* Discworld Noir - audio skips if CPU runs too fast */
101         { 222, { "SLES01549", "SLES02063", "SLES02064" } },
102         /* Digimon World */
103         { 153, { "SLUS01032", "SLES02914" } },
104         /* Syphon Filter - reportedly hangs under unknown conditions */
105         { 169, { "SCUS94240" } },
106         /* Psychic Detective - some weird race condition in the game's cdrom code */
107         { 222, { "SLUS00165", "SLUS00166", "SLUS00167" } },
108         { 222, { "SLES00070", "SLES10070", "SLES20070" } },
109         /* Vib-Ribbon - cd timing issues (PAL+ari64drc only?) */
110         { 200, { "SCES02873" } },
111         /* Zero Divide - sometimes too fast */
112         { 200, { "SLUS00183", "SLES00159", "SLPS00083", "SLPM80008" } },
113 };
114
115 /* Function for automatic patching according to GameID. */
116 void Apply_Hacks_Cdrom(void)
117 {
118         size_t i, j;
119
120         memset(&Config.hacks, 0, sizeof(Config.hacks));
121
122         for (i = 0; i < ARRAY_SIZE(hack_db); i++)
123         {
124                 for (j = 0; j < hack_db[i].id_list_len; j++)
125                 {
126                         if (strncmp(CdromId, hack_db[i].id_list[j], 9))
127                                 continue;
128                         *hack_db[i].var = 1;
129                         SysPrintf("using hack: %s\n", hack_db[i].name);
130                         break;
131                 }
132         }
133
134         if (Config.hacks.dualshock_init_analog) {
135                 // assume the default is off, see LoadPAD1plugin()
136                 for (i = 0; i < 8; i++)
137                         padToggleAnalog(i);
138         }
139
140         /* Apply Memory card hack for Codename Tenka. (The game needs one of the memory card slots to be empty) */
141         for (i = 0; i < ARRAY_SIZE(MemorycardHack_db); i++)
142         {
143                 if (strncmp(CdromId, MemorycardHack_db[i], 9) == 0)
144                 {
145                         /* Disable the second memory card slot for the game */
146                         Config.Mcd2[0] = 0;
147                         /* This also needs to be done because in sio.c, they don't use Config.Mcd2 for that purpose */
148                         McdDisable[1] = 1;
149                         break;
150                 }
151         }
152
153         /* Dynarec game-specific hacks */
154         new_dynarec_hacks_pergame = 0;
155         Config.cycle_multiplier_override = 0;
156
157         for (i = 0; i < ARRAY_SIZE(cycle_multiplier_overrides); i++)
158         {
159                 const char * const * const ids = cycle_multiplier_overrides[i].id;
160                 for (j = 0; j < ARRAY_SIZE(cycle_multiplier_overrides[i].id); j++)
161                         if (ids[j] && strcmp(ids[j], CdromId) == 0)
162                                 break;
163                 if (j < ARRAY_SIZE(cycle_multiplier_overrides[i].id))
164                 {
165                         Config.cycle_multiplier_override = cycle_multiplier_overrides[i].mult;
166                         new_dynarec_hacks_pergame |= NDHACK_OVERRIDE_CYCLE_M;
167                         SysPrintf("using cycle_multiplier_override: %d\n",
168                                 Config.cycle_multiplier_override);
169                         break;
170                 }
171         }
172 }
173
174 // from duckstation's gamedb.json
175 static const u16 libcrypt_ids[] = {
176            17,   311,   995,  1041,  1226,  1241,  1301,  1362,  1431,  1444,
177          1492,  1493,  1494,  1495,  1516,  1517,  1518,  1519,  1545,  1564,
178          1695,  1700,  1701,  1702,  1703,  1704,  1715,  1733,  1763,  1882,
179          1906,  1907,  1909,  1943,  1979,  2004,  2005,  2006,  2007,  2024,
180          2025,  2026,  2027,  2028,  2029,  2030,  2031,  2061,  2071,  2080,
181          2081,  2082,  2083,  2084,  2086,  2104,  2105,  2112,  2113,  2118,
182          2181,  2182,  2184,  2185,  2207,  2208,  2209,  2210,  2211,  2222,
183          2264,  2290,  2292,  2293,  2328,  2329,  2330,  2354,  2355,  2365,
184          2366,  2367,  2368,  2369,  2395,  2396,  2402,  2430,  2431,  2432,
185          2433,  2487,  2488,  2489,  2490,  2491,  2529,  2530,  2531,  2532,
186          2533,  2538,  2544,  2545,  2546,  2558,  2559,  2560,  2561,  2562,
187          2563,  2572,  2573,  2681,  2688,  2689,  2698,  2700,  2704,  2705,
188          2706,  2707,  2708,  2722,  2723,  2724,  2733,  2754,  2755,  2756,
189          2763,  2766,  2767,  2768,  2769,  2824,  2830,  2831,  2834,  2835,
190          2839,  2857,  2858,  2859,  2860,  2861,  2862,  2965,  2966,  2967,
191          2968,  2969,  2975,  2976,  2977,  2978,  2979,  3061,  3062,  3189,
192          3190,  3191,  3241,  3242,  3243,  3244,  3245,  3324,  3489,  3519,
193          3520,  3521,  3522,  3523,  3530,  3603,  3604,  3605,  3606,  3607,
194          3626,  3648, 12080, 12081, 12082, 12083, 12084, 12328, 12329, 12330,
195         12558, 12559, 12560, 12561, 12562, 12965, 12966, 12967, 12968, 12969,
196         22080, 22081, 22082, 22083, 22084, 22328, 22329, 22330, 22965, 22966,
197         22967, 22968, 22969, 32080, 32081, 32082, 32083, 32084, 32965, 32966,
198         32967, 32968, 32969
199 };
200
201 // as documented by nocash
202 static const u16 libcrypt_sectors[16] = {
203         14105, 14231, 14485, 14579, 14649, 14899, 15056, 15130,
204         15242, 15312, 15378, 15628, 15919, 16031, 16101, 16167
205 };
206
207 int check_unsatisfied_libcrypt(void)
208 {
209         const char *p = CdromId + 4;
210         u16 id, key = 0;
211         size_t i;
212
213         if (strncmp(CdromId, "SCE", 3) && strncmp(CdromId, "SLE", 3))
214                 return 0;
215         while (*p == '0')
216                 p++;
217         id = (u16)atoi(p);
218         for (i = 0; i < ARRAY_SIZE(libcrypt_ids); i++)
219                 if (id == libcrypt_ids[i])
220                         break;
221         if (i == ARRAY_SIZE(libcrypt_ids))
222                 return 0;
223
224         // detected a protected game
225         if (!CDR_getBufferSub(libcrypt_sectors[0]) && !sbi_sectors) {
226                 SysPrintf("==================================================\n");
227                 SysPrintf("LibCrypt game detected with missing SBI/subchannel\n");
228                 SysPrintf("==================================================\n");
229                 return 1;
230         }
231
232         if (sbi_sectors) {
233                 // calculate key just for fun (we don't really need it)
234                 for (i = 0; i < 16; i++)
235                         if (CheckSBI(libcrypt_sectors[i] - 2*75))
236                                 key |= 1u << (15 - i);
237         }
238         if (key)
239                 SysPrintf("%s, possible key=%04X\n", "LibCrypt detected", key);
240         else
241                 SysPrintf("%s\n", "LibCrypt detected");
242         return 0;
243 }