1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

Implement gSPSelectDL and gSPSelectBranchDL

Fixed Nushi Zuri 64 - Shiokaze ni Notte: #1230
This commit is contained in:
Sergey Lipskiy 2016-11-17 16:39:16 +07:00
parent cf2bce9176
commit 83ff7f9ae5
6 changed files with 45 additions and 1 deletions

View File

@ -16,6 +16,7 @@ extern RDPInfo RDP;
void RDP_Init();
void RDP_Half_1(u32 _c);
void RDP_TexRect(u32 w0, u32 w1);
void RDP_ProcessRDPList();
void RDP_RepeatLastLoadBlock();
void RDP_SetScissor(u32 w0, u32 w1);

View File

@ -1,3 +1,4 @@
#include <assert.h>
#include "OpenGL.h"
#include "S2DEX.h"
#include "F3D.h"
@ -6,6 +7,7 @@
#include "gSP.h"
#include "gDP.h"
#include "RSP.h"
#include "RDP.h"
#include "Types.h"
#include "Log.h"
@ -57,9 +59,41 @@ void S2DEX_MoveWord( u32 w0, u32 w1 )
}
}
void S2DEX_RDPHalf_0( u32 w0, u32 w1 ) {
if (RSP.nextCmd == G_SELECT_DL) {
gSP.selectDL.addr = _SHIFTR(w0, 0, 16);
gSP.selectDL.sid = _SHIFTR(w0, 18, 8);
gSP.selectDL.flag = w1;
return;
}
if (RSP.nextCmd == G_RDPHALF_1) {
RDP_TexRect(w0, w1);
return;
}
assert(false);
}
void S2DEX_Select_DL( u32 w0, u32 w1 )
{
LOG(LOG_WARNING, "S2DEX_Select_DL unimplemented\n");
gSP.selectDL.addr |= (_SHIFTR(w0, 0, 16)) << 16;
const u8 sid = gSP.selectDL.sid;
const u32 flag = gSP.selectDL.flag;
const u32 mask = w1;
if ((gSP.status[sid] & mask) == flag)
// Do nothing;
return;
gSP.status[sid] = (gSP.status[sid] & ~mask) | (flag & mask);
switch (_SHIFTR( w0, 16, 8 ))
{
case G_DL_PUSH:
gSPDisplayList( gSP.selectDL.addr );
break;
case G_DL_NOPUSH:
gSPBranchList( gSP.selectDL.addr );
break;
}
}
void S2DEX_Obj_RenderMode( u32 w0, u32 w1 )
@ -119,6 +153,7 @@ void S2DEX_Init()
GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
GBI_SetGBI( G_RDPHALF_0, S2DEX_RDPHALF_0, S2DEX_RDPHalf_0 );
GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_LOAD_UCODE, S2DEX_LOAD_UCODE, F3DEX_Load_uCode );

View File

@ -173,6 +173,7 @@ void S2DEX_BG_Copy( u32 w0, u32 w1 );
void S2DEX_Obj_Rectangle( u32 w0, u32 w1 );
void S2DEX_Obj_Sprite( u32 w0, u32 w1 );
void S2DEX_Obj_MoveMem( u32 w0, u32 w1 );
void S2DEX_RDPHalf_0( u32 w0, u32 w1 );
void S2DEX_Select_DL( u32 w0, u32 w1 );
void S2DEX_Obj_RenderMode( u32 w0, u32 w1 );
void S2DEX_Obj_Rectangle_R( u32 w0, u32 w1 );

View File

@ -50,6 +50,7 @@ void S2DEX2_Init()
GBI_SetGBI( G_SETOTHERMODE_H, F3DEX2_SETOTHERMODE_H, F3DEX2_SetOtherMode_H );
GBI_SetGBI( G_SETOTHERMODE_L, F3DEX2_SETOTHERMODE_L, F3DEX2_SetOtherMode_L );
GBI_SetGBI( G_ENDDL, F3DEX2_ENDDL, F3D_EndDL );
GBI_SetGBI( G_RDPHALF_0, S2DEX2_RDPHALF_0, S2DEX_RDPHalf_0 );
GBI_SetGBI( G_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1 );
GBI_SetGBI( G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2 );
GBI_SetGBI( G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode );

View File

@ -1791,6 +1791,7 @@ void gSPLineW3D( s32 v0, s32 v1, s32 wd, s32 flag )
void gSPSetStatus(u32 sid, u32 val)
{
assert(sid <= 12);
gSP.status[sid>>2] = val;
}

View File

@ -119,6 +119,11 @@ struct gSPInfo
u32 changed;
struct {
u8 sid;
u32 flag;
u32 addr;
} selectDL;
u32 status[4];
struct