From a8ecc0aa700b68f023e88653ef9bcaefb15bb296 Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Tue, 31 Jan 2017 14:44:54 +0700 Subject: [PATCH] Implement F3DTEX/A ucode. Decoded by olivieryuyu. Fixed 64 de hakken HLE not working. #268 --- projects/msvc12/GLideN64.vcxproj | 2 + projects/msvc12/GLideN64.vcxproj.filters | 6 +++ src/CMakeLists.txt | 1 + src/F3DTEXA.cpp | 66 ++++++++++++++++++++++++ src/F3DTEXA.h | 6 +++ src/GBI.cpp | 4 ++ src/GBI.h | 3 +- src/RDP.h | 4 ++ src/mupen64plus-video-gliden64.mk | 1 + 9 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/F3DTEXA.cpp create mode 100644 src/F3DTEXA.h diff --git a/projects/msvc12/GLideN64.vcxproj b/projects/msvc12/GLideN64.vcxproj index 2429cce6..7f2ee794 100644 --- a/projects/msvc12/GLideN64.vcxproj +++ b/projects/msvc12/GLideN64.vcxproj @@ -284,6 +284,7 @@ + @@ -402,6 +403,7 @@ + diff --git a/projects/msvc12/GLideN64.vcxproj.filters b/projects/msvc12/GLideN64.vcxproj.filters index bccb7779..bafaccc3 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 aed34c4f..a32b8a3c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -24,6 +24,7 @@ set(GLideN64_SOURCES F3DEX2.cpp F3DEX2CBFD.cpp F3DEX2MM.cpp + F3DTEXA.cpp FBOTextureFormats.cpp FrameBuffer.cpp FrameBufferInfo.cpp diff --git a/src/F3DTEXA.cpp b/src/F3DTEXA.cpp new file mode 100644 index 00000000..1fa8faf2 --- /dev/null +++ b/src/F3DTEXA.cpp @@ -0,0 +1,66 @@ +#include "GLideN64.h" +#include "F3D.h" +#include "F3DEX.h" +#include "F3DTEXA.h" +#include "N64.h" +#include "RDP.h" +#include "gSP.h" +#include "GBI.h" + +#define F3DTEXA_LOADTEX 0xB5 +#define F3DTEXA_SETTILESIZE 0xBE + +u32 G_TEXA_LOADTEX, G_TEXA_SETTILESIZE; + +void F3DTTEXA_LoadTex(u32 w0, u32 w1) +{ + RDP_SetTImg(0x3d100000, w1); + RDP_SetTile(0x35100000, 0x07000000); + RDP_LoadBlock(0x33000000, 0x27000000 | _SHIFTR(w0, 0, 24)); +} + +void F3DTTEXA_SetTileSize(u32 w0, u32 w1) +{ + const u32 firstHalf = _SHIFTL(_SHIFTR(w1, 24, 8), 9, 8); + RDP_SetTile(0x35400000 | firstHalf, _SHIFTR(w0, 0, 24)); + RDP_SetTileSize(0x32000000, _SHIFTR(w1, 0, 24)); +} + +void F3DTEXA_Init() +{ + gSPSetupFunctions(); + // Set GeometryMode flags + GBI_InitFlags(F3DEX); + + GBI.PCStackSize = 18; + + // GBI Command Command Value Command Function + GBI_SetGBI(G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp); + GBI_SetGBI(G_MTX, F3D_MTX, F3D_Mtx); + GBI_SetGBI(G_RESERVED0, F3D_RESERVED0, F3D_Reserved0); + GBI_SetGBI(G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem); + GBI_SetGBI(G_VTX, F3D_VTX, F3DEX_Vtx); + GBI_SetGBI(G_RESERVED1, F3D_RESERVED1, F3D_Reserved1); + GBI_SetGBI(G_DL, F3D_DL, F3D_DList); + GBI_SetGBI(G_RESERVED2, F3D_RESERVED2, F3D_Reserved2); + GBI_SetGBI(G_RESERVED3, F3D_RESERVED3, F3D_Reserved3); + GBI_SetGBI(G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base); + + GBI_SetGBI(G_TRI1, F3D_TRI1, F3DEX_Tri1); + GBI_SetGBI(G_TEXA_SETTILESIZE, F3DTEXA_SETTILESIZE, F3DTTEXA_SetTileSize); + GBI_SetGBI(G_POPMTX, F3D_POPMTX, F3D_PopMtx); + GBI_SetGBI(G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord); + GBI_SetGBI(G_TEXTURE, F3D_TEXTURE, F3D_Texture); + 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_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode); + GBI_SetGBI(G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode); + GBI_SetGBI(G_TEXA_LOADTEX, F3DTEXA_LOADTEX, F3DTTEXA_LoadTex); + 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_MODIFYVTX, F3DEX_MODIFYVTX, F3DEX_ModifyVtx); + GBI_SetGBI(G_TRI2, F3DEX_TRI2, F3DEX_Tri2); + GBI_SetGBI(G_BRANCH_Z, F3DEX_BRANCH_Z, F3DEX_Branch_Z); + GBI_SetGBI(G_LOAD_UCODE, F3DEX_LOAD_UCODE, F3DEX_Load_uCode); +} diff --git a/src/F3DTEXA.h b/src/F3DTEXA.h new file mode 100644 index 00000000..e6ffe59f --- /dev/null +++ b/src/F3DTEXA.h @@ -0,0 +1,6 @@ +#ifndef F3DTEXA_H +#define F3DTEXA_H + +void F3DTEXA_Init(); + +#endif diff --git a/src/GBI.cpp b/src/GBI.cpp index 84203500..41f0729b 100644 --- a/src/GBI.cpp +++ b/src/GBI.cpp @@ -25,6 +25,7 @@ #include "F3DGOLDEN.h" #include "F3DEX2CBFD.h" #include "F3DEX2MM.h" +#include "F3DTEXA.h" #include "ZSort.h" #include "CRC.h" #include "Log.h" @@ -188,6 +189,7 @@ void GBIInfo::_makeCurrent(MicrocodeInfo * _pCurrent) case F3DSETA: F3DSETA_Init(); break; case F3DGOLDEN: F3DGOLDEN_Init(); break; case F3DEX2MM: F3DEX2MM_Init(); break; + case F3DTEXA: F3DTEXA_Init(); break; } #ifndef GLESX @@ -290,6 +292,8 @@ void GBIInfo::loadMicrocode(u32 uc_start, u32 uc_dstart, u16 uc_dsize) current.textureGen = false; else if (strncmp(&uc_str[14], "F3DZ", 4) == 0) type = F3DEX2MM; + else if (strncmp(&uc_str[14], "F3DTEX/A", 8) == 0) + type = F3DTEXA; else if (strncmp(&uc_str[14], "F3DLX.Rej", 9) == 0) current.NoN = true; else if (strncmp(&uc_str[14], "F3DLP.Rej", 9) == 0) { diff --git a/src/GBI.h b/src/GBI.h index b516da57..edc435ec 100644 --- a/src/GBI.h +++ b/src/GBI.h @@ -24,7 +24,8 @@ #define ZSortp 15 #define F3DSETA 16 #define F3DEX2MM 17 -#define NONE 18 +#define F3DTEXA 18 +#define NONE 19 // Fixed point conversion factors #define FIXED2FLOATRECIP1 0.5f diff --git a/src/RDP.h b/src/RDP.h index d773ec1d..79fb4ea6 100644 --- a/src/RDP.h +++ b/src/RDP.h @@ -20,6 +20,10 @@ void RDP_TexRect(u32 w0, u32 w1); void RDP_ProcessRDPList(); void RDP_RepeatLastLoadBlock(); void RDP_SetScissor(u32 w0, u32 w1); +void RDP_SetTImg(u32 w0, u32 w1); +void RDP_LoadBlock(u32 w0, u32 w1); +void RDP_SetTile(u32 w0, u32 w1); +void RDP_SetTileSize(u32 w0, u32 w1); #endif diff --git a/src/mupen64plus-video-gliden64.mk b/src/mupen64plus-video-gliden64.mk index 65e9c9e3..36dd8385 100644 --- a/src/mupen64plus-video-gliden64.mk +++ b/src/mupen64plus-video-gliden64.mk @@ -40,6 +40,7 @@ MY_LOCAL_SRC_FILES := \ $(SRCDIR)/F3DGOLDEN.cpp \ $(SRCDIR)/F3DSETA.cpp \ $(SRCDIR)/F3DBETA.cpp \ + $(SRCDIR)/F3DTEXA.cpp \ $(SRCDIR)/FBOTextureFormats.cpp \ $(SRCDIR)/FrameBuffer.cpp \ $(SRCDIR)/FrameBufferInfo.cpp \