Add option to dump the contents of RAM to a file

This commit is contained in:
Connor McLaughlin 2020-08-16 23:20:36 +10:00
parent 0aefdf4753
commit 4e62b32d60
8 changed files with 68 additions and 2 deletions

View file

@ -1228,6 +1228,15 @@ void UpdateMemoryCards()
}
}
bool DumpRAM(const char* filename)
{
auto fp = FileSystem::OpenManagedCFile(filename, "wb");
if (!fp)
return false;
return std::fwrite(Bus::g_ram, Bus::RAM_SIZE, 1, fp.get()) == 1;
}
bool HasMedia()
{
return g_cdrom.HasMedia();
@ -1333,7 +1342,8 @@ bool RemoveMediaPathFromPlaylist(u32 index)
if (GetMediaPlaylistIndex() == index)
{
g_host_interface->AddFormattedOSDMessage(10.0f, "Removing current media from playlist, removing media from CD-ROM.");
g_host_interface->AddFormattedOSDMessage(10.0f,
"Removing current media from playlist, removing media from CD-ROM.");
g_cdrom.RemoveMedia();
}

View file

@ -104,6 +104,9 @@ void UpdateControllerSettings();
void ResetControllers();
void UpdateMemoryCards();
/// Dumps RAM to a file.
bool DumpRAM(const char* filename);
bool HasMedia();
bool InsertMedia(const char* path);
void RemoveMedia();

View file

@ -662,6 +662,13 @@ void MainWindow::connectSignals()
else
m_host_interface->stopDumpingAudio();
});
connect(m_ui.actionDumpRAM, &QAction::triggered, [this]() {
const QString filename = QFileDialog::getSaveFileName(this, tr("Destination File"));
if (filename.isEmpty())
return;
m_host_interface->dumpRAM(filename);
});
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.actionDebugShowVRAM, "Debug", "ShowVRAM");
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.actionDebugShowGPUState, "Debug", "ShowGPUState");
SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.actionDebugShowCDROMState, "Debug",

View file

@ -149,9 +149,10 @@
<addaction name="menuCPUExecutionMode"/>
<addaction name="menuRenderer"/>
<addaction name="separator"/>
<addaction name="actionDumpAudio"/>
<addaction name="actionDebugDumpCPUtoVRAMCopies"/>
<addaction name="actionDebugDumpVRAMtoCPUCopies"/>
<addaction name="actionDumpAudio"/>
<addaction name="actionDumpRAM"/>
<addaction name="separator"/>
<addaction name="actionDebugShowVRAM"/>
<addaction name="actionDebugShowGPUState"/>
@ -484,6 +485,11 @@
<string>Dump Audio</string>
</property>
</action>
<action name="actionDumpRAM">
<property name="text">
<string>Dump RAM...</string>
</property>
</action>
<action name="actionDebugShowGPUState">
<property name="checkable">
<bool>true</bool>

View file

@ -1026,6 +1026,24 @@ void QtHostInterface::stopDumpingAudio()
StopDumpingAudio();
}
void QtHostInterface::dumpRAM(const QString& filename)
{
if (!isOnWorkerThread())
{
QMetaObject::invokeMethod(this, "dumpRAM", Q_ARG(const QString&, filename));
return;
}
if (System::IsShutdown())
return;
const std::string filename_str = filename.toStdString();
if (System::DumpRAM(filename_str.c_str()))
ReportFormattedMessage("RAM dumped to '%s'", filename_str.c_str());
else
ReportFormattedMessage("Failed to dump RAM to '%s'", filename_str.c_str());
}
void QtHostInterface::saveScreenshot()
{
if (!isOnWorkerThread())

View file

@ -151,6 +151,7 @@ public Q_SLOTS:
void setAudioOutputMuted(bool muted);
void startDumpingAudio();
void stopDumpingAudio();
void dumpRAM(const QString& filename);
void saveScreenshot();
void redrawDisplayWindow();
void toggleFullscreen();

View file

@ -904,6 +904,7 @@ void SDLHostInterface::DrawQuickSettingsMenu()
void SDLHostInterface::DrawDebugMenu()
{
const bool system_valid = System::IsValid();
Settings::DebugSettings& debug_settings = g_settings.debugging;
bool settings_changed = false;
@ -931,6 +932,9 @@ void SDLHostInterface::DrawDebugMenu()
settings_changed |= ImGui::MenuItem("Dump CPU to VRAM Copies", nullptr, &debug_settings.dump_cpu_to_vram_copies);
settings_changed |= ImGui::MenuItem("Dump VRAM to CPU Copies", nullptr, &debug_settings.dump_vram_to_cpu_copies);
if (ImGui::MenuItem("Dump RAM...", nullptr, nullptr, system_valid))
DoDumpRAM();
ImGui::Separator();
settings_changed |= ImGui::MenuItem("Show VRAM", nullptr, &debug_settings.show_vram);
@ -1511,6 +1515,22 @@ void SDLHostInterface::DoChangeDisc()
System::ResetPerformanceCounters();
}
void SDLHostInterface::DoDumpRAM()
{
Assert(!System::IsShutdown());
nfdchar_t* path = nullptr;
if (!NFD_SaveDialog("bin", nullptr, &path) || !path || std::strlen(path) == 0)
return;
if (System::DumpRAM(path))
AddFormattedOSDMessage(5.0f, "Dumped RAM to '%s'", path);
else
AddFormattedOSDMessage(10.0f, "Failed to dump RAM to '%s'", path);
System::ResetPerformanceCounters();
}
void SDLHostInterface::Run()
{
while (!m_quit_request)

View file

@ -79,6 +79,7 @@ private:
void DrawImGuiWindows() override;
void DoStartDisc();
void DoChangeDisc();
void DoDumpRAM();
void HandleSDLEvent(const SDL_Event* event);
void ProcessEvents();