mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-21 21:05:50 +12:00
Merge pull request #498 from wheremyfoodat/hle-dsp
Qt: Add support for dumping DSP firmware
This commit is contained in:
commit
2fc66fd3ba
7 changed files with 87 additions and 10 deletions
|
@ -3,6 +3,7 @@
|
|||
#include "kernel.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
|
||||
namespace DSPCommands {
|
||||
enum : u32 {
|
||||
|
@ -41,6 +42,8 @@ void DSPService::reset() {
|
|||
for (DSPEvent& e : pipeEvents) {
|
||||
e = std::nullopt;
|
||||
}
|
||||
|
||||
loadedComponent.clear();
|
||||
}
|
||||
|
||||
void DSPService::handleSyncRequest(u32 messagePointer) {
|
||||
|
@ -80,13 +83,14 @@ void DSPService::loadComponent(u32 messagePointer) {
|
|||
u32 dataMask = mem.read32(messagePointer + 12);
|
||||
u32 buffer = mem.read32(messagePointer + 20);
|
||||
|
||||
std::vector<u8> data(size);
|
||||
loadedComponent.resize(size);
|
||||
|
||||
for (u32 i = 0; i < size; i++) {
|
||||
data[i] = mem.read8(buffer + i);
|
||||
loadedComponent[i] = mem.read8(buffer + i);
|
||||
}
|
||||
|
||||
log("DSP::LoadComponent (size = %08X, program mask = %X, data mask = %X\n", size, programMask, dataMask);
|
||||
dsp->loadComponent(data, programMask, dataMask);
|
||||
dsp->loadComponent(loadedComponent, programMask, dataMask);
|
||||
|
||||
mem.write32(messagePointer, IPC::responseHeader(0x11, 2, 2));
|
||||
mem.write32(messagePointer + 4, Result::Success);
|
||||
|
@ -262,6 +266,21 @@ void DSPService::invalidateDCache(u32 messagePointer) {
|
|||
mem.write32(messagePointer + 4, Result::Success);
|
||||
}
|
||||
|
||||
DSPService::ComponentDumpResult DSPService::dumpComponent(const std::filesystem::path& path) {
|
||||
if (loadedComponent.empty()) {
|
||||
return ComponentDumpResult::NotLoaded;
|
||||
}
|
||||
|
||||
std::ofstream file(path, std::ios::out | std::ios::binary);
|
||||
if (file.bad()) {
|
||||
return ComponentDumpResult::FileFailure;
|
||||
}
|
||||
|
||||
file.write((char*)&loadedComponent[0], loadedComponent.size() * sizeof(u8));
|
||||
file.close();
|
||||
return ComponentDumpResult::Success;
|
||||
}
|
||||
|
||||
void DSPService::triggerPipeEvent(int index) {
|
||||
if (index < pipeCount && pipeEvents[index].has_value()) {
|
||||
kernel.signalEvent(*pipeEvents[index]);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue