diff --git a/src/F3DGOLDEN.cpp b/src/F3DGOLDEN.cpp new file mode 100644 index 00000000..b5cbbfb5 --- /dev/null +++ b/src/F3DGOLDEN.cpp @@ -0,0 +1,71 @@ +#include +#include "GLideN64.h" +#include "Debug.h" +#include "F3D.h" +#include "F3DGOLDEN.h" +#include "N64.h" +#include "RSP.h" +#include "RDP.h" +#include "gSP.h" +#include "gDP.h" +#include "GBI.h" + +#define F3DGOLDEN_TRIX 0xB1 +#define F3DGOLDEN_MOVEWORD 0xBD + +u32 G_GOLDEN_TRIX; +u32 G_GOLDEN_MOVEWORD; + +void F3DGOLDEN_TriX(u32 w0, u32 w1) +{ + while(w1 != 0) { + s32 v0 = w1 & 0xf; + w1 >>= 4; + + s32 v1 = w1 & 0xf; + w1 >>= 4; + + s32 v2 = w0 & 0xf; + w0 >>= 4; + + gSPTriangle(v0, v1, v2); + } + gSPFlushTriangles(); +} + +void F3DGOLDEN_Init() +{ + gSPSetupFunctions(); + // Set GeometryMode flags + GBI_InitFlags( F3D ); + + GBI.PCStackSize = 10; + + // 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, F3D_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, F3D_Tri1 ); + GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL ); + GBI_SetGBI( G_GOLDEN_MOVEWORD, F3DGOLDEN_MOVEWORD, F3D_MoveWord ); + 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_QUAD, F3D_QUAD, F3D_Quad ); + 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_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont ); + GBI_SetGBI( G_GOLDEN_TRIX, F3DGOLDEN_TRIX, F3DGOLDEN_TriX ); +} diff --git a/src/F3DGOLDEN.h b/src/F3DGOLDEN.h new file mode 100644 index 00000000..69cd121d --- /dev/null +++ b/src/F3DGOLDEN.h @@ -0,0 +1,7 @@ +#ifndef F3DGOLDEN_H +#define F3DGOLDEN_H + +void F3DGOLDEN_Init(); + +#endif + diff --git a/src/GBI.cpp b/src/GBI.cpp index c3ba61fb..5213632c 100644 --- a/src/GBI.cpp +++ b/src/GBI.cpp @@ -23,6 +23,7 @@ #include "F3DWRUS.h" #include "F3DPD.h" #include "F3DSETA.h" +#include "F3DGOLDEN.h" #include "F3DEX2CBFD.h" #include "ZSort.h" #include "CRC.h" @@ -34,26 +35,26 @@ u32 last_good_ucode = (u32) -1; SpecialMicrocodeInfo specialMicrocodes[] = { - { F3D, false, 0xe62a706d, "Fast3D" }, - { F3D, false, 0x7d372819, "Fast3D" }, - { F3D, false, 0xe01e14be, "Fast3D" }, - { F3D, false, 0x4AED6B3B, "Fast3D" }, //Vivid Dolls [ALECK64] + { F3D, false, 0xe62a706d, "Fast3D" }, + { F3D, false, 0x7d372819, "Fast3D" }, + { F3D, false, 0xe01e14be, "Fast3D" }, + { F3D, false, 0x4AED6B3B, "Fast3D" }, //Vivid Dolls [ALECK64] - { F3DSETA, false, 0x2edee7be, "RSP SW Version: 2.0D, 04-01-96" }, - { F3DWRUS, false, 0xd17906e2, "RSP SW Version: 2.0D, 04-01-96" }, - { F3DSWSE, false, 0x94c4c833, "RSP SW Version: 2.0D, 04-01-96" }, - { F3DEX, true, 0x637b4b58, "RSP SW Version: 2.0D, 04-01-96" }, - { F3D, true, 0x54c558ba, "RSP SW Version: 2.0D, 04-01-96" }, // Pilot Wings - { F3D, true, 0x302bca09, "RSP SW Version: 2.0G, 09-30-96" }, // GoldenEye + { F3DSETA, false, 0x2edee7be, "RSP SW Version: 2.0D, 04-01-96" }, + { F3DWRUS, false, 0xd17906e2, "RSP SW Version: 2.0D, 04-01-96" }, + { F3DSWSE, false, 0x94c4c833, "RSP SW Version: 2.0D, 04-01-96" }, + { F3DEX, true, 0x637b4b58, "RSP SW Version: 2.0D, 04-01-96" }, + { F3D, true, 0x54c558ba, "RSP SW Version: 2.0D, 04-01-96" }, // Pilot Wings + { F3DGOLDEN, true, 0x302bca09, "RSP SW Version: 2.0G, 09-30-96" }, // GoldenEye - { S2DEX, false, 0x9df31081, "RSP Gfx ucode S2DEX 1.06 Yoshitaka Yasumoto Nintendo." }, + { S2DEX, false, 0x9df31081, "RSP Gfx ucode S2DEX 1.06 Yoshitaka Yasumoto Nintendo." }, - { F3DDKR, false, 0x8d91244f, "Diddy Kong Racing" }, - { F3DDKR, false, 0x6e6fc893, "Diddy Kong Racing" }, - { F3DJFG, false, 0xbde9d1fb, "Jet Force Gemini" }, - { F3DPD, true, 0x1c4f7869, "Perfect Dark" }, - { Turbo3D, false, 0x2bdcfc8a, "Turbo3D" }, - { F3DEX2CBFD, true, 0x1b4ace88, "Conker's Bad Fur Day" } + { F3DDKR, false, 0x8d91244f, "Diddy Kong Racing" }, + { F3DDKR, false, 0x6e6fc893, "Diddy Kong Racing" }, + { F3DJFG, false, 0xbde9d1fb, "Jet Force Gemini" }, + { F3DPD, true, 0x1c4f7869, "Perfect Dark" }, + { Turbo3D, false, 0x2bdcfc8a, "Turbo3D" }, + { F3DEX2CBFD, true, 0x1b4ace88, "Conker's Bad Fur Day" } }; u32 G_RDPHALF_1, G_RDPHALF_2, G_RDPHALF_CONT; @@ -168,23 +169,24 @@ void GBIInfo::_makeCurrent(MicrocodeInfo * _pCurrent) G_TRI1 = G_TRI2 = G_TRI4 = G_QUAD = -1; // For correct work of gSPFlushTriangles() switch (m_pCurrent->type) { - case F3D: F3D_Init(); break; - case F3DEX: F3DEX_Init(); break; - case F3DEX2: F3DEX2_Init(); break; - case L3D: L3D_Init(); break; - case L3DEX: L3DEX_Init(); break; - case L3DEX2: L3DEX2_Init(); break; - case S2DEX: S2DEX_Init(); break; - case S2DEX2: S2DEX2_Init(); break; - case F3DDKR: F3DDKR_Init(); break; - case F3DJFG: F3DJFG_Init(); break; - case F3DSWSE: F3DSWSE_Init(); break; - case F3DWRUS: F3DWRUS_Init(); break; - case F3DPD: F3DPD_Init(); break; - case Turbo3D: F3D_Init(); break; - case ZSortp: ZSort_Init(); break; - case F3DEX2CBFD:F3DEX2CBFD_Init(); break; - case F3DSETA: F3DSETA_Init(); break; + case F3D: F3D_Init(); break; + case F3DEX: F3DEX_Init(); break; + case F3DEX2: F3DEX2_Init(); break; + case L3D: L3D_Init(); break; + case L3DEX: L3DEX_Init(); break; + case L3DEX2: L3DEX2_Init(); break; + case S2DEX: S2DEX_Init(); break; + case S2DEX2: S2DEX2_Init(); break; + case F3DDKR: F3DDKR_Init(); break; + case F3DJFG: F3DJFG_Init(); break; + case F3DSWSE: F3DSWSE_Init(); break; + case F3DWRUS: F3DWRUS_Init(); break; + case F3DPD: F3DPD_Init(); break; + case Turbo3D: F3D_Init(); break; + case ZSortp: ZSort_Init(); break; + case F3DEX2CBFD:F3DEX2CBFD_Init(); break; + case F3DSETA: F3DSETA_Init(); break; + case F3DGOLDEN: F3DGOLDEN_Init(); break; } #ifndef GLESX diff --git a/src/GBI.h b/src/GBI.h index 70a0ad4d..8a4f358c 100644 --- a/src/GBI.h +++ b/src/GBI.h @@ -23,7 +23,8 @@ #define Turbo3D 14 #define ZSortp 15 #define F3DSETA 16 -#define NONE 17 +#define F3DGOLDEN 17 +#define NONE 18 // Fixed point conversion factors #define FIXED2FLOATRECIP1 0.5f diff --git a/src/gSP.h b/src/gSP.h index 279c8e56..87a26e8a 100644 --- a/src/gSP.h +++ b/src/gSP.h @@ -223,4 +223,5 @@ extern void (*gSPLightVertex)(SPVertex & _vtx); extern void (*gSPPointLightVertex)(SPVertex & _vtx, float * _vPos); extern void (*gSPBillboardVertex)(u32 v, u32 i); void gSPSetupFunctions(); +inline void gSPFlushTriangles(); #endif