2013-04-04 21:22:19 +00:00
/*
* 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 ( )
{
2016-01-25 11:14:01 +00:00
if ( ( rdp . cmd0 & 0xFF ) = = 0x06 ) // segment
{
rdp . segment [ ( rdp . cmd0 > > 10 ) & 0x0F ] = rdp . cmd1 ;
}
2013-04-04 21:22:19 +00:00
}
static void fb_uc2_moveword ( )
{
2016-01-25 11:14:01 +00:00
if ( ( ( rdp . cmd0 > > 16 ) & 0xFF ) = = 0x06 ) // segment
{
rdp . segment [ ( ( rdp . cmd0 & 0xFFFF ) > > 2 ) & 0xF ] = rdp . cmd1 ;
}
2013-04-04 21:22:19 +00:00
}
2016-01-25 11:14:01 +00:00
static void fb_bg_copy ( )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
if ( rdp . main_ci = = 0 )
return ;
CI_STATUS status = rdp . frame_buffers [ rdp . ci_count - 1 ] . status ;
2016-12-13 06:31:40 +00:00
if ( ( status = = ci_copy ) )
2016-01-25 11:14:01 +00:00
return ;
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
uint32_t addr = segoffset ( rdp . cmd1 ) > > 1 ;
uint8_t imageFmt = ( ( uint8_t * ) gfx . RDRAM ) [ ( ( ( addr + 11 ) < < 1 ) + 0 ) ^ 3 ] ;
uint8_t imageSiz = ( ( uint8_t * ) gfx . RDRAM ) [ ( ( ( addr + 11 ) < < 1 ) + 1 ) ^ 3 ] ;
uint32_t imagePtr = segoffset ( ( ( uint32_t * ) gfx . RDRAM ) [ ( addr + 8 ) > > 1 ] ) ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " fb_bg_copy. fmt: %d, size: %d, imagePtr %08lx, main_ci: %08lx, cur_ci: %08lx " , imageFmt , imageSiz , imagePtr , rdp . main_ci , rdp . frame_buffers [ rdp . ci_count - 1 ] . addr ) ;
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
if ( status = = ci_main )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
uint16_t frameW = ( ( uint16_t * ) gfx . RDRAM ) [ ( addr + 3 ) ^ 1 ] > > 2 ;
uint16_t frameH = ( ( uint16_t * ) 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 ;
2013-04-04 21:22:19 +00:00
}
2016-01-25 11:14:01 +00:00
else if ( imagePtr > = rdp . main_ci & & imagePtr < rdp . main_ci_end ) //addr within main frame buffer
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
rdp . copy_ci_index = rdp . ci_count - 1 ;
rdp . frame_buffers [ rdp . copy_ci_index ] . status = ci_copy ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_copy " , rdp . copy_ci_index ) ;
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
if ( rdp . frame_buffers [ rdp . copy_ci_index ] . addr ! = rdp . main_ci_bg )
{
rdp . scale_x = 1.0f ;
rdp . scale_y = 1.0f ;
}
else
{
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " motion blur! " ) ;
2016-01-25 11:14:01 +00:00
rdp . motionblur = TRUE ;
}
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " Detect FB usage. texture addr is inside framebuffer: %08lx - %08lx " , imagePtr , rdp . main_ci ) ;
2016-01-25 11:14:01 +00:00
}
else if ( imagePtr = = rdp . zimg )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
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 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_zcopy " , rdp . copy_ci_index ) ;
2016-01-25 11:14:01 +00:00
}
2013-04-04 21:22:19 +00:00
}
}
static void fb_setscissor ( )
{
2016-01-25 11:14:01 +00:00
rdp . scissor_o . lr_y = ( uint32_t ) ( ( ( rdp . cmd1 & 0x00000FFF ) > > 2 ) ) ;
if ( rdp . ci_count )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
rdp . scissor_o . ul_x = ( uint32_t ) ( ( ( rdp . cmd0 & 0x00FFF000 ) > > 14 ) ) ;
rdp . scissor_o . lr_x = ( uint32_t ) ( ( ( 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 > ( uint32_t ) ( 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 ;
}
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " fb_setscissor. lr_x = %d, lr_y = %d, fb_width = %d, fb_height = %d " , rdp . scissor_o . lr_x , rdp . scissor_o . lr_y , cur_fb . width , cur_fb . height ) ;
2013-04-04 21:22:19 +00:00
}
}
static void fb_uc2_movemem ( )
{
2016-01-25 11:14:01 +00:00
if ( ( rdp . cmd0 & 0xFF ) = = 8 )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
uint32_t 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 ;
uint32_t height = scale_y + trans_y ;
if ( height < rdp . scissor_o . lr_y )
cur_fb . height = height ;
}
2013-04-04 21:22:19 +00:00
}
}
static void fb_rect ( )
{
2016-01-25 11:14:01 +00:00
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 )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
uint32_t lr_y = minval ( rdp . scissor_o . lr_y , ( rdp . cmd0 & 0xFFF ) > > 2 ) ;
if ( rdp . frame_buffers [ rdp . ci_count - 1 ] . height < lr_y )
{
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " fb_rect. ul_x: %d, lr_x: %d, fb_height: %d -> %d " , ul_x , lr_x , rdp . frame_buffers [ rdp . ci_count - 1 ] . height , lr_y ) ;
2016-01-25 11:14:01 +00:00
rdp . frame_buffers [ rdp . ci_count - 1 ] . height = lr_y ;
}
2013-04-04 21:22:19 +00:00
}
}
static void fb_rdphalf_1 ( )
{
2016-01-25 11:14:01 +00:00
branch_dl = rdp . cmd1 ;
2013-04-04 21:22:19 +00:00
}
static void fb_settextureimage ( )
{
2016-01-25 11:14:01 +00:00
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
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
int tex_format = ( ( rdp . cmd0 > > 21 ) & 0x07 ) ;
uint32_t addr = segoffset ( rdp . cmd1 ) ;
if ( tex_format = = 0 )
2013-04-04 21:22:19 +00:00
{
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " fb_settextureimage. fmt: %d, size: %d, imagePtr %08lx, main_ci: %08lx, cur_ci: %08lx " , ( ( rdp . cmd0 > > 21 ) & 0x07 ) , ( ( rdp . cmd0 > > 19 ) & 0x03 ) , addr , rdp . main_ci , rdp . frame_buffers [ rdp . ci_count - 1 ] . addr ) ;
2016-01-25 11:14:01 +00:00
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
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
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 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_copy_self " , rdp . ci_count - 1 ) ;
2016-01-25 11:14:01 +00:00
}
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 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_copy " , rdp . copy_ci_index ) ;
2016-01-25 11:14:01 +00:00
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 ) ) )
{
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " motion blur! " ) ;
2016-01-25 11:14:01 +00:00
rdp . motionblur = TRUE ;
}
else
{
rdp . scale_x = 1.0f ;
rdp . scale_y = 1.0f ;
}
}
2017-01-24 19:08:33 +00:00
else if ( ! g_settings - > fb_ignore_aux_copy_enabled ( ) & & cur_fb . width < rdp . frame_buffers [ rdp . main_ci_index ] . width )
2016-01-25 11:14:01 +00:00
{
rdp . copy_ci_index = rdp . ci_count - 1 ;
cur_fb . status = ci_aux_copy ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_aux_copy " , rdp . copy_ci_index ) ;
2016-01-25 11:14:01 +00:00
rdp . scale_x = 1.0f ;
rdp . scale_y = 1.0f ;
}
else
{
cur_fb . status = ci_aux ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_aux " , rdp . copy_ci_index ) ;
2016-01-25 11:14:01 +00:00
}
}
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " Detect FB usage. texture addr is inside framebuffer: %08lx - %08lx " , addr , rdp . main_ci ) ;
2013-04-04 21:22:19 +00:00
}
2016-01-25 11:14:01 +00:00
///*
else if ( ( cur_fb . status ! = ci_main ) & & ( addr > = rdp . zimg & & addr < rdp . zimg_end ) )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
cur_fb . status = ci_zcopy ;
if ( ! rdp . copy_zi_index )
rdp . copy_zi_index = rdp . ci_count - 1 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " fb_settextureimage. rdp.frame_buffers[%d].status = ci_zcopy " , rdp . ci_count - 1 ) ;
2016-01-25 11:14:01 +00:00
}
//*/
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 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_old_copy 1, addr:%08lx " , rdp . ci_count - 1 , rdp . last_drawn_ci_addr ) ;
2016-01-25 11:14:01 +00:00
}
rdp . read_previous_ci = TRUE ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " read_previous_ci = TRUE " ) ;
2016-01-25 11:14:01 +00:00
}
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 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_old_copy 2, addr:%08lx " , rdp . ci_count - 1 , rdp . last_drawn_ci_addr ) ;
2016-01-25 11:14:01 +00:00
}
rdp . read_previous_ci = TRUE ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " read_previous_ci = TRUE " ) ;
2013-04-04 21:22:19 +00:00
}
}
2017-01-24 19:08:33 +00:00
else if ( g_settings - > fb_hwfbe_enabled ( ) & & ( cur_fb . status = = ci_main ) )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
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 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_copy_self " , rdp . ci_count - 1 ) ;
2016-01-25 11:14:01 +00:00
}
2013-04-04 21:22:19 +00:00
}
}
2016-01-25 11:14:01 +00:00
if ( cur_fb . status = = ci_unknown )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
cur_fb . status = ci_aux ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " fb_settextureimage. rdp.frame_buffers[%d].status = ci_aux " , rdp . ci_count - 1 ) ;
2013-04-04 21:22:19 +00:00
}
}
static void fb_loadtxtr ( )
{
2016-01-25 11:14:01 +00:00
if ( rdp . frame_buffers [ rdp . ci_count - 1 ] . status = = ci_unknown )
{
rdp . frame_buffers [ rdp . ci_count - 1 ] . status = ci_aux ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_aux " , rdp . ci_count - 1 ) ;
2016-01-25 11:14:01 +00:00
}
2013-04-04 21:22:19 +00:00
}
static void fb_setdepthimage ( )
{
2016-01-25 11:14:01 +00:00
rdp . zimg = segoffset ( rdp . cmd1 ) & BMASK ;
rdp . zimg_end = rdp . zimg + rdp . ci_width * rdp . ci_height * 2 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " fb_setdepthimage. addr %08lx - %08lx " , rdp . zimg , rdp . zimg_end ) ;
2016-01-25 11:14:01 +00:00
if ( rdp . zimg = = rdp . main_ci ) //strange, but can happen
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
rdp . frame_buffers [ rdp . main_ci_index ] . status = ci_unknown ;
if ( rdp . main_ci_index < rdp . ci_count )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
rdp . frame_buffers [ rdp . main_ci_index ] . status = ci_zimg ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_zimg " , rdp . main_ci_index ) ;
2016-01-25 11:14:01 +00:00
rdp . main_ci_index + + ;
rdp . frame_buffers [ rdp . main_ci_index ] . status = ci_main ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_main " , rdp . main_ci_index ) ;
2016-01-25 11:14:01 +00:00
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 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_main " , i ) ;
2016-01-25 11:14:01 +00:00
}
}
}
else
{
rdp . main_ci = 0 ;
2013-04-04 21:22:19 +00:00
}
}
2016-01-25 11:14:01 +00:00
for ( int i = 0 ; i < rdp . ci_count ; i + + )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
COLOR_IMAGE & fb = rdp . frame_buffers [ i ] ;
if ( ( fb . addr = = rdp . zimg ) & & ( fb . status = = ci_aux | | fb . status = = ci_useless ) )
{
fb . status = ci_zimg ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_zimg " , i ) ;
2016-01-25 11:14:01 +00:00
}
2013-04-04 21:22:19 +00:00
}
}
static void fb_setcolorimage ( )
{
2016-01-25 11:14:01 +00:00
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 ;
*/
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " fb_setcolorimage. width: %d, height: %d, fmt: %d, size: %d, addr %08lx " , cur_fb . width , cur_fb . height , cur_fb . format , cur_fb . size , cur_fb . addr ) ;
2016-01-25 11:14:01 +00:00
if ( rdp . cimg = = rdp . zimg )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
cur_fb . status = ci_zimg ;
rdp . zimg_end = rdp . zimg + cur_fb . width * rdp . scissor_o . lr_y * 2 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_zimg " , rdp . ci_count ) ;
2013-04-04 21:22:19 +00:00
}
2016-01-25 11:14:01 +00:00
else if ( rdp . cimg = = rdp . tmpzimg )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
cur_fb . status = ci_zcopy ;
if ( ! rdp . copy_zi_index )
rdp . copy_zi_index = rdp . ci_count - 1 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_zcopy " , rdp . ci_count ) ;
2013-04-04 21:22:19 +00:00
}
2016-01-25 11:14:01 +00:00
else if ( rdp . main_ci ! = 0 )
2013-04-04 21:22:19 +00:00
{
2016-01-25 11:14:01 +00:00
if ( rdp . cimg = = rdp . main_ci ) //switched to main fb again
{
cur_fb . height = maxval ( 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 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_main " , rdp . ci_count ) ;
2016-01-25 11:14:01 +00:00
}
else // status is not known yet
{
cur_fb . status = ci_unknown ;
}
2013-04-04 21:22:19 +00:00
}
else
{
2016-01-25 11:14:01 +00:00
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 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_main " , rdp . ci_count ) ;
2016-01-25 11:14:01 +00:00
}
else
{
cur_fb . status = ci_unknown ;
}
2013-04-04 21:22:19 +00:00
}
2016-01-25 11:14:01 +00:00
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
2013-04-04 21:22:19 +00:00
{
2017-01-24 19:08:33 +00:00
if ( g_settings - > fb_hwfbe_enabled ( ) & & ! g_settings - > fb_useless_is_useless_enabled ( ) )
2016-01-25 11:14:01 +00:00
{
rdp . frame_buffers [ rdp . ci_count - 1 ] . status = ci_aux ;
rdp . frame_buffers [ rdp . ci_count - 1 ] . changed = 0 ;
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = ci_aux " , rdp . ci_count - 1 ) ;
2016-01-25 11:14:01 +00:00
}
else
{
rdp . frame_buffers [ rdp . ci_count - 1 ] . status = ci_useless ;
/*
uint32_t 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 ;
}
}
//*/
2016-02-11 09:58:42 +00:00
WriteTrace ( TraceRDP , TraceDebug , " rdp.frame_buffers[%d].status = %s " , rdp . ci_count - 1 , CIStatus [ rdp . frame_buffers [ rdp . ci_count - 1 ] . status ] ) ;
2016-01-25 11:14:01 +00:00
}
2013-04-04 21:22:19 +00:00
}
2016-01-25 11:14:01 +00:00
if ( cur_fb . status = = ci_main )
2013-04-04 21:22:19 +00:00
{
2016-02-01 08:56:25 +00:00
int viSwapOK = ( ( g_settings - > swapmode = = 2 ) & & ( rdp . vi_org_reg = = * gfx . VI_ORIGIN_REG ) ) ? FALSE : TRUE ;
2016-01-25 11:14:01 +00:00
if ( ( rdp . maincimg [ 0 ] . addr ! = cur_fb . addr ) & & SwapOK & & viSwapOK )
{
SwapOK = FALSE ;
rdp . swap_ci_index = rdp . ci_count ;
}
2013-04-04 21:22:19 +00:00
}
2016-01-25 11:14:01 +00:00
rdp . ci_count + + ;
if ( rdp . ci_count > NUMTEXBUF ) //overflow
rdp . halt = 1 ;
2013-04-04 21:22:19 +00:00
}
// RDP graphic instructions pointer table used in DetectFrameBufferUsage
static rdp_instr gfx_instruction_lite [ 9 ] [ 256 ] =
{
2016-01-25 11:14:01 +00:00
{
// 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
} ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
// 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 ,
2013-04-04 21:22:19 +00:00
// 40-7f: unused
2016-01-25 11:14:01 +00:00
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
2013-04-04 21:22:19 +00:00
// 80-bf: Immediate commands
2016-01-25 11:14:01 +00:00
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 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 ,
2013-04-04 21:22:19 +00:00
// c0-ff: RDP commands
2016-01-25 11:14:01 +00:00
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 ,
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
} ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
// uCode 2 - F3DEX 2.XX
// games: Zelda 64
{
2013-04-04 21:22:19 +00:00
// 00-3f
2016-01-25 11:14:01 +00:00
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 ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
// 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 ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
// 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 ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
// 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
} ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
// 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
} ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
{
// 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
} ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
{
// 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
} ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
// 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
} ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
{
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
} ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
{
// 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 ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
// 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 ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
// 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 ,
2013-04-04 21:22:19 +00:00
2016-01-25 11:14:01 +00:00
// 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
}
2013-04-04 21:22:19 +00:00
} ;