diff --git a/src/GBI.h b/src/GBI.h index ef7e4a92..79661165 100644 --- a/src/GBI.h +++ b/src/GBI.h @@ -122,6 +122,7 @@ #define G_MW_CLIP 0x04 #define G_MW_SEGMENT 0x06 #define G_MW_FOG 0x08 +#define G_MW_GENSTAT 0x08 #define G_MW_LIGHTCOL 0x0A #define G_MW_FORCEMTX 0x0C #define G_MW_POINTS 0x0C diff --git a/src/S2DEX.cpp b/src/S2DEX.cpp index b760c19d..d873840d 100644 --- a/src/S2DEX.cpp +++ b/src/S2DEX.cpp @@ -44,6 +44,19 @@ void S2DEX_Obj_MoveMem( u32 w0, u32 w1 ) } } +void S2DEX_MoveWord( u32 w0, u32 w1 ) +{ + switch (_SHIFTR( w0, 16, 8 )) + { + case G_MW_GENSTAT: + gSPSetStatus(_SHIFTR(w0, 0, 16), w1); + break; + default: + F3D_MoveWord(w0, w1); + break; + } +} + void S2DEX_Select_DL( u32 w0, u32 w1 ) { LOG(LOG_WARNING, "S2DEX_Select_DL unimplemented\n"); @@ -102,7 +115,7 @@ void S2DEX_Init() GBI_SetGBI( G_OBJ_LDTX_SPRITE, S2DEX_OBJ_LDTX_SPRITE, S2DEX_Obj_LdTx_Sprite ); GBI_SetGBI( G_OBJ_LDTX_RECT, S2DEX_OBJ_LDTX_RECT, S2DEX_Obj_LdTx_Rect ); GBI_SetGBI( G_OBJ_LDTX_RECT_R, S2DEX_OBJ_LDTX_RECT_R, S2DEX_Obj_LdTx_Rect_R ); - GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord ); + GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, S2DEX_MoveWord ); 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 ); diff --git a/src/S2DEX2.cpp b/src/S2DEX2.cpp index 6465baae..51c30646 100644 --- a/src/S2DEX2.cpp +++ b/src/S2DEX2.cpp @@ -10,6 +10,19 @@ #include "RSP.h" #include "Types.h" +void S2DEX2_MoveWord( u32 w0, u32 w1 ) +{ + switch (_SHIFTR( w0, 16, 8 )) + { + case G_MW_GENSTAT: + gSPSetStatus(_SHIFTR(w0, 0, 16), w1); + break; + default: + F3DEX2_MoveWord(w0, w1); + break; + } +} + void S2DEX2_Init() { gSPSetupFunctions(); @@ -33,7 +46,7 @@ void S2DEX2_Init() GBI_SetGBI( G_OBJ_LDTX_SPRITE, S2DEX2_OBJ_LDTX_SPRITE, S2DEX_Obj_LdTx_Sprite ); GBI_SetGBI( G_OBJ_LDTX_RECT, S2DEX2_OBJ_LDTX_RECT, S2DEX_Obj_LdTx_Rect ); GBI_SetGBI( G_OBJ_LDTX_RECT_R, S2DEX2_OBJ_LDTX_RECT_R, S2DEX_Obj_LdTx_Rect_R ); - GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, F3DEX2_MoveWord ); + GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, S2DEX2_MoveWord ); 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 ); diff --git a/src/gSP.cpp b/src/gSP.cpp index 1984f21d..a23e27d2 100644 --- a/src/gSP.cpp +++ b/src/gSP.cpp @@ -1789,6 +1789,11 @@ void gSPLineW3D( s32 v0, s32 v1, s32 wd, s32 flag ) #endif } +void gSPSetStatus(u32 sid, u32 val) +{ + gSP.status[sid>>2] = val; +} + void gSPObjLoadTxtr( u32 tx ) { const u32 address = RSP_SegmentToPhysical( tx ); diff --git a/src/gSP.h b/src/gSP.h index 1144776e..ca8032e1 100644 --- a/src/gSP.h +++ b/src/gSP.h @@ -173,6 +173,7 @@ void gSPSetOtherMode_H(u32 _length, u32 _shift, u32 _data); void gSPSetOtherMode_L(u32 _length, u32 _shift, u32 _data); void gSPLine3D(s32 v0, s32 v1, s32 flag); void gSPLineW3D( s32 v0, s32 v1, s32 wd, s32 flag ); +void gSPSetStatus(u32 sid, u32 val); void gSPObjRectangle(u32 _sp ); void gSPObjRectangleR(u32 _sp); void gSPObjSprite(u32 _sp);