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