diff --git a/Source/Core/Core/Src/HLE/HLE_Misc.cpp b/Source/Core/Core/Src/HLE/HLE_Misc.cpp index bc625c9d2d..f9bab42f3c 100644 --- a/Source/Core/Core/Src/HLE/HLE_Misc.cpp +++ b/Source/Core/Core/Src/HLE/HLE_Misc.cpp @@ -292,10 +292,14 @@ void HBReload() void OSBootDol() { std::string dol; + std::string args; u32 r28 = GPR(28); Memory::GetString(dol, r28); + u32 argsPtr = Memory::Read_U32(GPR(5)); + Memory::GetString(args, argsPtr); + DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(SConfig::GetInstance().m_LastFilename.c_str()); DiscIO::IFileSystem* pFileSystem = DiscIO::CreateFileSystem(pVolume); @@ -322,6 +326,22 @@ void OSBootDol() } } + if (argsPtr) + { + u32 args_base = Memory::Read_U32(0x800000f4); + u32 ptr_to_num_args = 0xc; + u32 num_args = 1; + u32 hi_ptr = args_base + ptr_to_num_args + 4; + u32 new_args_ptr = args_base + ptr_to_num_args + 8; + + Memory::Write_U32(ptr_to_num_args, args_base + 8); + Memory::Write_U32(num_args, args_base + ptr_to_num_args); + Memory::Write_U32(0x14, hi_ptr); + + for (int i = 0; i < args.length(); i++) + Memory::WriteUnchecked_U8(args[i], new_args_ptr+i); + } + NPC = dolLoader.GetEntryPoint() | 0x80000000; } }