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