diff --git a/source/StartUpProcess.cpp b/source/StartUpProcess.cpp index 8515be69..ee72a0c9 100644 --- a/source/StartUpProcess.cpp +++ b/source/StartUpProcess.cpp @@ -34,24 +34,24 @@ StartUpProcess::StartUpProcess() //! Load default font for the next text outputs Theme::LoadFont(""); - background = new GuiImage(screenwidth, screenheight, (GXColor) {0, 0, 0, 255}); + background = new GuiImage(screenwidth, screenheight, (GXColor){0, 0, 0, 255}); GXImageData = Resources::GetImageData("gxlogo.png"); GXImage = new GuiImage(GXImageData); GXImage->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE); - GXImage->SetPosition(screenwidth/2, screenheight/2-50); + GXImage->SetPosition(screenwidth / 2, screenheight / 2 - 50); - titleTxt = new GuiText("Loading...", 24, (GXColor) {255, 255, 255, 255}); + titleTxt = new GuiText("Loading...", 24, (GXColor){255, 255, 255, 255}); titleTxt->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE); - titleTxt->SetPosition(screenwidth/2, screenheight/2+30); + titleTxt->SetPosition(screenwidth / 2, screenheight / 2 + 30); - messageTxt = new GuiText(" ", 22, (GXColor) {255, 255, 255, 255}); + messageTxt = new GuiText(" ", 22, (GXColor){255, 255, 255, 255}); messageTxt->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE); - messageTxt->SetPosition(screenwidth/2, screenheight/2+60); + messageTxt->SetPosition(screenwidth / 2, screenheight / 2 + 60); - versionTxt = new GuiText(" ", 18, (GXColor) {255, 255, 255, 255}); + versionTxt = new GuiText(" ", 18, (GXColor){255, 255, 255, 255}); versionTxt->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - versionTxt->SetPosition(20, screenheight-20); + versionTxt->SetPosition(20, screenheight - 20); #ifdef FULLCHANNEL versionTxt->SetTextf("v3.0c Rev. %s (%s)", GetRev(), commitID()); @@ -63,9 +63,9 @@ StartUpProcess::StartUpProcess() versionTxt->SetTextf("v3.0 Rev. %s mod (%s)", GetRev(), commitID()); #endif - cancelTxt = new GuiText("Press B to cancel", 18, (GXColor) {255, 255, 255, 255}); + cancelTxt = new GuiText("Press B to cancel", 18, (GXColor){255, 255, 255, 255}); cancelTxt->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE); - cancelTxt->SetPosition(screenwidth/2, screenheight/2+90); + cancelTxt->SetPosition(screenwidth / 2, screenheight / 2 + 90); trigB = new GuiTrigger; trigB->SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); @@ -94,35 +94,37 @@ int StartUpProcess::ParseArguments(int argc, char *argv[]) int quickBoot = -1; //! The arguments override - for(int i = 0; i < argc; ++i) + for (int i = 0; i < argc; ++i) { - if(!argv[i]) continue; + if (!argv[i]) + continue; - gprintf("Boot argument %i: %s\n", i+1, argv[i]); + gprintf("Boot argument %i: %s\n", i + 1, argv[i]); - char *ptr = strcasestr(argv[i], "-ios="); - if(ptr) + char *ptr = strcasestr(argv[i], "-bootios="); + if (ptr) { - if(atoi(ptr+strlen("-ios=")) == 58) + if (atoi(ptr + strlen("-bootios=")) == 58) Settings.LoaderIOS = 58; else - Settings.LoaderIOS = LIMIT(atoi(ptr+strlen("-ios=")), 200, 255); + Settings.LoaderIOS = LIMIT(atoi(ptr + strlen("-bootios=")), 200, 255); Settings.UseArgumentIOS = ON; + Settings.BootIOS = Settings.LoaderIOS; } ptr = strcasestr(argv[i], "-usbport="); - if(ptr) + if (ptr) { - Settings.USBPort = LIMIT(atoi(ptr+strlen("-usbport=")), 0, 2); + Settings.USBPort = LIMIT(atoi(ptr + strlen("-usbport=")), 0, 2); } ptr = strcasestr(argv[i], "-mountusb="); - if(ptr) + if (ptr) { - Settings.USBAutoMount = LIMIT(atoi(ptr+strlen("-mountusb=")), 0, 1); + Settings.USBAutoMount = LIMIT(atoi(ptr + strlen("-mountusb=")), 0, 1); } - if(strlen(argv[i]) == 6 && strchr(argv[i], '=') == 0 && strchr(argv[i], '-') == 0) + if (strlen(argv[i]) == 6 && strchr(argv[i], '=') == 0 && strchr(argv[i], '-') == 0) quickBoot = i; } @@ -131,9 +133,9 @@ int StartUpProcess::ParseArguments(int argc, char *argv[]) void StartUpProcess::TextFade(int direction) { - if(direction > 0) + if (direction > 0) { - for(int i = 0; i < 255; i += direction) + for (int i = 0; i < 255; i += direction) { messageTxt->SetAlpha(i); Draw(); @@ -141,9 +143,9 @@ void StartUpProcess::TextFade(int direction) messageTxt->SetAlpha(255); Draw(); } - else if(direction < 0) + else if (direction < 0) { - for(int i = 255; i > 0; i += direction) + for (int i = 255; i > 0; i += direction) { messageTxt->SetAlpha(i); Draw(); @@ -153,12 +155,12 @@ void StartUpProcess::TextFade(int direction) } } -void StartUpProcess::SetTextf(const char * format, ...) +void StartUpProcess::SetTextf(const char *format, ...) { - char * tmp = NULL; + char *tmp = NULL; va_list va; va_start(va, format); - if((vasprintf(&tmp, format, va) >= 0) && tmp) + if ((vasprintf(&tmp, format, va) >= 0) && tmp) { TextFade(-40); gprintf(tmp); @@ -167,7 +169,7 @@ void StartUpProcess::SetTextf(const char * format, ...) } va_end(va); - if(tmp) + if (tmp) free(tmp); } @@ -178,40 +180,36 @@ bool StartUpProcess::USBSpinUp() bool started0 = false; bool started1 = false; - const DISC_INTERFACE * handle0 = NULL; - const DISC_INTERFACE * handle1 = NULL; - if(Settings.USBPort == 0 || Settings.USBPort == 2) + const DISC_INTERFACE *handle0 = NULL; + const DISC_INTERFACE *handle1 = NULL; + if (Settings.USBPort == 0 || Settings.USBPort == 2) handle0 = DeviceHandler::GetUSB0Interface(); - if(Settings.USBPort == 1 || Settings.USBPort == 2) + if (Settings.USBPort == 1 || Settings.USBPort == 2) handle1 = DeviceHandler::GetUSB1Interface(); - + // wait 20 sec for the USB to spin up...stupid slow ass HDD do { - if(handle0) + if (handle0) started0 = (handle0->startup() && handle0->isInserted()); - if(handle1) + if (handle1) started1 = (handle1->startup() && handle1->isInserted()); - if( (!handle0 || started0) - && (!handle1 || started1)) { + if ((!handle0 || started0) && (!handle1 || started1)) break; - } - UpdatePads(); - for(int i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) cancelBtn->Update(&userInput[i]); - if(cancelBtn->GetState() == STATE_CLICKED) + if (cancelBtn->GetState() == STATE_CLICKED) break; - messageTxt->SetTextf("Waiting for HDD: %i sec left\n", 20-(int)countDown.elapsed()); + messageTxt->SetTextf("Waiting for HDD: %i sec left\n", 20 - (int)countDown.elapsed()); Draw(); usleep(50000); - } - while(countDown.elapsed() < 20.f); + } while (countDown.elapsed() < 20.f); drawCancel = false; @@ -224,54 +222,46 @@ int StartUpProcess::Run(int argc, char *argv[]) StartUpProcess Process; - int ret = Process.Execute(); + int ret = Process.Execute(quickGameBoot != -1); - if(quickGameBoot != -1) + if (quickGameBoot != -1) return QuickGameBoot(argv[quickGameBoot]); return ret; } -int StartUpProcess::Execute() +int StartUpProcess::Execute(bool quickGameBoot) { Settings.EntryIOS = IOS_GetVersion(); - gprintf("Current IOS: %i - have AHB access: %s\n", Settings.EntryIOS, AHBPROT_DISABLED ? "yes" : "no"); - - // Only reload the IOS if the XML requests it, we don't have full HW access or the entry IOS isn't 58 - if(Settings.UseArgumentIOS || !AHBPROT_DISABLED || IOS_GetVersion() != 58) + // Disable AHBPROT + IosLoader::PatchAHB(); + gprintf("Current IOS: %d - have AHB access: %s\n", Settings.EntryIOS, AHBPROT_DISABLED ? "yes" : "no"); + // Reload to a cIOS if required (old forwarder?) or requested + if (!AHBPROT_DISABLED || (Settings.EntryIOS != Settings.BootIOS)) { - if (Settings.UseArgumentIOS) - SetTextf("Reloading to %sIOS %i requested in meta.xml\n", Settings.LoaderIOS >= 200 ? "c" : "", Settings.LoaderIOS); - else - SetTextf("Reloading to %sIOS %i\n", Settings.LoaderIOS >= 200 ? "c" : "", Settings.LoaderIOS); - // Reload to the default loader IOS or the IOS set in meta.xml - // And on failure try cIOS 249, 250, 222, 223, 245, 246, 247 and 248 - if(IosLoader::LoadAppCios(Settings.LoaderIOS) < 0) + SetTextf("Reloading to cIOS %d%s\n", Settings.LoaderIOS, Settings.UseArgumentIOS ? "requested in meta.xml" : ""); + if (IosLoader::LoadAppCios(Settings.LoaderIOS) < 0) { SetTextf("Failed to load an IOS. USB Loader GX requires a cIOS or IOS58 with AHB access. Exiting...\n"); sleep(5); Sys_BackToLoader(); } - if(!AHBPROT_DISABLED && IOS_GetVersion() < 200) - { - SetTextf("Failed to load into IOS %i. USB Loader GX requires a cIOS or IOS58 with AHB access. Exiting...\n", IOS_GetVersion()); - sleep(5); - Sys_BackToLoader(); - } + SetTextf("Reloaded to cIOS %d\n", Settings.LoaderIOS); + gprintf("Current IOS: %d - have AHB access: %s\n", IOS_GetVersion(), AHBPROT_DISABLED ? "yes" : "no"); } SetupPads(); - gprintf("Current IOS: %i - have AHB access: %s\n", IOS_GetVersion(), AHBPROT_DISABLED ? "yes" : "no"); - SetTextf("Initializing sd card\n"); + SetTextf("Initializing SD card\n"); DeviceHandler::Instance()->MountSD(); - // Do not mount USB if not needed. USB is not available with WiiU WiiVC injected channel. - if(Settings.USBAutoMount == ON && !isWiiVC) + // Do not mount USB if not needed. USB is not available with WiiU WiiVC injected channel + if (Settings.USBAutoMount == ON && !isWiiVC) { - SetTextf("Initializing usb devices\n"); + SetTextf("Initializing USB devices\n"); USBSpinUp(); DeviceHandler::Instance()->MountAllUSB(false); + gprintf("Completed initialization of USB devices\n"); } SetTextf("Loading config files\n"); @@ -280,73 +270,83 @@ int StartUpProcess::Execute() gprintf("\tLoading game settings...%s\n", GameSettings.Load(Settings.ConfigPath) ? "done" : "failed"); gprintf("\tLoading game statistics...%s\n", GameStatistics.Load(Settings.ConfigPath) ? "done" : "failed"); gprintf("\tLoading game categories...%s\n", GameCategories.Load(Settings.ConfigPath) ? "done" : "failed"); - if(Settings.CacheTitles) + if (Settings.CacheTitles) gprintf("\tLoading cached titles...%s\n", GameTitles.ReadCachedTitles(Settings.titlestxt_path) ? "done" : "failed (using default)"); - // Reload to users settings if different than current IOS, and if not using an injected WiiU WiiVC IOS255 (fw.img) - if(Settings.LoaderIOS != IOS_GetVersion() && !isWiiVC && !Settings.UseArgumentIOS) + // Some settings need to be enabled to boot directly into games + gprintf("Quick game boot: %s\n", quickGameBoot ? "yes" : "no"); + if (quickGameBoot) { - // Unmount devices - DeviceHandler::DestroyInstance(); - if(Settings.USBAutoMount == ON) - USBStorage2_Deinit(); + Settings.USBAutoMount = ON; + Settings.LoaderMode = MODE_ALL; + Settings.skipSaving = true; + } + // Reload to users settings if different than current IOS, and if not using an injected WiiU WiiVC IOS255 (fw.img) + if (Settings.LoaderIOS != IOS_GetVersion() && !isWiiVC) + { // Shutdown pads + sleep(1); // Some Wiimotes won't reconnect as player 1 without this Wpad_Disconnect(); + // Unmount devices + DeviceHandler::DestroyInstance(); + if (Settings.USBAutoMount == ON) + USBStorage2_Deinit(); + // Now load the cIOS that was set in the settings menu - if(IosLoader::LoadAppCios(Settings.LoaderIOS) > -1) + if (IosLoader::LoadAppCios(Settings.LoaderIOS) > -1) { - SetTextf("Reloaded into cIOS %i R%i\n", IOS_GetVersion(), IOS_GetRevision()); + SetTextf("Reloaded to %s%d r%d\n", IOS_GetVersion() >= 200 ? "cIOS " : "IOS", Settings.LoaderIOS, IOS_GetRevision()); // Re-Mount devices SetTextf("Reinitializing devices\n"); } + gprintf("Current IOS: %d - have AHB access: %s\n", IOS_GetVersion(), AHBPROT_DISABLED ? "yes" : "no"); // Start pads again SetupPads(); - gprintf("Current IOS: %i - have AHB access: %s\n", IOS_GetVersion(), AHBPROT_DISABLED ? "yes" : "no"); DeviceHandler::Instance()->MountSD(); - if(Settings.USBAutoMount == ON) + if (Settings.USBAutoMount == ON) { USBSpinUp(); DeviceHandler::Instance()->MountAllUSB(false); } } - if(!IosLoader::IsHermesIOS() && !IosLoader::IsD2X()) + if (!IosLoader::IsHermesIOS() && !IosLoader::IsD2X()) { Settings.USBPort = 0; } - else if(Settings.USBPort == 1 && USBStorage2_GetPort() != Settings.USBPort) + else if (Settings.USBPort == 1 && USBStorage2_GetPort() != Settings.USBPort) { - if(Settings.USBAutoMount == ON && !isWiiVC) + if (Settings.USBAutoMount == ON && !isWiiVC) { - SetTextf("Changing USB Port to %i\n", Settings.USBPort); + SetTextf("Changing USB port to %i\n", Settings.USBPort); DeviceHandler::Instance()->UnMountAllUSB(); DeviceHandler::Instance()->MountAllUSB(); } } - else if(Settings.USBPort == 2) + else if (Settings.USBPort == 2) { - if(Settings.USBAutoMount == ON && !isWiiVC) + if (Settings.USBAutoMount == ON && !isWiiVC) { - SetTextf("Mounting USB Port to 1\n"); + SetTextf("Mounting USB port to 1\n"); DeviceHandler::Instance()->MountUSBPort1(); } } // Enable isfs permission if using Hermes v4 without AHB, or WiiU WiiVC (IOS255 fw.img) - if(IOS_GetVersion() < 200 || (IosLoader::IsHermesIOS() && IOS_GetRevision() == 4) || isWiiVC) + if (IOS_GetVersion() < 200 || (IosLoader::IsHermesIOS() && IOS_GetRevision() == 4) || isWiiVC) { - SetTextf("Patching %sIOS%i\n", IOS_GetVersion() >= 200 ? "c" : "", IOS_GetVersion()); + SetTextf("Patching %s%d\n", IOS_GetVersion() >= 200 ? "cIOS " : "IOS", IOS_GetVersion()); if (IosPatch_RUNTIME(!isWiiVC, false, false, isWiiVC, false) == ERROR_PATCH) - gprintf("Patching %sIOS%i failed!\n", IOS_GetVersion() >= 200 ? "c" : "", IOS_GetVersion()); + gprintf("Patching %sIOS%d failed!\n", IOS_GetVersion() >= 200 ? "c" : "", IOS_GetVersion()); else NandTitles.Get(); // get NAND channel's titles - } - gprintf("Current IOS: %i - have AHB access: %s\n", IOS_GetVersion(), AHBPROT_DISABLED ? "yes" : "no"); + gprintf("Current IOS: %d - have AHB access: %s\n", IOS_GetVersion(), AHBPROT_DISABLED ? "yes" : "no"); + } // We only initialize once for the whole session ISFS_Initialize(); @@ -358,7 +358,7 @@ int StartUpProcess::Execute() SetTextf("Loading resources\n"); // Do not allow banner grid mode without AHBPROT // this function does nothing if it was already initiated before - if(!SystemMenuResources::Instance()->IsLoaded() && !SystemMenuResources::Instance()->Init() + if (!SystemMenuResources::Instance()->IsLoaded() && !SystemMenuResources::Instance()->Init() && Settings.gameDisplay == BANNERGRID_MODE) { Settings.gameDisplay = LIST_MODE; @@ -368,7 +368,7 @@ int StartUpProcess::Execute() gprintf("\tLoading font...%s\n", Theme::LoadFont(Settings.ConfigPath) ? "done" : "failed (using default)"); gprintf("\tLoading theme...%s\n", Theme::Load(Settings.theme) ? "done" : "failed (using default)"); - //! Init the rest of the System + //! Init the rest of the system Sys_Init(); InitAudio(); setlocale(LC_CTYPE, "en_US.UTF-8"); @@ -385,26 +385,26 @@ void StartUpProcess::Draw() titleTxt->Draw(); messageTxt->Draw(); versionTxt->Draw(); - if(drawCancel) + if (drawCancel) cancelTxt->Draw(); Menu_Render(); } -int StartUpProcess::QuickGameBoot(const char * gameID) +int StartUpProcess::QuickGameBoot(const char *gameID) { MountGamePartition(false); struct discHdr *header = NULL; - for(int i = 0; i < gameList.size(); ++i) + for (int i = 0; i < gameList.size(); ++i) { - if(strncasecmp((char *) gameList[i]->id, gameID, 6) == 0) + if (strncasecmp((char *)gameList[i]->id, gameID, 6) == 0) header = gameList[i]; } - if(!header) + if (!header) return -1; - GameStatistics.SetPlayCount(header->id, GameStatistics.GetPlayCount(header->id)+1); + GameStatistics.SetPlayCount(header->id, GameStatistics.GetPlayCount(header->id) + 1); GameStatistics.Save(); return GameBooter::BootGame(header); diff --git a/source/StartUpProcess.h b/source/StartUpProcess.h index 174feba6..4ca8a48d 100644 --- a/source/StartUpProcess.h +++ b/source/StartUpProcess.h @@ -5,30 +5,31 @@ class StartUpProcess { - public: - static int Run(int argc, char *argv[]); - private: - StartUpProcess(); - ~StartUpProcess(); - int Execute(); - bool USBSpinUp(); - void TextFade(int direction); - void SetTextf(const char * format, ...); - void Draw(); - static int ParseArguments(int argc, char *argv[]); - static int QuickGameBoot(const char * gameID); +public: + static int Run(int argc, char *argv[]); - bool drawCancel; +private: + StartUpProcess(); + ~StartUpProcess(); + int Execute(bool quickGameBoot); + bool USBSpinUp(); + void TextFade(int direction); + void SetTextf(const char *format, ...); + void Draw(); + static int ParseArguments(int argc, char *argv[]); + static int QuickGameBoot(const char *gameID); - GuiImageData * GXImageData; - GuiImage * background; - GuiImage * GXImage; - GuiText * titleTxt; - GuiText * messageTxt; - GuiText * versionTxt; - GuiText * cancelTxt; - GuiButton * cancelBtn; - GuiTrigger * trigB; + bool drawCancel; + + GuiImageData *GXImageData; + GuiImage *background; + GuiImage *GXImage; + GuiText *titleTxt; + GuiText *messageTxt; + GuiText *versionTxt; + GuiText *cancelTxt; + GuiButton *cancelBtn; + GuiTrigger *trigB; }; #endif diff --git a/source/settings/CSettings.cpp b/source/settings/CSettings.cpp index 0e41a626..e98cf439 100644 --- a/source/settings/CSettings.cpp +++ b/source/settings/CSettings.cpp @@ -121,6 +121,7 @@ void CSettings::SetDefault() tooltips = ON; gamesound = ON; parentalcontrol = PARENTAL_LVL_ADULT; + BootIOS = 58; LoaderIOS = 249; cios = 249; gridRows = 3; @@ -306,6 +307,8 @@ bool CSettings::Reset() bool CSettings::Save() { + // Quick game booting doesn't need to save + if (skipSaving) return false; if (!FindConfig()) return false; char filedest[300]; diff --git a/source/settings/CSettings.h b/source/settings/CSettings.h index aa2a7687..cee75416 100644 --- a/source/settings/CSettings.h +++ b/source/settings/CSettings.h @@ -121,6 +121,7 @@ class CSettings short gamesoundvolume; short tooltips; short parentalcontrol; + u8 BootIOS; u8 LoaderIOS; u8 cios; short quickboot; @@ -240,8 +241,9 @@ class CSettings short GCInstallAligned; short PrivateServer; - // This variable is not saved to the settings file + // These variables are not saved to the settings file bool FirstTimeRun; + bool skipSaving; protected: bool ValidVersion(FILE * file); bool ValidateURL(char *value, int type = 0); diff --git a/source/settings/menus/LoaderSettings.cpp b/source/settings/menus/LoaderSettings.cpp index cb6570b5..a8efc998 100644 --- a/source/settings/menus/LoaderSettings.cpp +++ b/source/settings/menus/LoaderSettings.cpp @@ -212,7 +212,6 @@ LoaderSettings::LoaderSettings() oldLoaderMode = Settings.LoaderMode; oldGameCubeSource = Settings.GameCubeSource; - oldLoaderIOS = Settings.LoaderIOS; } LoaderSettings::~LoaderSettings() @@ -233,12 +232,6 @@ LoaderSettings::~LoaderSettings() { GCGames::Instance()->LoadAllGames(); } - - if(oldLoaderIOS != Settings.LoaderIOS) - { - // edit meta.xml arguments - editMetaArguments(); - } } void LoaderSettings::SetOptionNames() diff --git a/source/settings/menus/LoaderSettings.hpp b/source/settings/menus/LoaderSettings.hpp index b087ad8c..db194aea 100644 --- a/source/settings/menus/LoaderSettings.hpp +++ b/source/settings/menus/LoaderSettings.hpp @@ -38,7 +38,6 @@ class LoaderSettings : public SettingsMenu short oldLoaderMode; short oldGameCubeSource; - short oldLoaderIOS; OptionList GuiOptions; }; diff --git a/source/settings/meta.cpp b/source/settings/meta.cpp index ca45a4f5..9a0fb067 100644 --- a/source/settings/meta.cpp +++ b/source/settings/meta.cpp @@ -34,7 +34,7 @@ int updateMetaXML (void) return 0; char line[50]; - snprintf(line, sizeof(line), "--ios=%d", Settings.LoaderIOS); + snprintf(line, sizeof(line), "--bootios=%d", Settings.BootIOS); MetaXML.SetArgument(line); snprintf(line, sizeof(line), "--usbport=%d", Settings.USBPort); MetaXML.SetArgument(line); @@ -73,21 +73,27 @@ int editMetaArguments (void) while (fgets(line, max_line_size, source) != NULL) { // delete commented lines + if( strstr(line, " ") != NULL) + { + strcpy(line, ""); + } + // delete commented lines (old version) if( strstr(line, "") != NULL) { - strcpy(line, " \n"); + strcpy(line, ""); } // generate argurments if(strstr(line, "") != NULL) { fputs(line, destination); - snprintf(line, max_line_size, " --ios=%d\n", Settings.LoaderIOS); + snprintf(line, max_line_size, " --bootios=%d\n", Settings.BootIOS); fputs(line, destination); - snprintf(line, max_line_size, " --usbport=%d\n", Settings.USBPort); + snprintf(line, max_line_size, " --usbport=%d\n", Settings.USBPort); fputs(line, destination); - snprintf(line, max_line_size, " --mountusb=%d\n", Settings.USBAutoMount); + snprintf(line, max_line_size, " --mountusb=%d\n", Settings.USBAutoMount); fputs(line, destination); while(strstr(line, "") == NULL) diff --git a/source/system/IosLoader.cpp b/source/system/IosLoader.cpp index 3b8e1b06..d4331e3e 100644 --- a/source/system/IosLoader.cpp +++ b/source/system/IosLoader.cpp @@ -175,6 +175,13 @@ s32 IosLoader::ReloadIosSafe(s32 ios) * Reloads a certain IOS and keeps the AHBPROT flag enabled if available. */ s32 IosLoader::ReloadIosKeepingRights(s32 ios) +{ + PatchAHB(); + // Reload IOS. MEM2 protection is implicitly re-enabled + return IOS_ReloadIOS(ios); +} + +void IosLoader::PatchAHB() { if (CheckAHBPROT()) { @@ -186,15 +193,14 @@ s32 IosLoader::ReloadIosKeepingRights(s32 ios) 0x4698, // mov r8, r3 ; Store it for the DVD video bitcheck later 0x07DB // lsls r3, r3, 0x1F ; check AHBPROT bit }; - - /* Disable MEM 2 protection */ - write16(MEM2_PROT, 2); + // Disable memory protection + write16(MEM2_PROT, 0); for (u16 *patchme = ES_MODULE_START; patchme < ES_MODULE_END; patchme++) { if (!memcmp(patchme, ticket_check, sizeof(ticket_check))) { - gprintf("ReloadIos: Found TMD access rights check at %p\n", patchme); + gprintf("PatchAHB: Found TMD access rights check at %p\n", patchme); /* Apply patch */ patchme[ES_HACK_OFFSET] = 0x23FF; // li r3, 0xFF ; Set full access rights @@ -204,9 +210,9 @@ s32 IosLoader::ReloadIosKeepingRights(s32 ios) break; } } + // Enable memory protection + write16(MEM2_PROT, 1); } - // Reload IOS. MEM2 protection is implicitly re-enabled - return IOS_ReloadIOS(ios); } /* diff --git a/source/system/IosLoader.h b/source/system/IosLoader.h index f99ef3d3..6f74f543 100644 --- a/source/system/IosLoader.h +++ b/source/system/IosLoader.h @@ -88,6 +88,7 @@ class IosLoader static s32 LoadGameCios(s32 ios); static s32 ReloadIosSafe(s32 ios); static s32 ReloadIosKeepingRights(s32 ios); + static void PatchAHB(); static bool IsHermesIOS(s32 ios = IOS_GetVersion()); static bool IsWaninkokoIOS(s32 ios = IOS_GetVersion()); static bool IsD2X(s32 ios = IOS_GetVersion()); diff --git a/source/wpad.c b/source/wpad.c index 98ec3435..db121c20 100644 --- a/source/wpad.c +++ b/source/wpad.c @@ -5,9 +5,6 @@ #include "sys.h" #include "wpad.h" -/* Constants */ -#define MAX_WIIMOTES 4 - extern u8 shutdown; void __Wpad_PowerCallback(s32 chan) @@ -35,8 +32,12 @@ void Wpad_Disconnect(void) u32 cnt; /* Disconnect Wiimotes */ - for (cnt = 0; cnt < MAX_WIIMOTES; cnt++) + for (cnt = 0; cnt < WPAD_MAX_WIIMOTES; cnt++) + { + if (WPAD_Probe(cnt, 0) < 0) + continue; WPAD_Disconnect(cnt); + } /* Shutdown Wiimote subsystem */ WPAD_Shutdown(); diff --git a/svnrev.sh b/svnrev.sh index d6b64d2e..d3d559af 100644 --- a/svnrev.sh +++ b/svnrev.sh @@ -49,7 +49,7 @@ cat < ./HBC/meta.xml $rev_date