diff --git a/Core/ELF/ParamSFO.cpp b/Core/ELF/ParamSFO.cpp index f969547c02..6a0abaf8af 100644 --- a/Core/ELF/ParamSFO.cpp +++ b/Core/ELF/ParamSFO.cpp @@ -456,6 +456,8 @@ GameRegion DetectGameRegionFromID(std::string_view id_full) { return GameRegion::TEST; } else if (id_letters == "UMDT") { return GameRegion::DIAGNOSTIC; + } else if (id_letters == "VSHM") { // this is just generated from vshmain.elf + return GameRegion::FIRMWARE; } } return GameRegion::HOMEBREW; @@ -474,6 +476,7 @@ std::string_view GameRegionToString(GameRegion region) { case GameRegion::TEST: return "Test disc"; case GameRegion::DIAGNOSTIC: return "Diagnostic tool"; case GameRegion::FIRMWARE: return "Firmware update"; + case GameRegion::VSH: return "VSH"; default: return "unknown region"; } } diff --git a/Core/ELF/ParamSFO.h b/Core/ELF/ParamSFO.h index f1f48d4759..fd3e6e8823 100644 --- a/Core/ELF/ParamSFO.h +++ b/Core/ELF/ParamSFO.h @@ -117,6 +117,7 @@ enum class GameRegion { TEST, DIAGNOSTIC, FIRMWARE, + VSH, }; GameRegion DetectGameRegionFromID(std::string_view id_version); diff --git a/Core/Util/RecentFiles.cpp b/Core/Util/RecentFiles.cpp index 2e4dead9c6..5a8d422d6a 100644 --- a/Core/Util/RecentFiles.cpp +++ b/Core/Util/RecentFiles.cpp @@ -131,6 +131,9 @@ void RecentFilesManager::Add(std::string_view filename) { } // Some things should not be added to recent, such as the VSH (which will have a separate UI for launching it) + if (endsWithNoCase(filename, "vshmain.prx")) { + return; + } std::lock_guard guard(cmdLock_); cmds_.push(RecentCommand{ RecentCmd::Add, {}, std::make_unique(filename) }); diff --git a/UI/GameInfoCache.cpp b/UI/GameInfoCache.cpp index c57e373f89..bbe7466808 100644 --- a/UI/GameInfoCache.cpp +++ b/UI/GameInfoCache.cpp @@ -692,7 +692,7 @@ handleELF: if (flags_ & GameInfoFlags::PARAM_SFO) { info_->id = g_paramSFO.GenerateFakeID(gamePath_); info_->id_version = info_->id + "_1.00"; - info_->region = GameRegion::HOMEBREW; // Homebrew + info_->region = equals(info_->title, "vshmain.prx") ? GameRegion::VSH : GameRegion::HOMEBREW; } if (flags_ & GameInfoFlags::ICON) { diff --git a/UI/ImDebugger/ImDebugger.cpp b/UI/ImDebugger/ImDebugger.cpp index cbbe2c16d1..695e12b950 100644 --- a/UI/ImDebugger/ImDebugger.cpp +++ b/UI/ImDebugger/ImDebugger.cpp @@ -2473,6 +2473,9 @@ void ImDebugger::Frame(MIPSDebugInterface *mipsDebug, GPUCommon *gpuDebug, Draw: System_PostUIMessage(UIMessage::REQUEST_GAME_BOOT, path.ToString()); }); } + if (ImGui::MenuItem("Load XMB (VSH)")) { + System_PostUIMessage(UIMessage::REQUEST_GAME_BOOT, (g_Config.nandRootDirectory / "flash0/vsh/module/vshmain.prx").ToString()); + } if (ImGui::MenuItem("Open directory...")) { System_BrowseForFolder(reqToken_, "Load", Path(), [](std::string_view value, int) { System_PostUIMessage(UIMessage::REQUEST_GAME_BOOT, value); diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 048c1a2bd2..add9481018 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -695,7 +695,7 @@ void NativeInit(int argc, const char *argv[], const CommandLineOptions &cmdLineO cmdLineOptions.ApplyToConfig(); boot_filename.clear(); - if (boot_filename.empty() && cmdLineOptions.bootVSH.has_value() && cmdLineOptions.bootVSH.value()) { + if (boot_filename.empty() && cmdLineOptions.bootVSH.value_or(false)) { boot_filename = g_Config.nandRootDirectory / "flash0/vsh/module/vshmain.prx"; } diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index 2b014c1304..068ad6683c 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -471,6 +471,10 @@ namespace MainWindow { BrowseAndBoot(NON_EPHEMERAL_TOKEN, GetSysDirectory(DIRECTORY_GAME).ToString()); break; + case ID_FILE_LOAD_VSH: + System_PostUIMessage(UIMessage::REQUEST_GAME_BOOT, (g_Config.nandRootDirectory / "flash0/vsh/module/vshmain.prx").ToString()); + break; + case ID_FILE_OPEN_NEW_INSTANCE: W32Util::SpawnNewInstance(false); break; diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index fa4bd97058..f28cc1cbaf 100644 --- a/Windows/ppsspp.rc +++ b/Windows/ppsspp.rc @@ -512,6 +512,8 @@ BEGIN MENUITEM "", 0, MFT_SEPARATOR MENUITEM "Open New Instance", ID_FILE_OPEN_NEW_INSTANCE MENUITEM "", 0, MFT_SEPARATOR + MENUITEM "Load XMB (VSH)", ID_FILE_LOAD_VSH + MENUITEM "", 0, MFT_SEPARATOR POPUP "Savestate Slot", ID_FILE_SAVESTATE_SLOT_MENU BEGIN diff --git a/Windows/resource.h b/Windows/resource.h index 0dee92b055..523e59b92f 100644 --- a/Windows/resource.h +++ b/Windows/resource.h @@ -170,6 +170,7 @@ #define ID_FILE_QUICKLOADSTATE_HC 40037 #define ID_OPTIONS_CONTROLS 40038 #define ID_DEBUG_BREAKONLOAD 40039 +#define ID_FILE_LOAD_VSH 40040 #define ID_OPTIONS_FRAMESKIP 40044 #define IDC_MEMCHECK 40045 #define ID_FILE_MEMSTICK 40046