diff --git a/projects/msvc12/GLideN64.vcxproj b/projects/msvc12/GLideN64.vcxproj index cf5da6d9..675cf9bc 100644 --- a/projects/msvc12/GLideN64.vcxproj +++ b/projects/msvc12/GLideN64.vcxproj @@ -280,6 +280,7 @@ + @@ -399,6 +400,7 @@ + diff --git a/projects/msvc12/GLideN64.vcxproj.filters b/projects/msvc12/GLideN64.vcxproj.filters index 2e8cf577..86671217 100644 --- a/projects/msvc12/GLideN64.vcxproj.filters +++ b/projects/msvc12/GLideN64.vcxproj.filters @@ -266,6 +266,9 @@ Source Files\uCodes + + Source Files\uCodes + @@ -475,5 +478,8 @@ Header Files\uCodes + + Header Files\uCodes + \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ddc107ac..c95dd6cc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -24,6 +24,7 @@ set(GLideN64_SOURCES F3DSETA.cpp F3DEX2.cpp F3DEX2CBFD.cpp + F3DEX2MM.cpp FBOTextureFormats.cpp FrameBuffer.cpp FrameBufferInfo.cpp diff --git a/src/F3DEX2MM.cpp b/src/F3DEX2MM.cpp new file mode 100644 index 00000000..6af83a89 --- /dev/null +++ b/src/F3DEX2MM.cpp @@ -0,0 +1,49 @@ +#include "GLideN64.h" +#include "F3D.h" +#include "F3DEX.h" +#include "F3DEX2.h" +#include "F3DEX2MM.h" +#include "gSP.h" + +void F3DEX2MM_Branch_W( u32 w0, u32 w1 ) +{ + gSPBranchLessW(gDP.half_1, w0, w1); +} + +void F3DEX2MM_Init() +{ + gSPSetupFunctions(); + // Set GeometryMode flags + GBI_InitFlags( F3DEX2 ); + + GBI.PCStackSize = 18; + + // GBI Command Command Value Command Function + GBI_SetGBI( G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2 ); + 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_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1 ); + GBI_SetGBI( G_SPNOOP, F3DEX2_SPNOOP, F3D_SPNoOp ); + GBI_SetGBI( G_ENDDL, F3DEX2_ENDDL, F3D_EndDL ); + GBI_SetGBI( G_DL, F3DEX2_DL, F3D_DList ); + GBI_SetGBI( G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode ); + GBI_SetGBI( G_MOVEMEM, F3DEX2_MOVEMEM, F3DEX2_MoveMem ); + GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, F3DEX2_MoveWord ); + GBI_SetGBI( G_MTX, F3DEX2_MTX, F3DEX2_Mtx ); + GBI_SetGBI( G_GEOMETRYMODE, F3DEX2_GEOMETRYMODE, F3DEX2_GeometryMode ); + GBI_SetGBI( G_POPMTX, F3DEX2_POPMTX, F3DEX2_PopMtx ); + GBI_SetGBI( G_TEXTURE, F3DEX2_TEXTURE, F3DEX2_Texture ); + GBI_SetGBI( G_DMA_IO, F3DEX2_DMA_IO, F3DEX2_DMAIO ); + GBI_SetGBI( G_SPECIAL_1, F3DEX2_SPECIAL_1, F3DEX2_Special_1 ); + GBI_SetGBI( G_SPECIAL_2, F3DEX2_SPECIAL_2, F3DEX2_Special_2 ); + GBI_SetGBI( G_SPECIAL_3, F3DEX2_SPECIAL_3, F3DEX2_Special_3 ); + + GBI_SetGBI( G_VTX, F3DEX2_VTX, F3DEX2_Vtx ); + GBI_SetGBI( G_MODIFYVTX, F3DEX2_MODIFYVTX, F3DEX_ModifyVtx ); + GBI_SetGBI( G_CULLDL, F3DEX2_CULLDL, F3DEX_CullDL ); + GBI_SetGBI( G_BRANCH_Z, F3DEX2_BRANCH_Z, F3DEX2MM_Branch_W ); + GBI_SetGBI( G_TRI1, F3DEX2_TRI1, F3DEX2_Tri1 ); + GBI_SetGBI( G_TRI2, F3DEX2_TRI2, F3DEX_Tri2 ); + GBI_SetGBI( G_QUAD, F3DEX2_QUAD, F3DEX2_Quad ); + GBI_SetGBI( G_LINE3D, F3DEX2_LINE3D, F3DEX2_Line3D ); +} diff --git a/src/F3DEX2MM.h b/src/F3DEX2MM.h new file mode 100644 index 00000000..8f5d5770 --- /dev/null +++ b/src/F3DEX2MM.h @@ -0,0 +1,6 @@ +#ifndef F3DEX2MM_H +#define F3DEX2MM_H + +void F3DEX2MM_Init(); + +#endif // F3DEX2M_H diff --git a/src/GBI.cpp b/src/GBI.cpp index 5213632c..8c477cbf 100644 --- a/src/GBI.cpp +++ b/src/GBI.cpp @@ -25,6 +25,7 @@ #include "F3DSETA.h" #include "F3DGOLDEN.h" #include "F3DEX2CBFD.h" +#include "F3DEX2MM.h" #include "ZSort.h" #include "CRC.h" #include "Log.h" @@ -54,7 +55,8 @@ SpecialMicrocodeInfo specialMicrocodes[] = { F3DJFG, false, 0xbde9d1fb, "Jet Force Gemini" }, { F3DPD, true, 0x1c4f7869, "Perfect Dark" }, { Turbo3D, false, 0x2bdcfc8a, "Turbo3D" }, - { F3DEX2CBFD, true, 0x1b4ace88, "Conker's Bad Fur Day" } + { F3DEX2CBFD, true, 0x1b4ace88, "Conker's Bad Fur Day" }, + { F3DEX2MM, true, 0xdf528a85, "Majora's Mask" } }; u32 G_RDPHALF_1, G_RDPHALF_2, G_RDPHALF_CONT; @@ -187,6 +189,7 @@ void GBIInfo::_makeCurrent(MicrocodeInfo * _pCurrent) case F3DEX2CBFD:F3DEX2CBFD_Init(); break; case F3DSETA: F3DSETA_Init(); break; case F3DGOLDEN: F3DGOLDEN_Init(); break; + case F3DEX2MM: F3DEX2MM_Init(); break; } #ifndef GLESX diff --git a/src/GBI.h b/src/GBI.h index 8a4f358c..d05a9d72 100644 --- a/src/GBI.h +++ b/src/GBI.h @@ -24,7 +24,8 @@ #define ZSortp 15 #define F3DSETA 16 #define F3DGOLDEN 17 -#define NONE 18 +#define F3DEX2MM 18 +#define NONE 19 // Fixed point conversion factors #define FIXED2FLOATRECIP1 0.5f diff --git a/src/gSP.cpp b/src/gSP.cpp index 0973b721..86561d2b 100644 --- a/src/gSP.cpp +++ b/src/gSP.cpp @@ -1293,6 +1293,29 @@ void gSPBranchLessZ( u32 branchdl, u32 vtx, u32 zval ) #endif } +void gSPBranchLessW( u32 branchdl, u32 vtx, u32 zval ) +{ + const u32 address = RSP_SegmentToPhysical( branchdl ); + + if ((address + 8) > RDRAMSize) { +#ifdef DEBUG + DebugMsg( DEBUG_HIGH | DEBUG_ERROR, "// Specified display list at invalid address\n" ); + DebugMsg( DEBUG_HIGH | DEBUG_HANDLED, "gSPBranchLessZ( 0x%08X, %i, %i );\n", + branchdl, vtx, zval ); +#endif + return; + } + + SPVertex & v = video().getRender().getVertex((vtx & 0x1f)); + if (v.w < (float)zval) + RSP.PC[RSP.PCi] = address; + +#ifdef DEBUG + DebugMsg( DEBUG_HIGH | DEBUG_HANDLED, "gSPBranchLessZ( 0x%08X, %i, %i );\n", + branchdl, vtx, zval ); +#endif +} + void gSPDlistCount(u32 count, u32 v) { u32 address = RSP_SegmentToPhysical( v ); diff --git a/src/gSP.h b/src/gSP.h index d35a241e..4ccc3019 100644 --- a/src/gSP.h +++ b/src/gSP.h @@ -156,6 +156,7 @@ void gSPCBFDVertex( u32 v, u32 n, u32 v0 ); void gSPDisplayList( u32 dl ); void gSPBranchList( u32 dl ); void gSPBranchLessZ( u32 branchdl, u32 vtx, u32 zval ); +void gSPBranchLessW( u32 branchdl, u32 vtx, u32 zval ); void gSPDlistCount(u32 count, u32 v); void gSPSprite2DBase(u32 _base ); void gSPDMATriangles( u32 tris, u32 n ); diff --git a/src/mupen64plus-video-gliden64.mk b/src/mupen64plus-video-gliden64.mk index d58a3fe3..9ec792fc 100644 --- a/src/mupen64plus-video-gliden64.mk +++ b/src/mupen64plus-video-gliden64.mk @@ -34,6 +34,7 @@ MY_LOCAL_SRC_FILES := \ $(SRCDIR)/F3DDKR.cpp \ $(SRCDIR)/F3DEX2CBFD.cpp \ $(SRCDIR)/F3DEX2.cpp \ + $(SRCDIR)/F3DEX2MM.cpp \ $(SRCDIR)/F3DEX.cpp \ $(SRCDIR)/F3DPD.cpp \ $(SRCDIR)/F3DGOLDEN.cpp \