1 #include <stdint.h>
2 #include <libretro.h>
3 
4 #include "Glide64_UCode.h"
5 #include "rdp.h"
6 
7 extern uint8_t microcode[4096];
8 extern uint32_t uc_crc;
9 extern int old_ucode;
10 extern SETTINGS settings;
11 
12 extern retro_log_printf_t log_cb;
13 
microcheck(void)14 void microcheck(void)
15 {
16    uint32_t i;
17    uc_crc = 0;
18 
19    // Check first 3k of ucode, because the last 1k sometimes contains trash
20    for (i = 0; i < 3072 >> 2; i++)
21       uc_crc += ((uint32_t*)microcode)[i];
22 
23    FRDP_E ("crc: %08lx\n", uc_crc);
24 
25    if (log_cb)
26       log_cb(RETRO_LOG_INFO, "Glide64 ucode = 0x%04x\n", uc_crc);
27 
28    old_ucode = settings.ucode;
29 
30    if (
31          uc_crc == 0x006bd77f
32          || uc_crc == 0x07200895
33          || uc_crc == UCODE_GOLDENEYE_007
34          || uc_crc == UCODE_DUKE_NUKEM_64
35          || uc_crc == UCODE_ROBOTECH_CRYSTAL_DREAMS_PROTO
36          || uc_crc == UCODE_NBA_SHOWTIME
37          || uc_crc == 0xbc03e969
38          || uc_crc == 0xd5604971
39          || uc_crc == UCODE_MORITA_SHOUGI_64
40          || uc_crc == 0xd67c2f8b
41          || uc_crc == UCODE_KILLER_INSTINCT_GOLD
42          || uc_crc == UCODE_MISCHIEF_MAKERS
43          || uc_crc == UCODE_MORTAL_KOMBAT_TRILOGY
44          || uc_crc == 0x5182f610
45          || uc_crc == UCODE_BLAST_CORPS
46          || uc_crc == UCODE_PILOTWINGS_64
47          || uc_crc == UCODE_CRUISN_USA
48          || uc_crc == UCODE_SUPER_MARIO_64
49          || uc_crc == UCODE_TETRISPHERE
50          || uc_crc == 0x4165e1fd
51          || uc_crc == UCODE_EIKU_NO_SAINT_ANDREWS
52          )
53          {
54             settings.ucode = 0;
55             if (log_cb)
56                log_cb(RETRO_LOG_INFO, "Microcode 0 - RSP SW 2.0X (Super Mario 64)\n");
57          }
58    else if (
59          uc_crc == UCODE_CLAYFIGHTER_63
60          || uc_crc == 0x05777c62
61          || uc_crc == 0x057e7c62
62          || uc_crc == 0x1118b3e0
63          || uc_crc == UCODE_MINI_RACERS_CRC1
64          || uc_crc == 0x1de712ff
65          || uc_crc == 0x24cd885b
66          || uc_crc == 0x26a7879a
67          || uc_crc == 0xfb816260
68          || uc_crc == 0x2c7975d6
69          || uc_crc == 0x2d3fe3f1
70          || uc_crc == UCODE_FIGHTING_FORCE_64_CRC1
71          || uc_crc == 0x339872a6
72          || uc_crc == 0x3ff1a4ca
73          || uc_crc == 0x4340ac9b
74          || uc_crc == 0x440cfad6
75          || uc_crc == 0x4fe6df78
76          || uc_crc == 0x5257cd2a
77          || uc_crc == UCODE_MORTAL_KOMBAT_MYTHOLOGIES
78          || uc_crc == 0x5414030d
79          || uc_crc == 0x559ff7d4
80          || uc_crc == UCODE_YOSHIS_STORY_CRC2
81          || uc_crc == UCODE_IGGY_RECKIN_BALLS
82          || uc_crc == 0x6075e9eb
83          || uc_crc == UCODE_DEZAEMON3D
84          || uc_crc == UCODE_1080_SNOWBOARDING
85          || uc_crc == 0x66c0b10a
86          || uc_crc == 0x6eaa1da8
87          || uc_crc == 0x72a4f34e
88          || uc_crc == 0x73999a23
89          || uc_crc == 0x7df75834
90          || uc_crc == UCODE_DOOM_64
91          || uc_crc == UCODE_TUROK_1
92          || uc_crc == 0x82f48073
93          || uc_crc == UCODE_MINI_RACERS_CRC2
94          || uc_crc == 0x841ce10f
95          || uc_crc == 0x863e1ca7
96          || uc_crc == UCODE_MARIO_KART_64
97          || uc_crc == 0x8d5735b2
98          || uc_crc == 0x8d5735b3
99          || uc_crc == 0x97d1b58a
100          || uc_crc == UCODE_QUAKE_64
101          || uc_crc == UCODE_WETRIX
102          || uc_crc == UCODE_STAR_FOX_64
103          || uc_crc == UCODE_FIGHTING_FORCE_64_CRC2
104          || uc_crc == 0xb4577b9c
105          || uc_crc == 0xbe78677c
106          || uc_crc == 0xbed8b069
107          || uc_crc == 0xc3704e41
108          || uc_crc == UCODE_EXTREME_G
109          || uc_crc == 0xc99a4c6c
110          || uc_crc == 0xcee7920f
111          || uc_crc == 0xd1663234
112          || uc_crc == 0xd2a9f59c
113          || uc_crc == 0xd41db5f7
114          || uc_crc == 0xd57049a5
115          || uc_crc == UCODE_TAMIYA_RACING_64_PROTO
116          || uc_crc == UCODE_WIPEOUT_64
117          || uc_crc == 0xe9231df2
118          || uc_crc == 0xec040469
119          || uc_crc == UCODE_DUAL_HEROES
120          || uc_crc == UCODE_HEXEN_64
121          || uc_crc == UCODE_CHAMELEON_TWIST
122          || uc_crc == UCODE_BANJO_KAZOOIE
123          || uc_crc == UCODE_MACE_THE_DARK_AGE
124          || uc_crc == 0xef54ee35
125          )
126          {
127             settings.ucode = 1;
128             if (log_cb)
129                log_cb(RETRO_LOG_INFO, "Microcode 1 - F3DEX 1.XX (Star Fox 64)\n");
130          }
131    else if (
132          uc_crc == 0x03044b84
133          || uc_crc == 0x030f4b84
134          || uc_crc == 0x0ff79527
135          || uc_crc == UCODE_COMMAND_AND_CONQUER
136          || uc_crc == UCODE_KNIFE_EDGE
137          || uc_crc == UCODE_EXTREME_G_2
138          || uc_crc == UCODE_DONKEY_KONG_64
139          || uc_crc == UCODE_TONIC_TROUBLE
140          || uc_crc == UCODE_PAPER_MARIO
141          || uc_crc == UCODE_ANIMAL_CROSSING
142          || uc_crc == UCODE_ZELDA_MAJORAS_MASK
143          || uc_crc == UCODE_ZELDA_OOT
144          || uc_crc == 0x6124a508
145          || uc_crc == 0x630a61fb
146          || uc_crc == UCODE_CASTLEVANIA_64
147          || uc_crc == UCODE_CASTLEVANIA_64
148          || uc_crc == UCODE_KING_HILL_64
149          || uc_crc == 0x679e1205
150          || uc_crc == 0x6d8f8f8a
151          || uc_crc == 0x753be4a5
152          || uc_crc == 0xda13ab96
153          || uc_crc == 0xe65cb4ad
154          || uc_crc == 0xe1290fa2
155          || uc_crc == UCODE_HEY_YOU_PIKACHU
156          || uc_crc == UCODE_CRUISN_EXOTICA
157          || uc_crc == UCODE_STARCRAFT_64
158          || uc_crc == 0x2b291027
159          || uc_crc == UCODE_POKEMON_SNAP
160          || uc_crc == 0x2f7dd1d5
161          || uc_crc == UCODE_CRUISN_EXOTICA
162          || uc_crc == UCODE_GANBARE_GOEMON_2
163          || uc_crc == 0x93d11ffb
164          || uc_crc == 0x93d1ff7b
165          || uc_crc == UCODE_FZERO_X
166          || uc_crc == 0x955117fb
167          || uc_crc == UCODE_BIOHAZARD_2
168          || uc_crc == 0xa2d0f88e
169          || uc_crc == 0xaa86cb1d
170          || uc_crc == 0xaae4a5b9
171          || uc_crc == 0xad0a6292
172          || uc_crc == 0xad0a6312
173          || uc_crc == UCODE_NBA_SHOWTIME
174          || uc_crc == 0xba65ea1e
175          || uc_crc == UCODE_KIRBY_64_CRYSTAL_SHARDS
176          || uc_crc == UCODE_SUPER_SMASH_BROS
177          || uc_crc == UCODE_MARIO_TENNIS
178          || uc_crc == UCODE_MEGA_MAN_64
179          || uc_crc == UCODE_RIDGE_RACER_64
180          || uc_crc == UCODE_40WINKS
181          || uc_crc == 0xcb8c9b6c
182          )
183          {
184             settings.ucode = 2;
185             if (log_cb)
186                log_cb(RETRO_LOG_INFO, "Microcode 2 - F3DEX 2.XX (The Legend of Zelda: Ocarina of Time)\n");
187          }
188    else if (
189          uc_crc == UCODE_WAVERACE_64
190          )
191    {
192       settings.ucode = 3;
193       if (log_cb)
194          log_cb(RETRO_LOG_INFO, "Microcode 3 - F3DEX ? (WaveRace)\n");
195    }
196    else if (
197          uc_crc == UCODE_STAR_WARS_SHADOW_OF_THE_EMPIRE
198          )
199    {
200       settings.ucode = 4;
201       if (log_cb)
202          log_cb(RETRO_LOG_INFO, "Microcode 4 - RSP SW 2.0D EXT (Star Wars: Shadows of the Empire)\n");
203    }
204    else if (
205          uc_crc == UCODE_JET_FORCE_GEMINI
206          || uc_crc == UCODE_MICKEYS_SPEEDWAY_USA
207          || uc_crc == UCODE_DIDDY_KONG_RACING
208          || uc_crc == 0x63be08b3
209          )
210    {
211       settings.ucode = 5;
212       if (log_cb)
213          log_cb(RETRO_LOG_INFO, "Microcode 5 - RSP SW 2.0 (Diddy Kong Racing)\n");
214    }
215    else if (
216          uc_crc == 0x1ea9e30f
217          || uc_crc == 0x74af0a74
218          || uc_crc == 0x794c3e28
219          || uc_crc == UCODE_BANGAIOH
220          || uc_crc == 0x2b5a89c2
221          || uc_crc == UCODE_YOSHIS_STORY_CRC1
222          || uc_crc == 0xd20dedbf
223          )
224    {
225       settings.ucode = 6;
226       if (log_cb)
227          log_cb(RETRO_LOG_INFO, "Microcode 6 - S2DEX 1.XX  (Yoshi's Story - SimCity 2000)\n");
228    }
229    else if (
230          uc_crc == UCODE_PERFECT_DARK
231          )
232    {
233       settings.ucode = 7;
234       if (log_cb)
235          log_cb(RETRO_LOG_INFO, "Microcode 7 - RSP SW PD (Perfect Dark)\n");
236    }
237    else if (
238          uc_crc == UCODE_CONKERS_BAD_FUR_DAY
239          )
240    {
241       settings.ucode = 8;
242       if (log_cb)
243          log_cb(RETRO_LOG_INFO, "Microcode 8 - F3DEXBG 2.08 (Conker's Bad Fur Day)\n");
244    }
245    else if (
246          uc_crc == 0x0bf36d36
247          )
248    {
249       settings.ucode = 9;
250       if (log_cb)
251          log_cb(RETRO_LOG_INFO, "Microcode 9 - Star Wars: Battle for Naboo\n");
252    }
253    else if (
254          uc_crc == 0x1f120bbb
255          || uc_crc == 0xf9893f70
256          || uc_crc == UCODE_LAST_LEGION_UX
257          )
258    {
259       settings.ucode = 21;
260       if (log_cb)
261          log_cb(RETRO_LOG_INFO, "Microcode 21 - ???.\n");
262    }
263    else if (
264          uc_crc == 0x0d7bbffb
265          || uc_crc == 0x0ff795bf
266          || uc_crc == UCODE_STAR_WARS_ROGUE_SQUADRON
267          || uc_crc == 0x844b55b5
268          || uc_crc == 0x8ec3e124
269          || uc_crc == 0xd5c4dc96
270          )
271    {
272       settings.ucode = -1;
273       if (log_cb)
274          log_cb(RETRO_LOG_INFO, "Microcode -1 - Unknown Microcode.\n");
275    }
276    else if (
277          uc_crc == 0xef54ee35
278          )
279    {
280       settings.ucode = 10;
281       if (log_cb)
282          log_cb(RETRO_LOG_INFO, "Microcode 10 - F3DTEXA (64 de Hakken).\n");
283    }
284 #if 0
285    else if (
286          uc_crc == UCODE_ARMORINES_PROJECT
287          )
288    {
289       settings.ucode = 11;
290       if (log_cb)
291          log_cb(RETRO_LOG_INFO, "Microcode 10 - F3DEX2Acclaim (Turok 2/3/South Park).\n");
292    }
293 #else
294    else if (
295          uc_crc == UCODE_ARMORINES_PROJECT
296          )
297    {
298       settings.ucode = 2;
299       if (log_cb)
300          log_cb(RETRO_LOG_INFO, "Microcode 2 - F3DEX 2.XX (The Legend of Zelda: Ocarina of Time)\n");
301    }
302 #endif
303 
304    if (log_cb)
305       log_cb(RETRO_LOG_INFO, "microcheck: old ucode: %d,  new ucode: %d\n", old_ucode, settings.ucode);
306 #if 0
307    //FIXME/TODO - check if this is/was necessary at all - persp_supported would be set to false here but rdp.Persp_en would be forcibly set to 1
308    if (uc_crc == 0x8d5735b2 || uc_crc == 0xb1821ed3 || uc_crc == 0x1118b3e0) //F3DLP.Rej ucode. perspective texture correction is not implemented
309    {
310    }
311 #endif
312 }
313