int main(int argc, char **argv) { /* Load Custom IOS */ IOS_ReloadIOS(249); /* Initialize subsystems */ Sys_Init(); /* Set video mode */ Video_SetMode(); /* Initialize console */ Gui_InitConsole(); /* Draw background */ Gui_DrawBackground(); /* Initialize Wiimote subsystem */ Wpad_Init(); /* Initialize disc subsystem */ Disc_Init(); /* Mount SD card */ Fat_MountSD(); /* Menu loop */ Menu_Loop(); /* Restart */ Restart(); return 0; }
int Sys_IosReload(int IOS) { s32 ret = -1; //shutdown SD and USB before IOS Reload in DiscWait SDCard_deInit(); USBDevice_deInit(); WPAD_Flush(0); WPAD_Disconnect(0); WPAD_Shutdown(); WDVD_Close(); USBStorage_Deinit(); if (IOS == 249 || IOS == 222 || IOS == 223) { int i; for (i = 0; i < 10; i++) { ret = IOS_ReloadIOS(IOS); if (ret < 0) return ret; if (IOS == 222 || IOS == 223) load_ehc_module(); ret = WBFS_Init(WBFS_DEVICE_USB); if (!(ret < 0)) break; sleep(1); USBStorage_Deinit(); } if (ret>=0) { ret = Disc_Init(); if (ret>=0) { ret = WBFS_Open(); } } else Sys_BackToLoader(); } PAD_Init(); Wpad_Init(); WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); // WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight); //reinitialize SD and USB SDCard_Init(); USBDevice_Init(); return ret; }
int Sys_ChangeIos(int ios) { s32 prevIos = IOS_GetVersion(); SDCard_deInit(); USBDevice_deInit(); WPAD_Flush(0); WPAD_Disconnect(0); WPAD_Shutdown(); WDVD_Close(); USBStorage2_Deinit(); s32 ret = IOS_ReloadIOSsafe(ios); if (ret < 0) { ios = prevIos; } SDCard_Init(); if (ios == 222 || ios == 223) { load_ehc_module(); } USBDevice_Init(); PAD_Init(); Wpad_Init(); WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight); WBFS_Init(WBFS_DEVICE_USB); Disc_Init(); if (Sys_IsHermes()) { WBFS_OpenNamed((char *) &game_partition); } else { WBFS_Open(); } return ret; }
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; };
void Menu_Boot() { struct discHdr *header; bool gc = false; header = &gameList[gameSelected]; s32 ret; struct Game_CFG_2 *game_cfg = NULL; /* Clear console */ if (!CFG.direct_launch) { Con_Clear(); } FgColor(CFG.color_header); printf_x(gt("Start this game?")); printf("\n\n"); DefaultColor(); game_cfg = CFG_find_game(header->id); // Get game size gc = header->magic == GC_MAGIC; bool do_skip = !CFG.confirm_start; /* SoundInfo snd; u8 banner_title[84]; memset(banner_title, 0, 84); memset(&snd, 0, sizeof(snd)); WBFS_Banner(header->id, &snd, banner_title, !do_skip, CFG_read_active_game_setting(header->id).write_playlog); */ if (do_skip) { goto skip_confirm; } printf("\n"); /* Show game info */ printf_("%s\n", get_title(header)); printf_("(%.6s)\n\n", header->id); __Menu_ShowGameInfo(true, header->id); /* load game info from XML */ printf("\n"); //Does DL warning apply to launching discs too? Not sure printf_h(gt("Press %s button to continue."), (button_names[CFG.button_confirm.num])); printf("\n"); printf_h(gt("Press %s button to go back."), (button_names[CFG.button_cancel.num])); if (!gc) { printf("\n"); printf_h(gt("Press %s button for options."), (button_names[CFG.button_other.num])); } printf("\n\n"); __console_flush(0); // play banner sound /* if (snd.dsp_data) { SND_PauseVoice(0, 1); // pause mp3 int fmt = (snd.channels == 2) ? VOICE_STEREO_16BIT : VOICE_MONO_16BIT; SND_SetVoice(1, fmt, snd.rate, 0, snd.dsp_data, snd.size, 255,255, //volume,volume, NULL); //DataTransferCallback } */ /* Wait for user answer */ u32 buttons; for (;;) { buttons = Wpad_WaitButtons(); if (buttons & CFG.button_confirm.mask) break; if (buttons & CFG.button_cancel.mask) break; if (!gc && (buttons & CFG.button_other.mask)) break; if (buttons & CFG.button_exit.mask) break; } /* // stop banner sound, resume mp3 if (snd.dsp_data) { SND_StopVoice(1); SAFE_FREE(snd.dsp_data); if (buttons & CFG.button_confirm.mask) { SND_ChangeVolumeVoice(0, 0, 0); } SND_PauseVoice(0, 0); } */ if (buttons & CFG.button_cancel.mask) goto close; if (buttons & CFG.button_exit.mask) { Handle_Home(0); return; } if (!gc && (buttons & CFG.button_other.mask)) { Menu_Boot_Options(header); return; } // A button: continue to boot skip_confirm: if (game_cfg) { CFG.game = game_cfg->curr; } if (CFG.game.write_playlog && set_playrec(header->id, (u8 *) header->title) < 0) { // banner_title) < 0) { printf_(gt("Error storing playlog file.\nStart from the Wii Menu to fix.")); printf("\n"); printf_h(gt("Press %s button to exit."), (button_names[CFG.button_exit.num])); printf("\n"); if (!Menu_Confirm(0)) return; } WBFS_OpenDisc(header->id, header->game_idx); printf("\n"); printf_x(gt("Booting Wii game, please wait...")); printf("\n\n"); // load stuff before ios reloads & services close ocarina_load_code(header->id); load_wip_patches(header->id); // Close the wode stuff WBFS_Close(); use_dvdx = 0; Disc_Init(); ret = Disc_Wait(); if (ret < 0) { printf("Cannot mount newly selected image: %d\n", ret); } Disc_Open(); // stop services (music, gui) Services_Close(); setPlayStat(header->id); //I'd rather do this after the check, but now you unmount fat before that ;) Fat_UnmountAll(); if (gc) { WII_Initialize(); ret = WII_LaunchTitle(0x0000000100000100ULL); } else { switch(CFG.game.language) { // 0 = CFG_LANG_CONSOLE case 0: configbytes[0] = 0xCD; break; case 1: configbytes[0] = 0x00; break; case 2: configbytes[0] = 0x01; break; case 3: configbytes[0] = 0x02; break; case 4: configbytes[0] = 0x03; break; case 5: configbytes[0] = 0x04; break; case 6: configbytes[0] = 0x05; break; case 7: configbytes[0] = 0x06; break; case 8: configbytes[0] = 0x07; break; case 9: configbytes[0] = 0x08; break; case 10: configbytes[0] = 0x09; break; } /* Boot Wii disc */ ret = Disc_WiiBoot(); } printf_(gt("Returned! (ret = %d)"), ret); printf("\n"); printf("\n"); printf_(gt("Press any button to exit...")); printf("\n"); /* Wait for button */ Wpad_WaitButtonsCommon(); exit(0); close: WDVD_StopMotor(); header = &gameList[gameSelected]; Gui_DrawCover(header->id); // Reopen the wode WBFS_Init(); return; }
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; };
//--------------------------------------------------------------------------------- int main(int argc, char **argv) { VIDEO_Init(); VIDEO_SetBlack(true); // Disable video output during initialisation net_wc24cleanup(); if (fatMountSimple("sd", &__io_wiisd)) DebugStart (true, "sd://ploader.log"); else DebugStart (true, NULL); configbytes[0] = 0xCD; //configbytes[0] = 0; Debug ("---------------------------------------------------------------------------"); Debug (" di "VER" by stfour"); Debug (" (part of postLoader project)"); Debug ("---------------------------------------------------------------------------"); struct discHdr *header; header = (struct discHdr *)memalign(32, sizeof(struct discHdr)); s32 rr = Disc_Init(); Debug("Disc_Init() returned: %d", rr); rr = Disc_Open(); Debug("Disc_Open() returned: %d", rr); // Check disc rr = Disc_IsGC(); Debug("Disc_IsGC() returned: %d", rr); if (rr == 0) { rr = WDVD_ReadDiskId ((void*)0x80000000); Debug("WDVD_ReadDiskId() returned: %d", rr); rr = WDVD_EnableAudio(*(u8*)0x80000008); Debug("WDVD_EnableAudio() returned: %d", rr); *(volatile unsigned int *)0xCC003024 |= 7; int retval = ES_GetTicketViews(BC, &view, 1); if (retval != 0) { Debug("ES_GetTicketViews fail %d", retval); exit (0); } retval = ES_LaunchTitle(BC, &view); exit (0); } // Check disc rr = Disc_IsWii(); Debug("Disc_IsWii() returned: %d", rr); if (rr == 0) { // Read header rr = Disc_ReadHeader(header); Debug("Disc_ReadHeader() returned: %d", rr); Disc_WiiBoot (0, FALSE, TRUE, 0); } exit (0); }
s32 Disc_BootPartition(u64 offset, u8 videoselected, u8 cheat, u8 vipatch, u8 patchcountrystring, u32 rtrn) { entry_point p_entry; s32 ret; /* Open specified partition */ ret = WDVD_OpenPartition(offset, tmd_buffer); if (ret < 0) return ret; char gameid[8]; memset(gameid, 0, 8); memcpy(gameid, (char*)Disc_ID, 6); //kill the SD SDCard_deInit(); /* Disconnect Wiimote */ WPAD_Flush(0); WPAD_Disconnect(0); WPAD_Shutdown(); // Load Disc IOS u32 disc_ios = tmd_buffer[0x18B]; if (disc_ios != IOS_GetVersion()) { WDVD_ClosePartition(); WDVD_Close(); ret = IOS_ReloadIOS(disc_ios); if (ret < 0) { gprintf("Disc IOS %u could not be loaded! (ret = %d)", disc_ios, ret); return ret; } Disc_Init(); Disc_Open(); WDVD_OpenPartition(offset, tmd_buffer); } /* Setup low memory */ __Disc_SetLowMem(); /* Run apploader */ ret = Apploader_Run(&p_entry, cheat, videoselected, vipatch, patchcountrystring, rtrn); if (ret < 0) return ret; bool cheatloaded = false; if (cheat == 1) { /* OCARINA STUFF - FISHEARS*/ cheatloaded = ocarina_do_code() == 1; cheatloaded = true; } /* Set an appropiate video mode */ __Disc_SetVMode(videoselected); /* Set time */ __Disc_SetTime(); // Anti-green screen fix VIDEO_SetBlack(TRUE); VIDEO_Flush(); VIDEO_WaitVSync(); gprintf("\n\nUSB Loader GX is done.\n\n"); /* Shutdown IOS subsystems */ // fix for PeppaPig (from NeoGamma) extern void __exception_closeall(); IRQ_Disable(); __IOS_ShutdownSubsystems(); __exception_closeall(); appentrypoint = (u32) p_entry; if (cheat == 1 && cheatloaded) { __asm__( "lis %r3, appentrypoint@h\n" "ori %r3, %r3, appentrypoint@l\n" "lwz %r3, 0(%r3)\n" "mtlr %r3\n" "lis %r3, 0x8000\n" "ori %r3, %r3, 0x18A8\n" "mtctr %r3\n" "bctr\n" ); } else { __asm__( "lis %r3, appentrypoint@h\n" "ori %r3, %r3, appentrypoint@l\n" "lwz %r3, 0(%r3)\n" "mtlr %r3\n" "blr\n" ); } return 0; }
s32 Disc_BootPartition(u64 offset, u8 vidMode, const u8 *cheat, u32 cheatSize, bool vipatch, bool countryString, u8 patchVidMode) { entry_point p_entry; gprintf("Open partition at offset: 0x%08x\n", offset); s32 ret = WDVD_OpenPartition(offset, 0, 0, 0, Tmd_Buffer); if (ret < 0) { gprintf("Open partition failed: %d\n", ret); return ret; } /* Disconnect Wiimote */ WPAD_Flush(0); WPAD_Disconnect(0); WPAD_Shutdown(); /* Reload IOS into the correct IOS */ u8 ios = Tmd_Buffer[0x18B]; gprintf("Game requires ios %d\n", ios); if (ios != IOS_GetVersion()) { WDVD_ClosePartition(); WDVD_Close(); gprintf("Reloading IOS..."); ret = IOS_ReloadIOS(ios); if (ret < 0) { gprintf("failed: %d\n", ret); } else { gprintf("done\n"); } if (Disc_Init() < 0) { return -4; } if (Disc_Open() < 0) { return -6; } if (WDVD_OpenPartition(offset, 0, 0, 0, Tmd_Buffer) < 0) { return -8; } } gprintf("Setting low memory\n"); /* Setup low memory */; __Disc_SetLowMem(); gprintf("Select video mode\n"); /* Select an appropriate video mode */ __Disc_SelectVMode(vidMode); gprintf("Running apploader\n"); /* Run apploader */ ret = Apploader_Run(&p_entry, cheat != 0, vidMode, vmode, vipatch, countryString, patchVidMode); if (ret < 0) { gprintf("Failed to run apploader\n"); return ret; } gprintf("Set video mode\n"); /* Set an appropriate video mode */ __Disc_SetVMode(); if (cheat != 0 && hooktype != 0) { ocarina_do_code(); } gprintf("Set time\n"); /* Set time */ __Disc_SetTime(); gprintf("Reset video..."); /* This prevent a green screen (or a flash of green before loading the game) */ VIDEO_SetBlack(TRUE); gprintf("flushing..."); VIDEO_Flush(); gprintf("wait for sync..."); VIDEO_WaitVSync(); gprintf("wait for sync..."); VIDEO_WaitVSync(); gprintf("\n"); u8 temp_data[4]; gprintf("Shutting down wii systems\n"); // fix for PeppaPig memcpy((char *) &temp_data, (void*)0x800000F4,4); /* Shutdown IOS subsystems */ SYS_ResetSystem(SYS_SHUTDOWN, 0, 0); // fix for PeppaPig memcpy((void*)0x800000F4,(char *) &temp_data, 4); appentrypoint = (u32) p_entry; gprintf("Current IOS: %d\n", IOS_GetVersion()); gprintf("Starting game\n"); if (cheat != 0) { __asm__( "lis %r3, appentrypoint@h\n" "ori %r3, %r3, appentrypoint@l\n" "lwz %r3, 0(%r3)\n" "mtlr %r3\n" "lis %r3, 0x8000\n" "ori %r3, %r3, 0x18A8\n" "mtctr %r3\n" "bctr\n" ); } else { __asm__( "lis %r3, appentrypoint@h\n" "ori %r3, %r3, appentrypoint@l\n" "lwz %r3, 0(%r3)\n" "mtlr %r3\n" "blr\n" ); } return 0; }