int main(int argc, char **argv) { set_new_handler(no_memory); geckoinit = InitGecko(); __exception_setreload(5); SYS_SetArena1Hi(APPLOADER_START); char *gameid = NULL; string dolLoc; //(argv[0] != NULL ? argv[0] : ""); for (int i = 0; i < argc; i++) { if (argv[i] != NULL && strcasestr(argv[i], "ios=") != NULL && strlen(argv[i]) > 4) { while(argv[i][0] && !isdigit(argv[i][0])) argv[i]++; if (atoi(argv[i]) < 254 && atoi(argv[i]) > 0) mainIOS = atoi(argv[i]); } else if (strlen(argv[i]) == 6) { gameid = argv[i]; for (int i=0; i < 5; i++) if (!isalnum(gameid[i])) gameid = NULL; } } gprintf("Loading cIOS: %d\n", mainIOS); ISFS_Initialize(); // Load Custom IOS bool iosOK = loadIOS(mainIOS, false); MEM2_init(52); u8 mainIOSBase = 0; iosOK = iosOK && cIOSInfo::D2X(mainIOS, &mainIOSBase); gprintf("Loaded cIOS: %u has base %u\n", mainIOS, mainIOSBase); // Init video CVideo vid; vid.init(); WIILIGHT_Init(); vid.waitMessage(0.2f); // Init Sys_Init(); Sys_ExitTo(EXIT_TO_HBC); int ret = 0; do { Open_Inputs(); bool deviceAvailable = false; u8 timeout = 0; while(!deviceAvailable && timeout++ != 20) { DeviceHandler::Instance()->MountAll(); sleep(1); for(u8 device = SD; device <= USB8; device++) if(DeviceHandler::Instance()->IsInserted(device)) deviceAvailable = true; } bool dipOK = Disc_Init() >= 0; CMenu menu(vid); menu.init(dolLoc); mainMenu = &menu; if(!deviceAvailable) { menu.error(L"Could not find a device to save configuration files on!"); break; } else if(!iosOK) { menu.error(sfmt("d2x cIOS %i rev6 or later is required", mainIOS)); break; } else if(!dipOK) { menu.error(L"Could not initialize the DIP module!"); break; } else { if (gameid != NULL && strlen(gameid) == 6) menu._directlaunch(gameid); else ret = menu.main(); } vid.cleanup(); if (bootHB) { IOS_ReloadIOS(58); BootHomebrew(); } } while (ret == 1); WifiGecko_Close(); Nand::Instance()->Disable_Emu(); Nand::DestroyInstance(); Sys_Exit(); return 0; };
int old_main() { geckoinit = InitGecko(); use_dvdx = 1; InitDVD(); SYS_SetArena1Hi((void *)0x81200000); // See loader/apploader.c CVideo vid; gprintf("WodeFlow started, running with ios %d\n", IOS_GetVersion()); bool dipOK = false; int ret = 0; bool hbc; bool wodeOK = false; // MEM2 usage : // 36 MB for general purpose allocations // 12 MB for covers (and temporary buffers) // adds 15 MB from MEM1 to obtain 27 MB for covers (about 150 HQ covers on screen) MEM2_init(36, 12); // Max ~48 // Launched through the HBC? hbc = *((u32 *) 0x80001804) == 0x53545542 && *((u32 *) 0x80001808) == 0x48415858; // Init video vid.init(); // Init STexture texWait; texWait.fromPNG(wait_png, GX_TF_RGB565, ALLOC_MALLOC); vid.waitMessage(texWait); Sys_Init(); Sys_ExitToWiiMenu(true); Fat_Mount(); WPAD_Init(); WPAD_SetDataFormat(0, WPAD_FMT_BTNS_ACC_IR); dipOK = Disc_Init() >= 0; if (dipOK) { u32 status = 0; if (WDVD_GetCoverStatus(&status) != 0 || (status & 2) == 0) { // WDVD_WaitForDisc(); STexture texWaitForDisc; texWaitForDisc.fromPNG(wait_disc_png, GX_TF_RGB565, ALLOC_MALLOC); vid.waitMessage(texWaitForDisc); texWaitForDisc.data.release(); do { WPAD_ScanPads(); s32 padsState = WPAD_ButtonsDown(0); if ((padsState & WPAD_BUTTON_B) != 0) break; usleep(100 * 1000); } while (WDVD_GetCoverStatus(&status) != 0 || (status & 2) == 0); if ((status & 2) == 0) return -2; InitDVD(); } } wodeOK = WBFS_Init() >= 0; vid.waitMessage(texWait); texWait.data.release(); MEM2_takeBigOnes(true); do { CMenu menu(vid); menu.init(hbc); if (!dipOK) menu.error(L"Could not initialize DIP module!"); else if (!wodeOK) menu.error(L"Wode not found."); else { ret = menu.main(); } vid.cleanup(); } while (ret == 1); LaunchISO(0, 0); CloseWode(); Fat_Unmount(); return ret; };