Boot: Add support for booting NAND titles with just the ID

This commit is contained in:
Léo Lam 2017-10-01 15:41:54 +02:00
parent 62be010ac6
commit 60ba382799
7 changed files with 49 additions and 11 deletions

View File

@ -339,7 +339,8 @@ bool CBoot::BootUp(std::unique_ptr<BootParameters> boot)
HID4.SBE = 1; HID4.SBE = 1;
// Because there is no TMD to get the requested system (IOS) version from, // Because there is no TMD to get the requested system (IOS) version from,
// we default to IOS58, which is the version used by the Homebrew Channel. // we default to IOS58, which is the version used by the Homebrew Channel.
SetupWiiMemory(0x000000010000003a); SetupWiiMemory();
IOS::HLE::GetIOS()->BootIOS(0x000000010000003a);
} }
else else
{ {
@ -363,6 +364,12 @@ bool CBoot::BootUp(std::unique_ptr<BootParameters> boot)
return Boot_WiiWAD(nand.content_path); return Boot_WiiWAD(nand.content_path);
} }
bool operator()(const BootParameters::NANDTitle& nand_title) const
{
SetDefaultDisc();
return BootNANDTitle(nand_title.id);
}
bool operator()(const BootParameters::IPL& ipl) const bool operator()(const BootParameters::IPL& ipl) const
{ {
NOTICE_LOG(BOOT, "Booting GC IPL: %s", ipl.path.c_str()); NOTICE_LOG(BOOT, "Booting GC IPL: %s", ipl.path.c_str());

View File

@ -50,6 +50,11 @@ struct BootParameters
std::string content_path; std::string content_path;
}; };
struct NANDTitle
{
u64 id;
};
struct IPL struct IPL
{ {
explicit IPL(DiscIO::Region region_); explicit IPL(DiscIO::Region region_);
@ -67,7 +72,7 @@ struct BootParameters
static std::unique_ptr<BootParameters> GenerateFromFile(const std::string& path); static std::unique_ptr<BootParameters> GenerateFromFile(const std::string& path);
using Parameters = std::variant<Disc, Executable, NAND, IPL, DFF>; using Parameters = std::variant<Disc, Executable, NAND, NANDTitle, IPL, DFF>;
BootParameters(Parameters&& parameters_); BootParameters(Parameters&& parameters_);
Parameters parameters; Parameters parameters;
@ -99,6 +104,7 @@ private:
static void UpdateDebugger_MapLoaded(); static void UpdateDebugger_MapLoaded();
static bool Boot_WiiWAD(const std::string& filename); static bool Boot_WiiWAD(const std::string& filename);
static bool BootNANDTitle(u64 title_id);
static void SetupMSR(); static void SetupMSR();
static void SetupBAT(bool is_wii); static void SetupBAT(bool is_wii);
@ -109,7 +115,7 @@ private:
static bool Load_BS2(const std::string& boot_rom_filename); static bool Load_BS2(const std::string& boot_rom_filename);
static void SetupGCMemory(); static void SetupGCMemory();
static bool SetupWiiMemory(u64 ios_title_id); static bool SetupWiiMemory();
}; };
class BootExecutableReader class BootExecutableReader

View File

