diff --git a/HBC/META.XML b/HBC/META.XML index 3ea60fd1..559aad59 100644 --- a/HBC/META.XML +++ b/HBC/META.XML @@ -2,8 +2,8 @@ USB Loader GX USB Loader GX Team - 1.0 r994 - 201010280947 + 1.0 r995 + 201010311348 Loads games from USB-devices USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times. The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller. diff --git a/Makefile b/Makefile index d7906707..6e979142 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,7 @@ LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00 #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lpngu -lpng -lgd -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec -lmad -lmxml -ljpeg -lunzip +LIBS := -lpngu -lpng -lgd -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec -lmad -lmxml -ljpeg -lzip #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing # include and lib diff --git a/gui.pnproj b/gui.pnproj index 5e0f6eb6..f57902f0 100644 --- a/gui.pnproj +++ b/gui.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/source/GameBootProcess.cpp b/source/GameBootProcess.cpp index 3a135cd1..90108eae 100644 --- a/source/GameBootProcess.cpp +++ b/source/GameBootProcess.cpp @@ -2,6 +2,8 @@ #include "mload/mload.h" #include "mload/mload_modules.h" #include "usbloader/disc.h" +#include "usbloader/apploader.h" +#include "usbloader/wdvd.h" #include "usbloader/GameList.h" #include "settings/Settings.h" #include "settings/CGameSettings.h" @@ -9,17 +11,87 @@ #include "usbloader/wbfs.h" #include "settings/newtitles.h" #include "patches/fst.h" +#include "patches/gamepatches.h" +#include "patches/wip.h" +#include "system/IosLoader.h" #include "wad/nandtitle.h" +#include "menu/menus.h" +#include "memory/memory.h" +#include "fatmounter.h" +#include "FontSystem.h" +#include "sys.h" + +//appentrypoint has to be global because of asm +u32 AppEntrypoint = 0; struct discHdr *dvdheader = NULL; extern int load_from_fs; extern int mountMethod; + +static u32 BootPartition(char * dolpath, u8 videoselected, u8 languageChoice, u8 cheat, u8 vipatch, u8 patchcountrystring, + u8 alternatedol, u32 alternatedoloffset, u32 returnTo, u8 fix002) +{ + gprintf("booting partition IOS %u v%u\n", IOS_GetVersion(), IOS_GetRevision()); + entry_point p_entry; + s32 ret; + u64 offset; + + /* Find game partition offset */ + ret = __Disc_FindPartition(&offset); + if (ret < 0) + return 0; + + /* Open specified partition */ + ret = WDVD_OpenPartition(offset); + if (ret < 0) + return 0; + + load_wip_code((u8*) Disc_ID); + + /* If a wip file is loaded for this game this does nothing - Dimok */ + PoPPatch(); + + /* Setup low memory */ + __Disc_SetLowMem(); + + /* Run apploader */ + ret = Apploader_Run(&p_entry, dolpath, cheat, videoselected, languageChoice, vipatch, patchcountrystring, + alternatedol, alternatedoloffset, returnTo, fix002); + + if (ret < 0) + return 0; + + free_wip(); + + return (u32) p_entry; +} + int BootGame(const char * gameID) { if(!gameID || strlen(gameID) < 3) return -1; + if (mountMethod == 3) + { + ExitApp(); + struct discHdr *header = gameList.GetDiscHeader(gameID); + u32 tid; + memcpy(&tid, header->id, 4); + gprintf("\nBooting title %016llx", TITLE_ID( ( header->id[5] == '1' ? 0x00010001 : 0x00010002 ), tid )); + WII_Initialize(); + return WII_LaunchTitle(TITLE_ID( ( header->id[5] == '1' ? 0x00010001 : 0x00010002 ), tid )); + } + if (mountMethod == 2) + { + ExitApp(); + gprintf("\nLoading BC for GameCube"); + WII_Initialize(); + return WII_LaunchTitle(0x0000000100000100ULL); + } + + AppCleanUp(); + gprintf("\tSettings.partition: %d\n", Settings.partition); gameList.LoadUnfiltered(); @@ -63,6 +135,14 @@ int BootGame(const char * gameID) returnToLoaderGV = game_cfg->returnTo; } + if(iosChoice != IOS_GetVersion()) + { + gprintf("Reloading into cIOS: %i\n", iosChoice); + IosLoader::LoadGameCios(iosChoice); + if(MountGamePartition(false) < 0) + return -1; + } + if (!mountMethod) { gprintf("Loading fragment list..."); @@ -114,16 +194,35 @@ int BootGame(const char * gameID) gprintf("\tDisc_wiiBoot\n"); - shadow_mload(); - - ret = Disc_WiiBoot(Settings.dolpath, videoChoice, languageChoice, ocarinaChoice, viChoice, countrystrings, + /* Boot partition */ + AppEntrypoint = BootPartition(Settings.dolpath, videoChoice, languageChoice, ocarinaChoice, viChoice, countrystrings, alternatedol, alternatedoloffset, channel, fix002); - if (ret < 0) - Sys_LoadMenu(); + if(AppEntrypoint != 0) + { + bool enablecheat = false; - //should never get here - printf("Returning entry point: 0x%0x\n", ret); + if (ocarinaChoice) + { + // OCARINA STUFF - FISHEARS + if (ocarina_load_code((u8 *) Disc_ID) > 0) + { + ocarina_do_code(); + enablecheat = true; + } + } - return ret; + shadow_mload(); + UnmountNTFS(); + SDCard_deInit(); + USBDevice_deInit(); + + gprintf("Jumping to game entrypoint: 0x%08X.\n", AppEntrypoint); + + return Disc_JumpToEntrypoint(videoChoice, enablecheat); + } + + WDVD_ClosePartition(); + + return -1; } diff --git a/source/ZipFile.cpp b/source/ZipFile.cpp index efebc3d0..46764376 100644 --- a/source/ZipFile.cpp +++ b/source/ZipFile.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include "prompts/ProgressWindow.h" #include "FileOperations/fileops.h" diff --git a/source/ZipFile.h b/source/ZipFile.h index 143b0084..237c1290 100644 --- a/source/ZipFile.h +++ b/source/ZipFile.h @@ -28,7 +28,7 @@ #ifndef _ZIPFILE_H_ #define _ZIPFILE_H_ -#include +#include typedef struct { diff --git a/source/gecko.c b/source/gecko.c index 9e56a12e..c7ef25e5 100644 --- a/source/gecko.c +++ b/source/gecko.c @@ -1,6 +1,7 @@ #include #include #include +#include /* init-globals */ bool geckoinit = false; @@ -9,22 +10,24 @@ bool textVideoInit = false; #ifndef NO_DEBUG #include -//using the gprintf from crediar because it is smaller than mine -void gprintf(const char *str, ...) +void gprintf(const char *format, ...) { - if (!(geckoinit)) return; + if (!geckoinit) + return; - char astr[0x100]; + char * tmp = NULL; + va_list va; + va_start(va, format); + if((vasprintf(&tmp, format, va) >= 0) && tmp) + { + u32 level = IRQ_Disable(); + usb_sendbuffer(1, tmp, strlen(tmp)); + IRQ_Restore(level); + } + va_end(va); - va_list ap; - va_start( ap, str ); - - vsprintf(astr, str, ap); - - va_end( ap ); - - usb_sendbuffer(1, astr, strlen(astr)); - //usb_sendbuffer_safe( 1, astr, strlen(astr) ); + if(tmp) + free(tmp); } bool InitGecko() diff --git a/source/homebrewboot/BootHomebrew.cpp b/source/homebrewboot/BootHomebrew.cpp index a10c05b5..240c4340 100644 --- a/source/homebrewboot/BootHomebrew.cpp +++ b/source/homebrewboot/BootHomebrew.cpp @@ -1,141 +1,3 @@ -#if 0 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "usbloader/usbstorage2.h" -#include "dolloader.h" -#include "fatmounter.h" -#include "sys.h" - -extern const u8 app_booter_dol[]; -extern const u32 app_booter_dol_size; - -static u8 *homebrewbuffer = ( u8 * ) 0x92000000; -static int homebrewsize = 0; -static std::vector Arguments; - -void AddBootArgument( const char * argv ) -{ - std::string arg( argv ); - Arguments.push_back( arg ); -} - -int CopyHomebrewMemory( u8 *temp, u32 pos, u32 len ) -{ - homebrewsize += len; - memcpy( ( homebrewbuffer ) + pos, temp, len ); - - return 1; -} - -void FreeHomebrewBuffer() -{ - homebrewbuffer = ( u8 * )0x92000000; - homebrewsize = 0; -} - -static int SetupARGV( struct __argv * args ) -{ - if ( !args ) - return -1; - - bzero( args, sizeof( struct __argv ) ); - args->argvMagic = ARGV_MAGIC; - - u32 stringlength = 1; - - /** Append Arguments **/ - for ( u32 i = 0; i < Arguments.size(); i++ ) - { - stringlength += Arguments[i].size() + 1; - } - - args->length = stringlength; - args->commandLine = ( char* ) malloc( args->length ); - if ( !args->commandLine ) - return -1; - - u32 argc = 0; - u32 position = 0; - - /** Append Arguments **/ - for ( u32 i = 0; i < Arguments.size(); i++ ) - { - strcpy( &args->commandLine[position], Arguments[i].c_str() ); - position += Arguments[i].size() + 1; - argc++; - } - - args->argc = argc; - - args->commandLine[args->length - 1] = '\0'; - args->argv = &args->commandLine; - args->endARGV = args->argv + 1; - - Arguments.clear(); - - return 0; -} - -int BootHomebrew() -{ - if ( homebrewsize <= 0 ) - Sys_BackToLoader(); - - SDCard_deInit(); - USBDevice_deInit(); - USBStorage2_Deinit(); - - struct __argv args; - SetupARGV( &args ); - - u32 cpu_isr; - - entrypoint entry = ( entrypoint ) load_dol( app_booter_dol, &args ); - - if ( !entry ) - Sys_BackToLoader(); - - VIDEO_SetBlack( true ); - VIDEO_Flush(); - VIDEO_WaitVSync(); - - SYS_ResetSystem( SYS_SHUTDOWN, 0, 0 ); - _CPU_ISR_Disable ( cpu_isr ); - __exception_closeall(); - entry(); - _CPU_ISR_Restore ( cpu_isr ); - - return 0; -} - -int BootHomebrew( const char * filepath ) -{ - FILE * file = fopen( filepath, "rb" ); - if ( !file ) - Sys_BackToLoader(); - - fseek( file, 0, SEEK_END ); - - int size = ftell( file ); - rewind( file ); - - homebrewsize = fread( homebrewbuffer, 1, size, file ); - fclose( file ); - - AddBootArgument( filepath ); - - return BootHomebrew(); -} -#endif - #include #include #include @@ -153,23 +15,12 @@ int BootHomebrew( const char * filepath ) #include "fatmounter.h" #include "dolloader.h" -void *innetbuffer = NULL; static u8 *homebrewbuffer = (u8 *) 0x92000000; -u32 homebrewsize = 0; +static u32 homebrewsize = 0; static std::vector Arguments; extern const u8 app_booter_dol[]; - -int AllocHomebrewMemory(u32 filesize) -{ - - innetbuffer = malloc(filesize); - - if (!innetbuffer) return -1; - - homebrewsize = filesize; - return 1; -} +extern const u32 app_booter_dol_size; void AddBootArgument(const char * argv) { @@ -190,12 +41,6 @@ void FreeHomebrewBuffer() homebrewbuffer = (u8 *) 0x92000000; homebrewsize = 0; - if (innetbuffer) - { - free(innetbuffer); - innetbuffer = NULL; - } - Arguments.clear(); } @@ -245,6 +90,8 @@ static int RunAppbooter() { if (homebrewsize == 0) return -1; + ExitApp(); + struct __argv args; SetupARGV(&args); @@ -271,13 +118,6 @@ static int RunAppbooter() } } - SDCard_deInit(); - USBDevice_deInit(); - - WPAD_Flush(0); - WPAD_Disconnect(0); - WPAD_Shutdown(); - SYS_ResetSystem(SYS_SHUTDOWN, 0, 0); _CPU_ISR_Disable( cpu_isr ); __exception_closeall(); @@ -287,7 +127,7 @@ static int RunAppbooter() return 0; } -int BootHomebrew(char * filepath) +int BootHomebrew(const char * filepath) { void *buffer = NULL; u32 filesize = 0; @@ -327,18 +167,5 @@ int BootHomebrew(char * filepath) int BootHomebrewFromMem() { - gprintf("BootHomebrewFromMem()\n %p, %08x\n", innetbuffer, homebrewsize); - - if (!innetbuffer) - { - gprintf("!innetbuffer\n"); - SDCard_deInit(); - USBDevice_deInit(); - Sys_BackToLoader(); - } - - CopyHomebrewMemory((u8*) innetbuffer, 0, homebrewsize); - free(innetbuffer); - return RunAppbooter(); } diff --git a/source/homebrewboot/BootHomebrew.h b/source/homebrewboot/BootHomebrew.h index 7de0b58b..f68c67f7 100644 --- a/source/homebrewboot/BootHomebrew.h +++ b/source/homebrewboot/BootHomebrew.h @@ -1,15 +1,10 @@ #ifndef _BOOTHOMEBREW_H_ #define _BOOTHOMEBREW_H_ -//int BootHomebrew(); +int BootHomebrew(const char * filepath); int BootHomebrewFromMem(); -int BootHomebrew(char * filepath); int CopyHomebrewMemory(u8 *temp, u32 pos, u32 len); void AddBootArgument(const char * arg); void FreeHomebrewBuffer(); -int LoadHomebrew(const char * filepath); -int AllocHomebrewMemory(u32 filesize); -extern void *innetbuffer; -extern u32 homebrewsize; #endif diff --git a/source/homebrewboot/HomebrewBrowse.cpp b/source/homebrewboot/HomebrewBrowse.cpp index 6f1db56d..f380055a 100644 --- a/source/homebrewboot/HomebrewBrowse.cpp +++ b/source/homebrewboot/HomebrewBrowse.cpp @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include "language/gettext.h" #include "libwiigui/gui.h" @@ -34,16 +34,12 @@ extern void ResumeGui(); extern void HaltGui(); /*** Extern variables ***/ -extern GuiImage * bgImg; extern u32 infilesize; extern u32 uncfilesize; extern char wiiloadVersion[2]; extern u8 shutdown; extern u8 reset; -/*** Variables used elsewhere ***/ -u8 boothomebrew = 0; - /**************************************************************************** * roundup Function ***************************************************************************/ @@ -54,6 +50,137 @@ int roundup(float number) else return (int) (number + 1); } +static int ReceiveFile() +{ + char filesizetxt[50]; + char temp[50]; + u32 filesize = 0; + + if (infilesize < MB_SIZE) + snprintf(filesizetxt, sizeof(filesizetxt), tr( "Incoming file %0.2fKB" ), infilesize / KB_SIZE); + else snprintf(filesizetxt, sizeof(filesizetxt), tr( "Incoming file %0.2fMB" ), infilesize / MB_SIZE); + + snprintf(temp, sizeof(temp), tr( "Load file from: %s ?" ), GetIncommingIP()); + + int choice = WindowPrompt(filesizetxt, temp, tr( "OK" ), tr( "Cancel" )); + + if (choice == 0) + return MENU_NONE; + + u32 read = 0; + int len = NETWORKBLOCKSIZE; + filesize = infilesize; + u8 * buffer = (u8 *) malloc(infilesize); + if(!buffer) + { + WindowPrompt(tr( "Not enough memory." ), 0, tr( "OK" )); + return MENU_NONE; + } + + bool error = false; + while (read < infilesize) + { + ShowProgress(tr( "Receiving file from:" ), GetIncommingIP(), NULL, read, infilesize, true); + + if (infilesize - read < (u32) len) + len = infilesize - read; + else len = NETWORKBLOCKSIZE; + + int result = network_read(buffer+read, len); + + if (result < 0) + { + WindowPrompt(tr( "Error while transfering data." ), 0, tr( "OK" )); + free(buffer); + return MENU_NONE; + } + if (!result) + { + break; + } + + read += result; + } + + char filename[101]; + network_read((u8*) &filename, 100); + + // Do we need to unzip this thing? + if (wiiloadVersion[0] > 0 || wiiloadVersion[1] > 4) + { + // We need to unzip... + if (buffer[0] == 'P' && buffer[1] == 'K' && buffer[2] == 0x03 && buffer[3] == 0x04) + { + // It's a zip file, unzip to the apps directory + // Zip archive, ask for permission to install the zip + char zippath[255]; + sprintf((char *) &zippath, "%s%s", Settings.homebrewapps_path, filename); + + FILE *fp = fopen(zippath, "wb"); + if (!fp) + { + WindowPrompt(tr( "Error writing the data." ), 0, tr( "OK" )); + return MENU_NONE; + } + + fwrite(buffer, 1, infilesize, fp); + fclose(fp); + + free(buffer); + buffer = NULL; + + // Now unzip the zip file... + unzFile uf = unzOpen(zippath); + if (uf == NULL) + { + WindowPrompt(tr( "Error while opening the zip." ), 0, tr( "OK" )); + return MENU_NONE; + } + + extractZip(uf, 0, 1, 0, Settings.homebrewapps_path); + unzCloseCurrentFile(uf); + + remove(zippath); + + WindowPrompt(tr( "Success:" ), + tr( "Uploaded ZIP file installed to homebrew directory." ), tr( "OK" )); + + // Reload this menu here... + return MENU_HOMEBREWBROWSE; + } + else if (uncfilesize != 0) // if uncfilesize == 0, it's not compressed + { + // It's compressed, uncompress + u8 *unc = (u8 *) malloc(uncfilesize); + uLongf f = uncfilesize; + error = uncompress(unc, &f, buffer, infilesize) != Z_OK; + uncfilesize = f; + filesize = uncfilesize; + + free(buffer); + buffer = unc; + } + } + + CopyHomebrewMemory(buffer, 0, filesize); + free(buffer); + + ProgressStop(); + + if (error || read != infilesize || strcasestr(filename, ".dol") || strcasestr(filename, ".elf")) + { + WindowPrompt(tr( "Error:" ), tr( "No data could be read." ), tr( "OK" )); + FreeHomebrewBuffer(); + return MENU_NONE; + } + + CloseConnection(); + + AddBootArgument(filename); + + return BootHomebrewFromMem(); +} + /**************************************************************************** * MenuHomebrewBrowse ***************************************************************************/ @@ -695,10 +822,9 @@ int MenuHomebrewBrowse() XMLInfo[0].GetReleasedate(), XMLInfo[0].GetLongDescription(), iconpath, filesize); if (choice == 1) { - boothomebrew = 1; - menu = MENU_EXIT; snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s", HomebrewFiles.GetFilepath(fileoffset), HomebrewFiles.GetFilename(fileoffset)); + BootHomebrew(Settings.selected_homebrew); break; } MainButton1.ResetState(); @@ -728,10 +854,9 @@ int MenuHomebrewBrowse() XMLInfo[1].GetReleasedate(), XMLInfo[1].GetLongDescription(), iconpath, filesize); if (choice == 1) { - boothomebrew = 1; - menu = MENU_EXIT; snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s", HomebrewFiles.GetFilepath(fileoffset + 1), HomebrewFiles.GetFilename(fileoffset + 1)); + BootHomebrew(Settings.selected_homebrew); break; } MainButton2.ResetState(); @@ -761,10 +886,9 @@ int MenuHomebrewBrowse() XMLInfo[2].GetReleasedate(), XMLInfo[2].GetLongDescription(), iconpath, filesize); if (choice == 1) { - boothomebrew = 1; - menu = MENU_EXIT; snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s", HomebrewFiles.GetFilepath(fileoffset + 2), HomebrewFiles.GetFilename(fileoffset + 2)); + BootHomebrew(Settings.selected_homebrew); break; } MainButton3.ResetState(); @@ -794,10 +918,9 @@ int MenuHomebrewBrowse() XMLInfo[3].GetReleasedate(), XMLInfo[3].GetLongDescription(), iconpath, filesize); if (choice == 1) { - boothomebrew = 1; - menu = MENU_EXIT; snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s", HomebrewFiles.GetFilepath(fileoffset + 3), HomebrewFiles.GetFilename(fileoffset + 3)); + BootHomebrew(Settings.selected_homebrew); break; } MainButton4.ResetState(); @@ -864,166 +987,9 @@ int MenuHomebrewBrowse() else if (infilesize > 0) { - char filesizetxt[50]; - char temp[50]; - - if (infilesize < MB_SIZE) - snprintf(filesizetxt, sizeof(filesizetxt), tr( "Incoming file %0.2fKB" ), infilesize / KB_SIZE); - else snprintf(filesizetxt, sizeof(filesizetxt), tr( "Incoming file %0.2fMB" ), infilesize / MB_SIZE); - - snprintf(temp, sizeof(temp), tr( "Load file from: %s ?" ), GetIncommingIP()); - - int choice = WindowPrompt(filesizetxt, temp, tr( "OK" ), tr( "Cancel" )); - - if (choice == 1) - { - - int res = AllocHomebrewMemory(infilesize); - - if (res < 0) - { - CloseConnection(); - WindowPrompt(tr( "Not enough free memory." ), 0, tr( "OK" )); - } - else - { - u32 read = 0; - u8 *temp = NULL; - int len = NETWORKBLOCKSIZE; - temp = (u8 *) malloc(infilesize); - - bool error = false; - u8 *ptr = temp; - while (read < infilesize) - { - - ShowProgress(tr( "Receiving file from:" ), GetIncommingIP(), NULL, read, infilesize, true); - - if (infilesize - read < (u32) len) - len = infilesize - read; - else len = NETWORKBLOCKSIZE; - - int result = network_read(ptr, len); - - if (result < 0) - { - WindowPrompt(tr( "Error while transfering data." ), 0, tr( "OK" )); - error = true; - break; - } - if (!result) - { - break; - } - - ptr += result; - - read += result; - } - - char filename[101]; - if (!error) - { - - network_read((u8*) &filename, 100); - - // Do we need to unzip this thing? - if (wiiloadVersion[0] > 0 || wiiloadVersion[1] > 4) - { - - // We need to unzip... - if (temp[0] == 'P' && temp[1] == 'K' && temp[2] == 0x03 && temp[3] == 0x04) - { - // It's a zip file, unzip to the apps directory - - // Zip archive, ask for permission to install the zip - char zippath[255]; - sprintf((char *) &zippath, "%s%s", Settings.homebrewapps_path, filename); - - FILE *fp = fopen(zippath, "wb"); - if (fp != NULL) - { - fwrite(temp, 1, infilesize, fp); - fclose(fp); - - // Now unzip the zip file... - unzFile uf = unzOpen(zippath); - if (uf == NULL) - { - error = true; - } - else - { - extractZip(uf, 0, 1, 0, Settings.homebrewapps_path); - unzCloseCurrentFile(uf); - - remove(zippath); - - // Reload this menu here... - menu = MENU_HOMEBREWBROWSE; - break; - } - } - else - { - error = true; - } - } - else if (uncfilesize != 0) // if uncfilesize == 0, it's not compressed - { - // It's compressed, uncompress - u8 *unc = (u8 *) malloc(uncfilesize); - uLongf f = uncfilesize; - error = uncompress(unc, &f, temp, infilesize) != Z_OK; - uncfilesize = f; - homebrewsize = uncfilesize; - - free(temp); - temp = unc; - } - } - - if (!error && strstr(filename, ".zip") == NULL) - { - innetbuffer = temp; - - } - } - - ProgressStop(); - - if (error || read != infilesize) - { - WindowPrompt(tr( "Error:" ), tr( "No data could be read." ), tr( "OK" )); - FreeHomebrewBuffer(); - } - else - { - if (strstr(filename, ".dol") || strstr(filename, ".DOL") || strstr(filename, ".elf") - || strstr(filename, ".ELF")) - { - boothomebrew = 2; - AddBootArgument(filename); - menu = MENU_EXIT; - CloseConnection(); - break; - } - else if (strstr(filename, ".zip")) - { - WindowPrompt(tr( "Success:" ), - tr( "Uploaded ZIP file installed to homebrew directory." ), tr( "OK" )); - CloseConnection(); - } - else - { - FreeHomebrewBuffer(); - WindowPrompt(tr( "ERROR:" ), tr( "Not a DOL/ELF file." ), tr( "OK" )); - } - } - } - } - CloseConnection(); - ResumeNetworkWait(); + menu = ReceiveFile(); + CloseConnection(); + ResumeNetworkWait(); } else if (channelBtn.GetState() == STATE_CLICKED) diff --git a/source/main.cpp b/source/main.cpp index 29a570a4..a41f852a 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -116,8 +116,6 @@ int main(int argc, char *argv[]) SetupDefaultFont(fontPath); free(fontPath); - //gprintf("\tEnd of Main()\n"); - InitGUIThreads(); MainMenu(MENU_DISCLIST); return 0; } diff --git a/source/memory.h b/source/memory/memory.h similarity index 96% rename from source/memory.h rename to source/memory/memory.h index 84250b91..f86f16cf 100644 --- a/source/memory.h +++ b/source/memory/memory.h @@ -1,36 +1,36 @@ -#ifndef __MEMORY_H_ -#define __MEMORY_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define Disc_ID ((u32*) 0x80000000) -#define Disc_Region ((u32*) 0x80000003) -#define Disc_Magic ((u32*) 0x80000018) -#define Sys_Magic ((u32*) 0x80000020) -#define Version ((u32*) 0x80000024) -#define Mem_Size ((u32*) 0x80000028) -#define Board_Model ((u32*) 0x8000002C) -#define Arena_L ((u32*) 0x80000030) -#define Arena_H ((u32*) 0x80000034) -#define FST ((u32*) 0x80000038) -#define Max_FST ((u32*) 0x8000003C) -#define Assembler ((u32*) 0x80000060) -#define Video_Mode ((u32*) 0x800000CC) -#define Dev_Debugger ((u32*) 0x800000EC) -#define Simulated_Mem ((u32*) 0x800000F0) -#define BI2 ((u32*) 0x800000F4) -#define Bus_Speed ((u32*) 0x800000F8) -#define CPU_Speed ((u32*) 0x800000FC) -#define Online_Check ((u32*) 0x80003180) -#define GameID_Address ((u32*) 0x80003184) - -#define allocate_memory(size) memalign(32, (size+31)&(~31)) - -#ifdef __cplusplus -} -#endif - -#endif +#ifndef __MEMORY_H_ +#define __MEMORY_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define Disc_ID ((u32*) 0x80000000) +#define Disc_Region ((u32*) 0x80000003) +#define Disc_Magic ((u32*) 0x80000018) +#define Sys_Magic ((u32*) 0x80000020) +#define Version ((u32*) 0x80000024) +#define Mem_Size ((u32*) 0x80000028) +#define Board_Model ((u32*) 0x8000002C) +#define Arena_L ((u32*) 0x80000030) +#define Arena_H ((u32*) 0x80000034) +#define FST ((u32*) 0x80000038) +#define Max_FST ((u32*) 0x8000003C) +#define Assembler ((u32*) 0x80000060) +#define Video_Mode ((u32*) 0x800000CC) +#define Dev_Debugger ((u32*) 0x800000EC) +#define Simulated_Mem ((u32*) 0x800000F0) +#define BI2 ((u32*) 0x800000F4) +#define Bus_Speed ((u32*) 0x800000F8) +#define CPU_Speed ((u32*) 0x800000FC) +#define Online_Check ((u32*) 0x80003180) +#define GameID_Address ((u32*) 0x80003184) + +#define allocate_memory(size) memalign(32, (size+31)&(~31)) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/source/menu.cpp b/source/menu.cpp index ae829a41..2633d655 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -36,7 +36,6 @@ #include "usbloader/frag.h" #include "usbloader/wbfs.h" #include "wad/nandtitle.h" -#include "GameBootProcess.h" /*** Variables that are also used extern ***/ GuiWindow * mainWindow = NULL; @@ -61,13 +60,12 @@ bool altdoldefault = true; static lwp_t guithread = LWP_THREAD_NULL; static bool guiHalt = true; -static int ExitRequested = 0; +static bool ExitRequested = false; /*** Extern variables ***/ extern u8 shutdown; extern u8 reset; extern s32 gameSelected, gameStart; -extern u8 boothomebrew; /**************************************************************************** * ResumeGui @@ -168,6 +166,7 @@ static void * UpdateGUI(void *arg) Menu_DrawRectangle(0, 0, screenwidth, screenheight, (GXColor) {0, 0, 0, i}, 1); Menu_Render(); } + mainWindow->RemoveAll(); ShutoffRumble(); @@ -181,18 +180,22 @@ static void * UpdateGUI(void *arg) ***************************************************************************/ void InitGUIThreads() { - LWP_CreateThread(&guithread, UpdateGUI, NULL, NULL, 65536, LWP_PRIO_HIGHEST); - InitProgressThread(); - InitNetworkThread(); + ExitRequested = false; - if (Settings.autonetwork) ResumeNetworkThread(); + if(guithread == LWP_THREAD_NULL) + LWP_CreateThread(&guithread, UpdateGUI, NULL, NULL, 65536, LWP_PRIO_HIGHEST); } void ExitGUIThreads() { - ExitRequested = 1; - LWP_JoinThread(guithread, NULL); - guithread = LWP_THREAD_NULL; + ExitRequested = true; + + if(guithread != LWP_THREAD_NULL) + { + ResumeGui(); + LWP_JoinThread(guithread, NULL); + guithread = LWP_THREAD_NULL; + } } /**************************************************************************** @@ -254,6 +257,14 @@ int MainMenu(int menu) { currentMenu = menu; + InitGUIThreads(); + + InitProgressThread(); + InitNetworkThread(); + + if (Settings.autonetwork) + ResumeNetworkThread(); + pointer[0] = Resources::GetImageData("player1_point.png"); pointer[1] = Resources::GetImageData("player2_point.png"); pointer[2] = Resources::GetImageData("player3_point.png"); @@ -301,61 +312,8 @@ int MainMenu(int menu) } } - // MemInfoPrompt(); - gprintf("Exiting main GUI. mountMethod = %d\n", mountMethod); + //! THIS SHOULD NEVER HAPPEN ANYMORE + ExitApp(); - CloseXMLDatabase(); - NewTitles::DestroyInstance(); - - ResumeGui(); - ExitGUIThreads(); - - bgMusic->Stop(); - delete bgMusic; - delete background; - delete bgImg; - delete mainWindow; - for (int i = 0; i < 4; i++) - delete pointer[i]; - delete GameRegionTxt; - delete GameIDTxt; - delete cover; - delete coverImg; - delete fontSystem; - ShutdownAudio(); - StopGX(); - gettextCleanUp(); - - if (mountMethod == 3) - { - struct discHdr *header = gameList[gameSelected]; - char tmp[20]; - u32 tid; - sprintf(tmp, "%c%c%c%c", header->id[0], header->id[1], header->id[2], header->id[3]); - memcpy(&tid, tmp, 4); - gprintf("\nBooting title %016llx", TITLE_ID( ( header->id[5] == '1' ? 0x00010001 : 0x00010002 ), tid )); - WII_Initialize(); - WII_LaunchTitle(TITLE_ID( ( header->id[5] == '1' ? 0x00010001 : 0x00010002 ), tid )); - } - if (mountMethod == 2) - { - gprintf("\nLoading BC for GameCube"); - WII_Initialize(); - WII_LaunchTitle(0x0000000100000100ULL); - } - - if (boothomebrew == 1) - { - gprintf("\nBootHomebrew"); - BootHomebrew(Settings.selected_homebrew); - return 0; - } - else if (boothomebrew == 2) - { - gprintf("\nBootHomebrew from Menu"); - BootHomebrewFromMem(); - return 0; - } - - return BootGame((const char *) gameList[gameSelected]->id); + return -1; } diff --git a/source/menu.h b/source/menu.h index e8f594ac..28948bed 100644 --- a/source/menu.h +++ b/source/menu.h @@ -10,6 +10,8 @@ #define _MENU_H_ #include +#include "libwiigui/gui.h" +#include "libwiigui/gui_bgm.h" #include "settings/CSettings.h" #include "main.h" @@ -30,8 +32,21 @@ enum BOOTHOMEBREW, MENU_THEMEDOWNLOADER }; -class GuiImageData; + +void ResumeGui(); +void HaltGui(); GuiImageData *LoadCoverImage(struct discHdr *header, bool Prefere3D = true, bool noCover = true); -class GuiSound; + extern GuiSound *btnClick2; +extern GuiBGM *bgMusic; +extern GuiImageData *pointer[4]; +extern GuiImageData *background; +extern GuiImage *bgImg; +extern GuiWindow *mainWindow; +extern GuiText *GameRegionTxt; +extern GuiText *GameIDTxt; +extern GuiImageData *cover; +extern GuiImage *coverImg; +extern FreeTypeGX *fontSystem; + #endif diff --git a/source/menu/menu_disclist.cpp b/source/menu/menu_disclist.cpp index 5b4e855a..861cf104 100644 --- a/source/menu/menu_disclist.cpp +++ b/source/menu/menu_disclist.cpp @@ -13,6 +13,7 @@ #include "settings/CGameStatistics.h" #include "settings/GameTitles.h" #include "themes/CTheme.h" +#include "GameBootProcess.h" #include "wpad.h" #include "sys.h" @@ -1472,9 +1473,8 @@ int MenuDiscList() header->id[3], header->id[4], header->id[5], GameStatistics.GetPlayCount(header->id)); } - menu = MENU_EXIT; - break; - + //Just calling that shuts down everything and starts game + BootGame((const char *) header->id); } bool returnHere = true;// prompt to start game while (returnHere) @@ -1494,7 +1494,7 @@ int MenuDiscList() if (exeFile == NULL) { gprintf("\n\tTried to load alt dol that isn't there"); - sprintf(nipple, "%s %s", nipple, tr( "does not exist! You Messed something up, Idiot." )); + sprintf(nipple, "%s %s", nipple, tr( "does not exist! You messed something up." )); WindowPrompt(tr( "Error" ), nipple, tr( "OK" )); menu = MENU_DISCLIST; wiilight(0); @@ -1524,8 +1524,8 @@ int MenuDiscList() } wiilight(0); returnHere = false; - menu = MENU_EXIT; - + //Just calling that shuts down everything and starts game + BootGame((const char *) gameList[gameSelected]->id); } else if (choice == 2) { diff --git a/source/menu/menus.h b/source/menu/menus.h index d2b0e928..4ea83c37 100644 --- a/source/menu/menus.h +++ b/source/menu/menus.h @@ -10,10 +10,6 @@ #include "filelist.h" #include "sys.h" -extern void ResumeGui(); -extern void HaltGui(); -extern GuiWindow * mainWindow; -extern GuiBGM * bgMusic; extern u8 shutdown; extern u8 reset; diff --git a/source/patches/gamepatches.h b/source/patches/gamepatches.h index 696c0051..cc8efb20 100644 --- a/source/patches/gamepatches.h +++ b/source/patches/gamepatches.h @@ -1,6 +1,10 @@ #ifndef GAMEPATCHES_H_ #define GAMEPATCHES_H_ +#ifdef __cplusplus +extern "C" { +#endif + #include bool Anti_002_fix(u8 * Address, int Size); @@ -10,4 +14,8 @@ bool Search_and_patch_Video_Modes(u8 * Address, u32 Size, GXRModeObj* Table[]); void VideoModePatcher(u8 * dst, int len, u8 videoSelected); bool PatchReturnTo(void *Address, int Size, u32 id); +#ifdef __cplusplus +} +#endif + #endif diff --git a/source/prompts/DiscBrowser.cpp b/source/prompts/DiscBrowser.cpp index d94d44bd..ba3fbfe0 100644 --- a/source/prompts/DiscBrowser.cpp +++ b/source/prompts/DiscBrowser.cpp @@ -20,7 +20,7 @@ #include "sys.h" #include "settings/GameTitles.h" #include "themes/CTheme.h" -#include "memory.h" +#include "memory/memory.h" #include "../gecko.h" #include "../patches/dvd_broadway.h" @@ -32,7 +32,6 @@ extern void HaltGui(); extern GuiWindow * mainWindow; extern u8 shutdown; extern u8 reset; -extern u8 mountMethod; /******************************************************************************** *Disk Browser diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp index f90ba598..f8d5c06c 100644 --- a/source/prompts/PromptWindows.cpp +++ b/source/prompts/PromptWindows.cpp @@ -51,8 +51,6 @@ int cntMissFiles = 0; static char missingFiles[500][12]; /*** Extern variables ***/ -extern GuiWindow * mainWindow; -extern GuiSound * bgMusic; s32 gameSelected = 0, gameStart = 0; extern float gamesize; extern u8 shutdown; @@ -61,10 +59,6 @@ extern u8 mountMethod; extern struct discHdr *dvdheader; extern char game_partition[6]; -/*** Extern functions ***/ -extern void ResumeGui(); -extern void HaltGui(); - /**************************************************************************** * OnScreenNumpad * diff --git a/source/settings/CSettings.cpp b/source/settings/CSettings.cpp index 0b48c5e0..5f846225 100644 --- a/source/settings/CSettings.cpp +++ b/source/settings/CSettings.cpp @@ -585,14 +585,18 @@ bool CSettings::FindConfig() if (i == 1) strcpy(BootDevice, "USB:"); if (!found) { - snprintf(ConfigPath, sizeof(ConfigPath), "%s/config/GXGlobal.cfg", BootDevice); + snprintf(ConfigPath, sizeof(ConfigPath), "%s/apps/usbloader_gx/", BootDevice); + CreateSubfolder(ConfigPath); + strcat(ConfigPath, "GXGlobal.cfg"); testFp = fopen(ConfigPath, "wb"); found = (testFp != NULL); fclose(testFp); } if (!found) { - snprintf(ConfigPath, sizeof(ConfigPath), "%s/apps/usbloader_gx/GXGlobal.cfg", BootDevice); + snprintf(ConfigPath, sizeof(ConfigPath), "%s/config/", BootDevice); + CreateSubfolder(ConfigPath); + strcat(ConfigPath, "GXGlobal.cfg"); testFp = fopen(ConfigPath, "wb"); found = (testFp != NULL); fclose(testFp); diff --git a/source/sys.cpp b/source/sys.cpp index e6490971..f4ccc5a0 100644 --- a/source/sys.cpp +++ b/source/sys.cpp @@ -4,12 +4,17 @@ #include "mload/mload.h" #include "settings/CSettings.h" +#include "settings/newtitles.h" +#include "language/gettext.h" #include "utils/ResourceManager.h" +#include "FontSystem.h" #include "audio.h" #include "fatmounter.h" #include "lstub.h" #include "menu.h" #include "video.h" +#include "gecko.h" +#include "xml/xml.h" extern char game_partition[6]; extern u8 load_from_fs; @@ -49,25 +54,50 @@ void Sys_Init(void) SYS_SetPowerCallback(__Sys_PowerCallback); } -static void _ExitApp() +void AppCleanUp(void) { + extern u8 mountMethod; + gprintf("Exiting main GUI. mountMethod = %d\n", mountMethod); + ExitGUIThreads(); + + delete bgMusic; + delete background; + delete bgImg; + delete mainWindow; + for (int i = 0; i < 4; i++) + delete pointer[i]; + delete GameRegionTxt; + delete GameIDTxt; + delete cover; + delete coverImg; + gettextCleanUp(); + CloseXMLDatabase(); + ClearFontData(); + NewTitles::DestroyInstance(); + StopGX(); ShutdownAudio(); ResourceManager::DestroyInstance(); + WPAD_Flush(0); + WPAD_Disconnect(0); + WPAD_Shutdown(); +} + +void ExitApp(void) +{ + AppCleanUp(); UnmountNTFS(); SDCard_deInit(); USBDevice_deInit(); - mload_set_ES_ioctlv_vector(NULL); - mload_close(); } void Sys_Reboot(void) { /* Restart console */ - _ExitApp(); + ExitApp(); STM_RebootSystem(); } @@ -77,10 +107,7 @@ void Sys_Reboot(void) static void _Sys_Shutdown(int SHUTDOWN_MODE) { - _ExitApp(); - WPAD_Flush(0); - WPAD_Disconnect(0); - WPAD_Shutdown(); + ExitApp(); /* Poweroff console */ if ((CONF_GetShutdownMode() == CONF_SHUTDOWN_IDLE && SHUTDOWN_MODE != ShutdownToStandby) || SHUTDOWN_MODE @@ -118,7 +145,7 @@ void Sys_ShutdownToStandby(void) void Sys_LoadMenu(void) { - _ExitApp(); + ExitApp(); /* Return to the Wii system menu */ SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); } @@ -128,7 +155,7 @@ void Sys_BackToLoader(void) if (hbcStubAvailable()) { - _ExitApp(); + ExitApp(); exit(0); } // Channel Version diff --git a/source/sys.h b/source/sys.h index 3afb6a9e..54cf531b 100644 --- a/source/sys.h +++ b/source/sys.h @@ -4,6 +4,8 @@ void wiilight(int enable); /* Prototypes */ +void AppCleanUp(void); //! Deletes all allocated space for everything +void ExitApp(void); //! Like AppCleanUp() and additional device unmount void Sys_Init(void); void Sys_Reboot(void); void Sys_Shutdown(void); diff --git a/source/system/IosLoader.cpp b/source/system/IosLoader.cpp index 0e65f552..cdf4dee0 100644 --- a/source/system/IosLoader.cpp +++ b/source/system/IosLoader.cpp @@ -4,6 +4,7 @@ #include "../fatmounter.h" #include "../usbloader/usbstorage2.h" #include "../usbloader/disc.h" +#include "../usbloader/wdvd.h" #include "../wad/nandtitle.h" #include "../mload/mload_modules.h" #include "../settings/CSettings.h" @@ -66,6 +67,35 @@ s32 IosLoader::LoadAppCios() return ret; } + +/* + * Loads a CIOS before a game start. + * @return 0 if a cios has been successfully loaded. Else a value below 0 is returned. + */ +s32 IosLoader::LoadGameCios(s32 ios) +{ + if(ios == IOS_GetVersion()) + return 0; + + s32 ret = -1; + + // Unmount fat before reloading IOS. + SDCard_deInit(); + USBDevice_deInit(); + WDVD_Close(); + __io_usbstorage.shutdown(); // libogc usb + __io_usbstorage2.shutdown(); // cios usb + USB_Deinitialize(); // main usb handle + + ret = ReloadIosSafe(ios); + + // Remount devices after reloading IOS. + SDCard_Init(); + USBDevice_Init(); + + return ret; +} + /* * Reloads a certain IOS under the condition, that an appropriate version of the IOS is installed. * @return a negative value if a safe reload of the ios was not possible. diff --git a/source/system/IosLoader.h b/source/system/IosLoader.h index 63246a2c..036aabfa 100644 --- a/source/system/IosLoader.h +++ b/source/system/IosLoader.h @@ -7,6 +7,7 @@ class IosLoader { public: static s32 LoadAppCios(); + static s32 LoadGameCios(s32 ios); static s32 ReloadIosSafe(s32 ios); private: static void LoadIOSModules(s32 ios, s32 ios_rev); diff --git a/source/themes/Theme_Downloader.cpp b/source/themes/Theme_Downloader.cpp index 1779650b..27429d0a 100644 --- a/source/themes/Theme_Downloader.cpp +++ b/source/themes/Theme_Downloader.cpp @@ -25,14 +25,7 @@ #include "ZipFile.h" #include "gecko.h" -/*** Extern functions ***/ -extern void ResumeGui(); -extern void HaltGui(); - /*** Extern variables ***/ -extern GuiWindow * mainWindow; -extern GuiSound * bgMusic; -extern GuiImage * bgImg; extern u8 shutdown; extern u8 reset; diff --git a/source/usbloader/GameList.cpp b/source/usbloader/GameList.cpp index 3c25585b..a57b71b3 100644 --- a/source/usbloader/GameList.cpp +++ b/source/usbloader/GameList.cpp @@ -33,7 +33,7 @@ #include "xml/xml.h" #include "FreeTypeGX.h" #include "GameList.h" -#include "memory.h" +#include "memory/memory.h" GameList gameList; diff --git a/source/usbloader/apploader.c b/source/usbloader/apploader.c index 24e2315c..bec60858 100644 --- a/source/usbloader/apploader.c +++ b/source/usbloader/apploader.c @@ -37,23 +37,24 @@ void gamepatches( u8 * dst, int len, u8 videoSelected, u8 languageChoice, u8 pat VideoModePatcher( dst, len, videoSelected ); if ( cheat ) - dogamehooks( dst, len ); + dogamehooks( dst, len ); if ( vipatch ) - vidolpatcher( dst, len ); + vidolpatcher( dst, len ); /*LANGUAGE PATCH - FISHEARS*/ langpatcher( dst, len, languageChoice ); /*Thanks to WiiPower*/ - if ( patchcountrystring == 1 ) PatchCountryStrings( dst, len ); + if ( patchcountrystring == 1 ) + PatchCountryStrings( dst, len ); NSMBPatch( dst, len ); do_wip_code( ( u8 * ) dst, len ); if ( fix002 == 2 ) - Anti_002_fix( dst, len ); + Anti_002_fix( dst, len ); PatchReturnTo( dst, len, returnTo ); } @@ -108,10 +109,10 @@ s32 Apploader_Run(entry_point *entry, char * dolpath, u8 cheat, u8 videoSelected /* Read data from DVD */ WDVD_Read(dst, len, (u64) (offset << 2)); - if( !alternatedol ) - gamepatches(dst, len, videoSelected, languageChoice, patchcountrystring, vipatch, cheat, returnTo, fix002 ); + if( !alternatedol ) + gamepatches(dst, len, videoSelected, languageChoice, patchcountrystring, vipatch, cheat, returnTo, fix002 ); - DCFlushRange(dst, len); + DCFlushRange(dst, len); } *entry = appldr_final(); @@ -123,7 +124,7 @@ s32 Apploader_Run(entry_point *entry, char * dolpath, u8 cheat, u8 videoSelected void *dolbuffer = NULL; int dollen = 0; - bool dolloaded = Load_Dol(&dolbuffer, &dollen, dolpath, videoSelected, languageChoice, patchcountrystring, vipatch, cheat, returnTo); + bool dolloaded = Load_Dol(&dolbuffer, &dollen, dolpath, videoSelected, languageChoice, patchcountrystring, vipatch, cheat, returnTo); if (dolloaded) { *entry = (entry_point) load_dol_image(dolbuffer); @@ -136,10 +137,8 @@ s32 Apploader_Run(entry_point *entry, char * dolpath, u8 cheat, u8 videoSelected wip_reset_counter(); FST_ENTRY *fst = (FST_ENTRY *) *(u32 *) 0x80000038; - *entry = (entry_point) Load_Dol_from_disc(fst[alternatedoloffset].fileoffset, videoSelected, languageChoice, + *entry = (entry_point) Load_Dol_from_disc(fst[alternatedoloffset].fileoffset, videoSelected, languageChoice, patchcountrystring, vipatch, cheat, returnTo); - - if (*entry == 0) SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); } return 0; diff --git a/source/usbloader/disc.c b/source/usbloader/disc.c index 1f84dfb2..e6327486 100644 --- a/source/usbloader/disc.c +++ b/source/usbloader/disc.c @@ -13,7 +13,7 @@ #include "video.h" #include "wdvd.h" #include "alternatedol.h" -#include "memory.h" +#include "memory/memory.h" #include "wbfs.h" #include "../settings/SettingsEnums.h" #include "../gecko.h" @@ -23,9 +23,6 @@ #define PTABLE_OFFSET 0x40000 #define WII_MAGIC 0x5D1C9EA3 -//appentrypoint -u32 appentrypoint; - /* Disc pointers */ static u32 *buffer = (u32 *) 0x93000000; static u8 *diskid = (u8 *) Disc_ID; @@ -48,11 +45,7 @@ void __Disc_SetLowMem(void) *(vu32 *) 0xCD00643C = 0x00000000; // 32Mhz on Bus //If the game is sam & max: season 1 put this shit in - char gameid[8]; - memset(gameid, 0, 8); - memcpy(gameid, (char*) Disc_ID, 6); - - if ((strcmp(gameid, "R3XE6U") == 0) || (strcmp(gameid, "R3XP6V") == 0)) + if ((strncmp((char*) Disc_ID, "R3XE6U", 6) == 0) || (strncmp((char*) Disc_ID, "R3XP6V", 6) == 0)) { *GameID_Address = 0x80000000; // Game ID Address } @@ -284,84 +277,33 @@ s32 Disc_IsWii(void) return 0; } -s32 Disc_BootPartition(u64 offset, char * dolpath, u8 videoselected, u8 languageChoice, u8 cheat, u8 vipatch, u8 patchcountrystring, - u8 alternatedol, u32 alternatedoloffset, u32 returnTo, u8 fix002) +s32 Disc_JumpToEntrypoint(u8 videoselected, bool enablecheat) { - gprintf("booting partition IOS %u v%u\n", IOS_GetVersion(), IOS_GetRevision()); - entry_point p_entry; - - s32 ret; - - /* Open specified partition */ - ret = WDVD_OpenPartition(offset); - if (ret < 0) return ret; - - /* Setup low memory */ - __Disc_SetLowMem(); - - char gameid[8]; - memset(gameid, 0, 8); - memcpy(gameid, (char*) Disc_ID, 6); - - load_wip_code((u8 *) &gameid); - - /* If a wip file is loaded for this game this does nothing - Dimok */ - PoPPatch(); - - /* Run apploader */ - ret = Apploader_Run(&p_entry, dolpath, cheat, videoselected, languageChoice, vipatch, patchcountrystring, - alternatedol, alternatedoloffset, returnTo, fix002); - if (ret < 0) return ret; - - free_wip(); - - bool cheatloaded = false; - - if (cheat) - { - // OCARINA STUFF - FISHEARS - if (ocarina_load_code((u8 *) gameid) > 0) - { - ocarina_do_code(); - cheatloaded = true; - } - } - - //kill the USB and SD - USBDevice_deInit(); - SDCard_deInit(); - /* Set an appropiate video mode */ __Disc_SetVMode(videoselected); /* Set time */ __Disc_SetTime(); - /* Disconnect Wiimote */ - WPAD_Flush(0); - WPAD_Disconnect(0); - WPAD_Shutdown(); - // Anti-green screen fix VIDEO_SetBlack(TRUE); VIDEO_Flush(); VIDEO_WaitVSync(); + VIDEO_WaitVSync(); gprintf("USB Loader GX is done.\n"); /* Shutdown IOS subsystems */ - // fix for PeppaPig (from NeoGamma) - extern void __exception_closeall(); - IRQ_Disable(); - __IOS_ShutdownSubsystems(); - __exception_closeall(); + // fix for PeppaPig (from WiiFlow) + u8 temp_data[4]; + memcpy(temp_data, (u8 *) 0x800000F4, 4); + SYS_ResetSystem(SYS_SHUTDOWN, 0, 0); + memcpy((u8 *) 0x800000F4, temp_data, 4); - appentrypoint = (u32) p_entry; - - if (cheat == 1 && cheatloaded) + if (enablecheat) { __asm__( - "lis %r3, appentrypoint@h\n" - "ori %r3, %r3, appentrypoint@l\n" + "lis %r3, AppEntrypoint@h\n" + "ori %r3, %r3, AppEntrypoint@l\n" "lwz %r3, 0(%r3)\n" "mtlr %r3\n" "lis %r3, 0x8000\n" @@ -373,8 +315,8 @@ s32 Disc_BootPartition(u64 offset, char * dolpath, u8 videoselected, u8 language else { __asm__( - "lis %r3, appentrypoint@h\n" - "ori %r3, %r3, appentrypoint@l\n" + "lis %r3, AppEntrypoint@h\n" + "ori %r3, %r3, AppEntrypoint@l\n" "lwz %r3, 0(%r3)\n" "mtlr %r3\n" "blr\n" @@ -384,21 +326,6 @@ s32 Disc_BootPartition(u64 offset, char * dolpath, u8 videoselected, u8 language return 0; } -s32 Disc_WiiBoot(char * dolpath, u8 videoselected, u8 languageChoice, u8 cheat, u8 vipatch, u8 patchcountrystring, - u8 alternatedol, u32 alternatedoloffset, u32 returnTo, u8 fix002) -{ - u64 offset; - s32 ret; - - /* Find game partition offset */ - ret = __Disc_FindPartition(&offset); - if (ret < 0) return ret; - - /* Boot partition */ - return Disc_BootPartition(offset, dolpath, videoselected, languageChoice, cheat, vipatch, patchcountrystring, - alternatedol, alternatedoloffset, returnTo, fix002); -} - void PatchCountryStrings(void *Address, int Size) { u8 SearchPattern[4] = { 0x00, 0x00, 0x00, 0x00 }; diff --git a/source/usbloader/disc.h b/source/usbloader/disc.h index 768c7db1..3cbc4025 100644 --- a/source/usbloader/disc.h +++ b/source/usbloader/disc.h @@ -40,7 +40,7 @@ extern "C" /* Padding */ u8 unused3[30]; - }ATTRIBUTE_PACKED; + } ATTRIBUTE_PACKED; /* Prototypes */ s32 Disc_Init(void); @@ -50,11 +50,10 @@ extern "C" s32 Disc_SetUSB(const u8 *); s32 Disc_ReadHeader(void *); s32 Disc_IsWii(void); - s32 Disc_BootPartition(u64, char *, u8, u8 languageChoice, u8, u8, u8, u8, u32, u32 returnTo, u8 fix002); - s32 Disc_WiiBoot(char *, u8, u8 languageChoice, u8, u8, u8, u8, u32, u32 returnTo, u8 fix002); s32 __Disc_FindPartition(u64 *outbuf); void PatchCountryStrings(void *Address, int Size); s32 __Disc_FindPartition(u64 *outbuf); + s32 Disc_JumpToEntrypoint(u8 videoselected, bool enablecheat); #ifdef __cplusplus } diff --git a/source/utils/minizip/miniunz.h b/source/utils/minizip/miniunz.h index ba7420ff..216d31bd 100644 --- a/source/utils/minizip/miniunz.h +++ b/source/utils/minizip/miniunz.h @@ -6,7 +6,7 @@ extern "C" { #endif -#include +#include int extractZip(unzFile uf, int opt_extract_without_path, int opt_overwrite, const char* password, const char *basedir); diff --git a/source/xml/xml.cpp b/source/xml/xml.cpp index 0a7f409b..95ad652c 100644 --- a/source/xml/xml.cpp +++ b/source/xml/xml.cpp @@ -5,7 +5,7 @@ */ #include -#include +#include #include "settings/CSettings.h" #include "settings/CGameSettings.h" #include "settings/GameTitles.h" @@ -321,7 +321,7 @@ void LoadTitlesFromXML(char *langtxt, bool forcejptoen) } /* if enabled, force English title for all games set to Japanese */ - if (forcejptoen && (!strcmp(langcode, "JA"))) strcpy(langcode, "EN"); + if (forcejptoen && (strcmp(langcode, "JA")) == 0) strcpy(langcode, "EN"); /* load title from nodes */ nodefound = mxmlFindElement(nodeid, nodedata, "locale", "lang", "EN", MXML_NO_DESCEND);