98e75f2d |
1 | /* |
2 | * Glide64 - Glide video plugin for Nintendo 64 emulators. |
3 | * Copyright (c) 2002 Dave2001 |
4 | * Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski |
5 | * |
6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License as published by |
8 | * the Free Software Foundation; either version 2 of the License, or |
9 | * any later version. |
10 | * |
11 | * This program is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU General Public License |
17 | * along with this program; if not, write to the Free Software |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | */ |
20 | |
21 | //**************************************************************** |
22 | // |
23 | // Glide64 - Glide Plugin for Nintendo 64 emulators |
24 | // Project started on December 29th, 2001 |
25 | // |
26 | // Authors: |
27 | // Dave2001, original author, founded the project in 2001, left it in 2002 |
28 | // Gugaman, joined the project in 2002, left it in 2002 |
29 | // Sergey 'Gonetz' Lipski, joined the project in 2002, main author since fall of 2002 |
30 | // Hiroshi 'KoolSmoky' Morii, joined the project in 2007 |
31 | // |
32 | //**************************************************************** |
33 | // |
34 | // To modify Glide64: |
35 | // * Write your name and (optional)email, commented by your work, so I know who did it, and so that you can find which parts you modified when it comes time to send it to me. |
36 | // * Do NOT send me the whole project or file that you modified. Take out your modified code sections, and tell me where to put them. If people sent the whole thing, I would have many different versions, but no idea how to combine them all. |
37 | // |
38 | //**************************************************************** |
39 | // |
40 | // Creation 13 August 2003 Gonetz |
41 | // |
42 | //**************************************************************** |
43 | |
44 | static void fb_uc0_moveword() |
45 | { |
46 | if ((rdp.cmd0 & 0xFF) == 0x06) // segment |
47 | { |
48 | rdp.segment[(rdp.cmd0 >> 10) & 0x0F] = rdp.cmd1; |
49 | } |
50 | } |
51 | |
52 | static void fb_uc2_moveword() |
53 | { |
54 | if (((rdp.cmd0 >> 16) & 0xFF) == 0x06) // segment |
55 | { |
56 | rdp.segment[((rdp.cmd0 & 0xFFFF) >> 2)&0xF] = rdp.cmd1; |
57 | } |
58 | } |
59 | |
60 | static void fb_bg_copy () |
61 | { |
62 | if (rdp.main_ci == 0) |
63 | return; |
64 | CI_STATUS status = rdp.frame_buffers[rdp.ci_count-1].status; |
65 | if ( (status == ci_copy) ) |
66 | return; |
67 | |
68 | wxUint32 addr = segoffset(rdp.cmd1) >> 1; |
69 | wxUint8 imageFmt = ((wxUint8 *)gfx.RDRAM)[(((addr+11)<<1)+0)^3]; |
70 | wxUint8 imageSiz = ((wxUint8 *)gfx.RDRAM)[(((addr+11)<<1)+1)^3]; |
71 | wxUint32 imagePtr = segoffset(((wxUint32*)gfx.RDRAM)[(addr+8)>>1]); |
72 | FRDP ("fb_bg_copy. fmt: %d, size: %d, imagePtr %08lx, main_ci: %08lx, cur_ci: %08lx \n", imageFmt, imageSiz, imagePtr, rdp.main_ci, rdp.frame_buffers[rdp.ci_count-1].addr); |
73 | |
74 | if (status == ci_main) |
75 | { |
76 | wxUint16 frameW = ((wxUint16 *)gfx.RDRAM)[(addr+3)^1] >> 2; |
77 | wxUint16 frameH = ((wxUint16 *)gfx.RDRAM)[(addr+7)^1] >> 2; |
78 | if ( (frameW == rdp.frame_buffers[rdp.ci_count-1].width) && (frameH == rdp.frame_buffers[rdp.ci_count-1].height) ) |
79 | rdp.main_ci_bg = imagePtr; |
80 | } |
81 | else if (imagePtr >= rdp.main_ci && imagePtr < rdp.main_ci_end) //addr within main frame buffer |
82 | { |
83 | rdp.copy_ci_index = rdp.ci_count-1; |
84 | rdp.frame_buffers[rdp.copy_ci_index].status = ci_copy; |
85 | FRDP("rdp.frame_buffers[%d].status = ci_copy\n", rdp.copy_ci_index); |
86 | |
87 | if (rdp.frame_buffers[rdp.copy_ci_index].addr != rdp.main_ci_bg) |
88 | { |
89 | rdp.scale_x = 1.0f; |
90 | rdp.scale_y = 1.0f; |
91 | } |
92 | else |
93 | { |
94 | LRDP("motion blur!\n"); |
95 | rdp.motionblur = TRUE; |
96 | } |
97 | |
98 | FRDP ("Detect FB usage. texture addr is inside framebuffer: %08lx - %08lx \n", imagePtr, rdp.main_ci); |
99 | } |
100 | else if (imagePtr == rdp.zimg) |
101 | { |
102 | if (status == ci_unknown) |
103 | { |
104 | rdp.frame_buffers[rdp.ci_count-1].status = ci_zcopy; |
105 | rdp.tmpzimg = rdp.frame_buffers[rdp.ci_count-1].addr; |
106 | if (!rdp.copy_zi_index) |
107 | rdp.copy_zi_index = rdp.ci_count-1; |
108 | FRDP("rdp.frame_buffers[%d].status = ci_zcopy\n", rdp.copy_ci_index); |
109 | } |
110 | } |
111 | } |
112 | |
113 | static void fb_setscissor() |
114 | { |
115 | rdp.scissor_o.lr_y = (wxUint32)(((rdp.cmd1 & 0x00000FFF) >> 2)); |
116 | if (rdp.ci_count) |
117 | { |
118 | rdp.scissor_o.ul_x = (wxUint32)(((rdp.cmd0 & 0x00FFF000) >> 14)); |
119 | rdp.scissor_o.lr_x = (wxUint32)(((rdp.cmd1 & 0x00FFF000) >> 14)); |
120 | COLOR_IMAGE & cur_fb = rdp.frame_buffers[rdp.ci_count-1]; |
121 | if (rdp.scissor_o.lr_x - rdp.scissor_o.ul_x > (wxUint32)(cur_fb.width >> 1)) |
122 | { |
123 | if (cur_fb.height == 0 || (cur_fb.width >= rdp.scissor_o.lr_x-1 && cur_fb.width <= rdp.scissor_o.lr_x+1)) |
124 | cur_fb.height = rdp.scissor_o.lr_y; |
125 | } |
126 | FRDP("fb_setscissor. lr_x = %d, lr_y = %d, fb_width = %d, fb_height = %d\n", rdp.scissor_o.lr_x, rdp.scissor_o.lr_y, cur_fb.width, cur_fb.height); |
127 | } |
128 | } |
129 | |
130 | static void fb_uc2_movemem() |
131 | { |
132 | if ((rdp.cmd0 & 0xFF) == 8) |
133 | { |
134 | wxUint32 a = segoffset(rdp.cmd1) >> 1; |
135 | short scale_x = ((short*)gfx.RDRAM)[(a+0)^1] >> 2; |
136 | short trans_x = ((short*)gfx.RDRAM)[(a+4)^1] >> 2; |
137 | COLOR_IMAGE & cur_fb = rdp.frame_buffers[rdp.ci_count-1]; |
138 | if ( abs((int)(scale_x + trans_x - cur_fb.width)) < 3) |
139 | { |
140 | short scale_y = ((short*)gfx.RDRAM)[(a+1)^1] >> 2; |
141 | short trans_y = ((short*)gfx.RDRAM)[(a+5)^1] >> 2; |
142 | wxUint32 height = scale_y + trans_y; |
143 | if (height < rdp.scissor_o.lr_y) |
144 | cur_fb.height = height; |
145 | } |
146 | } |
147 | } |
148 | |
149 | static void fb_rect() |
150 | { |
151 | if (rdp.frame_buffers[rdp.ci_count-1].width == 32) |
152 | return; |
153 | int ul_x = ((rdp.cmd1 & 0x00FFF000) >> 14); |
154 | int lr_x = ((rdp.cmd0 & 0x00FFF000) >> 14); |
155 | int width = lr_x-ul_x; |
156 | int diff = abs((int)rdp.frame_buffers[rdp.ci_count-1].width - width); |
157 | if (diff < 4) |
158 | { |
159 | wxUint32 lr_y = min(rdp.scissor_o.lr_y, (rdp.cmd0 & 0xFFF) >> 2); |
160 | if (rdp.frame_buffers[rdp.ci_count-1].height < lr_y) |
161 | { |
162 | FRDP("fb_rect. ul_x: %d, lr_x: %d, fb_height: %d -> %d\n", ul_x, lr_x, rdp.frame_buffers[rdp.ci_count-1].height, lr_y); |
163 | rdp.frame_buffers[rdp.ci_count-1].height = lr_y; |
164 | } |
165 | } |
166 | } |
167 | |
168 | static void fb_rdphalf_1() |
169 | { |
170 | branch_dl = rdp.cmd1; |
171 | } |
172 | |
173 | |
174 | static void fb_settextureimage() |
175 | { |
176 | if (rdp.main_ci == 0) |
177 | return; |
178 | COLOR_IMAGE & cur_fb = rdp.frame_buffers[rdp.ci_count-1]; |
179 | if ( cur_fb.status >= ci_copy ) |
180 | return; |
181 | if (((rdp.cmd0 >> 19) & 0x03) >= 2) //check that texture is 16/32bit |
182 | { |
183 | int tex_format = ((rdp.cmd0 >> 21) & 0x07); |
184 | wxUint32 addr = segoffset(rdp.cmd1); |
185 | if ( tex_format == 0 ) |
186 | { |
187 | FRDP ("fb_settextureimage. fmt: %d, size: %d, imagePtr %08lx, main_ci: %08lx, cur_ci: %08lx \n", ((rdp.cmd0 >> 21) & 0x07), ((rdp.cmd0 >> 19) & 0x03), addr, rdp.main_ci, rdp.frame_buffers[rdp.ci_count-1].addr); |
188 | if (cur_fb.status == ci_main) |
189 | { |
190 | rdp.main_ci_last_tex_addr = addr; |
191 | if (cur_fb.height == 0) |
192 | { |
193 | cur_fb.height = rdp.scissor_o.lr_y; |
194 | rdp.main_ci_end = cur_fb.addr + ((cur_fb.width * cur_fb.height) << cur_fb.size >> 1); |
195 | } |
196 | } |
197 | if ((addr >= rdp.main_ci) && (addr < rdp.main_ci_end)) //addr within main frame buffer |
198 | { |
199 | if (cur_fb.status == ci_main) |
200 | { |
201 | rdp.copy_ci_index = rdp.ci_count-1; |
202 | cur_fb.status = ci_copy_self; |
203 | rdp.scale_x = rdp.scale_x_bak; |
204 | rdp.scale_y = rdp.scale_y_bak; |
205 | FRDP("rdp.frame_buffers[%d].status = ci_copy_self\n", rdp.ci_count-1); |
206 | } |
207 | else |
208 | { |
209 | if (cur_fb.width == rdp.frame_buffers[rdp.main_ci_index].width) |
210 | { |
211 | rdp.copy_ci_index = rdp.ci_count-1; |
212 | cur_fb.status = ci_copy; |
213 | FRDP("rdp.frame_buffers[%d].status = ci_copy\n", rdp.copy_ci_index); |
214 | if ((rdp.main_ci_last_tex_addr >= cur_fb.addr) && |
215 | (rdp.main_ci_last_tex_addr < (cur_fb.addr + cur_fb.width*cur_fb.height*cur_fb.size))) |
216 | { |
217 | LRDP("motion blur!\n"); |
218 | rdp.motionblur = TRUE; |
219 | } |
220 | else |
221 | { |
222 | rdp.scale_x = 1.0f; |
223 | rdp.scale_y = 1.0f; |
224 | } |
225 | } |
226 | else if (!(settings.frame_buffer & fb_ignore_aux_copy) && cur_fb.width < rdp.frame_buffers[rdp.main_ci_index].width) |
227 | { |
228 | rdp.copy_ci_index = rdp.ci_count-1; |
229 | cur_fb.status = ci_aux_copy; |
230 | FRDP("rdp.frame_buffers[%d].status = ci_aux_copy\n", rdp.copy_ci_index); |
231 | rdp.scale_x = 1.0f; |
232 | rdp.scale_y = 1.0f; |
233 | } |
234 | else |
235 | { |
236 | cur_fb.status = ci_aux; |
237 | FRDP("rdp.frame_buffers[%d].status = ci_aux\n", rdp.copy_ci_index); |
238 | } |
239 | } |
240 | FRDP ("Detect FB usage. texture addr is inside framebuffer: %08lx - %08lx \n", addr, rdp.main_ci); |
241 | } |
242 | ///* |
243 | else if ((cur_fb.status != ci_main) && (addr >= rdp.zimg && addr < rdp.zimg_end)) |
244 | { |
245 | cur_fb.status = ci_zcopy; |
246 | if (!rdp.copy_zi_index) |
247 | rdp.copy_zi_index = rdp.ci_count-1; |
248 | FRDP("fb_settextureimage. rdp.frame_buffers[%d].status = ci_zcopy\n", rdp.ci_count-1); |
249 | } |
250 | //*/ |
251 | else if ((rdp.maincimg[0].width > 64) && (addr >= rdp.maincimg[0].addr) && (addr < (rdp.maincimg[0].addr + rdp.maincimg[0].width*rdp.maincimg[0].height*2))) |
252 | { |
253 | if (cur_fb.status != ci_main) |
254 | { |
255 | cur_fb.status = ci_old_copy; |
256 | FRDP("rdp.frame_buffers[%d].status = ci_old_copy 1, addr:%08lx\n", rdp.ci_count-1, rdp.last_drawn_ci_addr); |
257 | } |
258 | rdp.read_previous_ci = TRUE; |
259 | LRDP("read_previous_ci = TRUE\n"); |
260 | } |
261 | else if ((addr >= rdp.last_drawn_ci_addr) && (addr < (rdp.last_drawn_ci_addr + rdp.maincimg[0].width*rdp.maincimg[0].height*2))) |
262 | { |
263 | if (cur_fb.status != ci_main) |
264 | { |
265 | cur_fb.status = ci_old_copy; |
266 | FRDP("rdp.frame_buffers[%d].status = ci_old_copy 2, addr:%08lx\n", rdp.ci_count-1, rdp.last_drawn_ci_addr); |
267 | } |
268 | rdp.read_previous_ci = TRUE; |
269 | LRDP("read_previous_ci = TRUE\n"); |
270 | } |
271 | } |
272 | else if (fb_hwfbe_enabled && (cur_fb.status == ci_main)) |
273 | { |
274 | if ((addr >= rdp.main_ci) && (addr < rdp.main_ci_end)) //addr within main frame buffer |
275 | { |
276 | rdp.copy_ci_index = rdp.ci_count-1; |
277 | rdp.black_ci_index = rdp.ci_count-1; |
278 | cur_fb.status = ci_copy_self; |
279 | FRDP("rdp.frame_buffers[%d].status = ci_copy_self\n", rdp.ci_count-1); |
280 | } |
281 | } |
282 | } |
283 | if (cur_fb.status == ci_unknown) |
284 | { |
285 | cur_fb.status = ci_aux; |
286 | FRDP("fb_settextureimage. rdp.frame_buffers[%d].status = ci_aux\n", rdp.ci_count-1); |
287 | } |
288 | } |
289 | |
290 | static void fb_loadtxtr() |
291 | { |
292 | if (rdp.frame_buffers[rdp.ci_count-1].status == ci_unknown) |
293 | { |
294 | rdp.frame_buffers[rdp.ci_count-1].status = ci_aux; |
295 | FRDP("rdp.frame_buffers[%d].status = ci_aux\n", rdp.ci_count-1); |
296 | } |
297 | } |
298 | |
299 | static void fb_setdepthimage() |
300 | { |
301 | rdp.zimg = segoffset(rdp.cmd1) & BMASK; |
302 | rdp.zimg_end = rdp.zimg + rdp.ci_width*rdp.ci_height*2; |
303 | FRDP ("fb_setdepthimage. addr %08lx - %08lx\n", rdp.zimg, rdp.zimg_end); |
304 | if (rdp.zimg == rdp.main_ci) //strange, but can happen |
305 | { |
306 | rdp.frame_buffers[rdp.main_ci_index].status = ci_unknown; |
307 | if (rdp.main_ci_index < rdp.ci_count) |
308 | { |
309 | rdp.frame_buffers[rdp.main_ci_index].status = ci_zimg; |
310 | FRDP("rdp.frame_buffers[%d].status = ci_zimg\n", rdp.main_ci_index); |
311 | rdp.main_ci_index++; |
312 | rdp.frame_buffers[rdp.main_ci_index].status = ci_main; |
313 | FRDP("rdp.frame_buffers[%d].status = ci_main\n", rdp.main_ci_index); |
314 | rdp.main_ci = rdp.frame_buffers[rdp.main_ci_index].addr; |
315 | rdp.main_ci_end = rdp.main_ci + (rdp.frame_buffers[rdp.main_ci_index].width * rdp.frame_buffers[rdp.main_ci_index].height * rdp.frame_buffers[rdp.main_ci_index].size); |
316 | for (int i = rdp.main_ci_index+1; i < rdp.ci_count; i++) |
317 | { |
318 | COLOR_IMAGE & fb = rdp.frame_buffers[i]; |
319 | if (fb.addr == rdp.main_ci) |
320 | { |
321 | fb.status = ci_main; |
322 | FRDP("rdp.frame_buffers[%d].status = ci_main\n", i); |
323 | } |
324 | } |
325 | } |
326 | else |
327 | { |
328 | rdp.main_ci = 0; |
329 | } |
330 | } |
331 | for (int i = 0; i < rdp.ci_count; i++) |
332 | { |
333 | COLOR_IMAGE & fb = rdp.frame_buffers[i]; |
334 | if ((fb.addr == rdp.zimg) && (fb.status == ci_aux || fb.status == ci_useless)) |
335 | { |
336 | fb.status = ci_zimg; |
337 | FRDP("rdp.frame_buffers[%d].status = ci_zimg\n", i); |
338 | } |
339 | } |
340 | } |
341 | |
342 | static void fb_setcolorimage() |
343 | { |
344 | rdp.ocimg = rdp.cimg; |
345 | rdp.cimg = segoffset(rdp.cmd1) & BMASK; |
346 | COLOR_IMAGE & cur_fb = rdp.frame_buffers[rdp.ci_count]; |
347 | cur_fb.width = (rdp.cmd0 & 0xFFF) + 1; |
348 | if (cur_fb.width == 32 ) |
349 | cur_fb.height = 32; |
350 | else if (cur_fb.width == 16 ) |
351 | cur_fb.height = 16; |
352 | else if (rdp.ci_count > 0) |
353 | cur_fb.height = rdp.scissor_o.lr_y; |
354 | else |
355 | cur_fb.height = 0; |
356 | cur_fb.format = (rdp.cmd0 >> 21) & 0x7; |
357 | cur_fb.size = (rdp.cmd0 >> 19) & 0x3; |
358 | cur_fb.addr = rdp.cimg; |
359 | cur_fb.changed = 1; |
360 | /* |
361 | if (rdp.ci_count > 0) |
362 | if (rdp.frame_buffers[0].addr == rdp.cimg) |
363 | rdp.frame_buffers[0].height = rdp.scissor_o.lr_y; |
364 | */ |
365 | FRDP ("fb_setcolorimage. width: %d, height: %d, fmt: %d, size: %d, addr %08lx\n", cur_fb.width, cur_fb.height, cur_fb.format, cur_fb.size, cur_fb.addr); |
366 | if (rdp.cimg == rdp.zimg) |
367 | { |
368 | cur_fb.status = ci_zimg; |
369 | rdp.zimg_end = rdp.zimg + cur_fb.width*rdp.scissor_o.lr_y*2; |
370 | FRDP("rdp.frame_buffers[%d].status = ci_zimg\n", rdp.ci_count); |
371 | } |
372 | else if (rdp.cimg == rdp.tmpzimg) |
373 | { |
374 | cur_fb.status = ci_zcopy; |
375 | if (!rdp.copy_zi_index) |
376 | rdp.copy_zi_index = rdp.ci_count-1; |
377 | FRDP("rdp.frame_buffers[%d].status = ci_zcopy\n", rdp.ci_count); |
378 | } |
379 | else if (rdp.main_ci != 0) |
380 | { |
381 | if (rdp.cimg == rdp.main_ci) //switched to main fb again |
382 | { |
383 | cur_fb.height = max(cur_fb.height, rdp.frame_buffers[rdp.main_ci_index].height); |
384 | rdp.main_ci_index = rdp.ci_count; |
385 | rdp.main_ci_end = rdp.cimg + ((cur_fb.width * cur_fb.height) << cur_fb.size >> 1); |
386 | cur_fb.status = ci_main; |
387 | FRDP("rdp.frame_buffers[%d].status = ci_main\n", rdp.ci_count); |
388 | } |
389 | else // status is not known yet |
390 | { |
391 | cur_fb.status = ci_unknown; |
392 | } |
393 | } |
394 | else |
395 | { |
396 | if ((rdp.zimg != rdp.cimg))//&& (rdp.ocimg != rdp.cimg)) |
397 | { |
398 | rdp.main_ci = rdp.cimg; |
399 | rdp.main_ci_end = rdp.cimg + ((cur_fb.width * cur_fb.height) << cur_fb.size >> 1); |
400 | rdp.main_ci_index = rdp.ci_count; |
401 | cur_fb.status = ci_main; |
402 | FRDP("rdp.frame_buffers[%d].status = ci_main\n", rdp.ci_count); |
403 | } |
404 | else |
405 | { |
406 | cur_fb.status = ci_unknown; |
407 | } |
408 | |
409 | } |
410 | if (rdp.ci_count > 0 && rdp.frame_buffers[rdp.ci_count-1].status == ci_unknown) //status of previous fb was not changed - it is useless |
411 | { |
412 | if (fb_hwfbe_enabled && !(settings.frame_buffer & fb_useless_is_useless)) |
413 | { |
414 | rdp.frame_buffers[rdp.ci_count-1].status = ci_aux; |
415 | rdp.frame_buffers[rdp.ci_count-1].changed = 0; |
416 | FRDP("rdp.frame_buffers[%d].status = ci_aux\n", rdp.ci_count-1); |
417 | } |
418 | else |
419 | { |
420 | rdp.frame_buffers[rdp.ci_count-1].status = ci_useless; |
421 | /* |
422 | wxUint32 addr = rdp.frame_buffers[rdp.ci_count-1].addr; |
423 | for (int i = 0; i < rdp.ci_count - 1; i++) |
424 | { |
425 | if (rdp.frame_buffers[i].addr == addr) |
426 | { |
427 | rdp.frame_buffers[rdp.ci_count-1].status = rdp.frame_buffers[i].status; |
428 | break; |
429 | } |
430 | } |
431 | //*/ |
432 | FRDP("rdp.frame_buffers[%d].status = %s\n", rdp.ci_count-1, CIStatus[rdp.frame_buffers[rdp.ci_count-1].status]); |
433 | } |
434 | } |
435 | if (cur_fb.status == ci_main) |
436 | { |
437 | int viSwapOK = ((settings.swapmode == 2) && (rdp.vi_org_reg == *gfx.VI_ORIGIN_REG)) ? FALSE : TRUE; |
438 | if ((rdp.maincimg[0].addr != cur_fb.addr) && SwapOK && viSwapOK) |
439 | { |
440 | SwapOK = FALSE; |
441 | rdp.swap_ci_index = rdp.ci_count; |
442 | } |
443 | } |
444 | rdp.ci_count++; |
445 | if (rdp.ci_count > NUMTEXBUF) //overflow |
446 | rdp.halt = 1; |
447 | } |
448 | |
449 | // RDP graphic instructions pointer table used in DetectFrameBufferUsage |
450 | |
451 | static rdp_instr gfx_instruction_lite[9][256] = |
452 | { |
453 | { |
454 | // uCode 0 - RSP SW 2.0X |
455 | // 00-3f |
456 | // games: Super Mario 64, Tetrisphere, Demos |
457 | 0, 0, 0, 0, |
458 | 0, 0, uc0_displaylist, 0, |
459 | 0, 0, 0, 0, |
460 | 0, 0, 0, 0, |
461 | 0, 0, 0, 0, |
462 | 0, 0, 0, 0, |
463 | 0, 0, 0, 0, |
464 | 0, 0, 0, 0, |
465 | 0, 0, 0, 0, |
466 | 0, 0, 0, 0, |
467 | 0, 0, 0, 0, |
468 | 0, 0, 0, 0, |
469 | 0, 0, 0, 0, |
470 | 0, 0, 0, 0, |
471 | 0, 0, 0, 0, |
472 | 0, 0, 0, 0, |
473 | // 40-7f: Unused |
474 | 0, 0, 0, 0, |
475 | 0, 0, 0, 0, |
476 | 0, 0, 0, 0, |
477 | 0, 0, 0, 0, |
478 | 0, 0, 0, 0, |
479 | 0, 0, 0, 0, |
480 | 0, 0, 0, 0, |
481 | 0, 0, 0, 0, |
482 | 0, 0, 0, 0, |
483 | 0, 0, 0, 0, |
484 | 0, 0, 0, 0, |
485 | 0, 0, 0, 0, |
486 | 0, 0, 0, 0, |
487 | 0, 0, 0, 0, |
488 | 0, 0, 0, 0, |
489 | 0, 0, 0, 0, |
490 | // 80-bf: Immediate commands |
491 | 0, 0, 0, 0, |
492 | 0, 0, 0, 0, |
493 | 0, 0, 0, 0, |
494 | 0, 0, 0, 0, |
495 | 0, 0, 0, 0, |
496 | 0, 0, 0, 0, |
497 | 0, 0, 0, 0, |
498 | 0, 0, 0, 0, |
499 | 0, 0, 0, 0, |
500 | 0, 0, 0, 0, |
501 | 0, 0, 0, 0, |
502 | 0, 0, 0, 0, |
503 | 0, 0, 0, 0, |
504 | 0, 0, 0, 0, |
505 | uc0_enddl, 0, 0, 0, |
506 | fb_uc0_moveword, 0, uc0_culldl, 0, |
507 | // c0-ff: RDP commands |
508 | 0, 0, 0, 0, |
509 | 0, 0, 0, 0, |
510 | 0, 0, 0, 0, |
511 | 0, 0, 0, 0, |
512 | 0, 0, 0, 0, |
513 | 0, 0, 0, 0, |
514 | 0, 0, 0, 0, |
515 | 0, 0, 0, 0, |
516 | 0, 0, 0, 0, |
517 | fb_rect, fb_rect, 0, 0, |
518 | 0, 0, 0, 0, |
519 | 0, fb_setscissor, 0, 0, |
520 | 0, 0, 0, 0, |
521 | 0, 0, fb_rect, 0, |
522 | 0, 0, 0, 0, |
523 | 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage |
524 | }, |
525 | |
526 | // uCode 1 - F3DEX 1.XX |
527 | // 00-3f |
528 | // games: Mario Kart, Star Fox |
529 | { |
530 | 0, 0, 0, 0, |
531 | 0, 0, uc0_displaylist, 0, |
532 | 0, 0, 0, 0, |
533 | 0, 0, 0, 0, |
534 | 0, 0, 0, 0, |
535 | 0, 0, 0, 0, |
536 | 0, 0, 0, 0, |
537 | 0, 0, 0, 0, |
538 | 0, 0, 0, 0, |
539 | 0, 0, 0, 0, |
540 | 0, 0, 0, 0, |
541 | 0, 0, 0, 0, |
542 | 0, 0, 0, 0, |
543 | 0, 0, 0, 0, |
544 | 0, 0, 0, 0, |
545 | 0, 0, 0, 0, |
546 | // 40-7f: unused |
547 | 0, 0, 0, 0, |
548 | 0, 0, 0, 0, |
549 | 0, 0, 0, 0, |
550 | 0, 0, 0, 0, |
551 | 0, 0, 0, 0, |
552 | 0, 0, 0, 0, |
553 | 0, 0, 0, 0, |
554 | 0, 0, 0, 0, |
555 | 0, 0, 0, 0, |
556 | 0, 0, 0, 0, |
557 | 0, 0, 0, 0, |
558 | 0, 0, 0, 0, |
559 | 0, 0, 0, 0, |
560 | 0, 0, 0, 0, |
561 | 0, 0, 0, 0, |
562 | 0, 0, 0, 0, |
563 | // 80-bf: Immediate commands |
564 | 0, 0, 0, 0, |
565 | 0, 0, 0, 0, |
566 | 0, 0, 0, 0, |
567 | 0, 0, 0, 0, |
568 | 0, 0, 0, 0, |
569 | 0, 0, 0, 0, |
570 | 0, 0, 0, 0, |
571 | 0, 0, 0, 0, |
572 | 0, 0, 0, 0, |
573 | 0, 0, 0, 0, |
574 | 0, 0, 0, 0, |
575 | 0, 0, 0, uc6_loaducode, |
576 | uc1_branch_z, 0, 0, 0, |
577 | fb_rdphalf_1, 0, 0, 0, |
578 | uc0_enddl, 0, 0, 0, |
579 | fb_uc0_moveword, 0, uc2_culldl, 0, |
580 | // c0-ff: RDP commands |
581 | 0, 0, 0, 0, |
582 | 0, 0, 0, 0, |
583 | 0, 0, 0, 0, |
584 | 0, 0, 0, 0, |
585 | 0, 0, 0, 0, |
586 | 0, 0, 0, 0, |
587 | 0, 0, 0, 0, |
588 | 0, 0, 0, 0, |
589 | 0, 0, 0, 0, |
590 | fb_rect, fb_rect, 0, 0, |
591 | 0, 0, 0, 0, |
592 | 0, fb_setscissor, 0, 0, |
593 | 0, 0, 0, 0, |
594 | 0, 0, fb_rect, 0, |
595 | 0, 0, 0, 0, |
596 | 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage |
597 | }, |
598 | |
599 | // uCode 2 - F3DEX 2.XX |
600 | // games: Zelda 64 |
601 | { |
602 | // 00-3f |
603 | 0, 0, 0, uc2_culldl, |
604 | uc1_branch_z, 0, 0, 0, |
605 | 0, fb_bg_copy, fb_bg_copy, 0, |
606 | 0, 0, 0, 0, |
607 | 0, 0, 0, 0, |
608 | 0, 0, 0, 0, |
609 | 0, 0, 0, 0, |
610 | 0, 0, 0, 0, |
611 | 0, 0, 0, 0, |
612 | 0, 0, 0, 0, |
613 | 0, 0, 0, 0, |
614 | 0, 0, 0, 0, |
615 | 0, 0, 0, 0, |
616 | 0, 0, 0, 0, |
617 | 0, 0, 0, 0, |
618 | 0, 0, 0, 0, |
619 | |
620 | // 40-7f: unused |
621 | 0, 0, 0, 0, |
622 | 0, 0, 0, 0, |
623 | 0, 0, 0, 0, |
624 | 0, 0, 0, 0, |
625 | 0, 0, 0, 0, |
626 | 0, 0, 0, 0, |
627 | 0, 0, 0, 0, |
628 | 0, 0, 0, 0, |
629 | 0, 0, 0, 0, |
630 | 0, 0, 0, 0, |
631 | 0, 0, 0, 0, |
632 | 0, 0, 0, 0, |
633 | 0, 0, 0, 0, |
634 | 0, 0, 0, 0, |
635 | 0, 0, 0, 0, |
636 | 0, 0, 0, 0, |
637 | |
638 | // 80-bf: unused |
639 | 0, 0, 0, 0, |
640 | 0, 0, 0, 0, |
641 | 0, 0, 0, 0, |
642 | 0, 0, 0, 0, |
643 | 0, 0, 0, 0, |
644 | 0, 0, 0, 0, |
645 | 0, 0, 0, 0, |
646 | 0, 0, 0, 0, |
647 | 0, 0, 0, 0, |
648 | 0, 0, 0, 0, |
649 | 0, 0, 0, 0, |
650 | 0, 0, 0, 0, |
651 | 0, 0, 0, 0, |
652 | 0, 0, 0, 0, |
653 | 0, 0, 0, 0, |
654 | 0, 0, 0, 0, |
655 | |
656 | // c0-ff: RDP commands mixed with uc2 commands |
657 | 0, 0, 0, 0, |
658 | 0, 0, 0, 0, |
659 | 0, 0, 0, 0, |
660 | 0, 0, 0, 0, |
661 | 0, 0, 0, 0, |
662 | 0, uc2_dlist_cnt, 0, 0, |
663 | 0, 0, 0, fb_uc2_moveword, |
664 | fb_uc2_movemem, uc2_load_ucode, uc0_displaylist, uc0_enddl, |
665 | 0, fb_rdphalf_1, 0, 0, |
666 | fb_rect, fb_rect, 0, 0, |
667 | 0, 0, 0, 0, |
668 | 0, fb_setscissor, 0, 0, |
669 | 0, 0, 0, 0, |
670 | 0, 0, fb_rect, 0, |
671 | 0, 0, 0, 0, |
672 | 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage |
673 | }, |
674 | |
675 | // uCode 3 - "RSP SW 2.0D", but not really |
676 | // 00-3f |
677 | // games: Wave Race |
678 | // ** Added by Gonetz ** |
679 | { |
680 | 0, 0, 0, 0, |
681 | 0, 0, uc0_displaylist, 0, |
682 | 0, 0, 0, 0, |
683 | 0, 0, 0, 0, |
684 | 0, 0, 0, 0, |
685 | 0, 0, 0, 0, |
686 | 0, 0, 0, 0, |
687 | 0, 0, 0, 0, |
688 | 0, 0, 0, 0, |
689 | 0, 0, 0, 0, |
690 | 0, 0, 0, 0, |
691 | 0, 0, 0, 0, |
692 | 0, 0, 0, 0, |
693 | 0, 0, 0, 0, |
694 | 0, 0, 0, 0, |
695 | 0, 0, 0, 0, |
696 | // 40-7f: unused |
697 | 0, 0, 0, 0, |
698 | 0, 0, 0, 0, |
699 | 0, 0, 0, 0, |
700 | 0, 0, 0, 0, |
701 | 0, 0, 0, 0, |
702 | 0, 0, 0, 0, |
703 | 0, 0, 0, 0, |
704 | 0, 0, 0, 0, |
705 | 0, 0, 0, 0, |
706 | 0, 0, 0, 0, |
707 | 0, 0, 0, 0, |
708 | 0, 0, 0, 0, |
709 | 0, 0, 0, 0, |
710 | 0, 0, 0, 0, |
711 | 0, 0, 0, 0, |
712 | 0, 0, 0, 0, |
713 | // 80-bf: Immediate commands |
714 | 0, 0, 0, 0, |
715 | 0, 0, 0, 0, |
716 | 0, 0, 0, 0, |
717 | 0, 0, 0, 0, |
718 | 0, 0, 0, 0, |
719 | 0, 0, 0, 0, |
720 | 0, 0, 0, 0, |
721 | 0, 0, 0, 0, |
722 | 0, 0, 0, 0, |
723 | 0, 0, 0, 0, |
724 | 0, 0, 0, 0, |
725 | 0, 0, 0, 0, |
726 | 0, 0, 0, 0, |
727 | 0, 0, 0, 0, |
728 | uc0_enddl, 0, 0, 0, |
729 | fb_uc0_moveword, 0, uc0_culldl, 0, |
730 | // c0-ff: RDP commands |
731 | 0, 0, 0, 0, |
732 | 0, 0, 0, 0, |
733 | 0, 0, 0, 0, |
734 | 0, 0, 0, 0, |
735 | 0, 0, 0, 0, |
736 | 0, 0, 0, 0, |
737 | 0, 0, 0, 0, |
738 | 0, 0, 0, 0, |
739 | 0, 0, 0, 0, |
740 | fb_rect, fb_rect, 0, 0, |
741 | 0, 0, 0, 0, |
742 | 0, fb_setscissor, 0, 0, |
743 | 0, 0, 0, 0, |
744 | 0, 0, fb_rect, 0, |
745 | 0, 0, 0, 0, |
746 | 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage |
747 | }, |
748 | |
749 | { |
750 | // uCode 4 - RSP SW 2.0D EXT |
751 | // 00-3f |
752 | // games: Star Wars: Shadows of the Empire |
753 | 0, 0, 0, 0, |
754 | 0, 0, uc0_displaylist, 0, |
755 | 0, 0, 0, 0, |
756 | 0, 0, 0, 0, |
757 | 0, 0, 0, 0, |
758 | 0, 0, 0, 0, |
759 | 0, 0, 0, 0, |
760 | 0, 0, 0, 0, |
761 | 0, 0, 0, 0, |
762 | 0, 0, 0, 0, |
763 | 0, 0, 0, 0, |
764 | 0, 0, 0, 0, |
765 | 0, 0, 0, 0, |
766 | 0, 0, 0, 0, |
767 | 0, 0, 0, 0, |
768 | 0, 0, 0, 0, |
769 | // 40-7f: Unused |
770 | 0, 0, 0, 0, |
771 | 0, 0, 0, 0, |
772 | 0, 0, 0, 0, |
773 | 0, 0, 0, 0, |
774 | 0, 0, 0, 0, |
775 | 0, 0, 0, 0, |
776 | 0, 0, 0, 0, |
777 | 0, 0, 0, 0, |
778 | 0, 0, 0, 0, |
779 | 0, 0, 0, 0, |
780 | 0, 0, 0, 0, |
781 | 0, 0, 0, 0, |
782 | 0, 0, 0, 0, |
783 | 0, 0, 0, 0, |
784 | 0, 0, 0, 0, |
785 | 0, 0, 0, 0, |
786 | // 80-bf: Immediate commands |
787 | 0, 0, 0, 0, |
788 | 0, 0, 0, 0, |
789 | 0, 0, 0, 0, |
790 | 0, 0, 0, 0, |
791 | 0, 0, 0, 0, |
792 | 0, 0, 0, 0, |
793 | 0, 0, 0, 0, |
794 | 0, 0, 0, 0, |
795 | 0, 0, 0, 0, |
796 | 0, 0, 0, 0, |
797 | 0, 0, 0, 0, |
798 | 0, 0, 0, 0, |
799 | 0, 0, 0, 0, |
800 | 0, 0, 0, 0, |
801 | uc0_enddl, 0, 0, 0, |
802 | fb_uc0_moveword, 0, uc0_culldl, 0, |
803 | // c0-ff: RDP commands |
804 | rdp_noop, 0, 0, 0, |
805 | 0, 0, 0, 0, |
806 | 0, 0, 0, 0, |
807 | 0, 0, 0, 0, |
808 | 0, 0, 0, 0, |
809 | 0, 0, 0, 0, |
810 | 0, 0, 0, 0, |
811 | 0, 0, 0, 0, |
812 | 0, 0, 0, 0, |
813 | fb_rect, fb_rect, 0, 0, |
814 | 0, 0, 0, 0, |
815 | 0, fb_setscissor, 0, 0, |
816 | 0, 0, 0, 0, |
817 | 0, 0, fb_rect, 0, |
818 | 0, 0, 0, 0, |
819 | 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage |
820 | }, |
821 | |
822 | { |
823 | // uCode 5 - RSP SW 2.0 Diddy |
824 | // 00-3f |
825 | // games: Diddy Kong Racing |
826 | 0, 0, 0, 0, |
827 | 0, 0, uc0_displaylist, uc5_dl_in_mem, |
828 | 0, 0, 0, 0, |
829 | 0, 0, 0, 0, |
830 | 0, 0, 0, 0, |
831 | 0, 0, 0, 0, |
832 | 0, 0, 0, 0, |
833 | 0, 0, 0, 0, |
834 | 0, 0, 0, 0, |
835 | 0, 0, 0, 0, |
836 | 0, 0, 0, 0, |
837 | 0, 0, 0, 0, |
838 | 0, 0, 0, 0, |
839 | 0, 0, 0, 0, |
840 | 0, 0, 0, 0, |
841 | 0, 0, 0, 0, |
842 | // 40-7f: Unused |
843 | 0, 0, 0, 0, |
844 | 0, 0, 0, 0, |
845 | 0, 0, 0, 0, |
846 | 0, 0, 0, 0, |
847 | 0, 0, 0, 0, |
848 | 0, 0, 0, 0, |
849 | 0, 0, 0, 0, |
850 | 0, 0, 0, 0, |
851 | 0, 0, 0, 0, |
852 | 0, 0, 0, 0, |
853 | 0, 0, 0, 0, |
854 | 0, 0, 0, 0, |
855 | 0, 0, 0, 0, |
856 | 0, 0, 0, 0, |
857 | 0, 0, 0, 0, |
858 | 0, 0, 0, 0, |
859 | // 80-bf: Immediate commands |
860 | 0, 0, 0, 0, |
861 | 0, 0, 0, 0, |
862 | 0, 0, 0, 0, |
863 | 0, 0, 0, 0, |
864 | 0, 0, 0, 0, |
865 | 0, 0, 0, 0, |
866 | 0, 0, 0, 0, |
867 | 0, 0, 0, 0, |
868 | 0, 0, 0, 0, |
869 | 0, 0, 0, 0, |
870 | 0, 0, 0, 0, |
871 | 0, 0, 0, 0, |
872 | 0, 0, 0, 0, |
873 | 0, 0, 0, 0, |
874 | uc0_enddl, 0, 0, 0, |
875 | fb_uc0_moveword, 0, uc0_culldl, 0, |
876 | // c0-ff: RDP commands |
877 | 0, 0, 0, 0, |
878 | 0, 0, 0, 0, |
879 | 0, 0, 0, 0, |
880 | 0, 0, 0, 0, |
881 | 0, 0, 0, 0, |
882 | 0, 0, 0, 0, |
883 | 0, 0, 0, 0, |
884 | 0, 0, 0, 0, |
885 | 0, 0, 0, 0, |
886 | fb_rect, fb_rect, 0, 0, |
887 | 0, 0, 0, 0, |
888 | 0, fb_setscissor, 0, 0, |
889 | 0, 0, 0, 0, |
890 | 0, 0, fb_rect, 0, |
891 | 0, 0, 0, 0, |
892 | 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage |
893 | }, |
894 | |
895 | // uCode 6 - S2DEX 1.XX |
896 | // games: Yoshi's Story |
897 | { |
898 | 0, 0, 0, 0, |
899 | 0, 0, uc0_displaylist, 0, |
900 | 0, 0, 0, 0, |
901 | 0, 0, 0, 0, |
902 | 0, 0, 0, 0, |
903 | 0, 0, 0, 0, |
904 | 0, 0, 0, 0, |
905 | 0, 0, 0, 0, |
906 | 0, 0, 0, 0, |
907 | 0, 0, 0, 0, |
908 | 0, 0, 0, 0, |
909 | 0, 0, 0, 0, |
910 | 0, 0, 0, 0, |
911 | 0, 0, 0, 0, |
912 | 0, 0, 0, 0, |
913 | 0, 0, 0, 0, |
914 | // 40-7f: unused |
915 | 0, 0, 0, 0, |
916 | 0, 0, 0, 0, |
917 | 0, 0, 0, 0, |
918 | 0, 0, 0, 0, |
919 | 0, 0, 0, 0, |
920 | 0, 0, 0, 0, |
921 | 0, 0, 0, 0, |
922 | 0, 0, 0, 0, |
923 | 0, 0, 0, 0, |
924 | 0, 0, 0, 0, |
925 | 0, 0, 0, 0, |
926 | 0, 0, 0, 0, |
927 | 0, 0, 0, 0, |
928 | 0, 0, 0, 0, |
929 | 0, 0, 0, 0, |
930 | 0, 0, 0, 0, |
931 | // 80-bf: Immediate commands |
932 | 0, 0, 0, 0, |
933 | 0, 0, 0, 0, |
934 | 0, 0, 0, 0, |
935 | 0, 0, 0, 0, |
936 | 0, 0, 0, 0, |
937 | 0, 0, 0, 0, |
938 | 0, 0, 0, 0, |
939 | 0, 0, 0, 0, |
940 | 0, 0, 0, 0, |
941 | 0, 0, 0, 0, |
942 | 0, 0, 0, 0, |
943 | 0, 0, 0, uc6_loaducode, |
944 | uc6_select_dl, 0, 0, 0, |
945 | 0, 0, 0, 0, |
946 | uc0_enddl, 0, 0, 0, |
947 | fb_uc0_moveword, 0, uc2_culldl, 0, |
948 | // c0-ff: RDP commands |
949 | 0, fb_loadtxtr, fb_loadtxtr, fb_loadtxtr, |
950 | fb_loadtxtr, 0, 0, 0, |
951 | 0, 0, 0, 0, |
952 | 0, 0, 0, 0, |
953 | 0, 0, 0, 0, |
954 | 0, 0, 0, 0, |
955 | 0, 0, 0, 0, |
956 | 0, 0, 0, 0, |
957 | 0, 0, 0, 0, |
958 | fb_rect, fb_rect, 0, 0, |
959 | 0, 0, 0, 0, |
960 | 0, fb_setscissor, 0, 0, |
961 | 0, 0, 0, 0, |
962 | 0, 0, fb_rect, 0, |
963 | 0, 0, 0, 0, |
964 | 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage |
965 | }, |
966 | |
967 | { |
968 | 0, 0, 0, 0, |
969 | 0, 0, uc0_displaylist, 0, |
970 | 0, 0, 0, 0, |
971 | 0, 0, 0, 0, |
972 | 0, 0, 0, 0, |
973 | 0, 0, 0, 0, |
974 | 0, 0, 0, 0, |
975 | 0, 0, 0, 0, |
976 | 0, 0, 0, 0, |
977 | 0, 0, 0, 0, |
978 | 0, 0, 0, 0, |
979 | 0, 0, 0, 0, |
980 | 0, 0, 0, 0, |
981 | 0, 0, 0, 0, |
982 | 0, 0, 0, 0, |
983 | 0, 0, 0, 0, |
984 | // 40-7f: unused |
985 | 0, 0, 0, 0, |
986 | 0, 0, 0, 0, |
987 | 0, 0, 0, 0, |
988 | 0, 0, 0, 0, |
989 | 0, 0, 0, 0, |
990 | 0, 0, 0, 0, |
991 | 0, 0, 0, 0, |
992 | 0, 0, 0, 0, |
993 | 0, 0, 0, 0, |
994 | 0, 0, 0, 0, |
995 | 0, 0, 0, 0, |
996 | 0, 0, 0, 0, |
997 | 0, 0, 0, 0, |
998 | 0, 0, 0, 0, |
999 | 0, 0, 0, 0, |
1000 | 0, 0, 0, 0, |
1001 | // 80-bf: Immediate commands |
1002 | 0, 0, 0, 0, |
1003 | 0, 0, 0, 0, |
1004 | 0, 0, 0, 0, |
1005 | 0, 0, 0, 0, |
1006 | 0, 0, 0, 0, |
1007 | 0, 0, 0, 0, |
1008 | 0, 0, 0, 0, |
1009 | 0, 0, 0, 0, |
1010 | 0, 0, 0, 0, |
1011 | 0, 0, 0, 0, |
1012 | 0, 0, 0, 0, |
1013 | 0, 0, 0, 0, |
1014 | 0, 0, 0, 0, |
1015 | 0, 0, 0, 0, |
1016 | uc0_enddl, 0, 0, 0, |
1017 | fb_uc0_moveword, 0, uc0_culldl, 0, |
1018 | // c0-ff: RDP commands |
1019 | 0, 0, 0, 0, |
1020 | 0, 0, 0, 0, |
1021 | 0, 0, 0, 0, |
1022 | 0, 0, 0, 0, |
1023 | 0, 0, 0, 0, |
1024 | 0, 0, 0, 0, |
1025 | 0, 0, 0, 0, |
1026 | 0, 0, 0, 0, |
1027 | 0, 0, 0, 0, |
1028 | fb_rect, fb_rect, 0, 0, |
1029 | 0, 0, 0, 0, |
1030 | 0, fb_setscissor, 0, 0, |
1031 | 0, 0, 0, 0, |
1032 | 0, 0, fb_rect, 0, |
1033 | 0, 0, 0, 0, |
1034 | 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage |
1035 | }, |
1036 | |
1037 | { |
1038 | // 00-3f |
1039 | 0, 0, 0, uc2_culldl, |
1040 | uc1_branch_z, 0, 0, 0, |
1041 | 0, fb_bg_copy, fb_bg_copy, 0, |
1042 | 0, 0, 0, 0, |
1043 | 0, 0, 0, 0, |
1044 | 0, 0, 0, 0, |
1045 | 0, 0, 0, 0, |
1046 | 0, 0, 0, 0, |
1047 | 0, 0, 0, 0, |
1048 | 0, 0, 0, 0, |
1049 | 0, 0, 0, 0, |
1050 | 0, 0, 0, 0, |
1051 | 0, 0, 0, 0, |
1052 | 0, 0, 0, 0, |
1053 | 0, 0, 0, 0, |
1054 | 0, 0, 0, 0, |
1055 | |
1056 | // 40-7f: unused |
1057 | 0, 0, 0, 0, |
1058 | 0, 0, 0, 0, |
1059 | 0, 0, 0, 0, |
1060 | 0, 0, 0, 0, |
1061 | 0, 0, 0, 0, |
1062 | 0, 0, 0, 0, |
1063 | 0, 0, 0, 0, |
1064 | 0, 0, 0, 0, |
1065 | 0, 0, 0, 0, |
1066 | 0, 0, 0, 0, |
1067 | 0, 0, 0, 0, |
1068 | 0, 0, 0, 0, |
1069 | 0, 0, 0, 0, |
1070 | 0, 0, 0, 0, |
1071 | 0, 0, 0, 0, |
1072 | 0, 0, 0, 0, |
1073 | |
1074 | // 80-bf: unused |
1075 | 0, 0, 0, 0, |
1076 | 0, 0, 0, 0, |
1077 | 0, 0, 0, 0, |
1078 | 0, 0, 0, 0, |
1079 | 0, 0, 0, 0, |
1080 | 0, 0, 0, 0, |
1081 | 0, 0, 0, 0, |
1082 | 0, 0, 0, 0, |
1083 | 0, 0, 0, 0, |
1084 | 0, 0, 0, 0, |
1085 | 0, 0, 0, 0, |
1086 | 0, 0, 0, 0, |
1087 | 0, 0, 0, 0, |
1088 | 0, 0, 0, 0, |
1089 | 0, 0, 0, 0, |
1090 | 0, 0, 0, 0, |
1091 | |
1092 | // c0-ff: RDP commands mixed with uc2 commands |
1093 | 0, 0, 0, 0, |
1094 | 0, 0, 0, 0, |
1095 | 0, 0, 0, 0, |
1096 | 0, 0, 0, 0, |
1097 | 0, 0, 0, 0, |
1098 | 0, uc2_dlist_cnt, 0, 0, |
1099 | 0, 0, 0, fb_uc2_moveword, |
1100 | 0, uc2_load_ucode, uc0_displaylist, uc0_enddl, |
1101 | 0, 0, 0, 0, |
1102 | fb_rect, fb_rect, 0, 0, |
1103 | 0, 0, 0, 0, |
1104 | 0, fb_setscissor, 0, 0, |
1105 | 0, 0, 0, 0, |
1106 | 0, 0, fb_rect, 0, |
1107 | 0, 0, 0, 0, |
1108 | 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage |
1109 | } |
1110 | }; |