@ -213,7 +213,7 @@ bool CBoot::EmulatedBS2_GC(const DiscIO::Volume& volume)
return RunApploader(/*is_wii*/ false, volume); return RunApploader(/*is_wii*/ false, volume);
} }
bool CBoot::SetupWiiMemory(u64 ios_title_id) bool CBoot::SetupWiiMemory()
{ {
static const std::map<DiscIO::Region, const RegionSetting> region_settings = { static const std::map<DiscIO::Region, const RegionSetting> region_settings = {
{DiscIO::Region::NTSC_J, {"JPN", "NTSC", "JP", "LJ"}}, {DiscIO::Region::NTSC_J, {"JPN", "NTSC", "JP", "LJ"}},
@ -308,9 +308,6 @@ bool CBoot::SetupWiiMemory(u64 ios_title_id)
// It is fine to always use the latest value as apploaders work with all versions. // It is fine to always use the latest value as apploaders work with all versions.
Memory::Write_U16(0x0113, 0x0000315e); Memory::Write_U16(0x0113, 0x0000315e);
if (!IOS::HLE::GetIOS()->BootIOS(ios_title_id))
return false;
Memory::Write_U8(0x80, 0x0000315c); // OSInit Memory::Write_U8(0x80, 0x0000315c); // OSInit
Memory::Write_U16(0x0000, 0x000030e0); // PADInit Memory::Write_U16(0x0000, 0x000030e0); // PADInit
Memory::Write_U32(0x80000000, 0x00003184); // GameID Address Memory::Write_U32(0x80000000, 0x00003184); // GameID Address
@ -367,7 +364,7 @@ bool CBoot::EmulatedBS2_Wii(const DiscIO::Volume& volume)
Memory::Write_U32(0, 0x3194); Memory::Write_U32(0, 0x3194);
Memory::Write_U32(static_cast<u32>(data_partition.offset >> 2), 0x3198); Memory::Write_U32(static_cast<u32>(data_partition.offset >> 2), 0x3198);
if (!SetupWiiMemory(tmd.GetIOSId())) if (!SetupWiiMemory() || !IOS::HLE::GetIOS()->BootIOS(tmd.GetIOSId()))
return false; return false;
DVDRead(volume, 0x00000000, 0x00000000, 0x20, DiscIO::PARTITION_NONE); // Game Code DVDRead(volume, 0x00000000, 0x00000000, 0x20, DiscIO::PARTITION_NONE); // Game Code

View File

@ -21,6 +21,20 @@
#include "DiscIO/NANDContentLoader.h" #include "DiscIO/NANDContentLoader.h"
bool CBoot::BootNANDTitle(const u64 title_id)
{
UpdateStateFlags([](StateFlags* state) {
state->type = 0x03; // TYPE_RETURN
});
if (title_id == Titles::SYSTEM_MENU)
IOS::HLE::CreateVirtualFATFilesystem();
SetupWiiMemory();
auto* ios = IOS::HLE::GetIOS();
return ios->GetES()->LaunchTitle(title_id);
}
bool CBoot::Boot_WiiWAD(const std::string& _pFilename) bool CBoot::Boot_WiiWAD(const std::string& _pFilename)
{ {
UpdateStateFlags([](StateFlags* state) { UpdateStateFlags([](StateFlags* state) {

View File

@ -902,6 +902,21 @@ struct SetGameMetadata
return true; return true;
} }
bool operator()(const BootParameters::NANDTitle& nand_title) const
{
IOS::HLE::Kernel ios;
const IOS::ES::TMDReader tmd = ios.GetES()->FindInstalledTMD(nand_title.id);
if (!tmd.IsValid() || !IOS::ES::IsChannel(nand_title.id))
{
PanicAlertT("This title cannot be booted.");
return false;
}
config->SetRunningGameMetadata(tmd);
config->bWii = true;
*region = tmd.GetRegion();
return true;
}
bool operator()(const BootParameters::IPL& ipl) const bool operator()(const BootParameters::IPL& ipl) const
{ {
config->bWii = false; config->bWii = false;

View File

@ -652,8 +652,7 @@ void MainWindow::PerformOnlineUpdate(const std::string& region)
void MainWindow::BootWiiSystemMenu() void MainWindow::BootWiiSystemMenu()
{ {
StartGame(QString::fromStdString( StartGame(std::make_unique<BootParameters>(BootParameters::NANDTitle{Titles::SYSTEM_MENU}));
Common::GetTitleContentPath(Titles::SYSTEM_MENU, Common::FROM_CONFIGURED_ROOT)));
} }
void MainWindow::NetPlayInit() void MainWindow::NetPlayInit()

View File

@ -1225,7 +1225,7 @@ void CFrame::OnShowCheatsWindow(wxCommandEvent& WXUNUSED(event))
void CFrame::OnLoadWiiMenu(wxCommandEvent& WXUNUSED(event)) void CFrame::OnLoadWiiMenu(wxCommandEvent& WXUNUSED(event))
{ {
BootGame(Common::GetTitleContentPath(Titles::SYSTEM_MENU, Common::FROM_CONFIGURED_ROOT)); StartGame(std::make_unique<BootParameters>(BootParameters::NANDTitle{Titles::SYSTEM_MENU}));
} }
void CFrame::OnInstallWAD(wxCommandEvent& event) void CFrame::OnInstallWAD(wxCommandEvent& event)