From 8be70a8ed28dc00ecff3eb091e4745640e288176 Mon Sep 17 00:00:00 2001 From: hrydgard Date: Sat, 23 Aug 2008 15:15:25 +0000 Subject: [PATCH] Finally hacked Super Monkey Ball into submission! Some bonus hacking tools included. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@282 8ced0084-cf51-0410-be5f-012b33b47a6e --- Binary/linux/Maps/GMBE8P.map | 34 ++++ Binary/mac/Maps/GMBE8P.map | 34 ++++ Binary/win32/Maps/GMBE8P.map | 34 ++++ Binary/x64/Maps/GMBE8P.map | 34 ++++ Source/Core/Core/Core.vcproj | 80 +++++----- Source/Core/Core/Src/Boot/Boot.cpp | 25 +-- Source/Core/Core/Src/Boot/Boot.h | 2 + .../Core/Src/Debugger/PPCDebugInterface.h | 2 + Source/Core/Core/Src/HLE/HLE.cpp | 32 +++- Source/Core/Core/Src/HLE/HLE.h | 3 +- Source/Core/Core/Src/HLE/HLE_Misc.cpp | 146 ++++++++++++++++-- Source/Core/Core/Src/HLE/HLE_Misc.h | 7 +- .../Src/PowerPC/Interpreter/Interpreter.h | 2 +- Source/Core/Core/Src/PowerPC/PPCTables.cpp | 6 +- Source/Core/DebuggerWX/src/CodeView.cpp | 53 ++++++- Source/Core/DebuggerWX/src/CodeWindow.cpp | 61 +++----- Source/Core/DebuggerWX/src/CodeWindow.h | 1 + 17 files changed, 442 insertions(+), 114 deletions(-) create mode 100644 Binary/linux/Maps/GMBE8P.map create mode 100644 Binary/mac/Maps/GMBE8P.map create mode 100644 Binary/win32/Maps/GMBE8P.map create mode 100644 Binary/x64/Maps/GMBE8P.map diff --git a/Binary/linux/Maps/GMBE8P.map b/Binary/linux/Maps/GMBE8P.map new file mode 100644 index 0000000000..d83be68df3 --- /dev/null +++ b/Binary/linux/Maps/GMBE8P.map @@ -0,0 +1,34 @@ +.text +800031f0 0000001c 800031f0 0 load_sp_rtoc +80007034 0000004c 80007034 0 .LoadQuantizers +80007080 00000030 80007080 0 .LoadInfinitiesEtc +800070b0 00000038 800070b0 0 .rsqrt +800070ec 00000040 800070ec 0 .sqrt_internal_needs_cr1 +8000712c 00000040 8000712c 0 .rsqrt_internal_needs_cr1 +800071e0 00000030 800071e0 0 .wrapping_once_fp_lookup +80007210 00000064 80007210 0 .weird2 +80007274 00000030 80007274 0 .lookup_some_float_in_table_with_neg_wrap +800072a4 00000180 800072a4 0 .atan2 +80007424 000000b8 80007424 0 .calls_sqrt +800074dc 0000005c 800074dc 0 .func +80007538 0000002c 80007538 0 .load_strange_matrix1 +80007564 0000002c 80007564 0 .load_strange_matrix3 +80007590 0000002c 80007590 0 .load_strange_matrix2 +80007834 00000044 80007834 0 .push_matrix_3x3? +80007878 00000038 80007878 0 .read_top_3x3matrix +800078b0 00000038 800078b0 0 .write_top_3x3_matrix +800078e8 0000003c 800078e8 0 .read_current_3x3_matrix +80007924 00000014 80007924 0 .pop_matrix_stack +80007a50 00000170 80007a50 0 .mult_matrix? +80007ecc 000000bc 80007ecc 0 .weird_vector_op_status_in_cr2 +80007f88 00000074 80007f88 0 .weird_param_in_p1_p2 +800080fc 00000078 800080fc 0 .evil_normalize +80008174 00000078 80008174 0 .evil_vec_setlength +800081ec 00000070 800081ec 0 .evil_vec_cosine +80008538 000000f0 80008538 0 .calls_evil1 +8000875c 00000088 8000875c 0 .another_caller +800087e4 0000008c 800087e4 0 .another_caller2 +80008d30 000001b4 80008d30 0 .another_caller3 +80036544 000001b4 80036544 0 .fctiwi_weird2 +8003dd1c 00000110 8003dd1c 0 .fctwi_weird +80043b48 000005bc 80043b48 0 .fctwi_weird3 diff --git a/Binary/mac/Maps/GMBE8P.map b/Binary/mac/Maps/GMBE8P.map new file mode 100644 index 0000000000..d83be68df3 --- /dev/null +++ b/Binary/mac/Maps/GMBE8P.map @@ -0,0 +1,34 @@ +.text +800031f0 0000001c 800031f0 0 load_sp_rtoc +80007034 0000004c 80007034 0 .LoadQuantizers +80007080 00000030 80007080 0 .LoadInfinitiesEtc +800070b0 00000038 800070b0 0 .rsqrt +800070ec 00000040 800070ec 0 .sqrt_internal_needs_cr1 +8000712c 00000040 8000712c 0 .rsqrt_internal_needs_cr1 +800071e0 00000030 800071e0 0 .wrapping_once_fp_lookup +80007210 00000064 80007210 0 .weird2 +80007274 00000030 80007274 0 .lookup_some_float_in_table_with_neg_wrap +800072a4 00000180 800072a4 0 .atan2 +80007424 000000b8 80007424 0 .calls_sqrt +800074dc 0000005c 800074dc 0 .func +80007538 0000002c 80007538 0 .load_strange_matrix1 +80007564 0000002c 80007564 0 .load_strange_matrix3 +80007590 0000002c 80007590 0 .load_strange_matrix2 +80007834 00000044 80007834 0 .push_matrix_3x3? +80007878 00000038 80007878 0 .read_top_3x3matrix +800078b0 00000038 800078b0 0 .write_top_3x3_matrix +800078e8 0000003c 800078e8 0 .read_current_3x3_matrix +80007924 00000014 80007924 0 .pop_matrix_stack +80007a50 00000170 80007a50 0 .mult_matrix? +80007ecc 000000bc 80007ecc 0 .weird_vector_op_status_in_cr2 +80007f88 00000074 80007f88 0 .weird_param_in_p1_p2 +800080fc 00000078 800080fc 0 .evil_normalize +80008174 00000078 80008174 0 .evil_vec_setlength +800081ec 00000070 800081ec 0 .evil_vec_cosine +80008538 000000f0 80008538 0 .calls_evil1 +8000875c 00000088 8000875c 0 .another_caller +800087e4 0000008c 800087e4 0 .another_caller2 +80008d30 000001b4 80008d30 0 .another_caller3 +80036544 000001b4 80036544 0 .fctiwi_weird2 +8003dd1c 00000110 8003dd1c 0 .fctwi_weird +80043b48 000005bc 80043b48 0 .fctwi_weird3 diff --git a/Binary/win32/Maps/GMBE8P.map b/Binary/win32/Maps/GMBE8P.map new file mode 100644 index 0000000000..d83be68df3 --- /dev/null +++ b/Binary/win32/Maps/GMBE8P.map @@ -0,0 +1,34 @@ +.text +800031f0 0000001c 800031f0 0 load_sp_rtoc +80007034 0000004c 80007034 0 .LoadQuantizers +80007080 00000030 80007080 0 .LoadInfinitiesEtc +800070b0 00000038 800070b0 0 .rsqrt +800070ec 00000040 800070ec 0 .sqrt_internal_needs_cr1 +8000712c 00000040 8000712c 0 .rsqrt_internal_needs_cr1 +800071e0 00000030 800071e0 0 .wrapping_once_fp_lookup +80007210 00000064 80007210 0 .weird2 +80007274 00000030 80007274 0 .lookup_some_float_in_table_with_neg_wrap +800072a4 00000180 800072a4 0 .atan2 +80007424 000000b8 80007424 0 .calls_sqrt +800074dc 0000005c 800074dc 0 .func +80007538 0000002c 80007538 0 .load_strange_matrix1 +80007564 0000002c 80007564 0 .load_strange_matrix3 +80007590 0000002c 80007590 0 .load_strange_matrix2 +80007834 00000044 80007834 0 .push_matrix_3x3? +80007878 00000038 80007878 0 .read_top_3x3matrix +800078b0 00000038 800078b0 0 .write_top_3x3_matrix +800078e8 0000003c 800078e8 0 .read_current_3x3_matrix +80007924 00000014 80007924 0 .pop_matrix_stack +80007a50 00000170 80007a50 0 .mult_matrix? +80007ecc 000000bc 80007ecc 0 .weird_vector_op_status_in_cr2 +80007f88 00000074 80007f88 0 .weird_param_in_p1_p2 +800080fc 00000078 800080fc 0 .evil_normalize +80008174 00000078 80008174 0 .evil_vec_setlength +800081ec 00000070 800081ec 0 .evil_vec_cosine +80008538 000000f0 80008538 0 .calls_evil1 +8000875c 00000088 8000875c 0 .another_caller +800087e4 0000008c 800087e4 0 .another_caller2 +80008d30 000001b4 80008d30 0 .another_caller3 +80036544 000001b4 80036544 0 .fctiwi_weird2 +8003dd1c 00000110 8003dd1c 0 .fctwi_weird +80043b48 000005bc 80043b48 0 .fctwi_weird3 diff --git a/Binary/x64/Maps/GMBE8P.map b/Binary/x64/Maps/GMBE8P.map new file mode 100644 index 0000000000..d83be68df3 --- /dev/null +++ b/Binary/x64/Maps/GMBE8P.map @@ -0,0 +1,34 @@ +.text +800031f0 0000001c 800031f0 0 load_sp_rtoc +80007034 0000004c 80007034 0 .LoadQuantizers +80007080 00000030 80007080 0 .LoadInfinitiesEtc +800070b0 00000038 800070b0 0 .rsqrt +800070ec 00000040 800070ec 0 .sqrt_internal_needs_cr1 +8000712c 00000040 8000712c 0 .rsqrt_internal_needs_cr1 +800071e0 00000030 800071e0 0 .wrapping_once_fp_lookup +80007210 00000064 80007210 0 .weird2 +80007274 00000030 80007274 0 .lookup_some_float_in_table_with_neg_wrap +800072a4 00000180 800072a4 0 .atan2 +80007424 000000b8 80007424 0 .calls_sqrt +800074dc 0000005c 800074dc 0 .func +80007538 0000002c 80007538 0 .load_strange_matrix1 +80007564 0000002c 80007564 0 .load_strange_matrix3 +80007590 0000002c 80007590 0 .load_strange_matrix2 +80007834 00000044 80007834 0 .push_matrix_3x3? +80007878 00000038 80007878 0 .read_top_3x3matrix +800078b0 00000038 800078b0 0 .write_top_3x3_matrix +800078e8 0000003c 800078e8 0 .read_current_3x3_matrix +80007924 00000014 80007924 0 .pop_matrix_stack +80007a50 00000170 80007a50 0 .mult_matrix? +80007ecc 000000bc 80007ecc 0 .weird_vector_op_status_in_cr2 +80007f88 00000074 80007f88 0 .weird_param_in_p1_p2 +800080fc 00000078 800080fc 0 .evil_normalize +80008174 00000078 80008174 0 .evil_vec_setlength +800081ec 00000070 800081ec 0 .evil_vec_cosine +80008538 000000f0 80008538 0 .calls_evil1 +8000875c 00000088 8000875c 0 .another_caller +800087e4 0000008c 800087e4 0 .another_caller2 +80008d30 000001b4 80008d30 0 .another_caller3 +80036544 000001b4 80036544 0 .fctiwi_weird2 +8003dd1c 00000110 8003dd1c 0 .fctwi_weird +80043b48 000005bc 80043b48 0 .fctwi_weird3 diff --git a/Source/Core/Core/Core.vcproj b/Source/Core/Core/Core.vcproj index 2f1cf2d900..bac01f290c 100644 --- a/Source/Core/Core/Core.vcproj +++ b/Source/Core/Core/Core.vcproj @@ -1009,46 +1009,6 @@ RelativePath=".\Src\Debugger\PPCDebugInterface.h" > - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Core/Core/Src/Boot/Boot.cpp b/Source/Core/Core/Src/Boot/Boot.cpp index f062ea283c..c1d7b354eb 100644 --- a/Source/Core/Core/Src/Boot/Boot.cpp +++ b/Source/Core/Core/Src/Boot/Boot.cpp @@ -353,7 +353,6 @@ bool CBoot::EmulatedBIOS_Wii(bool _bDebug) LOG(BOOT, "DVDRead: offset: %08x memOffse: %08x length: %i", iDVDOffset, iRamAddress, iLength); DVDInterface::DVDRead(iDVDOffset, iRamAddress, iLength); - } while(PowerPC::ppcState.gpr[3] != 0x00); // iAppLoaderClose @@ -376,23 +375,31 @@ bool CBoot::EmulatedBIOS_Wii(bool _bDebug) void CBoot::UpdateDebugger_MapLoaded(const char *_gameID) { - HLE::PatchFunctions(_gameID); + HLE::PatchFunctions(); Debugger::AnalyzeBackwards(); Host_NotifyMapLoaded(); Host_UpdateMemoryView(); } +std::string CBoot::GenerateMapFilename() +{ + /* + std::string strDriveDirectory, strFilename; + SplitPath(booted_file, &strDriveDirectory, &strFilename, NULL); + + std::string strFullfilename(strFilename + _T(".map")); + std::string strMapFilename; + BuildCompleteFilename(strMapFilename, strDriveDirectory, strFullfilename); + */ + return "Maps/" + Core::GetStartupParameter().GetUniqueID() + ".map"; +} + bool CBoot::LoadMapFromFilename(const std::string &_rFilename, const char *_gameID) { if (_rFilename.size() == 0) return false; - std::string strDriveDirectory, strFilename; - SplitPath(_rFilename, &strDriveDirectory, &strFilename, NULL); - - std::string strFullfilename(strFilename + _T(".map")); - std::string strMapFilename; - BuildCompleteFilename(strMapFilename, strDriveDirectory, strFullfilename); + std::string strMapFilename = GenerateMapFilename(); bool success = false; if (!Debugger::LoadSymbolMap(strMapFilename.c_str())) @@ -493,7 +500,7 @@ bool CBoot::BootUp(const SCoreStartupParameter& _StartupPara) } if (LoadMapFromFilename(_StartupPara.m_strFilename, gameID)) { - HLE::PatchFunctions(gameID); + HLE::PatchFunctions(); } else { diff --git a/Source/Core/Core/Src/Boot/Boot.h b/Source/Core/Core/Src/Boot/Boot.h index 34d0c313d5..8cd95e560e 100644 --- a/Source/Core/Core/Src/Boot/Boot.h +++ b/Source/Core/Core/Src/Boot/Boot.h @@ -40,6 +40,8 @@ public: static bool BootUp(const SCoreStartupParameter& _StartupPara); static bool IsElfWii(const char *filename); + static std::string GenerateMapFilename(); + private: enum { BIOS_SIZE = 2*1024*1024 }; diff --git a/Source/Core/Core/Src/Debugger/PPCDebugInterface.h b/Source/Core/Core/Src/Debugger/PPCDebugInterface.h index ec3c1b73fe..4d0a5cf31e 100644 --- a/Source/Core/Core/Src/Debugger/PPCDebugInterface.h +++ b/Source/Core/Core/Src/Debugger/PPCDebugInterface.h @@ -3,6 +3,8 @@ #include +#include "DebugInterface.h" + //wrapper between disasm control and Dolphin debugger class PPCDebugInterface : public DebugInterface diff --git a/Source/Core/Core/Src/HLE/HLE.cpp b/Source/Core/Core/Src/HLE/HLE.cpp index b26eb322b4..8037a319ec 100644 --- a/Source/Core/Core/Src/HLE/HLE.cpp +++ b/Source/Core/Core/Src/HLE/HLE.cpp @@ -63,6 +63,14 @@ static const SPatch OSPatches[] = // wii only { "SCCheckStatus", HLE_Misc::UnimplementedFunctionFalse }, { "__OSInitAudioSystem", HLE_Misc::UnimplementedFunction }, + + // Super Monkey Ball + { ".evil_vec_cosine", HLE_Misc::SMB_EvilVecCosine }, + { ".evil_normalize", HLE_Misc::SMB_EvilNormalize }, + { "PanicAlert", HLE_Misc::PanicAlert }, + { ".sqrt_internal_needs_cr1", HLE_Misc::SMB_sqrt_internal }, + { ".rsqrt_internal_needs_cr1", HLE_Misc::SMB_rsqrt_internal }, + { ".atan2", HLE_Misc::SMB_atan2}, // special // { "GXPeekZ", HLE_Misc::GXPeekZ}, @@ -74,22 +82,36 @@ static const SPatch OSBreakPoints[] = { "FAKE_TO_SKIP_0", HLE_Misc::UnimplementedFunction }, }; -void PatchFunctions(const char* _gameID) +void Patch(u32 address, const char *hle_func_name) +{ + for (u32 i = 0; i < sizeof(OSPatches) / sizeof(SPatch); i++) + { + if (!strcmp(OSPatches[i].m_szPatchName, hle_func_name)) { + u32 HLEPatchValue = (1 & 0x3f) << 26; + Memory::Write_U32(HLEPatchValue | i, address); + return; + } + } +} + +void PatchFunctions() { - for (u32 i=0; i < sizeof(OSPatches) / sizeof(SPatch); i++) + for (u32 i = 0; i < sizeof(OSPatches) / sizeof(SPatch); i++) { int SymbolIndex = Debugger::FindSymbol(OSPatches[i].m_szPatchName); if (SymbolIndex > 0) { const Debugger::CSymbol& rSymbol = Debugger::GetSymbol(SymbolIndex); u32 HLEPatchValue = (1 & 0x3f) << 26; - Memory::Write_U32(HLEPatchValue | i, rSymbol.vaddress); - + for (int addr = rSymbol.vaddress; addr < rSymbol.vaddress + rSymbol.size; addr+=4) { + Memory::Write_U32(HLEPatchValue | i, addr); + } + //PanicAlert("patched %s", OSPatches[i].m_szPatchName); LOG(HLE,"Patching %s %08x", OSPatches[i].m_szPatchName, rSymbol.vaddress); } } - for (size_t i=1; i < sizeof(OSBreakPoints) / sizeof(SPatch); i++) + for (size_t i = 1; i < sizeof(OSBreakPoints) / sizeof(SPatch); i++) { int SymbolIndex = Debugger::FindSymbol(OSBreakPoints[i].m_szPatchName); if (SymbolIndex != -1) diff --git a/Source/Core/Core/Src/HLE/HLE.h b/Source/Core/Core/Src/HLE/HLE.h index c72199c9a7..163995f92f 100644 --- a/Source/Core/Core/Src/HLE/HLE.h +++ b/Source/Core/Core/Src/HLE/HLE.h @@ -22,7 +22,8 @@ namespace HLE { - void PatchFunctions(const char* _gameID = 0); + void PatchFunctions(); + void Patch(u32 pc, const char *func_name); void Execute(u32 _CurrentPC, u32 _Instruction); } diff --git a/Source/Core/Core/Src/HLE/HLE_Misc.cpp b/Source/Core/Core/Src/HLE/HLE_Misc.cpp index daa933e063..9225924b89 100644 --- a/Source/Core/Core/Src/HLE/HLE_Misc.cpp +++ b/Source/Core/Core/Src/HLE/HLE_Misc.cpp @@ -15,6 +15,8 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ +#include +#include "Common.h" #include "HLE_OS.h" #include "../PowerPC/PowerPC.h" @@ -23,6 +25,18 @@ namespace HLE_Misc { +inline float F(u32 addr) +{ + u32 mem = Memory::ReadFast32(addr); + return *((float*)&mem); +} + +inline void FW(u32 addr, float x) +{ + u32 data = *((u32*)&x); + Memory::WriteUnchecked_U32(data, addr); +} + void UnimplementedFunction() { NPC = LR; @@ -30,32 +44,140 @@ void UnimplementedFunction() void UnimplementedFunctionTrue() { - GPR(3)=1; + GPR(3) = 1; NPC = LR; } void UnimplementedFunctionFalse() { - GPR(3)=0; + GPR(3) = 0; NPC = LR; } -void THPPlayerGetState() -{ - GPR(3)=3; // Video played - NPC=LR; -} - void GXPeekZ() { - Memory::Write_U32(0xFFFFFF,GPR(5)); - NPC=LR; + Memory::Write_U32(0xFFFFFF, GPR(5)); + NPC = LR; } void GXPeekARGB() { - Memory::Write_U32(0xFFFFFFFF,GPR(5)); - NPC=LR; + Memory::Write_U32(0xFFFFFFFF, GPR(5)); + NPC = LR; } +void PanicAlert() +{ + ::PanicAlert("HLE: PanicAlert %08x", LR); + NPC = LR; +} + +// .evil_vec_cosine +void SMB_EvilVecCosine() +{ + u32 r3 = GPR(3); + u32 r4 = GPR(4); + + float x1 = F(r3); + float y1 = F(r3 + 4); + float z1 = F(r3 + 8); + + float x2 = F(r4); + float y2 = F(r4 + 4); + float z2 = F(r4 + 8); + + float s1 = x1*x1 + y1*y1 + z1*z1; + float s2 = x2*x2 + y2*y2 + z2*z2; + + float dot = x1*x2 + y1*y2 + z1*z2; + + rPS0(1) = dot / sqrtf(s1 * s2); + NPC = LR; +} + +void SMB_EvilNormalize() +{ + u32 r3 = GPR(3); + float x = F(r3); + float y = F(r3 + 4); + float z = F(r3 + 8); + float inv_len = 1.0 / sqrt(x*x + y*y + z*z); + x *= inv_len; + y *= inv_len; + z *= inv_len; + FW(r3, x); + FW(r3 + 4, y); + FW(r3 + 8, z); + NPC = LR; +} + +void SMB_sqrt_internal() +{ +/* +.sqrt_internal_needs_cr1 +800070ec: bgt+ cr1,0x80007090 +800070f0: blt+ cr1,0x80007088 +800070f4: b 0x80007080 +800070f8: frsp f0,f1 +800070fc: lis r4, 0xE000 +80007100: mcrfs cr1, cr4 +80007104: mcrfs cr0, cr3 +80007108: lfs f2, 0x01A0 (r4) +8000710c: bso+ cr1,0x800070EC +80007110: bso+ 0x80007088 +80007114: ble+ cr1,0x80007088 +80007118: mflr r3 +8000711c: bl 0x800070B0 +80007120: mtlr r3 +80007124: fmuls f1,f1,f0 +80007128: blr +*/ + double f = sqrt(rPS0(1)); + rPS0(1) = f; + rPS1(1) = f; + rPS0(0) = f; + rPS1(0) = f; + NPC = LR; +} + +void SMB_rsqrt_internal() +{ + /* +.rsqrt_internal_needs_cr1 +8000712c: bgt+ cr1,0x80007088 +80007130: blt+ cr1,0x80007090 +80007134: b 0x80007080 +80007138: frsp f1,f1 +8000713c: lis r4, 0xE000 +80007140: mcrfs cr1, cr4 +80007144: mcrfs cr0, cr3 +80007148: lfs f2, 0x01A0 (r4) +8000714c: bso+ cr1,0x8000712C +80007150: bso+ 0x80007090 +80007154: ble+ cr1,0x80007090 +80007158: mflr r3 +8000715c: bl 0x800070B0 +80007160: mtlr r3 +80007164: frsp f1,f1 +80007168: blr +*/ + double f = 1.0 / sqrt(rPS0(1)); + rPS0(1) = f; + rPS1(1) = f; + rPS0(0) = f; + rPS1(0) = f; + NPC = LR; +} + +void SMB_atan2() +{ + // in: f1 = x, f2 = y + // out: r3 = angle + double angle = atan2(rPS0(1), rPS0(2)); + int angle_fixpt = angle / 3.14159 * 32767; + if (angle_fixpt < -32767) angle_fixpt = -32767; + if (angle_fixpt > 32767) angle_fixpt = 32767; + GPR(3) = angle_fixpt; + NPC = LR; +} } diff --git a/Source/Core/Core/Src/HLE/HLE_Misc.h b/Source/Core/Core/Src/HLE/HLE_Misc.h index e9d7747cda..82c6156479 100644 --- a/Source/Core/Core/Src/HLE/HLE_Misc.h +++ b/Source/Core/Core/Src/HLE/HLE_Misc.h @@ -21,12 +21,17 @@ namespace HLE_Misc { void Pass(); + void PanicAlert(); void UnimplementedFunction(); void UnimplementedFunctionTrue(); void UnimplementedFunctionFalse(); - void THPPlayerGetState(); void GXPeekZ(); void GXPeekARGB(); + void SMB_EvilVecCosine(); + void SMB_EvilNormalize(); + void SMB_sqrt_internal(); + void SMB_rsqrt_internal(); + void SMB_atan2(); } #endif diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter.h b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter.h index f315916efd..9736c47de0 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter.h +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter.h @@ -72,7 +72,7 @@ public: static void fnmaddsx(UGeckoInstruction _inst); static void fnmsubsx(UGeckoInstruction _inst); static void fresx(UGeckoInstruction _inst); - static void fsqrtsx(UGeckoInstruction _inst); +// static void fsqrtsx(UGeckoInstruction _inst); static void fsubsx(UGeckoInstruction _inst); static void fabsx(UGeckoInstruction _inst); static void fcmpo(UGeckoInstruction _inst); diff --git a/Source/Core/Core/Src/PowerPC/PPCTables.cpp b/Source/Core/Core/Src/PowerPC/PPCTables.cpp index ed51848da0..fcf09b5ddc 100644 --- a/Source/Core/Core/Src/PowerPC/PPCTables.cpp +++ b/Source/Core/Core/Src/PowerPC/PPCTables.cpp @@ -652,7 +652,7 @@ void PPCTables::CompileInstruction(UGeckoInstruction _inst) dynaOpTable[_inst.OPCD](_inst); GekkoOPInfo *info = GetOpInfo(_inst); if (info) { - if (!strcmp(info->opname, "mffsx")) { + if (!strcmp(info->opname, "mcrfs")) { rsplocations.push_back(Jit64::js.compilerPC); } info->compileCount++; @@ -721,9 +721,9 @@ void PPCTables::LogCompiledInstructions() } } fclose(f); - f = fopen(StringFromFormat("rsp_at.txt", time).c_str(), "w"); + f = fopen(StringFromFormat("mcrfs_at.txt", time).c_str(), "w"); for (int i = 0; i < rsplocations.size(); i++) { - fprintf(f, "mffsx: %08x\n", rsplocations[i]); + fprintf(f, "mcrfs: %08x\n", rsplocations[i]); } fclose(f); time++; diff --git a/Source/Core/DebuggerWX/src/CodeView.cpp b/Source/Core/DebuggerWX/src/CodeView.cpp index e31a3ab9e7..ee75bb747d 100644 --- a/Source/Core/DebuggerWX/src/CodeView.cpp +++ b/Source/Core/DebuggerWX/src/CodeView.cpp @@ -16,13 +16,18 @@ // http://code.google.com/p/dolphin-emu/ #include "Debugger.h" +#include "Debugger/PPCDebugInterface.h" +#include "Debugger/Debugger_SymbolMap.h" #include "Common.h" +#include "StringUtil.h" +#include "Host.h" #include "CodeView.h" #include "JitWindow.h" #include #include +#include enum @@ -34,6 +39,9 @@ enum IDM_INSERTBLR, IDM_RUNTOHERE, IDM_JITRESULTS, + IDM_RENAMESYMBOL, + IDM_PATCHALERT, + IDM_COPYFUNCTION, }; @@ -174,6 +182,22 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event) wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(temp))); } break; + case IDM_COPYFUNCTION: + { + int sel = Debugger::FindSymbol(selection); + if (sel > 0) { + std::string text; + text = text + Debugger::GetSymbol(sel).GetName() + "\r\n"; + // we got a function + u32 start = Debugger::GetSymbol(sel).vaddress; + u32 end = start + Debugger::GetSymbol(sel).size; + for (u32 addr = start; addr != end; addr += 4) { + text = text + StringFromFormat("%08x: ", addr) + debugger->disasm(addr) + "\r\n"; + } + wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(text.c_str()))); + } + } + break; #endif case IDM_RUNTOHERE: @@ -190,6 +214,26 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event) case IDM_JITRESULTS: CJitWindow::ViewAddr(selection); break; + + case IDM_RENAMESYMBOL: + { + int sel = Debugger::FindSymbol(selection); + if (sel > 0) { + wxTextEntryDialog input_symbol(this, "Rename symbol:", wxGetTextFromUserPromptStr, Debugger::GetSymbol(sel).GetName().c_str()); + if (input_symbol.ShowModal() == wxID_OK) { + Debugger::AccessSymbol(sel).SetName(input_symbol.GetValue().c_str()); + } +// redraw(); + Host_NotifyMapLoaded(); + } + } + break; + + case IDM_PATCHALERT: + { + + } + break; } #if wxUSE_CLIPBOARD @@ -206,12 +250,17 @@ void CCodeView::OnMouseUpR(wxMouseEvent& event) //menu.Append(IDM_GOTOINMEMVIEW, "&Goto in mem view"); #if wxUSE_CLIPBOARD menu.Append(IDM_COPYADDRESS, wxString::FromAscii("Copy &address")); - menu.Append(IDM_COPYCODE, wxString::FromAscii("Copy &code")); + menu.Append(IDM_COPYFUNCTION, wxString::FromAscii("Copy &function")); + menu.Append(IDM_COPYCODE, wxString::FromAscii("Copy &code line")); menu.Append(IDM_COPYHEX, wxString::FromAscii("Copy &hex")); + menu.AppendSeparator(); #endif + menu.Append(IDM_RENAMESYMBOL, wxString::FromAscii("Rename &symbol")); + menu.AppendSeparator(); menu.Append(IDM_RUNTOHERE, _T("&Run To Here")); - menu.Append(IDM_INSERTBLR, wxString::FromAscii("Insert &blr")); menu.Append(IDM_JITRESULTS, wxString::FromAscii("PPC vs X86")); + menu.Append(IDM_INSERTBLR, wxString::FromAscii("Insert &blr")); + menu.Append(IDM_PATCHALERT, wxString::FromAscii("Patch alert")); PopupMenu(&menu); event.Skip(true); } diff --git a/Source/Core/DebuggerWX/src/CodeWindow.cpp b/Source/Core/DebuggerWX/src/CodeWindow.cpp index ef796d9529..be110880d6 100644 --- a/Source/Core/DebuggerWX/src/CodeWindow.cpp +++ b/Source/Core/DebuggerWX/src/CodeWindow.cpp @@ -17,9 +17,9 @@ #include "wx/button.h" #include "wx/textctrl.h" +#include "wx/textdlg.h" #include "wx/listctrl.h" #include "wx/thread.h" -#include "wx/listctrl.h" #include "wx/mstream.h" // ugly that this lib included code from the main @@ -39,7 +39,9 @@ #include "CodeWindow.h" #include "CodeView.h" +#include "FileUtil.h" #include "Core.h" +#include "Boot/Boot.h" #include "LogManager.h" #include "HW/CPU.h" #include "PowerPC/PowerPC.h" @@ -241,7 +243,9 @@ void CCodeWindow::CreateMenu(const SCoreStartupParameter& _LocalCoreStartupParam { wxMenu *pSymbolsMenu = new wxMenu; - pSymbolsMenu->Append(IDM_SCANFUNCTIONS, _T("&Scan for functions")); + pSymbolsMenu->Append(IDM_SCANFUNCTIONS, _T("&Load symbol map")); + pSymbolsMenu->Append(IDM_SAVEMAPFILE, _T("&Save symbol map")); + pSymbolsMenu->Append(IDM_RENAMEFUNCTION, _T("&Rename function...")); pMenuBar->Append(pSymbolsMenu, _T("&Symbols")); } @@ -293,50 +297,27 @@ void CCodeWindow::OnSymbolsMenu(wxCommandEvent& event) // TODO: disable menu items instead :P return; } - wxString path; + std::string mapfile = CBoot::GenerateMapFilename(); switch (event.GetId()) { case IDM_SCANFUNCTIONS: - PPCAnalyst::FindFunctions(0x80003100, 0x80400000); - PPCAnalyst::LoadFuncDB("Data/totaldb.dsy"); - Debugger::GetFromAnalyzer(); - NotifyMapLoaded(); - break; - case IDM_LOADMAPFILE: - path = wxFileSelector( - _T("Select the mapfile to load"), - wxEmptyString, wxEmptyString, wxEmptyString, - wxString::Format - ( - _T("Map files (*.map)|*.map|All files (%s)|%s"), - wxFileSelectorDefaultWildcardStr, - wxFileSelectorDefaultWildcardStr - ), - wxFD_OPEN | wxFD_FILE_MUST_EXIST, - this); - if (!path) + if (!File::Exists(mapfile)) { - return; + PPCAnalyst::FindFunctions(0x80003100, 0x80400000); + if (PPCAnalyst::LoadFuncDB("Data/totaldb.dsy")) + { + Debugger::GetFromAnalyzer(); + NotifyMapLoaded(); + } + } else { + Debugger::LoadSymbolMap(mapfile.c_str()); } - Debugger::LoadSymbolMap(path.ToAscii()); break; +// case IDM_LOADMAPFILE: +// Debugger::LoadSymbolMap(mapfile.c_str()); +// break; case IDM_SAVEMAPFILE: - path = wxFileSelector( - _T("Name your mapfile"), - wxEmptyString, wxEmptyString, wxEmptyString, - wxString::Format - ( - _T("Map files (*.map)|*.map|All files (%s)|%s"), - wxFileSelectorDefaultWildcardStr, - wxFileSelectorDefaultWildcardStr - ), - wxFD_SAVE, - this); - if (!path) - { - return; - } - Debugger::SaveSymbolMap(path.ToAscii()); + Debugger::SaveSymbolMap(mapfile.c_str()); break; } } @@ -362,7 +343,7 @@ void CCodeWindow::OnCodeStep(wxCommandEvent& event) Update(); } - break; + break; case IDM_STEP: SingleCPUStep(); diff --git a/Source/Core/DebuggerWX/src/CodeWindow.h b/Source/Core/DebuggerWX/src/CodeWindow.h index 9a7010c7fb..0276a99c60 100644 --- a/Source/Core/DebuggerWX/src/CodeWindow.h +++ b/Source/Core/DebuggerWX/src/CodeWindow.h @@ -83,6 +83,7 @@ class CCodeWindow IDM_LOGINSTRUCTIONS, IDM_LOADMAPFILE, IDM_SAVEMAPFILE, + IDM_RENAMEFUNCTION, IDM_CLEARCODECACHE, };