X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=source%2Fgles2glide64%2Fsrc%2FGlide64%2FucodeFB.h;fp=source%2Fgles2glide64%2Fsrc%2FGlide64%2FucodeFB.h;h=c734fabd9b8c0c66bf1a412208ddd43b59973363;hb=98e75f2d18c02c233da543560f76282f04fc796c;hp=0000000000000000000000000000000000000000;hpb=0ced54f867d36e8b324155bef49e8abfebfc3237;p=mupen64plus-pandora.git diff --git a/source/gles2glide64/src/Glide64/ucodeFB.h b/source/gles2glide64/src/Glide64/ucodeFB.h new file mode 100644 index 0000000..c734fab --- /dev/null +++ b/source/gles2glide64/src/Glide64/ucodeFB.h @@ -0,0 +1,1110 @@ +/* +* Glide64 - Glide video plugin for Nintendo 64 emulators. +* Copyright (c) 2002 Dave2001 +* Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +//**************************************************************** +// +// Glide64 - Glide Plugin for Nintendo 64 emulators +// Project started on December 29th, 2001 +// +// Authors: +// Dave2001, original author, founded the project in 2001, left it in 2002 +// Gugaman, joined the project in 2002, left it in 2002 +// Sergey 'Gonetz' Lipski, joined the project in 2002, main author since fall of 2002 +// Hiroshi 'KoolSmoky' Morii, joined the project in 2007 +// +//**************************************************************** +// +// To modify Glide64: +// * 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. +// * 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. +// +//**************************************************************** +// +// Creation 13 August 2003 Gonetz +// +//**************************************************************** + +static void fb_uc0_moveword() +{ + if ((rdp.cmd0 & 0xFF) == 0x06) // segment + { + rdp.segment[(rdp.cmd0 >> 10) & 0x0F] = rdp.cmd1; + } +} + +static void fb_uc2_moveword() +{ + if (((rdp.cmd0 >> 16) & 0xFF) == 0x06) // segment + { + rdp.segment[((rdp.cmd0 & 0xFFFF) >> 2)&0xF] = rdp.cmd1; + } +} + +static void fb_bg_copy () +{ + if (rdp.main_ci == 0) + return; + CI_STATUS status = rdp.frame_buffers[rdp.ci_count-1].status; + if ( (status == ci_copy) ) + return; + + wxUint32 addr = segoffset(rdp.cmd1) >> 1; + wxUint8 imageFmt = ((wxUint8 *)gfx.RDRAM)[(((addr+11)<<1)+0)^3]; + wxUint8 imageSiz = ((wxUint8 *)gfx.RDRAM)[(((addr+11)<<1)+1)^3]; + wxUint32 imagePtr = segoffset(((wxUint32*)gfx.RDRAM)[(addr+8)>>1]); + 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); + + if (status == ci_main) + { + wxUint16 frameW = ((wxUint16 *)gfx.RDRAM)[(addr+3)^1] >> 2; + wxUint16 frameH = ((wxUint16 *)gfx.RDRAM)[(addr+7)^1] >> 2; + if ( (frameW == rdp.frame_buffers[rdp.ci_count-1].width) && (frameH == rdp.frame_buffers[rdp.ci_count-1].height) ) + rdp.main_ci_bg = imagePtr; + } + else if (imagePtr >= rdp.main_ci && imagePtr < rdp.main_ci_end) //addr within main frame buffer + { + rdp.copy_ci_index = rdp.ci_count-1; + rdp.frame_buffers[rdp.copy_ci_index].status = ci_copy; + FRDP("rdp.frame_buffers[%d].status = ci_copy\n", rdp.copy_ci_index); + + if (rdp.frame_buffers[rdp.copy_ci_index].addr != rdp.main_ci_bg) + { + rdp.scale_x = 1.0f; + rdp.scale_y = 1.0f; + } + else + { + LRDP("motion blur!\n"); + rdp.motionblur = TRUE; + } + + FRDP ("Detect FB usage. texture addr is inside framebuffer: %08lx - %08lx \n", imagePtr, rdp.main_ci); + } + else if (imagePtr == rdp.zimg) + { + if (status == ci_unknown) + { + rdp.frame_buffers[rdp.ci_count-1].status = ci_zcopy; + rdp.tmpzimg = rdp.frame_buffers[rdp.ci_count-1].addr; + if (!rdp.copy_zi_index) + rdp.copy_zi_index = rdp.ci_count-1; + FRDP("rdp.frame_buffers[%d].status = ci_zcopy\n", rdp.copy_ci_index); + } + } +} + +static void fb_setscissor() +{ + rdp.scissor_o.lr_y = (wxUint32)(((rdp.cmd1 & 0x00000FFF) >> 2)); + if (rdp.ci_count) + { + rdp.scissor_o.ul_x = (wxUint32)(((rdp.cmd0 & 0x00FFF000) >> 14)); + rdp.scissor_o.lr_x = (wxUint32)(((rdp.cmd1 & 0x00FFF000) >> 14)); + COLOR_IMAGE & cur_fb = rdp.frame_buffers[rdp.ci_count-1]; + if (rdp.scissor_o.lr_x - rdp.scissor_o.ul_x > (wxUint32)(cur_fb.width >> 1)) + { + if (cur_fb.height == 0 || (cur_fb.width >= rdp.scissor_o.lr_x-1 && cur_fb.width <= rdp.scissor_o.lr_x+1)) + cur_fb.height = rdp.scissor_o.lr_y; + } + 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); + } +} + +static void fb_uc2_movemem() +{ + if ((rdp.cmd0 & 0xFF) == 8) + { + wxUint32 a = segoffset(rdp.cmd1) >> 1; + short scale_x = ((short*)gfx.RDRAM)[(a+0)^1] >> 2; + short trans_x = ((short*)gfx.RDRAM)[(a+4)^1] >> 2; + COLOR_IMAGE & cur_fb = rdp.frame_buffers[rdp.ci_count-1]; + if ( abs((int)(scale_x + trans_x - cur_fb.width)) < 3) + { + short scale_y = ((short*)gfx.RDRAM)[(a+1)^1] >> 2; + short trans_y = ((short*)gfx.RDRAM)[(a+5)^1] >> 2; + wxUint32 height = scale_y + trans_y; + if (height < rdp.scissor_o.lr_y) + cur_fb.height = height; + } + } +} + +static void fb_rect() +{ + if (rdp.frame_buffers[rdp.ci_count-1].width == 32) + return; + int ul_x = ((rdp.cmd1 & 0x00FFF000) >> 14); + int lr_x = ((rdp.cmd0 & 0x00FFF000) >> 14); + int width = lr_x-ul_x; + int diff = abs((int)rdp.frame_buffers[rdp.ci_count-1].width - width); + if (diff < 4) + { + wxUint32 lr_y = min(rdp.scissor_o.lr_y, (rdp.cmd0 & 0xFFF) >> 2); + if (rdp.frame_buffers[rdp.ci_count-1].height < lr_y) + { + 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); + rdp.frame_buffers[rdp.ci_count-1].height = lr_y; + } + } +} + +static void fb_rdphalf_1() +{ + branch_dl = rdp.cmd1; +} + + +static void fb_settextureimage() +{ + if (rdp.main_ci == 0) + return; + COLOR_IMAGE & cur_fb = rdp.frame_buffers[rdp.ci_count-1]; + if ( cur_fb.status >= ci_copy ) + return; + if (((rdp.cmd0 >> 19) & 0x03) >= 2) //check that texture is 16/32bit + { + int tex_format = ((rdp.cmd0 >> 21) & 0x07); + wxUint32 addr = segoffset(rdp.cmd1); + if ( tex_format == 0 ) + { + 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); + if (cur_fb.status == ci_main) + { + rdp.main_ci_last_tex_addr = addr; + if (cur_fb.height == 0) + { + cur_fb.height = rdp.scissor_o.lr_y; + rdp.main_ci_end = cur_fb.addr + ((cur_fb.width * cur_fb.height) << cur_fb.size >> 1); + } + } + if ((addr >= rdp.main_ci) && (addr < rdp.main_ci_end)) //addr within main frame buffer + { + if (cur_fb.status == ci_main) + { + rdp.copy_ci_index = rdp.ci_count-1; + cur_fb.status = ci_copy_self; + rdp.scale_x = rdp.scale_x_bak; + rdp.scale_y = rdp.scale_y_bak; + FRDP("rdp.frame_buffers[%d].status = ci_copy_self\n", rdp.ci_count-1); + } + else + { + if (cur_fb.width == rdp.frame_buffers[rdp.main_ci_index].width) + { + rdp.copy_ci_index = rdp.ci_count-1; + cur_fb.status = ci_copy; + FRDP("rdp.frame_buffers[%d].status = ci_copy\n", rdp.copy_ci_index); + if ((rdp.main_ci_last_tex_addr >= cur_fb.addr) && + (rdp.main_ci_last_tex_addr < (cur_fb.addr + cur_fb.width*cur_fb.height*cur_fb.size))) + { + LRDP("motion blur!\n"); + rdp.motionblur = TRUE; + } + else + { + rdp.scale_x = 1.0f; + rdp.scale_y = 1.0f; + } + } + else if (!(settings.frame_buffer & fb_ignore_aux_copy) && cur_fb.width < rdp.frame_buffers[rdp.main_ci_index].width) + { + rdp.copy_ci_index = rdp.ci_count-1; + cur_fb.status = ci_aux_copy; + FRDP("rdp.frame_buffers[%d].status = ci_aux_copy\n", rdp.copy_ci_index); + rdp.scale_x = 1.0f; + rdp.scale_y = 1.0f; + } + else + { + cur_fb.status = ci_aux; + FRDP("rdp.frame_buffers[%d].status = ci_aux\n", rdp.copy_ci_index); + } + } + FRDP ("Detect FB usage. texture addr is inside framebuffer: %08lx - %08lx \n", addr, rdp.main_ci); + } + ///* + else if ((cur_fb.status != ci_main) && (addr >= rdp.zimg && addr < rdp.zimg_end)) + { + cur_fb.status = ci_zcopy; + if (!rdp.copy_zi_index) + rdp.copy_zi_index = rdp.ci_count-1; + FRDP("fb_settextureimage. rdp.frame_buffers[%d].status = ci_zcopy\n", rdp.ci_count-1); + } + //*/ + 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))) + { + if (cur_fb.status != ci_main) + { + cur_fb.status = ci_old_copy; + FRDP("rdp.frame_buffers[%d].status = ci_old_copy 1, addr:%08lx\n", rdp.ci_count-1, rdp.last_drawn_ci_addr); + } + rdp.read_previous_ci = TRUE; + LRDP("read_previous_ci = TRUE\n"); + } + else if ((addr >= rdp.last_drawn_ci_addr) && (addr < (rdp.last_drawn_ci_addr + rdp.maincimg[0].width*rdp.maincimg[0].height*2))) + { + if (cur_fb.status != ci_main) + { + cur_fb.status = ci_old_copy; + FRDP("rdp.frame_buffers[%d].status = ci_old_copy 2, addr:%08lx\n", rdp.ci_count-1, rdp.last_drawn_ci_addr); + } + rdp.read_previous_ci = TRUE; + LRDP("read_previous_ci = TRUE\n"); + } + } + else if (fb_hwfbe_enabled && (cur_fb.status == ci_main)) + { + if ((addr >= rdp.main_ci) && (addr < rdp.main_ci_end)) //addr within main frame buffer + { + rdp.copy_ci_index = rdp.ci_count-1; + rdp.black_ci_index = rdp.ci_count-1; + cur_fb.status = ci_copy_self; + FRDP("rdp.frame_buffers[%d].status = ci_copy_self\n", rdp.ci_count-1); + } + } + } + if (cur_fb.status == ci_unknown) + { + cur_fb.status = ci_aux; + FRDP("fb_settextureimage. rdp.frame_buffers[%d].status = ci_aux\n", rdp.ci_count-1); + } +} + +static void fb_loadtxtr() +{ + if (rdp.frame_buffers[rdp.ci_count-1].status == ci_unknown) + { + rdp.frame_buffers[rdp.ci_count-1].status = ci_aux; + FRDP("rdp.frame_buffers[%d].status = ci_aux\n", rdp.ci_count-1); + } +} + +static void fb_setdepthimage() +{ + rdp.zimg = segoffset(rdp.cmd1) & BMASK; + rdp.zimg_end = rdp.zimg + rdp.ci_width*rdp.ci_height*2; + FRDP ("fb_setdepthimage. addr %08lx - %08lx\n", rdp.zimg, rdp.zimg_end); + if (rdp.zimg == rdp.main_ci) //strange, but can happen + { + rdp.frame_buffers[rdp.main_ci_index].status = ci_unknown; + if (rdp.main_ci_index < rdp.ci_count) + { + rdp.frame_buffers[rdp.main_ci_index].status = ci_zimg; + FRDP("rdp.frame_buffers[%d].status = ci_zimg\n", rdp.main_ci_index); + rdp.main_ci_index++; + rdp.frame_buffers[rdp.main_ci_index].status = ci_main; + FRDP("rdp.frame_buffers[%d].status = ci_main\n", rdp.main_ci_index); + rdp.main_ci = rdp.frame_buffers[rdp.main_ci_index].addr; + 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); + for (int i = rdp.main_ci_index+1; i < rdp.ci_count; i++) + { + COLOR_IMAGE & fb = rdp.frame_buffers[i]; + if (fb.addr == rdp.main_ci) + { + fb.status = ci_main; + FRDP("rdp.frame_buffers[%d].status = ci_main\n", i); + } + } + } + else + { + rdp.main_ci = 0; + } + } + for (int i = 0; i < rdp.ci_count; i++) + { + COLOR_IMAGE & fb = rdp.frame_buffers[i]; + if ((fb.addr == rdp.zimg) && (fb.status == ci_aux || fb.status == ci_useless)) + { + fb.status = ci_zimg; + FRDP("rdp.frame_buffers[%d].status = ci_zimg\n", i); + } + } +} + +static void fb_setcolorimage() +{ + rdp.ocimg = rdp.cimg; + rdp.cimg = segoffset(rdp.cmd1) & BMASK; + COLOR_IMAGE & cur_fb = rdp.frame_buffers[rdp.ci_count]; + cur_fb.width = (rdp.cmd0 & 0xFFF) + 1; + if (cur_fb.width == 32 ) + cur_fb.height = 32; + else if (cur_fb.width == 16 ) + cur_fb.height = 16; + else if (rdp.ci_count > 0) + cur_fb.height = rdp.scissor_o.lr_y; + else + cur_fb.height = 0; + cur_fb.format = (rdp.cmd0 >> 21) & 0x7; + cur_fb.size = (rdp.cmd0 >> 19) & 0x3; + cur_fb.addr = rdp.cimg; + cur_fb.changed = 1; + /* + if (rdp.ci_count > 0) + if (rdp.frame_buffers[0].addr == rdp.cimg) + rdp.frame_buffers[0].height = rdp.scissor_o.lr_y; + */ + 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); + if (rdp.cimg == rdp.zimg) + { + cur_fb.status = ci_zimg; + rdp.zimg_end = rdp.zimg + cur_fb.width*rdp.scissor_o.lr_y*2; + FRDP("rdp.frame_buffers[%d].status = ci_zimg\n", rdp.ci_count); + } + else if (rdp.cimg == rdp.tmpzimg) + { + cur_fb.status = ci_zcopy; + if (!rdp.copy_zi_index) + rdp.copy_zi_index = rdp.ci_count-1; + FRDP("rdp.frame_buffers[%d].status = ci_zcopy\n", rdp.ci_count); + } + else if (rdp.main_ci != 0) + { + if (rdp.cimg == rdp.main_ci) //switched to main fb again + { + cur_fb.height = max(cur_fb.height, rdp.frame_buffers[rdp.main_ci_index].height); + rdp.main_ci_index = rdp.ci_count; + rdp.main_ci_end = rdp.cimg + ((cur_fb.width * cur_fb.height) << cur_fb.size >> 1); + cur_fb.status = ci_main; + FRDP("rdp.frame_buffers[%d].status = ci_main\n", rdp.ci_count); + } + else // status is not known yet + { + cur_fb.status = ci_unknown; + } + } + else + { + if ((rdp.zimg != rdp.cimg))//&& (rdp.ocimg != rdp.cimg)) + { + rdp.main_ci = rdp.cimg; + rdp.main_ci_end = rdp.cimg + ((cur_fb.width * cur_fb.height) << cur_fb.size >> 1); + rdp.main_ci_index = rdp.ci_count; + cur_fb.status = ci_main; + FRDP("rdp.frame_buffers[%d].status = ci_main\n", rdp.ci_count); + } + else + { + cur_fb.status = ci_unknown; + } + + } + 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 + { + if (fb_hwfbe_enabled && !(settings.frame_buffer & fb_useless_is_useless)) + { + rdp.frame_buffers[rdp.ci_count-1].status = ci_aux; + rdp.frame_buffers[rdp.ci_count-1].changed = 0; + FRDP("rdp.frame_buffers[%d].status = ci_aux\n", rdp.ci_count-1); + } + else + { + rdp.frame_buffers[rdp.ci_count-1].status = ci_useless; + /* + wxUint32 addr = rdp.frame_buffers[rdp.ci_count-1].addr; + for (int i = 0; i < rdp.ci_count - 1; i++) + { + if (rdp.frame_buffers[i].addr == addr) + { + rdp.frame_buffers[rdp.ci_count-1].status = rdp.frame_buffers[i].status; + break; + } + } + //*/ + FRDP("rdp.frame_buffers[%d].status = %s\n", rdp.ci_count-1, CIStatus[rdp.frame_buffers[rdp.ci_count-1].status]); + } + } + if (cur_fb.status == ci_main) + { + int viSwapOK = ((settings.swapmode == 2) && (rdp.vi_org_reg == *gfx.VI_ORIGIN_REG)) ? FALSE : TRUE; + if ((rdp.maincimg[0].addr != cur_fb.addr) && SwapOK && viSwapOK) + { + SwapOK = FALSE; + rdp.swap_ci_index = rdp.ci_count; + } + } + rdp.ci_count++; + if (rdp.ci_count > NUMTEXBUF) //overflow + rdp.halt = 1; +} + +// RDP graphic instructions pointer table used in DetectFrameBufferUsage + +static rdp_instr gfx_instruction_lite[9][256] = +{ + { + // uCode 0 - RSP SW 2.0X + // 00-3f + // games: Super Mario 64, Tetrisphere, Demos + 0, 0, 0, 0, + 0, 0, uc0_displaylist, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 40-7f: Unused + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 80-bf: Immediate commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + uc0_enddl, 0, 0, 0, + fb_uc0_moveword, 0, uc0_culldl, 0, + // c0-ff: RDP commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + fb_rect, fb_rect, 0, 0, + 0, 0, 0, 0, + 0, fb_setscissor, 0, 0, + 0, 0, 0, 0, + 0, 0, fb_rect, 0, + 0, 0, 0, 0, + 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage + }, + + // uCode 1 - F3DEX 1.XX + // 00-3f + // games: Mario Kart, Star Fox + { + 0, 0, 0, 0, + 0, 0, uc0_displaylist, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 40-7f: unused + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 80-bf: Immediate commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, uc6_loaducode, + uc1_branch_z, 0, 0, 0, + fb_rdphalf_1, 0, 0, 0, + uc0_enddl, 0, 0, 0, + fb_uc0_moveword, 0, uc2_culldl, 0, + // c0-ff: RDP commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + fb_rect, fb_rect, 0, 0, + 0, 0, 0, 0, + 0, fb_setscissor, 0, 0, + 0, 0, 0, 0, + 0, 0, fb_rect, 0, + 0, 0, 0, 0, + 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage + }, + + // uCode 2 - F3DEX 2.XX + // games: Zelda 64 + { + // 00-3f + 0, 0, 0, uc2_culldl, + uc1_branch_z, 0, 0, 0, + 0, fb_bg_copy, fb_bg_copy, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + // 40-7f: unused + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + // 80-bf: unused + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + // c0-ff: RDP commands mixed with uc2 commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, uc2_dlist_cnt, 0, 0, + 0, 0, 0, fb_uc2_moveword, + fb_uc2_movemem, uc2_load_ucode, uc0_displaylist, uc0_enddl, + 0, fb_rdphalf_1, 0, 0, + fb_rect, fb_rect, 0, 0, + 0, 0, 0, 0, + 0, fb_setscissor, 0, 0, + 0, 0, 0, 0, + 0, 0, fb_rect, 0, + 0, 0, 0, 0, + 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage + }, + + // uCode 3 - "RSP SW 2.0D", but not really + // 00-3f + // games: Wave Race + // ** Added by Gonetz ** + { + 0, 0, 0, 0, + 0, 0, uc0_displaylist, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 40-7f: unused + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 80-bf: Immediate commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + uc0_enddl, 0, 0, 0, + fb_uc0_moveword, 0, uc0_culldl, 0, + // c0-ff: RDP commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + fb_rect, fb_rect, 0, 0, + 0, 0, 0, 0, + 0, fb_setscissor, 0, 0, + 0, 0, 0, 0, + 0, 0, fb_rect, 0, + 0, 0, 0, 0, + 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage + }, + + { + // uCode 4 - RSP SW 2.0D EXT + // 00-3f + // games: Star Wars: Shadows of the Empire + 0, 0, 0, 0, + 0, 0, uc0_displaylist, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 40-7f: Unused + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 80-bf: Immediate commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + uc0_enddl, 0, 0, 0, + fb_uc0_moveword, 0, uc0_culldl, 0, + // c0-ff: RDP commands + rdp_noop, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + fb_rect, fb_rect, 0, 0, + 0, 0, 0, 0, + 0, fb_setscissor, 0, 0, + 0, 0, 0, 0, + 0, 0, fb_rect, 0, + 0, 0, 0, 0, + 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage + }, + + { + // uCode 5 - RSP SW 2.0 Diddy + // 00-3f + // games: Diddy Kong Racing + 0, 0, 0, 0, + 0, 0, uc0_displaylist, uc5_dl_in_mem, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 40-7f: Unused + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 80-bf: Immediate commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + uc0_enddl, 0, 0, 0, + fb_uc0_moveword, 0, uc0_culldl, 0, + // c0-ff: RDP commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + fb_rect, fb_rect, 0, 0, + 0, 0, 0, 0, + 0, fb_setscissor, 0, 0, + 0, 0, 0, 0, + 0, 0, fb_rect, 0, + 0, 0, 0, 0, + 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage + }, + + // uCode 6 - S2DEX 1.XX + // games: Yoshi's Story + { + 0, 0, 0, 0, + 0, 0, uc0_displaylist, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 40-7f: unused + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 80-bf: Immediate commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, uc6_loaducode, + uc6_select_dl, 0, 0, 0, + 0, 0, 0, 0, + uc0_enddl, 0, 0, 0, + fb_uc0_moveword, 0, uc2_culldl, 0, + // c0-ff: RDP commands + 0, fb_loadtxtr, fb_loadtxtr, fb_loadtxtr, + fb_loadtxtr, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + fb_rect, fb_rect, 0, 0, + 0, 0, 0, 0, + 0, fb_setscissor, 0, 0, + 0, 0, 0, 0, + 0, 0, fb_rect, 0, + 0, 0, 0, 0, + 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage + }, + + { + 0, 0, 0, 0, + 0, 0, uc0_displaylist, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 40-7f: unused + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + // 80-bf: Immediate commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + uc0_enddl, 0, 0, 0, + fb_uc0_moveword, 0, uc0_culldl, 0, + // c0-ff: RDP commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + fb_rect, fb_rect, 0, 0, + 0, 0, 0, 0, + 0, fb_setscissor, 0, 0, + 0, 0, 0, 0, + 0, 0, fb_rect, 0, + 0, 0, 0, 0, + 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage + }, + + { + // 00-3f + 0, 0, 0, uc2_culldl, + uc1_branch_z, 0, 0, 0, + 0, fb_bg_copy, fb_bg_copy, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + // 40-7f: unused + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + // 80-bf: unused + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + // c0-ff: RDP commands mixed with uc2 commands + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, uc2_dlist_cnt, 0, 0, + 0, 0, 0, fb_uc2_moveword, + 0, uc2_load_ucode, uc0_displaylist, uc0_enddl, + 0, 0, 0, 0, + fb_rect, fb_rect, 0, 0, + 0, 0, 0, 0, + 0, fb_setscissor, 0, 0, + 0, 0, 0, 0, + 0, 0, fb_rect, 0, + 0, 0, 0, 0, + 0, fb_settextureimage, fb_setdepthimage, fb_setcolorimage + } +};