diff --git a/Source/Core/Core/CMakeLists.txt b/Source/Core/Core/CMakeLists.txt index 2cf0d6fa46..4cc5990c87 100644 --- a/Source/Core/Core/CMakeLists.txt +++ b/Source/Core/Core/CMakeLists.txt @@ -90,7 +90,6 @@ set(SRCS HW/DSPLLE/DSPSymbols.cpp HW/DSPLLE/DSPLLEGlobals.cpp HW/DSPLLE/DSPLLE.cpp - HW/DSPLLE/DSPLLETools.cpp HW/DVD/DVDInterface.cpp HW/DVD/DVDMath.cpp HW/DVD/DVDThread.cpp diff --git a/Source/Core/Core/Core.vcxproj b/Source/Core/Core/Core.vcxproj index 0134b33d45..2edc5ee8df 100644 --- a/Source/Core/Core/Core.vcxproj +++ b/Source/Core/Core/Core.vcxproj @@ -117,7 +117,6 @@ - @@ -363,7 +362,6 @@ - diff --git a/Source/Core/Core/Core.vcxproj.filters b/Source/Core/Core/Core.vcxproj.filters index 14da13445a..8dee1673d1 100644 --- a/Source/Core/Core/Core.vcxproj.filters +++ b/Source/Core/Core/Core.vcxproj.filters @@ -395,9 +395,6 @@ HW %28Flipper/Hollywood%29\DSP Interface + HLE\LLE - - HW %28Flipper/Hollywood%29\DSP Interface + HLE\LLE - HW %28Flipper/Hollywood%29\DSP Interface + HLE\LLE @@ -1039,9 +1036,6 @@ HW %28Flipper/Hollywood%29\DSP Interface + HLE\LLE - - HW %28Flipper/Hollywood%29\DSP Interface + HLE\LLE - HW %28Flipper/Hollywood%29\DSP Interface + HLE\LLE diff --git a/Source/Core/Core/DSP/DSPCodeUtil.cpp b/Source/Core/Core/DSP/DSPCodeUtil.cpp index 3d9c2641ec..4db6f47c53 100644 --- a/Source/Core/Core/DSP/DSPCodeUtil.cpp +++ b/Source/Core/Core/DSP/DSPCodeUtil.cpp @@ -10,6 +10,7 @@ #include "Common/CommonTypes.h" #include "Common/FileUtil.h" #include "Common/StringUtil.h" +#include "Common/Swap.h" #include "Core/DSP/DSPAssembler.h" #include "Core/DSP/DSPCodeUtil.h" @@ -218,4 +219,30 @@ bool SaveBinary(const std::vector& code, const std::string& filename) return false; return true; } + +bool DumpDSPCode(const u8* code_be, int size_in_bytes, u32 crc) +{ + const std::string root_name = + File::GetUserPath(D_DUMPDSP_IDX) + StringFromFormat("DSP_UC_%08X", crc); + const std::string binary_file = root_name + ".bin"; + const std::string text_file = root_name + ".txt"; + + if (!File::IOFile(binary_file, "wb").WriteBytes(code_be, size_in_bytes)) + { + PanicAlert("Can't dump UCode to file '%s'!!", binary_file.c_str()); + return false; + } + + // The disassembler works in native endian + std::vector code(size_in_bytes / 2); + for (size_t i = 0; i < code.size(); i++) + code[i] = Common::swap16(&code_be[i * 2]); + + std::string text; + if (!Disassemble(code, true, text)) + return false; + + return File::WriteStringToFile(text, text_file); +} + } // namespace DSP diff --git a/Source/Core/Core/DSP/DSPCodeUtil.h b/Source/Core/Core/DSP/DSPCodeUtil.h index e3d0ee8c93..5fe8d64f30 100644 --- a/Source/Core/Core/DSP/DSPCodeUtil.h +++ b/Source/Core/Core/DSP/DSPCodeUtil.h @@ -27,4 +27,6 @@ void BinaryStringBEToCode(const std::string& str, std::vector& code); // Load code (big endian binary). bool LoadBinary(const std::string& filename, std::vector& code); bool SaveBinary(const std::vector& code, const std::string& filename); + +bool DumpDSPCode(const u8* code_be, int size_in_bytes, u32 crc); } // namespace DSP diff --git a/Source/Core/Core/DSP/DSPHWInterface.cpp b/Source/Core/Core/DSP/DSPHWInterface.cpp index 9c73e69388..09b66f42e2 100644 --- a/Source/Core/Core/DSP/DSPHWInterface.cpp +++ b/Source/Core/Core/DSP/DSPHWInterface.cpp @@ -5,8 +5,12 @@ #include "Core/DSP/DSPHWInterface.h" +#include +#include + #include "Common/CPUDetect.h" #include "Common/CommonTypes.h" +#include "Common/Hash.h" #include "Common/Intrinsics.h" #include "Common/Logging/Log.h" #include "Common/MemoryUtil.h" @@ -227,22 +231,22 @@ u16 gdsp_ifx_read(u16 addr) static const u8* gdsp_idma_in(u16 dsp_addr, u32 addr, u32 size) { - Common::UnWriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false); + u16* dst = g_dsp.iram + (dsp_addr / 2); - u8* dst = ((u8*)g_dsp.iram); - for (u32 i = 0; i < size; i += 2) - { - *(u16*)&dst[dsp_addr + i] = - Common::swap16(*(const u16*)&g_dsp.cpu_ram[(addr + i) & 0x0fffffff]); - } + const u8* code = &g_dsp.cpu_ram[addr & 0x0fffffff]; + g_dsp.iram_crc = HashEctor(code, size); + + Common::UnWriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false); + memcpy(dst, code, size); + for (size_t i = 0; i < size / 2; i++) + dst[i] = Common::swap16(dst[i]); Common::WriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false); - Host::CodeLoaded((const u8*)g_dsp.iram + dsp_addr, size); - + Host::CodeLoaded(code, size); NOTICE_LOG(DSPLLE, "*** Copy new UCode from 0x%08x to 0x%04x (crc: %8x)", addr, dsp_addr, g_dsp.iram_crc); - return dst + dsp_addr; + return reinterpret_cast(dst); } static const u8* gdsp_idma_out(u16 dsp_addr, u32 addr, u32 size) diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/ROM.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/ROM.cpp index 8b3c3b68a8..ae3e3d4dab 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/ROM.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/ROM.cpp @@ -17,6 +17,7 @@ #include "Common/Logging/Log.h" #include "Common/StringUtil.h" #include "Core/ConfigManager.h" +#include "Core/DSP/DSPCodeUtil.h" #include "Core/HW/DSPHLE/DSPHLE.h" #include "Core/HW/DSPHLE/MailHandler.h" #include "Core/HW/DSPHLE/UCodes/UCodes.h" @@ -107,15 +108,8 @@ void ROMUCode::BootUCode() if (SConfig::GetInstance().m_DumpUCode) { - std::string ucode_dump_path = - StringFromFormat("%sDSP_UC_%08X.bin", File::GetUserPath(D_DUMPDSP_IDX).c_str(), ector_crc); - - File::IOFile fp(ucode_dump_path, "wb"); - if (fp) - { - fp.WriteArray((u8*)HLEMemory_Get_Pointer(m_current_ucode.m_ram_address), - m_current_ucode.m_length); - } + DSP::DumpDSPCode(static_cast(HLEMemory_Get_Pointer(m_current_ucode.m_ram_address)), + m_current_ucode.m_length, ector_crc); } INFO_LOG(DSPHLE, "CurrentUCode SOURCE Addr: 0x%08x", m_current_ucode.m_ram_address); diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/UCodes.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/UCodes.cpp index cef0f00583..625e5969ed 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/UCodes.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/UCodes.cpp @@ -19,6 +19,7 @@ #include "Common/StringUtil.h" #include "Common/Swap.h" #include "Core/ConfigManager.h" +#include "Core/DSP/DSPCodeUtil.h" #include "Core/HW/DSPHLE/DSPHLE.h" #include "Core/HW/DSPHLE/UCodes/AX.h" #include "Core/HW/DSPHLE/UCodes/AXWii.h" @@ -187,14 +188,8 @@ void UCodeInterface::PrepareBootUCode(u32 mail) if (SConfig::GetInstance().m_DumpUCode) { - std::string ucode_dump_path = StringFromFormat( - "%sDSP_UC_%08X.bin", File::GetUserPath(D_DUMPDSP_IDX).c_str(), ector_crc); - - File::IOFile fp(ucode_dump_path, "wb"); - if (fp) - { - fp.WriteArray((u8*)Memory::GetPointer(m_next_ucode.iram_mram_addr), m_next_ucode.iram_size); - } + DSP::DumpDSPCode(static_cast(Memory::GetPointer(m_next_ucode.iram_mram_addr)), + m_next_ucode.iram_size, ector_crc); } DEBUG_LOG(DSPHLE, "PrepareBootUCode 0x%08x", ector_crc); diff --git a/Source/Core/Core/HW/DSPLLE/DSPHost.cpp b/Source/Core/Core/HW/DSPLLE/DSPHost.cpp index 6805d8c70d..892d0d245e 100644 --- a/Source/Core/Core/HW/DSPLLE/DSPHost.cpp +++ b/Source/Core/Core/HW/DSPLLE/DSPHost.cpp @@ -8,10 +8,10 @@ #include "Common/Logging/Log.h" #include "Core/ConfigManager.h" #include "Core/DSP/DSPAnalyzer.h" +#include "Core/DSP/DSPCodeUtil.h" #include "Core/DSP/DSPCore.h" #include "Core/DSP/Jit/DSPEmitter.h" #include "Core/HW/DSP.h" -#include "Core/HW/DSPLLE/DSPLLETools.h" #include "Core/HW/DSPLLE/DSPSymbols.h" #include "Core/Host.h" #include "VideoCommon/OnScreenDisplay.h" @@ -58,11 +58,10 @@ void InterruptRequest() void CodeLoaded(const u8* ptr, int size) { - g_dsp.iram_crc = HashEctor(ptr, size); - -#if defined(_DEBUG) || defined(DEBUGFAST) - LLE::DumpDSPCode(ptr, size, g_dsp.iram_crc); -#endif + if (SConfig::GetInstance().m_DumpUCode) + { + DSP::DumpDSPCode(ptr, size, g_dsp.iram_crc); + } Symbols::Clear(); diff --git a/Source/Core/Core/HW/DSPLLE/DSPLLETools.cpp b/Source/Core/Core/HW/DSPLLE/DSPLLETools.cpp deleted file mode 100644 index 3e05628ab4..0000000000 --- a/Source/Core/Core/HW/DSPLLE/DSPLLETools.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2008 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license.txt file included. - -#ifdef _WIN32 -#include -#endif - -#include -#include -#include -#include - -#include "Common/CommonTypes.h" -#include "Common/FileUtil.h" -#include "Common/StringUtil.h" -#include "Core/DSP/DSPCodeUtil.h" -#include "Core/DSP/DSPCore.h" -#include "Core/DSP/DSPDisassembler.h" -#include "Core/HW/DSPLLE/DSPLLETools.h" - -namespace DSP -{ -namespace LLE -{ -bool DumpDSPCode(const u8* code_be, int size_in_bytes, u32 crc) -{ - const std::string binFile = - StringFromFormat("%sDSP_UC_%08X.bin", File::GetUserPath(D_DUMPDSP_IDX).c_str(), crc); - const std::string txtFile = - StringFromFormat("%sDSP_UC_%08X.txt", File::GetUserPath(D_DUMPDSP_IDX).c_str(), crc); - - File::IOFile pFile(binFile, "wb"); - if (pFile) - { - pFile.WriteBytes(code_be, size_in_bytes); - pFile.Close(); - } - else - { - PanicAlert("Can't open file (%s) to dump UCode!!", binFile.c_str()); - return false; - } - - // Load the binary back in. - std::vector code; - LoadBinary(binFile, code); - - AssemblerSettings settings; - settings.show_hex = true; - settings.show_pc = true; - settings.ext_separator = '\''; - settings.decode_names = true; - settings.decode_registers = true; - - std::string text; - DSPDisassembler disasm(settings); - - if (!disasm.Disassemble(0, code, 0x0000, text)) - return false; - - return File::WriteStringToFile(text, txtFile); -} - -// TODO make this useful :p -bool DumpCWCode(u32 _Address, u32 _Length) -{ - std::string filename = File::GetUserPath(D_DUMPDSP_IDX) + "DSP_UCode.bin"; - File::IOFile pFile(filename, "wb"); - - if (pFile) - { - for (size_t i = _Address; i != _Address + _Length; ++i) - { - u16 val = g_dsp.iram[i]; - fprintf(pFile.GetHandle(), " cw 0x%04x \n", val); - } - return true; - } - - return false; -} -} // namespace LLE -} // namespace DSP diff --git a/Source/Core/Core/HW/DSPLLE/DSPLLETools.h b/Source/Core/Core/HW/DSPLLE/DSPLLETools.h deleted file mode 100644 index 4890f47dd9..0000000000 --- a/Source/Core/Core/HW/DSPLLE/DSPLLETools.h +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2008 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license.txt file included. - -#pragma once - -#include "Common/CommonTypes.h" - -namespace DSP -{ -namespace LLE -{ -bool DumpDSPCode(const u8* code_be, int size_in_bytes, u32 crc); -bool DumpCWCode(u32 _Address, u32 _Length); -} // namespace DSP -} // namespace LLE