From 03b032c9392ddfe5f56614227a8f85788fc11bc6 Mon Sep 17 00:00:00 2001 From: zilmar Date: Sun, 17 Jan 2016 16:44:01 +1100 Subject: [PATCH 01/54] [3rd Party] Add buffer offlow check in 7zip --- Source/3rdParty/7zip/Lzma2Dec.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/3rdParty/7zip/Lzma2Dec.c b/Source/3rdParty/7zip/Lzma2Dec.c index 7ea1cc953..c7a85c6e8 100644 --- a/Source/3rdParty/7zip/Lzma2Dec.c +++ b/Source/3rdParty/7zip/Lzma2Dec.c @@ -65,10 +65,10 @@ static SRes Lzma2Dec_GetOldProps(Byte prop, Byte *props) return SZ_ERROR_UNSUPPORTED; dicSize = (prop == 40) ? 0xFFFFFFFF : LZMA2_DIC_SIZE_FROM_PROP(prop); props[0] = (Byte)LZMA2_LCLP_MAX; - props[1] = (Byte)(dicSize); - props[2] = (Byte)(dicSize >> 8); - props[3] = (Byte)(dicSize >> 16); - props[4] = (Byte)(dicSize >> 24); + props[1] = (Byte)((dicSize)& 0xFF); + props[2] = (Byte)((dicSize >> 8) & 0xFF); + props[3] = (Byte)((dicSize >> 16) & 0xFF); + props[4] = (Byte)((dicSize >> 24) & 0xFF); return SZ_OK; } From ec03eb642afe456676f8b727e036525b7d9d6fbf Mon Sep 17 00:00:00 2001 From: zilmar Date: Sun, 17 Jan 2016 16:54:08 +1100 Subject: [PATCH 02/54] [Common] Cleanup MemoryManagement.cpp --- Source/Common/MemoryManagement.cpp | 60 +++++++++++++++--------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/Source/Common/MemoryManagement.cpp b/Source/Common/MemoryManagement.cpp index a967a79c4..65d87dcd7 100644 --- a/Source/Common/MemoryManagement.cpp +++ b/Source/Common/MemoryManagement.cpp @@ -2,38 +2,38 @@ #include #include "MemoryManagement.h" -static bool TranslateFromMemProtect ( MEM_PROTECTION memProtection, int & OsMemProtection) +static bool TranslateFromMemProtect(MEM_PROTECTION memProtection, int & OsMemProtection) { - switch (memProtection) - { - case MEM_NOACCESS: OsMemProtection = PAGE_NOACCESS; break; - case MEM_READONLY: OsMemProtection = PAGE_READONLY; break; - case MEM_READWRITE: OsMemProtection = PAGE_READWRITE; break; - case MEM_EXECUTE_READWRITE: OsMemProtection = PAGE_EXECUTE_READWRITE; break; - default: - return false; - } - return true; + switch (memProtection) + { + case MEM_NOACCESS: OsMemProtection = PAGE_NOACCESS; break; + case MEM_READONLY: OsMemProtection = PAGE_READONLY; break; + case MEM_READWRITE: OsMemProtection = PAGE_READWRITE; break; + case MEM_EXECUTE_READWRITE: OsMemProtection = PAGE_EXECUTE_READWRITE; break; + default: + return false; + } + return true; } void* AllocateAddressSpace(size_t size) { - return VirtualAlloc(NULL, size, MEM_RESERVE | MEM_TOP_DOWN, PAGE_NOACCESS); + return VirtualAlloc(NULL, size, MEM_RESERVE | MEM_TOP_DOWN, PAGE_NOACCESS); } bool FreeAddressSpace(void* addr, size_t size) { - return VirtualFree(addr, 0, MEM_RELEASE) != 0; + return VirtualFree(addr, 0, MEM_RELEASE) != 0; } void* CommitMemory(void* addr, size_t size, MEM_PROTECTION memProtection) { - int OsMemProtection; - if (!TranslateFromMemProtect(memProtection,OsMemProtection)) - { - return NULL; - } - return VirtualAlloc(addr, size, MEM_COMMIT, OsMemProtection); + int OsMemProtection; + if (!TranslateFromMemProtect(memProtection, OsMemProtection)) + { + return NULL; + } + return VirtualAlloc(addr, size, MEM_COMMIT, OsMemProtection); } bool DecommitMemory(void* addr, size_t size) @@ -43,16 +43,16 @@ bool DecommitMemory(void* addr, size_t size) bool ProtectMemory(void* addr, size_t size, MEM_PROTECTION memProtection, MEM_PROTECTION * OldProtect) { - int OsMemProtection; - if (!TranslateFromMemProtect(memProtection,OsMemProtection)) - { - return NULL; - } + int OsMemProtection; + if (!TranslateFromMemProtect(memProtection, OsMemProtection)) + { + return NULL; + } - DWORD OldOsProtect; + DWORD OldOsProtect; BOOL res = VirtualProtect(addr, size, OsMemProtection, &OldOsProtect); - if (OldProtect != NULL) - { - } - return res != 0; -} + if (OldProtect != NULL) + { + } + return res != 0; +} \ No newline at end of file From cbd1f6760f68854db8a1d22f77f49c4f044ecbe3 Mon Sep 17 00:00:00 2001 From: zilmar Date: Sun, 17 Jan 2016 16:55:44 +1100 Subject: [PATCH 03/54] [Project64] Be able to correctly get old protection from ProtectMemory --- Source/Common/MemoryManagement.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Source/Common/MemoryManagement.cpp b/Source/Common/MemoryManagement.cpp index 65d87dcd7..50d2e66dd 100644 --- a/Source/Common/MemoryManagement.cpp +++ b/Source/Common/MemoryManagement.cpp @@ -16,6 +16,20 @@ static bool TranslateFromMemProtect(MEM_PROTECTION memProtection, int & OsMemPro return true; } +static bool TranslateToMemProtect(int OsMemProtection, MEM_PROTECTION & memProtection) +{ + switch (OsMemProtection) + { + case PAGE_NOACCESS: memProtection = MEM_NOACCESS; break; + case PAGE_READONLY: memProtection = MEM_READONLY; break; + case PAGE_READWRITE: memProtection = MEM_READWRITE; break; + case PAGE_EXECUTE_READWRITE: memProtection = MEM_EXECUTE_READWRITE; break; + default: + return false; + } + return true; +} + void* AllocateAddressSpace(size_t size) { return VirtualAlloc(NULL, size, MEM_RESERVE | MEM_TOP_DOWN, PAGE_NOACCESS); @@ -53,6 +67,10 @@ bool ProtectMemory(void* addr, size_t size, MEM_PROTECTION memProtection, MEM_PR BOOL res = VirtualProtect(addr, size, OsMemProtection, &OldOsProtect); if (OldProtect != NULL) { + if (!TranslateToMemProtect(OldOsProtect, *OldProtect)) + { + return NULL; + } } return res != 0; } \ No newline at end of file From 554333711f9cd6d2664fedb96e87b49c8299d1f9 Mon Sep 17 00:00:00 2001 From: zilmar Date: Sun, 17 Jan 2016 16:57:08 +1100 Subject: [PATCH 04/54] [Common] Clean up Platform.cpp --- Source/Common/Platform.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/Common/Platform.cpp b/Source/Common/Platform.cpp index 043294401..845f09642 100644 --- a/Source/Common/Platform.cpp +++ b/Source/Common/Platform.cpp @@ -1,13 +1,13 @@ #include "stdafx.h" #ifndef _WIN32 -int _vscprintf (const char * format, va_list pargs) +int _vscprintf (const char * format, va_list pargs) { - int retval; - va_list argcopy; - va_copy(argcopy, pargs); - retval = vsnprintf(NULL, 0, format, argcopy); - va_end(argcopy); - return retval; + int retval; + va_list argcopy; + va_copy(argcopy, pargs); + retval = vsnprintf(NULL, 0, format, argcopy); + va_end(argcopy); + return retval; } #endif \ No newline at end of file From 99e6df4612ac596da6413112223e1867f6c8b5af Mon Sep 17 00:00:00 2001 From: zilmar Date: Sun, 17 Jan 2016 16:58:47 +1100 Subject: [PATCH 05/54] [Common] Add fesetround to Platform.cpp --- Source/Common/Platform.cpp | 19 +++++++++++++++++-- Source/Common/Platform.h | 11 ++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Source/Common/Platform.cpp b/Source/Common/Platform.cpp index 845f09642..26ee3f3e4 100644 --- a/Source/Common/Platform.cpp +++ b/Source/Common/Platform.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #ifndef _WIN32 -int _vscprintf (const char * format, va_list pargs) +int _vscprintf(const char * format, va_list pargs) { int retval; va_list argcopy; @@ -10,4 +10,19 @@ int _vscprintf (const char * format, va_list pargs) va_end(argcopy); return retval; } -#endif \ No newline at end of file +#endif + +#ifdef _MSC_VER +#include + +int fesetround(int RoundType) +{ + static const unsigned int msRound[4] = { _RC_NEAR, _RC_CHOP, _RC_UP, _RC_DOWN }; + int32_t res = _controlfp(msRound[RoundType], _MCW_RC); + if (res == _RC_NEAR) { return FE_TONEAREST; } + if (res == _RC_CHOP) { return FE_TOWARDZERO; } + if (res == _RC_UP) { return FE_UPWARD; } + if (res == _RC_DOWN) { return FE_DOWNWARD; } + return FE_TONEAREST; +} +#endif diff --git a/Source/Common/Platform.h b/Source/Common/Platform.h index 8fd411564..5757a41b9 100644 --- a/Source/Common/Platform.h +++ b/Source/Common/Platform.h @@ -7,8 +7,17 @@ #define _stricmp strcasecmp #define _strnicmp strncasecmp #define _snprintf snprintf +#define _isnan isnan #define GetCurrentThreadId pthread_self int _vscprintf (const char * format, va_list pargs); -#endif \ No newline at end of file +#endif + +//FPU rounding code +#ifdef _WIN32 +typedef enum { FE_TONEAREST = 0, FE_TOWARDZERO, FE_UPWARD, FE_DOWNWARD } eRoundType; +int fesetround(int RoundType); +#else +#include +#endif From 4050e765e860d54fed2bfdb5b63f710df5a90bc4 Mon Sep 17 00:00:00 2001 From: zilmar Date: Sun, 17 Jan 2016 17:00:30 +1100 Subject: [PATCH 06/54] [Project64] Fix up some brackets in PluginList.cpp --- Source/Project64/Plugins/PluginList.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/Project64/Plugins/PluginList.cpp b/Source/Project64/Plugins/PluginList.cpp index eed868da0..582834e62 100644 --- a/Source/Project64/Plugins/PluginList.cpp +++ b/Source/Project64/Plugins/PluginList.cpp @@ -54,7 +54,8 @@ void CPluginList::AddPluginFromDir(CPath Dir) Dir.SetNameExtension("*.*"); if (Dir.FindFirst(_A_SUBDIR)) { - do { + do + { AddPluginFromDir(Dir); } while (Dir.FindNext()); Dir.UpDirectory(); @@ -64,7 +65,8 @@ void CPluginList::AddPluginFromDir(CPath Dir) if (Dir.FindFirst()) { HMODULE hLib = NULL; - do { + do + { if (hLib) { FreeLibrary(hLib); From eaf2e289108051d5e9cef8209e837f929036276f Mon Sep 17 00:00:00 2001 From: zilmar Date: Sun, 17 Jan 2016 17:02:46 +1100 Subject: [PATCH 07/54] [Project64] Use cpath to get the filename in rom browser --- Source/Project64/UserInterface/RomBrowserClass.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Source/Project64/UserInterface/RomBrowserClass.cpp b/Source/Project64/UserInterface/RomBrowserClass.cpp index 16e99cf14..97f444470 100644 --- a/Source/Project64/UserInterface/RomBrowserClass.cpp +++ b/Source/Project64/UserInterface/RomBrowserClass.cpp @@ -459,8 +459,7 @@ bool CRomBrowser::FillRomInfo(ROM_INFO * pRomInfo) } else { - char drive[_MAX_DRIVE], dir[_MAX_DIR], ext[_MAX_EXT]; - _splitpath(pRomInfo->szFullFileName, drive, dir, pRomInfo->FileName, ext); + strncpy(pRomInfo->FileName, CPath(pRomInfo->szFullFileName).GetNameExtension().c_str(), sizeof(pRomInfo->FileName) / sizeof(pRomInfo->FileName[0])); } if (m_Fields[RB_InternalName].Pos() >= 0) { @@ -1576,9 +1575,9 @@ void CRomBrowser::RomList_SortList(void) } /* - * SaveRomList - save all the rom information about the current roms in the rom brower - * to a cache file, so it is quick to reload the information - */ +* SaveRomList - save all the rom information about the current roms in the rom brower +* to a cache file, so it is quick to reload the information +*/ void CRomBrowser::SaveRomList(strlist & FileList) { MD5 ListHash = RomListHash(FileList); From 3791525d7488a3452428fdf604e215d676fbaafd Mon Sep 17 00:00:00 2001 From: zilmar Date: Sun, 17 Jan 2016 17:08:39 +1100 Subject: [PATCH 08/54] [Project64] fix showing of rom name on extracting 7zip file --- Source/Project64-core/3rdParty/7zip.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Project64-core/3rdParty/7zip.cpp b/Source/Project64-core/3rdParty/7zip.cpp index f90092c40..b9b51f95e 100644 --- a/Source/Project64-core/3rdParty/7zip.cpp +++ b/Source/Project64-core/3rdParty/7zip.cpp @@ -7,7 +7,7 @@ typedef const char * LPCSTR; #include "7zip.h" #include -C7zip::C7zip (const char * FileName) : +C7zip::C7zip(const char * FileName) : m_FileSize(0), m_CurrentFile(-1), m_blockIndex(0xFFFFFFFF), @@ -129,7 +129,7 @@ bool C7zip::GetFile(int index, Byte * Data, size_t DataLen) char Msg[200]; std::wstring FileName = FileNameIndex(index); - _snprintf(Msg, sizeof(Msg) / sizeof(Msg[0]), "extracting %s", stdstr().FromUTF16(FileName.c_str())); + _snprintf(Msg, sizeof(Msg) / sizeof(Msg[0]), "extracting %s", stdstr().FromUTF16(FileName.c_str()).c_str()); m_NotfyCallback(Msg, m_NotfyCallbackInfo); SRes res = SzArEx_Extract(m_db, &m_archiveLookStream.s, index, From f87c2051b5c430d92ffa7ee773bc1f82fcf95493 Mon Sep 17 00:00:00 2001 From: zilmar Date: Sun, 17 Jan 2016 17:34:05 +1100 Subject: [PATCH 09/54] [Project64] Get the rounding code to use fesetround --- .../N64System/Interpreter/InterpreterOps.cpp | 253 +++++++----------- .../N64System/Mips/RegisterClass.cpp | 4 +- .../N64System/Mips/RegisterClass.h | 12 +- .../N64System/Recompiler/RecompilerOps.cpp | 29 +- .../N64System/Recompiler/RegInfo.cpp | 4 + 5 files changed, 120 insertions(+), 182 deletions(-) diff --git a/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp b/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp index e297097a2..ad3b51589 100644 --- a/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp +++ b/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp @@ -57,14 +57,12 @@ const int32_t R4300iOp::LWR_SHIFT[4] = { 24, 16, 8, 0 }; m_JumpToLocation = (*_PROGRAM_COUNTER);\ return; -//#define TEST_COP1_USABLE_EXCEPTION #define TEST_COP1_USABLE_EXCEPTION() \ if ((g_Reg->STATUS_REGISTER & STATUS_CU1) == 0) {\ g_Reg->DoCopUnusableException(m_NextInstruction == JUMP,1);\ m_NextInstruction = JUMP;\ m_JumpToLocation = (*_PROGRAM_COUNTER);\ - return;\ - } + return;}\ #define TLB_READ_EXCEPTION(Address) \ g_Reg->DoTLBReadMiss(m_NextInstruction == JUMP,Address);\ @@ -104,13 +102,13 @@ void R4300iOp::COP1_BC() void R4300iOp::COP1_S() { - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); Jump_CoP1_S[m_Opcode.funct](); } void R4300iOp::COP1_D() { - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); Jump_CoP1_D[m_Opcode.funct](); } @@ -2255,15 +2253,15 @@ void R4300iOp::COP1_DMF() void R4300iOp::COP1_CF() { TEST_COP1_USABLE_EXCEPTION(); - if (m_Opcode.fs != 31 && m_Opcode.fs != 0) - { - if (bHaveDebugger()) - { - g_Notify->DisplayError("CFC1 what register are you writing to ?"); - } - return; - } - _GPR[m_Opcode.rt].DW = (int32_t)_FPCR[m_Opcode.fs]; + if (m_Opcode.fs != 31 && m_Opcode.fs != 0) + { + if (bHaveDebugger()) + { + g_Notify->DisplayError("CFC1 what register are you writing to ?"); + } + return; + } + _GPR[m_Opcode.rt].DW = (int32_t)_FPCR[m_Opcode.fs]; } void R4300iOp::COP1_MT() @@ -2281,15 +2279,15 @@ void R4300iOp::COP1_DMT() void R4300iOp::COP1_CT() { TEST_COP1_USABLE_EXCEPTION(); - if (m_Opcode.fs == 31) - { + if (m_Opcode.fs == 31) + { _FPCR[m_Opcode.fs] = _GPR[m_Opcode.rt].W[0]; switch ((_FPCR[m_Opcode.fs] & 3)) { - case 0: *_RoundingModel = ROUND_NEAR; break; - case 1: *_RoundingModel = ROUND_CHOP; break; - case 2: *_RoundingModel = ROUND_UP; break; - case 3: *_RoundingModel = ROUND_DOWN; break; + case 0: *_RoundingModel = FE_TONEAREST; break; + case 1: *_RoundingModel = FE_TOWARDZERO; break; + case 2: *_RoundingModel = FE_UPWARD; break; + case 3: *_RoundingModel = FE_DOWNWARD; break; } return; } @@ -2358,186 +2356,148 @@ void R4300iOp::COP1_BCTL() } } /************************** COP1: S functions ************************/ -__inline void Float_RoundToInteger32(int32_t * Dest, float * Source) +__inline void Float_RoundToInteger32(int32_t * Dest, const float * Source, int RoundType) { -#ifdef _M_IX86 - _asm - { - mov esi, [Source] - mov edi, [Dest] - fld dword ptr[esi] - fistp dword ptr[edi] - } -#else - __m128 xmm; +#pragma warning(push) +#pragma warning(disable:4244) //warning C4244: disabe conversion from 'float' to 'int32_t', possible loss of data - xmm = _mm_load_ss(Source); - *(Dest) = _mm_cvt_ss2si(xmm); -#endif + if (RoundType == FE_TONEAREST) { *Dest = roundf(*Source); } + if (RoundType == FE_TOWARDZERO) { *Dest = truncf(*Source); } + if (RoundType == FE_UPWARD) { *Dest = ceilf(*Source); } + if (RoundType == FE_DOWNWARD) { *Dest = floorf(*Source); } + +#pragma warning(pop) } -__inline void Float_RoundToInteger64(int64_t * Dest, float * Source) +__inline void Float_RoundToInteger64(int64_t * Dest, const float * Source, int RoundType) { -#ifdef _M_IX86 - _asm - { - mov esi, [Source] - mov edi, [Dest] - fld dword ptr[esi] - fistp qword ptr[edi] - } -#else - __m128 xmm; +#pragma warning(push) +#pragma warning(disable:4244) //warning C4244: disabe conversion from 'float' to 'int64_t', possible loss of data - xmm = _mm_load_ss(Source); - *(Dest) = _mm_cvtss_si64(xmm); -#endif + if (RoundType == FE_TONEAREST) { *Dest = roundf(*Source); } + if (RoundType == FE_TOWARDZERO) { *Dest = truncf(*Source); } + if (RoundType == FE_UPWARD) { *Dest = ceilf(*Source); } + if (RoundType == FE_DOWNWARD) { *Dest = floorf(*Source); } + +#pragma warning(pop) } void R4300iOp::COP1_S_ADD() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(float *)_FPR_S[m_Opcode.fd] = (*(float *)_FPR_S[m_Opcode.fs] + *(float *)_FPR_S[m_Opcode.ft]); } void R4300iOp::COP1_S_SUB() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(float *)_FPR_S[m_Opcode.fd] = (*(float *)_FPR_S[m_Opcode.fs] - *(float *)_FPR_S[m_Opcode.ft]); } void R4300iOp::COP1_S_MUL() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(float *)_FPR_S[m_Opcode.fd] = (*(float *)_FPR_S[m_Opcode.fs] * *(float *)_FPR_S[m_Opcode.ft]); } void R4300iOp::COP1_S_DIV() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(float *)_FPR_S[m_Opcode.fd] = (*(float *)_FPR_S[m_Opcode.fs] / *(float *)_FPR_S[m_Opcode.ft]); } void R4300iOp::COP1_S_SQRT() { - float * Dest = (float *)(_FPR_S[m_Opcode.fd]); - float * Source = (float *)(_FPR_S[m_Opcode.fs]); - TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); -#ifdef _M_IX86 - _asm - { - push esi - mov esi, dword ptr[Source] - fld dword ptr[esi] - fsqrt - mov esi, dword ptr[Dest] - fstp dword ptr[esi] - pop esi - } -#else - __m128 xmm; + fesetround(*_RoundingModel); - xmm = _mm_load_ss(Source); - xmm = _mm_sqrt_ss(xmm); - *(Dest) = _mm_cvtss_f32(xmm); -#endif + *(float *)(_FPR_S[m_Opcode.fd]) = sqrtf(*(float *)(_FPR_S[m_Opcode.fs])); } void R4300iOp::COP1_S_ABS() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(float *)_FPR_S[m_Opcode.fd] = (float)fabs(*(float *)_FPR_S[m_Opcode.fs]); } void R4300iOp::COP1_S_MOV() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(float *)_FPR_S[m_Opcode.fd] = *(float *)_FPR_S[m_Opcode.fs]; } void R4300iOp::COP1_S_NEG() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(float *)_FPR_S[m_Opcode.fd] = (*(float *)_FPR_S[m_Opcode.fs] * -1.0f); } void R4300iOp::COP1_S_TRUNC_L() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(_RC_CHOP, _MCW_RC); - Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs]); + Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_TOWARDZERO); } void R4300iOp::COP1_S_CEIL_L() { //added by Witten TEST_COP1_USABLE_EXCEPTION(); - _controlfp(_RC_UP, _MCW_RC); - Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs]); + Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_UPWARD); } void R4300iOp::COP1_S_FLOOR_L() { //added by Witten TEST_COP1_USABLE_EXCEPTION(); - _controlfp(_RC_DOWN, _MCW_RC); - Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs]); + Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_DOWNWARD); } void R4300iOp::COP1_S_ROUND_W() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(_RC_NEAR, _MCW_RC); - Float_RoundToInteger32(&*(int32_t *)_FPR_S[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs]); + Float_RoundToInteger32(&*(int32_t *)_FPR_S[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_TONEAREST); } void R4300iOp::COP1_S_TRUNC_W() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(_RC_CHOP, _MCW_RC); - Float_RoundToInteger32(&*(int32_t *)_FPR_S[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs]); + Float_RoundToInteger32(&*(int32_t *)_FPR_S[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_TOWARDZERO); } void R4300iOp::COP1_S_CEIL_W() { //added by Witten TEST_COP1_USABLE_EXCEPTION(); - _controlfp(_RC_UP, _MCW_RC); - Float_RoundToInteger32(&*(int32_t *)_FPR_S[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs]); + Float_RoundToInteger32(&*(int32_t *)_FPR_S[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_UPWARD); } void R4300iOp::COP1_S_FLOOR_W() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(_RC_DOWN, _MCW_RC); - Float_RoundToInteger32(&*(int32_t *)_FPR_S[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs]); + Float_RoundToInteger32(&*(int32_t *)_FPR_S[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], FE_DOWNWARD); } void R4300iOp::COP1_S_CVT_D() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(double *)_FPR_D[m_Opcode.fd] = (double)(*(float *)_FPR_S[m_Opcode.fs]); } void R4300iOp::COP1_S_CVT_W() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); - Float_RoundToInteger32(&*(int32_t *)_FPR_S[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs]); + Float_RoundToInteger32(&*(int32_t *)_FPR_S[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], *_RoundingModel); } void R4300iOp::COP1_S_CVT_L() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); - Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs]); + Float_RoundToInteger64(&*(int64_t *)_FPR_D[m_Opcode.fd], &*(float *)_FPR_S[m_Opcode.fs], *_RoundingModel); } void R4300iOp::COP1_S_CMP() @@ -2554,7 +2514,7 @@ void R4300iOp::COP1_S_CMP() { if (bHaveDebugger()) { - g_Notify->DisplayError(stdstr_f("%s: Nan ?",__FUNCTION__).c_str()); + g_Notify->DisplayError(stdstr_f("%s: Nan ?", __FUNCTION__).c_str()); } less = false; equal = false; @@ -2588,166 +2548,147 @@ void R4300iOp::COP1_S_CMP() } /************************** COP1: D functions ************************/ -__inline void Double_RoundToInteger32(uint32_t * Dest, double * Source) +__inline void Double_RoundToInteger32(uint32_t * Dest, const double * Source, int RoundType) { -#ifdef _M_IX86 - _asm - { - mov esi, [Source] - mov edi, [Dest] - fld qword ptr [esi] - fistp dword ptr [edi] - } -#else - __m128d xmm; +#pragma warning(push) +#pragma warning(disable:4244) //warning C4244: disabe conversion from 'double' to 'uint32_t', possible loss of data - xmm = _mm_load_sd(Source); - *(Dest) = _mm_cvtsd_si32(xmm); -#endif + if (RoundType == FE_TONEAREST) { *Dest = round(*Source); } + if (RoundType == FE_TOWARDZERO) { *Dest = trunc(*Source); } + if (RoundType == FE_UPWARD) { *Dest = ceil(*Source); } + if (RoundType == FE_DOWNWARD) { *Dest = floor(*Source); } + +#pragma warning(pop) } -__inline void Double_RoundToInteger64(uint64_t * Dest, double * Source) +__inline void Double_RoundToInteger64(uint64_t * Dest, const double * Source, int RoundType) { -#ifdef _M_IX86 - _asm - { - mov esi, [Source] - mov edi, [Dest] - fld qword ptr [esi] - fistp qword ptr [edi] - } -#else - __m128d xmm; +#pragma warning(push) +#pragma warning(disable:4244) //warning C4244: disabe conversion from 'double' to 'uint64_t', possible loss of data - xmm = _mm_load_sd(Source); - *(Dest) = _mm_cvtsd_si64(xmm); -#endif + if (RoundType == FE_TONEAREST) { *Dest = round(*Source); } + if (RoundType == FE_TOWARDZERO) { *Dest = trunc(*Source); } + if (RoundType == FE_UPWARD) { *Dest = ceil(*Source); } + if (RoundType == FE_DOWNWARD) { *Dest = floor(*Source); } + +#pragma warning(pop) } void R4300iOp::COP1_D_ADD() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(double *)_FPR_D[m_Opcode.fd] = *(double *)_FPR_D[m_Opcode.fs] + *(double *)_FPR_D[m_Opcode.ft]; } void R4300iOp::COP1_D_SUB() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(double *)_FPR_D[m_Opcode.fd] = *(double *)_FPR_D[m_Opcode.fs] - *(double *)_FPR_D[m_Opcode.ft]; } void R4300iOp::COP1_D_MUL() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(double *)_FPR_D[m_Opcode.fd] = *(double *)_FPR_D[m_Opcode.fs] * *(double *)_FPR_D[m_Opcode.ft]; } void R4300iOp::COP1_D_DIV() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(double *)_FPR_D[m_Opcode.fd] = *(double *)_FPR_D[m_Opcode.fs] / *(double *)_FPR_D[m_Opcode.ft]; } void R4300iOp::COP1_D_SQRT() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(double *)_FPR_D[m_Opcode.fd] = (double)sqrt(*(double *)_FPR_D[m_Opcode.fs]); } void R4300iOp::COP1_D_ABS() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(double *)_FPR_D[m_Opcode.fd] = fabs(*(double *)_FPR_D[m_Opcode.fs]); } void R4300iOp::COP1_D_MOV() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(int64_t *)_FPR_D[m_Opcode.fd] = *(int64_t *)_FPR_D[m_Opcode.fs]; } void R4300iOp::COP1_D_NEG() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(double *)_FPR_D[m_Opcode.fd] = (*(double *)_FPR_D[m_Opcode.fs] * -1.0); } void R4300iOp::COP1_D_TRUNC_L() { //added by Witten TEST_COP1_USABLE_EXCEPTION(); - _controlfp(RC_CHOP, _MCW_RC); - Double_RoundToInteger64(&*(uint64_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs]); + Double_RoundToInteger64(&*(uint64_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_TOWARDZERO); } void R4300iOp::COP1_D_CEIL_L() { //added by Witten TEST_COP1_USABLE_EXCEPTION(); - _controlfp(RC_UP, _MCW_RC); - Double_RoundToInteger64(&*(uint64_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs]); + Double_RoundToInteger64(&*(uint64_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_UPWARD); } void R4300iOp::COP1_D_FLOOR_L() { //added by Witten TEST_COP1_USABLE_EXCEPTION(); - _controlfp(_RC_DOWN, _MCW_RC); - Double_RoundToInteger64(&*(uint64_t *)_FPR_D[m_Opcode.fd], &*(double *)_FPR_S[m_Opcode.fs]); + Double_RoundToInteger64(&*(uint64_t *)_FPR_D[m_Opcode.fd], &*(double *)_FPR_S[m_Opcode.fs], FE_DOWNWARD); } void R4300iOp::COP1_D_ROUND_W() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(_RC_NEAR, _MCW_RC); - Double_RoundToInteger32(&*(uint32_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs]); + Double_RoundToInteger32(&*(uint32_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_TONEAREST); } void R4300iOp::COP1_D_TRUNC_W() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(RC_CHOP, _MCW_RC); - Double_RoundToInteger32(&*(uint32_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs]); + Double_RoundToInteger32(&*(uint32_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_TOWARDZERO); } void R4300iOp::COP1_D_CEIL_W() { //added by Witten TEST_COP1_USABLE_EXCEPTION(); - _controlfp(RC_UP, _MCW_RC); - Double_RoundToInteger32(&*(uint32_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs]); + Double_RoundToInteger32(&*(uint32_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], FE_UPWARD); } void R4300iOp::COP1_D_FLOOR_W() { //added by Witten TEST_COP1_USABLE_EXCEPTION(); - _controlfp(_RC_DOWN, _MCW_RC); - Double_RoundToInteger32(&*(uint32_t *)_FPR_D[m_Opcode.fd], &*(double *)_FPR_S[m_Opcode.fs]); + Double_RoundToInteger32(&*(uint32_t *)_FPR_D[m_Opcode.fd], &*(double *)_FPR_S[m_Opcode.fs], FE_DOWNWARD); } void R4300iOp::COP1_D_CVT_S() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(float *)_FPR_S[m_Opcode.fd] = (float)*(double *)_FPR_D[m_Opcode.fs]; } void R4300iOp::COP1_D_CVT_W() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); - Double_RoundToInteger32(&*(uint32_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs]); + Double_RoundToInteger32(&*(uint32_t *)_FPR_S[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], *_RoundingModel); } void R4300iOp::COP1_D_CVT_L() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); - Double_RoundToInteger64(&*(uint64_t *)_FPR_D[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs]); + Double_RoundToInteger64(&*(uint64_t *)_FPR_D[m_Opcode.fd], &*(double *)_FPR_D[m_Opcode.fs], *_RoundingModel); } void R4300iOp::COP1_D_CMP() @@ -2765,7 +2706,7 @@ void R4300iOp::COP1_D_CMP() { if (bHaveDebugger()) { - g_Notify->DisplayError(stdstr_f("%s: Nan ?",__FUNCTION__).c_str()); + g_Notify->DisplayError(stdstr_f("%s: Nan ?", __FUNCTION__).c_str()); } less = false; equal = false; @@ -2802,14 +2743,14 @@ void R4300iOp::COP1_D_CMP() void R4300iOp::COP1_W_CVT_S() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(float *)_FPR_S[m_Opcode.fd] = (float)*(int32_t *)_FPR_S[m_Opcode.fs]; } void R4300iOp::COP1_W_CVT_D() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(double *)_FPR_D[m_Opcode.fd] = (double)*(int32_t *)_FPR_S[m_Opcode.fs]; } @@ -2817,14 +2758,14 @@ void R4300iOp::COP1_W_CVT_D() void R4300iOp::COP1_L_CVT_S() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(float *)_FPR_S[m_Opcode.fd] = (float)*(int64_t *)_FPR_D[m_Opcode.fs]; } void R4300iOp::COP1_L_CVT_D() { TEST_COP1_USABLE_EXCEPTION(); - _controlfp(*_RoundingModel, _MCW_RC); + fesetround(*_RoundingModel); *(double *)_FPR_D[m_Opcode.fd] = (double)*(int64_t *)_FPR_D[m_Opcode.fs]; } diff --git a/Source/Project64-core/N64System/Mips/RegisterClass.cpp b/Source/Project64-core/N64System/Mips/RegisterClass.cpp index 18657b827..574b3df60 100644 --- a/Source/Project64-core/N64System/Mips/RegisterClass.cpp +++ b/Source/Project64-core/N64System/Mips/RegisterClass.cpp @@ -60,7 +60,7 @@ float ** CSystemRegisters::_FPR_S; double ** CSystemRegisters::_FPR_D; uint32_t * CSystemRegisters::_FPCR = NULL; uint32_t * CSystemRegisters::_LLBit = NULL; -ROUNDING_MODE * CSystemRegisters::_RoundingModel = NULL; +int32_t * CSystemRegisters::_RoundingModel = NULL; CP0registers::CP0registers(uint32_t * _CP0) : INDEX_REGISTER(_CP0[0]), @@ -240,7 +240,7 @@ void CRegisters::Reset() memset(m_FPCR, 0, sizeof(m_FPCR)); m_HI.DW = 0; m_LO.DW = 0; - m_RoundingModel = ROUND_NEAR; + m_RoundingModel = FE_TONEAREST; m_LLBit = 0; diff --git a/Source/Project64-core/N64System/Mips/RegisterClass.h b/Source/Project64-core/N64System/Mips/RegisterClass.h index 9f6a4befa..01b2f9f1a 100644 --- a/Source/Project64-core/N64System/Mips/RegisterClass.h +++ b/Source/Project64-core/N64System/Mips/RegisterClass.h @@ -482,14 +482,6 @@ enum SI_STATUS_INTERRUPT = 0x1000, }; -enum ROUNDING_MODE -{ - ROUND_NEAR = 0x00000000, // _RC_NEAR - ROUND_DOWN = 0x00000100, // _RC_DOWN - ROUND_UP = 0x00000200, // _RC_UP - ROUND_CHOP = 0x00000300, // _RC_CHOP -}; - class CRegName { public: @@ -514,7 +506,7 @@ protected: static double ** _FPR_D; static uint32_t * _FPCR; static uint32_t * _LLBit; - static ROUNDING_MODE * _RoundingModel; + static int32_t * _RoundingModel; }; class CN64System; @@ -549,7 +541,7 @@ public: //Floating point registers/information uint32_t m_FPCR[32]; - ROUNDING_MODE m_RoundingModel; + int32_t m_RoundingModel; MIPS_DWORD m_FPR[32]; float * m_FPR_S[32]; double * m_FPR_D[32]; diff --git a/Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp index 57f704e5d..000133433 100644 --- a/Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp @@ -2300,7 +2300,7 @@ void CRecompilerOps::DADDIU() BeforeCallDirect(m_RegWorkingSet); MoveConstToVariable(m_Opcode.Hex, &R4300iOp::m_Opcode.Hex, "R4300iOp::m_Opcode.Hex"); - Call_Direct(R4300iOp::DADDIU, "R4300iOp::DADDIU"); + Call_Direct((void *)R4300iOp::DADDIU, "R4300iOp::DADDIU"); AfterCallDirect(m_RegWorkingSet); } @@ -3191,7 +3191,7 @@ void CRecompilerOps::SPECIAL_DMULT() BeforeCallDirect(m_RegWorkingSet); MoveConstToVariable(m_Opcode.Hex, &R4300iOp::m_Opcode.Hex, "R4300iOp::m_Opcode.Hex"); - Call_Direct(R4300iOp::SPECIAL_DMULT, "R4300iOp::SPECIAL_DMULT"); + Call_Direct((void *)R4300iOp::SPECIAL_DMULT, "R4300iOp::SPECIAL_DMULT"); AfterCallDirect(m_RegWorkingSet); } @@ -3203,7 +3203,7 @@ void CRecompilerOps::SPECIAL_DMULTU() UnMap_GPR(m_Opcode.rt, true); BeforeCallDirect(m_RegWorkingSet); MoveConstToVariable(m_Opcode.Hex, &R4300iOp::m_Opcode.Hex, "R4300iOp::m_Opcode.Hex"); - Call_Direct(R4300iOp::SPECIAL_DMULTU, "R4300iOp::SPECIAL_DMULTU"); + Call_Direct((void *)R4300iOp::SPECIAL_DMULTU, "R4300iOp::SPECIAL_DMULTU"); AfterCallDirect(m_RegWorkingSet); #ifdef toremove @@ -3282,7 +3282,7 @@ void CRecompilerOps::SPECIAL_DDIV() UnMap_GPR(m_Opcode.rt, true); BeforeCallDirect(m_RegWorkingSet); MoveConstToVariable(m_Opcode.Hex, &R4300iOp::m_Opcode.Hex, "R4300iOp::m_Opcode.Hex"); - Call_Direct(R4300iOp::SPECIAL_DDIV, "R4300iOp::SPECIAL_DDIV"); + Call_Direct((void *)R4300iOp::SPECIAL_DDIV, "R4300iOp::SPECIAL_DDIV"); AfterCallDirect(m_RegWorkingSet); } @@ -3294,7 +3294,7 @@ void CRecompilerOps::SPECIAL_DDIVU() UnMap_GPR(m_Opcode.rt, true); BeforeCallDirect(m_RegWorkingSet); MoveConstToVariable(m_Opcode.Hex, &R4300iOp::m_Opcode.Hex, "R4300iOp::m_Opcode.Hex"); - Call_Direct(R4300iOp::SPECIAL_DDIVU, "R4300iOp::SPECIAL_DDIVU"); + Call_Direct((void *)R4300iOp::SPECIAL_DDIVU, "R4300iOp::SPECIAL_DDIVU"); AfterCallDirect(m_RegWorkingSet); } @@ -5563,7 +5563,7 @@ void CRecompilerOps::COP0_CO_ERET(void) CPU_Message(" %X %s", m_CompilePC, R4300iOpcodeName(m_Opcode.Hex, m_CompilePC)); m_RegWorkingSet.WriteBackRegisters(); - Call_Direct(compiler_COP0_CO_ERET, "compiler_COP0_CO_ERET"); + Call_Direct((void *)compiler_COP0_CO_ERET, "compiler_COP0_CO_ERET"); UpdateCounters(m_RegWorkingSet, true, true); m_Section->CompileExit(m_CompilePC, (uint32_t)-1, m_RegWorkingSet, CExitInfo::Normal, true, NULL); @@ -5573,11 +5573,12 @@ void CRecompilerOps::COP0_CO_ERET(void) /************************** FPU Options **************************/ void CRecompilerOps::ChangeDefaultRoundingModel() { - switch ((_FPCR[31] & 3)) { - case 0: *_RoundingModel = ROUND_NEAR; break; - case 1: *_RoundingModel = ROUND_CHOP; break; - case 2: *_RoundingModel = ROUND_UP; break; - case 3: *_RoundingModel = ROUND_DOWN; break; + switch ((_FPCR[31] & 3)) + { + case 0: *_RoundingModel = FE_TONEAREST; break; + case 1: *_RoundingModel = FE_TOWARDZERO; break; + case 2: *_RoundingModel = FE_UPWARD; break; + case 3: *_RoundingModel = FE_DOWNWARD; break; } } @@ -5746,7 +5747,7 @@ void CRecompilerOps::COP1_CT() MoveX86regToVariable(Map_TempReg(x86_Any, m_Opcode.rt, false), &_FPCR[m_Opcode.fs], CRegName::FPR_Ctrl[m_Opcode.fs]); } BeforeCallDirect(m_RegWorkingSet); - Call_Direct(ChangeDefaultRoundingModel, "ChangeDefaultRoundingModel"); + Call_Direct((void *)ChangeDefaultRoundingModel, "ChangeDefaultRoundingModel"); AfterCallDirect(m_RegWorkingSet); m_RegWorkingSet.SetRoundingModel(CRegInfo::RoundUnknown); } @@ -6578,7 +6579,7 @@ void CRecompilerOps::UnknownOpcode() m_RegWorkingSet.SetBlockCycleCount(m_RegWorkingSet.GetBlockCycleCount() - g_System->CountPerOp()); MoveConstToVariable(m_Opcode.Hex, &R4300iOp::m_Opcode.Hex, "R4300iOp::m_Opcode.Hex"); - Call_Direct(R4300iOp::UnknownOpcode, "R4300iOp::UnknownOpcode"); + Call_Direct((void *)R4300iOp::UnknownOpcode, "R4300iOp::UnknownOpcode"); Ret(); if (m_NextInstruction == NORMAL) { m_NextInstruction = END_BLOCK; } } @@ -6712,7 +6713,7 @@ void CRecompilerOps::OverflowDelaySlot(bool TestTimer) } PushImm32("g_System->CountPerOp()", g_System->CountPerOp()); - Call_Direct(CInterpreterCPU::ExecuteOps, "CInterpreterCPU::ExecuteOps"); + Call_Direct((void *)CInterpreterCPU::ExecuteOps, "CInterpreterCPU::ExecuteOps"); AddConstToX86Reg(x86_ESP, 4); if (g_System->bFastSP() && g_Recompiler) diff --git a/Source/Project64-core/N64System/Recompiler/RegInfo.cpp b/Source/Project64-core/N64System/Recompiler/RegInfo.cpp index 1d3b705b8..fec38842c 100644 --- a/Source/Project64-core/N64System/Recompiler/RegInfo.cpp +++ b/Source/Project64-core/N64System/Recompiler/RegInfo.cpp @@ -160,8 +160,12 @@ void CRegInfo::FixRoundModel(FPU_ROUND RoundMethod) if (RoundMethod == RoundDefault) { + static const unsigned int msRound[4] = { _RC_NEAR, _RC_CHOP, _RC_UP, _RC_DOWN }; + x86Reg RoundReg = Map_TempReg(x86_Any, -1, false); MoveVariableToX86reg(&g_Reg->m_RoundingModel, "m_RoundingModel", RoundReg); + MoveVariableDispToX86Reg((void *)&msRound[0], "msRound", RoundReg, RoundReg, Multip_x4); + ShiftLeftSignImmed(RoundReg, 2); OrX86RegToX86Reg(reg, RoundReg); SetX86Protected(RoundReg, false); From 0f4ddee3eb0325d2e27866b5e175ffe50e30ecab Mon Sep 17 00:00:00 2001 From: zilmar Date: Sun, 17 Jan 2016 17:38:29 +1100 Subject: [PATCH 10/54] [Poject64] Add Load32CartridgeDomain1Address1 and Load32CartridgeDomain1Address3 --- .../N64System/Mips/MemoryVirtualMem.cpp | 18 ++++++++++++++---- .../N64System/Mips/MemoryVirtualMem.h | 2 ++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp index 798152ac4..bd54fe146 100644 --- a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp +++ b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp @@ -2106,8 +2106,10 @@ bool CMipsMemoryVM::LW_NonMemory(uint32_t PAddr, uint32_t* Value) case 0x04700000: Load32RDRAMInterface(); break; case 0x04800000: Load32SerialInterface(); break; case 0x05000000: Load32CartridgeDomain2Address1(); break; + case 0x06000000: Load32CartridgeDomain1Address1(); break; case 0x08000000: Load32CartridgeDomain2Address2(); break; case 0x1FC00000: Load32PifRam(); break; + case 0x1FF00000: Load32CartridgeDomain1Address3(); break; default: if (bHaveDebugger()) { @@ -4678,6 +4680,18 @@ void CMipsMemoryVM::Load32SerialInterface(void) } } +void CMipsMemoryVM::Load32CartridgeDomain1Address1(void) +{ + m_MemLookupValue.UW[0] = m_MemLookupAddress & 0xFFFF; + m_MemLookupValue.UW[0] = (m_MemLookupValue.UW[0] << 16) | m_MemLookupValue.UW[0]; +} + +void CMipsMemoryVM::Load32CartridgeDomain1Address3(void) +{ + m_MemLookupValue.UW[0] = m_MemLookupAddress & 0xFFFF; + m_MemLookupValue.UW[0] = (m_MemLookupValue.UW[0] << 16) | m_MemLookupValue.UW[0]; +} + void CMipsMemoryVM::Load32CartridgeDomain2Address1(void) { m_MemLookupValue.UW[0] = m_MemLookupAddress & 0xFFFF; @@ -4765,10 +4779,6 @@ void CMipsMemoryVM::Load32Rom(void) { m_MemLookupValue.UW[0] = m_MemLookupAddress & 0xFFFF; m_MemLookupValue.UW[0] = (m_MemLookupValue.UW[0] << 16) | m_MemLookupValue.UW[0]; - if (bHaveDebugger()) - { - g_Notify->BreakPoint(__FILE__, __LINE__); - } } } diff --git a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h index 16463488e..bdfa958ab 100644 --- a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h +++ b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h @@ -185,6 +185,8 @@ private: static void Load32PeripheralInterface(void); static void Load32RDRAMInterface(void); static void Load32SerialInterface(void); + static void Load32CartridgeDomain1Address1(void); + static void Load32CartridgeDomain1Address3(void); static void Load32CartridgeDomain2Address1(void); static void Load32CartridgeDomain2Address2(void); static void Load32PifRam(void); From e0ac91ca5b1405ee3f6874b4c31fcc667effab97 Mon Sep 17 00:00:00 2001 From: AmbientMalice Date: Sun, 17 Jan 2016 19:04:20 +1000 Subject: [PATCH 11/54] Fix Nintama Rantarou 64 missing graphics. Game doesn't like framebuffer enabled for whatever reason. Similar problem to Harvest Moon? --- Config/Glide64.rdb | 1 + 1 file changed, 1 insertion(+) diff --git a/Config/Glide64.rdb b/Config/Glide64.rdb index b2eb8bca0..888176ec5 100644 --- a/Config/Glide64.rdb +++ b/Config/Glide64.rdb @@ -2250,6 +2250,7 @@ wrap_big_tex=1 Good Name=Nintama Rantarou 64 Game Gallery (J) Internal Name=NINTAMAGAMEGALLERY64 depthmode=0 +fb_smart=0 force_microcheck=1 [8A97A197-272DF6C1-C:50] From 87a3d4584bce2d5a86146c29119b7fb7d0caaa38 Mon Sep 17 00:00:00 2001 From: AmbientMalice Date: Sun, 17 Jan 2016 22:14:15 +1000 Subject: [PATCH 12/54] Fix Castlevania: LoD missing dissolves. --- Config/Glide64.rdb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Config/Glide64.rdb b/Config/Glide64.rdb index b2eb8bca0..43d112348 100644 --- a/Config/Glide64.rdb +++ b/Config/Glide64.rdb @@ -633,12 +633,14 @@ Good Name=Castlevania - Legacy of Darkness (E) (M3) Internal Name=CASTLEVANIA2 depthmode=0 fb_clear=1 +old_style_adither=1 [1CC06338-87388926-C:45] Good Name=Castlevania - Legacy of Darkness (U) Internal Name=CASTLEVANIA2 depthmode=0 fb_clear=1 +old_style_adither=1 [DCCF2134-9DD63578-C:50] Good Name=Centre Court Tennis (E) From 9aa32f9ba71211c9c3618a066240abc2b5305efc Mon Sep 17 00:00:00 2001 From: AmbientMalice Date: Sun, 17 Jan 2016 22:18:27 +1000 Subject: [PATCH 13/54] Japanese Castlevanias were missing dither hack. --- Config/Glide64.rdb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Config/Glide64.rdb b/Config/Glide64.rdb index 43d112348..a98c59b12 100644 --- a/Config/Glide64.rdb +++ b/Config/Glide64.rdb @@ -263,12 +263,14 @@ Good Name=Akumajou Dracula Mokushiroku - Real Action Adventure (J) Internal Name=DRACULA MOKUSHIROKU depthmode=0 fb_clear=1 +old_style_adither=1 [A5533106-B9F25E5B-C:4A] Good Name=Akumajou Dracula Mokushiroku Gaiden - Legend of Cornell (J) Internal Name=DRACULA MOKUSHIROKU2 depthmode=0 fb_clear=1 +old_style_adither=1 [D9EDD54D-6BB8E274-C:50] Good Name=All-Star Baseball '99 (E) From cf80a16ac841d8c608c26b0d7235dcfabf2a87c0 Mon Sep 17 00:00:00 2001 From: AmbientMalice Date: Sun, 17 Jan 2016 22:32:53 +1000 Subject: [PATCH 14/54] Disable texture filtering hotkey. IMO, it causes too much trouble from accidental presses. --- Source/Glide64/Main.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/Glide64/Main.cpp b/Source/Glide64/Main.cpp index 5a0541bf9..87a4cb670 100644 --- a/Source/Glide64/Main.cpp +++ b/Source/Glide64/Main.cpp @@ -2038,14 +2038,14 @@ void newSwapBuffers() } } //hotkeys - if (CheckKeyPressed(G64_VK_BACK, 0x0001)) - { - hotkey_info.hk_filtering = 100; - if (settings.filtering < 2) - settings.filtering++; - else - settings.filtering = 0; - } + //if (CheckKeyPressed(G64_VK_BACK, 0x0001)) + //{ + //hotkey_info.hk_filtering = 100; + //if (settings.filtering < 2) + //settings.filtering++; + //else + //settings.filtering = 0; + //} if ((abs((int)(frame_count - curframe)) > 3 ) && CheckKeyPressed(G64_VK_ALT, 0x8000)) //alt + { if (CheckKeyPressed(G64_VK_B, 0x8000)) //b From 6dc9907cb6e1e001fcd8ac1ea5bd6d8c4183949d Mon Sep 17 00:00:00 2001 From: AmbientMalice Date: Sun, 17 Jan 2016 22:42:31 +1000 Subject: [PATCH 15/54] Change Mario 64 filtering to automatic. --- Config/Glide64.rdb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Config/Glide64.rdb b/Config/Glide64.rdb index b2eb8bca0..ea43b341c 100644 --- a/Config/Glide64.rdb +++ b/Config/Glide64.rdb @@ -3162,7 +3162,7 @@ Good Name=Super Mario 64 (E) (M3) Internal Name=SUPER MARIO 64 depth_bias=32 depthmode=1 -filtering=1 +filtering=0 lodmode=1 [4EAA3D0E-74757C24-C:4A] @@ -3170,7 +3170,7 @@ Good Name=Super Mario 64 (J) Internal Name=SUPER MARIO 64 depth_bias=32 depthmode=1 -filtering=1 +filtering=0 lodmode=1 [635A2BFF-8B022326-C:45] @@ -3178,7 +3178,7 @@ Good Name=Super Mario 64 (U) Internal Name=SUPER MARIO 64 depth_bias=32 depthmode=1 -filtering=1 +filtering=0 lodmode=1 [D6FBA4A8-6326AA2C-C:4A] @@ -3186,7 +3186,7 @@ Good Name=Super Mario 64 - Shindou Edition (J) Internal Name=SUPERMARIO64 depth_bias=32 depthmode=1 -filtering=1 +filtering=0 lodmode=1 [66572080-28E348E1-C:4A] From e212bee0a4c35cbce3a6003f9c65809c0bfc6e1f Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 05:44:19 +1100 Subject: [PATCH 16/54] [Project64] Fix rounding code to compile on VS 2008 --- Source/Common/Common.vcproj | 8 +++++++ .../N64System/Interpreter/InterpreterOps.cpp | 24 +++++++++++++++++++ .../N64System/Recompiler/RegInfo.cpp | 1 + 3 files changed, 33 insertions(+) diff --git a/Source/Common/Common.vcproj b/Source/Common/Common.vcproj index ff469900a..e7047f664 100644 --- a/Source/Common/Common.vcproj +++ b/Source/Common/Common.vcproj @@ -157,6 +157,10 @@ RelativePath=".\path.cpp" > + + @@ -230,6 +234,10 @@ RelativePath=".\path.h" > + + diff --git a/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp b/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp index ad3b51589..12c81e95e 100644 --- a/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp +++ b/Source/Project64-core/N64System/Interpreter/InterpreterOps.cpp @@ -21,6 +21,30 @@ #include #include +#if (defined(_MSC_VER) && (_MSC_VER < 1800)) +double round(double num) +{ + return (num - floor(num) > 0.5) ? ceil(num) : floor(num); +} + +float roundf(float num) +{ + return (num - floorf(num) > 0.5) ? ceilf(num) : floorf(num); +} +#endif + +#if (defined(_MSC_VER) && (_MSC_VER < 1700)) +double trunc(double num) +{ + return (num < 0) ? ceil(num) : floor(num); +} + +float truncf(float num) +{ + return (num < 0) ? ceilf(num) : floorf(num); +} +#endif + void InPermLoop(); void TestInterpreterJump(uint32_t PC, uint32_t TargetPC, int32_t Reg1, int32_t Reg2); diff --git a/Source/Project64-core/N64System/Recompiler/RegInfo.cpp b/Source/Project64-core/N64System/Recompiler/RegInfo.cpp index fec38842c..48b6ea728 100644 --- a/Source/Project64-core/N64System/Recompiler/RegInfo.cpp +++ b/Source/Project64-core/N64System/Recompiler/RegInfo.cpp @@ -16,6 +16,7 @@ #include #include +#include #include "x86CodeLog.h" uint32_t CRegInfo::m_fpuControl = 0; From e8468687ac8a2581b81da5f3433a47efe9a2990c Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 05:48:19 +1100 Subject: [PATCH 17/54] [Project64] remove windows.h from plugin handling --- Source/Common/Util.cpp | 51 ++++++++++- Source/Common/Util.h | 8 ++ Source/Project64-core/Plugins/AudioPlugin.cpp | 29 +++--- .../Plugins/ControllerPlugin.cpp | 89 +++++++++---------- Source/Project64-core/Plugins/GFXPlugin.cpp | 68 +++++++------- Source/Project64-core/Plugins/PluginBase.cpp | 73 +++++++-------- Source/Project64-core/Plugins/PluginBase.h | 16 ++-- Source/Project64-core/Plugins/PluginClass.cpp | 20 ++--- Source/Project64-core/Plugins/PluginClass.h | 1 + Source/Project64-core/Plugins/RSPPlugin.cpp | 40 ++++----- Source/Project64-core/Plugins/stdafx.h | 1 + Source/Project64/UserInterface/GuiClass.cpp | 21 +++-- Source/Project64/UserInterface/GuiClass.h | 1 + 13 files changed, 240 insertions(+), 178 deletions(-) create mode 100644 Source/Project64-core/Plugins/stdafx.h diff --git a/Source/Common/Util.cpp b/Source/Common/Util.cpp index b79ca65e1..753041fc3 100644 --- a/Source/Common/Util.cpp +++ b/Source/Common/Util.cpp @@ -1,13 +1,61 @@ #include "stdafx.h" #include "Util.h" +#ifdef _WIN32 #include #include +#else +#include +#endif + +pjutil::DynLibHandle pjutil::DynLibOpen(const char *pccLibraryPath, bool ShowErrors) +{ + if (pccLibraryPath == NULL) + { + return NULL; + } + UINT LastErrorMode = SetErrorMode(ShowErrors ? 0 : SEM_FAILCRITICALERRORS); + pjutil::DynLibHandle lib = (pjutil::DynLibHandle)LoadLibrary(pccLibraryPath); + SetErrorMode(LastErrorMode); + return lib; +} + +void * pjutil::DynLibGetProc(pjutil::DynLibHandle LibHandle, const char * ProcedureName) +{ + if (ProcedureName == NULL) + return NULL; + + return GetProcAddress((HMODULE)LibHandle, ProcedureName); +} + +void pjutil::DynLibClose(pjutil::DynLibHandle LibHandle) +{ + FreeLibrary((HMODULE)LibHandle); +} + +#ifdef _WIN32 +static void EmptyThreadFunction(void) +{ +} + +void pjutil::DynLibCallDllMain(void) +{ + //jabo had a bug so I call CreateThread so the dllmain in the plugins will get called again with thread attached + DWORD ThreadID; + HANDLE hthread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)EmptyThreadFunction, NULL, 0, &ThreadID); + CloseHandle(hthread); +} +#endif void pjutil::Sleep(uint32_t timeout) { +#ifdef _WIN32 ::Sleep(timeout); +#else + sleep(timeout); +#endif } +#ifdef _WIN32 bool pjutil::TerminatedExistingExe() { bool bTerminated = false; @@ -59,4 +107,5 @@ bool pjutil::TerminatedExistingExe() CloseHandle(nSearch); } return bTerminated; -} \ No newline at end of file +} +#endif diff --git a/Source/Common/Util.h b/Source/Common/Util.h index 4dc0a48a1..eaaf95505 100644 --- a/Source/Common/Util.h +++ b/Source/Common/Util.h @@ -4,6 +4,14 @@ class pjutil { public: + typedef void * DynLibHandle; + + static DynLibHandle DynLibOpen(const char *pccLibraryPath, bool ShowErrors = true); + static void * DynLibGetProc(DynLibHandle LibHandle, const char * ProcedureName); + static void DynLibClose(DynLibHandle LibHandle); +#ifdef _WIN32 + static void DynLibCallDllMain(void); +#endif static void Sleep(uint32_t timeout); static bool TerminatedExistingExe(); diff --git a/Source/Project64-core/Plugins/AudioPlugin.cpp b/Source/Project64-core/Plugins/AudioPlugin.cpp index 20c0732a3..c7fa8035c 100644 --- a/Source/Project64-core/Plugins/AudioPlugin.cpp +++ b/Source/Project64-core/Plugins/AudioPlugin.cpp @@ -15,15 +15,17 @@ #include #include #include "AudioPlugin.h" +#ifdef _WIN32 #include +#endif CAudioPlugin::CAudioPlugin() : -AiLenChanged(NULL), -AiReadLength(NULL), -ProcessAList(NULL), -m_hAudioThread(NULL), -AiUpdate(NULL), -AiDacrateChanged(NULL) + AiLenChanged(NULL), + AiReadLength(NULL), + ProcessAList(NULL), + m_hAudioThread(NULL), + AiUpdate(NULL), + AiDacrateChanged(NULL) { } @@ -36,7 +38,7 @@ CAudioPlugin::~CAudioPlugin() bool CAudioPlugin::LoadFunctions(void) { // Find entries for functions in DLL - void(__cdecl *InitiateAudio) (void); + void(CALL *InitiateAudio)(void); LoadFunction(InitiateAudio); LoadFunction(AiDacrateChanged); LoadFunction(AiLenChanged); @@ -85,11 +87,11 @@ bool CAudioPlugin::Initiate(CN64System * System, RenderWindow * Window) uint32_t * AI__DACRATE_REG; uint32_t * AI__BITRATE_REG; - void(__cdecl *CheckInterrupts)(void); + void(CALL *CheckInterrupts)(void); }; //Get Function from DLL - int32_t(__cdecl *InitiateAudio)(AUDIO_INFO Audio_Info); + int32_t(CALL *InitiateAudio)(AUDIO_INFO Audio_Info); LoadFunction(InitiateAudio); if (InitiateAudio == NULL) { return false; } @@ -137,10 +139,9 @@ bool CAudioPlugin::Initiate(CN64System * System, RenderWindow * Window) m_Initialized = InitiateAudio(Info) != 0; - //jabo had a bug so I call CreateThread so his dllmain gets called again - DWORD ThreadID; - HANDLE hthread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DummyFunction, NULL, 0, &ThreadID); - CloseHandle(hthread); +#ifdef _WIN32 + //jabo had a bug so I call CreateThread so his dllmain gets called again + pjutil::DynLibCallDllMain(); if (System != NULL) { @@ -151,6 +152,7 @@ bool CAudioPlugin::Initiate(CN64System * System, RenderWindow * Window) WriteTrace(TraceAudioPlugin, TraceDebug, "Terminate Audio Thread"); TerminateThread(m_hAudioThread, 0); } + DWORD ThreadID; m_hAudioThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AudioThread, (LPVOID)this, 0, &ThreadID); } @@ -159,6 +161,7 @@ bool CAudioPlugin::Initiate(CN64System * System, RenderWindow * Window) DacrateChanged(System->SystemType()); } } +#endif return m_Initialized; } diff --git a/Source/Project64-core/Plugins/ControllerPlugin.cpp b/Source/Project64-core/Plugins/ControllerPlugin.cpp index 2ecabf1a4..5a6854455 100644 --- a/Source/Project64-core/Plugins/ControllerPlugin.cpp +++ b/Source/Project64-core/Plugins/ControllerPlugin.cpp @@ -13,16 +13,15 @@ #include #include #include "ControllerPlugin.h" -#include CControl_Plugin::CControl_Plugin(void) : -WM_KeyDown(NULL), -WM_KeyUp(NULL), -RumbleCommand(NULL), -GetKeys(NULL), -ReadController(NULL), -ControllerCommand(NULL), -m_AllocatedControllers(false) + WM_KeyDown(NULL), + WM_KeyUp(NULL), + RumbleCommand(NULL), + GetKeys(NULL), + ReadController(NULL), + ControllerCommand(NULL), + m_AllocatedControllers(false) { memset(&m_PluginControllers, 0, sizeof(m_PluginControllers)); memset(&m_Controllers, 0, sizeof(m_Controllers)); @@ -37,7 +36,7 @@ CControl_Plugin::~CControl_Plugin() bool CControl_Plugin::LoadFunctions(void) { // Find entries for functions in DLL - void(__cdecl *InitiateControllers)(void); + void(CALL *InitiateControllers)(void); LoadFunction(InitiateControllers); LoadFunction(ControllerCommand); LoadFunction(GetKeys); @@ -65,60 +64,60 @@ bool CControl_Plugin::LoadFunctions(void) bool CControl_Plugin::Initiate(CN64System * System, RenderWindow * Window) { - CONTROL_INFO ControlInfo; uint8_t Buffer[100]; for (int32_t i = 0; i < 4; i++) { - m_PluginControllers[i].Present = FALSE; - m_PluginControllers[i].RawData = FALSE; + m_PluginControllers[i].Present = false; + m_PluginControllers[i].RawData = false; m_PluginControllers[i].Plugin = PLUGIN_NONE; } - if (m_PluginInfo.Version >= 0x0101) - { - ControlInfo.Controls = m_PluginControllers; - ControlInfo.HEADER = (System == NULL ? Buffer : g_Rom->GetRomAddress()); - ControlInfo.hinst = GetModuleHandle(NULL); - ControlInfo.hMainWindow = Window ? (HWND)Window->GetWindowHandle() : NULL; - ControlInfo.MemoryBswaped = TRUE; - } - // Test Plugin version if (m_PluginInfo.Version == 0x0100) { //Get Function from DLL - void(__cdecl *InitiateControllers_1_0)(HWND hMainWindow, CONTROL Controls[4]); - InitiateControllers_1_0 = (void(__cdecl *)(HWND, CONTROL *))GetProcAddress((HMODULE)m_hDll, "InitiateControllers"); + void(CALL *InitiateControllers_1_0)(void * hMainWindow, CONTROL Controls[4]); + _LoadFunction("InitiateControllers",InitiateControllers_1_0); if (InitiateControllers_1_0 == NULL) { return false; } - InitiateControllers_1_0((HWND)Window->GetWindowHandle(), m_PluginControllers); + InitiateControllers_1_0(Window->GetWindowHandle(), m_PluginControllers); m_Initialized = true; } - else if (m_PluginInfo.Version == 0x0101) + else if (m_PluginInfo.Version >= 0x0101) { - //Get Function from DLL - void(__cdecl *InitiateControllers_1_1)(CONTROL_INFO ControlInfo); - InitiateControllers_1_1 = (void(__cdecl *)(CONTROL_INFO))GetProcAddress((HMODULE)m_hDll, "InitiateControllers"); - if (InitiateControllers_1_1 == NULL) { return false; } + CONTROL_INFO ControlInfo; + ControlInfo.Controls = m_PluginControllers; + ControlInfo.HEADER = (System == NULL ? Buffer : g_Rom->GetRomAddress()); + ControlInfo.hinst = Window ? Window->GetModuleInstance() : NULL; + ControlInfo.hMainWindow = Window ? Window->GetWindowHandle() : NULL; + ControlInfo.MemoryBswaped = true; - InitiateControllers_1_1(ControlInfo); - m_Initialized = true; - } - else if (m_PluginInfo.Version >= 0x0102) - { - //Get Function from DLL - void(__cdecl *InitiateControllers_1_2)(CONTROL_INFO * ControlInfo); - InitiateControllers_1_2 = (void(__cdecl *)(CONTROL_INFO *))GetProcAddress((HMODULE)m_hDll, "InitiateControllers"); - if (InitiateControllers_1_2 == NULL) { return false; } + if (m_PluginInfo.Version == 0x0101) + { + //Get Function from DLL + void(CALL *InitiateControllers_1_1)(CONTROL_INFO ControlInfo); + _LoadFunction("InitiateControllers",InitiateControllers_1_1); + if (InitiateControllers_1_1 == NULL) { return false; } - InitiateControllers_1_2(&ControlInfo); - m_Initialized = true; + InitiateControllers_1_1(ControlInfo); + m_Initialized = true; + } + else if (m_PluginInfo.Version >= 0x0102) + { + //Get Function from DLL + void(CALL *InitiateControllers_1_2)(CONTROL_INFO * ControlInfo); + _LoadFunction("InitiateControllers",InitiateControllers_1_2); + if (InitiateControllers_1_2 == NULL) { return false; } + + InitiateControllers_1_2(&ControlInfo); + m_Initialized = true; + } } - //jabo had a bug so I call CreateThread so his dllmain gets called again - DWORD ThreadID; - HANDLE hthread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DummyFunction, NULL, 0, &ThreadID); - CloseHandle(hthread); +#ifdef _WIN32 + //jabo had a bug so I call CreateThread so his dllmain gets called again + pjutil::DynLibCallDllMain(); +#endif return m_Initialized; } @@ -178,7 +177,7 @@ void CControl_Plugin::SetControl(CControl_Plugin const * const Plugin) } CCONTROL::CCONTROL(int32_t &Present, int32_t &RawData, int32_t &PlugType) : -m_Present(Present), m_RawData(RawData), m_PlugType(PlugType) + m_Present(Present), m_RawData(RawData), m_PlugType(PlugType) { m_Buttons.Value = 0; } diff --git a/Source/Project64-core/Plugins/GFXPlugin.cpp b/Source/Project64-core/Plugins/GFXPlugin.cpp index 6d1dfede3..7170922b8 100644 --- a/Source/Project64-core/Plugins/GFXPlugin.cpp +++ b/Source/Project64-core/Plugins/GFXPlugin.cpp @@ -14,25 +14,24 @@ #include #include #include "GFXPlugin.h" -#include CGfxPlugin::CGfxPlugin() : -CaptureScreen(NULL), -ChangeWindow(NULL), -DrawScreen(NULL), -DrawStatus(NULL), -MoveScreen(NULL), -ProcessDList(NULL), -ProcessRDPList(NULL), -ShowCFB(NULL), -UpdateScreen(NULL), -ViStatusChanged(NULL), -ViWidthChanged(NULL), -SoftReset(NULL), -GetRomBrowserMenu(NULL), -OnRomBrowserMenuItem(NULL), -GetDebugInfo(NULL), -InitiateDebugger(NULL) + CaptureScreen(NULL), + ChangeWindow(NULL), + DrawScreen(NULL), + DrawStatus(NULL), + MoveScreen(NULL), + ProcessDList(NULL), + ProcessRDPList(NULL), + ShowCFB(NULL), + UpdateScreen(NULL), + ViStatusChanged(NULL), + ViWidthChanged(NULL), + SoftReset(NULL), + GetRomBrowserMenu(NULL), + OnRomBrowserMenuItem(NULL), + GetDebugInfo(NULL), + InitiateDebugger(NULL) { memset(&m_GFXDebug, 0, sizeof(m_GFXDebug)); } @@ -46,7 +45,7 @@ CGfxPlugin::~CGfxPlugin() bool CGfxPlugin::LoadFunctions(void) { // Find entries for functions in DLL - int32_t(__cdecl *InitiateGFX) (void * Gfx_Info); + int32_t(CALL *InitiateGFX) (void * Gfx_Info); LoadFunction(InitiateGFX); LoadFunction(ChangeWindow); LoadFunction(DrawScreen); @@ -94,8 +93,9 @@ bool CGfxPlugin::LoadFunctions(void) } if (GetDebugInfo != NULL) + { GetDebugInfo(&m_GFXDebug); - + } return true; } @@ -108,8 +108,8 @@ bool CGfxPlugin::Initiate(CN64System * System, RenderWindow * Window) typedef struct { - HWND hWnd; /* Render window */ - HWND hStatusBar; /* if render window does not have a status bar then this is NULL */ + void * hWnd; /* Render window */ + void * hStatusBar; /* if render window does not have a status bar then this is NULL */ int32_t MemoryBswaped; // If this is set to TRUE, then the memory has been pre // bswap on a dword (32 bits) boundry @@ -148,19 +148,19 @@ bool CGfxPlugin::Initiate(CN64System * System, RenderWindow * Window) uint32_t * VI__X_SCALE_REG; uint32_t * VI__Y_SCALE_REG; - void(__cdecl *CheckInterrupts)(void); + void(CALL *CheckInterrupts)(void); } GFX_INFO; //Get Function from DLL - int32_t(__cdecl *InitiateGFX)(GFX_INFO Gfx_Info); - InitiateGFX = (int32_t(__cdecl *)(GFX_INFO))GetProcAddress((HMODULE)m_hDll, "InitiateGFX"); + int32_t(CALL *InitiateGFX)(GFX_INFO Gfx_Info); + _LoadFunction("InitiateGFX",InitiateGFX); if (InitiateGFX == NULL) { return false; } GFX_INFO Info = { 0 }; - Info.MemoryBswaped = TRUE; - Info.hWnd = (HWND)Window->GetWindowHandle(); - Info.hStatusBar = (HWND)Window->GetStatusBar(); + Info.MemoryBswaped = true; + Info.hWnd = Window->GetWindowHandle(); + Info.hStatusBar = Window->GetStatusBar(); Info.CheckInterrupts = DummyCheckInterrupts; // We are initializing the plugin before any rom is loaded so we do not have any correct @@ -224,20 +224,20 @@ bool CGfxPlugin::Initiate(CN64System * System, RenderWindow * Window) m_Initialized = InitiateGFX(Info) != 0; - //jabo had a bug so I call CreateThread so his dllmain gets called again - DWORD ThreadID; - HANDLE hthread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DummyFunction, NULL, 0, &ThreadID); - CloseHandle(hthread); +#ifdef _WIN32 + //jabo had a bug so I call CreateThread so his dllmain gets called again + pjutil::DynLibCallDllMain(); +#endif return m_Initialized; } void CGfxPlugin::UnloadPluginDetails(void) { - if (m_hDll != NULL) + if (m_LibHandle != NULL) { - FreeLibrary((HMODULE)m_hDll); - m_hDll = NULL; + pjutil::DynLibClose(m_LibHandle); + m_LibHandle = NULL; } memset(&m_GFXDebug, 0, sizeof(m_GFXDebug)); diff --git a/Source/Project64-core/Plugins/PluginBase.cpp b/Source/Project64-core/Plugins/PluginBase.cpp index 80de16028..c07054b16 100644 --- a/Source/Project64-core/Plugins/PluginBase.cpp +++ b/Source/Project64-core/Plugins/PluginBase.cpp @@ -10,21 +10,20 @@ ****************************************************************************/ #include "stdafx.h" #include "PluginBase.h" -#include CPlugin::CPlugin() : -DllAbout(NULL), -DllConfig(NULL), -CloseDLL(NULL), -RomOpen(NULL), -RomClosed(NULL), -PluginOpened(NULL), -SetSettingInfo(NULL), -SetSettingInfo2(NULL), -SetSettingInfo3(NULL), -m_hDll(NULL), -m_Initialized(false), -m_RomOpen(false) + DllAbout(NULL), + DllConfig(NULL), + CloseDLL(NULL), + RomOpen(NULL), + RomClosed(NULL), + PluginOpened(NULL), + SetSettingInfo(NULL), + SetSettingInfo2(NULL), + SetSettingInfo3(NULL), + m_LibHandle(NULL), + m_Initialized(false), + m_RomOpen(false) { memset(&m_PluginInfo, 0, sizeof(m_PluginInfo)); } @@ -37,31 +36,21 @@ CPlugin::~CPlugin() bool CPlugin::Load(const char * FileName) { // Already loaded, so unload first. - if (m_hDll != NULL) + if (m_LibHandle != NULL) { UnloadPlugin(); } // Try to load the plugin DLL //Try to load the DLL library - if (bHaveDebugger()) - { - m_hDll = LoadLibrary(FileName); - } - else - { - UINT LastErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); - m_hDll = LoadLibrary(FileName); - SetErrorMode(LastErrorMode); - } - - if (m_hDll == NULL) + m_LibHandle = pjutil::DynLibOpen(FileName, bHaveDebugger()); + if (m_LibHandle == NULL) { return false; } // Get DLL information - void(__cdecl *GetDllInfo) (PLUGIN_INFO * PluginInfo); + void(CALL *GetDllInfo) (PLUGIN_INFO * PluginInfo); LoadFunction(GetDllInfo); if (GetDllInfo == NULL) { return false; } @@ -69,14 +58,14 @@ bool CPlugin::Load(const char * FileName) if (!ValidPluginVersion(m_PluginInfo)) { return false; } if (m_PluginInfo.Type != type()) { return false; } - CloseDLL = (void(__cdecl *)(void)) GetProcAddress((HMODULE)m_hDll, "CloseDLL"); - RomOpen = (void(__cdecl *)(void)) GetProcAddress((HMODULE)m_hDll, "RomOpen"); - RomClosed = (void(__cdecl *)(void)) GetProcAddress((HMODULE)m_hDll, "RomClosed"); - PluginOpened = (void(__cdecl *)(void)) GetProcAddress((HMODULE)m_hDll, "PluginLoaded"); - DllConfig = (void(__cdecl *)(void *)) GetProcAddress((HMODULE)m_hDll, "DllConfig"); - DllAbout = (void(__cdecl *)(void *)) GetProcAddress((HMODULE)m_hDll, "DllAbout"); + LoadFunction(CloseDLL); + LoadFunction(RomOpen); + LoadFunction(RomClosed); + _LoadFunction("PluginLoaded", PluginOpened); + LoadFunction(DllConfig); + LoadFunction(DllAbout); - SetSettingInfo3 = (void(__cdecl *)(PLUGIN_SETTINGS3 *))GetProcAddress((HMODULE)m_hDll, "SetSettingInfo3"); + LoadFunction(SetSettingInfo3); if (SetSettingInfo3) { PLUGIN_SETTINGS3 info; @@ -84,7 +73,7 @@ bool CPlugin::Load(const char * FileName) SetSettingInfo3(&info); } - SetSettingInfo2 = (void(__cdecl *)(PLUGIN_SETTINGS2 *))GetProcAddress((HMODULE)m_hDll, "SetSettingInfo2"); + LoadFunction(SetSettingInfo2); if (SetSettingInfo2) { PLUGIN_SETTINGS2 info; @@ -92,7 +81,7 @@ bool CPlugin::Load(const char * FileName) SetSettingInfo2(&info); } - SetSettingInfo = (void(__cdecl *)(PLUGIN_SETTINGS *))GetProcAddress((HMODULE)m_hDll, "SetSettingInfo"); + LoadFunction(SetSettingInfo); if (SetSettingInfo) { PLUGIN_SETTINGS info; @@ -114,7 +103,9 @@ bool CPlugin::Load(const char * FileName) } if (RomClosed == NULL) + { return false; + } if (!LoadFunctions()) { @@ -150,7 +141,9 @@ void CPlugin::RomOpened() void CPlugin::RomClose() { if (!m_RomOpen) + { return; + } WriteTrace(PluginTraceType(), TraceDebug, "Before Rom Close"); RomClosed(); @@ -186,11 +179,11 @@ void CPlugin::UnloadPlugin() { WriteTrace(PluginTraceType(), TraceDebug, "(%s): unloading", PluginType()); memset(&m_PluginInfo, 0, sizeof(m_PluginInfo)); - if (m_hDll != NULL) + if (m_LibHandle != NULL) { UnloadPluginDetails(); - FreeLibrary((HMODULE)m_hDll); - m_hDll = NULL; + pjutil::DynLibClose(m_LibHandle); + m_LibHandle = NULL; } DllAbout = NULL; @@ -256,5 +249,5 @@ bool CPlugin::ValidPluginVersion(PLUGIN_INFO & PluginInfo) if (PluginInfo.Version == 0x0102) { return true; } break; } - return FALSE; + return false; } \ No newline at end of file diff --git a/Source/Project64-core/Plugins/PluginBase.h b/Source/Project64-core/Plugins/PluginBase.h index 2cef8f452..bb616570a 100644 --- a/Source/Project64-core/Plugins/PluginBase.h +++ b/Source/Project64-core/Plugins/PluginBase.h @@ -12,7 +12,8 @@ #include #include -#include "PluginClass.h" +#include +#include #if defined(_WIN32) #define CALL __cdecl @@ -60,17 +61,18 @@ protected: void(CALL *SetSettingInfo2) (PLUGIN_SETTINGS2 *); void(CALL *SetSettingInfo3) (PLUGIN_SETTINGS3 *); - void * m_hDll; - bool m_Initialized, m_RomOpen; + pjutil::DynLibHandle m_LibHandle; + bool m_Initialized, m_RomOpen; PLUGIN_INFO m_PluginInfo; // Loads a function pointer from the currently loaded DLL - template - void _LoadFunction(const char * szFunctionName, T & functionPointer) { - functionPointer = (T)GetProcAddress((HMODULE)m_hDll, szFunctionName); + void _LoadFunctionVoid(const char * szFunctionName, void ** functionPointer) + { + *functionPointer = pjutil::DynLibGetProc(m_LibHandle, szFunctionName); } // Simple wrapper around _LoadFunction() to avoid having to specify the same two arguments // i.e. _LoadFunction("CloseDLL", CloseDLL); -#define LoadFunction(functionName) _LoadFunction(#functionName, functionName) +#define LoadFunction(functionName) _LoadFunctionVoid(#functionName, (void **)&functionName) +#define _LoadFunction(functionName,function) _LoadFunctionVoid(functionName, (void **)&function) }; diff --git a/Source/Project64-core/Plugins/PluginClass.cpp b/Source/Project64-core/Plugins/PluginClass.cpp index 21189a135..af6b7ea21 100644 --- a/Source/Project64-core/Plugins/PluginClass.cpp +++ b/Source/Project64-core/Plugins/PluginClass.cpp @@ -11,17 +11,17 @@ #include "stdafx.h" #include #include +#include #include -#include "PluginClass.h" CPlugins::CPlugins(const stdstr & PluginDir) : -m_MainWindow(NULL), -m_SyncWindow(NULL), -m_PluginDir(PluginDir), -m_Gfx(NULL), -m_Audio(NULL), -m_RSP(NULL), -m_Control(NULL) + m_MainWindow(NULL), + m_SyncWindow(NULL), + m_PluginDir(PluginDir), + m_Gfx(NULL), + m_Audio(NULL), + m_RSP(NULL), + m_Control(NULL) { CreatePlugins(); g_Settings->RegisterChangeCB(Plugin_RSP_Current, this, (CSettings::SettingChangedFunc)PluginChanged); @@ -288,7 +288,7 @@ bool CPlugins::Reset(CN64System * System) if (m_Gfx && bGfxChange) { WriteTrace(TraceGFXPlugin, TraceDebug, "Gfx Initiate Starting"); - if (!m_Gfx->Initiate(System, m_MainWindow)) { return false; } + if (!m_Gfx->Initiate(System, m_MainWindow)) { return false; } WriteTrace(TraceGFXPlugin, TraceDebug, "Gfx Initiate Done"); } if (m_Audio && bAudioChange) @@ -306,7 +306,7 @@ bool CPlugins::Reset(CN64System * System) if (m_RSP && bRspChange) { WriteTrace(TraceRSPPlugin, TraceDebug, "RSP Initiate Starting"); - if (!m_RSP->Initiate(this, System)) { return false; } + if (!m_RSP->Initiate(this, System)) { return false; } WriteTrace(TraceRSPPlugin, TraceDebug, "RSP Initiate Done"); } WriteTrace(TracePlugins, TraceDebug, "Done"); diff --git a/Source/Project64-core/Plugins/PluginClass.h b/Source/Project64-core/Plugins/PluginClass.h index c7d158b45..bac35b984 100644 --- a/Source/Project64-core/Plugins/PluginClass.h +++ b/Source/Project64-core/Plugins/PluginClass.h @@ -90,6 +90,7 @@ __interface RenderWindow virtual bool ResetPluginsInUiThread(CPlugins * plugins, CN64System * System) = 0; virtual void * GetWindowHandle(void) const = 0; virtual void * GetStatusBar(void) const = 0; + virtual void * GetModuleInstance(void) const = 0; }; class CPlugins : diff --git a/Source/Project64-core/Plugins/RSPPlugin.cpp b/Source/Project64-core/Plugins/RSPPlugin.cpp index 67009521b..08eaafc1e 100644 --- a/Source/Project64-core/Plugins/RSPPlugin.cpp +++ b/Source/Project64-core/Plugins/RSPPlugin.cpp @@ -15,16 +15,15 @@ #include "RSPPlugin.h" #include "GFXPlugin.h" #include "AudioPlugin.h" -#include void DummyFunc1(int a) { a += 1; } CRSP_Plugin::CRSP_Plugin(void) : -DoRspCycles(NULL), -EnableDebugging(NULL), -m_CycleCount(0), -GetDebugInfo(NULL), -InitiateDebugger(NULL) + DoRspCycles(NULL), + EnableDebugging(NULL), + m_CycleCount(0), + GetDebugInfo(NULL), + InitiateDebugger(NULL) { memset(&m_RSPDebug, 0, sizeof(m_RSPDebug)); } @@ -38,7 +37,7 @@ CRSP_Plugin::~CRSP_Plugin() bool CRSP_Plugin::LoadFunctions(void) { // Find entries for functions in DLL - void(__cdecl *InitiateRSP)(void); + void(CALL *InitiateRSP)(void); LoadFunction(InitiateRSP); LoadFunction(DoRspCycles); _LoadFunction("GetRspDebugInfo", GetDebugInfo); @@ -59,8 +58,9 @@ bool CRSP_Plugin::LoadFunctions(void) // Get debug info if able if (GetDebugInfo != NULL) + { GetDebugInfo(&m_RSPDebug); - + } return true; } @@ -73,7 +73,7 @@ bool CRSP_Plugin::Initiate(CPlugins * Plugins, CN64System * System) typedef struct { - HINSTANCE hInst; + void * hInst; int MemoryBswaped; /* If this is set to TRUE, then the memory has been pre bswap on a dword (32 bits) boundry */ uint8_t * RDRAM; @@ -101,21 +101,21 @@ bool CRSP_Plugin::Initiate(CPlugins * Plugins, CN64System * System) uint32_t * DPC__PIPEBUSY_REG; uint32_t * DPC__TMEM_REG; - void(__cdecl *CheckInterrupts)(void); - void(__cdecl *ProcessDlist)(void); - void(__cdecl *ProcessAlist)(void); - void(__cdecl *ProcessRdpList)(void); - void(__cdecl *ShowCFB)(void); + void(CALL *CheckInterrupts)(void); + void(CALL *ProcessDlist)(void); + void(CALL *ProcessAlist)(void); + void(CALL *ProcessRdpList)(void); + void(CALL *ShowCFB)(void); } RSP_INFO_1_1; RSP_INFO_1_1 Info = { 0 }; - Info.hInst = GetModuleHandle(NULL); + Info.hInst = Plugins->MainWindow()->GetModuleInstance(); Info.CheckInterrupts = DummyCheckInterrupts; Info.MemoryBswaped = (System == NULL); // only true when the system's not yet loaded //Get Function from DLL - void(__cdecl *InitiateRSP) (RSP_INFO_1_1 Audio_Info, uint32_t * Cycles); + void(CALL *InitiateRSP) (RSP_INFO_1_1 Audio_Info, uint32_t * Cycles); LoadFunction(InitiateRSP); if (InitiateRSP == NULL) { return false; } @@ -193,10 +193,10 @@ bool CRSP_Plugin::Initiate(CPlugins * Plugins, CN64System * System) InitiateRSP(Info, &m_CycleCount); m_Initialized = true; - //jabo had a bug so I call CreateThread so his dllmain gets called again - DWORD ThreadID; - HANDLE hthread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DummyFunction, NULL, 0, &ThreadID); - CloseHandle(hthread); +#ifdef _WIN32 + //jabo had a bug so I call CreateThread so his dllmain gets called again + pjutil::DynLibCallDllMain(); +#endif return m_Initialized; } diff --git a/Source/Project64-core/Plugins/stdafx.h b/Source/Project64-core/Plugins/stdafx.h new file mode 100644 index 000000000..8b696d0b1 --- /dev/null +++ b/Source/Project64-core/Plugins/stdafx.h @@ -0,0 +1 @@ +#include "../stdafx.h" diff --git a/Source/Project64/UserInterface/GuiClass.cpp b/Source/Project64/UserInterface/GuiClass.cpp index ad4fa883e..d81e3d28a 100644 --- a/Source/Project64/UserInterface/GuiClass.cpp +++ b/Source/Project64/UserInterface/GuiClass.cpp @@ -24,14 +24,14 @@ LRESULT CALLBACK MainGui_Proc(HWND WndHandle, DWORD uMsg, DWORD wParam, DWORD lP extern BOOL set_about_field(HWND hDlg, int nIDDlgItem, const wchar_t * config_string, const wchar_t * language_string); CMainGui::CMainGui(bool bMainWindow, const char * WindowTitle) : -CRomBrowser(m_hMainWindow, m_hStatusWnd), -m_ThreadId(GetCurrentThreadId()), -m_bMainWindow(bMainWindow), -m_Created(false), -m_AttachingMenu(false), -m_MakingVisible(false), -m_ResetPlugins(false), -m_ResetInfo(NULL) + CRomBrowser(m_hMainWindow, m_hStatusWnd), + m_ThreadId(GetCurrentThreadId()), + m_bMainWindow(bMainWindow), + m_Created(false), + m_AttachingMenu(false), + m_MakingVisible(false), + m_ResetPlugins(false), + m_ResetInfo(NULL) { m_Menu = NULL; @@ -273,6 +273,11 @@ void CMainGui::ChangeWinSize(long width, long height) MoveWindow(m_hMainWindow, wndpl.rcNormalPosition.left, wndpl.rcNormalPosition.top, rc1.right - rc1.left, rc1.bottom - rc1.top, TRUE); } +void * CMainGui::GetModuleInstance(void) const +{ + return GetModuleHandle(NULL); +} + void CMainGui::AboutBox(void) { DialogBoxParamW(GetModuleHandle(NULL), MAKEINTRESOURCEW(IDD_About), m_hMainWindow, (DLGPROC)AboutBoxProc, (LPARAM)this); diff --git a/Source/Project64/UserInterface/GuiClass.h b/Source/Project64/UserInterface/GuiClass.h index 2172c5522..04869ea96 100644 --- a/Source/Project64/UserInterface/GuiClass.h +++ b/Source/Project64/UserInterface/GuiClass.h @@ -89,6 +89,7 @@ public: //Get Window Handle void * GetWindowHandle(void) const { return m_hMainWindow; } void * GetStatusBar(void) const { return m_hStatusWnd; } + void * GetModuleInstance(void) const; private: CMainGui(void); // Disable default constructor From d37ea006f1c6f2a09ddcbd89f5f676a5bdffe553 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 19:47:05 +1100 Subject: [PATCH 18/54] [Common] Add TraceModulesCommon.h to Common.vcproj --- Source/Common/Common.vcproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/Common/Common.vcproj b/Source/Common/Common.vcproj index e7047f664..a4fd7bef7 100644 --- a/Source/Common/Common.vcproj +++ b/Source/Common/Common.vcproj @@ -266,6 +266,10 @@ RelativePath=".\TraceDefs.h" > + + From 957a29fac115ff82775183bcb95a444b5f242fd4 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 19:47:47 +1100 Subject: [PATCH 19/54] [Project64] Remove MemoryLabelsClass.cpp --- .../N64System/Mips/MemoryLabelsClass.cpp | 213 ------------------ .../N64System/Mips/MemoryLabelsClass.h | 33 --- 2 files changed, 246 deletions(-) delete mode 100644 Source/Project64-core/N64System/Mips/MemoryLabelsClass.cpp delete mode 100644 Source/Project64-core/N64System/Mips/MemoryLabelsClass.h diff --git a/Source/Project64-core/N64System/Mips/MemoryLabelsClass.cpp b/Source/Project64-core/N64System/Mips/MemoryLabelsClass.cpp deleted file mode 100644 index 3158798fd..000000000 --- a/Source/Project64-core/N64System/Mips/MemoryLabelsClass.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/**************************************************************************** -* * -* Project64 - A Nintendo 64 emulator. * -* http://www.pj64-emu.com/ * -* Copyright (C) 2012 Project64. All rights reserved. * -* * -* License: * -* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html * -* * -****************************************************************************/ -#include "stdafx.h" - -DWORD CMemoryLabel::AsciiToHex (char * HexValue) -{ - DWORD Count, Finish, Current, Value = 0; - - Finish = strlen(HexValue); - if (Finish > 8 ) - { - Finish = 8; - } - - for (Count = 0; Count < Finish; Count++) - { - Value = (Value << 4); - Current = HexValue[Count]; - if(Current >= '0' && Current <= '9') - { - Value += Current - '0'; - } - else - { - if(Current > 'F') - Current -= 32; //32 is the distance between A and a - - if (Current >= 'A' && Current <= 'F') - { - Value += Current - 55; //55 is the code for 'A' less 10 - } - else - { - Value = (Value >> 4); - Count = Finish; - } - } - } - return Value; -} - -void CMemoryLabel::AddMemoryLabel ( DWORD Address, const char * Message, ... ) -{ - StringMap::iterator Item = m_LabelList.find(Address); - if (Item == m_LabelList.end()) - { - char Msg[1000]; - va_list ap; - - va_start( ap, Message ); - _vsnprintf( Msg,sizeof(Msg),Message, ap ); - va_end( ap ); - - //if item is already in the list then do not add it - m_LabelList.insert(StringMap::value_type(Address,stdstr(Msg))); - m_NewLabels += 1; - } -} - -stdstr CMemoryLabel::LabelName ( DWORD Address ) const -{ - //StringMap::iterator theIterator = m_LabelList.find(Address); - //if (theIterator != m_LabelList.end()) - //{ - // return (*theIterator).second; - //} - - char strLabelName[100]; - sprintf(strLabelName,"0x%08X",Address); - return stdstr(strLabelName); -} - -stdstr CMemoryLabel::StoredLabelName ( DWORD Address ) -{ - StringMap::iterator theIterator = m_LabelList.find(Address); - if (theIterator != m_LabelList.end()) - { - return (*theIterator).second; - } - return stdstr(""); -} - -void CMemoryLabel::LoadLabelList ( char * file ) -{ - m_LabelList.clear(); - CurrentLabelFile = file; - - HANDLE hFile = CreateFile(file,GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, - OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); - if (hFile == INVALID_HANDLE_VALUE) - { - return; - } - - SetFilePointer(hFile,0,NULL,FILE_BEGIN); - - DWORD FileSize = GetFileSize(hFile,NULL); - void * FileContents = VirtualAlloc(NULL,FileSize,MEM_COMMIT,PAGE_READWRITE ); - - if (FileContents) - { - DWORD dwRead; - if (!ReadFile(hFile,FileContents,FileSize,&dwRead,NULL)) - { - VirtualFree(FileContents, 0, MEM_RELEASE); - FileContents = NULL; - } - } - - if (FileContents) - { - ProcessCODFile((BYTE *)FileContents, FileSize); - } - - VirtualFree(FileContents, 0, MEM_RELEASE); - CloseHandle(hFile); - - m_NewLabels = 0; -} - -// How many new labels been added since loading/saving label file -int CMemoryLabel::NewLabels() -{ - return m_NewLabels; -} - -void CMemoryLabel::SaveLabelList() -{ - m_NewLabels = 0; - - if (CurrentLabelFile.length() == 0) - { - return; - } - - HANDLE hFile = CreateFile(CurrentLabelFile.c_str(),GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, - CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); - SetFilePointer(hFile,0,NULL,FILE_BEGIN); - - for (StringMap::iterator Item = m_LabelList.begin(); Item != m_LabelList.end(); Item++) - { - char Text[300]; - DWORD dwWritten; - - sprintf(Text, "0x%08X,%s\r\n",(*Item).first,((*Item).second).c_str()); - - WriteFile( hFile,Text,strlen(Text),&dwWritten,NULL ); - } - - CloseHandle(hFile); - -} - -void CMemoryLabel::ProcessCODFile(BYTE * File, DWORD FileLen) -{ - char * CurrentPos = (char *)File; - char Label[40]; - DWORD Address; - int Length; - - while ( CurrentPos < (char *)File + FileLen ) - { - if (*CurrentPos != '0') - { - return; - } - CurrentPos += 1; - if (*CurrentPos != 'x') - { - return; - } - CurrentPos += 1; - - if (strchr(CurrentPos,',') - CurrentPos != 8) - { - return; - } - Address = AsciiToHex (CurrentPos); - CurrentPos += 9; - - - if (strchr(CurrentPos,'\r') == NULL) - { - Length = strchr(CurrentPos,'\n') - CurrentPos; - } - else - { - Length = strchr(CurrentPos,'\r') - CurrentPos; - if (Length > (strchr(CurrentPos,'\n') - CurrentPos)) - { - Length = strchr(CurrentPos,'\n') - CurrentPos; - } - } - - // Stay within label array bounds - if (Length > 39) - Length = 39; - - memcpy(Label,CurrentPos,Length); - Label[Length] = '\0'; - - AddMemoryLabel (Address, Label); - CurrentPos = strchr(CurrentPos,'\n') + 1; - } -} diff --git a/Source/Project64-core/N64System/Mips/MemoryLabelsClass.h b/Source/Project64-core/N64System/Mips/MemoryLabelsClass.h deleted file mode 100644 index 559c04721..000000000 --- a/Source/Project64-core/N64System/Mips/MemoryLabelsClass.h +++ /dev/null @@ -1,33 +0,0 @@ -/**************************************************************************** -* * -* Project64 - A Nintendo 64 emulator. * -* http://www.pj64-emu.com/ * -* Copyright (C) 2012 Project64. All rights reserved. * -* * -* License: * -* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html * -* * -****************************************************************************/ -#pragma once - -typedef std::map StringMap; - -class CMemoryLabel -{ - // Variable dealing with Labels - StringMap m_LabelList; - int m_NewLabels; - stdstr CurrentLabelFile; - - DWORD AsciiToHex ( char * HexValue ); - void ProcessCODFile ( BYTE * File, DWORD FileLen ); - -public: - //Functions related to Labels - void AddMemoryLabel ( DWORD Address, const char * Message, ... ); - stdstr LabelName ( DWORD Address ) const; - stdstr StoredLabelName ( DWORD Address ); - void LoadLabelList ( char * file ); - int NewLabels (); // How many new labels been added since loading/saving label file - void SaveLabelList (); -}; From a44626855f74cb72a80df2034791e0f1ba72e887 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 19:48:52 +1100 Subject: [PATCH 20/54] [Common] fixed spacing in StdString.cpp --- Source/Common/StdString.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Source/Common/StdString.cpp b/Source/Common/StdString.cpp index bcc3dc824..7f1c19c19 100644 --- a/Source/Common/StdString.cpp +++ b/Source/Common/StdString.cpp @@ -4,22 +4,23 @@ #ifdef _WIN32 #include #endif + stdstr::stdstr() { } stdstr::stdstr(const std::string & str) : -std::string(str) + std::string(str) { } stdstr::stdstr(const stdstr & str) : -std::string((const std::string &)str) + std::string((const std::string &)str) { } stdstr::stdstr(const char * str) : -std::string(str ? str : "") + std::string(str ? str : "") { } From e5fe71278afcad6f1641f64f6bee8661b619eecb Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 19:51:12 +1100 Subject: [PATCH 21/54] [Project64] Remove usage of windows.h from FramePerSecondClass on non windows --- .../N64System/FramePerSecondClass.cpp | 20 ++++++++++++++++--- .../N64System/FramePerSecondClass.h | 7 +++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Source/Project64-core/N64System/FramePerSecondClass.cpp b/Source/Project64-core/N64System/FramePerSecondClass.cpp index 3f2bd54e6..87c4e79db 100644 --- a/Source/Project64-core/N64System/FramePerSecondClass.cpp +++ b/Source/Project64-core/N64System/FramePerSecondClass.cpp @@ -11,7 +11,9 @@ #include "stdafx.h" #include "FramePerSecondClass.h" #include +#ifdef _WIN32 #include +#endif CFramePerSecond::CFramePerSecond() { @@ -25,9 +27,11 @@ CFramePerSecond::CFramePerSecond() m_ScreenHertz = 60; } +#ifdef _WIN32 LARGE_INTEGER Freq; QueryPerformanceFrequency(&Freq); m_Frequency = Freq.QuadPart; +#endif Reset(true); } @@ -48,7 +52,9 @@ void CFramePerSecond::Reset(bool ClearDisplay) } if (ClearDisplay) { +#ifdef _WIN32 g_Notify->DisplayMessage2(""); +#endif return; } @@ -60,6 +66,7 @@ void CFramePerSecond::Reset(bool ClearDisplay) void CFramePerSecond::UpdateViCounter(void) { +#ifdef _WIN32 if (m_iFrameRateType != FR_VIs && m_iFrameRateType != FR_PERCENT) { return; @@ -73,10 +80,12 @@ void CFramePerSecond::UpdateViCounter(void) DisplayViCounter(0); } m_CurrentFrame += 1; +#endif } void CFramePerSecond::DisplayViCounter(uint32_t FrameRate) { +#ifdef _WIN32 if (m_iFrameRateType == FR_VIs) { if (FrameRate != 0) @@ -87,7 +96,7 @@ void CFramePerSecond::DisplayViCounter(uint32_t FrameRate) { if (m_CurrentFrame > (NoOfFrames << 3)) { - __int64 Total; + int64_t Total; Total = 0; for (int count = 0; count < NoOfFrames; count++) @@ -113,7 +122,7 @@ void CFramePerSecond::DisplayViCounter(uint32_t FrameRate) { if (m_CurrentFrame > (NoOfFrames << 3)) { - __int64 Total; + int64_t Total; Total = 0; for (int count = 0; count < NoOfFrames; count++) @@ -130,6 +139,7 @@ void CFramePerSecond::DisplayViCounter(uint32_t FrameRate) } g_Notify->DisplayMessage2(stdstr_f("%.1f %%", Percent * 100).c_str()); } +#endif } void CFramePerSecond::FrameRateTypeChanged(CFramePerSecond * _this) @@ -146,6 +156,7 @@ void CFramePerSecond::ScreenHertzChanged(CFramePerSecond * _this) void CFramePerSecond::UpdateDlCounter(void) { +#ifdef _WIN32 if (m_iFrameRateType != FR_DLs) { return; @@ -158,10 +169,12 @@ void CFramePerSecond::UpdateDlCounter(void) DisplayDlCounter(0); } m_CurrentFrame += 1; +#endif } void CFramePerSecond::DisplayDlCounter(uint32_t FrameRate) { +#ifdef _WIN32 if (m_iFrameRateType != FR_DLs) { return; @@ -174,7 +187,7 @@ void CFramePerSecond::DisplayDlCounter(uint32_t FrameRate) { if (m_CurrentFrame > (NoOfFrames << 2)) { - __int64 Total; + int64_t Total; Total = 0; for (int count = 0; count < NoOfFrames; count++) @@ -188,4 +201,5 @@ void CFramePerSecond::DisplayDlCounter(uint32_t FrameRate) g_Notify->DisplayMessage2("DL/s: -.--"); } } +#endif } \ No newline at end of file diff --git a/Source/Project64-core/N64System/FramePerSecondClass.h b/Source/Project64-core/N64System/FramePerSecondClass.h index a39a07ece..746be9f7c 100644 --- a/Source/Project64-core/N64System/FramePerSecondClass.h +++ b/Source/Project64-core/N64System/FramePerSecondClass.h @@ -24,13 +24,16 @@ public: void DisplayViCounter(uint32_t FrameRate); private: + CFramePerSecond(const CFramePerSecond&); // Disable copy constructor + CFramePerSecond& operator=(const CFramePerSecond&); // Disable assignment + static void FrameRateTypeChanged(CFramePerSecond * _this); static void ScreenHertzChanged(CFramePerSecond * _this); - int m_iFrameRateType, m_ScreenHertz; + int32_t m_iFrameRateType, m_ScreenHertz; enum { NoOfFrames = 7 }; int64_t m_Frequency, m_Frames[NoOfFrames], m_LastFrame; - int m_CurrentFrame; + int32_t m_CurrentFrame; }; From b17ce831f2c0a930253b28a390dc1172c3128d59 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 19:52:14 +1100 Subject: [PATCH 22/54] [Project64] Cleaned up some warning in MemoryVirtualMem.cpp --- .../N64System/Mips/MemoryVirtualMem.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp index bd54fe146..518f6d856 100644 --- a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp +++ b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp @@ -838,7 +838,7 @@ void CMipsMemoryVM::Compile_LW(x86Reg Reg, uint32_t VAddr) if (g_Plugins->Audio()->AiReadLength != NULL) { BeforeCallDirect(m_RegWorkingSet); - Call_Direct(g_Plugins->Audio()->AiReadLength, "AiReadLength"); + Call_Direct((void *)g_Plugins->Audio()->AiReadLength, "AiReadLength"); MoveX86regToVariable(x86_EAX, &m_TempValue, "m_TempValue"); AfterCallDirect(m_RegWorkingSet); MoveVariableToX86reg(&m_TempValue, "m_TempValue", Reg); @@ -1392,7 +1392,7 @@ void CMipsMemoryVM::Compile_SW_Const(uint32_t Value, uint32_t VAddr) Jump = m_RecompPos - 1; MoveConstToVariable(Value, &g_Reg->VI_STATUS_REG, "VI_STATUS_REG"); BeforeCallDirect(m_RegWorkingSet); - Call_Direct(g_Plugins->Gfx()->ViStatusChanged, "ViStatusChanged"); + Call_Direct((void *)g_Plugins->Gfx()->ViStatusChanged, "ViStatusChanged"); AfterCallDirect(m_RegWorkingSet); CPU_Message(""); CPU_Message(" Continue:"); @@ -1408,7 +1408,7 @@ void CMipsMemoryVM::Compile_SW_Const(uint32_t Value, uint32_t VAddr) Jump = m_RecompPos - 1; MoveConstToVariable(Value, &g_Reg->VI_WIDTH_REG, "VI_WIDTH_REG"); BeforeCallDirect(m_RegWorkingSet); - Call_Direct(g_Plugins->Gfx()->ViWidthChanged, "ViWidthChanged"); + Call_Direct((void *)g_Plugins->Gfx()->ViWidthChanged, "ViWidthChanged"); AfterCallDirect(m_RegWorkingSet); CPU_Message(""); CPU_Message(" Continue:"); @@ -1454,7 +1454,7 @@ void CMipsMemoryVM::Compile_SW_Const(uint32_t Value, uint32_t VAddr) } else { - Call_Direct(g_Plugins->Audio()->AiLenChanged, "AiLenChanged"); + Call_Direct((void *)g_Plugins->Audio()->AiLenChanged, "AiLenChanged"); } AfterCallDirect(m_RegWorkingSet); break; @@ -1747,7 +1747,7 @@ void CMipsMemoryVM::Compile_SW_Register(x86Reg Reg, uint32_t VAddr) Jump = m_RecompPos - 1; MoveX86regToVariable(Reg, &g_Reg->VI_STATUS_REG, "VI_STATUS_REG"); BeforeCallDirect(m_RegWorkingSet); - Call_Direct(g_Plugins->Gfx()->ViStatusChanged, "ViStatusChanged"); + Call_Direct((void *)g_Plugins->Gfx()->ViStatusChanged, "ViStatusChanged"); AfterCallDirect(m_RegWorkingSet); CPU_Message(""); CPU_Message(" Continue:"); @@ -1766,7 +1766,7 @@ void CMipsMemoryVM::Compile_SW_Register(x86Reg Reg, uint32_t VAddr) Jump = m_RecompPos - 1; MoveX86regToVariable(Reg, &g_Reg->VI_WIDTH_REG, "VI_WIDTH_REG"); BeforeCallDirect(m_RegWorkingSet); - Call_Direct(g_Plugins->Gfx()->ViWidthChanged, "ViWidthChanged"); + Call_Direct((void *)g_Plugins->Gfx()->ViWidthChanged, "ViWidthChanged"); AfterCallDirect(m_RegWorkingSet); CPU_Message(""); CPU_Message(" Continue:"); @@ -1814,7 +1814,7 @@ void CMipsMemoryVM::Compile_SW_Register(x86Reg Reg, uint32_t VAddr) } else { - Call_Direct(g_Plugins->Audio()->AiLenChanged, "g_Plugins->Audio()->LenChanged"); + Call_Direct((void *)g_Plugins->Audio()->AiLenChanged, "g_Plugins->Audio()->LenChanged"); } AfterCallDirect(m_RegWorkingSet); break; @@ -4259,8 +4259,8 @@ void CMipsMemoryVM::TLB_Unmaped(uint32_t Vaddr, uint32_t Len) for (count = Vaddr; count < End; count += 0x1000) { size_t Index = count >> 12; - m_TLB_ReadMap[Index] = NULL; - m_TLB_WriteMap[Index] = NULL; + m_TLB_ReadMap[Index] = 0; + m_TLB_WriteMap[Index] = 0; } } From 790de2eace94becb1c4dfc2c200af2bd17e25d1f Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 19:54:39 +1100 Subject: [PATCH 23/54] [Project64] get PifRam.cpp to use standard types --- .../Project64-core/N64System/Mips/PifRam.cpp | 77 ++++++++++--------- Source/Project64-core/N64System/Mips/PifRam.h | 16 ++-- 2 files changed, 49 insertions(+), 44 deletions(-) diff --git a/Source/Project64-core/N64System/Mips/PifRam.cpp b/Source/Project64-core/N64System/Mips/PifRam.cpp index 33e2d175f..bb0f493c2 100644 --- a/Source/Project64-core/N64System/Mips/PifRam.cpp +++ b/Source/Project64-core/N64System/Mips/PifRam.cpp @@ -21,8 +21,8 @@ #include #include -int CPifRamSettings::m_RefCount = 0; -bool CPifRamSettings::m_bShowPifRamErrors = false; +int32_t CPifRamSettings::m_RefCount = 0; +bool CPifRamSettings::m_bShowPifRamErrors = false; CPifRamSettings::CPifRamSettings() { @@ -64,7 +64,7 @@ void CPifRam::Reset() memset(m_PifRom, 0, sizeof(m_PifRom)); } -void CPifRam::n64_cic_nus_6105(char challenge[], char respone[], int length) +void CPifRam::n64_cic_nus_6105(char challenge[], char respone[], int32_t length) { static char lut0[0x10] = { 0x4, 0x7, 0xA, 0x7, 0xE, 0x5, 0xE, 0x1, @@ -75,7 +75,7 @@ void CPifRam::n64_cic_nus_6105(char challenge[], char respone[], int length) 0xC, 0x9, 0x8, 0x5, 0x6, 0x3, 0xC, 0x9 }; char key, *lut; - int i, sgn, mag, mod; + int32_t i, sgn, mag, mod; for (key = 0xB, lut = lut0, i = 0; i < length; i++) { @@ -105,8 +105,8 @@ void CPifRam::PifRamRead() CONTROL * Controllers = g_Plugins->Control()->PluginControllers(); - int Channel = 0; - for (int CurPos = 0; CurPos < 0x40; CurPos++) + int32_t Channel = 0; + for (int32_t CurPos = 0; CurPos < 0x40; CurPos++) { switch (m_PifRam[CurPos]) { @@ -160,7 +160,7 @@ void CPifRam::PifRamRead() void CPifRam::PifRamWrite() { CONTROL * Controllers = g_Plugins->Control()->PluginControllers(); - int Channel = 0, CurPos; + int32_t Channel = 0, CurPos; if (m_PifRam[0x3F] > 0x1) { @@ -168,29 +168,29 @@ void CPifRam::PifRamWrite() { case 0x02: // format the 'challenge' message into 30 nibbles for X-Scale's CIC code - { - char Challenge[30], Response[30]; - for (int i = 0; i < 15; i++) { - Challenge[i * 2] = (m_PifRam[48 + i] >> 4) & 0x0f; - Challenge[i * 2 + 1] = m_PifRam[48 + i] & 0x0f; + char Challenge[30], Response[30]; + for (int32_t i = 0; i < 15; i++) + { + Challenge[i * 2] = (m_PifRam[48 + i] >> 4) & 0x0f; + Challenge[i * 2 + 1] = m_PifRam[48 + i] & 0x0f; + } + n64_cic_nus_6105(Challenge, Response, CHALLENGE_LENGTH - 2); + uint64_t ResponseValue = 0; + m_PifRam[46] = m_PifRam[47] = 0x00; + for (int32_t z = 8; z > 0; z--) + { + ResponseValue = (ResponseValue << 8) | ((Response[(z - 1) * 2] << 4) + Response[(z - 1) * 2 + 1]); + } + memcpy(&m_PifRam[48], &ResponseValue, sizeof(uint64_t)); + ResponseValue = 0; + for (int32_t z = 7; z > 0; z--) + { + ResponseValue = (ResponseValue << 8) | ((Response[((z + 8) - 1) * 2] << 4) + Response[((z + 8) - 1) * 2 + 1]); + } + memcpy(&m_PifRam[56], &ResponseValue, sizeof(uint64_t)); } - n64_cic_nus_6105(Challenge, Response, CHALLENGE_LENGTH - 2); - uint64_t ResponseValue = 0; - m_PifRam[46] = m_PifRam[47] = 0x00; - for (int z = 8; z > 0; z--) - { - ResponseValue = (ResponseValue << 8) | ((Response[(z - 1) * 2] << 4) + Response[(z - 1) * 2 + 1]); - } - memcpy(&m_PifRam[48], &ResponseValue, sizeof(uint64_t)); - ResponseValue = 0; - for (int z = 7; z > 0; z--) - { - ResponseValue = (ResponseValue << 8) | ((Response[((z + 8) - 1) * 2] << 4) + Response[((z + 8) - 1) * 2 + 1]); - } - memcpy(&m_PifRam[56], &ResponseValue, sizeof(uint64_t)); - } - break; + break; case 0x08: m_PifRam[0x3F] = 0; g_Reg->MI_INTR_REG |= MI_INTR_SI; @@ -327,8 +327,8 @@ void CPifRam::SI_DMA_READ() { if ((count % 4) == 0) { - sprintf(HexData, "\0"); - sprintf(AsciiData, "\0"); + HexData[0] = '\0'; + AsciiData[0] = '\0'; } sprintf(Addon, "%02X %02X %02X %02X", m_PifRam[(count << 2) + 0], m_PifRam[(count << 2) + 1], @@ -414,8 +414,8 @@ void CPifRam::SI_DMA_WRITE() { if ((count % 4) == 0) { - sprintf(HexData, "\0"); - sprintf(AsciiData, "\0"); + HexData[0] = '\0'; + AsciiData[0] = '\0'; } sprintf(Addon, "%02X %02X %02X %02X", m_PifRam[(count << 2) + 0], m_PifRam[(count << 2) + 1], @@ -454,7 +454,7 @@ void CPifRam::SI_DMA_WRITE() } } -void CPifRam::ProcessControllerCommand(int Control, uint8_t * Command) +void CPifRam::ProcessControllerCommand(int32_t Control, uint8_t * Command) { CONTROL * Controllers = g_Plugins->Control()->PluginControllers(); @@ -603,7 +603,8 @@ void CPifRam::ProcessControllerCommand(int Control, uint8_t * Command) } } -void CPifRam::ReadControllerCommand(int Control, uint8_t * Command) { +void CPifRam::ReadControllerCommand(int32_t Control, uint8_t * Command) +{ CONTROL * Controllers = g_Plugins->Control()->PluginControllers(); switch (Command[2]) @@ -642,11 +643,11 @@ void CPifRam::ReadControllerCommand(int Control, uint8_t * Command) { } } -void CPifRam::LogControllerPakData(char * Description) +void CPifRam::LogControllerPakData(const char * Description) { uint8_t * PIF_Ram = g_MMU->PifRam(); - int count, count2; + int32_t count, count2; char HexData[100], AsciiData[100], Addon[20]; LogMessage("\t%s:", Description); LogMessage("\t------------------------------"); @@ -654,8 +655,8 @@ void CPifRam::LogControllerPakData(char * Description) { if ((count % 4) == 0) { - sprintf(HexData, "\0"); - sprintf(AsciiData, "\0"); + HexData[0] = '\0'; + AsciiData[0] = '\0'; } sprintf(Addon, "%02X %02X %02X %02X", PIF_Ram[(count << 2) + 0], PIF_Ram[(count << 2) + 1], diff --git a/Source/Project64-core/N64System/Mips/PifRam.h b/Source/Project64-core/N64System/Mips/PifRam.h index c9911d4a3..c440417f4 100644 --- a/Source/Project64-core/N64System/Mips/PifRam.h +++ b/Source/Project64-core/N64System/Mips/PifRam.h @@ -29,7 +29,7 @@ private: static bool m_bShowPifRamErrors; - static int m_RefCount; + static int32_t m_RefCount; }; class CPifRam : @@ -54,9 +54,13 @@ protected: uint8_t m_PifRam[0x40]; private: -#define CHALLENGE_LENGTH 0x20 - void ProcessControllerCommand(int Control, uint8_t * Command); - void ReadControllerCommand(int Control, uint8_t * Command); - void LogControllerPakData(char * Description); - void n64_cic_nus_6105(char challenge[], char response[], int length); + CPifRam(); // Disable default constructor + CPifRam(const CPifRam&); // Disable copy constructor + CPifRam& operator=(const CPifRam&); // Disable assignment + + enum { CHALLENGE_LENGTH = 0x20 }; + void ProcessControllerCommand(int32_t Control, uint8_t * Command); + void ReadControllerCommand(int32_t Control, uint8_t * Command); + void LogControllerPakData(const char * Description); + void n64_cic_nus_6105(char challenge[], char response[], int32_t length); }; From ae734ed71c1e40034480de0b75a95d85373b09f7 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 19:55:34 +1100 Subject: [PATCH 24/54] [Project64] Get Rumblepak.cpp to use standard types --- Source/Project64-core/N64System/Mips/Rumblepak.cpp | 2 +- Source/Project64-core/N64System/Mips/Rumblepak.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Project64-core/N64System/Mips/Rumblepak.cpp b/Source/Project64-core/N64System/Mips/Rumblepak.cpp index f63d69ef1..fd1607613 100644 --- a/Source/Project64-core/N64System/Mips/Rumblepak.cpp +++ b/Source/Project64-core/N64System/Mips/Rumblepak.cpp @@ -29,7 +29,7 @@ void Rumblepak::ReadFrom(uint8_t * command) } } -void Rumblepak::WriteTo(int Control, uint8_t * command) +void Rumblepak::WriteTo(int32_t Control, uint8_t * command) { uint32_t address = (command[3] << 8) | (command[4] & 0xE0); diff --git a/Source/Project64-core/N64System/Mips/Rumblepak.h b/Source/Project64-core/N64System/Mips/Rumblepak.h index 7101c8043..3e76eacce 100644 --- a/Source/Project64-core/N64System/Mips/Rumblepak.h +++ b/Source/Project64-core/N64System/Mips/Rumblepak.h @@ -14,5 +14,5 @@ class Rumblepak { public: static void ReadFrom(uint8_t * command); - static void WriteTo(int Control, uint8_t * command); + static void WriteTo(int32_t Control, uint8_t * command); }; From 0175adc49f5a634b33118c65c214a9fe573093c9 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 21:02:01 +1100 Subject: [PATCH 25/54] [Project64] Get Sram to use standard types --- Source/Project64-core/N64System/Mips/Sram.cpp | 4 ++-- Source/Project64-core/N64System/Mips/Sram.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Project64-core/N64System/Mips/Sram.cpp b/Source/Project64-core/N64System/Mips/Sram.cpp index 601a34edf..930578951 100644 --- a/Source/Project64-core/N64System/Mips/Sram.cpp +++ b/Source/Project64-core/N64System/Mips/Sram.cpp @@ -52,7 +52,7 @@ bool CSram::LoadSram() return true; } -void CSram::DmaFromSram(uint8_t * dest, int StartOffset, int len) +void CSram::DmaFromSram(uint8_t * dest, int32_t StartOffset, int32_t len) { DWORD dwRead; uint32_t i; @@ -133,7 +133,7 @@ void CSram::DmaFromSram(uint8_t * dest, int StartOffset, int len) } } -void CSram::DmaToSram(uint8_t * Source, int StartOffset, int len) +void CSram::DmaToSram(uint8_t * Source, int32_t StartOffset, int32_t len) { DWORD dwWritten; uint32_t i; diff --git a/Source/Project64-core/N64System/Mips/Sram.h b/Source/Project64-core/N64System/Mips/Sram.h index ff1d1f0b9..555e8d240 100644 --- a/Source/Project64-core/N64System/Mips/Sram.h +++ b/Source/Project64-core/N64System/Mips/Sram.h @@ -16,8 +16,8 @@ public: CSram(bool ReadOnly); ~CSram(); - void DmaFromSram(uint8_t * dest, int StartOffset, int len); - void DmaToSram(uint8_t * Source, int StartOffset, int len); + void DmaFromSram(uint8_t * dest, int32_t StartOffset, int32_t len); + void DmaToSram(uint8_t * Source, int32_t StartOffset, int32_t len); private: bool LoadSram(); From 9b2a3981812f80310e53e6de7d347790f2838eb4 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 22:00:16 +1100 Subject: [PATCH 26/54] [Project64] get SystemTiming.cpp to use standard types --- Source/Project64-core/N64System/Mips/SystemTiming.cpp | 2 +- Source/Project64-core/N64System/Mips/SystemTiming.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Project64-core/N64System/Mips/SystemTiming.cpp b/Source/Project64-core/N64System/Mips/SystemTiming.cpp index 83f2f7b8e..0bc492da3 100644 --- a/Source/Project64-core/N64System/Mips/SystemTiming.cpp +++ b/Source/Project64-core/N64System/Mips/SystemTiming.cpp @@ -15,7 +15,7 @@ #include #include -CSystemTimer::CSystemTimer(int & NextTimer) : +CSystemTimer::CSystemTimer( int32_t & NextTimer ) : m_NextTimer(NextTimer), m_inFixTimer(false) { diff --git a/Source/Project64-core/N64System/Mips/SystemTiming.h b/Source/Project64-core/N64System/Mips/SystemTiming.h index 45381f9ba..a9b98efb9 100644 --- a/Source/Project64-core/N64System/Mips/SystemTiming.h +++ b/Source/Project64-core/N64System/Mips/SystemTiming.h @@ -39,7 +39,7 @@ public: }; public: - CSystemTimer(int & NextTimer); + CSystemTimer(int32_t & NextTimer); void SetTimer(TimerType Type, uint32_t Cycles, bool bRelative); uint32_t GetTimer(TimerType Type); void StopTimer(TimerType Type); @@ -65,8 +65,8 @@ private: CSystemTimer& operator=(const CSystemTimer&); // Disable assignment TIMER_DETAILS m_TimerDetatils[MaxTimer]; - int m_LastUpdate; //Timer at last update - int & m_NextTimer; + int32_t m_LastUpdate; //Timer at last update + int32_t & m_NextTimer; TimerType m_Current; bool m_inFixTimer; From 9bdea7da40b5c93cea9cd27729b9850b9c4a5a9e Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 22:02:50 +1100 Subject: [PATCH 27/54] [Project64] Remove Protect Memory duplicate code --- Source/Project64-core/N64System/N64RomClass.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Source/Project64-core/N64System/N64RomClass.cpp b/Source/Project64-core/N64System/N64RomClass.cpp index c7fe82272..33cbd81c6 100644 --- a/Source/Project64-core/N64System/N64RomClass.cpp +++ b/Source/Project64-core/N64System/N64RomClass.cpp @@ -127,8 +127,6 @@ bool CN64Rom::AllocateAndLoadN64Image(const char * FileLoc, bool LoadBootCodeOnl ByteSwapRom(); //Protect the memory so that it can not be written to. - DWORD OldProtect; - VirtualProtect(m_ROMImage, m_RomFileSize, PAGE_READONLY, &OldProtect); ProtectMemory(m_ROMImage, m_RomFileSize, MEM_READONLY); return true; } From b173fbb64204263b50665967e766c88c6a7b27ae Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 22:04:49 +1100 Subject: [PATCH 28/54] [Project64] Remove windows.h from CodeSection.cpp --- .../N64System/Recompiler/CodeSection.cpp | 341 +++++++++--------- 1 file changed, 171 insertions(+), 170 deletions(-) diff --git a/Source/Project64-core/N64System/Recompiler/CodeSection.cpp b/Source/Project64-core/N64System/Recompiler/CodeSection.cpp index 66d1e1dd2..9cfc153db 100644 --- a/Source/Project64-core/N64System/Recompiler/CodeSection.cpp +++ b/Source/Project64-core/N64System/Recompiler/CodeSection.cpp @@ -20,7 +20,6 @@ #include #include #include -#include void InPermLoop(); @@ -31,7 +30,9 @@ static bool DelaySlotEffectsJump(uint32_t JumpPC) OPCODE Command; if (!g_MMU->LW_VAddr(JumpPC, Command.Hex)) + { return true; + } switch (Command.op) { @@ -72,29 +73,29 @@ static bool DelaySlotEffectsJump(uint32_t JumpPC) case R4300i_COP1_BC_BCT: case R4300i_COP1_BC_BCFL: case R4300i_COP1_BC_BCTL: - { - bool EffectDelaySlot = false; - OPCODE NewCommand; - - if (!g_MMU->LW_VAddr(JumpPC + 4, NewCommand.Hex)) { - return true; - } + bool EffectDelaySlot = false; + OPCODE NewCommand; - if (NewCommand.op == R4300i_CP1) - { - if (NewCommand.fmt == R4300i_COP1_S && (NewCommand.funct & 0x30) == 0x30) + if (!g_MMU->LW_VAddr(JumpPC + 4, NewCommand.Hex)) { - EffectDelaySlot = true; + return true; } - if (NewCommand.fmt == R4300i_COP1_D && (NewCommand.funct & 0x30) == 0x30) + + if (NewCommand.op == R4300i_CP1) { - EffectDelaySlot = true; + if (NewCommand.fmt == R4300i_COP1_S && (NewCommand.funct & 0x30) == 0x30) + { + EffectDelaySlot = true; + } + if (NewCommand.fmt == R4300i_COP1_D && (NewCommand.funct & 0x30) == 0x30) + { + EffectDelaySlot = true; + } } + return EffectDelaySlot; } - return EffectDelaySlot; - } - break; + break; } break; } @@ -109,21 +110,21 @@ static bool DelaySlotEffectsJump(uint32_t JumpPC) } CCodeSection::CCodeSection(CCodeBlock * CodeBlock, uint32_t EnterPC, uint32_t ID, bool LinkAllowed) : -m_BlockInfo(CodeBlock), -m_SectionID(ID), -m_EnterPC(EnterPC), -m_EndPC((uint32_t)-1), -m_ContinueSection(NULL), -m_JumpSection(NULL), -m_EndSection(false), -m_LinkAllowed(LinkAllowed), -m_Test(0), -m_Test2(0), -m_CompiledLocation(NULL), -m_InLoop(false), -m_DelaySlot(false) + m_BlockInfo(CodeBlock), + m_SectionID(ID), + m_EnterPC(EnterPC), + m_EndPC((uint32_t)-1), + m_ContinueSection(NULL), + m_JumpSection(NULL), + m_EndSection(false), + m_LinkAllowed(LinkAllowed), + m_Test(0), + m_Test2(0), + m_CompiledLocation(NULL), + m_InLoop(false), + m_DelaySlot(false) { - CPU_Message(__FUNCTION__ ": ID %d EnterPC 0x%08X", ID, EnterPC); + CPU_Message("%s: ID %d EnterPC 0x%08X", __FUNCTION__, ID, EnterPC); } CCodeSection::~CCodeSection() @@ -298,34 +299,34 @@ void CCodeSection::CompileExit(uint32_t JumpPC, uint32_t TargetPC, CRegInfo &Exi ExitCodeBlock(); break; case CExitInfo::DoSysCall: - { - bool bDelay = m_NextInstruction == JUMP || m_NextInstruction == DELAY_SLOT; - PushImm32(bDelay ? "true" : "false", bDelay); - MoveConstToX86reg((uint32_t)g_Reg, x86_ECX); - Call_Direct(AddressOf(&CRegisters::DoSysCallException), "CRegisters::DoSysCallException"); - if (g_SyncSystem) { - MoveConstToX86reg((uint32_t)g_BaseSystem, x86_ECX); - Call_Direct(AddressOf(&CN64System::SyncSystem), "CN64System::SyncSystem"); + bool bDelay = m_NextInstruction == JUMP || m_NextInstruction == DELAY_SLOT; + PushImm32(bDelay ? "true" : "false", bDelay); + MoveConstToX86reg((uint32_t)g_Reg, x86_ECX); + Call_Direct(AddressOf(&CRegisters::DoSysCallException), "CRegisters::DoSysCallException"); + if (g_SyncSystem) + { + MoveConstToX86reg((uint32_t)g_BaseSystem, x86_ECX); + Call_Direct(AddressOf(&CN64System::SyncSystem), "CN64System::SyncSystem"); + } + ExitCodeBlock(); } - ExitCodeBlock(); - } - break; + break; case CExitInfo::COP1_Unuseable: - { - bool bDelay = m_NextInstruction == JUMP || m_NextInstruction == DELAY_SLOT; - PushImm32("1", 1); - PushImm32(bDelay ? "true" : "false", bDelay); - MoveConstToX86reg((uint32_t)g_Reg, x86_ECX); - Call_Direct(AddressOf(&CRegisters::DoCopUnusableException), "CRegisters::DoCopUnusableException"); - if (g_SyncSystem) { - MoveConstToX86reg((uint32_t)g_BaseSystem, x86_ECX); - Call_Direct(AddressOf(&CN64System::SyncSystem), "CN64System::SyncSystem"); + bool bDelay = m_NextInstruction == JUMP || m_NextInstruction == DELAY_SLOT; + PushImm32("1", 1); + PushImm32(bDelay ? "true" : "false", bDelay); + MoveConstToX86reg((uint32_t)g_Reg, x86_ECX); + Call_Direct(AddressOf(&CRegisters::DoCopUnusableException), "CRegisters::DoCopUnusableException"); + if (g_SyncSystem) + { + MoveConstToX86reg((uint32_t)g_BaseSystem, x86_ECX); + Call_Direct(AddressOf(&CN64System::SyncSystem), "CN64System::SyncSystem"); + } + ExitCodeBlock(); } - ExitCodeBlock(); - } - break; + break; case CExitInfo::ExitResetRecompCode: g_Notify->BreakPoint(__FILE__, __LINE__); #ifdef legacycode @@ -802,137 +803,137 @@ void CCodeSection::SyncRegState(const CRegInfo & SyncTo) { case CRegInfo::STATE_UNKNOWN: UnMap_GPR(i, true); break; case CRegInfo::STATE_MAPPED_64: - { - x86Reg Reg = SyncTo.GetMipsRegMapLo(i); - x86Reg x86RegHi = SyncTo.GetMipsRegMapHi(i); - UnMap_X86reg(Reg); - UnMap_X86reg(x86RegHi); - switch (GetMipsRegState(i)) { - case CRegInfo::STATE_UNKNOWN: - MoveVariableToX86reg(&_GPR[i].UW[0], CRegName::GPR_Lo[i], Reg); - MoveVariableToX86reg(&_GPR[i].UW[1], CRegName::GPR_Hi[i], x86RegHi); - break; - case CRegInfo::STATE_MAPPED_64: - MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); - m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); - MoveX86RegToX86Reg(GetMipsRegMapHi(i), x86RegHi); - m_RegWorkingSet.SetX86Mapped(GetMipsRegMapHi(i), CRegInfo::NotMapped); - break; - case CRegInfo::STATE_MAPPED_32_SIGN: - MoveX86RegToX86Reg(GetMipsRegMapLo(i), x86RegHi); - ShiftRightSignImmed(x86RegHi, 31); - MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); - m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); - break; - case CRegInfo::STATE_MAPPED_32_ZERO: - XorX86RegToX86Reg(x86RegHi, x86RegHi); - MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); - m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); - break; - case CRegInfo::STATE_CONST_64: - MoveConstToX86reg(GetMipsRegHi(i), x86RegHi); - MoveConstToX86reg(GetMipsRegLo(i), Reg); - break; - case CRegInfo::STATE_CONST_32_SIGN: - MoveConstToX86reg(GetMipsRegLo_S(i) >> 31, x86RegHi); - MoveConstToX86reg(GetMipsRegLo(i), Reg); - break; - default: - CPU_Message("Do something with states in SyncRegState\nSTATE_MAPPED_64\n%d", GetMipsRegState(i)); - g_Notify->BreakPoint(__FILE__, __LINE__); - continue; + x86Reg Reg = SyncTo.GetMipsRegMapLo(i); + x86Reg x86RegHi = SyncTo.GetMipsRegMapHi(i); + UnMap_X86reg(Reg); + UnMap_X86reg(x86RegHi); + switch (GetMipsRegState(i)) + { + case CRegInfo::STATE_UNKNOWN: + MoveVariableToX86reg(&_GPR[i].UW[0], CRegName::GPR_Lo[i], Reg); + MoveVariableToX86reg(&_GPR[i].UW[1], CRegName::GPR_Hi[i], x86RegHi); + break; + case CRegInfo::STATE_MAPPED_64: + MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); + m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); + MoveX86RegToX86Reg(GetMipsRegMapHi(i), x86RegHi); + m_RegWorkingSet.SetX86Mapped(GetMipsRegMapHi(i), CRegInfo::NotMapped); + break; + case CRegInfo::STATE_MAPPED_32_SIGN: + MoveX86RegToX86Reg(GetMipsRegMapLo(i), x86RegHi); + ShiftRightSignImmed(x86RegHi, 31); + MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); + m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); + break; + case CRegInfo::STATE_MAPPED_32_ZERO: + XorX86RegToX86Reg(x86RegHi, x86RegHi); + MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); + m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); + break; + case CRegInfo::STATE_CONST_64: + MoveConstToX86reg(GetMipsRegHi(i), x86RegHi); + MoveConstToX86reg(GetMipsRegLo(i), Reg); + break; + case CRegInfo::STATE_CONST_32_SIGN: + MoveConstToX86reg(GetMipsRegLo_S(i) >> 31, x86RegHi); + MoveConstToX86reg(GetMipsRegLo(i), Reg); + break; + default: + CPU_Message("Do something with states in SyncRegState\nSTATE_MAPPED_64\n%d", GetMipsRegState(i)); + g_Notify->BreakPoint(__FILE__, __LINE__); + continue; + } + m_RegWorkingSet.SetMipsRegMapLo(i, Reg); + m_RegWorkingSet.SetMipsRegMapHi(i, x86RegHi); + m_RegWorkingSet.SetMipsRegState(i, CRegInfo::STATE_MAPPED_64); + m_RegWorkingSet.SetX86Mapped(Reg, CRegInfo::GPR_Mapped); + m_RegWorkingSet.SetX86Mapped(x86RegHi, CRegInfo::GPR_Mapped); + m_RegWorkingSet.SetX86MapOrder(Reg, 1); + m_RegWorkingSet.SetX86MapOrder(x86RegHi, 1); } - m_RegWorkingSet.SetMipsRegMapLo(i, Reg); - m_RegWorkingSet.SetMipsRegMapHi(i, x86RegHi); - m_RegWorkingSet.SetMipsRegState(i, CRegInfo::STATE_MAPPED_64); - m_RegWorkingSet.SetX86Mapped(Reg, CRegInfo::GPR_Mapped); - m_RegWorkingSet.SetX86Mapped(x86RegHi, CRegInfo::GPR_Mapped); - m_RegWorkingSet.SetX86MapOrder(Reg, 1); - m_RegWorkingSet.SetX86MapOrder(x86RegHi, 1); - } - break; + break; case CRegInfo::STATE_MAPPED_32_SIGN: - { - x86Reg Reg = SyncTo.GetMipsRegMapLo(i); - UnMap_X86reg(Reg); - switch (GetMipsRegState(i)) { - case CRegInfo::STATE_UNKNOWN: MoveVariableToX86reg(&_GPR[i].UW[0], CRegName::GPR_Lo[i], Reg); break; - case CRegInfo::STATE_CONST_32_SIGN: MoveConstToX86reg(GetMipsRegLo(i), Reg); break; - case CRegInfo::STATE_MAPPED_32_SIGN: - MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); - m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); - break; - case CRegInfo::STATE_MAPPED_32_ZERO: - if (GetMipsRegMapLo(i) != Reg) + x86Reg Reg = SyncTo.GetMipsRegMapLo(i); + UnMap_X86reg(Reg); + switch (GetMipsRegState(i)) { + case CRegInfo::STATE_UNKNOWN: MoveVariableToX86reg(&_GPR[i].UW[0], CRegName::GPR_Lo[i], Reg); break; + case CRegInfo::STATE_CONST_32_SIGN: MoveConstToX86reg(GetMipsRegLo(i), Reg); break; + case CRegInfo::STATE_MAPPED_32_SIGN: MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); + break; + case CRegInfo::STATE_MAPPED_32_ZERO: + if (GetMipsRegMapLo(i) != Reg) + { + MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); + m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); + } + break; + case CRegInfo::STATE_MAPPED_64: + MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); + m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); + m_RegWorkingSet.SetX86Mapped(GetMipsRegMapHi(i), CRegInfo::NotMapped); + break; + case CRegInfo::STATE_CONST_64: + CPU_Message("hi %X\nLo %X", GetMipsRegHi(i), GetMipsRegLo(i)); + default: + CPU_Message("Do something with states in SyncRegState\nSTATE_MAPPED_32_SIGN\n%d", GetMipsRegState(i)); + g_Notify->BreakPoint(__FILE__, __LINE__); } - break; - case CRegInfo::STATE_MAPPED_64: - MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); - m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); - m_RegWorkingSet.SetX86Mapped(GetMipsRegMapHi(i), CRegInfo::NotMapped); - break; - case CRegInfo::STATE_CONST_64: - CPU_Message("hi %X\nLo %X", GetMipsRegHi(i), GetMipsRegLo(i)); - default: - CPU_Message("Do something with states in SyncRegState\nSTATE_MAPPED_32_SIGN\n%d", GetMipsRegState(i)); - g_Notify->BreakPoint(__FILE__, __LINE__); + m_RegWorkingSet.SetMipsRegMapLo(i, Reg); + m_RegWorkingSet.SetMipsRegState(i, CRegInfo::STATE_MAPPED_32_SIGN); + m_RegWorkingSet.SetX86Mapped(Reg, CRegInfo::GPR_Mapped); + m_RegWorkingSet.SetX86MapOrder(Reg, 1); } - m_RegWorkingSet.SetMipsRegMapLo(i, Reg); - m_RegWorkingSet.SetMipsRegState(i, CRegInfo::STATE_MAPPED_32_SIGN); - m_RegWorkingSet.SetX86Mapped(Reg, CRegInfo::GPR_Mapped); - m_RegWorkingSet.SetX86MapOrder(Reg, 1); - } - break; + break; case CRegInfo::STATE_MAPPED_32_ZERO: - { - x86Reg Reg = SyncTo.GetMipsRegMapLo(i); - UnMap_X86reg(Reg); - switch (GetMipsRegState(i)) { - case CRegInfo::STATE_MAPPED_64: - case CRegInfo::STATE_UNKNOWN: - MoveVariableToX86reg(&_GPR[i].UW[0], CRegName::GPR_Lo[i], Reg); - break; - case CRegInfo::STATE_MAPPED_32_ZERO: - MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); - m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); - break; - case CRegInfo::STATE_MAPPED_32_SIGN: - if (g_System->b32BitCore()) + x86Reg Reg = SyncTo.GetMipsRegMapLo(i); + UnMap_X86reg(Reg); + switch (GetMipsRegState(i)) { + case CRegInfo::STATE_MAPPED_64: + case CRegInfo::STATE_UNKNOWN: + MoveVariableToX86reg(&_GPR[i].UW[0], CRegName::GPR_Lo[i], Reg); + break; + case CRegInfo::STATE_MAPPED_32_ZERO: MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); - } - else - { + break; + case CRegInfo::STATE_MAPPED_32_SIGN: + if (g_System->b32BitCore()) + { + MoveX86RegToX86Reg(GetMipsRegMapLo(i), Reg); + m_RegWorkingSet.SetX86Mapped(GetMipsRegMapLo(i), CRegInfo::NotMapped); + } + else + { + CPU_Message("Do something with states in SyncRegState\nSTATE_MAPPED_32_ZERO\n%d", GetMipsRegState(i)); + g_Notify->BreakPoint(__FILE__, __LINE__); + } + break; + case CRegInfo::STATE_CONST_32_SIGN: + if (!g_System->b32BitCore() && GetMipsRegLo_S(i) < 0) + { + CPU_Message("Sign Problems in SyncRegState\nSTATE_MAPPED_32_ZERO"); + CPU_Message("%s: %X", CRegName::GPR[i], GetMipsRegLo_S(i)); + g_Notify->BreakPoint(__FILE__, __LINE__); + } + MoveConstToX86reg(GetMipsRegLo(i), Reg); + break; + default: CPU_Message("Do something with states in SyncRegState\nSTATE_MAPPED_32_ZERO\n%d", GetMipsRegState(i)); g_Notify->BreakPoint(__FILE__, __LINE__); } - break; - case CRegInfo::STATE_CONST_32_SIGN: - if (!g_System->b32BitCore() && GetMipsRegLo_S(i) < 0) - { - CPU_Message("Sign Problems in SyncRegState\nSTATE_MAPPED_32_ZERO"); - CPU_Message("%s: %X", CRegName::GPR[i], GetMipsRegLo_S(i)); - g_Notify->BreakPoint(__FILE__, __LINE__); - } - MoveConstToX86reg(GetMipsRegLo(i), Reg); - break; - default: - CPU_Message("Do something with states in SyncRegState\nSTATE_MAPPED_32_ZERO\n%d", GetMipsRegState(i)); - g_Notify->BreakPoint(__FILE__, __LINE__); + m_RegWorkingSet.SetMipsRegMapLo(i, Reg); + m_RegWorkingSet.SetMipsRegState(i, SyncTo.GetMipsRegState(i)); + m_RegWorkingSet.SetX86Mapped(Reg, CRegInfo::GPR_Mapped); + m_RegWorkingSet.SetX86MapOrder(Reg, 1); } - m_RegWorkingSet.SetMipsRegMapLo(i, Reg); - m_RegWorkingSet.SetMipsRegState(i, SyncTo.GetMipsRegState(i)); - m_RegWorkingSet.SetX86Mapped(Reg, CRegInfo::GPR_Mapped); - m_RegWorkingSet.SetX86MapOrder(Reg, 1); - } - break; + break; default: CPU_Message("%d - %d reg: %s (%d)", SyncTo.GetMipsRegState(i), GetMipsRegState(i), CRegName::GPR[i], i); g_Notify->BreakPoint(__FILE__, __LINE__); @@ -1035,14 +1036,14 @@ bool CCodeSection::GenerateX86Code(uint32_t Test) do { - __try + __except_try() { if (!g_MMU->LW_VAddr(m_CompilePC, m_Opcode.Hex)) { g_Notify->FatalError(GS(MSG_FAIL_LOAD_WORD)); } } - __except (g_MMU->MemoryFilter(GetExceptionCode(), GetExceptionInformation())) + __except_catch() { g_Notify->FatalError(GS(MSG_UNKNOWN_MEM_ACTION)); } @@ -1659,7 +1660,7 @@ void CCodeSection::UnlinkParent(CCodeSection * Parent, bool ContinueSection) return; } - CPU_Message(__FUNCTION__ ": Section %d Parent: %d ContinueSection = %s", m_SectionID, Parent->m_SectionID, ContinueSection ? "Yes" : "No"); + CPU_Message("%s: Section %d Parent: %d ContinueSection = %s", __FUNCTION__, m_SectionID, Parent->m_SectionID, ContinueSection ? "Yes" : "No"); if (Parent->m_ContinueSection == this && Parent->m_JumpSection == this) { g_Notify->BreakPoint(__FILE__, __LINE__); From e6172849ab82d43ea5ff410a588f4d9d1bb83209 Mon Sep 17 00:00:00 2001 From: AmbientMalice Date: Mon, 18 Jan 2016 21:11:36 +1000 Subject: [PATCH 29/54] Half fix PGA European Tour graphics. Game still doesn't work right, but at least you can see what you're doing now. --- Config/Glide64.rdb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Config/Glide64.rdb b/Config/Glide64.rdb index 58e22cc56..7ec6558f3 100644 --- a/Config/Glide64.rdb +++ b/Config/Glide64.rdb @@ -2387,6 +2387,18 @@ filtering=1 optimize_texrect=0 useless_is_useless=1 +[EE08C602-6BC2D5A6-C:50] +Good Name=PGA European Tour (E) (M5) +Internal Name=PGA European Tour +buff_clear=0 +swapmode=0 + +[B54CE881-BCCB6126-C:45] +Good Name=PGA European Tour (U) +Internal Name=PGA European Tour +buff_clear=0 +swapmode=0 + [1AA05AD5-46F52D80-C:50] Good Name=Pilotwings 64 (E) (M3) Internal Name=Pilot Wings64 From df04d377e007f3cf48b1508ca0e31164e4d015e7 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 22:25:10 +1100 Subject: [PATCH 30/54] [Project64] Clean up ProfilingClass.cpp --- .../N64System/ProfilingClass.cpp | 64 +++++++++++-------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/Source/Project64-core/N64System/ProfilingClass.cpp b/Source/Project64-core/N64System/ProfilingClass.cpp index 4042835ad..09f21d849 100644 --- a/Source/Project64-core/N64System/ProfilingClass.cpp +++ b/Source/Project64-core/N64System/ProfilingClass.cpp @@ -33,11 +33,11 @@ SPECIAL_TIMERS CProfiling::StartTimer(SPECIAL_TIMERS Address) uint32_t HiValue, LoValue; _asm { - pushad - rdtsc - mov HiValue, edx - mov LoValue, eax - popad + pushad; + rdtsc; + mov HiValue, edx; + mov LoValue, eax; + popad; } m_StartTimeHi = HiValue; m_StartTimeLo = LoValue; @@ -47,18 +47,19 @@ SPECIAL_TIMERS CProfiling::StartTimer(SPECIAL_TIMERS Address) return OldTimerAddr; } -SPECIAL_TIMERS CProfiling::StopTimer() { +SPECIAL_TIMERS CProfiling::StopTimer() +{ uint32_t HiValue, LoValue; if (m_CurrentTimerAddr == Timer_None) { return m_CurrentTimerAddr; } #ifdef _M_IX86 _asm { - pushad - rdtsc - mov HiValue, edx - mov LoValue, eax - popad + pushad; + rdtsc; + mov HiValue, edx; + mov LoValue, eax; + popad; } #else g_Notify->BreakPoint(__FILE__, __LINE__); @@ -81,7 +82,8 @@ SPECIAL_TIMERS CProfiling::StopTimer() { return OldTimerAddr; } -void CProfiling::ShowCPU_Usage() { +void CProfiling::ShowCPU_Usage() +{ int64_t TotalTime, CPU = 0, Alist = 0, Dlist = 0, Idle = 0; PROFILE_ENRTY Entry; @@ -117,16 +119,19 @@ void CProfiling::ShowCPU_Usage() { ResetCounters(); } -void CProfiling::ResetCounters() { +void CProfiling::ResetCounters() +{ m_Entries.clear(); } -struct TIMER_NAME { +struct TIMER_NAME +{ SPECIAL_TIMERS Timer; - char * Name; + const char * Name; }; -void CProfiling::GenerateLog() { +void CProfiling::GenerateLog() +{ stdstr LogFileName; { CLog Log; @@ -135,20 +140,25 @@ void CProfiling::GenerateLog() { //Get the total time int64_t TotalTime = 0; - for (PROFILE_ENRTY itemTime = m_Entries.begin(); itemTime != m_Entries.end(); itemTime++) { + for (PROFILE_ENRTY itemTime = m_Entries.begin(); itemTime != m_Entries.end(); itemTime++) + { TotalTime += itemTime->second; } //Create a sortable list of items std::vector ItemList; - for (PROFILE_ENRTY Entry = m_Entries.begin(); Entry != m_Entries.end(); Entry++) { + for (PROFILE_ENRTY Entry = m_Entries.begin(); Entry != m_Entries.end(); Entry++) + { ItemList.push_back(&(*Entry)); } //sort the list with a basic bubble sort - for (size_t OuterPass = 0; OuterPass < (ItemList.size() - 1); OuterPass++) { - for (size_t InnerPass = 0; InnerPass < (ItemList.size() - 1); InnerPass++) { - if (ItemList[InnerPass]->second < ItemList[InnerPass + 1]->second) { + for (size_t OuterPass = 0; OuterPass < (ItemList.size() - 1); OuterPass++) + { + for (size_t InnerPass = 0; InnerPass < (ItemList.size() - 1); InnerPass++) + { + if (ItemList[InnerPass]->second < ItemList[InnerPass + 1]->second) + { PROFILE_VALUE * TempPtr = ItemList[InnerPass]; ItemList[InnerPass] = ItemList[InnerPass + 1]; ItemList[InnerPass + 1] = TempPtr; @@ -156,7 +166,8 @@ void CProfiling::GenerateLog() { } } - TIMER_NAME TimerNames[] = { + TIMER_NAME TimerNames[] = + { { Timer_R4300, "R4300" }, { Timer_RSP_Dlist, "RSP: Dlist" }, { Timer_RSP_Alist, "RSP: Alist" }, @@ -172,13 +183,16 @@ void CProfiling::GenerateLog() { { Timer_CompileDone, "Timer_CompileDone" }, }; - for (size_t count = 0; count < ItemList.size(); count++) { + for (size_t count = 0; count < ItemList.size(); count++) + { char Buffer[255]; double CpuUsage = ((double)ItemList[count]->second / (double)TotalTime) * 100; if (CpuUsage <= 0.2) { continue; } sprintf(Buffer, "Func 0x%08X", ItemList[count]->first); - for (int NameID = 0; NameID < (sizeof(TimerNames) / sizeof(TIMER_NAME)); NameID++) { - if (ItemList[count]->first == TimerNames[NameID].Timer) { + for (int NameID = 0; NameID < (sizeof(TimerNames) / sizeof(TIMER_NAME)); NameID++) + { + if (ItemList[count]->first == TimerNames[NameID].Timer) + { strcpy(Buffer, TimerNames[NameID].Name); break; } From 821922f133e9bb4a425bd480deb06a718cca6b4a Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 22:26:15 +1100 Subject: [PATCH 31/54] [Project64] Clean up code related to plugins --- Source/Project64-core/Plugins/AudioPlugin.cpp | 20 +++++++++++-------- Source/Project64-core/Plugins/AudioPlugin.h | 2 +- .../Project64-core/Plugins/ControllerPlugin.h | 2 +- Source/Project64-core/Plugins/GFXPlugin.h | 2 +- Source/Project64-core/Plugins/PluginBase.cpp | 2 +- Source/Project64-core/Plugins/RSPPlugin.cpp | 2 +- Source/Project64-core/Plugins/RSPPlugin.h | 2 +- Source/Project64/Plugins/PluginList.cpp | 4 ++-- .../Settings/SettingsPage-Game-Plugin.cpp | 4 ++-- .../Settings/SettingsPage-Plugin.cpp | 4 ++-- 10 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Source/Project64-core/Plugins/AudioPlugin.cpp b/Source/Project64-core/Plugins/AudioPlugin.cpp index c7fa8035c..dd8749d56 100644 --- a/Source/Project64-core/Plugins/AudioPlugin.cpp +++ b/Source/Project64-core/Plugins/AudioPlugin.cpp @@ -14,7 +14,7 @@ #include #include #include -#include "AudioPlugin.h" +#include #ifdef _WIN32 #include #endif @@ -64,8 +64,8 @@ bool CAudioPlugin::Initiate(CN64System * System, RenderWindow * Window) { struct AUDIO_INFO { - HWND hwnd; - HINSTANCE hinst; + void * hwnd; + void * hinst; int32_t MemoryBswaped; // If this is set to TRUE, then the memory has been pre @@ -97,9 +97,9 @@ bool CAudioPlugin::Initiate(CN64System * System, RenderWindow * Window) AUDIO_INFO Info = { 0 }; - Info.hwnd = (HWND)Window->GetWindowHandle(); - Info.hinst = GetModuleHandle(NULL); - Info.MemoryBswaped = TRUE; + Info.hwnd = Window ? Window->GetWindowHandle() : NULL; + Info.hinst = Window ? Window->GetModuleInstance() : NULL;; + Info.MemoryBswaped = true; Info.CheckInterrupts = DummyCheckInterrupts; // We are initializing the plugin before any rom is loaded so we do not have any correct @@ -167,13 +167,15 @@ bool CAudioPlugin::Initiate(CN64System * System, RenderWindow * Window) void CAudioPlugin::UnloadPluginDetails(void) { +#ifdef _WIN32 if (m_hAudioThread) { WriteTrace(TraceAudioPlugin, TraceDebug, "Terminate Audio Thread"); TerminateThread(m_hAudioThread, 0); m_hAudioThread = NULL; } - AiDacrateChanged = NULL; +#endif + AiDacrateChanged = NULL; AiLenChanged = NULL; AiReadLength = NULL; AiUpdate = NULL; @@ -190,6 +192,7 @@ void CAudioPlugin::DacrateChanged(SYSTEM_TYPE Type) AiDacrateChanged(Type); } +#ifdef _WIN32 void CAudioPlugin::AudioThread(CAudioPlugin * _this) { SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); @@ -201,4 +204,5 @@ void CAudioPlugin::AudioThread(CAudioPlugin * _this) { _this->AiUpdate(true); } -} \ No newline at end of file +} +#endif diff --git a/Source/Project64-core/Plugins/AudioPlugin.h b/Source/Project64-core/Plugins/AudioPlugin.h index 0f6112f9f..97a924bae 100644 --- a/Source/Project64-core/Plugins/AudioPlugin.h +++ b/Source/Project64-core/Plugins/AudioPlugin.h @@ -9,7 +9,7 @@ * * ****************************************************************************/ #pragma once -#include "PluginBase.h" +#include class CAudioPlugin : public CPlugin { diff --git a/Source/Project64-core/Plugins/ControllerPlugin.h b/Source/Project64-core/Plugins/ControllerPlugin.h index 862a7e79e..6923174f5 100644 --- a/Source/Project64-core/Plugins/ControllerPlugin.h +++ b/Source/Project64-core/Plugins/ControllerPlugin.h @@ -9,7 +9,7 @@ * * ****************************************************************************/ #pragma once -#include "PluginBase.h" +#include #pragma warning(push) #pragma warning(disable : 4201) // warning C4201: nonstandard extension used : nameless struct/union diff --git a/Source/Project64-core/Plugins/GFXPlugin.h b/Source/Project64-core/Plugins/GFXPlugin.h index b76fc2231..562e4da9d 100644 --- a/Source/Project64-core/Plugins/GFXPlugin.h +++ b/Source/Project64-core/Plugins/GFXPlugin.h @@ -9,7 +9,7 @@ * * ****************************************************************************/ #pragma once -#include "PluginBase.h" +#include class CGfxPlugin : public CPlugin { diff --git a/Source/Project64-core/Plugins/PluginBase.cpp b/Source/Project64-core/Plugins/PluginBase.cpp index c07054b16..9886b1056 100644 --- a/Source/Project64-core/Plugins/PluginBase.cpp +++ b/Source/Project64-core/Plugins/PluginBase.cpp @@ -9,7 +9,7 @@ * * ****************************************************************************/ #include "stdafx.h" -#include "PluginBase.h" +#include CPlugin::CPlugin() : DllAbout(NULL), diff --git a/Source/Project64-core/Plugins/RSPPlugin.cpp b/Source/Project64-core/Plugins/RSPPlugin.cpp index 08eaafc1e..a5a9897ba 100644 --- a/Source/Project64-core/Plugins/RSPPlugin.cpp +++ b/Source/Project64-core/Plugins/RSPPlugin.cpp @@ -14,7 +14,7 @@ #include #include "RSPPlugin.h" #include "GFXPlugin.h" -#include "AudioPlugin.h" +#include void DummyFunc1(int a) { a += 1; } diff --git a/Source/Project64-core/Plugins/RSPPlugin.h b/Source/Project64-core/Plugins/RSPPlugin.h index 3bc6b6c82..1fa8401f2 100644 --- a/Source/Project64-core/Plugins/RSPPlugin.h +++ b/Source/Project64-core/Plugins/RSPPlugin.h @@ -9,7 +9,7 @@ * * ****************************************************************************/ #pragma once -#include "PluginBase.h" +#include class CRSP_Plugin : public CPlugin { diff --git a/Source/Project64/Plugins/PluginList.cpp b/Source/Project64/Plugins/PluginList.cpp index 582834e62..38a47384a 100644 --- a/Source/Project64/Plugins/PluginList.cpp +++ b/Source/Project64/Plugins/PluginList.cpp @@ -85,8 +85,8 @@ void CPluginList::AddPluginFromDir(CPath Dir) continue; } - void(__cdecl *GetDllInfo) (PLUGIN_INFO * PluginInfo); - GetDllInfo = (void(__cdecl *)(PLUGIN_INFO *))GetProcAddress(hLib, "GetDllInfo"); + void(CALL *GetDllInfo) (PLUGIN_INFO * PluginInfo); + GetDllInfo = (void(CALL *)(PLUGIN_INFO *))GetProcAddress(hLib, "GetDllInfo"); if (GetDllInfo == NULL) { continue; diff --git a/Source/Project64/UserInterface/Settings/SettingsPage-Game-Plugin.cpp b/Source/Project64/UserInterface/Settings/SettingsPage-Game-Plugin.cpp index c49b10072..64f3c5d27 100644 --- a/Source/Project64/UserInterface/Settings/SettingsPage-Game-Plugin.cpp +++ b/Source/Project64/UserInterface/Settings/SettingsPage-Game-Plugin.cpp @@ -126,8 +126,8 @@ void CGamePluginPage::ShowAboutButton(int id) } //Get DLL about - void(__cdecl *DllAbout) (HWND hWnd); - DllAbout = (void(__cdecl *)(HWND))GetProcAddress(hLib, "DllAbout"); + void(CALL *DllAbout) (HWND hWnd); + DllAbout = (void(CALL *)(HWND))GetProcAddress(hLib, "DllAbout"); //call the function from the dll DllAbout(m_hWnd); diff --git a/Source/Project64/UserInterface/Settings/SettingsPage-Plugin.cpp b/Source/Project64/UserInterface/Settings/SettingsPage-Plugin.cpp index abdb313d7..fcd661b2f 100644 --- a/Source/Project64/UserInterface/Settings/SettingsPage-Plugin.cpp +++ b/Source/Project64/UserInterface/Settings/SettingsPage-Plugin.cpp @@ -118,8 +118,8 @@ void COptionPluginPage::ShowAboutButton(int id) } //Get DLL about - void(__cdecl *DllAbout) (HWND hWnd); - DllAbout = (void(__cdecl *)(HWND))GetProcAddress(hLib, "DllAbout"); + void(CALL *DllAbout) (HWND hWnd); + DllAbout = (void(CALL *)(HWND))GetProcAddress(hLib, "DllAbout"); //call the function from the dll DllAbout(m_hWnd); From 0f57b5d42e2fa210c77b1bdb1ec5f4a5aa5e0c44 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 22:27:25 +1100 Subject: [PATCH 32/54] [Project64] Clean up some code related to Settings Type files --- .../SettingType/SettingsType-Application.cpp | 33 +++++++++--- .../SettingType/SettingsType-Application.h | 2 +- .../SettingsType-ApplicationPath.cpp | 2 + .../Settings/SettingType/SettingsType-Base.h | 6 ++- .../SettingType/SettingsType-Cheats.h | 2 +- .../SettingType/SettingsType-RDBCpuType.cpp | 2 +- .../SettingType/SettingsType-RDBSaveChip.cpp | 2 +- .../SettingType/SettingsType-RelativePath.cpp | 52 +++++++++++++------ .../SettingType/SettingsType-RelativePath.h | 13 +++-- .../SettingType/SettingsType-RomDatabase.cpp | 20 ++++++- .../SettingType/SettingsType-RomDatabase.h | 3 +- .../SettingsType-SelectedDirectory.cpp | 18 +++---- .../SettingsType-SelectedDirectory.h | 2 +- .../SettingType/SettingsType-TempBool.h | 2 +- .../SettingType/SettingsType-TempNumber.h | 2 +- .../SettingType/SettingsType-TempString.h | 2 +- 16 files changed, 116 insertions(+), 47 deletions(-) diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-Application.cpp b/Source/Project64-core/Settings/SettingType/SettingsType-Application.cpp index 137a824fc..08294dbe9 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-Application.cpp +++ b/Source/Project64-core/Settings/SettingType/SettingsType-Application.cpp @@ -60,6 +60,13 @@ CSettingTypeApplication::~CSettingTypeApplication() void CSettingTypeApplication::Initialize( const char * /*AppName*/ ) { + CPath BaseDir(g_Settings->LoadStringVal(Cmd_BaseDirectory).c_str(),""); + if (!BaseDir.DirectoryExists()) + { + printf("BaseDir does not exists, doing nothing"); + return; + } + stdstr SettingsFile, OrigSettingsFile; for (int i = 0; i < 100; i++) @@ -77,7 +84,11 @@ void CSettingTypeApplication::Initialize( const char * /*AppName*/ ) { delete m_SettingsIniFile; } +#ifdef _WIN32 CPath SettingsDir(CPath(SettingsFile).GetDriveDirectory(),""); +#else + CPath SettingsDir(CPath(SettingsFile).GetDirectory(), ""); +#endif if (!SettingsDir.DirectoryExists()) { SettingsDir.DirectoryCreate(); @@ -123,7 +134,9 @@ bool CSettingTypeApplication::Load ( int /*Index*/, bool & Value ) const if (m_DefaultSetting == Default_Constant) { Value = m_DefaultValue != 0; - } else { + } + else + { g_Settings->LoadBool(m_DefaultSetting,Value); } } @@ -138,7 +151,9 @@ bool CSettingTypeApplication::Load ( int /*Index*/, uint32_t & Value ) const if (m_DefaultSetting == Default_Constant) { Value = m_DefaultValue; - } else { + } + else + { g_Settings->LoadDword(m_DefaultSetting,Value); } } @@ -168,20 +183,24 @@ void CSettingTypeApplication::LoadDefault ( int /*Index*/, bool & Value ) cons if (m_DefaultSetting == Default_Constant) { Value = m_DefaultValue != 0; - } else { + } + else + { g_Settings->LoadBool(m_DefaultSetting,Value); } } } -void CSettingTypeApplication::LoadDefault ( int /*Index*/, uint32_t & Value ) const +void CSettingTypeApplication::LoadDefault(int /*Index*/, uint32_t & Value) const { if (m_DefaultSetting != Default_None) { if (m_DefaultSetting == Default_Constant) { Value = m_DefaultValue; - } else { + } + else + { g_Settings->LoadDword(m_DefaultSetting,Value); } } @@ -194,7 +213,9 @@ void CSettingTypeApplication::LoadDefault ( int /*Index*/, stdstr & Value ) cons if (m_DefaultSetting == Default_Constant) { Value = m_DefaultStr; - } else { + } + else + { g_Settings->LoadStringVal(m_DefaultSetting,Value); } } diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-Application.h b/Source/Project64-core/Settings/SettingType/SettingsType-Application.h index 06dd2726e..9412a8e3a 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-Application.h +++ b/Source/Project64-core/Settings/SettingType/SettingsType-Application.h @@ -11,7 +11,7 @@ #pragma once #include -#include "SettingsType-Base.h" +#include class CSettingTypeApplication : public CSettingType diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-ApplicationPath.cpp b/Source/Project64-core/Settings/SettingType/SettingsType-ApplicationPath.cpp index 15331ec52..5b2cf754d 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-ApplicationPath.cpp +++ b/Source/Project64-core/Settings/SettingType/SettingsType-ApplicationPath.cpp @@ -26,6 +26,7 @@ CSettingTypeApplicationPath::~CSettingTypeApplicationPath() bool CSettingTypeApplicationPath::Load ( int Index, stdstr & Value ) const { bool bRes = CSettingTypeApplication::Load(Index,Value); +#ifdef WIN32 if (bRes) { if (Value.substr(0,2) == ".\\" || Value.substr(0,2) == "./" || @@ -38,5 +39,6 @@ bool CSettingTypeApplicationPath::Load ( int Index, stdstr & Value ) const Value = (const std::string &)FullFilePath; } } +#endif return bRes; } diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-Base.h b/Source/Project64-core/Settings/SettingType/SettingsType-Base.h index 58134054a..c0c78233c 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-Base.h +++ b/Source/Project64-core/Settings/SettingType/SettingsType-Base.h @@ -10,9 +10,11 @@ ****************************************************************************/ #pragma once -#include "../Settings.h" +#include +#include -enum SettingType { +enum SettingType +{ SettingType_Unknown = -1, SettingType_ConstString = 0, SettingType_ConstValue = 1, diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-Cheats.h b/Source/Project64-core/Settings/SettingType/SettingsType-Cheats.h index 08ca22a67..c78eac2f8 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-Cheats.h +++ b/Source/Project64-core/Settings/SettingType/SettingsType-Cheats.h @@ -10,7 +10,7 @@ ****************************************************************************/ #pragma once -#include "SettingsType-Base.h" +#include #include class CSettingTypeCheats : diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-RDBCpuType.cpp b/Source/Project64-core/Settings/SettingType/SettingsType-RDBCpuType.cpp index 8c5cb491a..7395ec57d 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-RDBCpuType.cpp +++ b/Source/Project64-core/Settings/SettingType/SettingsType-RDBCpuType.cpp @@ -11,7 +11,7 @@ #include "stdafx.h" #include "SettingsType-RomDatabase.h" #include "SettingsType-RDBCpuType.h" -#include "../../N64System/N64Types.h" +#include CSettingTypeRDBCpuType::CSettingTypeRDBCpuType(const char * Name, SettingID DefaultSetting ) : CSettingTypeRomDatabase(Name,DefaultSetting) diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-RDBSaveChip.cpp b/Source/Project64-core/Settings/SettingType/SettingsType-RDBSaveChip.cpp index 75de85156..fb754db34 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-RDBSaveChip.cpp +++ b/Source/Project64-core/Settings/SettingType/SettingsType-RDBSaveChip.cpp @@ -11,7 +11,7 @@ #include "stdafx.h" #include "SettingsType-RomDatabase.h" #include "SettingsType-RDBSaveChip.h" -#include "../../N64System/N64Types.h" +#include CSettingTypeRDBSaveChip::CSettingTypeRDBSaveChip(const char * Name, SettingID DefaultSetting ) : CSettingTypeRomDatabase(Name,DefaultSetting) diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-RelativePath.cpp b/Source/Project64-core/Settings/SettingType/SettingsType-RelativePath.cpp index 03f789ab0..88049c257 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-RelativePath.cpp +++ b/Source/Project64-core/Settings/SettingType/SettingsType-RelativePath.cpp @@ -11,59 +11,79 @@ #include "stdafx.h" #include "SettingsType-RelativePath.h" -CSettingTypeRelativePath::CSettingTypeRelativePath(const char * Path, const char * FileName) +CSettingTypeRelativePath::CSettingTypeRelativePath(const char * Directory, const char * FileName) : +m_Directory(Directory), +m_FileName(FileName) { - m_FileName = CPath(CPath::MODULE_DIRECTORY,FileName); - m_FileName.AppendDirectory(Path); + BuildPath(); + g_Settings->RegisterChangeCB(Cmd_BaseDirectory, this, RefreshSettings); } -CSettingTypeRelativePath::~CSettingTypeRelativePath ( void ) +CSettingTypeRelativePath::~CSettingTypeRelativePath(void) { + g_Settings->UnregisterChangeCB(Cmd_BaseDirectory, this, RefreshSettings); } -bool CSettingTypeRelativePath::Load ( int /*Index*/, stdstr & value ) const +bool CSettingTypeRelativePath::Load(int /*Index*/, stdstr & value) const { - value = (const char *)m_FileName; + value = m_FullPath; return true; } //return the default values -void CSettingTypeRelativePath::LoadDefault ( int /*Index*/, bool & /*Value*/ ) const +void CSettingTypeRelativePath::LoadDefault(int /*Index*/, bool & /*Value*/) const { g_Notify->BreakPoint(__FILE__, __LINE__); } -void CSettingTypeRelativePath::LoadDefault ( int /*Index*/, uint32_t & /*Value*/ ) const +void CSettingTypeRelativePath::LoadDefault(int /*Index*/, uint32_t & /*Value*/) const { g_Notify->BreakPoint(__FILE__, __LINE__); } -void CSettingTypeRelativePath::LoadDefault ( int /*Index*/, stdstr & /*Value*/ ) const +void CSettingTypeRelativePath::LoadDefault(int /*Index*/, stdstr & /*Value*/) const { g_Notify->BreakPoint(__FILE__, __LINE__); } -void CSettingTypeRelativePath::Save ( int /*Index*/, bool /*Value*/ ) +void CSettingTypeRelativePath::Save(int /*Index*/, bool /*Value*/) { g_Notify->BreakPoint(__FILE__, __LINE__); } -void CSettingTypeRelativePath::Save ( int /*Index*/, uint32_t /*Value*/ ) +void CSettingTypeRelativePath::Save(int /*Index*/, uint32_t /*Value*/) { g_Notify->BreakPoint(__FILE__, __LINE__); } -void CSettingTypeRelativePath::Save ( int /*Index*/, const stdstr & Value ) +void CSettingTypeRelativePath::Save(int /*Index*/, const stdstr & Value) { - m_FileName = CPath(CPath::MODULE_DIRECTORY,Value.c_str()); + m_Directory = ""; + m_FileName = Value; + BuildPath(); } -void CSettingTypeRelativePath::Save ( int /*Index*/, const char * Value ) +void CSettingTypeRelativePath::Save(int /*Index*/, const char * Value) { - m_FileName = CPath(CPath::MODULE_DIRECTORY,Value); + m_Directory = ""; + m_FileName = Value; + BuildPath(); } -void CSettingTypeRelativePath::Delete ( int /*Index*/ ) +void CSettingTypeRelativePath::Delete(int /*Index*/) { g_Notify->BreakPoint(__FILE__, __LINE__); } + +void CSettingTypeRelativePath::BuildPath(void) +{ + CPath FullPath(g_Settings->LoadStringVal(Cmd_BaseDirectory).c_str(),""); + FullPath.AppendDirectory(m_Directory.c_str()); + FullPath.SetNameExtension(m_FileName.c_str()); + m_FullPath = (const char *)FullPath; +} + +void CSettingTypeRelativePath::RefreshSettings(void * _this) +{ + ((CSettingTypeRelativePath *)_this)->BuildPath(); +} diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-RelativePath.h b/Source/Project64-core/Settings/SettingType/SettingsType-RelativePath.h index fefb5b16b..ab5ef6876 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-RelativePath.h +++ b/Source/Project64-core/Settings/SettingType/SettingsType-RelativePath.h @@ -10,15 +10,13 @@ ****************************************************************************/ #pragma once #include -#include "SettingsType-Base.h" +#include class CSettingTypeRelativePath : public CSettingType { - CPath m_FileName; - public: - CSettingTypeRelativePath(const char * Path, const char * FileName); + CSettingTypeRelativePath(const char * Directory, const char * FileName); ~CSettingTypeRelativePath(); bool IndexBasedSetting ( void ) const { return false; } @@ -47,4 +45,11 @@ private: CSettingTypeRelativePath(void); // Disable default constructor CSettingTypeRelativePath(const CSettingTypeRelativePath&); // Disable copy constructor CSettingTypeRelativePath& operator=(const CSettingTypeRelativePath&); // Disable assignment + + static void RefreshSettings(void * _this); + void BuildPath ( void ); + + std::string m_FullPath; + std::string m_Directory; + std::string m_FileName; }; diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-RomDatabase.cpp b/Source/Project64-core/Settings/SettingType/SettingsType-RomDatabase.cpp index dbd95b041..c45e6b69e 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-RomDatabase.cpp +++ b/Source/Project64-core/Settings/SettingType/SettingsType-RomDatabase.cpp @@ -65,12 +65,14 @@ void CSettingTypeRomDatabase::Initialize( void ) m_GlideIniFile = new CIniFile(g_Settings->LoadStringVal(SupportFile_Glide64RDB).c_str()); g_Settings->RegisterChangeCB(Game_IniKey,NULL,GameChanged); + g_Settings->RegisterChangeCB(Cmd_BaseDirectory,NULL,BaseDirChanged); m_SectionIdent = new stdstr(g_Settings->LoadStringVal(Game_IniKey)); } void CSettingTypeRomDatabase::CleanUp( void ) { + g_Settings->UnregisterChangeCB(Cmd_BaseDirectory,NULL,BaseDirChanged); g_Settings->UnregisterChangeCB(Game_IniKey,NULL,GameChanged); if (m_SettingsIniFile) { @@ -89,6 +91,22 @@ void CSettingTypeRomDatabase::CleanUp( void ) } } +void CSettingTypeRomDatabase::BaseDirChanged ( void * /*Data */ ) +{ + if (m_SettingsIniFile) + { + delete m_SettingsIniFile; + m_SettingsIniFile = NULL; + } + if (m_GlideIniFile) + { + delete m_GlideIniFile; + m_GlideIniFile = NULL; + } + m_SettingsIniFile = new CIniFile(g_Settings->LoadStringVal(SupportFile_RomDatabase).c_str()); + m_GlideIniFile = new CIniFile(g_Settings->LoadStringVal(SupportFile_Glide64RDB).c_str()); +} + void CSettingTypeRomDatabase::GameChanged ( void * /*Data */ ) { if (m_SectionIdent) @@ -195,7 +213,7 @@ void CSettingTypeRomDatabase::Save ( int /*Index*/, bool Value ) } if (m_DeleteOnDefault) { - g_Notify->BreakPoint(__FILE__, __LINE__); + g_Notify->BreakPoint(__FILE__,__LINE__); } if (m_GlideSetting) { diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-RomDatabase.h b/Source/Project64-core/Settings/SettingType/SettingsType-RomDatabase.h index c4d5a6755..6df365f0d 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-RomDatabase.h +++ b/Source/Project64-core/Settings/SettingType/SettingsType-RomDatabase.h @@ -11,7 +11,7 @@ #pragma once #include -#include "SettingsType-Base.h" +#include class CSettingTypeRomDatabase : public CSettingType @@ -51,6 +51,7 @@ public: protected: static void GameChanged ( void * /*Data */ ); + static void BaseDirChanged ( void * /*Data */ ); static bool IsGlideSetting (const char * Name); static const char * StripNameSection (const char * Name); diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-SelectedDirectory.cpp b/Source/Project64-core/Settings/SettingType/SettingsType-SelectedDirectory.cpp index e0920612b..c48a0b304 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-SelectedDirectory.cpp +++ b/Source/Project64-core/Settings/SettingType/SettingsType-SelectedDirectory.cpp @@ -25,13 +25,13 @@ CSettingTypeSelectedDirectory::~CSettingTypeSelectedDirectory() bool CSettingTypeSelectedDirectory::Load ( int /*Index*/, bool & /*Value*/ ) const { - g_Notify->BreakPoint(__FILE__, __LINE__); + g_Notify->BreakPoint(__FILE__,__LINE__); return false; } bool CSettingTypeSelectedDirectory::Load ( int /*Index*/, uint32_t & /*Value*/ ) const { - g_Notify->BreakPoint(__FILE__, __LINE__); + g_Notify->BreakPoint(__FILE__,__LINE__); return false; } @@ -44,33 +44,33 @@ bool CSettingTypeSelectedDirectory::Load ( int /*Index*/, stdstr & Value ) const //return the default values void CSettingTypeSelectedDirectory::LoadDefault ( int /*Index*/, bool & /*Value*/ ) const { - g_Notify->BreakPoint(__FILE__, __LINE__); + g_Notify->BreakPoint(__FILE__,__LINE__); } void CSettingTypeSelectedDirectory::LoadDefault ( int /*Index*/, uint32_t & /*Value*/ ) const { - g_Notify->BreakPoint(__FILE__, __LINE__); + g_Notify->BreakPoint(__FILE__,__LINE__); } void CSettingTypeSelectedDirectory::LoadDefault ( int /*Index*/, stdstr & /*Value*/ ) const { - g_Notify->BreakPoint(__FILE__, __LINE__); + g_Notify->BreakPoint(__FILE__,__LINE__); } //Update the settings void CSettingTypeSelectedDirectory::Save ( int /*Index*/, bool /*Value*/ ) { - g_Notify->BreakPoint(__FILE__, __LINE__); + g_Notify->BreakPoint(__FILE__,__LINE__); } void CSettingTypeSelectedDirectory::Save ( int /*Index*/, uint32_t /*Value*/ ) { - g_Notify->BreakPoint(__FILE__, __LINE__); + g_Notify->BreakPoint(__FILE__,__LINE__); } void CSettingTypeSelectedDirectory::Save ( int /*Index*/, const stdstr & /*Value*/ ) { - g_Notify->BreakPoint(__FILE__, __LINE__); + g_Notify->BreakPoint(__FILE__,__LINE__); } void CSettingTypeSelectedDirectory::Save ( int /*Index*/, const char * Value ) @@ -81,5 +81,5 @@ void CSettingTypeSelectedDirectory::Save ( int /*Index*/, const char * Value ) void CSettingTypeSelectedDirectory::Delete( int /*Index*/ ) { - g_Notify->BreakPoint(__FILE__, __LINE__); + g_Notify->BreakPoint(__FILE__,__LINE__); } diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-SelectedDirectory.h b/Source/Project64-core/Settings/SettingType/SettingsType-SelectedDirectory.h index b51be8046..ea20bc320 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-SelectedDirectory.h +++ b/Source/Project64-core/Settings/SettingType/SettingsType-SelectedDirectory.h @@ -10,7 +10,7 @@ ****************************************************************************/ #pragma once -#include "SettingsType-Base.h" +#include class CSettingTypeSelectedDirectory : public CSettingType diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-TempBool.h b/Source/Project64-core/Settings/SettingType/SettingsType-TempBool.h index 05dfb0146..e09181793 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-TempBool.h +++ b/Source/Project64-core/Settings/SettingType/SettingsType-TempBool.h @@ -10,7 +10,7 @@ ****************************************************************************/ #pragma once -#include "SettingsType-Base.h" +#include class CSettingTypeTempBool : public CSettingType diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-TempNumber.h b/Source/Project64-core/Settings/SettingType/SettingsType-TempNumber.h index 2011a751d..9b5727bc8 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-TempNumber.h +++ b/Source/Project64-core/Settings/SettingType/SettingsType-TempNumber.h @@ -10,7 +10,7 @@ ****************************************************************************/ #pragma once -#include "SettingsType-Base.h" +#include class CSettingTypeTempNumber : public CSettingType diff --git a/Source/Project64-core/Settings/SettingType/SettingsType-TempString.h b/Source/Project64-core/Settings/SettingType/SettingsType-TempString.h index 0c2143d19..e7f3be1e4 100644 --- a/Source/Project64-core/Settings/SettingType/SettingsType-TempString.h +++ b/Source/Project64-core/Settings/SettingType/SettingsType-TempString.h @@ -10,7 +10,7 @@ ****************************************************************************/ #pragma once -#include "SettingsType-Base.h" +#include class CSettingTypeTempString : public CSettingType From b8c00dd5fed6cfc9efdefa080d9247279dc19593 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 22:28:38 +1100 Subject: [PATCH 33/54] [Project64] Remove #include from RecompilerClass.cpp --- .../N64System/Recompiler/RecompilerClass.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Source/Project64-core/N64System/Recompiler/RecompilerClass.cpp b/Source/Project64-core/N64System/Recompiler/RecompilerClass.cpp index a0b3e8adf..e85867ef3 100644 --- a/Source/Project64-core/N64System/Recompiler/RecompilerClass.cpp +++ b/Source/Project64-core/N64System/Recompiler/RecompilerClass.cpp @@ -15,7 +15,6 @@ #include #include #include -#include CRecompiler::CRecompiler(CRegisters & Registers, CProfiling & Profile, bool & EndEmulation) : m_Registers(Registers), @@ -36,7 +35,6 @@ CRecompiler::~CRecompiler() void CRecompiler::Run() { - CoInitialize(NULL); if (bLogX86Code()) { Start_x86_Log(); @@ -57,7 +55,7 @@ void CRecompiler::Run() #ifdef legacycode *g_MemoryStack = (uint32_t)(RDRAM+(_GPR[29].W[0] & 0x1FFFFFFF)); #endif - __try + __except_try() { if (g_System->LookUpMode() == FuncFind_VirtualLookup) { @@ -100,7 +98,7 @@ void CRecompiler::Run() } } } - __except (g_MMU->MemoryFilter(GetExceptionCode(), GetExceptionInformation())) + __except_catch() { g_Notify->DisplayError(MSG_UNKNOWN_MEM_ACTION); } @@ -945,7 +943,7 @@ CCompiledFunc * CRecompiler::CompilerCode() } CCompiledFunc * Func = new CCompiledFunc(CodeBlock); - CCompiledFuncList::_Pairib ret = m_Functions.insert(CCompiledFuncList::value_type(Func->EnterPC(), Func)); + std::pair ret = m_Functions.insert(CCompiledFuncList::value_type(Func->EnterPC(), Func)); if (ret.second == false) { Func->SetNext(ret.first->second->Next()); @@ -1048,7 +1046,7 @@ void CRecompiler::ResetMemoryStackPos() } if (m_Registers.m_GPR[29].UW[0] == 0) { - m_MemoryStack = NULL; + m_MemoryStack = 0; return; } From 5dca0c80a5d6721b9ef220871d03c191881a9f71 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 22:30:01 +1100 Subject: [PATCH 34/54] [Project64] Use memory management code for RecompilerMemory.cpp --- .../N64System/Recompiler/RecompilerMemory.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Source/Project64-core/N64System/Recompiler/RecompilerMemory.cpp b/Source/Project64-core/N64System/Recompiler/RecompilerMemory.cpp index 1d852f692..7bd359adb 100644 --- a/Source/Project64-core/N64System/Recompiler/RecompilerMemory.cpp +++ b/Source/Project64-core/N64System/Recompiler/RecompilerMemory.cpp @@ -13,7 +13,6 @@ #include #include #include -#include CRecompMemory::CRecompMemory() : m_RecompCode(NULL), @@ -26,7 +25,7 @@ CRecompMemory::~CRecompMemory() { if (m_RecompCode) { - VirtualFree(m_RecompCode, 0, MEM_RELEASE); + FreeAddressSpace(m_RecompCode,MaxCompileBufferSize + 4); m_RecompCode = NULL; } m_RecompPos = NULL; @@ -34,7 +33,7 @@ CRecompMemory::~CRecompMemory() bool CRecompMemory::AllocateMemory() { - uint8_t * RecompCodeBase = (uint8_t *)VirtualAlloc(NULL, MaxCompileBufferSize + 4, MEM_RESERVE | MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE); + uint8_t * RecompCodeBase = (uint8_t *)AllocateAddressSpace(MaxCompileBufferSize + 4); if (RecompCodeBase == NULL) { WriteTrace(TraceRecompiler, TraceError, "failed to allocate RecompCodeBase"); @@ -42,11 +41,11 @@ bool CRecompMemory::AllocateMemory() return false; } - m_RecompCode = (uint8_t *)VirtualAlloc(RecompCodeBase, InitialCompileBufferSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); + m_RecompCode = (uint8_t *)CommitMemory(RecompCodeBase, InitialCompileBufferSize, MEM_EXECUTE_READWRITE); if (m_RecompCode == NULL) { WriteTrace(TraceRecompiler, TraceError, "failed to commit initial buffer"); - VirtualFree(RecompCodeBase, 0, MEM_RELEASE); + FreeAddressSpace(RecompCodeBase,MaxCompileBufferSize + 4); g_Notify->DisplayError(MSG_MEM_ALLOC_ERROR); return false; } @@ -68,7 +67,7 @@ void CRecompMemory::CheckRecompMem() g_Recompiler->ResetRecompCode(true); return; } - LPVOID MemAddr = VirtualAlloc(m_RecompCode + m_RecompSize, IncreaseCompileBufferSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); + void * MemAddr = CommitMemory(m_RecompCode + m_RecompSize, IncreaseCompileBufferSize, MEM_EXECUTE_READWRITE); if (MemAddr == NULL) { WriteTrace(TraceRecompiler, TraceError, "failed to increase buffer"); From 1dd05282d854c4c3327612a07f974d390932bc4e Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 22:31:36 +1100 Subject: [PATCH 35/54] [Project64] Misc code clean up --- Source/Project64-core/N64System/Mips/SystemEvents.cpp | 2 -- Source/Project64-core/N64System/N64Class.h | 2 +- Source/Project64-core/N64System/Recompiler/RegInfo.cpp | 4 ++-- Source/Project64-core/N64System/Recompiler/X86ops.cpp | 4 ++-- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Source/Project64-core/N64System/Mips/SystemEvents.cpp b/Source/Project64-core/N64System/Mips/SystemEvents.cpp index 5ae518330..5f2790450 100644 --- a/Source/Project64-core/N64System/Mips/SystemEvents.cpp +++ b/Source/Project64-core/N64System/Mips/SystemEvents.cpp @@ -18,12 +18,10 @@ CSystemEvents::CSystemEvents(CN64System * System, CPlugins * Plugins) : m_Plugins(Plugins), m_bDoSomething(false) { - } CSystemEvents::~CSystemEvents() { - } void CSystemEvents::QueueEvent(SystemEvent action) diff --git a/Source/Project64-core/N64System/N64Class.h b/Source/Project64-core/N64System/N64Class.h index 40876f865..df41ba593 100644 --- a/Source/Project64-core/N64System/N64Class.h +++ b/Source/Project64-core/N64System/N64Class.h @@ -117,7 +117,7 @@ private: void StartEmulation2(bool NewThread); bool SetActiveSystem(bool bActive = true); void InitRegisters(bool bPostPif, CMipsMemoryVM & MMU); - void DisplayRSPListCount(); + void DisplayRSPListCount(); //CPU Methods void ExecuteRecompiler(); diff --git a/Source/Project64-core/N64System/Recompiler/RegInfo.cpp b/Source/Project64-core/N64System/Recompiler/RegInfo.cpp index 48b6ea728..510ce69cc 100644 --- a/Source/Project64-core/N64System/Recompiler/RegInfo.cpp +++ b/Source/Project64-core/N64System/Recompiler/RegInfo.cpp @@ -21,7 +21,7 @@ uint32_t CRegInfo::m_fpuControl = 0; -char *Format_Name[] = { "Unknown", "dword", "qword", "float", "double" }; +const char *Format_Name[] = { "Unknown", "dword", "qword", "float", "double" }; CRegInfo::CRegInfo() : m_CycleCount(0), @@ -531,7 +531,7 @@ CX86Ops::x86Reg CRegInfo::UnMap_8BitTempReg() for (count = 0; count < 10; count++) { if (!Is8BitReg((x86Reg)count)) { continue; } - if (GetMipsRegState((x86Reg)count) == Temp_Mapped) + if (GetX86Mapped((x86Reg)count) == Temp_Mapped) { if (GetX86Protected((x86Reg)count) == false) { diff --git a/Source/Project64-core/N64System/Recompiler/X86ops.cpp b/Source/Project64-core/N64System/Recompiler/X86ops.cpp index 21983b5bf..c1b681bd3 100644 --- a/Source/Project64-core/N64System/Recompiler/X86ops.cpp +++ b/Source/Project64-core/N64System/Recompiler/X86ops.cpp @@ -11,7 +11,7 @@ #include "stdafx.h" #include #include -#include "X86ops.h" +#include #include "x86CodeLog.h" #define PUTDST8(dest,value) (*((uint8_t *)(dest))=(uint8_t)(value)); dest += 1; @@ -211,7 +211,7 @@ void CX86Ops::X86BreakPoint(const char * FileName, int LineNumber) Pushad(); PushImm32(stdstr_f("%d", LineNumber).c_str(), LineNumber); PushImm32(FileName, (uint32_t)FileName); - Call_Direct(BreakPointNotification, "BreakPointNotification"); + Call_Direct((void *)BreakPointNotification, "BreakPointNotification"); AddConstToX86Reg(x86_ESP, 8); Popad(); } From 691f09159b1757eefb51059b12daae7d5e079246 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 18 Jan 2016 22:32:50 +1100 Subject: [PATCH 36/54] [Project64] remove Speed limiter code from non windows --- .../Project64-core/N64System/SpeedLimiterClass.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Source/Project64-core/N64System/SpeedLimiterClass.cpp b/Source/Project64-core/N64System/SpeedLimiterClass.cpp index d44d66578..f090d53cb 100644 --- a/Source/Project64-core/N64System/SpeedLimiterClass.cpp +++ b/Source/Project64-core/N64System/SpeedLimiterClass.cpp @@ -11,10 +11,11 @@ #include "stdafx.h" #include "SpeedLimiterClass.h" #include +#ifdef _WIN32 #include #include - #pragma comment(lib, "winmm.lib") +#endif CSpeedLimiter::CSpeedLimiter() { @@ -24,19 +25,23 @@ CSpeedLimiter::CSpeedLimiter() m_BaseSpeed = 60; m_Ratio = 1000.0F / (float)m_Speed; +#ifdef _WIN32 TIMECAPS Caps; timeGetDevCaps(&Caps, sizeof(Caps)); if (timeBeginPeriod(Caps.wPeriodMin) == TIMERR_NOCANDO) { g_Notify->DisplayError("Error during timer begin"); } +#endif } CSpeedLimiter::~CSpeedLimiter() { +#ifdef _WIN32 TIMECAPS Caps; timeGetDevCaps(&Caps, sizeof(Caps)); timeEndPeriod(Caps.wPeriodMin); +#endif } void CSpeedLimiter::SetHertz(uint32_t Hertz) @@ -50,11 +55,14 @@ void CSpeedLimiter::FixSpeedRatio() { m_Ratio = 1000.0f / static_cast(m_Speed); m_Frames = 0; +#ifdef _WIN32 m_LastTime = timeGetTime(); +#endif } bool CSpeedLimiter::Timer_Process(uint32_t * FrameRate) { +#ifdef _WIN32 m_Frames += 1; uint32_t CurrentTime = timeGetTime(); @@ -85,6 +93,9 @@ bool CSpeedLimiter::Timer_Process(uint32_t * FrameRate) { return false; } +#else + return false; +#endif } void CSpeedLimiter::IncreaseSpeed() From eb543a2b8243bb655a88d334b35be465f078e53b Mon Sep 17 00:00:00 2001 From: AmbientMalice Date: Mon, 18 Jan 2016 21:57:14 +1000 Subject: [PATCH 37/54] Enable per-frame FB. This is expensive currently, but pretty much needed for this game. --- Config/Glide64.rdb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Config/Glide64.rdb b/Config/Glide64.rdb index 7ec6558f3..2113dfaae 100644 --- a/Config/Glide64.rdb +++ b/Config/Glide64.rdb @@ -2391,12 +2391,14 @@ useless_is_useless=1 Good Name=PGA European Tour (E) (M5) Internal Name=PGA European Tour buff_clear=0 +fb_read_always=1 swapmode=0 [B54CE881-BCCB6126-C:45] Good Name=PGA European Tour (U) Internal Name=PGA European Tour buff_clear=0 +fb_read_always=1 swapmode=0 [1AA05AD5-46F52D80-C:50] From ee55f1f2b6473f21d465453f62a835c914037b1c Mon Sep 17 00:00:00 2001 From: AmbientMalice Date: Mon, 18 Jan 2016 23:03:28 +1000 Subject: [PATCH 38/54] "Fix" Pro Mahjong Tsuwamono 64 - Jansou Battle ni Chousen I hate disabling FB, but it's the only thing that seems to fix games like this. --- Config/Glide64.rdb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Config/Glide64.rdb b/Config/Glide64.rdb index 58e22cc56..18eb6b5be 100644 --- a/Config/Glide64.rdb +++ b/Config/Glide64.rdb @@ -2750,8 +2750,10 @@ force_quad3d=1 Good Name=Pro Mahjong Tsuwamono 64 - Jansou Battle ni Chousen (J) Internal Name=TSUWAMONO64 depthmode=0 +fb_smart=0 //disabling FB is a horrible hack force_microcheck=1 + //================ Q ================ [16931D74-65DC6D34-C:50] Good Name=Quake 64 (E) From 4fb6c2219dd4438b8acda60aa5c128351e6307e8 Mon Sep 17 00:00:00 2001 From: luigiblood Date: Mon, 18 Jan 2016 20:15:01 +0100 Subject: [PATCH 39/54] Retail 64DD IPL ROM support (boots) --- Source/Project64-core/N64System/Mips/Dma.cpp | 74 ++++++++++++++++++- .../N64System/Mips/MemoryVirtualMem.cpp | 45 ++++++++++- .../N64System/Mips/MemoryVirtualMem.h | 5 ++ Source/Project64-core/N64System/N64Class.cpp | 6 ++ .../N64System/SystemGlobals.cpp | 1 + .../Project64-core/N64System/SystemGlobals.h | 1 + 6 files changed, 128 insertions(+), 4 deletions(-) diff --git a/Source/Project64-core/N64System/Mips/Dma.cpp b/Source/Project64-core/N64System/Mips/Dma.cpp index 7720e417d..5a5ba3794 100644 --- a/Source/Project64-core/N64System/Mips/Dma.cpp +++ b/Source/Project64-core/N64System/Mips/Dma.cpp @@ -34,6 +34,7 @@ void CDMA::OnFirstDMA() { case CIC_NUS_6101: offset = +0x0318; break; case CIC_NUS_5167: offset = +0x0318; break; + case CIC_NUS_8303: offset = +0x0318; break; case CIC_UNKNOWN: case CIC_NUS_6102: offset = +0x0318; break; case CIC_NUS_6103: offset = +0x0318; break; @@ -75,7 +76,7 @@ void CDMA::PI_DMA_READ() uint8_t * ROM = g_Rom->GetRomAddress(); uint8_t * RDRAM = g_MMU->Rdram(); - ProtectMemory(ROM, g_Rom->GetRomSize(), MEM_READWRITE); + ProtectMemory(ROM, g_Rom->GetRomSize(), MEM_READWRITE); g_Reg->PI_CART_ADDR_REG -= 0x10000000; if (g_Reg->PI_CART_ADDR_REG + PI_RD_LEN_REG < g_Rom->GetRomSize()) { @@ -105,7 +106,7 @@ void CDMA::PI_DMA_READ() g_Recompiler->ClearRecompCode_Phys(g_Reg->PI_DRAM_ADDR_REG, g_Reg->PI_WR_LEN_REG, CRecompiler::Remove_DMA); } - ProtectMemory(ROM, g_Rom->GetRomSize(), MEM_READONLY); + ProtectMemory(ROM, g_Rom->GetRomSize(), MEM_READONLY); g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; g_Reg->MI_INTR_REG |= MI_INTR_PI; @@ -181,6 +182,75 @@ void CDMA::PI_DMA_WRITE() return; } + //64DD IPL ROM + if (g_Reg->PI_CART_ADDR_REG >= 0x06000000 && g_Reg->PI_CART_ADDR_REG <= 0x063FFFFF) + { + uint32_t i; + +#ifdef legacycode +#ifdef ROM_IN_MAPSPACE + if (WrittenToRom) + { + uint32_t OldProtect; + VirtualProtect(ROM, m_RomFileSize, PAGE_READONLY, &OldProtect); + } +#endif +#endif + + uint8_t * ROM = g_DDRom->GetRomAddress(); + uint8_t * RDRAM = g_MMU->Rdram(); + g_Reg->PI_CART_ADDR_REG -= 0x06000000; + if (g_Reg->PI_CART_ADDR_REG + PI_WR_LEN_REG < g_DDRom->GetRomSize()) + { + for (i = 0; i < PI_WR_LEN_REG; i++) + { + *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM + ((g_Reg->PI_CART_ADDR_REG + i) ^ 3)); + } + } + else if (g_Reg->PI_CART_ADDR_REG >= g_DDRom->GetRomSize()) + { + uint32_t cart = g_Reg->PI_CART_ADDR_REG - g_DDRom->GetRomSize(); + while (cart >= g_DDRom->GetRomSize()) + { + cart -= g_DDRom->GetRomSize(); + } + for (i = 0; i < PI_WR_LEN_REG; i++) + { + *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM + ((cart + i) ^ 3)); + } + } + else + { + uint32_t Len; + Len = g_DDRom->GetRomSize() - g_Reg->PI_CART_ADDR_REG; + for (i = 0; i < Len; i++) + { + *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM + ((g_Reg->PI_CART_ADDR_REG + i) ^ 3)); + } + for (i = Len; i < PI_WR_LEN_REG - Len; i++) + { + *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = 0; + } + } + g_Reg->PI_CART_ADDR_REG += 0x06000000; + + if (!g_System->DmaUsed()) + { + g_System->SetDmaUsed(true); + OnFirstDMA(); + } + if (g_Recompiler && g_System->bSMM_PIDMA()) + { + g_Recompiler->ClearRecompCode_Phys(g_Reg->PI_DRAM_ADDR_REG, g_Reg->PI_WR_LEN_REG, CRecompiler::Remove_DMA); + } + g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; + g_Reg->MI_INTR_REG |= MI_INTR_PI; + g_Reg->CheckInterrupts(); + //ChangeTimer(PiTimer,(int32_t)(PI_WR_LEN_REG * 8.9) + 50); + //ChangeTimer(PiTimer,(int32_t)(PI_WR_LEN_REG * 8.9)); + return; + } + if (g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG <= 0x08088000) { if (g_System->m_SaveUsing == SaveChip_Auto) diff --git a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp index 518f6d856..72e742ac2 100644 --- a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp +++ b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp @@ -194,6 +194,33 @@ bool CMipsMemoryVM::Initialize() m_Rom = g_Rom->GetRomAddress(); m_RomSize = g_Rom->GetRomSize(); } + + //64DD IPL + if (g_DDRom != NULL) + { + if (g_Settings->LoadBool(Game_LoadRomToMemory)) + { + m_DDRomMapped = true; + m_DDRom = m_RDRAM + 0x06000000; + m_DDRomSize = g_DDRom->GetRomSize(); + if (CommitMemory(m_DDRom, g_DDRom->GetRomSize(), MEM_READWRITE) == NULL) + { + WriteTrace(TraceN64System, TraceError, "Failed to Allocate Rom (Size: 0x%X)", g_DDRom->GetRomSize()); + FreeMemory(); + return false; + } + memcpy(m_DDRom, g_DDRom->GetRomAddress(), g_DDRom->GetRomSize()); + + ::ProtectMemory(m_DDRom, g_DDRom->GetRomSize(), MEM_READONLY); + } + else + { + m_DDRomMapped = false; + m_DDRom = g_DDRom->GetRomAddress(); + m_DDRomSize = g_DDRom->GetRomSize(); + } + } + CPifRam::Reset(); m_TLB_ReadMap = new size_t[0x100000]; @@ -928,6 +955,12 @@ void CMipsMemoryVM::Compile_LW(x86Reg Reg, uint32_t VAddr) sprintf(VarName, "m_RDRAM + %X", PAddr); MoveVariableToX86reg(PAddr + m_RDRAM, VarName, Reg); } + else if ((PAddr & 0xFF000000) == 0x06000000 && (PAddr - 0x06000000) < m_DDRomSize) + { + // read from ddrom + sprintf(VarName, "m_RDRAM + %X", PAddr); + MoveVariableToX86reg(PAddr + m_RDRAM, VarName, Reg); + } else { MoveConstToX86reg(((PAddr & 0xFFFF) << 16) | (PAddr & 0xFFFF), Reg); @@ -4682,8 +4715,16 @@ void CMipsMemoryVM::Load32SerialInterface(void) void CMipsMemoryVM::Load32CartridgeDomain1Address1(void) { - m_MemLookupValue.UW[0] = m_MemLookupAddress & 0xFFFF; - m_MemLookupValue.UW[0] = (m_MemLookupValue.UW[0] << 16) | m_MemLookupValue.UW[0]; + //64DD IPL ROM + if (g_DDRom != NULL && (m_MemLookupAddress & 0xFFFFFF) < g_MMU->m_DDRomSize) + { + m_MemLookupValue.UW[0] = *(uint32_t *)&g_MMU->m_DDRom[(m_MemLookupAddress & 0xFFFFFF)]; + } + else + { + m_MemLookupValue.UW[0] = m_MemLookupAddress & 0xFFFF; + m_MemLookupValue.UW[0] = (m_MemLookupValue.UW[0] << 16) | m_MemLookupValue.UW[0]; + } } void CMipsMemoryVM::Load32CartridgeDomain1Address3(void) diff --git a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h index bdfa958ab..542e4af5f 100644 --- a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h +++ b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h @@ -216,6 +216,11 @@ private: bool m_RomWrittenTo; uint32_t m_RomWroteValue; + //DDRom Information + bool m_DDRomMapped; + uint8_t * m_DDRom; + uint32_t m_DDRomSize; + //Current Half line void UpdateHalfLine(); uint32_t m_HalfLine; diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index 4ed0f7769..f6d5b9352 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -212,6 +212,12 @@ bool CN64System::RunFileImage(const char * FileLoc) WriteTrace(TraceN64System, TraceDebug, "Loading \"%s\"", FileLoc); if (g_Rom->LoadN64Image(FileLoc)) { + if (g_Rom->CicChipID() == CIC_NUS_8303) + { + //64DD IPL + g_DDRom = g_Rom; + } + g_System->RefreshGameSettings(); g_Settings->SaveString(Game_File, FileLoc); diff --git a/Source/Project64-core/N64System/SystemGlobals.cpp b/Source/Project64-core/N64System/SystemGlobals.cpp index edf1c2678..6ab72f809 100644 --- a/Source/Project64-core/N64System/SystemGlobals.cpp +++ b/Source/Project64-core/N64System/SystemGlobals.cpp @@ -21,6 +21,7 @@ CRegisters * g_Reg = NULL; //Current Register Set attacted to the g_MMU CNotification * g_Notify = NULL; CPlugins * g_Plugins = NULL; CN64Rom * g_Rom = NULL; //The current rom that this system is executing.. it can only execute one file at the time +CN64Rom * g_DDRom = NULL; //64DD IPL ROM CAudio * g_Audio = NULL; CSystemTimer * g_SystemTimer = NULL; CTransVaddr * g_TransVaddr = NULL; diff --git a/Source/Project64-core/N64System/SystemGlobals.h b/Source/Project64-core/N64System/SystemGlobals.h index 50951ffa5..cd279afaf 100644 --- a/Source/Project64-core/N64System/SystemGlobals.h +++ b/Source/Project64-core/N64System/SystemGlobals.h @@ -35,6 +35,7 @@ extern CPlugins * g_Plugins; class CN64Rom; extern CN64Rom * g_Rom; //The current rom that this system is executing.. it can only execute one file at the time +extern CN64Rom * g_DDRom; //64DD IPL ROM class CAudio; extern CAudio * g_Audio; From 14469402ed158dbbebf14b3b558868f5042ecc5f Mon Sep 17 00:00:00 2001 From: LegendOfDragoon Date: Mon, 18 Jan 2016 12:17:25 -0800 Subject: [PATCH 40/54] Disable Advanced Block Linking for Nuclear Strike 64 --- Config/Project64.rdb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Config/Project64.rdb b/Config/Project64.rdb index 947948476..e92e52520 100644 --- a/Config/Project64.rdb +++ b/Config/Project64.rdb @@ -4085,6 +4085,7 @@ Good Name=Nuclear Strike 64 (E) (M2) Internal Name=NUCLEARSTRIKE64 Status=Compatible Core Note=high system requirement +Linking=Off RDRAM Size=8 [8F50B845-D729D22F-C:44] @@ -4092,6 +4093,7 @@ Good Name=Nuclear Strike 64 (G) Internal Name=NUCLEARSTRIKE64 Status=Compatible Core Note=high system requirement +Linking=Off RDRAM Size=8 [4998DDBB-F7B7AEBC-C:45] @@ -4099,6 +4101,7 @@ Good Name=Nuclear Strike 64 (U) Internal Name=NUCLEARSTRIKE64 Status=Compatible Core Note=high system requirement +Linking=Off RDRAM Size=8 [D83BB920-CC406416-C:4A] From fdebac00681578e0b292cfefbe61e0549d7e5901 Mon Sep 17 00:00:00 2001 From: LegendOfDragoon Date: Mon, 18 Jan 2016 12:19:41 -0800 Subject: [PATCH 41/54] Enable Protect Memory for Indiana Jones This game apparently needs it, otherwise you get a sync error early on. --- Config/Project64.rdb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Config/Project64.rdb b/Config/Project64.rdb index e92e52520..2397b7d2a 100644 --- a/Config/Project64.rdb +++ b/Config/Project64.rdb @@ -2605,6 +2605,7 @@ RDRAM Size=8 RSP-JumpTableSize=3584 SMM-FUNC=0 SMM-PI DMA=0 +SMM-Protect=1 SMM-TLB=0 ViRefresh=1800 @@ -2624,6 +2625,7 @@ RDRAM Size=8 RSP-JumpTableSize=3584 SMM-FUNC=0 SMM-PI DMA=0 +SMM-Protect=1 SMM-TLB=0 ViRefresh=2050 From 53baf6d7924ae6793068511a050c96383549a2fd Mon Sep 17 00:00:00 2001 From: LegendOfDragoon Date: Mon, 18 Jan 2016 12:22:58 -0800 Subject: [PATCH 42/54] Fix issue with SPECIAL_DADDU --- Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp b/Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp index 000133433..7e478a0b4 100644 --- a/Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp +++ b/Source/Project64-core/N64System/Recompiler/RecompilerOps.cpp @@ -4876,7 +4876,7 @@ void CRecompilerOps::SPECIAL_DADDU() if (IsConst(source2)) { AddConstToX86Reg(GetMipsRegMapLo(m_Opcode.rd), GetMipsRegLo(source2)); - AddConstToX86Reg(GetMipsRegMapHi(m_Opcode.rd), GetMipsRegHi(source2)); + AdcConstToX86Reg(GetMipsRegMapHi(m_Opcode.rd), GetMipsRegHi(source2)); } else if (IsMapped(source2)) { From 0742e158e4a14f08a2672bdc4f79eba9919774bc Mon Sep 17 00:00:00 2001 From: AmbientMalice Date: Tue, 19 Jan 2016 13:34:40 +1000 Subject: [PATCH 43/54] Get Tamiya Racing 64 booting Game needs microcode check to render. Graphics bugged, but it renders. Will also update RDB to remove forced LLE. --- Config/Glide64.rdb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Config/Glide64.rdb b/Config/Glide64.rdb index 20e5717e6..03c38104d 100644 --- a/Config/Glide64.rdb +++ b/Config/Glide64.rdb @@ -4021,3 +4021,6 @@ buff_clear=0 force_microcheck=1 swapmode=0 +[37955E65-C6F2B7B3-C:0] +Good Name=Tamiya Racing 64 (Unreleased) +force_microcheck=1 From 65b4a0c287aab39218af6085f75ecc9ea22acbf0 Mon Sep 17 00:00:00 2001 From: AmbientMalice Date: Tue, 19 Jan 2016 14:08:11 +1000 Subject: [PATCH 44/54] Fix Waialae Country Club Not sure why framebuffer was disabled. Hope it wasn't for a reason. Game works better now. --- Config/Glide64.rdb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Config/Glide64.rdb b/Config/Glide64.rdb index 20e5717e6..d391648fe 100644 --- a/Config/Glide64.rdb +++ b/Config/Glide64.rdb @@ -3778,28 +3778,28 @@ depthmode=1 Good Name=Waialae Country Club - True Golf Classics (E) (M4) (V1.0) Internal Name=Waialae Country Club depthmode=0 -fb_smart=0 +fb_smart=1 wrap_big_tex=1 [0C5057AD-046E126E-C:50] Good Name=Waialae Country Club - True Golf Classics (E) (M4) (V1.1) Internal Name=Waialae Country Club depthmode=0 -fb_smart=0 +fb_smart=1 wrap_big_tex=1 [8066D58A-C3DECAC1-C:45] Good Name=Waialae Country Club - True Golf Classics (U) (V1.0) Internal Name=Waialae Country Club depthmode=0 -fb_smart=0 +fb_smart=1 wrap_big_tex=1 [DD318CE2-B73798BA-C:45] Good Name=Waialae Country Club - True Golf Classics (U) (V1.1) Internal Name=Waialae Country Club depthmode=0 -fb_smart=0 +fb_smart=1 wrap_big_tex=1 [650EFA96-30DDF9A7-C:50] From e580469ee1a51adfa80fec71dea5414938d3b1fc Mon Sep 17 00:00:00 2001 From: AmbientMalice Date: Tue, 19 Jan 2016 15:09:21 +1000 Subject: [PATCH 45/54] Fix War Gods pink outlines. I don't like forcing point-sample filtering, but it seems necessary here. --- Config/Glide64.rdb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Config/Glide64.rdb b/Config/Glide64.rdb index 20e5717e6..b5fad2ec8 100644 --- a/Config/Glide64.rdb +++ b/Config/Glide64.rdb @@ -3802,6 +3802,14 @@ depthmode=0 fb_smart=0 wrap_big_tex=1 +[D715CC70-271CF5D6-C:50] +Good Name=War Gods (E) +filtering=2 + +[F7FE28F6-C3F2ACC3-C:45] +Good Name=War Gods (U) +filtering=2 + [650EFA96-30DDF9A7-C:50] Good Name=Wave Race 64 (E) (M2) Internal Name=WAVE RACE 64 From 4f0cc5eaf2d75dbf7024ed9f699ec067c6f0f6c3 Mon Sep 17 00:00:00 2001 From: Ambient_Malice Date: Tue, 19 Jan 2016 18:00:02 +1000 Subject: [PATCH 46/54] The big one Huge RDB overhaul with typos fixed, stability & compatibility fixes, and more accurate descriptions. Needs more work, of course, but it's a start. --- Config/Project64.rdb | 1108 ++++++++++++++---------------------------- 1 file changed, 362 insertions(+), 746 deletions(-) diff --git a/Config/Project64.rdb b/Config/Project64.rdb index 2397b7d2a..1823ebdfe 100644 --- a/Config/Project64.rdb +++ b/Config/Project64.rdb @@ -168,7 +168,7 @@ RDRAM Size=8 Good Name=1080 Snowboarding (E) (M4) Internal Name=1080 SNOWBOARDING Status=Compatible -Plugin Note=[video] framebuffer:screen (see GameFAQ) +Plugin Note=[Glide64] framebuffer:screen Culling=1 Emulate Clear=1 @@ -187,14 +187,12 @@ Self Texture=1 Good Name=40 Winks (E) (M3) (Beta) Internal Name=40 WINKS Status=Compatible -Plugin Note=[video] errors:menus, actors during cutscenes black; use Force Alpha Blending RDRAM Size=8 [B98BA456-5B2B76AF-C:4A] Good Name=64 de Hakken!! Tamagotchi - Minna de Tamagotchi World (J) Internal Name=ÐÝÅÃÞÀϺޯÁÜ°ÙÄÞ Status=Issues (plugin) -Plugin Note=[video] use Glide64; errors:various Counter Factor=1 Save Type=FlashRam @@ -207,7 +205,6 @@ Status=Compatible Good Name=64 Oozumou (J) Internal Name=64 OHZUMOU Status=Compatible -Plugin Note=[video] slow in menus Counter Factor=1 [85C18B16-DF9622AF-C:4A] @@ -265,17 +262,16 @@ ViRefresh=2200 Good Name=AeroFighters Assault (E) (M3) Internal Name=AERO FIGHTERS ASSAUL Status=Compatible -Core Note=high system requirement [1B598BF1-ECA29B45-C:45] Good Name=AeroFighters Assault (U) Internal Name=AERO FIGHTERS ASSAUL Status=Compatible -Core Note=high system requirement [D83045C8-F29D3A36-C:50] Good Name=AeroGauge (E) (M3) Internal Name=AEROGAUGE +Status=Compatible [B00903C9-3916C146-C:4A] Good Name=AeroGauge (J) (V1.0) (Kiosk Demo) @@ -381,13 +377,11 @@ Status=Compatible Good Name=All-Star Baseball '99 (E) Internal Name=All-Star Baseball 99 Status=Compatible -Plugin Note=[video] errors:menus,HUD; use Glide64 [C43E23A7-40B1681A-C:45] Good Name=All-Star Baseball '99 (U) Internal Name=All Star Baseball 99 Status=Compatible -Plugin Note=[video] errors:menus,HUD; use Glide64 [A19F8089-77884B51-C:50] Good Name=All-Star Baseball 2000 (E) @@ -410,8 +404,7 @@ ViRefresh=1400 [8F0CC36D-C738259E-C:45] Good Name=Animal Forest [T-90%] -Status=Issues (plugin) -Plugin Note=[video] errors:pause menu +Status=Compatible Save Type=FlashRam SMM-Protect=1 @@ -419,6 +412,7 @@ SMM-Protect=1 Good Name=Armorines - Project S.W.A.R.M. (E) Internal Name=Armorines Project S. Status=Compatible +Plugin Note=[video] HLE missing lighting Culling=1 AudioResetOnLoad=Yes RDRAM Size=8 @@ -427,6 +421,7 @@ RDRAM Size=8 Good Name=Armorines - Project S.W.A.R.M. (G) Internal Name=Armorines Project S. Status=Compatible +Plugin Note=[video] HLE missing lighting AudioResetOnLoad=Yes RDRAM Size=8 @@ -434,6 +429,7 @@ RDRAM Size=8 Good Name=Armorines - Project S.W.A.R.M. (U) Internal Name=Armorines Project S. Status=Compatible +Plugin Note=[video] HLE missing lighting AudioResetOnLoad=Yes RDRAM Size=8 @@ -441,7 +437,6 @@ RDRAM Size=8 Good Name=Army Men - Air Combat (U) Internal Name=ARMYMENAIRCOMBAT Status=Compatible -Plugin Note=[video] errors:missile on level2+ AudioResetOnLoad=Yes RDRAM Size=8 @@ -487,9 +482,7 @@ Status=Compatible [E340A49C-74318D41-C:4A] Good Name=Baku Bomberman (J) Internal Name=BAKU-BOMBERMAN -Status=Issues (plugin) -Core Note=(see GameFAQ) -Plugin Note=[video] errors:various (see GameFAQ) +Status=Compatible Clear Frame=1 Culling=1 @@ -497,7 +490,7 @@ Culling=1 Good Name=Baku Bomberman 2 (J) Internal Name=BAKUBOMB2 Status=Issues (plugin) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] errors:various [DF98B95D-58840978-C:4A] Good Name=Bakuretsu Muteki Bangaioh (J) @@ -514,7 +507,7 @@ Status=Compatible Good Name=Banjo to Kazooie no Daibouken (J) Internal Name=Banjo-Kazooie Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] need per-frame FB for puzzle pieces Culling=1 Self Texture=1 RDRAM Size=8 @@ -523,8 +516,7 @@ RDRAM Size=8 Good Name=Banjo to Kazooie no Daibouken 2 (J) Internal Name=BANJO KAZOOIE 2 Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] need per-frame FB for puzzle pieces Save Type=16kbit Eeprom RDRAM Size=8 @@ -532,7 +524,7 @@ RDRAM Size=8 Good Name=Banjo-Kazooie (E) (M3) Internal Name=Banjo-Kazooie Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] need per-frame FB for puzzle pieces Culling=1 Self Texture=1 RDRAM Size=8 @@ -541,7 +533,7 @@ RDRAM Size=8 Good Name=Banjo-Kazooie (U) (V1.0) Internal Name=Banjo-Kazooie Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] need per-frame FB for puzzle pieces Culling=1 Primary Frame Buffer=1 Self Texture=1 @@ -551,7 +543,7 @@ RDRAM Size=8 Good Name=Banjo-Kazooie (U) (V1.1) Internal Name=Banjo-Kazooie Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] need per-frame FB for puzzle pieces Culling=1 Primary Frame Buffer=1 Self Texture=1 @@ -561,8 +553,7 @@ RDRAM Size=8 Good Name=Banjo-Tooie (A) Internal Name=BANJO TOOIE Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] need per-frame FB for puzzle pieces Save Type=16kbit Eeprom RDRAM Size=8 @@ -570,8 +561,7 @@ RDRAM Size=8 Good Name=Banjo-Tooie (E) (M4) Internal Name=BANJO TOOIE Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] need per-frame FB for puzzle pieces Culling=1 Save Type=16kbit Eeprom Self Texture=1 @@ -581,8 +571,7 @@ RDRAM Size=8 Good Name=Banjo-Tooie (U) Internal Name=BANJO TOOIE Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] need per-frame FB for puzzle pieces Culling=1 Save Type=16kbit Eeprom Self Texture=1 @@ -592,7 +581,6 @@ RDRAM Size=8 Good Name=Bass Hunter 64 (E) Internal Name=BASS HUNTER 64 Status=Compatible -Plugin Note=[video] errors:HUD; use Glide64 Counter Factor=1 [D76333AC-0CB6219D-C:4A] @@ -605,7 +593,6 @@ Counter Factor=1 Good Name=Bassmasters 2000 (U) Internal Name=BASSMASTERS2000 Status=Compatible -Plugin Note=[video] missing:player textures in menu; use Glide64 Counter Factor=1 Culling=1 RDRAM Size=8 @@ -651,7 +638,7 @@ RDRAM Size=8 Good Name=Beetle Adventure Racing (J) Internal Name=BEETLE ADVENTURE JP Status=Compatible -Plugin Note=[video] errors:various; use Glide64 +Plugin Note=[Glide64] VI scrolling; fog wrong Counter Factor=3 Culling=1 ViRefresh=1400 @@ -660,7 +647,7 @@ ViRefresh=1400 Good Name=Beetle Adventure Racing! (E) (M3) Internal Name=Beetle Adventure Rac Status=Compatible -Plugin Note=[video] errors:various; use Glide64 +Plugin Note=[Glide64] VI scrolling; fog wrong Counter Factor=3 ViRefresh=1450 @@ -668,7 +655,7 @@ ViRefresh=1450 Good Name=Beetle Adventure Racing! (U) (M3) Internal Name=Beetle Adventure Rac Status=Compatible -Plugin Note=[video] errors:various; use Glide64 +Plugin Note=[Glide64] VI scrolling; fog wrong Counter Factor=3 Culling=1 ViRefresh=1400 @@ -677,7 +664,6 @@ ViRefresh=1400 Good Name=Big Mountain 2000 (U) Internal Name=Big Mountain 2000 Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin [AB7C101D-EC58C8B0-C:50] Good Name=Bio F.R.E.A.K.S. (E) @@ -697,8 +683,7 @@ RDRAM Size=8 Good Name=Biohazard 2 (J) Internal Name=BioHazard II Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] depth problem (use Glide64 RDRAM Size=8 in main RDB, otherwise Glide64 will not render all the background in some scenes) +Plugin Note=[Glide64] some glitched backgrounds 32bit=No AudioResetOnLoad=Yes Counter Factor=1 @@ -708,28 +693,24 @@ Linking=Off Good Name=Blast Corps (E) Internal Name=Blast Corps Status=Compatible -Plugin Note=[video] errors:menu textures; use Glide64 32bit=No [7C647C25-D9D901E6-C:45] Good Name=Blast Corps (U) (V1.0) Internal Name=Blast Corps Status=Compatible -Plugin Note=[video] errors:menu textures; use Glide64 32bit=No [7C647E65-1948D305-C:45] Good Name=Blast Corps (U) (V1.1) Internal Name=Blast Corps Status=Compatible -Plugin Note=[video] errors:menu textures; use Glide64 32bit=No [65234451-EBD3346F-C:4A] Good Name=Blast Dozer (J) Internal Name=Blastdozer Status=Compatible -Plugin Note=[video] errors:menu textures; use Glide64 32bit=No [D571C883-822D3FCF-C:50] @@ -746,7 +727,7 @@ Status=Compatible Good Name=Body Harvest (E) (M3) Internal Name=Body Harvest Status=Compatible -Plugin Note=[video] errors:clipping (see GameFAQ) +Plugin Note=[video] Broken collision Clear Frame=2 Counter Factor=1 Culling=1 @@ -756,7 +737,7 @@ Delay SI=Yes Good Name=Body Harvest (U) Internal Name=BODY HARVEST Status=Compatible -Plugin Note=[video] errors:clipping (see GameFAQ) +Plugin Note=[video] Broken collision Clear Frame=2 Counter Factor=1 Culling=1 @@ -780,8 +761,7 @@ Status=Compatible [5A160336-BC7B37B0-C:50] Good Name=Bomberman 64 (E) Internal Name=BOMBERMAN64E -Status=Issues (plugin) -Plugin Note=[video] errors:various (see GameFAQ) +Status=Compatible Clear Frame=1 [DF6FF0F4-29D14238-C:4A] @@ -793,8 +773,7 @@ Culling=1 [F568D51E-7E49BA1E-C:45] Good Name=Bomberman 64 (U) Internal Name=BOMBERMAN64U -Status=Issues (plugin) -Plugin Note=[video] errors:various (see GameFAQ) +Status=Compatible Clear Frame=1 Culling=1 @@ -802,7 +781,7 @@ Culling=1 Good Name=Bomberman 64 - The Second Attack! (U) Internal Name=BOMBERMAN64U2 Status=Issues (plugin) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] errors:various RDRAM Size=8 SMM-Cache=0 SMM-FUNC=0 @@ -829,14 +808,12 @@ Status=Compatible Good Name=Bottom of the 9th (U) Internal Name=Bottom of the 9th Status=Compatible -Plugin Note=[video] missing:intro screens; use Glide64 Culling=1 [1E22CF2E-42AAC813-C:45] Good Name=Brunswick Circuit Pro Bowling (U) Internal Name=BRUNSWICKBOWLING Status=Compatible -Plugin Note=[video] errors:resolution; use Glide64 Culling=1 RDRAM Size=8 @@ -1071,13 +1048,11 @@ Counter Factor=1 Good Name=Chopper Attack (E) Internal Name=CHOPPER_ATTACK Status=Compatible -Plugin Note=[video] (see GameFAQ) [214CAD94-BE1A3B24-C:45] Good Name=Chopper Attack (U) Internal Name=CHOPPER_ATTACK Status=Compatible -Plugin Note=[video] (see GameFAQ) [2BCCF9C4-403D9F6F-C:4A] Good Name=Choro Q 64 (J) @@ -1088,19 +1063,17 @@ Status=Compatible Good Name=Choro Q 64 II - Hacha Mecha Grand Prix Race (J) Internal Name=Á®ÛQ64 2 Status=Compatible -Plugin Note=[video] framebuffer:menus,tv monitor +Plugin Note=[Glide64] framebuffer:menus,tv monitor [8ACE6683-3FBA426E-C:4A] Good Name=Chou Kuukan Nighter Pro Yakyuu King (J) Internal Name=PROYAKYUKING Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin [3A180FF4-5C8E8AF7-C:4A] Good Name=Chou Kuukan Nighter Pro Yakyuu King 2 (J) Internal Name=ÌßÛÔ·­³·Ý¸Þ2 Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin [A7941528-61F1199D-C:4A] Good Name=Chou Snobow Kids (J) @@ -1111,8 +1084,6 @@ Status=Compatible Good Name=City Tour Grandprix - Zennihon GT Senshuken (J) Internal Name=CITY TOUR GP Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] errors:map,speedo Counter Factor=1 Delay SI=Yes RDRAM Size=8 @@ -1121,34 +1092,29 @@ RDRAM Size=8 Good Name=Clay Fighter - Sculptor's Cut (U) Internal Name=Clayfighter SC Status=Compatible -Plugin Note=[video] (see GameFAQ) [8E9692B3-4264BB2A-C:50] Good Name=Clay Fighter 63 1-3 (E) Internal Name=CLAYFIGHTER 63 Status=Compatible -Plugin Note=[video] (see GameFAQ) Clear Frame=2 [F03C24CA-C5237BCC-C:45] Good Name=Clay Fighter 63 1-3 (U) Internal Name=CLAYFIGHTER 63 Status=Compatible -Plugin Note=[video] (see GameFAQ) Clear Frame=2 [2B6FA7C0-09A71225-C:45] Good Name=Clay Fighter 63 1-3 (U) (beta) Internal Name=CLAYFIGHTER 63 Status=Compatible -Plugin Note=[video] (see GameFAQ) Clear Frame=2 [AE5B9465-C54D6576-C:50] Good Name=Command & Conquer (E) (M2) Internal Name=Command&Conquer Status=Compatible -Plugin Note=[video] errors:textures in briefings Culling=1 RDRAM Size=8 @@ -1156,14 +1122,12 @@ RDRAM Size=8 Good Name=Command & Conquer (G) Internal Name=Command&Conquer Status=Compatible -Plugin Note=[video] errors:textures in briefings Culling=1 [95286EB4-B76AD58F-C:45] Good Name=Command & Conquer (U) Internal Name=Command&Conquer Status=Compatible -Plugin Note=[video] errors:textures in briefings Culling=1 RDRAM Size=8 @@ -1171,8 +1135,7 @@ RDRAM Size=8 Good Name=Conker's Bad Fur Day (E) Internal Name=CONKER BFD Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] broken mipmapping, certain FB effects missing. 32bit=No Clear Frame=2 Culling=1 @@ -1189,7 +1152,7 @@ ViRefresh=2200 Good Name=Conker's Bad Fur Day (U) (Debug Version) Internal Name=CONKER BFD DEBUG Status=Compatible -Plugin Note=[video] errors:various +Plugin Note=[Glide64] broken mipmapping, certain FB effects missing. 32bit=No Clear Frame=2 Culling=1 @@ -1206,7 +1169,7 @@ ViRefresh=2200 Good Name=Conker's Bad Fur Day (U) (ECTS Demo) Internal Name=CBFD ECTS Status=Compatible -Plugin Note=[video] errors:various +Plugin Note=[Glide64] broken mipmapping, certain FB effects missing. 32bit=No Clear Frame=2 Culling=1 @@ -1224,8 +1187,7 @@ ViRefresh=2200 Good Name=Conker's Bad Fur Day (U) Internal Name=CONKER BFD Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] broken mipmapping, certain FB effects missing. 32bit=No Clear Frame=2 Culling=1 @@ -1248,16 +1210,14 @@ Culling=1 Good Name=Cruis'n USA (E) Internal Name=Cruis'n USA Status=Compatible -Core Note=high system requirement -Plugin Note=[video] missing:dissolve effect (see GameFAQ) +Plugin Note=[Glide64] missing:dissolve effect Delay SI=Yes [FF2F2FB4-D161149A-C:45] Good Name=Cruis'n USA (U) (V1.0) Internal Name=Cruis'n USA Status=Compatible -Core Note=high system requirement -Plugin Note=[video] missing:dissolve effect (see GameFAQ) +Plugin Note=[Glide64] missing:dissolve effect Culling=1 Delay SI=Yes @@ -1265,16 +1225,14 @@ Delay SI=Yes Good Name=Cruis'n USA (U) (V1.1) Internal Name=Cruis'n USA Status=Compatible -Core Note=high system requirement -Plugin Note=[video] missing:dissolve effect (see GameFAQ) +Plugin Note=[Glide64] missing:dissolve effect Delay SI=Yes [B3402554-7340C004-C:45] Good Name=Cruis'n USA (U) (V1.2) Internal Name=Cruis'n USA Status=Compatible -Core Note=high system requirement -Plugin Note=[video] missing:dissolve effect (see GameFAQ) +Plugin Note=[Glide64] missing:dissolve effect Delay SI=Yes [83F3931E-CB72223D-C:50] @@ -1304,34 +1262,30 @@ Save Type=16kbit Eeprom Good Name=CyberTiger (E) Internal Name=CyberTiger Status=Issues (core) -Core Note=hangs (see GameFAQ) +Core Note=hangs exiting pause menu [E8FC8EA1-9F738391-C:45] Good Name=CyberTiger (U) Internal Name=CyberTiger Status=Issues (core) -Core Note=hangs (see GameFAQ) +Core Note=hangs exiting pause menu //================ D ================ [7188F445-84410A68-C:4A] Good Name=Dance Dance Revolution - Disney Dancing Museum (J) Internal Name=DDR DISNEY D MUSEUM -Status=Issues (plugin) -Plugin Note=[video] slow +Status=Compatible [7ED67CD4-B4415E6D-C:50] Good Name=Dark Rift (E) Internal Name=DARK RIFT -Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] slow in cutscenes +Status=Compatible +Culling=1 [A4A52B58-23759841-C:45] Good Name=Dark Rift (U) Internal Name=DARK RIFT -Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] slow in cutscenes +Status=Compatible Culling=1 [F5363349-DBF9D21B-C:45] @@ -1366,14 +1320,12 @@ CRC-Recalc=Yes Good Name=Destruction Derby 64 (E) (M3) Internal Name=DESTRUCT DERBY Status=Compatible -Core Note=high system requirement Counter Factor=1 [DEE584A2-0F161187-C:45] Good Name=Destruction Derby 64 (U) Internal Name=DESTRUCT DERBY Status=Compatible -Core Note=high system requirement Counter Factor=1 [76712159-35666812-C:0] @@ -1436,7 +1388,6 @@ RDRAM Size=8 Good Name=Disney's Tarzan (E) Internal Name=TARZAN Status=Compatible -Plugin Note=[video] missing:items; use 1.5.2 plugin Audio Signal=Yes Counter Factor=1 @@ -1444,7 +1395,6 @@ Counter Factor=1 Good Name=Disney's Tarzan (F) Internal Name=TARZAN Status=Compatible -Plugin Note=[video] missing:items; use 1.5.2 plugin Audio Signal=Yes Counter Factor=1 @@ -1452,7 +1402,6 @@ Counter Factor=1 Good Name=Disney's Tarzan (G) Internal Name=TARZAN Status=Compatible -Plugin Note=[video] missing:items; use 1.5.2 plugin Audio Signal=Yes Counter Factor=1 @@ -1460,7 +1409,6 @@ Counter Factor=1 Good Name=Disney's Tarzan (U) Internal Name=TARZAN Status=Compatible -Plugin Note=[video] missing:items; use 1.5.2 plugin Audio Signal=Yes Counter Factor=1 @@ -1482,8 +1430,8 @@ Save Type=4kbit Eeprom Good Name=Donkey Kong 64 (E) Internal Name=DONKEY KONG 64 Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Core Note=Polygon Tearing +Plugin Note=[Glide64] fairy bug; transitions 32bit=No Counter Factor=1 Culling=1 @@ -1494,8 +1442,8 @@ Save Type=16kbit Eeprom Good Name=Donkey Kong 64 (J) Internal Name=DONKEY KONG 64 Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Core Note=Polygon Tearing +Plugin Note=[Glide64] fairy bug; transitions 32bit=No Counter Factor=1 RDRAM Size=8 @@ -1505,8 +1453,8 @@ Save Type=16kbit Eeprom Good Name=Donkey Kong 64 (U) Internal Name=DONKEY KONG 64 Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Core Note=Polygon Tearing +Plugin Note=[Glide64] fairy bug; transitions 32bit=No Counter Factor=1 Culling=1 @@ -1519,8 +1467,7 @@ Save Type=16kbit Eeprom Good Name=Donkey Kong 64 (U) (Kiosk Demo) Internal Name=D K DISPLAY Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Core Note=Polygon Tearing 32bit=No Counter Factor=1 RDRAM Size=8 @@ -1530,21 +1477,18 @@ Save Type=16kbit Eeprom Good Name=Doom 64 (E) Internal Name=Doom64 Status=Compatible -Plugin Note=[video] (see GameFAQ) 32bit=No [7AA65B36-FDCEE5AD-C:4A] Good Name=Doom 64 (J) Internal Name=DOOM64 Status=Compatible -Plugin Note=[video] (see GameFAQ) 32bit=No [A83E101A-E937B69D-C:45] Good Name=Doom 64 (U) (V1.0) Internal Name=Doom64 Status=Compatible -Plugin Note=[video] (see GameFAQ) 32bit=No Culling=1 @@ -1552,15 +1496,13 @@ Culling=1 Good Name=Doom 64 (U) (V1.1) Internal Name=Doom64 Status=Compatible -Plugin Note=[video] (see GameFAQ) 32bit=No Culling=1 [BFF7B1C2-AEBF148E-C:4A] Good Name=Doraemon - Nobita to 3tsu no Seireiseki (J) Internal Name=ÄÞ×´ÓÝ Ð¯Âɾ²Ú²¾· -Status=Issues (plugin) -Plugin Note=[video] missing:text,character colour +Status=Compatible [B6306E99-B63ED2B2-C:4A] Good Name=Doraemon 2 - Nobita to Hikari no Shinden (J) @@ -1578,8 +1520,7 @@ Save Type=16kbit Eeprom [BD8E206D-98C35E1C-C:4A] Good Name=Doubutsu no Mori (J) Internal Name=DOUBUTSUNOMORI -Status=Issues (plugin) -Plugin Note=[video] errors:pause menu +Status=Compatible Save Type=FlashRam SMM-Protect=1 @@ -1595,7 +1536,6 @@ RDRAM Size=8 Good Name=Dragon Sword (E) (Unreleased Alpha) Internal Name=DragonStorm Status=Compatible -Plugin Note=[video] text missing; use Glide64 [B6524461-ED6D04B1-C:50] Good Name=Dual Heroes (E) @@ -1619,6 +1559,7 @@ RDRAM Size=8 Good Name=Duck Dodgers Starring Daffy Duck (U) (M3) Internal Name=LT DUCK DODGERS Status=Compatible +Core Note=Incorrect speech timing Counter Factor=1 [DC36626A-3F3770CB-C:50] @@ -1652,25 +1593,24 @@ RDRAM Size=8 Good Name=Duke Nukem 64 (E) Internal Name=DUKE NUKEM Status=Compatible -Plugin Note=[video] depth problem; use Glide64 +Culling=1 [FF14C1DA-167FDE92-C:45] Good Name=Duke Nukem 64 (Prototype) Internal Name=duke Status=Compatible -Plugin Note=[video] depth problem; use Glide64 +Culling=1 [1E12883D-D3B92718-C:46] Good Name=Duke Nukem 64 (F) Internal Name=DUKE NUKEM Status=Compatible -Plugin Note=[video] depth problem; use Glide64 +Culling=1 [A273AB56-DA33DB9A-C:45] Good Name=Duke Nukem 64 (U) Internal Name=DUKE NUKEM Status=Compatible -Plugin Note=[video] depth problem; use Glide64 Culling=1 //================ E ================ @@ -1678,13 +1618,12 @@ Culling=1 Good Name=Earthworm Jim 3D (E) (M6) Internal Name=EARTHWORM JIM 3D Status=Compatible -Plugin Note=[video] (see GameFAQ) +Culling=1 [DF574191-9EB5123D-C:45] Good Name=Earthworm Jim 3D (U) Internal Name=EARTHWORM JIM 3D Status=Compatible -Plugin Note=[video] (see GameFAQ) Culling=1 [8C38E5DB-B37C27D7-C:50] @@ -1703,7 +1642,7 @@ RDRAM Size=8 Good Name=Eikou no Saint Andrews (J) Internal Name=´²º³É¾ÝıÝÄÞØ­°½ Status=Issues (plugin) -Plugin Note=[video] errors:sky,various (see GameFAQ) +Plugin Note=[Glide64] needs per-frame FB [6D9D1FE4-84D10BEA-C:4A] Counter Factor=1 @@ -1726,15 +1665,13 @@ Status=Compatible Good Name=Eltale Monsters (J) Internal Name=Eltail Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] incorrect texture filtering Clear Frame=2 [202A8EE4-83F88B89-C:50] Good Name=Excitebike 64 (E) Internal Name=EXCITEBIKE64 Status=Compatible -Core Note=high system requirement -Plugin Note=[video] errors:various; use Glide64 Counter Factor=1 RDRAM Size=8 Save Type=16kbit Eeprom @@ -1743,8 +1680,6 @@ Save Type=16kbit Eeprom Good Name=Excitebike 64 (J) Internal Name=EXCITEBIKE64 Status=Compatible -Core Note=high system requirement -Plugin Note=[video] errors:various; use Glide64 RDRAM Size=8 Save Type=16kbit Eeprom @@ -1752,8 +1687,6 @@ Save Type=16kbit Eeprom Good Name=Excitebike 64 (U) (V1.0) Internal Name=EXCITEBIKE64 Status=Compatible -Core Note=high system requirement -Plugin Note=[video] errors:various; use Glide64 Counter Factor=1 RDRAM Size=8 Save Type=16kbit Eeprom @@ -1762,7 +1695,6 @@ Save Type=16kbit Eeprom Good Name=Excitebike 64 (U) (V1.1) Internal Name=EXCITEBIKE64 Status=Compatible -Core Note=high system requirement Counter Factor=1 RDRAM Size=8 Save Type=16kbit Eeprom @@ -1771,8 +1703,6 @@ Save Type=16kbit Eeprom Good Name=Excitebike 64 (U) (Kiosk Demo) Internal Name=EXCITEBIKE64 Status=Compatible -Core Note=high system requirement -Plugin Note=[video] errors:various; use Glide64 RDRAM Size=8 Save Type=16kbit Eeprom @@ -1780,19 +1710,19 @@ Save Type=16kbit Eeprom Good Name=Extreme-G (E) (M5) Internal Name=extreme_g Status=Compatible -Plugin Note=[video] errors:HUD (minor) +Plugin Note=[Glide64] minor issues [EE802DC4-690BD57D-C:4A] Good Name=Extreme-G (J) Internal Name=EXTREME-G Status=Compatible -Plugin Note=[video] errors:HUD (minor) +Plugin Note=[Glide64] minor issues [FDA245D2-A74A3D47-C:45] Good Name=Extreme-G (U) Internal Name=extremeg Status=Compatible -Plugin Note=[video] errors:HUD (minor) +Plugin Note=[Glide64] minor issues [1185EC85-4B5A7731-C:50] Good Name=Extreme-G XG2 (E) (M5) @@ -1815,7 +1745,6 @@ Status=Compatible Good Name=F-1 Pole Position 64 (E) (M3) Internal Name=F1 POLE POSITION 64 Status=Compatible -Plugin Note=[video] errors:menus; use Glide64 32bit=No Clear Frame=1 @@ -1823,7 +1752,6 @@ Clear Frame=1 Good Name=F-1 Pole Position 64 (U) (M3) Internal Name=F1 POLE POSITION 64 Status=Compatible -Plugin Note=[video] errors:menus; use Glide64 32bit=No Clear Frame=1 Culling=1 @@ -1870,8 +1798,7 @@ RDRAM Size=8 Good Name=F-ZERO X (E) Internal Name=F-ZERO X Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] missing menu effects. 32bit=No Clear Frame=2 @@ -1879,8 +1806,7 @@ Clear Frame=2 Good Name=F-ZERO X (J) Internal Name=F-ZERO X Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] missing menu effects 32bit=No Culling=1 @@ -1888,8 +1814,7 @@ Culling=1 Good Name=F-ZERO X (U) Internal Name=F-ZERO X Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] missing effects 32bit=No Clear Frame=2 Culling=1 @@ -1897,8 +1822,7 @@ Culling=1 [BBFDEC37-D93B9EC0-C:4A] Good Name=F-ZERO X + Expansion Kit (J) [CART HACK] Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] missing effects 32bit=No RDRAM Size=8 Culling=1 @@ -1907,8 +1831,7 @@ AllowROMWrites=Yes [C6E39C0A-D2726676-C:45] Good Name=F-ZERO X + Expansion Kit (U) [CART HACK] Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] missing effects 32bit=No RDRAM Size=8 Culling=1 @@ -1918,15 +1841,15 @@ AllowROMWrites=Yes Good Name=F1 Racing Championship (E) (M5) Internal Name=F1RacingChampionship Status=Compatible -Plugin Note=[video] errors:resolution issues +Plugin Note=[video] text corruption Culling=1 RDRAM Size=8 [53CCAD28-AEA6EDA2-C:45] Good Name=F1 Racing Championship (U) Internal Name=F1RacingChampionship -Status=Issues (plugin) -Plugin Note=[video] errors:resolution issues +Status=Compatible +Plugin Note=[video] text corrupt Culling=1 RDRAM Size=8 @@ -1934,31 +1857,25 @@ RDRAM Size=8 Good Name=Famista 64 (J) Internal Name=̧нÀ 64 Status=Compatible -Plugin Note=[video] missing:ground texture in battle +Plugin Note=[video] missing environment in battle Clear Frame=1 [0E31EDF0-C37249D5-C:50] Good Name=FIFA - Road to World Cup 98 (E) (M7) Internal Name=FIFA: RTWC 98 Status=Compatible -Core Note=high system requirement -Plugin Note=[video] errors:pitch; use Glide64 32bit=No [CB1ACDDE-CF291DF2-C:45] Good Name=FIFA - Road to World Cup 98 (U) (M7) Internal Name=FIFA: RTWC 98 Status=Compatible -Core Note=high system requirement -Plugin Note=[video] errors:pitch; use Glide64 32bit=No [F5733C67-17A3973A-C:4A] Good Name=FIFA - Road to World Cup 98 - World Cup heno Michi (J) Internal Name=RoadToWorldCup98 Status=Compatible -Core Note=high system requirement -Plugin Note=[video] errors:pitch; use Glide64 32bit=No [0198A651-FC219D84-C:50] @@ -1989,37 +1906,31 @@ Core Note=no sound, unhandled opcode; use older PJ64 Good Name=Fighter Destiny 2 (U) Internal Name=FIGHTER DESTINY2 Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin [36F1C74B-F2029939-C:50] Good Name=Fighter's Destiny (E) Internal Name=Fighter's Destiny Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin [0C41F9C2-01717A0D-C:46] Good Name=Fighter's Destiny (F) Internal Name=Fighter's Destiny Fr Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin [FE94E570-E4873A9C-C:44] Good Name=Fighter's Destiny (G) Internal Name=Fighter's Destiny Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin [52F78805-8B8FCAB7-C:45] Good Name=Fighter's Destiny (U) Internal Name=Fighter's Destiny Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin [49E46C2D-7B1A110C-C:4A] Good Name=Fighting Cup (J) Internal Name=Fighting Cup Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin [66CF0FFE-AD697F9C-C:50] Good Name=Fighting Force 64 (E) @@ -2037,14 +1948,13 @@ Counter Factor=1 Good Name=Flying Dragon (E) Internal Name=FLYING DRAGON Status=Compatible -Plugin Note=[video] errors:various (minor) Counter Factor=1 +Culling=1 [A92D52E5-1D26B655-C:45] Good Name=Flying Dragon (U) Internal Name=FLYING DRAGON Status=Compatible -Plugin Note=[video] errors:various (minor) Counter Factor=1 Culling=1 @@ -2052,21 +1962,18 @@ Culling=1 Good Name=Forsaken 64 (E) (M4) Internal Name=Forsaken Status=Compatible -Core Note=timing (see GameFAQ) RDRAM Size=8 [C3CD76FF-9B9DCBDE-C:44] Good Name=Forsaken 64 (G) Internal Name=Forsaken Status=Compatible -Core Note=timing (see GameFAQ) RDRAM Size=8 [9E330C01-8C0314BA-C:45] Good Name=Forsaken 64 (U) Internal Name=Forsaken Status=Compatible -Core Note=timing (see GameFAQ) RDRAM Size=8 [3261D479-ED0DBC25-C:45] @@ -2078,8 +1985,8 @@ Culling=1 [F774EAEE-F0D8B13E-C:4A] Good Name=Fushigi no Dungeon - Fuurai no Shiren 2 - Oni Shuurai! Shiren Jou! (J) Internal Name=F3 フウライノシレン2 -Status=Issues (plugin) -Plugin Note=[video] missing:graphics (see GameFAQ) +Status=Issues (Core) +Core Note= constant SRAM use Counter Factor=1 32bit=No @@ -2116,7 +2023,6 @@ Status=Compatible Good Name=Ganbare Goemon - Neo Momoyama Bakufu no Odori (J) Internal Name=GANBAKE GOEMON Status=Compatible -Plugin Note=[video] slow in places; use 1.6 plugin Culling=1 RDRAM Size=8 @@ -2124,33 +2030,29 @@ RDRAM Size=8 Good Name=Ganbare! Nippon! Olympics 2000 (J) Internal Name=OLYMPIC 2000 Status=Compatible -Core Note=high system requirement -Plugin Note=[video] missing:motion blur; use Glide64 (see GameFAQ) 32bit=No RDRAM Size=8 [D543BCD6-2BA5E256-C:50] Good Name=Gauntlet Legends (E) Internal Name=GAUNTLET LEGENDS -Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] missing:various (see GameFAQ) +Status=Issues (mixed) +Plugin Note=[Glide64] missing:various RDRAM Size=8 [70B0260E-6716D04C-C:4A] Good Name=Gauntlet Legends (J) Internal Name=GAUNTLET LEGENDS -Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] missing:various (see GameFAQ) +Status=Issues (mixed) +Plugin Note=[Glide64] missing:various RDRAM Size=8 [729B5E32-B728D980-C:45] Good Name=Gauntlet Legends (U) Internal Name=GAUNTLET LEGENDS -Status=Issues (plugin) +Status=Issues (mixed) Core Note=high system requirement -Plugin Note=[video] missing:various (see GameFAQ) +Plugin Note=[Glide64] missing:various Culling=1 RDRAM Size=8 @@ -2158,37 +2060,31 @@ RDRAM Size=8 Good Name=Getter Love!! - Cho Ren-ai Party Game (J) Internal Name=Getter Love!! Status=Compatible -Plugin Note=[video] missing faces [874733A4-A823745A-C:58] Good Name=Gex 3 - Deep Cover Gecko (E) (M2) (Fre-Ger) Internal Name=Gex 3 Deep Cover Gec Status=Compatible -Plugin Note=[video] errors:water,misc. [99179359-2FE7EBC3-C:50] Good Name=Gex 3 - Deep Cover Gecko (E) (M3) (Eng-Spa-Ita) Internal Name=Gex 3 Deep Cover Gec Status=Compatible -Plugin Note=[video] errors:water,misc. [3EDC7E12-E26C1CC9-C:45] Good Name=Gex 3 - Deep Cover Gecko (U) Internal Name=Gex 3 Deep Cover Gec Status=Compatible -Plugin Note=[video] errors:water,misc. [E68A000E-639166DD-C:50] Good Name=Gex 64 - Enter the Gecko (E) Internal Name=GEX: ENTER THE GECKO Status=Compatible -Plugin Note=[video] errors:water,misc. [89FED774-CAAFE21B-C:45] Good Name=Gex 64 - Enter the Gecko (U) Internal Name=GEX: ENTER THE GECKO Status=Compatible -Plugin Note=[video] errors:water,misc. [F5237301-99E3EE93-C:50] Good Name=Glover (E) (M3) @@ -2211,14 +2107,12 @@ Culling=1 [B7F40BCF-553556A5-C:45] Good Name=Glover 2 (U) (Beta) Internal Name=Glover 2 -Status=Issues (plugin) -Plugin Note=[video] errors:textures +Status=Compatible [8E9F21D2-DC19C5AB-C:45] Good Name=Glover 2 (U) (Early Beta) Internal Name=Glover 2 -Status=Issues (plugin) -Plugin Note=[video] errors:textures +Status=Compatible [B2C6D27F-2DA48CFD-C:4A] Good Name=Goemon - Mononoke Sugoroku (J) @@ -2230,7 +2124,6 @@ Status=Compatible Good Name=Goemon's Great Adventure (U) Internal Name=GOEMONS GREAT ADV Status=Compatible -Plugin Note=[video] errors:various in some levels [4690FB1C-4CD56D44-C:45] Good Name=Golden Nugget 64 (U) @@ -2242,8 +2135,7 @@ Linking=Off Good Name=GoldenEye 007 (E) Internal Name=GOLDENEYE Status=Compatible -Core Note=high system requirement -Plugin Note=[video] (see GameFAQ) +Plugin Note=[video] frigate water bug 32bit=No Clear Frame=2 FuncFind=2 @@ -2256,8 +2148,7 @@ SMM-TLB=0 Good Name=GoldenEye 007 (J) Internal Name=GOLDENEYE Status=Compatible -Core Note=high system requirement -Plugin Note=[video] (see GameFAQ) +Plugin Note=[video] frigate water bug 32bit=No Clear Frame=2 FuncFind=2 @@ -2270,8 +2161,7 @@ SMM-TLB=0 Good Name=GoldenEye 007 (U) Internal Name=GOLDENEYE Status=Compatible -Core Note=high system requirement -Plugin Note=[video] (see GameFAQ) +Plugin Note=[video] frigate water bug 32bit=No Clear Frame=2 Culling=1 @@ -2317,8 +2207,6 @@ Save Type=16kbit Eeprom Good Name=GT 64 - Championship Edition (E) (M3) Internal Name=GT64 Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] errors:map,speedo Counter Factor=1 Delay SI=Yes RDRAM Size=8 @@ -2327,8 +2215,6 @@ RDRAM Size=8 Good Name=GT 64 - Championship Edition (U) Internal Name=GT64 Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] errors:map,speedo Counter Factor=1 Delay SI=Yes RDRAM Size=8 @@ -2345,7 +2231,6 @@ Save Type=4kbit Eeprom Good Name=Hamster Monogatari 64 (J) Internal Name=ÊѽÀ°ÓɶÞÀØ64 Status=Compatible -Plugin Note=[video] slow in places Counter Factor=1 Culling=1 @@ -2353,7 +2238,7 @@ Culling=1 Good Name=Harukanaru Augusta - Masters '98 (J) Internal Name=MASTERS'98 Status=Compatible -Plugin Note=[video] framebuffer:shot (see GameFAQ) +Plugin Note=[Glide64] framebuffer issue? //not tested [98DF9DFC-6606C189-C:45] Good Name=Harvest Moon 64 (U) @@ -2364,22 +2249,19 @@ Counter Factor=1 [3E70E866-4438BAE8-C:4A] Good Name=Heiwa Pachinko World 64 (J) Internal Name=HEIWA ÊßÁݺ Ü°ÙÄÞ64 -Status=Issues (plugin) -Plugin Note=[video] use Glide64; errors:various +Status=Compatible RDRAM Size=8 [AE90DBEB-79B89123-C:50] Good Name=Hercules - The Legendary Journeys (E) (M6) Internal Name=HERCULES Status=Compatible -Core Note=high system requirement Counter Factor=1 [7F3CEB77-8981030A-C:45] Good Name=Hercules - The Legendary Journeys (U) Internal Name=HERCULES Status=Compatible -Core Note=high system requirement Counter Factor=1 Culling=1 @@ -2387,98 +2269,89 @@ Culling=1 Good Name=Hexen (E) Internal Name=HEXEN Status=Compatible -Plugin Note=[video] map flicker; use Glide64 Counter Factor=1 [5C1B5FBD-7E961634-C:46] Good Name=Hexen (F) Internal Name=HEXEN Status=Compatible -Plugin Note=[video] map flicker; use Glide64 Counter Factor=1 [9AB3B50A-BC666105-C:44] Good Name=Hexen (G) Internal Name=HEXEN Status=Compatible -Plugin Note=[video] map flicker; use Glide64 Counter Factor=1 [66751A57-54A29D6E-C:4A] Good Name=Hexen (J) Internal Name=HEXEN Status=Compatible -Plugin Note=[video] map flicker; use Glide64 Counter Factor=1 [9CAB6AEA-87C61C00-C:45] Good Name=Hexen (U) Internal Name=HEXEN Status=Compatible -Plugin Note=[video] map flicker; use Glide64 Counter Factor=1 [D3F10E5D-052EA579-C:45] Good Name=Hey You, Pikachu! (U) Internal Name=hey you, pikachu Status=Needs input plugin -Plugin Note=[input] needs Voice Pak (see GameFAQ) +Plugin Note=[input] needs Voice Pak [35FF8F1A-6E79E3BE-C:4A] Good Name=Hiryuu no Ken Twin (J) Internal Name=ËØ­³É¹Ý Â²Ý -Status=Region issue (plugin) -Plugin Note=[video] tris;use (U/E) ROM "Flying Dragon" +Status=Compatible Counter Factor=1 [277B129D-DD3879FF-C:50] Good Name=Holy Magic Century (E) Internal Name=Holy Magic Century Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] incorrect texture filtering [B35FEBB0-7427B204-C:46] Good Name=Holy Magic Century (F) Internal Name=Holy Magic Century Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] incorrect texture filtering [75FA0E14-C9B3D105-C:44] Good Name=Holy Magic Century (G) Internal Name=Holy Magic Century Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] incorrect texture filtering [C1D702BD-6D416547-C:4A] Good Name=Hoshi no Kirby 64 (J) (V1.0) Internal Name=Kirby64 Status=Compatible -Plugin Note=[video] missing graphics; use Glide64 [CA1BB86F-41CCA5C5-C:4A] Good Name=Hoshi no Kirby 64 (J) (V1.1) Status=Compatible -Plugin Note=[video] missing graphics; use Glide64 Culling=1 [0C581C7A-3D6E20E4-C:4A] Good Name=Hoshi no Kirby 64 (J) (V1.2) Internal Name=Kirby64 Status=Compatible -Plugin Note=[video] missing graphics; use Glide64 Culling=1 [BCB1F89F-060752A2-C:4A] Good Name=Hoshi no Kirby 64 (J) (V1.3) Internal Name=Kirby64 Status=Compatible -Plugin Note=[video] missing graphics; use Glide64 Culling=1 [E7D20193-C1158E93-C:50] Good Name=Hot Wheels Turbo Racing (E) (M3) Internal Name=HOT WHEELS TURBO Status=Compatible +Culling=1 [C7C98F8E-42145DDE-C:45] Good Name=Hot Wheels Turbo Racing (U) @@ -2490,7 +2363,7 @@ Culling=1 Good Name=HSV Adventure Racing (A) Internal Name=HSV ADVENTURE RACING Status=Compatible -Plugin Note=[video] errors:various; use Glide64 +Plugin Note=[Glide64] VI scrolling; fog wrong Counter Factor=3 ViRefresh=1450 @@ -2498,7 +2371,6 @@ ViRefresh=1450 Good Name=Human Grand Prix - New Generation (J) Internal Name=HUMAN GRAND PRIX Status=Compatible -Plugin Note=[video] errors:menus; use Glide64 32bit=No Clear Frame=1 Culling=1 @@ -2528,7 +2400,6 @@ RDRAM Size=8 Good Name=Hydro Thunder (E) Internal Name=Hydro Thunder Status=Compatible -Plugin Note=[video] (see GameFAQ) Audio Signal=Yes Counter Factor=1 RDRAM Size=8 @@ -2537,7 +2408,6 @@ RDRAM Size=8 Good Name=Hydro Thunder (F) Internal Name=Hydro Thunder Status=Compatible -Plugin Note=[video] (see GameFAQ) Audio Signal=Yes Counter Factor=1 RDRAM Size=8 @@ -2546,7 +2416,6 @@ RDRAM Size=8 Good Name=Hydro Thunder (U) Internal Name=HYDRO THUNDER Status=Compatible -Plugin Note=[video] (see GameFAQ) Audio Signal=Yes Counter Factor=1 RDRAM Size=8 @@ -2586,7 +2455,6 @@ Core Note=hang after race? Good Name=In-Fisherman Bass Hunter 64 (U) Internal Name=BASS HUNTER 64 Status=Compatible -Plugin Note=[video] errors:HUD; use Glide64 Counter Factor=1 [3A6F8C6B-2897BAEB-C:50] @@ -2605,7 +2473,6 @@ RDRAM Size=8 RSP-JumpTableSize=3584 SMM-FUNC=0 SMM-PI DMA=0 -SMM-Protect=1 SMM-TLB=0 ViRefresh=1800 @@ -2614,7 +2481,7 @@ Good Name=Indiana Jones and the Infernal Machine (U) Internal Name=Indiana Jones Status=Issues (mixed) Core Note=Recompiler Trading Post freeze. -Plugin Note=[rsp] interpreter only [audio] wrong speed;use(E)ROM +Plugin Note=[rsp] interpreter only 32bit=No AudioResetOnLoad=Yes Counter Factor=1 @@ -2625,7 +2492,6 @@ RDRAM Size=8 RSP-JumpTableSize=3584 SMM-FUNC=0 SMM-PI DMA=0 -SMM-Protect=1 SMM-TLB=0 ViRefresh=2050 @@ -2671,14 +2537,12 @@ RDRAM Size=8 Good Name=International Superstar Soccer 64 (E) Internal Name=I S S 64 Status=Compatible -Plugin Note=[video] errors:shadows; use Glide64 Counter Factor=1 [5F2763C4-62412AE5-C:45] Good Name=International Superstar Soccer 64 (U) Internal Name=I S S 64 Status=Compatible -Plugin Note=[video] errors:shadows; use Glide64 Counter Factor=1 Culling=1 @@ -2686,8 +2550,6 @@ Culling=1 Good Name=International Track & Field 2000 (U) Internal Name=ITF 2000 Status=Compatible -Core Note=high system requirement -Plugin Note=[video] missing:motion blur; use Glide64 (see GameFAQ) 32bit=No RDRAM Size=8 @@ -2695,30 +2557,27 @@ RDRAM Size=8 Good Name=International Track & Field Summer Games (E) (M3) Internal Name=IT&F SUMMERGAMES Status=Compatible -Core Note=high system requirement -Plugin Note=[video] missing:motion blur; use Glide64 (see GameFAQ) 32bit=No RDRAM Size=8 [D137A2CA-62B65053-C:4A] Good Name=Itoi Shigesato no Bass Tsuri No. 1 Kettei Ban! (J) Internal Name=BassFishingNo.1 -Status=Issues (plugin) -Plugin Note=[video] access violation; use 1.5.2 plugin +Status=Compatible Counter Factor=1 //================ J ================ [87766747-91C27165-C:4A] Good Name=J.League Dynamite Soccer 64 (J) Internal Name=ÀÞ²ÅϲĻ¯¶°64 -Status=Issues (plugin) -Plugin Note=[video] slow; errors:various +Status=Compatible +Plugin Note=[video] slow [4FBFA429-6920BB15-C:4A] Good Name=J.League Eleven Beat 1997 (J) Internal Name=J_league 1997 -Status=Issues (plugin) -Plugin Note=[video] slow; errors:various +Status=Compatible +Plugin Note=[video] slow [54554A42-E4985FFB-C:4A] Good Name=J.League Live 64 (J) @@ -2770,7 +2629,7 @@ RDRAM Size=8 Good Name=Jet Force Gemini (E) (M4) Internal Name=JET FORCE GEMINI Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[video] incorrect shadows 32bit=No Counter Factor=1 Culling=1 @@ -2785,7 +2644,7 @@ SMM-TLB=0 Good Name=Jet Force Gemini (U) Internal Name=JET FORCE GEMINI Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[video] incorrect shadows 32bit=No Counter Factor=1 Culling=1 @@ -2800,6 +2659,7 @@ SMM-TLB=0 Good Name=Jet Force Gemini (U) (Kiosk Demo) Internal Name=J F G DISPLAY Status=Compatible +Plugin Note=[video] incorrect shadows 32bit=No Counter Factor=1 SMM-Cache=0 @@ -2836,8 +2696,7 @@ RDRAM Size=8 [146C4366-72A6DEB3-C:4A] Good Name=Jikkyou J.League Perfect Striker (J) Internal Name=PERFECT STRIKER -Status=Issues (plugin) -Plugin Note=[video] errors:field, shadows, various +Status=Compatible [0AC244D1-1F0EC605-C:4A] Good Name=Jikkyou Powerful Pro Yakyuu 2000 (J) (V1.0) @@ -2924,17 +2783,16 @@ RDRAM Size=8 [E0A79F8C-32CC97FA-C:4A] Good Name=Jikkyou World Soccer 3 (J) Internal Name=J WORLD SOCCER3 -Status=Issues (plugin) -Plugin Note=[video] errors:shadows,menus +Status=Compatible Counter Factor=1 [916AE6B8-8817AB22-C:4A] Good Name=Jikuu Senshi Turok (J) Internal Name=turok_dinosaur_hunte Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] broken mipmapping AudioResetOnLoad=Yes +Counter Factor=1 //seems to fix level 4 crash; more testing needed [4AAAF6ED-376428AD-C:4A] Good Name=Jinsei Game 64 (J) @@ -2955,6 +2813,7 @@ Internal Name=DAIKATANA Status=Compatible Clear Frame=2 Linking=Off +RDRAM Size=8 [D0151AB0-FE5CA14B-C:45] Good Name=John Romero's Daikatana (U) @@ -2970,7 +2829,6 @@ RDRAM Size=8 Good Name=Kakutou Denshou - F-Cup Maniax (J) Internal Name=KAKUTOU DENSHOU Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin [36281F23-009756CF-C:45] Good Name=Ken Griffey Jr.'s Slugfest (U) @@ -2982,7 +2840,6 @@ RDRAM Size=8 Good Name=Killer Instinct Gold (E) Internal Name=Killer Instinct Gold Status=Compatible -Plugin Note=[video] errors:sky; use Glide64 32bit=No Clear Frame=2 @@ -2990,7 +2847,6 @@ Clear Frame=2 Good Name=Killer Instinct Gold (U) (V1.0) Internal Name=KILLER INSTINCT GOLD Status=Compatible -Plugin Note=[video] errors:sky; use Glide64 32bit=No Clear Frame=2 @@ -2998,7 +2854,6 @@ Clear Frame=2 Good Name=Killer Instinct Gold (U) (V1.1) Internal Name=KILLER INSTINCT GOLD Status=Compatible -Plugin Note=[video] errors:sky; use Glide64 32bit=No Clear Frame=2 @@ -3006,7 +2861,6 @@ Clear Frame=2 Good Name=Killer Instinct Gold (U) (V1.2) Internal Name=Killer Instinct Gold Status=Compatible -Plugin Note=[video] errors:sky; use Glide64 32bit=No Clear Frame=2 @@ -3015,7 +2869,9 @@ Good Name=King Hill 64 - Extreme Snowboarding (J) Internal Name=KING HILL 64 Status=Issues (core) Core Note=no sound -Plugin Note=[video] errors:menu snowflakes; use Glide64 +Plugin Note=[Glide64] no fog +32bit=No +Culling=1 RDRAM Size=8 [75BC6AD6-78552BC9-C:4A] @@ -3027,42 +2883,46 @@ Status=Compatible Good Name=Kirby 64 - The Crystal Shards (E) Internal Name=Kirby64 Status=Compatible -Plugin Note=[video] missing graphics; use Glide64 +Culling=1 [46039FB4-0337822C-C:45] Good Name=Kirby 64 - The Crystal Shards (U) Internal Name=Kirby64 Status=Compatible -Plugin Note=[video] missing graphics; use Glide64 Culling=1 [4A997C74-E2087F99-C:50] Good Name=Knife Edge - Nose Gunner (E) Internal Name=KNIFE EDGE -Status=Compatible +Status=Issues (core) +Core Note=too fast +Culling=1 [931AEF3F-EF196B90-C:4A] Good Name=Knife Edge - Nose Gunner (J) Internal Name=KNIFE EDGE -Status=Compatible +Status=Issues (core) +Core Note=too fast +Culling=1 [FCE0D799-65316C54-C:45] Good Name=Knife Edge - Nose Gunner (U) Internal Name=KNIFE EDGE -Status=Compatible +Status=Issues (core) +Core Note=too fast Culling=1 [E3D6A795-2A1C5D3C-C:50] Good Name=Knockout Kings 2000 (E) Internal Name=Knockout Kings 2000 Status=Compatible -Core Note=unstable? (see GameFAQ) +Core Note=unstable? [0894909C-DAD4D82D-C:45] Good Name=Knockout Kings 2000 (U) Internal Name=Knockout Kings 2000 Status=Compatible -Core Note=unstable? (see GameFAQ) +Plugin Note=[Glide64] missing portraits Culling=1 [1739EFBA-D0B43A68-C:50] @@ -3085,27 +2945,30 @@ Good Name=Kyojin no Doshin 1 (J) [CART HACK] Status=Issues (core) Core Note=Saves not supported 32bit=No +AllowROMWrites=Yes Counter Factor=1 RDRAM Size=8 -AllowROMWrites=Yes + [E7BDA0BE-ADA09CAC-C:4A] Good Name=Kyojin no Doshin 1 (J) (Kiosk Demo) [CART HACK] Status=Issues (core) Core Note=Saves not supported 32bit=No +AllowROMWrites=Yes Counter Factor=1 RDRAM Size=8 -AllowROMWrites=Yes + [8C47CE8B-06019FEF-C:4A] Good Name=Kyojin no Doshin - Kaihou Sensen Chibikko Chikko Daishuugou (J) [CART HACK] Status=Issues (core) Core Note=Saves not supported 32bit=No +AllowROMWrites=Yes Counter Factor=1 RDRAM Size=8 -AllowROMWrites=Yes + //================ L ================ [7F304099-52CF5276-C:4A] @@ -3113,7 +2976,7 @@ Good Name=Last Legion UX (J) Internal Name=LASTLEGION UX Status=Issues (plugin) Core Note=high system requirement -Plugin Note=[video] HLE not supported; flicker +Plugin Note=[video] HLE not supported HLE GFX=No RDRAM Size=8 @@ -3143,27 +3006,25 @@ Status=Compatible Good Name=Lode Runner 3-D (E) (M5) Internal Name=Lode Runner 3D Status=Compatible -Plugin Note=[video] missing:menu highlight; use Glide64 ViRefresh=1450 [964ADD0B-B29213DB-C:4A] Good Name=Lode Runner 3-D (J) Internal Name=Lode Runner 3D Status=Compatible -Plugin Note=[video] missing:menu highlight; use Glide64 ViRefresh=1400 [255018DF-57D6AE3A-C:45] Good Name=Lode Runner 3-D (U) Internal Name=Lode Runner 3D Status=Compatible -Plugin Note=[video] missing:menu highlight; use Glide64 ViRefresh=1400 [0AA0055B-7637DF65-C:50] Good Name=Looney Tunes - Duck Dodgers (E) (M6) Internal Name=DAFFY DUCK STARRING Status=Compatible +Core Note=incorrect speech timing RDRAM Size=8 [2483F22B-136E025E-C:55] @@ -3204,7 +3065,6 @@ Status=Compatible Good Name=Madden NFL 2000 (U) Internal Name=Madden NFL 2000 Status=Compatible -Plugin Note=[video] errors:field; use Glide64 Counter Factor=1 RDRAM Size=8 @@ -3271,66 +3131,66 @@ Status=Compatible Good Name=Mahjong Hourouki Classic (J) Internal Name=Ï°¼Þ¬Ýγ۳·CLASSIC Status=Compatible -Plugin Note=[video] (see GameFAQ) [0FC42C70-8754F1CD-C:4A] Good Name=Mahjong Master (J) Internal Name=Ï°¼Þ¬Ý ϽÀ° Status=Compatible -Plugin Note=[video] missing:text; use Glide64 [CDB998BE-1024A5C8-C:50] Good Name=Major League Baseball Featuring Ken Griffey Jr. (E) Internal Name=MLB FEATURING K G JR Status=Issues (plugin) -Plugin Note=[video] slow; use 1.6 plugin (see GameFAQ) +Plugin Note=[video] Glide64 crashes [80C1C05C-EA065EF4-C:45] Good Name=Major League Baseball Featuring Ken Griffey Jr. (U) Internal Name=MLB FEATURING K G JR Status=Issues (plugin) -Plugin Note=[video] slow; use 1.6 plugin (see GameFAQ) +Plugin Note=[video] Glide64 crashes [AB9EB27D-5F05605F-C:4A] Good Name=Mario Artist - Communication Kit (J) [CART HACK] Status=Compatible 32bit=No +AllowROMWrites=Yes Counter Factor=1 RDRAM Size=8 -AllowROMWrites=Yes [3A3EB7FB-0DDD515C-C:4A] Good Name=Mario Artist - Paint Studio (J) [CART HACK] Status=Issues (plugin) Plugin Note=[video] HLE not fully supported; stamps not working 32bit=No +AllowROMWrites=Yes Counter Factor=1 RDRAM Size=8 -AllowROMWrites=Yes [2D5EFCC5-98CF79D2-C:4A] Good Name=Mario Artist - Polygon Studio (J) [CART HACK] Status=Issues (plugin) Plugin Note=[video] HLE not fully supported; cannot model 32bit=No +AllowROMWrites=Yes Counter Factor=1 RDRAM Size=8 -AllowROMWrites=Yes + [4CBC3B56-FDB69B1C-C:4A] Good Name=Mario Artist - Talent Studio (J) [CART HACK] Status=Issues (plugin) Plugin Note=[video] HLE not fully supported; face and animation editing does not work 32bit=No +AllowROMWrites=Yes Counter Factor=1 RDRAM Size=8 -AllowROMWrites=Yes + [62E957D0-7FC15A5D-C:50] Good Name=Mario Golf (E) Internal Name=MarioGolf64 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Self Texture=1 @@ -3338,7 +3198,7 @@ Self Texture=1 Good Name=Mario Golf (U) Internal Name=MarioGolf64 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Self Texture=1 @@ -3346,7 +3206,7 @@ Self Texture=1 Good Name=Mario Golf 64 (J) (V1.0) Internal Name=MarioGolf64 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Self Texture=1 @@ -3354,7 +3214,7 @@ Self Texture=1 Good Name=Mario Golf 64 (J) (V1.1) Internal Name=MarioGolf64 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Self Texture=1 @@ -3363,7 +3223,7 @@ Good Name=Mario Kart 64 (E) (V1.0) Internal Name=MARIOKART64 Status=Compatible Cheat0=81001A38 2409,81001A3A 0002,81001A3C 2409,81001A3E 0002,81001C90 240A,81001C92 0002,81001C94 240A,81001C96 0002 //Multiplayer timing fix -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] missing TVs Culling=1 Primary Frame Buffer=1 @@ -3372,7 +3232,7 @@ Good Name=Mario Kart 64 (E) (V1.1) Internal Name=MARIOKART64 Status=Compatible Cheat0=81001A38 2409,81001A3A 0002,81001A3C 2409,81001A3E 0002,81001C90 240A,81001C92 0002,81001C94 240A,81001C96 0002 //Multiplayer timing fix -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] missing TVs Culling=1 Primary Frame Buffer=1 @@ -3381,7 +3241,7 @@ Good Name=Mario Kart 64 (J) (V1.0) Internal Name=MARIOKART64 Status=Compatible Cheat0=81001A38 2409,81001A3A 0002,81001A3C 2409,81001A3E 0002,81001C90 240A,81001C92 0002,81001C94 240A,81001C96 0002 //Multiplayer timing fix -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] missing TVs Culling=1 Primary Frame Buffer=1 @@ -3390,7 +3250,7 @@ Good Name=Mario Kart 64 (J) (V1.1) Internal Name=MARIOKART64 Status=Compatible Cheat0=81001A38 2409,81001A3A 0002,81001A3C 2409,81001A3E 0002,81001C90 240A,81001C92 0002,81001C94 240A,81001C96 0002 //Multiplayer timing fix -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] missing TVs Culling=1 Primary Frame Buffer=1 @@ -3399,7 +3259,7 @@ Good Name=Mario Kart 64 (U) Internal Name=MARIOKART64 Status=Compatible Cheat0=81001A38 2409,81001A3A 0002,81001A3C 2409,81001A3E 0002,81001C90 240A,81001C92 0002,81001C94 240A,81001C96 0002 //Multiplayer timing fix -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] missing TVs Culling=1 Primary Frame Buffer=1 @@ -3413,49 +3273,42 @@ Plugin Note=[rsp] needs semaphore lock Good Name=Mario Party (E) (M3) Internal Name=MarioParty Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 [ADA815BE-6028622F-C:4A] Good Name=Mario Party (J) Internal Name=MarioParty Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 [2829657E-A0621877-C:45] Good Name=Mario Party (U) Internal Name=MarioParty Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 [82380387-DFC744D9-C:50] Good Name=Mario Party 2 (E) (M5) Internal Name=MarioParty2 Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 [ED567D0F-38B08915-C:4A] Good Name=Mario Party 2 (J) Internal Name=MarioParty2 Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 [9EA95858-AF72B618-C:45] Good Name=Mario Party 2 (U) Internal Name=MarioParty2 Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 [C5674160-0F5F453C-C:50] Good Name=Mario Party 3 (E) (M4) Internal Name=MarioParty3 Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 Save Type=16kbit Eeprom @@ -3463,7 +3316,6 @@ Save Type=16kbit Eeprom Good Name=Mario Party 3 (J) Internal Name=MarioParty3 Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 Save Type=16kbit Eeprom @@ -3471,7 +3323,6 @@ Save Type=16kbit Eeprom Good Name=Mario Party 3 (U) Internal Name=MarioParty3 Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 Save Type=16kbit Eeprom @@ -3479,7 +3330,6 @@ Save Type=16kbit Eeprom Good Name=Mario Story (J) Internal Name=MARIO STORY Status=Compatible -Plugin Note=[video] errors:menus (see GameFAQ) 32bit=No Save Type=FlashRam Clear Frame=1 @@ -3490,7 +3340,7 @@ Culling=1 Good Name=Mario Tennis (E) Internal Name=MarioTennis Status=Issues (plugin) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] errors:various 32bit=No Culling=1 RDRAM Size=8 @@ -3500,7 +3350,7 @@ Save Type=16kbit Eeprom Good Name=Mario Tennis (U) Internal Name=MarioTennis Status=Issues (plugin) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] errors:various 32bit=No Culling=1 RDRAM Size=8 @@ -3510,7 +3360,7 @@ Save Type=16kbit Eeprom Good Name=Mario Tennis 64 (J) Internal Name=MarioTennis64 Status=Issues (plugin) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] errors:various 32bit=No RDRAM Size=8 Save Type=16kbit Eeprom @@ -3524,63 +3374,59 @@ Status=Compatible Good Name=Mia Hamm Soccer 64 (U) (M2) Internal Name=Mia Hamm Soccer 64 Status=Compatible -Plugin Note=[video] unsupported; use Glide64 RDRAM Size=8 [E36166C2-8613A2E5-C:58] Good Name=Michael Owens WLS 2000 (E) Internal Name=MO WORLD LEAGUE SOCC Status=Compatible -Plugin Note=[video] unsupported; use Glide64 RDRAM Size=8 [736AE6AF-4117E9C7-C:4A] Good Name=Mickey no Racing Challenge USA (J) Internal Name=MICKEY USA Status=Compatible -Plugin Note=[video] framebuffer:transitions +Plugin Note=[Glide64] transitions incorrect SMM-Protect=1 [DED0DD9A-E78225A7-C:50] Good Name=Mickey's Speedway USA (E) (M5) Internal Name=MICKEY USA PAL Status=Compatible -Plugin Note=[video] framebuffer:transitions +Plugin Note=[Glide64] transitions incorrect SMM-Protect=1 [FA8C4571-BBE7F9C0-C:45] Good Name=Mickey's Speedway USA (U) Internal Name=MICKEY USA Status=Compatible -Plugin Note=[video] framebuffer:transitions +Plugin Note=[Glide64] transitions incorrect SMM-Protect=1 [2A49018D-D0034A02-C:50] Good Name=Micro Machines 64 Turbo (E) (M5) Internal Name=MICROMACHINES64TURBO Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin RDRAM Size=8 [F1850C35-ACE07912-C:45] Good Name=Micro Machines 64 Turbo (U) Internal Name=MICROMACHINES64TURBO Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin Culling=1 RDRAM Size=8 [E4B35E4C-1AC45CC9-C:45] Good Name=Midway's Greatest Arcade Hits Volume 1 (U) Internal Name=MGAH VOL1 -Status=Compatible -Plugin Note=[video] (see GameFAQ) +Status=Issues (Plugin) +Plugin Note=[Glide64] partial screens [09D53E16-3AB268B9-C:45] Good Name=Mike Piazza's Strike Zone (U) Internal Name=PIAZZA STRIKEZONE Status=Compatible -Plugin Note=[video] errors:various +Plugin Note=[Glide64] possible ucode issue Culling=1 [9A490D9D-8F013ADC-C:50] @@ -3597,19 +3443,19 @@ Status=Compatible Good Name=Mischief Makers (E) Internal Name=MISCHIEF MAKERS Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] some missing graphics [0B93051B-603D81F9-C:45] Good Name=Mischief Makers (U) (V1.0) Internal Name=MISCHIEF MAKERS Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] some missing graphics [BFA526B4-0691E430-C:45] Good Name=Mischief Makers (U) (V1.1) Internal Name=MISCHIEF MAKERS Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] some missing graphics [2256ECDA-71AB1B9C-C:50] Good Name=Mission Impossible (E) @@ -3620,7 +3466,7 @@ Status=Compatible Good Name=Mission Impossible (F) Internal Name=MISSION IMPOSSIBLE Status=Compatible -Core Note=(see GameFAQ) +Core Note=Bad dump? [93EB3F7E-81675E44-C:44] Good Name=Mission Impossible (G) @@ -3646,7 +3492,6 @@ Status=Compatible Good Name=Monaco Grand Prix (U) Internal Name=Monaco Grand Prix Status=Compatible -Plugin Note=[video] errors:resolution issues Culling=1 RDRAM Size=8 @@ -3654,7 +3499,6 @@ RDRAM Size=8 Good Name=Monaco Grand Prix - Racing Simulation 2 (E) (M4) Internal Name=Monaco GP Racing 2 Status=Compatible -Plugin Note=[video] errors:resolution issues Clear Frame=2 Culling=1 @@ -3662,14 +3506,12 @@ Culling=1 Good Name=Monopoly (U) (M2) Internal Name=monopoly Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 [D3D806FC-B43AA2A8-C:50] Good Name=Monster Truck Madness 64 (E) (M5) Internal Name=MTM64 Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin Clear Frame=2 Counter Factor=3 Culling=1 @@ -3678,7 +3520,6 @@ Culling=1 Good Name=Monster Truck Madness 64 (U) Internal Name=MTM64 Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin Clear Frame=2 Counter Factor=3 Culling=1 @@ -3733,26 +3574,22 @@ Status=Compatible Good Name=MRC - Multi Racing Championship (E) (M3) Internal Name=MULTI RACING Status=Compatible -Plugin Note=[video] errors:various; use 1.5.2 plugin [A6B6B413-15D113CC-C:4A] Good Name=MRC - Multi Racing Championship (J) Internal Name=MULTI RACING Status=Compatible -Plugin Note=[video] errors:various; use 1.5.2 plugin [2AF9B65C-85E2A2D7-C:45] Good Name=MRC - Multi Racing Championship (U) Internal Name=MULTI RACING Status=Compatible -Plugin Note=[video] errors:various; use 1.5.2 plugin [1938525C-586E9656-C:45] Good Name=Ms. Pac-Man Maze Madness (U) Internal Name=MS. PAC-MAN MM -Status=Compatible -Core Note=crash in credits? -Plugin Note=[video] (see GameFAQ) +Status=Issues (core) +Core Note=Unstable [7F9345D3-841ECADE-C:50] Good Name=Mystical Ninja 2 Starring Goemon (E) (M3) @@ -3764,14 +3601,12 @@ Counter Factor=1 Good Name=Mystical Ninja Starring Goemon (E) Internal Name=MYSTICAL NINJA Status=Compatible -Plugin Note=[video] slow in places; use 1.6 plugin RDRAM Size=8 [FCBCCB21-72903C6B-C:45] Good Name=Mystical Ninja Starring Goemon (U) Internal Name=MYSTICAL NINJA Status=Compatible -Plugin Note=[video] slow in places; use 1.6 plugin RDRAM Size=8 //================ N ================ @@ -3795,25 +3630,28 @@ RDRAM Size=8 [DF331A18-5FD4E044-C:45] Good Name=NASCAR 2000 (U) Internal Name=NASCAR 2000 -Status=Issues (plugin) -Plugin Note=[video] splitscreen problem; use software rendering +Status=Compatible +32bit=No Clear Frame=2 +Counter Factor=1 Culling=1 RDRAM Size=8 [AE4992C9-9253B253-C:50] Good Name=NASCAR 99 (E) (M3) Internal Name=NASCAR 99 -Status=Issues (plugin) -Plugin Note=[video] splitscreen problem; use software rendering +Status=Compatible +32bit=No +Counter Factor=1 Clear Frame=2 RDRAM Size=8 [23749578-80DC58FD-C:45] Good Name=NASCAR 99 (U) Internal Name=NASCAR 99 -Status=Issues (plugin) -Plugin Note=[video] splitscreen problem; use software rendering +Status=Compatible +32bit=No +Counter Factor=1 Clear Frame=2 RDRAM Size=8 @@ -3821,7 +3659,6 @@ RDRAM Size=8 Good Name=NBA Courtside 2 - Featuring Kobe Bryant (U) Internal Name=NBA Courtside 2 Status=Compatible -Plugin Note=[video] errors:title resolution Culling=1 Save Type=FlashRam @@ -3829,13 +3666,11 @@ Save Type=FlashRam Good Name=NBA Hangtime (E) Internal Name=NBA HANGTIME Status=Issues (plugin) -Plugin Note=[video] very slow; use 1.6 plugin [4E69B487-FE18E290-C:45] Good Name=NBA Hangtime (U) Internal Name=NBA HANGTIME Status=Issues (plugin) -Plugin Note=[video] very slow; use 1.6 plugin [36ACBA9B-F28D4D94-C:4A] Good Name=NBA In the Zone '98 (J) @@ -3924,7 +3759,8 @@ Status=Compatible [3FFE80F4-A7C15F7E-C:45] Good Name=NBA Showtime - NBA on NBC (U) Internal Name=NBA SHOWTIME -Status=Compatible +Status=Issues (core) +Core Note=Speed/timing issues Audio Signal=Yes Counter Factor=1 Save Type=FlashRam @@ -4031,27 +3867,23 @@ Status=Compatible Good Name=NHL Breakaway 98 (E) Internal Name=NHL_BREAKAWAY_98 Status=Compatible -Plugin Note=[video] res detection; use 1.5.2 plugin Culling=1 [6DFDCDC3-4DE701C8-C:45] Good Name=NHL Breakaway 98 (U) Internal Name=NHL_BREAKAWAY_98 Status=Compatible -Plugin Note=[video] res detection; use 1.5.2 plugin Culling=1 [874621CB-0031C127-C:50] Good Name=NHL Breakaway 99 (E) Internal Name=NHL Breakaway '99 Status=Compatible -Plugin Note=[video] res detection; use 1.5.2 plugin [441768D0-7D73F24F-C:45] Good Name=NHL Breakaway 99 (U) Internal Name=NHL Breakaway '99 Status=Compatible -Plugin Note=[video] res detection; use 1.5.2 plugin [A9895CD9-7020016C-C:50] Good Name=NHL Pro 99 (E) @@ -4062,15 +3894,13 @@ Status=Compatible Good Name=Nightmare Creatures (U) Internal Name=NIGHTMARE CREATURES Status=Compatible -Core Note=(see GameFAQ) Delay SI=Yes ViRefresh=2200 [CD3C3CDF-317793FA-C:4A] Good Name=Nintama Rantarou 64 Game Gallery (J) Internal Name=NINTAMAGAMEGALLERY64 -Status=Issues (plugin) -Plugin Note=[video] slow. errors:various +Status=Compatible Counter Factor=1 [67D20729-F696774C-C:4A] @@ -4086,24 +3916,18 @@ ViRefresh=2200 Good Name=Nuclear Strike 64 (E) (M2) Internal Name=NUCLEARSTRIKE64 Status=Compatible -Core Note=high system requirement -Linking=Off RDRAM Size=8 [8F50B845-D729D22F-C:44] Good Name=Nuclear Strike 64 (G) Internal Name=NUCLEARSTRIKE64 Status=Compatible -Core Note=high system requirement -Linking=Off RDRAM Size=8 [4998DDBB-F7B7AEBC-C:45] Good Name=Nuclear Strike 64 (U) Internal Name=NUCLEARSTRIKE64 Status=Compatible -Core Note=high system requirement -Linking=Off RDRAM Size=8 [D83BB920-CC406416-C:4A] @@ -4128,43 +3952,37 @@ Culling=1 Good Name=Nushi Duri 64 - Shiokaze ni Notte (J) Internal Name=ǼÂÞØ64¼µ¶¾ÞÆɯà Status=Compatible -Plugin Note=[video] missing:lots; use Glide64 //================ O ================ [812289D0-C2E53296-C:50] Good Name=Off Road Challenge (E) Internal Name=OFFROAD Status=Issues (plugin) -Plugin Note=[video] multiplayer flicker; use software rendering +Plugin Note=[Glide64] multiplayer flicker [319093EC-0FC209EF-C:45] Good Name=Off Road Challenge (U) Internal Name=OFFROAD Status=Issues (plugin) -Plugin Note=[video] multiplayer flicker; use software rendering +Plugin Note=[Glide64] multiplayer flicker [0375CF67-56A93FAA-C:4A] Good Name=Ogre Battle 64 - Person of Lordly Caliber (J) (V1.1) Internal Name=OgreBattle64 -Status=Issues (plugin) -Core Note=old [!] ROM is bad; high system requirement -Plugin Note=[video] missing:backgrounds in battle scenes +Status=Compatible +Core Note=ROM is bad? //check this 32bit=No [E6419BC5-69011DE3-C:45] Good Name=Ogre Battle 64 - Person of Lordly Caliber (U) (V1.0) Internal Name=OgreBattle64 -Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] missing:backgrounds in battle scenes +Status=Compatible 32bit=No [0ADAECA7-B17F9795-C:45] Good Name=Ogre Battle 64 - Person of Lordly Caliber (U) (V1.1) Internal Name=OgreBattle64 -Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] missing:backgrounds in battle scenes +Status=Compatible 32bit=No [AE2D3A35-24F0D41A-C:50] @@ -4191,20 +4009,29 @@ Status=Compatible Good Name=Operation WinBack (E) (M5) Internal Name=OPERATION WINBACK Status=Compatible -Plugin Note=[video] grey square (see GameFAQ) +Plugin Note=[video] HLE square bug + +[E86415A6-98395B53-C:50] +Good Name=O.D.T (Or Die Trying) (E) (M5) (Unreleased Final) +Internal Name=O.D.T +Status=Compatible + +[2655BB70-667D9925-C:45] +Good Name=O.D.T (Or Die Trying) (U) (M3) (Unreleased Final) +Internal Name=O.D.T +Status=Region issue (core) +Core Note=hangs? unconfirmed //================ P ================ [74554B3B-F4AEBCB5-C:4A] Good Name=Pachinko 365 Nichi (J) Internal Name=PACHINKO365NICHI -Status=Needs video plugin -Plugin Note=[video] geometry problem ? +Status=Compatible [19AB29AF-C71BCD28-C:50] Good Name=Paper Mario (E) (M4) Internal Name=PAPER MARIO Status=Compatible -Plugin Note=[video] errors:menus (see GameFAQ) 32bit=No Save Type=FlashRam Clear Frame=1 @@ -4215,7 +4042,6 @@ Culling=1 Good Name=Paper Mario (U) Internal Name=PAPER MARIO Status=Compatible -Plugin Note=[video] errors:menus (see GameFAQ) 32bit=No Save Type=FlashRam Clear Frame=1 @@ -4235,8 +4061,7 @@ Status=Compatible [CFE2CB31-4D6B1E1D-C:4A] Good Name=Parlor! Pro 64 - Pachinko Jikki Simulation Game (J) Internal Name=Parlor PRO 64 -Status=Needs video plugin -Plugin Note=[video] errors:textures +Status=Compatible Save Type=16kbit Eeprom [F468118C-E32EE44E-C:4A] @@ -4255,13 +4080,13 @@ Culling=1 Good Name=Penny Racers (U) Internal Name=PENNY RACERS Status=Compatible +Culling=1 [E4B08007-A602FF33-C:50] Good Name=Perfect Dark (E) (M5) Internal Name=Perfect Dark Status=Compatible -Core Note=high system requirement; timing (see GameFAQ) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] Combat Simulator crash. 32bit=No Clear Frame=2 RDRAM Size=8 @@ -4276,8 +4101,7 @@ Save Type=16kbit Eeprom Good Name=Perfect Dark (J) Internal Name=PERFECT DARK Status=Compatible -Core Note=high system requirement; timing (see GameFAQ) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] Combat Simulator crash. 32bit=No Clear Frame=2 RDRAM Size=8 @@ -4292,8 +4116,7 @@ Save Type=16kbit Eeprom Good Name=Perfect Dark (U) (V1.0) Internal Name=Perfect Dark Status=Compatible -Core Note=high system requirement; timing (see GameFAQ) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] Combat Simulator crash. 32bit=No Clear Frame=2 Culling=1 @@ -4309,8 +4132,7 @@ Save Type=16kbit Eeprom Good Name=Perfect Dark (U) (V1.1) Internal Name=Perfect Dark Status=Compatible -Core Note=high system requirement; timing (see GameFAQ) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] Combat Simulator crash. 32bit=No Clear Frame=2 Culling=1 @@ -4326,8 +4148,7 @@ Save Type=16kbit Eeprom Good Name=Perfect Dark XBLA Mp3 (1.0) Internal Name=Perfect Dark Status=Compatible -Core Note=high system requirement; timing (see GameFAQ) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] Combat Simulator crash. 32bit=No Clear Frame=2 Culling=1 @@ -4343,25 +4164,24 @@ Save Type=16kbit Eeprom Good Name=PGA European Tour (E) (M5) Internal Name=PGA European Tour Go Status=Compatible -Plugin Note=[video] (see GameFAQ) [B54CE881-BCCB6126-C:45] Good Name=PGA European Tour (U) Internal Name=PGA European Tour -Status=Compatible -Plugin Note=[video] (see GameFAQ) +Status=Issues (Plugin) +Plugin Note=[Glide64] HUD buggy. Use (E) version [3F245305-FC0B74AA-C:4A] Good Name=Pikachu Genki Dechuu (J) Internal Name=PIKACHU GENKIDECHU Status=Needs input plugin -Plugin Note=[input] needs Voice Pak (see GameFAQ) +Plugin Note=[input] needs Voice Pak [1AA05AD5-46F52D80-C:50] Good Name=Pilotwings 64 (E) (M3) Internal Name=Pilot Wings64 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[video] broken shadows Cheat0=D0264361 0012,80264361 00FF,D0264BE1 0012,80264BE1 00FF,D0264DA1 0012,80264DA1 00FF,D02647E1 0012,802647E1 00FF,D02646A1 0012,802646A1 00FF,D0264661 0012,80264661 00FF,D02649A1 0012,802649A1 00FF,D0264BA1 0012,80264BA1 00FF,D0264AA1 0012,80264AA1 00FF,D02641E1 0020,802641E1 00FF,D02648E1 0020,802648E1 00FF,D0264D61 0020,80264D61 00FF,D0264A21 0020,80264A21 00FF,D02645A1 0020,802645A1 00FF,D02647A1 0020,802647A1 00FF,D02642A1 0029,802642A1 00FF,D0264921 0029,80264921 00FF,D0264621 0029,80264621 00FF,D0264A21 0029,80264A21 00FF,D0264C61 0029,80264C61 00FF,D02647A1 0029,802647A1 00FF,D0264FE1 0029,80264FE1 00FF,D0265161 0029,80265161 00FF,D0264AA1 0029,80264AA1 00FF,D02641E1 003D,802641E1 00FF,D02649E1 003D,802649E1 00FF,D0264561 003D,80264561 00FF,D02646E1 003D,802646E1 00FF,D0264721 003D,80264721 00FF //Land Shadow Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 Counter Factor=3 @@ -4370,7 +4190,7 @@ Counter Factor=3 Good Name=Pilotwings 64 (J) Internal Name=Pilot Wings64 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[video] broken shadows Cheat0=D02639B1 0012,802639B1 00FF,D0264231 0012,80264231 00FF,D02643F1 0012,802643F1 00FF,D0263E31 0012,80263E31 00FF,D0263CF1 0012,80263CF1 00FF,D0263CB1 0012,80263CB1 00FF,D0263FF1 0012,80263FF1 00FF,D02641F1 0012,802641F1 00FF,D02640F1 0012,802640F1 00FF,D0263831 0020,80263831 00FF,D0263F31 0020,80263F31 00FF,D02643B1 0020,802643B1 00FF,D0264071 0020,80264071 00FF,D0263BF1 0020,80263BF1 00FF,D0263DF1 0020,80263DF1 00FF,D02638F1 0029,802638F1 00FF,D0263F71 0029,80263F71 00FF,D0263C71 0029,80263C71 00FF,D0264071 0029,80264071 00FF,D02642B1 0029,802642B1 00FF,D0263DF1 0029,80263DF1 00FF,D0264631 0029,80264631 00FF,D02647B1 0029,802647B1 00FF,D02640F1 0029,802640F1 00FF,D0263831 003D,80263831 00FF,D0264031 003D,80264031 00FF,D0263BB1 003D,80263BB1 00FF,D0263D31 003D,80263D31 00FF,D0263D71 003D,80263D71 00FF //Land Shadow Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 Counter Factor=3 @@ -4379,7 +4199,7 @@ Counter Factor=3 Good Name=Pilotwings 64 (U) Internal Name=Pilot Wings64 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[video] broken shadows Cheat0=D0263B41 0012,80263B41 00FF,D02643C1 0012,802643C1 00FF,D0264581 0012,80264581 00FF,D0263FC1 0012,80263FC1 00FF,D0263E81 0012,80263E81 00FF,D0263E41 0012,80263E41 00FF,D0264181 0012,80264181 00FF,D0264381 0012,80264381 00FF,D0264281 0012,80264281 00FF,D02639C1 0020,802639C1 00FF,D02640C1 0020,802640C1 00FF,D0264541 0020,80264541 00FF,D0264201 0020,80264201 00FF,D0263D81 0020,80263D81 00FF,D0263F81 0020,80263F81 00FF,D0263A81 0029,80263A81 00FF,D0264101 0029,80264101 00FF,D0263E01 0029,80263E01 00FF,D0264201 0029,80264201 00FF,D0264441 0029,80264441 00FF,D0263F81 0029,80263F81 00FF,D02647C1 0029,802647C1 00FF,D0264941 0029,80264941 00FF,D0264281 0029,80264281 00FF,D02639C1 003D,802639C1 00FF,D02641C1 003D,802641C1 00FF,D0263D41 003D,80263D41 00FF,D0263EC1 003D,80263EC1 00FF,D0263F01 003D,80263F01 00FF //Land Shadow Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 Counter Factor=3 @@ -4408,7 +4228,8 @@ Status=Compatible [7BB18D40-83138559-C:55] Good Name=Pokemon Snap (A) Internal Name=POKEMON SNAP -Status=Compatible +Status=Issues (Plugin) +Plugin Note= broken; needs accurate FB emu Cheat0=D1382D1C 802C,80382D0F 0000 //Pass 1st Level and Controller Fix Cheat1=D11E3C44 2881,811E3C44 2001,D11E3C46 0098,811E3C46 0001 //Make Picture selectable CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -4417,7 +4238,8 @@ CheatPlugin1=Jabo's Direct3D8,Glide64 For PJ64 [4FF5976F-ACF559D8-C:50] Good Name=Pokemon Snap (E) Internal Name=POKEMON SNAP -Status=Compatible +Status=Issues (Plugin) +Plugin Note= broken; needs accurate FB emu Cheat0=D1381BFC 802C,80381BEF 0000 //Pass 1st Level and Controller Fix Cheat1=D11E3824 2881,811E3824 2001,D11E3826 0098,811E3826 0001 //Make Picture selectable CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -4426,7 +4248,8 @@ CheatPlugin1=Jabo's Direct3D8,Glide64 For PJ64 [BA6C293A-9FAFA338-C:46] Good Name=Pokemon Snap (F) Internal Name=POKEMON SNAP -Status=Compatible +Status=Issues (Plugin) +Plugin Note= broken; needs accurate FB emu Cheat0=D1381BFC 802C,80381BEF 0000 //Pass 1st Level and Controller Fix Cheat1=D11E3744 2881,811E3744 2001,D11E3746 0098,811E3746 0001 //Make Picture selectable CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -4435,7 +4258,8 @@ CheatPlugin1=Jabo's Direct3D8,Glide64 For PJ64 [5753720D-2A8A884D-C:44] Good Name=Pokemon Snap (G) Internal Name=POKEMON SNAP -Status=Compatible +Status=Issues (Plugin) +Plugin Note= broken; needs accurate FB emu Cheat0=D1381BDC 802C,80381BCF 0000 //Pass 1st Level and Controller Fix Cheat1=D11E3744 2881,811E3744 2001,D11E3746 0098,811E3746 0001 //Make Picture selectable CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -4444,7 +4268,8 @@ CheatPlugin1=Jabo's Direct3D8,Glide64 For PJ64 [C0C85046-61051B05-C:49] Good Name=Pokemon Snap (I) Internal Name=POKEMON SNAP -Status=Compatible +Status=Issues (Plugin) +Plugin Note= broken; needs accurate FB emu Cheat0=D1381BFC 802C,80381BEF 0000 //Pass 1st Level and Controller Fix Cheat1=D11E3994 2881,811E3994 2001,D11E3996 0098,811E3996 0001 //Make Picture selectable CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -4453,7 +4278,8 @@ CheatPlugin1=Jabo's Direct3D8,Glide64 For PJ64 [EC0F690D-32A7438C-C:4A] Good Name=Pokemon Snap (J) (V1.0) Internal Name=POKEMON SNAP -Status=Compatible +Status=Issues (Plugin) +Plugin Note= broken; needs accurate FB emu Cheat0=D136D22C 802A,8036D21F 0000 //Pass 1st Level and Controller Fix Cheat1=D11E1EC4 2881,811E1EC4 2001,D11E1EC6 0098,811E1EC6 0001 //Make Picture selectable CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -4462,7 +4288,8 @@ CheatPlugin1=Jabo's Direct3D8,Glide64 For PJ64 [E0044E9E-CD659D0D-C:4A] Good Name=Pokemon Snap (J) (V1.1) Internal Name=POKEMON SNAP -Status=Compatible +Status=Issues (Plugin) +Plugin Note= broken; needs accurate FB emu Cheat0=D136D22C 802A,8036D21F 0000 //Pass 1st Level and Controller Fix Cheat1=D11E1EC4 2881,811E1EC4 2001,D11E1EC6 0098,811E1EC6 0001 //Make Picture selectable CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -4471,7 +4298,8 @@ CheatPlugin1=Jabo's Direct3D8,Glide64 For PJ64 [817D286A-EF417416-C:53] Good Name=Pokemon Snap (S) Internal Name=POKEMON SNAP -Status=Compatible +Status=Issues (Plugin) +Plugin Note= broken; needs accurate FB emu Cheat0=D1381BFC 802C,80381BEF 0000 //Pass 1st Level and Controller Fix Cheat1=D11E38C4 2881,811E38C4 2001,D11E38C6 0098,811E38C6 0001 //Make Picture selectable CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -4480,7 +4308,8 @@ CheatPlugin1=Jabo's Direct3D8,Glide64 For PJ64 [CA12B547-71FA4EE4-C:45] Good Name=Pokemon Snap (U) Internal Name=POKEMON SNAP -Status=Compatible +Status=Issues (Plugin) +Plugin Note= broken; needs accurate FB emu Cheat0=D1382D1C 802C,80382D0F 0000 //Pass 1st Level and Controller Fix Cheat1=D11E3184 2881,811E3184 2001,D11E3186 0098,811E3186 0001 //Make Picture selectable CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -4489,7 +4318,8 @@ CheatPlugin1=Jabo's Direct3D8,Glide64 For PJ64 [39119872-07722E9F-C:45] Good Name=Pokemon Snap Station (U) Internal Name=POKEMON SNAP -Status=Compatible +Status=Issues (Plugin) +Plugin Note= broken; needs accurate FB emu Cheat0=D1382D1C 802C,80382D0F 0000 //Pass 1st Level and Controller Fix Cheat1=D11E30F4 2881,811E30F4 2001,D11E30F6 0098,811E30F6 0001 //Make Picture selectable CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -4499,7 +4329,7 @@ CheatPlugin1=Jabo's Direct3D8,Glide64 For PJ64 Good Name=Pokemon Stadium (E) (V1.0) Internal Name=POKEMON STADIUM Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4508,7 +4338,7 @@ Linking=Off Good Name=Pokemon Stadium (E) (V1.1) Internal Name=POKEMON STADIUM Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4517,7 +4347,7 @@ Linking=Off Good Name=Pokemon Stadium (F) Internal Name=POKEMON STADIUM Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4526,7 +4356,7 @@ Linking=Off Good Name=Pokemon Stadium (G) Internal Name=POKEMON STADIUM Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4535,7 +4365,7 @@ Linking=Off Good Name=Pokemon Stadium (I) Internal Name=POKEMON STADIUM Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4544,7 +4374,7 @@ Linking=Off Good Name=Pokemon Stadium (J) Internal Name=POKEMON STADIUM Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4554,7 +4384,7 @@ Save Type=Sram Good Name=Pokemon Stadium (S) Internal Name=POKEMON STADIUM Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4563,7 +4393,7 @@ Linking=Off Good Name=Pokemon Stadium (U) (V1.0) Internal Name=POKEMON STADIUM Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4572,7 +4402,7 @@ Linking=Off Good Name=Pokemon Stadium - Kiosk (U) (V1.1) Internal Name=POKEMON STADIUM Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4581,7 +4411,7 @@ Linking=Off Good Name=Pokemon Stadium (U) (V1.2) Internal Name=POKEMON STADIUM Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4590,7 +4420,7 @@ Linking=Off Good Name=Pokemon Stadium 2 (E) Internal Name=POKEMON STADIUM 2 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4600,7 +4430,7 @@ RDRAM Size=8 Good Name=Pokemon Stadium 2 (F) Internal Name=POKEMON STADIUM 2 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4610,7 +4440,7 @@ RDRAM Size=8 Good Name=Pokemon Stadium 2 (G) Internal Name=POKEMON STADIUM 2 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4620,7 +4450,7 @@ RDRAM Size=8 Good Name=Pokemon Stadium 2 (I) Internal Name=POKEMON STADIUM 2 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4630,7 +4460,7 @@ RDRAM Size=8 Good Name=Pokemon Stadium 2 (J) Internal Name=POKEMON STADIUM 2 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4640,7 +4470,7 @@ RDRAM Size=8 Good Name=Pokemon Stadium 2 (S) Internal Name=POKEMON STADIUM 2 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4650,7 +4480,7 @@ RDRAM Size=8 Good Name=Pokemon Stadium 2 (U) Internal Name=POKEMON STADIUM 2 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4660,7 +4490,7 @@ RDRAM Size=8 Good Name=Pokemon Stadium Kin Gin (J) Internal Name=POKEMON STADIUM G&S Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] various issues Culling=1 Emulate Clear=1 Linking=Off @@ -4670,7 +4500,6 @@ RDRAM Size=8 Good Name=Polaris SnoCross (U) Internal Name=POLARISSNOCROSS Status=Compatible -Plugin Note=[video] errors:various [D7A6DCFA-CCFEB6B7-C:4A] Good Name=Power League 64 (J) @@ -4681,14 +4510,12 @@ Status=Compatible Good Name=Power Rangers - Lightspeed Rescue (E) Internal Name=POWER RANGERS Status=Compatible -Plugin Note=[video] errors:2D; use Glide64 (see GameFAQ) RDRAM Size=8 [CF8957AD-96D57EA9-C:45] Good Name=Power Rangers - Lightspeed Rescue (U) Internal Name=POWER RANGERS Status=Compatible -Plugin Note=[video] errors:2D; use Glide64 (see GameFAQ) RDRAM Size=8 [F3D27F54-C111ACF9-C:50] @@ -4711,21 +4538,18 @@ Counter Factor=1 [1BDCB30F-A132D876-C:4A] Good Name=Pro Mahjong Tsuwamono 64 - Jansou Battle ni Chousen (J) Internal Name=TSUWAMONO64 -Status=Issues (plugin) -Plugin Note=[video] slow; errors:textures +Status=Compatible Counter Factor=1 [94807E6B-60CC62E4-C:4A] Good Name=Puyo Puyo Sun 64 (J) Internal Name=PUYO PUYO SUN 64 -Status=Issues (plugin) -Plugin Note=[video] slow; ok in game? +Status=Compatible [4B4672B9-2DBE5DE7-C:4A] Good Name=Puyo Puyon Party (J) Internal Name=PUYOPUYO4 Status=Compatible -Plugin Note=[video] unsupported; use Glide64 [C0DE0747-A2DF72D3-C:4A] Good Name=Puzzle Bobble 64 (J) @@ -4748,20 +4572,19 @@ Screenhertz=50 Good Name=Puzzle Master 64 by Michael Searl (PD) Internal Name=Puzzle Master 64 Status=Compatible -Plugin Note=[video] d3d clear mode: only per frame //================ Q ================ [16931D74-65DC6D34-C:50] Good Name=Quake 64 (E) Internal Name=Quake Status=Compatible -Plugin Note=[video] depth problem, flicker; use Glide64 (see GameFAQ) +Plugin Note=[Glide64] incorrect underwater rendering [9F5BF79C-D2FE08A0-C:45] Good Name=Quake 64 (U) Internal Name=Quake Status=Compatible -Plugin Note=[video] depth problem, flicker; use Glide64 (see GameFAQ) +Plugin Note=[Glide64] incorrect underwater rendering Culling=1 [F4D89C08-3F34930D-C:0] @@ -4773,7 +4596,7 @@ Status=Compatible Good Name=Quake II (E) Internal Name=QUAKE II Status=Compatible -Plugin Note=[video] Glide64 Underwater Depth issues. +Plugin Note=[Glide64] incorrect underwater rendering Counter Factor=1 RDRAM Size=8 @@ -4781,7 +4604,7 @@ RDRAM Size=8 Good Name=Quake II (U) Internal Name=QUAKE II Status=Compatible -Plugin Note=[video] Glide64 Underwater Depth issues. +Plugin Note=[Glide64] incorrect underwater rendering Counter Factor=1 Culling=1 RDRAM Size=8 @@ -4790,14 +4613,13 @@ RDRAM Size=8 Good Name=Quest 64 (U) Internal Name=Quest 64 Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] incorrect texture filtering //================ R ================ [2877AC2D-C3DC139A-C:44] Good Name=Racing Simulation 2 (G) Internal Name=Racing Simulation 2 Status=Compatible -Plugin Note=[video] errors:resolution issues Culling=1 [67D21868-C5424061-C:50] @@ -4814,13 +4636,11 @@ Status=Compatible Good Name=Rally '99 (J) Internal Name=Rally'99 Status=Compatible -Plugin Note=[video] errors:various (see GameFAQ) [73A88E3D-3AC5C571-C:45] Good Name=Rally Challenge 2000 (U) Internal Name=RALLY CHALLENGE Status=Compatible -Plugin Note=[video] errors:various (see GameFAQ) Clear Frame=2 Culling=1 @@ -4849,7 +4669,7 @@ Status=Compatible Good Name=Rat Attack (E) (M6) Internal Name=RAT ATTACK Status=Issues (core) -Core Note=hangs on multiplayer theme select +Core Note=hangs on MP theme select SMM-FUNC=0 Use TLB=No @@ -4857,7 +4677,7 @@ Use TLB=No Good Name=Rat Attack (U) (M6) Internal Name=RAT ATTACK Status=Issues (core) -Core Note=hangs on multiplayer theme select +Core Note=hangs on MP theme select SMM-FUNC=0 Use TLB=No @@ -4865,7 +4685,6 @@ Use TLB=No Good Name=Rayman 2 - The Great Escape (E) (M5) Internal Name=Rayman 2 Status=Compatible -Plugin Note=[video] errors:lum colour (see GameFAQ) RDRAM Size=8 Counter Factor=1 @@ -4873,7 +4692,6 @@ Counter Factor=1 Good Name=Rayman 2 - The Great Escape (U) (M5) Internal Name=Rayman 2 Status=Compatible -Plugin Note=[video] errors:lum colour (see GameFAQ) Culling=1 RDRAM Size=8 Counter Factor=1 @@ -4889,25 +4707,20 @@ RDRAM Size=8 Good Name=Re-Volt (E) (M4) Internal Name=Re-Volt Status=Compatible -Plugin Note=[video] slow in options menu RDRAM Size=8 -ViRefresh=1500 Counter Factor=1 [0F1FA987-BFC1AFA6-C:45] Good Name=Re-Volt (U) Internal Name=Re-Volt Status=Compatible -Plugin Note=[video] slow in options menu RDRAM Size=8 -ViRefresh=1500 Counter Factor=1 [8BD4A334-1E138B05-C:50] Good Name=Ready 2 Rumble Boxing (E) (M3) Internal Name=READY 2 RUMBLE -Status=Region issue (plugin) -Plugin Note=[video] (see GameFAQ) +Status=Compatible [EAB7B429-BAC92C57-C:45] Good Name=Ready 2 Rumble Boxing (U) @@ -4924,8 +4737,7 @@ Counter Factor=1 Good Name=Resident Evil 2 (E) (M2) Internal Name=Resident Evil II Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] depth problem (use Glide64 and RDRAM Size=4 in main RDB, otherwise Glide64 will not render all the background in some scenes) +Plugin Note=[Glide64] some glitched backgrounds 32bit=No AudioResetOnLoad=Yes Counter Factor=1 @@ -4935,8 +4747,7 @@ Linking=Off Good Name=Resident Evil 2 (U) (V1.0) Internal Name=Resident Evil II Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] depth problem (use Glide64 and RDRAM Size=4 in main RDB, otherwise Glide64 will not render all the background in some scenes) +Plugin Note=[Glide64] some glitched backgrounds 32bit=No AudioResetOnLoad=Yes Counter Factor=1 @@ -4947,8 +4758,7 @@ Linking=Off Good Name=Resident Evil 2 (U) (V1.1) Internal Name=Resident Evil II Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] depth problem (use Glide64 and RDRAM Size=4 in main RDB, otherwise Glide64 will not render all the background in some scenes) +Plugin Note=[Glide64] some glitched backgrounds 32bit=No AudioResetOnLoad=Yes Counter Factor=1 @@ -4973,8 +4783,6 @@ RDRAM Size=8 Good Name=Roadsters Trophy (E) (M6) Internal Name=ROADSTERS TROPHY Status=Compatible -Core Note=high system requirement -Plugin Note=[video] missing:mirror; use Glide64 Culling=1 RDRAM Size=8 @@ -4982,8 +4790,6 @@ RDRAM Size=8 Good Name=Roadsters Trophy (U) (M3) Internal Name=ROADSTERS TROPHY Status=Compatible -Core Note=high system requirement -Plugin Note=[video] missing:mirror; use Glide64 Counter Factor=1 RDRAM Size=8 @@ -5039,7 +4845,6 @@ Save Type=16kbit Eeprom Good Name=RTL World League Soccer 2000 (G) Internal Name=RTL WLS2000 Status=Compatible -Plugin Note=[video] unsupported; use Glide64 RDRAM Size=8 [451ACA0F-7863BC8A-C:44] @@ -5088,13 +4893,11 @@ Counter Factor=1 Good Name=S.C.A.R.S. (E) (M3) Internal Name=SCARS Status=Compatible -Plugin Note=[video] errors:depth on effects [769147F3-2033C10E-C:45] Good Name=S.C.A.R.S. (U) Internal Name=SCARS Status=Compatible -Plugin Note=[video] errors:depth on effects [5E3E60E8-4AB5D495-C:4A] Good Name=Saikyou Habu Shougi (J) @@ -5109,19 +4912,16 @@ RDRAM Size=8 Good Name=San Francisco Rush - Extreme Racing (E) (M3) Internal Name=S.F.RUSH Status=Compatible -Plugin Note=[video] missing:car selection (see GameFAQ) [2A6B1820-6ABCF466-C:45] Good Name=San Francisco Rush - Extreme Racing (U) (V1.0) Internal Name=S.F. RUSH Status=Compatible -Plugin Note=[video] missing:car selection (see GameFAQ) [AC9F7DA7-A8C029D8-C:45] Good Name=San Francisco Rush - Extreme Racing (U) (V1.1) Internal Name=S.F. RUSH Status=Compatible -Plugin Note=[video] missing:car selection (see GameFAQ) [51D29418-D5B46AE3-C:50] Good Name=San Francisco Rush 2049 (E) (M6) @@ -5155,8 +4955,8 @@ Status=Compatible [EBF5F6B7-C956D739-C:4A] Good Name=SD Hiryuu no Ken Densetsu (J) Internal Name=SD HIRYU STADIUM -Status=Needs video plugin -Plugin Note=[video] missing:menus,HUD +Status=Compatible +Plugin Note=[Glide64] slow in menus RDRAM Size=8 [93A625B9-2D6022E6-C:42] @@ -5223,8 +5023,7 @@ Status=Compatible Good Name=Shin Nihon Pro Wrestling Toukon Road - Brave Spirits (J) Internal Name=TOUKON ROAD Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] HLE not supported; flicker +Plugin Note=[video] HLE not supported RDRAM Size=8 Delay SI=Yes HLE GFX=No @@ -5233,15 +5032,14 @@ HLE GFX=No Good Name=Shin Nihon Pro Wrestling Toukon Road 2 - The Next Generation (J) Internal Name=TOUKON ROAD2 Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] HLE not supported; flicker +Plugin Note=[video] HLE not supported HLE GFX=No RDRAM Size=8 [909535F8-118FEF8F-C:4A] Good Name=Sim City 64 (J) [CART HACK] Status=Issues (plugin) -Plugin Note=[video] HLE not supported; rendering problems in city +Plugin Note=[Glide64] incompatible; use GLideN64 32bit=No Counter Factor=1 HLE GFX=No @@ -5257,7 +5055,6 @@ Status=Compatible Good Name=Sin & Punishment (J) [T] Internal Name=Sin and Punishment Status=Compatible -Plugin Note=[video] errors:static in cutscenes AudioResetOnLoad=Yes Clear Frame=2 Culling=1 @@ -5275,7 +5072,6 @@ Culling=1 Good Name=Snow Speeder (J) Internal Name=Snow Speeder Status=Compatible -Plugin Note=[video] errors:menus; use 1.5.2 plugin [5FD7CDA0-D9BB51AD-C:50] Good Name=Snowboard Kids (E) @@ -5337,14 +5133,15 @@ RDRAM Size=8 [C00CA948-8E60D34B-C:50] Good Name=South Park - Chef's Luv Shack (E) Internal Name=South Park Chef's Lu -Status=Region issue (plugin) -Plugin Note=[video] errors:textures;use (U) ROM +Status=Issues (Plugin) +Plugin Note=incorrect everything RDRAM Size=8 [C00CA948-8E60D34B-C:45] Good Name=South Park - Chef's Luv Shack (U) Internal Name=South Park: Chef's L -Status=Compatible +Status=Issues (Plugin) +Plugin Note=incorrect everything RDRAM Size=8 [4F8AFC3A-F7912DF2-C:50] @@ -5361,10 +5158,9 @@ Culling=1 [37463412-EAC5388D-C:4A] Good Name=Space Dynamites (J) Internal Name=SPACE DYNAMITES -Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] slow in cutscenes -RDRAM Size=8 +Status=Compatible +Culling=1 +RDRAM Size=8 //why does Japanese Dark Rift have 8MB enabled? [EBFE2397-FF74DA34-C:45] Good Name=Space Invaders (U) @@ -5375,7 +5171,7 @@ Status=Compatible Good Name=Space Station Silicon Valley (E) (M7) Internal Name=Silicon Valley Status=Compatible -Plugin Note=[video] errors:cutscenes +Plugin Note=[Glide64] missing TV noise Culling=1 RDRAM Size=8 @@ -5383,14 +5179,14 @@ RDRAM Size=8 Good Name=Space Station Silicon Valley (J) Internal Name=Silicon Valley Status=Compatible -Plugin Note=[video] errors:cutscenes +Plugin Note=[Glide64] missing TV noise RDRAM Size=8 [BFE23884-EF48EAAF-C:45] Good Name=Space Station Silicon Valley (U) Internal Name=Silicon Valley Status=Compatible -Plugin Note=[video] errors:cutscenes +Plugin Note=[Glide64] missing TV noise Culling=1 RDRAM Size=8 @@ -5398,11 +5194,10 @@ RDRAM Size=8 Good Name=Spider-Man (U) Internal Name=SPIDERMAN Status=Compatible -Plugin Note=[video] (see GameFAQ) +AudioResetOnLoad=Yes Clear Frame=2 Culling=1 RDRAM Size=8 -AudioResetOnLoad=Yes [FFCAA7C1-68858537-C:4A] Good Name=Star Fox 64 (J) (V1.0) @@ -5449,7 +5244,7 @@ Status=Compatible Good Name=Star Twins (J) Internal Name=STAR TWINS Status=Compatible -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] incorrect shadows Counter Factor=1 Culling=1 Emulate Clear=1 @@ -5463,8 +5258,7 @@ SMM-TLB=0 Good Name=Star Wars - Rogue Squadron (E) (M3) (V1.0) Internal Name=Rogue Squadron Status=Broken (plugin) -Core Note=high system requirement -Plugin Note=[rsp] interpreter only, flicker [video] (see GameFAQ) +Plugin Note=[rsp] interpreter only [Glide64] not supported 32bit=No AudioResetOnLoad=Yes Counter Factor=1 @@ -5476,8 +5270,7 @@ RSP-JumpTableSize=3584 Good Name=Star Wars - Rogue Squadron (E) (M3) (V1.1) Internal Name=Rogue Squadron Status=Broken (plugin) -Core Note=high system requirement -Plugin Note=[rsp] interpreter only, flicker [video] (see GameFAQ) +Plugin Note=[rsp] interpreter only [Glide64] not supported 32bit=No AudioResetOnLoad=Yes Counter Factor=1 @@ -5489,8 +5282,7 @@ RSP-JumpTableSize=3584 Good Name=Star Wars - Rogue Squadron (U) (V1.0) Internal Name=Rogue Squadron Status=Broken (plugin) -Core Note=high system requirement -Plugin Note=[rsp] interpreter only, flicker [video] (see GameFAQ) +Plugin Note=[rsp] interpreter only [Glide64] not supported 32bit=No AudioResetOnLoad=Yes Counter Factor=1 @@ -5502,8 +5294,7 @@ RSP-JumpTableSize=3584 Good Name=Star Wars - Rogue Squadron (U) (V1.1) Internal Name=Rogue Squadron Status=Broken (plugin) -Core Note=high system requirement -Plugin Note=[rsp] interpreter only, flicker [video] (see GameFAQ) +Plugin Note=[rsp] interpreter only [Glide64] not supported 32bit=No AudioResetOnLoad=Yes Counter Factor=1 @@ -5515,14 +5306,14 @@ RSP-JumpTableSize=3584 Good Name=Star Wars - Shadows of the Empire (E) Internal Name=Shadow of the Empire Status=Compatible -Plugin Note=[video] flicker; use Glide64 +Core Note=swoop bike speed issue RDRAM Size=8 [264D7E5C-18874622-C:45] Good Name=Star Wars - Shadows of the Empire (U) (V1.0) Internal Name=Shadow of the Empire Status=Compatible -Plugin Note=[video] flicker; use Glide64 +Core Note=swoop bike speed issue Clear Frame=1 Culling=1 RDRAM Size=8 @@ -5531,7 +5322,7 @@ RDRAM Size=8 Good Name=Star Wars - Shadows of the Empire (U) (V1.1) Internal Name=Shadow of the Empire Status=Compatible -Plugin Note=[video] flicker; use Glide64 +Core Note=swoop bike speed issue Clear Frame=1 RDRAM Size=8 @@ -5539,7 +5330,7 @@ RDRAM Size=8 Good Name=Star Wars - Shadows of the Empire (U) (V1.2) Internal Name=Shadow of the Empire Status=Compatible -Plugin Note=[video] flicker; use Glide64 +Core Note=swoop bike speed issue Clear Frame=1 RDRAM Size=8 @@ -5548,26 +5339,26 @@ Good Name=Star Wars - Shutsugeki! Rogue Chuutai (J) Internal Name=rogue squadron Status=Broken (plugin) Core Note=high system requirement -Plugin Note=[rsp] interpreter only, flicker [video] (see GameFAQ) +Plugin Note=[rsp] interpreter only [Glide64] not supported 32bit=No HLE GFX=No RDRAM Size=8 -ViRefresh=1400 +RSP-JumpTableSize=3584 [FE24AC63-1B41AA17-C:4A] Good Name=Star Wars - Teikoku no Kage (J) Internal Name=Shadow of the Empire Status=Compatible -Plugin Note=[video] flicker; use Glide64 +Core Note=swoop bike speed issue Clear Frame=1 +Counter Factor=1 RDRAM Size=8 [EAE6ACE2-020B4384-C:50] Good Name=Star Wars Episode I - Battle for Naboo (E) Internal Name=Battle for Naboo Status=Only intro/part OK -Core Note=(see GameFAQ) -Plugin Note=[rsp] interpreter only [video] errors:various (see GameFAQ) +Plugin Note=[rsp] interpreter only [video] not supported 32bit=No AudioResetOnLoad=Yes Counter Factor=1 @@ -5579,8 +5370,7 @@ SMM-FUNC=0 Good Name=Star Wars Episode I - Battle for Naboo (U) Internal Name=Battle for Naboo Status=Only intro/part OK -Core Note=(see GameFAQ) -Plugin Note=[rsp] interpreter only [video] errors:various (see GameFAQ) +Plugin Note=[rsp] interpreter only [video] not supported 32bit=No AudioResetOnLoad=Yes Counter Factor=1 @@ -5593,7 +5383,7 @@ Good Name=Star Wars Episode I - Racer (E) (M3) Internal Name=STAR WARS EP1 RACER Status=Compatible AudioResetOnLoad=Yes -Counter Factor=1 +Counter Factor=1 //this increases overheads dramatically, so might need removing Culling=1 Emulate Clear=1 RDRAM Size=8 @@ -5604,7 +5394,7 @@ Good Name=Star Wars Episode I - Racer (J) Internal Name=STAR WARS EP1 RACER Status=Compatible AudioResetOnLoad=Yes -Counter Factor=1 +Counter Factor=1 //this increases overheads dramatically, so might need removing Culling=1 Emulate Clear=1 RDRAM Size=8 @@ -5615,7 +5405,7 @@ Good Name=Star Wars Episode I - Racer (U) Internal Name=STAR WARS EP1 RACER Status=Compatible AudioResetOnLoad=Yes -Counter Factor=1 +Counter Factor=1 //this increases overheads dramatically, so might need removing Culling=1 Emulate Clear=1 RDRAM Size=8 @@ -5671,8 +5461,7 @@ Status=Compatible Good Name=Stunt Racer 64 (U) Internal Name=Stunt Racer 64 Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] errors:various [audio] bad +Plugin Note=[Glide64] not supported [audio] bad 32bit=No AudioResetOnLoad=Yes HLE GFX=No @@ -5689,56 +5478,55 @@ Plugin Note=[video] slow - ok in game? Good Name=Super Bowling (J) Internal Name=SUPER BOWLING Status=Issues (plugin) -Plugin Note=[video] splitscreen problem; use software rendering +Plugin Note=[Glide64] splitscreen/picture in picture problem [AA1D215A-91CBBE9A-C:45] Good Name=Super Bowling 64 (U) Internal Name=SUPER BOWLING Status=Issues (plugin) -Plugin Note=[video] splitscreen problem; use software rendering +Plugin Note=[Glide64] splitscreen/picture in picture problem [A03CF036-BCC1C5D2-C:50] Good Name=Super Mario 64 (E) (M3) Internal Name=SUPER MARIO 64 Status=Compatible -Plugin Note=[video] missing:dissolve effect; use Glide64 (see GameFAQ) +Culling=1 [4EAA3D0E-74757C24-C:4A] Good Name=Super Mario 64 (J) Internal Name=SUPER MARIO 64 Status=Compatible -Plugin Note=[video] missing:dissolve effect; use Glide64 (see GameFAQ) +Culling=1 [635A2BFF-8B022326-C:45] Good Name=Super Mario 64 (U) Internal Name=SUPER MARIO 64 Status=Compatible -Plugin Note=[video] missing:dissolve effect; use Glide64 (see GameFAQ) Culling=1 [D6FBA4A8-6326AA2C-C:4A] Good Name=Super Mario 64 - Shindou Edition (J) Internal Name=SUPERMARIO64 Status=Compatible -Plugin Note=[video] missing:dissolve effect; use Glide64 (see GameFAQ) +Culling=1 [66572080-28E348E1-C:4A] Good Name=Super Robot Spirits (J) Internal Name=SUPERROBOTSPIRITS -Status=Issues (plugin) -Plugin Note=[video] missing:menus +Status=Compatible Culling=1 [1649D810-F73AD6D2-C:4A] Good Name=Super Robot Taisen 64 (J) Internal Name=½°Êß°ÛÎÞ¯ÄÀ²¾Ý64 Status=Issues (plugin) -Plugin Note=[video] too slow to play +Plugin Note=[Glide64] slow [DD26FDA1-CB4A6BE3-C:55] Good Name=Super Smash Bros. (A) Internal Name=SMASH BROTHERS Status=Compatible +Culling=1 SMM-Cache=0 SMM-FUNC=0 SMM-TLB=0 @@ -5748,6 +5536,7 @@ ViRefresh=2200 Good Name=Super Smash Bros. (E) (M3) Internal Name=SMASH BROTHERS Status=Compatible +Culling=1 SMM-Cache=0 SMM-FUNC=0 SMM-TLB=0 @@ -5772,7 +5561,6 @@ Status=Compatible Good Name=Supercross 2000 (E) (M3) Internal Name=Supercross Status=Compatible -Plugin Note=[video] errors:track; use Glide64 32bit=No RDRAM Size=8 @@ -5780,7 +5568,6 @@ RDRAM Size=8 Good Name=Supercross 2000 (U) Internal Name=Supercross Status=Compatible -Plugin Note=[video] errors:track; use Glide64 32bit=No RDRAM Size=8 @@ -5788,13 +5575,11 @@ RDRAM Size=8 Good Name=Superman (E) (M6) Internal Name=SUPERMAN Status=Compatible -Plugin Note=[video] missing:Titus logo [A2E8F35B-C9DC87D9-C:45] Good Name=Superman (U) (M3) Internal Name=SUPERMAN Status=Compatible -Plugin Note=[video] missing:Titus logo [944FAFC4-B288266A-C:0] Good Name=Superman (Prototype) @@ -5803,14 +5588,13 @@ Status=Compatible [35E811F3-99792724-C:4A] Good Name=Susume! Taisen Puzzle Dama - Toukon! Marutama Chou (J) Internal Name=½½Ò!À²¾ÝÊß½ÞÙÀÞÏ -Status=Needs video plugin -Plugin Note=[video] severe errors +Status=Compatible //so far as I can tell [ECBD95DD-1FAB637D-C:0] Good Name=Sydney 2000 (E) (Unreleased) Internal Name=Syd2k GBR Status=Compatible -Cheat0=80000303 0000 +Cheat0=80000303 0000 //what is this cheat? Resolution Height=239 RDRAM Size=8 @@ -5825,30 +5609,27 @@ RDRAM Size=8 [37955E65-C6F2B7B3-C:0] Good Name=Tamiya Racing 64 (Unreleased) Status=Compatible -Plugin Note=[video] ucode error; can use HLE GFX after loading ROM -HLE GFX=No +Plugin Note=[Glide64] bad numbers +//HLE GFX=No //make sure Glide64 has microcode hack turned on [AEBCDD54-15FF834A-C:50] Good Name=Taz Express (E) (M6) Internal Name=Taz Express Status=Compatible -Core Note=slow to start new game -Plugin Note=[video] errors:textures; use Glide64 +Core Note=slow to start new game; text issue RDRAM Size=8 [6C2C6C49-9BE5CA66-C:45] Good Name=Taz Express (U) (Unreleased) Internal Name=Taz Express Status=Compatible -Core Note=slow to start new game -Plugin Note=[video] errors:textures; use Glide64 +Core Note=slow to start new game; text issue RDRAM Size=8 [D9042FBB-FCFF997C-C:46] Good Name=Telefoot Soccer 2000 (F) Internal Name=TELEFOOT SOCCER 2000 Status=Compatible -Plugin Note=[video] unsupported; use Glide64 RDRAM Size=8 [963ADBA6-F7D5C89B-C:4A] @@ -5875,23 +5656,18 @@ Plugin Note=[video] slow in menus Good Name=TG Rally 2 (E) Internal Name=TG RALLY 2 Status=Compatible -Core Note=timing (see GameFAQ) -Plugin Note=[video] errors:resolution; use 1.6 plugin +//Core Note=timing CHECK THIS Clear Frame=2 [9FC385E5-3ECC05C7-C:50] Good Name=The Legend of Zelda - Majora's Mask (E) (M4) (Debug Version) Internal Name=ZELDA MAJORA'S MASK Status=Compatible -Cote Note=(see GameFAQ) -Plugin Note=[video] errors:day transistion (see GameFAQ) [E97955C6-BC338D38-C:50] Good Name=The Legend of Zelda - Majora's Mask (E) (M4) (V1.0) Internal Name=ZELDA MAJORA'S MASK Status=Compatible -Cote Note=(see GameFAQ) -Plugin Note=[video] errors:day transistion (see GameFAQ) Culling=1 Emulate Clear=1 RDRAM Size=8 @@ -5901,8 +5677,6 @@ Self Texture=1 Good Name=The Legend of Zelda - Majora's Mask (E) (M4) (V1.1) Internal Name=ZELDA MAJORA'S MASK Status=Compatible -Cote Note=(see GameFAQ) -Plugin Note=[video] errors:day transistion (see GameFAQ) Culling=1 Emulate Clear=1 RDRAM Size=8 @@ -5912,8 +5686,6 @@ Self Texture=1 Good Name=The Legend of Zelda - Majora's Mask (U) Internal Name=ZELDA MAJORA'S MASK Status=Compatible -Cote Note=(see GameFAQ) -Plugin Note=[video] errors:day transistion (see GameFAQ) Culling=1 Emulate Clear=1 RDRAM Size=8 @@ -5923,8 +5695,6 @@ Self Texture=1 Good Name=The Legend of Zelda - Majora's Mask - Collector's Edition (E) (M4) (GC) Internal Name=ZELDA MAJORA'S MASK Status=Compatible -Cote Note=(see GameFAQ) -Plugin Note=[video] errors:day transistion (see GameFAQ) Culling=1 Emulate Clear=1 RDRAM Size=8 @@ -5934,8 +5704,6 @@ Self Texture=1 Good Name=The Legend of Zelda - Majora's Mask - Collector's Edition (U) (GC) Internal Name=ZELDA MAJORA'S MASK Status=Compatible -Cote Note=(see GameFAQ) -Plugin Note=[video] errors:day transistion (see GameFAQ) Culling=1 Emulate Clear=1 RDRAM Size=8 @@ -5945,8 +5713,6 @@ Self Texture=1 Good Name=The Legend of Zelda - Majora's Mask - Preview Demo (U) Internal Name=MAJORA'S MASK Status=Compatible -Cote Note=(see GameFAQ) -Plugin Note=[video] errors:day transistion (see GameFAQ) Culling=1 Emulate Clear=1 RDRAM Size=8 @@ -5956,8 +5722,6 @@ Self Texture=1 Good Name=The Legend of Zelda - Ocarina of Time (E) (GC) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Cheat0=801D8F8B 0002 //Subscreen Delay Fix Cheat1=D109A8E4 0320,8109A8E4 0000,D109A8E6 F809,8109A8E6 0000 //End Credits Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -5972,8 +5736,6 @@ RDRAM Size=8 Good Name=The Legend of Zelda - Ocarina of Time (E) (M3) (V1.0) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Cheat0=801D860B 0002 //Subscreen Delay Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 Culling=1 @@ -5987,8 +5749,6 @@ RDRAM Size=8 Good Name=The Legend of Zelda - Ocarina of Time (E) (M3) (V1.1) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Cheat0=801D864B 0002 //Subscreen Delay Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 Culling=1 @@ -6002,8 +5762,6 @@ RDRAM Size=8 Good Name=The Legend of Zelda - Ocarina of Time (U) (GC) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Cheat0=801DB78B 0002 //Subscreen Delay Fix Cheat1=D109A814 0320,8109A814 0000,D109A816 F809,8109A816 0000 //End Credits Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -6018,8 +5776,6 @@ RDRAM Size=8 Good Name=The Legend of Zelda - Ocarina of Time (U) (V1.0) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) 32bit=No Aspect Correction=1 Cheat0=801DA5CB 0002 //Subscreen Delay Fix @@ -6038,8 +5794,6 @@ RDRAM Size=8 Good Name=The Legend of Zelda - Ocarina of Time (U) (V1.1) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) 32bit=No Cheat0=801DA78B 0002 //Subscreen Delay Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -6057,8 +5811,6 @@ RDRAM Size=8 Good Name=The Legend of Zelda - Ocarina of Time (U) (V1.2) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) 32bit=No Cheat0=801DAE8B 0002 CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -6076,8 +5828,6 @@ RDRAM Size=8 Good Name=The Legend of Zelda - Ocarina of Time - Master Quest (E) (GC) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Cheat0=801D8F4B 0002 //Subscreen Delay Fix Cheat1=D109A8C4 0320,8109A8C4 0000,D109A8C6 F809,8109A8C6 0000 //End Credits Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -6089,8 +5839,7 @@ Self Texture=1 Good Name=The Legend of Zelda - Ocarina of Time - Master Quest (E) [f1] (NTSC) Internal Name=ZELDA MASTER QUEST Status=Compatible -Core Note=(see GameFAQ) edited ROM -Plugin Note=[video] (see GameFAQ) +Core Note=edited ROM Cheat0=801D8F4B 0002 //Subscreen Delay Fix Cheat1=D109A8C4 0320,8109A8C4 0000,D109A8C6 F809,8109A8C6 0000 //End Credits Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -6104,8 +5853,6 @@ Self Texture=1 Good Name=The Legend of Zelda - Ocarina of Time - Master Quest (E) [h1C] Internal Name=ZELDA MASTER QUEST Status=Compatible -Core Note=(see GameFAQ) edited ROM -Plugin Note=[video] (see GameFAQ) Cheat0=801D8F4B 0002 //Subscreen Delay Fix Cheat1=D109A8C4 0320,8109A8C4 0000,D109A8C6 F809,8109A8C6 0000 //End Credits Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -6119,8 +5866,6 @@ Self Texture=1 Good Name=The Legend of Zelda - Ocarina of Time - Master Quest (U) (Debug Version) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] errors:sun; RDRAM Size=8 SMM-PI DMA=0 SMM-TLB=0 @@ -6129,8 +5874,6 @@ SMM-TLB=0 Good Name=The Legend of Zelda - Ocarina of Time - Master Quest (U) (GC) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Cheat0=801DB74B 0002 //Subscreen Delay Fix Cheat1=D109A7F4 0320,8109A7F4 0000,D109A7F6 F809,8109A7F6 0000 //End Credits Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -6209,19 +5952,18 @@ RDRAM Size=8 [21260D94-06AE1DFE-C:45] Good Name=Tommy Thunder (U) (Unreleased Alpha) Internal Name=LALA -Status=Issues (plugin) +Status=Compatible +Counter Factor=1 [093F916E-4408B698-C:50] Good Name=Tonic Trouble (E) (M5) Internal Name=Tonic Trouble Status=Compatible -Plugin Note=[video] errors:background [EF9E9714-C03B2C7D-C:45] Good Name=Tonic Trouble (U) (V1.1) Internal Name=Tonic Trouble Status=Compatible -Plugin Note=[video] errors:background Clear Frame=2 Culling=1 Emulate Clear=1 @@ -6282,42 +6024,36 @@ RDRAM Size=8 Good Name=Toon Panic (J) (Beta) Internal Name=Toon Panic Status=Compatible -Plugin Note=[video] errors:textures (see GameFAQ) //use Force Alpha Blending [5F3F49C6-0DC714B0-C:50] Good Name=Top Gear Hyper Bike (E) Internal Name=Top Gear Hyper Bike Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] errors:textures (see GameFAQ) +Plugin Note=[video] errors:textures RDRAM Size=8 [845B0269-57DE9502-C:4A] Good Name=Top Gear Hyper Bike (J) Internal Name=Top Gear Hyper Bike Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] errors:textures (see GameFAQ) +Plugin Note=[video] errors:textures [8ECC02F0-7F8BDE81-C:45] Good Name=Top Gear Hyper Bike (U) Internal Name=Top Gear Hyper Bike Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] errors:textures (see GameFAQ) +Plugin Note=[video] errors:textures RDRAM Size=8 [75FBDE20-A3189B31-C:0] Good Name=Top Gear Hyper Bike (Beta) Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] errors:textures (see GameFAQ) +Plugin Note=[video] errors:textures [D09BA538-1C1A5489-C:50] Good Name=Top Gear Overdrive (E) Internal Name=Top Gear Overdrive Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 Direct3D8-Direct3DPipe=1 RDRAM Size=8 @@ -6326,7 +6062,6 @@ RDRAM Size=8 Good Name=Top Gear Overdrive (J) Internal Name=Top Gear Overdrive Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 Direct3D8-Direct3DPipe=1 RDRAM Size=8 @@ -6335,7 +6070,6 @@ RDRAM Size=8 Good Name=Top Gear Overdrive (U) Internal Name=Top Gear Overdrive Status=Compatible -Plugin Note=[video] (see GameFAQ) Counter Factor=1 Direct3D8-Direct3DPipe=1 RDRAM Size=8 @@ -6344,54 +6078,47 @@ RDRAM Size=8 Good Name=Top Gear Rally (E) Internal Name=TOP GEAR RALLY Status=Issues (mixed) -Core Note=sound (see GameFAQ) -Plugin Note=[video] errors:various; use Glide64 +Core Note=bad sound 32bit=No [0E596247-753D4B8B-C:4A] Good Name=Top Gear Rally (J) Internal Name=TOP GEAR RALLY Status=Issues (mixed) -Core Note=sound (see GameFAQ) -Plugin Note=[video] errors:various; use Glide64 +Core Note=bad sound 32bit=No [62269B3D-FE11B1E8-C:45] Good Name=Top Gear Rally (U) Internal Name=TOP GEAR RALLY Status=Issues (mixed) -Core Note=sound (see GameFAQ) -Plugin Note=[video] errors:various; use Glide64 +Core Note=bad sound 32bit=No [BEBAB677-51B0B5E4-C:50] Good Name=Top Gear Rally 2 (E) Internal Name=TOP GEAR RALLY 2 Status=Compatible -Core Note=timing (see GameFAQ) -Plugin Note=[video] errors:resolution; use 1.6 plugin +//Core Note=timing //CHECK THIS Clear Frame=2 [CFEF2CD6-C9E973E6-C:4A] Good Name=Top Gear Rally 2 (J) Internal Name=TOP GEAR RALLY 2 Status=Compatible -Core Note=timing (see GameFAQ) -Plugin Note=[video] errors:resolution; use 1.6 plugin +//Core Note=timing //CHECK THIS [BE5973E0-89B0EDB8-C:45] Good Name=Top Gear Rally 2 (U) Internal Name=TOP GEAR RALLY 2 Status=Compatible -Core Note=timing (see GameFAQ) -Plugin Note=[video] errors:resolution; use 1.6 plugin +//Core Note=timing //CHECK THIS RDRAM Size=8 [EFDF9140-A4168D6B-C:0] Good Name=Top Gear Rally 2 (Beta) Status=Compatible -Core Note=timing (see GameFAQ) -Plugin Note=[video] errors:resolution; use 1.6 plugin +//Core Note=timing [90AF8D2C-E1AC1B37-C:0] Counter Factor=1 @@ -6440,15 +6167,11 @@ Counter Factor=1 Good Name=Transformers - Beast Wars Metals 64 (J) Internal Name=BEASTWARSMETALS64 Status=Compatible -Core Note=high system requirement -Plugin Note=[video] slow; use Glide64 [4D79D316-E8501B33-C:45] Good Name=Transformers - Beast Wars Transmetal (U) Internal Name=BEAST WARS US Status=Compatible -Core Note=high system requirement -Plugin Note=[video] slow; use Glide64 [FE4B6B43-081D29A7-C:45] Good Name=Triple Play 2000 (U) @@ -6460,7 +6183,6 @@ Counter Factor=1 Good Name=Tsumi to Batsu - Hoshi no Keishousha (J) Internal Name=TSUMI TO BATSU Status=Compatible -Plugin Note=[video] errors:static in cutscenes AudioResetOnLoad=Yes Clear Frame=2 Culling=1 @@ -6471,55 +6193,54 @@ RDRAM Size=8 Good Name=Turok - Dinosaur Hunter (E) (V1.0) Internal Name=TUROK_DINOSAUR_HUNTE Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] broken mipmapping AudioResetOnLoad=Yes +Counter Factor=1 //seems to fix level 4 crash; more testing needed [2F700DCD-176CC5C9-C:50] Good Name=Turok - Dinosaur Hunter (E) (V1.1) (V1.2) Internal Name=TUROK_DINOSAUR_HUNTE Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] broken mipmapping AudioResetOnLoad=Yes +Counter Factor=1 //seems to fix level 4 crash; more testing needed [665FD963-B5CC6612-C:44] Good Name=Turok - Dinosaur Hunter (G) (V1.0) Internal Name=TUROK_DINOSAUR_HUNTE Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] broken mipmapping AudioResetOnLoad=Yes +Counter Factor=1 //seems to fix level 4 crash; more testing needed [665FC793-6934A73B-C:44] Good Name=Turok - Dinosaur Hunter (G) (V1.1) (V1.2) Internal Name=TUROK_DINOSAUR_HUNTE Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] broken mipmapping AudioResetOnLoad=Yes +Counter Factor=1 //seems to fix level 4 crash; more testing needed [2F70F10D-5C4187FF-C:45] Good Name=Turok - Dinosaur Hunter (U) (V1.0) Internal Name=TUROK_DINOSAUR_HUNTE Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] broken mipmapping AudioResetOnLoad=Yes +Counter Factor=1 //seems to fix level 4 crash; more testing needed [2F700DCD-176CC5C9-C:45] Good Name=Turok - Dinosaur Hunter (U) (V1.1) (V1.2) Internal Name=TUROK_DINOSAUR_HUNTE Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) +Plugin Note=[Glide64] broken mipmapping AudioResetOnLoad=Yes +Counter Factor=1 //seems to fix level 4 crash; more testing needed [66E4FA0F-DE88C7D0-C:44] Good Name=Turok - Legenden des Verlorenen Landes (G) Internal Name=Turok: Rage Wars Status=Compatible -Core Note=(see GameFAQ) AudioResetOnLoad=Yes RDRAM Size=8 @@ -6527,7 +6248,6 @@ RDRAM Size=8 Good Name=Turok - Rage Wars (E) Internal Name=Turok: Rage Wars Status=Compatible -Core Note=(see GameFAQ) AudioResetOnLoad=Yes RDRAM Size=8 @@ -6535,7 +6255,6 @@ RDRAM Size=8 Good Name=Turok - Rage Wars (FI) Internal Name=Turok: Rage Wars Status=Compatible -Core Note=(see GameFAQ) AudioResetOnLoad=Yes RDRAM Size=8 @@ -6543,14 +6262,13 @@ RDRAM Size=8 Good Name=Turok - Rage Wars (U) (V1.0) Internal Name=Turok: Rage Wars Status=Compatible -Core Note=(see GameFAQ) +AudioResetOnLoad=Yes RDRAM Size=8 [2388984C-DA7B3CC5-C:45] Good Name=Turok - Rage Wars (U) (V1.1) Internal Name=Turok: Rage Wars Status=Compatible -Core Note=(see GameFAQ) AudioResetOnLoad=Yes RDRAM Size=8 @@ -6558,7 +6276,7 @@ RDRAM Size=8 Good Name=Turok 2 - Seeds of Evil (E) (Kiosk Demo) Internal Name=Turok 2: Kiosk Status=Compatible -Core Note=(see GameFAQ) +Plugin Note=[video] HLE missing lighting AudioResetOnLoad=Yes RDRAM Size=8 @@ -6566,7 +6284,7 @@ RDRAM Size=8 Good Name=Turok 2 - Seeds of Evil (E) (M4) Internal Name=Turok 2: Seeds of Ev Status=Compatible -Core Note=(see GameFAQ) +Plugin Note=[video] HLE missing lighting AudioResetOnLoad=Yes RDRAM Size=8 @@ -6574,7 +6292,7 @@ RDRAM Size=8 Good Name=Turok 2 - Seeds of Evil (FIS) (M3) Internal Name=Turok 2: Seeds of Ev Status=Compatible -Core Note=(see GameFAQ) +Plugin Note=[video] HLE missing lighting AudioResetOnLoad=Yes RDRAM Size=8 @@ -6582,7 +6300,7 @@ RDRAM Size=8 Good Name=Turok 2 - Seeds of Evil (G) Internal Name=Turok 2: Seeds of Ev Status=Compatible -Core Note=(see GameFAQ) +Plugin Note=[video] HLE missing lighting AudioResetOnLoad=Yes RDRAM Size=8 @@ -6590,7 +6308,7 @@ RDRAM Size=8 Good Name=Turok 2 - Seeds of Evil (U) (Kiosk Demo) Internal Name=Turok 2: Kiosk Status=Compatible -Core Note=(see GameFAQ) +Plugin Note=[video] HLE missing lighting AudioResetOnLoad=Yes RDRAM Size=8 @@ -6598,7 +6316,7 @@ RDRAM Size=8 Good Name=Turok 2 - Seeds of Evil (U) (V1.0) Internal Name=Turok 2: Seeds of Ev Status=Compatible -Core Note=(see GameFAQ) +Plugin Note=[video] HLE missing lighting AudioResetOnLoad=Yes RDRAM Size=8 @@ -6606,7 +6324,7 @@ RDRAM Size=8 Good Name=Turok 2 - Seeds of Evil (U) (V1.1) Internal Name=Turok 2: Seeds of Ev Status=Compatible -Core Note=(see GameFAQ) +Plugin Note=[video] HLE missing lighting AudioResetOnLoad=Yes RDRAM Size=8 @@ -6614,7 +6332,7 @@ RDRAM Size=8 Good Name=Turok 3 - Shadow of Oblivion (E) Internal Name=Turok 3: Shadow of O Status=Compatible -Core Note=(see GameFAQ) +Plugin Note=[video] broken shadows; HLE lighting bug AudioResetOnLoad=Yes RDRAM Size=8 @@ -6622,7 +6340,7 @@ RDRAM Size=8 Good Name=Turok 3 - Shadow of Oblivion (U) Internal Name=Turok 3: Shadow of O Status=Compatible -Core Note=(see GameFAQ) +Plugin Note=[video] broken shadows; HLE lighting bug AudioResetOnLoad=Yes RDRAM Size=8 @@ -6630,6 +6348,7 @@ RDRAM Size=8 Good Name=Turok 3 - Shadow of Oblivion (U) (Beta) Internal Name=turok Status=Compatible +Plugin Note=[video] broken shadows; HLE lighting bug AudioResetOnLoad=Yes Cheat0=80000303 0001 @@ -6638,7 +6357,9 @@ Good Name=Twisted Edge Extreme Snowboarding (E) Internal Name=TWISTED EDGE Status=Issues (core) Core Note=no sound -Plugin Note=[video] errors:menu snowflakes; use Glide64 +Plugin Note=[video] no fog +32bit=No +Culling=1 RDRAM Size=8 [BBC99D32-117DAA80-C:45] @@ -6646,7 +6367,8 @@ Good Name=Twisted Edge Extreme Snowboarding (U) Internal Name=TWISTED EDGE Status=Issues (core) Core Note=no sound -Plugin Note=[video] errors:menu snowflakes; use Glide64 +Plugin Note=[video] no fog +32bit=No Culling=1 RDRAM Size=8 @@ -6684,7 +6406,7 @@ Culling=1 Good Name=Vigilante 8 (E) Internal Name=VIGILANTE 8 Status=Issues (plugin) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] errors:various Counter Factor=1 Linking=Off RDRAM Size=8 @@ -6693,7 +6415,7 @@ RDRAM Size=8 Good Name=Vigilante 8 (F) Internal Name=VIGILANTE 8 Status=Issues (plugin) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] errors:various Counter Factor=1 Linking=Off RDRAM Size=8 @@ -6702,7 +6424,7 @@ RDRAM Size=8 Good Name=Vigilante 8 (G) Internal Name=VIGILANTE 8 Status=Issues (plugin) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] errors:various Counter Factor=1 Linking=Off RDRAM Size=8 @@ -6711,7 +6433,7 @@ RDRAM Size=8 Good Name=Vigilante 8 (U) Internal Name=VIGILANTE 8 Status=Issues (plugin) -Plugin Note=[video] errors:various (see GameFAQ) +Plugin Note=[Glide64] errors:various Counter Factor=1 Culling=1 Linking=Off @@ -6721,7 +6443,7 @@ RDRAM Size=8 Good Name=Vigilante 8 - 2nd Offence (E) Internal Name=V8: SECOND OFFENSE Status=Issues (plugin) -Plugin Note=[video] errors:menus, transparency +Plugin Note=[Glide64] errors:various Counter Factor=1 Linking=Off RDRAM Size=8 @@ -6730,7 +6452,7 @@ RDRAM Size=8 Good Name=Vigilante 8 - 2nd Offense (U) Internal Name=V8: SECOND OFFENSE Status=Issues (plugin) -Plugin Note=[video] errors:menus, transparency +Plugin Note=[Glide64] errors:various Counter Factor=1 Linking=Off RDRAM Size=8 @@ -6788,7 +6510,6 @@ Save Type=4kbit Eeprom Good Name=Waialae Country Club - True Golf Classics (E) (M4) (V1.0) Internal Name=Waialae Country Club Status=Compatible -Plugin Note=[video] framebuffer:shot (see GameFAQ) Culling=1 Primary Frame Buffer=1 @@ -6796,7 +6517,6 @@ Primary Frame Buffer=1 Good Name=Waialae Country Club - True Golf Classics (E) (M4) (V1.1) Internal Name=Waialae Country Club Status=Compatible -Plugin Note=[video] framebuffer:shot (see GameFAQ) Culling=1 Primary Frame Buffer=1 @@ -6804,7 +6524,6 @@ Primary Frame Buffer=1 Good Name=Waialae Country Club - True Golf Classics (U) (V1.0) Internal Name=Waialae Country Club Status=Compatible -Plugin Note=[video] framebuffer:shot (see GameFAQ) Culling=1 Primary Frame Buffer=1 @@ -6812,7 +6531,6 @@ Primary Frame Buffer=1 Good Name=Waialae Country Club - True Golf Classics (U) (V1.1) Internal Name=Waialae Country Club Status=Compatible -Plugin Note=[video] framebuffer:shot (see GameFAQ) Culling=1 Primary Frame Buffer=1 @@ -6820,16 +6538,12 @@ Primary Frame Buffer=1 Good Name=War Gods (E) Internal Name=WAR GODS Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Counter Factor=1 [F7FE28F6-C3F2ACC3-C:45] Good Name=War Gods (U) Internal Name=WAR GODS Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Counter Factor=1 [650EFA96-30DDF9A7-C:50] @@ -6926,7 +6640,6 @@ Good Name=WCW vs. nWo - World Tour (E) Internal Name=WCWvs.NWO:World Tour Status=Compatible Core Note=high system requirement -Plugin Note=[video] flicker; use Glide64 Clear Frame=1 [2C3E19BD-5113EE5E-C:45] @@ -6934,7 +6647,6 @@ Good Name=WCW vs. nWo - World Tour (U) (V1.0) Internal Name=WCWvs.NWO:World Tour Status=Compatible Core Note=high system requirement -Plugin Note=[video] flicker; use Glide64 Clear Frame=1 [71BE60B9-1DDBFB3C-C:45] @@ -6942,7 +6654,6 @@ Good Name=WCW vs. nWo - World Tour (U) (V1.1) Internal Name=WCWvs.NWO:World Tour Status=Compatible Core Note=high system requirement -Plugin Note=[video] flicker; use Glide64 Clear Frame=1 [68E8A875-0CE7A486-C:50] @@ -6989,7 +6700,6 @@ Status=Compatible Good Name=Wild Choppers (J) Internal Name=WILD CHOPPERS Status=Compatible -Plugin Note=[video] (see GameFAQ) [A04237B9-68F62C72-C:0] Good Name=Wildwaters (Unreleased) @@ -7000,26 +6710,25 @@ RDRAM Size=8 Good Name=WinBack (J) (V1.0) Internal Name=WIN BACK Status=Compatible -Plugin Note=[video] grey square (see GameFAQ) +Plugin Note=[video] HLE square bug [C52E0BC6-56BC6556-C:4A] Good Name=WinBack (J) (V1.1) Internal Name=WIN BACK Status=Compatible -Plugin Note=[video] grey square (see GameFAQ) +Plugin Note=[video] HLE square bug [ED98957E-8242DCAC-C:45] Good Name=WinBack - Covert Operations (U) Internal Name=WIN BACK Status=Compatible -Plugin Note=[video] grey square (see GameFAQ) +Plugin Note=[video] HLE square bug. [54310E7D-6B5430D8-C:50] Good Name=Wipeout 64 (E) Internal Name=Wipeout 64 Status=Region issue (core) -Core Note=use (U) ROM (see GameFAQ) -Plugin Note=[video] access violation; use Glide64 +Core Note=broken version? use (U) ROM Counter Factor=1 Direct3D8-Direct3DPipe=1 RDRAM Size=8 @@ -7028,7 +6737,6 @@ RDRAM Size=8 Good Name=Wipeout 64 (U) Internal Name=Wipeout 64 Status=Compatible -Plugin Note=[video] access violation; use Glide64 Counter Factor=1 Culling=1 Direct3D8-Direct3DPipe=1 @@ -7039,19 +6747,16 @@ Good Name=Wonder Project J2 - Corlo no Mori no Josette (J) Internal Name=WONDER PROJECT J2 Status=Compatible Core Note=intro hang? skip to avoid -Plugin Note=[video] errors:texture alignment [4F1E88F7-4A5A3F96-C:4A] Good Name=Wonder Project J2 [T] Status=Compatible Core Note=intro hang? skip to avoid -Plugin Note=[video] errors:texture alignment [F9FC3090-FF014EC2-C:50] Good Name=World Cup 98 (E) (M8) Internal Name=World Cup 98 Status=Compatible -Plugin Note=[video] errors:various; use Glide64 32bit=No Reg Cache=No @@ -7059,7 +6764,6 @@ Reg Cache=No Good Name=World Cup 98 (U) (M8) Internal Name=World Cup 98 Status=Compatible -Plugin Note=[video] errors:various; use Glide64 32bit=No Reg Cache=No @@ -7067,8 +6771,7 @@ Reg Cache=No Good Name=World Driver Championship (E) (M5) Internal Name=WORLD DRIVER CHAMP Status=Issues (plugin) -Core Note=high system requirement -Plugin Note=[video] errors:various [audio] bad +Plugin Note=[Glide64] HLE not supported [audio] bad 32bit=No AudioResetOnLoad=Yes Fixed Audio=0 @@ -7079,7 +6782,7 @@ Good Name=World Driver Championship (U) Internal Name=WORLD DRIVER CHAMP Status=Issues (plugin) Core Note=high system requirement -Plugin Note=[video] errors:various [audio] bad +Plugin Note=[Glide64] HLE not supported [audio] bad 32bit=No AudioResetOnLoad=Yes Fixed Audio=0 @@ -7183,7 +6886,6 @@ RDRAM Size=8 Good Name=Yakouchuu II - Satsujin Kouro (J) Internal Name=YAKOUTYUU2 Status=Compatible -Plugin Note=[video] access violation; use Glide64 (see GameFAQ) Counter Factor=1 Culling=1 RDRAM Size=8 @@ -7192,7 +6894,6 @@ RDRAM Size=8 Good Name=Yoshi Story (J) Internal Name=YOSHI STORY Status=Compatible -Plugin Note=[video] (see GameFAQ) Save Type=16kbit Eeprom RDRAM Size=8 @@ -7200,7 +6901,6 @@ RDRAM Size=8 Good Name=Yoshi's Story (E) (M3) Internal Name=YOSHI STORY Status=Compatible -Plugin Note=[video] (see GameFAQ) Save Type=16kbit Eeprom RDRAM Size=8 @@ -7208,7 +6908,6 @@ RDRAM Size=8 Good Name=Yoshi's Story (U) (M2) Internal Name=YOSHI STORY Status=Compatible -Plugin Note=[video] (see GameFAQ) Save Type=16kbit Eeprom RDRAM Size=8 @@ -7222,8 +6921,6 @@ Status=Compatible Good Name=Zelda no Densetsu - Mujura no Kamen (J) (V1.0) Internal Name=THE MASK OF MUJURA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] errors:day transistion (see GameFAQ) Culling=1 Emulate Clear=1 RDRAM Size=8 @@ -7233,8 +6930,6 @@ Self Texture=1 Good Name=Zelda no Densetsu - Mujura no Kamen (J) (V1.1) Internal Name=THE MASK OF MUJURA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] errors:day transistion (see GameFAQ) Culling=1 Emulate Clear=1 RDRAM Size=8 @@ -7244,8 +6939,6 @@ Self Texture=1 Good Name=Zelda no Densetsu - Mujura no Kamen - Zelda Collection Version (J) (GC) Internal Name=ZELDA MAJORA'S MASK Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] errors:day transistion (see GameFAQ) Culling=1 Emulate Clear=1 RDRAM Size=8 @@ -7255,8 +6948,6 @@ Self Texture=1 Good Name=Zelda no Densetsu - Toki no Ocarina (J) (V1.0) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Cheat0=801DA5CB 0002 //Subscreen Delay Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 Culling=1 @@ -7270,8 +6961,6 @@ RDRAM Size=8 Good Name=Zelda no Densetsu - Toki no Ocarina (J) (V1.1) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Cheat0=801DA78B 0002 //Subscreen Delay Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 Culling=1 @@ -7285,8 +6974,6 @@ RDRAM Size=8 Good Name=Zelda no Densetsu - Toki no Ocarina (J) (V1.2) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Cheat0=801DAE8B 0002 //Subscreen Delay Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 Culling=1 @@ -7300,8 +6987,6 @@ RDRAM Size=8 Good Name=Zelda no Densetsu - Toki no Ocarina - Zelda Collection Version (J) (GC) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Cheat0=801DB78B 0002 //Subscreen Delay Fix Cheat1=D109A814 0320,8109A814 0000,D109A816 F809,8109A816 0000 //End Credits Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -7315,8 +7000,6 @@ Self Texture=1 Good Name=Zelda no Densetsu - Toki no Ocarina GC (J) (GC) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Cheat0=801DB78B 0002 //Subscreen Delay Fix Cheat1=D109A834 0320,8109A834 0000,D109A836 F809,8109A836 0000 //End Credits Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -7330,8 +7013,6 @@ Self Texture=1 Good Name=Zelda no Densetsu - Toki no Ocarina GC URA (J) (GC) Internal Name=THE LEGEND OF ZELDA Status=Compatible -Core Note=(see GameFAQ) -Plugin Note=[video] (see GameFAQ) Cheat0=801DB78B 0002 //Subscreen Delay Fix Cheat1=D109A814 0320,8109A814 0000,D109A816 F809,8109A816 0000 //End Credits Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 @@ -7350,6 +7031,8 @@ Status=Compatible // // ROMs below are PD/Intros/Emus and other Non Commercial +//Homebrew stuff needs testing with Glide64 + [5C450380-4B5CB6E6-C:0] Good Name=1964 Demo by Steb (PD) Internal Name=1964 test rom @@ -7379,13 +7062,11 @@ Status=Compatible Good Name=Absolute Crap Intro 1 by Kid Stardust (PD) Internal Name=® Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [2E7E893C-4E68B642-C:0] Good Name=Absolute Crap Intro 2 by Lem (PD) Internal Name=Ð*E Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [888EEC7A-42361983-C:0] Good Name=Alienstyle Intro by Renderman (PD) @@ -7410,8 +7091,7 @@ Status=Compatible [4E5507F2-E7D3B413-C:0] Good Name=BB SRAM Manager (PD) Internal Name=BB Sram Manager -Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin +Status=Unknown [3A089BBC-54AB2C06-C:0] Good Name=Berney Must Die! by Nop_ (POM '99) (PD) @@ -7454,14 +7134,12 @@ Good Name=Chaos 89 Demo (PD) Internal Name=Ð*E Status=Issues (plugin) Core Note=unknown country error -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [B484EB31-D44B1928-C:0] Good Name=Christmas Flame Demo (PD) Internal Name=Flame Demo 12/25/01 Status=Issues (mixed) Core Note=slow -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [7739A454-A2F52A66-C:0] Good Name=Chrome Demo - Enhanced (PD) @@ -7495,7 +7173,6 @@ Good Name=CZN Module Player (PD) Internal Name=CZN module player Status=Issues (mixed) Core Note=? -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [887C368D-D1663AA2-C:0] Good Name=Display List Ate My Mind Demo by Kid Stardust (PD) @@ -7511,19 +7188,16 @@ Status=Unsupported Good Name=DKONG Demo (PD) Internal Name=DONKEY KONG (DEMO) Status=Issues (mixed) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [1194FFD2-808C6FB1-C:45] Good Name=DS1 Manager 1.0 by RBubba (PD) Internal Name=DS1 Manager V1.0 Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [D7484C2A-56CFF26D-C:45] Good Name=DS1 Manager 1.1 by RBubba (PD) Internal Name=® Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [B8E73356-040E42EC-C:0] Good Name=Dynamix Intro (Hidden Song) by Widget and Immo (PD) @@ -7589,13 +7263,11 @@ Status=Compatible Good Name=Fractal Zoomer Demo by RedboX (PD) Internal Name=Test Program Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [714001E3-2EB04B67-C:0] Good Name=Freekworld BBS Intro by Rene (PD) Internal Name=h¼ Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [69458FFE-C9D007AB-C:0] Good Name=Freekworld New Intro by Ste (PD) @@ -7663,7 +7335,6 @@ Core Note=slow Good Name=HardCoded by Iceage Internal Name=HardCoded by Iceage Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin Counter Factor=1 [5D391A40-84D7A637-C:0] @@ -7676,13 +7347,11 @@ Core Note=Crash on load Good Name=HiRes CFB Demo (PD) Internal Name=h¼ Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [BD1263E5-388C9BE7-C:45] Good Name=HSD Quick Intro (PD) Internal Name=HSD Quick Intro Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [847BA4C2-1D3128F8-C:4A] Good Name=IPL4ROM (J) @@ -7705,7 +7374,6 @@ Plugin Note=[video] missing:graphics Good Name=LaC MOD Player - The Temple Gates (PD) Internal Name=toms fucking demo Status=Issues (mixed) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [F828DF21-C5E83F66-C:0] Good Name=LCARS Demo by WT Riker (PD) @@ -7716,19 +7384,16 @@ Status=Compatible Good Name=Light Force First N64 Demo by Fractal (PD) Internal Name=LFC Intro Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [8A8E474B-6458BF2B-C:0] Good Name=Liner V1.00 by Colin Phillipps of Memir (PD) Internal Name=h¼ Status=Issues (mixed) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [D5CA46C2-F8555155-C:0] Good Name=MAME 64 Emulator Beta 3 (PD) Internal Name=MAME-64 beta3 Status=Only intro/part OK -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [9CCE5B1D-6351E283-C:0] Good Name=MAME 64 Emulator V1.0 (PD) @@ -7741,14 +7406,12 @@ Good Name=Manic Miner - Hidden Levels by RedboX (PD) Internal Name=Manic Miner 64 Status=Issues (mixed) Core Note=too dark to see -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [A47D4AD4-8BFA81F9-C:45] Good Name=Manic Miner by RedboX (PD) Internal Name=Manic Miner 64 Status=Issues (mixed) Core Note=too dark to see -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [A806749B-1F521F45-C:0] Good Name=MeeTING Demo by Renderman (PD) @@ -7806,7 +7469,6 @@ Core Note=wait to load Good Name=Mortal Kombat SRAM Loader (PD) Internal Name=Mario Kart SRAM Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [94D3D5CB-E8808606-C:0] Good Name=MSFTUG Intro #1 by Lac (PD) @@ -7827,7 +7489,6 @@ Status=Issues (mixed) Good Name=N64 Stars Demo (PD) Internal Name=N64 Stars Demo (PD) Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [C4855DA2-83BBA182-C:0] Good Name=Namp64 - N64 MP3-Player by Obsidian (PD) @@ -7838,7 +7499,6 @@ Status=Unsupported Good Name=NBC First Intro by CALi (PD) Internal Name=h¼ Core Note=slow -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [AB9F8D97-95EAA766-C:0] Good Name=NBC-LFC Kings of Porn Vol 01 (PD) @@ -7879,13 +7539,11 @@ Plugin Note=? Good Name=NBCrew 2 Demo (PD) Internal Name=h¼ Core Note=slow -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [3B18F4F7-82BFB2B3-C:45] Good Name=Neon64 First Public Beta Release by HCS (PD) Internal Name=Neon64 by HCS Core Note=slow -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [3B18F6F9-8C4BE567-C:45] Good Name=Neon64 First Public Beta Release V2 by HCS (PD) @@ -7919,20 +7577,6 @@ Good Name=NuFan Demo by Kid Stardust (PD) Internal Name=TSF - NUfaN Status=Compatible -[E86415A6-98395B53-C:50] -Good Name=O.D.T (Or Die Trying) (E) (M5) (Unreleased Final) -Internal Name=O.D.T -Status=Needs video plugin -Core Note=(see GameFAQ) -Plugin Note=[video] unsupported - -[2655BB70-667D9925-C:45] -Good Name=O.D.T (Or Die Trying) (U) (M3) (Unreleased Final) -Internal Name=O.D.T -Status=Region issue (core) -Core Note=hangs;use(E)ROM -Plugin Note=[video] unsupported - [7F2D025D-2B7DA4AD-C:0] Good Name=Oerjan Intro by Oerjan (POM '99) (PD) Internal Name=oErjan78 @@ -7943,13 +7587,11 @@ Good Name=Pamela Demo (padded) (PD) Internal Name=Pamela Demo Nr.1 Status=Issues (plugin) Core Note=? -Plugin Note=[video] missing:graphics? [7D1727F1-6C6B83EB-C:0] Good Name=Pause Demo by RedboX (PD) Internal Name=Test Program Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [9118F1B8-987DAC8C-C:0] Good Name=PC-Engine 64 Emulator (POM '99) (PD) @@ -8043,13 +7685,11 @@ Plugin Note=[video] missing:graphics [1077590A-B537FDA2-C:0] Good Name=Planet Console Intro (PD) Internal Name=planet console ftp! -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [E9F52336-6BEFAA5F-C:45] Good Name=Plasma Demo (PD) Internal Name=h¼ Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [1BC0CA2C-0F516B86-C:0] Good Name=Pom Part 1 Demo (PD @@ -8090,13 +7730,11 @@ Status=Compatible Good Name=Pong by Oman (PD) Internal Name=h¼ Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [C252F9B1-AD70338C-C:0] Good Name=Pong V0.01 by Omsk (PD) Internal Name=omsk - pong v0.01 Status=Issues (plugin) -Plugin Note=[video] missing:graphics; use 3rd party plugin [C5C4F0D5-4EEF2573-C:0] Good Name=Psychodelic Demo by Ste (POM '98) (PD) @@ -8124,13 +7762,11 @@ Core Note=? Good Name=Rotating Demo USA by Rene (PD) [a1] Internal Name=h¼ Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [79E318E1-86861726-C:0] Good Name=RPA Site Intro by Lem (PD) Internal Name=h¼ Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [C541EAB4-7397CB5F-C:0] Good Name=Sample Demo by Florian (PD) @@ -8152,13 +7788,11 @@ Status=Compatible Good Name=Simon for N64 V0.1a by Jean-Luc Picard (POM '99) (PD) Internal Name=h¼ Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [C603175E-ACADF5EC-C:45] Good Name=Sinus (PD) Internal Name=h¼ Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [9A6CF2F5-D5F365EE-C:0] Good Name=Sitero Demo by Renderman (PD) @@ -8169,7 +7803,6 @@ Status=Compatible Good Name=SLiDeS (PD) Internal Name=LaMeRS PiC PRoGGie Status=Issues (plugin) -Plugin Note=[video] missing:graphics; use 3rd party plugin Culling=1 Emulate Clear=1 @@ -8182,13 +7815,11 @@ Status=Unsupported Good Name=Soncrap Golden Eye Intro (PD) aka Rad's Bird Internal Name=Test Program Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [AAA66229-98CA5CAA-C:0] Good Name=Soncrap Intro by RedboX (PD) aka Rad's Bird Internal Name=SonCrap Intro Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [A3A044B5-6DB1BF5E-C:0] Good Name=Spacer by Memir (POM '99) (PD) @@ -8201,12 +7832,10 @@ RDRAM Size=8 Good Name=Spice Girls Rotator Demo by RedboX (PD) [a1] Internal Name=Space Rotator Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [1FBD27A9-6CC3EB42-C:0] Good Name=SPLiT's Nacho64 by SPLiT (PD) Internal Name= NACHO64 -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [E584FE34-9D91B1E2-C:0] Good Name=Sporting Clays by Charles Doty (PD) @@ -8222,37 +7851,31 @@ Status=Compatible Good Name=SRAM Manager V1.0 Beta (32Mbit) (PD) Internal Name=SRAM BACKUP Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [4DEC9986-A8904450-C:0] Good Name=SRAM Manager V1.0 PAL Beta (PD) Internal Name=SRAM Manager Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [52BA5D2A-9BE3AB78-C:0] Good Name=SRAM to DS1 Tool by WT_Riker (PD) Internal Name=OBSIDIAN - SRAM2DS1 Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [98A2BB11-EE4D4A86-C:0] Good Name=SRAM Upload Tool (PD) Internal Name=SRAM Upload Tool Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [3C524346-E4ABE776-C:0] Good Name=SRAM Upload Tool + Star Fox 64 SRAM (PD) Internal Name=STARFOX SRAM Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [EC9BECFF-CAB83632-C:0] Good Name=SRAM Uploader-Editor by BlackBag (PD) Internal Name=h¼ Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [4794B85F-3EBD5B68-C:0] Good Name=Summer64 Demo by Lem (PD) @@ -8267,7 +7890,6 @@ Status=Compatible Good Name=Super Fighter Demo (PD) Internal Name=Super Fighter Demo Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [1AA71519-51360D55-C:0] Good Name=T-Shirt Demo by Neptune and Steve (POM '98) (PD) @@ -8378,25 +8000,21 @@ RDRAM Size=8 Good Name=Unix SRAM-Upload Utility 1.0 by Madman (PD) Internal Name=h¼ Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [3B8E7E01-6AE876A8-C:0] Good Name=UPload SRAM V1 by LaC (PD) Internal Name=p&E Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [760EF304-AD6D6A7C-C:45] Good Name=V64Jr 512M Backup Program by HKPhooey (PD) Internal Name=h¼ Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [4BD245D4-4202B322-C:0] Good Name=V64Jr Backup Tool by WT_Riker (PD) Internal Name=OBSIDIAN - JR Backup Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [F11B663A-698824C0-C:45] Good Name=V64Jr Backup Tool V0.2b_Beta by RedboX (PD) @@ -8412,7 +8030,6 @@ Status=Unsupported Good Name=View N64 Test Program (PD) Internal Name= R3 VIEWER Status=Issues (plugin) -Plugin Note=[video] fullscreen res issues; use 1.5.2 plugin [4F55D05C-0CD66C91-C:0] Good Name=Virtual Springfield Site Intro by Presten (PD) @@ -8495,7 +8112,6 @@ Status=Compatible Good Name=Ronaldinho's Soccer 64 Internal Name=RONALDINHO SOCCER Status=Compatible -Plugin Note=[video] errors:shadows; use Glide64 Counter Factor=1 Culling=1 From 74c713aaad19e308445f2b36381338b976fc5feb Mon Sep 17 00:00:00 2001 From: Ambient_Malice Date: Tue, 19 Jan 2016 18:09:29 +1000 Subject: [PATCH 47/54] small tidy up Nushi Duri actually crashes, but I've made it compatible for now. --- Config/Project64.rdb | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/Config/Project64.rdb b/Config/Project64.rdb index 1823ebdfe..a76ad04fe 100644 --- a/Config/Project64.rdb +++ b/Config/Project64.rdb @@ -727,7 +727,7 @@ Status=Compatible Good Name=Body Harvest (E) (M3) Internal Name=Body Harvest Status=Compatible -Plugin Note=[video] Broken collision +Plugin Note=[video] broken collision Clear Frame=2 Counter Factor=1 Culling=1 @@ -737,7 +737,7 @@ Delay SI=Yes Good Name=Body Harvest (U) Internal Name=BODY HARVEST Status=Compatible -Plugin Note=[video] Broken collision +Plugin Note=[video] broken collision Clear Frame=2 Counter Factor=1 Culling=1 @@ -1841,7 +1841,7 @@ AllowROMWrites=Yes Good Name=F1 Racing Championship (E) (M5) Internal Name=F1RacingChampionship Status=Compatible -Plugin Note=[video] text corruption +Plugin Note=[Glide64] text corruption Culling=1 RDRAM Size=8 @@ -1849,7 +1849,7 @@ RDRAM Size=8 Good Name=F1 Racing Championship (U) Internal Name=F1RacingChampionship Status=Compatible -Plugin Note=[video] text corrupt +Plugin Note=[Glide64] text corrupt Culling=1 RDRAM Size=8 @@ -1857,7 +1857,7 @@ RDRAM Size=8 Good Name=Famista 64 (J) Internal Name=̧нÀ 64 Status=Compatible -Plugin Note=[video] missing environment in battle +Plugin Note=[Glide64] missing environment in battle Clear Frame=1 [0E31EDF0-C37249D5-C:50] @@ -2135,7 +2135,7 @@ Linking=Off Good Name=GoldenEye 007 (E) Internal Name=GOLDENEYE Status=Compatible -Plugin Note=[video] frigate water bug +Plugin Note=[Glide64] frigate water bug 32bit=No Clear Frame=2 FuncFind=2 @@ -2148,7 +2148,7 @@ SMM-TLB=0 Good Name=GoldenEye 007 (J) Internal Name=GOLDENEYE Status=Compatible -Plugin Note=[video] frigate water bug +Plugin Note=[Glide64] frigate water bug 32bit=No Clear Frame=2 FuncFind=2 @@ -2161,7 +2161,7 @@ SMM-TLB=0 Good Name=GoldenEye 007 (U) Internal Name=GOLDENEYE Status=Compatible -Plugin Note=[video] frigate water bug +Plugin Note=[Glide64] frigate water bug 32bit=No Clear Frame=2 Culling=1 @@ -2629,7 +2629,7 @@ RDRAM Size=8 Good Name=Jet Force Gemini (E) (M4) Internal Name=JET FORCE GEMINI Status=Compatible -Plugin Note=[video] incorrect shadows +Plugin Note=[Glide64] incorrect shadows 32bit=No Counter Factor=1 Culling=1 @@ -2644,7 +2644,7 @@ SMM-TLB=0 Good Name=Jet Force Gemini (U) Internal Name=JET FORCE GEMINI Status=Compatible -Plugin Note=[video] incorrect shadows +Plugin Note=[Glide64] incorrect shadows 32bit=No Counter Factor=1 Culling=1 @@ -2659,7 +2659,7 @@ SMM-TLB=0 Good Name=Jet Force Gemini (U) (Kiosk Demo) Internal Name=J F G DISPLAY Status=Compatible -Plugin Note=[video] incorrect shadows +Plugin Note=[Glide64] incorrect shadows 32bit=No Counter Factor=1 SMM-Cache=0 @@ -3933,8 +3933,7 @@ RDRAM Size=8 [D83BB920-CC406416-C:4A] Good Name=Nushi Duri 64 (J) (V1.0) Internal Name=ǼÂÞØ64 -Status=Needs video plugin -Plugin Note=[video] errors:character select, in house +Status=Compatible Clear Frame=1 Counter Factor=1 Culling=1 @@ -3942,8 +3941,7 @@ Culling=1 [C5F1DE79-5D4BEB6E-C:4A] Good Name=Nushi Duri 64 (J) (V1.1) Internal Name=ǼÂÞØ64 -Status=Needs video plugin -Plugin Note=[video] errors:character select, in house +Status=Compatible Clear Frame=1 Counter Factor=1 Culling=1 @@ -4181,7 +4179,7 @@ Plugin Note=[input] needs Voice Pak Good Name=Pilotwings 64 (E) (M3) Internal Name=Pilot Wings64 Status=Compatible -Plugin Note=[video] broken shadows +Plugin Note=[Glide64] broken shadows Cheat0=D0264361 0012,80264361 00FF,D0264BE1 0012,80264BE1 00FF,D0264DA1 0012,80264DA1 00FF,D02647E1 0012,802647E1 00FF,D02646A1 0012,802646A1 00FF,D0264661 0012,80264661 00FF,D02649A1 0012,802649A1 00FF,D0264BA1 0012,80264BA1 00FF,D0264AA1 0012,80264AA1 00FF,D02641E1 0020,802641E1 00FF,D02648E1 0020,802648E1 00FF,D0264D61 0020,80264D61 00FF,D0264A21 0020,80264A21 00FF,D02645A1 0020,802645A1 00FF,D02647A1 0020,802647A1 00FF,D02642A1 0029,802642A1 00FF,D0264921 0029,80264921 00FF,D0264621 0029,80264621 00FF,D0264A21 0029,80264A21 00FF,D0264C61 0029,80264C61 00FF,D02647A1 0029,802647A1 00FF,D0264FE1 0029,80264FE1 00FF,D0265161 0029,80265161 00FF,D0264AA1 0029,80264AA1 00FF,D02641E1 003D,802641E1 00FF,D02649E1 003D,802649E1 00FF,D0264561 003D,80264561 00FF,D02646E1 003D,802646E1 00FF,D0264721 003D,80264721 00FF //Land Shadow Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 Counter Factor=3 @@ -4190,7 +4188,7 @@ Counter Factor=3 Good Name=Pilotwings 64 (J) Internal Name=Pilot Wings64 Status=Compatible -Plugin Note=[video] broken shadows +Plugin Note=[Glide64] broken shadows Cheat0=D02639B1 0012,802639B1 00FF,D0264231 0012,80264231 00FF,D02643F1 0012,802643F1 00FF,D0263E31 0012,80263E31 00FF,D0263CF1 0012,80263CF1 00FF,D0263CB1 0012,80263CB1 00FF,D0263FF1 0012,80263FF1 00FF,D02641F1 0012,802641F1 00FF,D02640F1 0012,802640F1 00FF,D0263831 0020,80263831 00FF,D0263F31 0020,80263F31 00FF,D02643B1 0020,802643B1 00FF,D0264071 0020,80264071 00FF,D0263BF1 0020,80263BF1 00FF,D0263DF1 0020,80263DF1 00FF,D02638F1 0029,802638F1 00FF,D0263F71 0029,80263F71 00FF,D0263C71 0029,80263C71 00FF,D0264071 0029,80264071 00FF,D02642B1 0029,802642B1 00FF,D0263DF1 0029,80263DF1 00FF,D0264631 0029,80264631 00FF,D02647B1 0029,802647B1 00FF,D02640F1 0029,802640F1 00FF,D0263831 003D,80263831 00FF,D0264031 003D,80264031 00FF,D0263BB1 003D,80263BB1 00FF,D0263D31 003D,80263D31 00FF,D0263D71 003D,80263D71 00FF //Land Shadow Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 Counter Factor=3 @@ -4199,7 +4197,7 @@ Counter Factor=3 Good Name=Pilotwings 64 (U) Internal Name=Pilot Wings64 Status=Compatible -Plugin Note=[video] broken shadows +Plugin Note=[Glide64] broken shadows Cheat0=D0263B41 0012,80263B41 00FF,D02643C1 0012,802643C1 00FF,D0264581 0012,80264581 00FF,D0263FC1 0012,80263FC1 00FF,D0263E81 0012,80263E81 00FF,D0263E41 0012,80263E41 00FF,D0264181 0012,80264181 00FF,D0264381 0012,80264381 00FF,D0264281 0012,80264281 00FF,D02639C1 0020,802639C1 00FF,D02640C1 0020,802640C1 00FF,D0264541 0020,80264541 00FF,D0264201 0020,80264201 00FF,D0263D81 0020,80263D81 00FF,D0263F81 0020,80263F81 00FF,D0263A81 0029,80263A81 00FF,D0264101 0029,80264101 00FF,D0263E01 0029,80263E01 00FF,D0264201 0029,80264201 00FF,D0264441 0029,80264441 00FF,D0263F81 0029,80263F81 00FF,D02647C1 0029,802647C1 00FF,D0264941 0029,80264941 00FF,D0264281 0029,80264281 00FF,D02639C1 003D,802639C1 00FF,D02641C1 003D,802641C1 00FF,D0263D41 003D,80263D41 00FF,D0263EC1 003D,80263EC1 00FF,D0263F01 003D,80263F01 00FF //Land Shadow Fix CheatPlugin0=Jabo's Direct3D8,Glide64 For PJ64 Counter Factor=3 From 4530574c701e4d0bbc082a2666810d21da72d526 Mon Sep 17 00:00:00 2001 From: AmbientMalice Date: Tue, 19 Jan 2016 18:15:30 +1000 Subject: [PATCH 48/54] fix Nushi Duri 64 1.0 graphics --- Config/Glide64.rdb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Config/Glide64.rdb b/Config/Glide64.rdb index aa717d550..92bf4bec5 100644 --- a/Config/Glide64.rdb +++ b/Config/Glide64.rdb @@ -2272,6 +2272,13 @@ Good Name=Nuclear Strike 64 (U) Internal Name=NUCLEARSTRIKE64 buff_clear=0 +[D83BB920-CC406416-C:4A] +Good Name=Nushi Duri 64 (J) (V1.0) +buff_clear=1 +depthmode=0 +force_microcheck=1 +wrap_big_tex=0 + [C5F1DE79-5D4BEB6E-C:4A] Good Name=Nushi Duri 64 (J) (V1.1) Internal Name=ǼÂÞØ64 From fd8b4f1a8b95c90e612e904619b765b47cdca017 Mon Sep 17 00:00:00 2001 From: Ambient_Malice Date: Tue, 19 Jan 2016 18:58:10 +1000 Subject: [PATCH 49/54] add exhalatio's twisted edge sound hack --- Config/Project64.cht | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Config/Project64.cht b/Config/Project64.cht index da5e4036e..f0146ce5f 100644 --- a/Config/Project64.cht +++ b/Config/Project64.cht @@ -720,6 +720,7 @@ Cheat3="Have\All Difficulties",E95E2008 585A Cheat4="Have\All Tracks",E95E2014 1050 Cheat5="Have\All Boards",E95E201C 595B,E95E201A 504F Cheat1="Low Timer",E85E1FFC 595A,E85E1FFA 595A +Cheat6="exhalatio audio hack",81052760 AD99 //---- @@ -9369,6 +9370,10 @@ Cheat12="Have Shotgun",E8878B88 5959 //---- +[E688A5B8-B14B3F18-C:50] +Good Name=Twisted Edge Extreme Snowboarding (E) +Cheat1="exhalatio audio hack",81051960 AD99 + [BBC99D32-117DAA80-C:45] Name=Twisted Edge Extreme Snowboarding (U) Cheat0="Max\50000 Stunt Points",E95E8010 1CAA @@ -9377,6 +9382,7 @@ Cheat3="Have\All Difficulties",E95E8048 585A Cheat4="Have\All Tracks",E95E8054 1050 Cheat5="Have\All Boards",E95E7D5C 595B,E95E7D5A 504F Cheat1="Low Timer",E86AEC51 595A,E86AE957 595A +Cheat6="exhalatio audio hack",81051840 AD99 //---- From b94b68922b4650b24a52cfe357165713b3548838 Mon Sep 17 00:00:00 2001 From: Ambient_Malice Date: Tue, 19 Jan 2016 19:04:08 +1000 Subject: [PATCH 50/54] restored Nuclear Strike 64 fix Accidentally reverted LegendOfDragoon's fix, so I put his changes back. --- Config/Project64.rdb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Config/Project64.rdb b/Config/Project64.rdb index a76ad04fe..aa8a76861 100644 --- a/Config/Project64.rdb +++ b/Config/Project64.rdb @@ -3916,18 +3916,21 @@ ViRefresh=2200 Good Name=Nuclear Strike 64 (E) (M2) Internal Name=NUCLEARSTRIKE64 Status=Compatible +Linking=Off RDRAM Size=8 [8F50B845-D729D22F-C:44] Good Name=Nuclear Strike 64 (G) Internal Name=NUCLEARSTRIKE64 Status=Compatible +Linking=Off RDRAM Size=8 [4998DDBB-F7B7AEBC-C:45] Good Name=Nuclear Strike 64 (U) Internal Name=NUCLEARSTRIKE64 Status=Compatible +Linking=Off RDRAM Size=8 [D83BB920-CC406416-C:4A] From 32f2ddde843b848995898252cb00e013a62d6c3b Mon Sep 17 00:00:00 2001 From: Ambient_Malice Date: Tue, 19 Jan 2016 19:09:31 +1000 Subject: [PATCH 51/54] darn me for removing that to begin with --- Config/Project64.rdb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Config/Project64.rdb b/Config/Project64.rdb index aa8a76861..3dcf6dc93 100644 --- a/Config/Project64.rdb +++ b/Config/Project64.rdb @@ -2473,6 +2473,7 @@ RDRAM Size=8 RSP-JumpTableSize=3584 SMM-FUNC=0 SMM-PI DMA=0 +SMM-Protect=1 SMM-TLB=0 ViRefresh=1800 @@ -2492,6 +2493,7 @@ RDRAM Size=8 RSP-JumpTableSize=3584 SMM-FUNC=0 SMM-PI DMA=0 +SMM-Protect=1 SMM-TLB=0 ViRefresh=2050 From e5a0af06f34b803d0bc052a94ced7297b57e9351 Mon Sep 17 00:00:00 2001 From: Ambient_Malice Date: Tue, 19 Jan 2016 22:58:19 +1000 Subject: [PATCH 52/54] fix Europe --- Config/Project64.cht | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config/Project64.cht b/Config/Project64.cht index f0146ce5f..0ee191948 100644 --- a/Config/Project64.cht +++ b/Config/Project64.cht @@ -9372,7 +9372,7 @@ Cheat12="Have Shotgun",E8878B88 5959 [E688A5B8-B14B3F18-C:50] Good Name=Twisted Edge Extreme Snowboarding (E) -Cheat1="exhalatio audio hack",81051960 AD99 +Cheat0="exhalatio audio hack",81051960 AD99 [BBC99D32-117DAA80-C:45] Name=Twisted Edge Extreme Snowboarding (U) From 0e1b6a9a847d27d2d5afe32a7cc3922360af10cf Mon Sep 17 00:00:00 2001 From: Ambient_Malice Date: Tue, 19 Jan 2016 23:29:22 +1000 Subject: [PATCH 53/54] correct PD descriptions Contrary to what I though, PD doesn't crash with FB enabled. It just flickers in Combat Simulator. The crashes I experienced must've had a different cause. --- Config/Project64.rdb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Config/Project64.rdb b/Config/Project64.rdb index 3dcf6dc93..60f784d26 100644 --- a/Config/Project64.rdb +++ b/Config/Project64.rdb @@ -4089,7 +4089,7 @@ Culling=1 Good Name=Perfect Dark (E) (M5) Internal Name=Perfect Dark Status=Compatible -Plugin Note=[Glide64] Combat Simulator crash. +Plugin Note=[Glide64] splitscreen flicker 32bit=No Clear Frame=2 RDRAM Size=8 @@ -4104,7 +4104,7 @@ Save Type=16kbit Eeprom Good Name=Perfect Dark (J) Internal Name=PERFECT DARK Status=Compatible -Plugin Note=[Glide64] Combat Simulator crash. +Plugin Note=[Glide64] splitscreen flicker 32bit=No Clear Frame=2 RDRAM Size=8 @@ -4119,7 +4119,7 @@ Save Type=16kbit Eeprom Good Name=Perfect Dark (U) (V1.0) Internal Name=Perfect Dark Status=Compatible -Plugin Note=[Glide64] Combat Simulator crash. +Plugin Note=[Glide64] splitscreen flicker 32bit=No Clear Frame=2 Culling=1 @@ -4135,7 +4135,7 @@ Save Type=16kbit Eeprom Good Name=Perfect Dark (U) (V1.1) Internal Name=Perfect Dark Status=Compatible -Plugin Note=[Glide64] Combat Simulator crash. +Plugin Note=[Glide64] splitscreen flicker 32bit=No Clear Frame=2 Culling=1 @@ -4151,7 +4151,7 @@ Save Type=16kbit Eeprom Good Name=Perfect Dark XBLA Mp3 (1.0) Internal Name=Perfect Dark Status=Compatible -Plugin Note=[Glide64] Combat Simulator crash. +Plugin Note=[Glide64] splitscreen flicker 32bit=No Clear Frame=2 Culling=1 From 530ef48eb2637714c875fec7c13913bc48ce85f4 Mon Sep 17 00:00:00 2001 From: luigiblood Date: Tue, 19 Jan 2016 19:53:18 +0100 Subject: [PATCH 54/54] 64DD RTC support, Enable Disk setting --- Source/Project64-core/N64System/Mips/Disk.cpp | 84 +++++++++ Source/Project64-core/N64System/Mips/Disk.h | 16 ++ .../N64System/Mips/MemoryVirtualMem.cpp | 161 +++++++++++++++++- .../N64System/Mips/MemoryVirtualMem.h | 1 + .../N64System/Mips/RegisterClass.cpp | 28 +++ .../N64System/Mips/RegisterClass.h | 70 +++++++- Source/Project64-core/N64System/N64Class.cpp | 4 + Source/Project64-core/Project64-core.vcxproj | 2 + .../Project64-core.vcxproj.filters | 6 + Source/Project64-core/Settings/Settings.h | 1 + .../Project64-core/Settings/SettingsClass.cpp | 1 + 11 files changed, 369 insertions(+), 5 deletions(-) create mode 100644 Source/Project64-core/N64System/Mips/Disk.cpp create mode 100644 Source/Project64-core/N64System/Mips/Disk.h diff --git a/Source/Project64-core/N64System/Mips/Disk.cpp b/Source/Project64-core/N64System/Mips/Disk.cpp new file mode 100644 index 000000000..8a13c8a22 --- /dev/null +++ b/Source/Project64-core/N64System/Mips/Disk.cpp @@ -0,0 +1,84 @@ +/**************************************************************************** +* * +* Project64 - A Nintendo 64 emulator. * +* http://www.pj64-emu.com/ * +* Copyright (C) 2012 Project64. All rights reserved. * +* * +* License: * +* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html * +* * +****************************************************************************/ +#pragma once +#include "stdafx.h" +#include +#include + +void DiskCommand() +{ + //ASIC_CMD_STATUS - Commands + uint32_t cmd = g_Reg->ASIC_CMD; + +#ifdef _WIN32 + SYSTEMTIME sysTime; + ::GetLocalTime(&sysTime); + //stdstr_f timestamp("%04d/%02d/%02d %02d:%02d:%02d.%03d %05d,", sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds, GetCurrentThreadId()); + + //BCD format needed for 64DD RTC + uint8_t year = (uint8_t)(((sysTime.wYear / 10) << 4) | (sysTime.wYear % 10)); + uint8_t month = (uint8_t)(((sysTime.wMonth / 10) << 4) | (sysTime.wMonth % 10)); + uint8_t day = (uint8_t)(((sysTime.wDay / 10) << 4) | (sysTime.wDay % 10)); + uint8_t hour = (uint8_t)(((sysTime.wHour / 10) << 4) | (sysTime.wHour % 10)); + uint8_t minute = (uint8_t)(((sysTime.wMinute / 10) << 4) | (sysTime.wMinute % 10)); + uint8_t second = (uint8_t)(((sysTime.wSecond / 10) << 4) | (sysTime.wSecond % 10)); +#else + time_t ltime; + ltime = time(<ime); + + struct tm result = { 0 }; + localtime_r(<ime, &result); + + //stdstr_f timestamp("%04d/%02d/%02d %02d:%02d:%02d.%03d %05d,", result.tm_year + 1900, result.tm_mon + 1, result.tm_mday, result.tm_hour, result.tm_min, result.tm_sec, milliseconds, GetCurrentThreadId()); + + //BCD format needed for 64DD RTC + uint8_t year = (uint8_t)(((result.tm_year / 10) << 4) | (result.tm_year % 10)); + uint8_t month = (uint8_t)(((result.tm_mon / 10) << 4) | (result.tm_mon % 10)); + uint8_t day = (uint8_t)(((result.tm_mday / 10) << 4) | (result.tm_mday % 10)); + uint8_t hour = (uint8_t)(((result.tm_hour / 10) << 4) | (result.tm_hour % 10)); + uint8_t minute = (uint8_t)(((result.tm_min / 10) << 4) | (result.tm_min % 10)); + uint8_t second = (uint8_t)(((result.tm_sec / 10) << 4) | (result.tm_sec % 10)); +#endif + + switch (cmd & 0xFFFF0000) + { + case 0x00080000: + //Unset Disk Changed Bit + g_Reg->ASIC_STATUS &= ~DD_STATUS_DISK_CHNG; break; + case 0x00090000: + //Unset Reset Bit + g_Reg->ASIC_STATUS &= ~DD_STATUS_RST_STATE; break; + case 0x00120000: + //RTC Get Year & Month + g_Reg->ASIC_DATA = (year << 24) | (month << 16); break; + case 0x00130000: + //RTC Get Day & Hour + g_Reg->ASIC_DATA = (day << 24) | (hour << 16); break; + case 0x00140000: + //RTC Get Minute & Second + g_Reg->ASIC_DATA = (minute << 24) | (second << 16); break; + } +} + +void DiskReset(void) +{ + //ASIC_HARD_RESET 0xAAAA0000 + g_Reg->ASIC_STATUS |= DD_STATUS_RST_STATE; +} + +void DiskBMControl(void) +{ + if (g_Reg->ASIC_BM_CTL & DD_BM_CTL_MECHA_RST) + { + g_Reg->ASIC_STATUS &= ~DD_STATUS_MECHA_INT; + g_Reg->FAKE_CAUSE_REGISTER &= ~CAUSE_IP3; + } +} \ No newline at end of file diff --git a/Source/Project64-core/N64System/Mips/Disk.h b/Source/Project64-core/N64System/Mips/Disk.h new file mode 100644 index 000000000..04cd43dd1 --- /dev/null +++ b/Source/Project64-core/N64System/Mips/Disk.h @@ -0,0 +1,16 @@ +/**************************************************************************** +* * +* Project64 - A Nintendo 64 emulator. * +* http://www.pj64-emu.com/ * +* Copyright (C) 2012 Project64. All rights reserved. * +* * +* License: * +* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html * +* * +****************************************************************************/ +#pragma once +#include "stdafx.h" + +void DiskCommand(void); +void DiskReset(void); +void DiskBMControl(void); diff --git a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp index 72e742ac2..61d98531f 100644 --- a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp +++ b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp @@ -16,11 +16,18 @@ #include #include #include +#include #include #include #include +#ifdef _WIN32 +#include +#else +#include +#endif + uint32_t RegModValue; uint8_t * CMipsMemoryVM::m_Reserve1 = NULL; @@ -944,6 +951,40 @@ void CMipsMemoryVM::Compile_LW(x86Reg Reg, uint32_t VAddr) } } break; + case 0x05000000: + //64DD Registers + if (g_Settings->LoadBool(Setting_EnableDisk)) + { + switch (PAddr) + { + case 0x05000500: MoveVariableToX86reg(&g_Reg->ASIC_DATA, "ASIC_DATA", Reg); break; + case 0x05000504: MoveVariableToX86reg(&g_Reg->ASIC_MISC_REG, "ASIC_MISC_REG", Reg); break; + case 0x05000508: MoveVariableToX86reg(&g_Reg->ASIC_STATUS, "ASIC_STATUS", Reg); break; + case 0x0500050C: MoveVariableToX86reg(&g_Reg->ASIC_CUR_TK, "ASIC_CUR_TK", Reg); break; + case 0x05000510: MoveVariableToX86reg(&g_Reg->ASIC_BM_STATUS, "ASIC_BM_STATUS", Reg); break; + case 0x05000514: MoveVariableToX86reg(&g_Reg->ASIC_ERR_SECTOR, "ASIC_ERR_SECTOR", Reg); break; + case 0x05000518: MoveVariableToX86reg(&g_Reg->ASIC_SEQ_STATUS, "ASIC_SEQ_STATUS", Reg); break; + case 0x0500051C: MoveVariableToX86reg(&g_Reg->ASIC_CUR_SECTOR, "ASIC_CUR_SECTOR", Reg); break; + case 0x05000520: MoveVariableToX86reg(&g_Reg->ASIC_HARD_RESET, "ASIC_HARD_RESET", Reg); break; + case 0x05000524: MoveVariableToX86reg(&g_Reg->ASIC_C1_S0, "ASIC_C1_S0", Reg); break; + case 0x05000528: MoveVariableToX86reg(&g_Reg->ASIC_HOST_SECBYTE, "ASIC_HOST_SECBYTE", Reg); break; + case 0x0500052C: MoveVariableToX86reg(&g_Reg->ASIC_C1_S2, "ASIC_C1_S2", Reg); break; + case 0x05000530: MoveVariableToX86reg(&g_Reg->ASIC_SEC_BYTE, "ASIC_SEC_BYTE", Reg); break; + case 0x05000534: MoveVariableToX86reg(&g_Reg->ASIC_C1_S4, "ASIC_C1_S4", Reg); break; + case 0x05000538: MoveVariableToX86reg(&g_Reg->ASIC_C1_S6, "ASIC_C1_S6", Reg); break; + case 0x0500053C: MoveVariableToX86reg(&g_Reg->ASIC_CUR_ADDR, "ASIC_CUR_ADDR", Reg); break; + case 0x05000540: MoveVariableToX86reg(&g_Reg->ASIC_ID_REG, "ASIC_ID_REG", Reg); break; + case 0x05000544: MoveVariableToX86reg(&g_Reg->ASIC_TEST_REG, "ASIC_TEST_REG", Reg); break; + case 0x05000548: MoveVariableToX86reg(&g_Reg->ASIC_TEST_PIN_SEL, "ASIC_TEST_PIN_SEL", Reg); break; + default: + MoveConstToX86reg(0, Reg); + if (g_Settings->LoadBool(Debugger_ShowUnhandledMemory)) + { + g_Notify->DisplayError(stdstr_f("%s\nFailed to translate address: %08X", __FUNCTION__, VAddr).c_str()); + } + } + break; + } case 0x1FC00000: sprintf(VarName, "m_RDRAM + %X", PAddr); MoveVariableToX86reg(PAddr + m_RDRAM, VarName, Reg); @@ -1975,6 +2016,49 @@ void CMipsMemoryVM::Compile_SW_Register(x86Reg Reg, uint32_t VAddr) } } break; + case 0x05000000: + //64DD Registers + if (g_Settings->LoadBool(Setting_EnableDisk)) + { + switch (PAddr) + { + case 0x05000500: MoveX86regToVariable(Reg, &g_Reg->ASIC_DATA, "ASIC_DATA"); break; + case 0x05000508: + { + //ASIC_CMD + MoveX86regToVariable(Reg, &g_Reg->ASIC_CMD, "ASIC_CMD"); + BeforeCallDirect(m_RegWorkingSet); + Call_Direct(AddressOf(&DiskCommand), "DiskCommand"); + AfterCallDirect(m_RegWorkingSet); + OrConstToVariable((uint32_t)DD_STATUS_MECHA_INT, &g_Reg->ASIC_STATUS, "ASIC_STATUS"); + OrConstToVariable((uint32_t)CAUSE_IP3, &g_Reg->FAKE_CAUSE_REGISTER, "FAKE_CAUSE_REGISTER"); + BeforeCallDirect(m_RegWorkingSet); + Call_Direct(AddressOf(&CRegisters::CheckInterrupts), "CRegisters::CheckInterrupts"); + AfterCallDirect(m_RegWorkingSet); + break; + } + case 0x05000510: + { + //ASIC_BM_CTL + MoveX86regToVariable(Reg, &g_Reg->ASIC_BM_CTL, "ASIC_BM_CTL"); + BeforeCallDirect(m_RegWorkingSet); + Call_Direct(AddressOf(&DiskBMControl), "DiskBMControl"); + AfterCallDirect(m_RegWorkingSet); + break; + } + case 0x05000518: + break; + case 0x05000520: + BeforeCallDirect(m_RegWorkingSet); + Call_Direct(AddressOf(&DiskReset), "DiskReset"); + AfterCallDirect(m_RegWorkingSet); + break; + case 0x05000528: MoveX86regToVariable(Reg, &g_Reg->ASIC_HOST_SECBYTE, "ASIC_HOST_SECBYTE"); break; + case 0x05000530: MoveX86regToVariable(Reg, &g_Reg->ASIC_SEC_BYTE, "ASIC_SEC_BYTE"); break; + case 0x05000548: MoveX86regToVariable(Reg, &g_Reg->ASIC_TEST_PIN_SEL, "ASIC_TEST_PIN_SEL"); break; + } + break; + } case 0x1FC00000: sprintf(VarName, "m_RDRAM + %X", PAddr); MoveX86regToVariable(Reg, PAddr + m_RDRAM, VarName); @@ -2306,6 +2390,7 @@ bool CMipsMemoryVM::SW_NonMemory(uint32_t PAddr, uint32_t Value) case 0x04600000: Write32PeripheralInterface(); break; case 0x04700000: Write32RDRAMInterface(); break; case 0x04800000: Write32SerialInterface(); break; + case 0x05000000: Write32CartridgeDomain2Address1(); break; case 0x08000000: Write32CartridgeDomain2Address2(); break; case 0x1FC00000: Write32PifRam(); break; default: @@ -4735,11 +4820,43 @@ void CMipsMemoryVM::Load32CartridgeDomain1Address3(void) void CMipsMemoryVM::Load32CartridgeDomain2Address1(void) { - m_MemLookupValue.UW[0] = m_MemLookupAddress & 0xFFFF; - m_MemLookupValue.UW[0] = (m_MemLookupValue.UW[0] << 16) | m_MemLookupValue.UW[0]; - if (bHaveDebugger()) + //64DD REGISTERS + if (g_Settings->LoadBool(Setting_EnableDisk)) { - g_Notify->BreakPoint(__FILE__, __LINE__); + switch (m_MemLookupAddress & 0x1FFFFFFF) + { + case 0x05000500: m_MemLookupValue.UW[0] = g_Reg->ASIC_DATA; break; + case 0x05000504: m_MemLookupValue.UW[0] = g_Reg->ASIC_MISC_REG; break; + case 0x05000508: m_MemLookupValue.UW[0] = g_Reg->ASIC_STATUS; break; + case 0x0500050C: m_MemLookupValue.UW[0] = g_Reg->ASIC_CUR_TK; break; + case 0x05000510: m_MemLookupValue.UW[0] = g_Reg->ASIC_BM_STATUS; break; + case 0x05000514: m_MemLookupValue.UW[0] = g_Reg->ASIC_ERR_SECTOR; break; + case 0x05000518: m_MemLookupValue.UW[0] = g_Reg->ASIC_SEQ_STATUS; break; + case 0x0500051C: m_MemLookupValue.UW[0] = g_Reg->ASIC_CUR_SECTOR; break; + case 0x05000520: m_MemLookupValue.UW[0] = g_Reg->ASIC_HARD_RESET; break; + case 0x05000524: m_MemLookupValue.UW[0] = g_Reg->ASIC_C1_S0; break; + case 0x05000528: m_MemLookupValue.UW[0] = g_Reg->ASIC_HOST_SECBYTE; break; + case 0x0500052C: m_MemLookupValue.UW[0] = g_Reg->ASIC_C1_S2; break; + case 0x05000530: m_MemLookupValue.UW[0] = g_Reg->ASIC_SEC_BYTE; break; + case 0x05000534: m_MemLookupValue.UW[0] = g_Reg->ASIC_C1_S4; break; + case 0x05000538: m_MemLookupValue.UW[0] = g_Reg->ASIC_C1_S6; break; + case 0x0500053C: m_MemLookupValue.UW[0] = g_Reg->ASIC_CUR_ADDR; break; + case 0x05000540: m_MemLookupValue.UW[0] = g_Reg->ASIC_ID_REG; break; + case 0x05000544: m_MemLookupValue.UW[0] = g_Reg->ASIC_TEST_REG; break; + case 0x05000548: m_MemLookupValue.UW[0] = g_Reg->ASIC_TEST_PIN_SEL; break; + default: + m_MemLookupValue.UW[0] = m_MemLookupAddress & 0xFFFF; + m_MemLookupValue.UW[0] = (m_MemLookupValue.UW[0] << 16) | m_MemLookupValue.UW[0]; + if (bHaveDebugger()) + { + g_Notify->BreakPoint(__FILE__, __LINE__); + } + } + } + else + { + m_MemLookupValue.UW[0] = m_MemLookupAddress & 0xFFFF; + m_MemLookupValue.UW[0] = (m_MemLookupValue.UW[0] << 16) | m_MemLookupValue.UW[0]; } } @@ -5372,6 +5489,42 @@ void CMipsMemoryVM::Write32SerialInterface(void) } } +void CMipsMemoryVM::Write32CartridgeDomain2Address1(void) +{ + //64DD Registers + if (g_Settings->LoadBool(Setting_EnableDisk)) + { + switch (m_MemLookupAddress & 0xFFFFFFF) + { + case 0x05000500: g_Reg->ASIC_DATA = m_MemLookupValue.UW[0]; break; + case 0x05000508: + g_Reg->ASIC_CMD = m_MemLookupValue.UW[0]; + DiskCommand(); + g_Reg->ASIC_STATUS |= DD_STATUS_MECHA_INT; + g_Reg->FAKE_CAUSE_REGISTER |= CAUSE_IP3; + g_Reg->CheckInterrupts(); + break; + case 0x05000510: + //ASIC_BM_STATUS_CTL + g_Reg->ASIC_BM_CTL = m_MemLookupValue.UW[0]; + DiskBMControl(); + break; + case 0x05000518: + //ASIC_SEQ_STATUS_CTL + break; + case 0x05000520: DiskReset(); break; + case 0x05000528: g_Reg->ASIC_HOST_SECBYTE = m_MemLookupValue.UW[0]; break; + case 0x05000530: g_Reg->ASIC_SEC_BYTE = m_MemLookupValue.UW[0]; break; + case 0x05000548: g_Reg->ASIC_TEST_PIN_SEL = m_MemLookupValue.UW[0]; break; + default: + if (bHaveDebugger()) + { + g_Notify->BreakPoint(__FILE__, __LINE__); + } + } + } +} + void CMipsMemoryVM::Write32CartridgeDomain2Address2(void) { if (g_System->m_SaveUsing == SaveChip_Sram) diff --git a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h index 542e4af5f..a6a8a78cc 100644 --- a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h +++ b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h @@ -201,6 +201,7 @@ private: static void Write32PeripheralInterface(void); static void Write32RDRAMInterface(void); static void Write32SerialInterface(void); + static void Write32CartridgeDomain2Address1(void); static void Write32CartridgeDomain2Address2(void); static void Write32PifRam(void); diff --git a/Source/Project64-core/N64System/Mips/RegisterClass.cpp b/Source/Project64-core/N64System/Mips/RegisterClass.cpp index 574b3df60..f0283f6d3 100644 --- a/Source/Project64-core/N64System/Mips/RegisterClass.cpp +++ b/Source/Project64-core/N64System/Mips/RegisterClass.cpp @@ -213,6 +213,32 @@ SI_STATUS_REG(SerialInterface[3]) { } +Disk_InterfaceReg::Disk_InterfaceReg(uint32_t * DiskInterface) : +ASIC_DATA(DiskInterface[0]), +ASIC_MISC_REG(DiskInterface[1]), +ASIC_STATUS(DiskInterface[2]), +ASIC_CUR_TK(DiskInterface[3]), +ASIC_BM_STATUS(DiskInterface[4]), +ASIC_ERR_SECTOR(DiskInterface[5]), +ASIC_SEQ_STATUS(DiskInterface[6]), +ASIC_CUR_SECTOR(DiskInterface[7]), +ASIC_HARD_RESET(DiskInterface[8]), +ASIC_C1_S0(DiskInterface[9]), +ASIC_HOST_SECBYTE(DiskInterface[10]), +ASIC_C1_S2(DiskInterface[11]), +ASIC_SEC_BYTE(DiskInterface[12]), +ASIC_C1_S4(DiskInterface[13]), +ASIC_C1_S6(DiskInterface[14]), +ASIC_CUR_ADDR(DiskInterface[15]), +ASIC_ID_REG(DiskInterface[16]), +ASIC_TEST_REG(DiskInterface[17]), +ASIC_TEST_PIN_SEL(DiskInterface[18]), +ASIC_CMD(DiskInterface[19]), +ASIC_BM_CTL(DiskInterface[20]), +ASIC_SEQ_CTL(DiskInterface[21]) +{ +} + CRegisters::CRegisters(CN64System * System, CSystemEvents * SystemEvents) : CP0registers(m_CP0), Rdram_InterfaceReg(m_RDRAM_Registers), @@ -224,6 +250,7 @@ RDRAMInt_InterfaceReg(m_RDRAM_Interface), SigProcessor_InterfaceReg(m_SigProcessor_Interface), DisplayControlReg(m_Display_ControlReg), Serial_InterfaceReg(m_SerialInterface), +Disk_InterfaceReg(m_DiskInterface), m_System(System), m_SystemEvents(SystemEvents) { @@ -254,6 +281,7 @@ void CRegisters::Reset() memset(m_SigProcessor_Interface, 0, sizeof(m_SigProcessor_Interface)); memset(m_Peripheral_Interface, 0, sizeof(m_Peripheral_Interface)); memset(m_SerialInterface, 0, sizeof(m_SerialInterface)); + memset(m_DiskInterface, 0, sizeof(m_DiskInterface)); m_AudioIntrReg = 0; m_GfxIntrReg = 0; diff --git a/Source/Project64-core/N64System/Mips/RegisterClass.h b/Source/Project64-core/N64System/Mips/RegisterClass.h index 01b2f9f1a..ef6dd0345 100644 --- a/Source/Project64-core/N64System/Mips/RegisterClass.h +++ b/Source/Project64-core/N64System/Mips/RegisterClass.h @@ -482,6 +482,72 @@ enum SI_STATUS_INTERRUPT = 0x1000, }; +//Disk Interface +class Disk_InterfaceReg +{ +protected: + Disk_InterfaceReg (uint32_t * Disk_Interface); + +public: + uint32_t & ASIC_DATA; + uint32_t & ASIC_MISC_REG; + uint32_t & ASIC_STATUS; + uint32_t & ASIC_CMD; + uint32_t & ASIC_CUR_TK; + uint32_t & ASIC_BM_STATUS; + uint32_t & ASIC_BM_CTL; + uint32_t & ASIC_ERR_SECTOR; + uint32_t & ASIC_SEQ_STATUS; + uint32_t & ASIC_SEQ_CTL; + uint32_t & ASIC_CUR_SECTOR; + uint32_t & ASIC_HARD_RESET; + uint32_t & ASIC_C1_S0; + uint32_t & ASIC_HOST_SECBYTE; + uint32_t & ASIC_C1_S2; + uint32_t & ASIC_SEC_BYTE; + uint32_t & ASIC_C1_S4; + uint32_t & ASIC_C1_S6; + uint32_t & ASIC_CUR_ADDR; + uint32_t & ASIC_ID_REG; + uint32_t & ASIC_TEST_REG; + uint32_t & ASIC_TEST_PIN_SEL; + +private: + Disk_InterfaceReg(); // Disable default constructor + Disk_InterfaceReg(const Disk_InterfaceReg&); // Disable copy constructor + Disk_InterfaceReg& operator=(const Disk_InterfaceReg&); // Disable assignment +}; + +//Disk Interface Flags +enum +{ + DD_STATUS_DATA_RQ = 0x40000000, + DD_STATUS_C2_XFER = 0x10000000, + DD_STATUS_BM_ERR = 0x08000000, + DD_STATUS_BM_INT = 0x04000000, + DD_STATUS_MECHA_INT = 0x02000000, + DD_STATUS_DISK_PRES = 0x01000000, + DD_STATUS_BUSY_STATE = 0x00800000, + DD_STATUS_RST_STATE = 0x00400000, + DD_STATUS_MTR_N_SPIN = 0x00100000, + DD_STATUS_HEAD_RTRCT = 0x00080000, + DD_STATUS_WR_PR_ERR = 0x00040000, + DD_STATUS_MECHA_ERR = 0x00020000, + DD_STATUS_DISK_CHNG = 0x00010000, + + DD_BM_STATUS_RUNNING = 0x80000000, + DD_BM_STATUS_ERROR = 0x04000000, + DD_BM_STATUS_MICRO = 0x02000000, + DD_BM_STATUS_BLOCK = 0x01000000, + + DD_BM_CTL_START = 0x80000000, + DD_BM_CTL_MNGRMODE = 0x40000000, + DD_BM_CTL_INTMASK = 0x20000000, + DD_BM_CTL_RESET = 0x10000000, + DD_BM_CTL_BLK_TRANS = 0x02000000, + DD_BM_CTL_MECHA_RST = 0x01000000 +}; + class CRegName { public: @@ -526,7 +592,8 @@ class CRegisters : public RDRAMInt_InterfaceReg, public SigProcessor_InterfaceReg, public DisplayControlReg, - public Serial_InterfaceReg + public Serial_InterfaceReg, + public Disk_InterfaceReg { public: CRegisters(CN64System * System, CSystemEvents * SystemEvents); @@ -556,6 +623,7 @@ public: uint32_t m_Peripheral_Interface[13]; uint32_t m_RDRAM_Interface[8]; uint32_t m_SerialInterface[4]; + uint32_t m_DiskInterface[22]; uint32_t m_AudioIntrReg; uint32_t m_GfxIntrReg; uint32_t m_RspIntrReg; diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index f6d5b9352..0f8134e84 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -592,6 +592,10 @@ void CN64System::InitRegisters(bool bPostPif, CMipsMemoryVM & MMU) m_Reg.CONFIG_REGISTER = 0x0006E463; m_Reg.STATUS_REGISTER = 0x34000000; + //64DD Registers + m_Reg.ASIC_STATUS = DD_STATUS_RST_STATE; + m_Reg.ASIC_ID_REG = 0x00030000; + //m_Reg.REVISION_REGISTER = 0x00000511; m_Reg.FixFpuLocations(); diff --git a/Source/Project64-core/Project64-core.vcxproj b/Source/Project64-core/Project64-core.vcxproj index 9b063fe59..5dd24c683 100644 --- a/Source/Project64-core/Project64-core.vcxproj +++ b/Source/Project64-core/Project64-core.vcxproj @@ -46,6 +46,7 @@ + @@ -129,6 +130,7 @@ + diff --git a/Source/Project64-core/Project64-core.vcxproj.filters b/Source/Project64-core/Project64-core.vcxproj.filters index c07dc23bd..0bac0a923 100644 --- a/Source/Project64-core/Project64-core.vcxproj.filters +++ b/Source/Project64-core/Project64-core.vcxproj.filters @@ -294,6 +294,9 @@ Source Files\N64 System + + Source Files\N64 System\Mips + @@ -572,5 +575,8 @@ Header Files + + Header Files\N64 System\Mips + \ No newline at end of file diff --git a/Source/Project64-core/Settings/Settings.h b/Source/Project64-core/Settings/Settings.h index 468b9474c..504dc81b8 100644 --- a/Source/Project64-core/Settings/Settings.h +++ b/Source/Project64-core/Settings/Settings.h @@ -67,6 +67,7 @@ enum SettingID Setting_LanguageDir, Setting_LanguageDirDefault, Setting_CurrentLanguage, + Setting_EnableDisk, //RDB TLB Settings Rdb_GoodName, diff --git a/Source/Project64-core/Settings/SettingsClass.cpp b/Source/Project64-core/Settings/SettingsClass.cpp index 396eff950..65bda69eb 100644 --- a/Source/Project64-core/Settings/SettingsClass.cpp +++ b/Source/Project64-core/Settings/SettingsClass.cpp @@ -132,6 +132,7 @@ void CSettings::AddHowToHandleSetting() AddHandler(Setting_RememberCheats, new CSettingTypeApplication("", "Remember Cheats", (uint32_t)false)); AddHandler(Setting_CurrentLanguage, new CSettingTypeApplication("", "Current Language", "")); + AddHandler(Setting_EnableDisk, new CSettingTypeApplication("", "Enable Disk", (uint32_t)false)); AddHandler(Setting_LanguageDirDefault, new CSettingTypeRelativePath("Lang", "")); AddHandler(Setting_LanguageDir, new CSettingTypeApplicationPath("Directory", "Lang", Setting_LanguageDirDefault));