mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-16 00:15:08 +01:00
*Lot's of cleanup and file/function movement.
*Homebrew boot changed a bit (cleanup) *A lot more stuff i can't remember anymore
This commit is contained in:
parent
bed86339f7
commit
33ce3e48ab
@ -2,8 +2,8 @@
|
|||||||
<app version="1">
|
<app version="1">
|
||||||
<name> USB Loader GX</name>
|
<name> USB Loader GX</name>
|
||||||
<coder>USB Loader GX Team</coder>
|
<coder>USB Loader GX Team</coder>
|
||||||
<version>1.0 r994</version>
|
<version>1.0 r995</version>
|
||||||
<release_date>201010280947</release_date>
|
<release_date>201010311348</release_date>
|
||||||
<short_description>Loads games from USB-devices</short_description>
|
<short_description>Loads games from USB-devices</short_description>
|
||||||
<long_description>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.
|
<long_description>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.
|
The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller.
|
||||||
|
2
Makefile
2
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
|
# 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
|
# list of directories containing libraries, this must be the top level containing
|
||||||
# include and lib
|
# include and lib
|
||||||
|
File diff suppressed because one or more lines are too long
@ -2,6 +2,8 @@
|
|||||||
#include "mload/mload.h"
|
#include "mload/mload.h"
|
||||||
#include "mload/mload_modules.h"
|
#include "mload/mload_modules.h"
|
||||||
#include "usbloader/disc.h"
|
#include "usbloader/disc.h"
|
||||||
|
#include "usbloader/apploader.h"
|
||||||
|
#include "usbloader/wdvd.h"
|
||||||
#include "usbloader/GameList.h"
|
#include "usbloader/GameList.h"
|
||||||
#include "settings/Settings.h"
|
#include "settings/Settings.h"
|
||||||
#include "settings/CGameSettings.h"
|
#include "settings/CGameSettings.h"
|
||||||
@ -9,17 +11,87 @@
|
|||||||
#include "usbloader/wbfs.h"
|
#include "usbloader/wbfs.h"
|
||||||
#include "settings/newtitles.h"
|
#include "settings/newtitles.h"
|
||||||
#include "patches/fst.h"
|
#include "patches/fst.h"
|
||||||
|
#include "patches/gamepatches.h"
|
||||||
|
#include "patches/wip.h"
|
||||||
|
#include "system/IosLoader.h"
|
||||||
#include "wad/nandtitle.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;
|
struct discHdr *dvdheader = NULL;
|
||||||
extern int load_from_fs;
|
extern int load_from_fs;
|
||||||
extern int mountMethod;
|
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)
|
int BootGame(const char * gameID)
|
||||||
{
|
{
|
||||||
if(!gameID || strlen(gameID) < 3)
|
if(!gameID || strlen(gameID) < 3)
|
||||||
return -1;
|
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);
|
gprintf("\tSettings.partition: %d\n", Settings.partition);
|
||||||
|
|
||||||
gameList.LoadUnfiltered();
|
gameList.LoadUnfiltered();
|
||||||
@ -63,6 +135,14 @@ int BootGame(const char * gameID)
|
|||||||
returnToLoaderGV = game_cfg->returnTo;
|
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)
|
if (!mountMethod)
|
||||||
{
|
{
|
||||||
gprintf("Loading fragment list...");
|
gprintf("Loading fragment list...");
|
||||||
@ -114,16 +194,35 @@ int BootGame(const char * gameID)
|
|||||||
|
|
||||||
gprintf("\tDisc_wiiBoot\n");
|
gprintf("\tDisc_wiiBoot\n");
|
||||||
|
|
||||||
shadow_mload();
|
/* Boot partition */
|
||||||
|
AppEntrypoint = BootPartition(Settings.dolpath, videoChoice, languageChoice, ocarinaChoice, viChoice, countrystrings,
|
||||||
ret = Disc_WiiBoot(Settings.dolpath, videoChoice, languageChoice, ocarinaChoice, viChoice, countrystrings,
|
|
||||||
alternatedol, alternatedoloffset, channel, fix002);
|
alternatedol, alternatedoloffset, channel, fix002);
|
||||||
|
|
||||||
if (ret < 0)
|
if(AppEntrypoint != 0)
|
||||||
Sys_LoadMenu();
|
{
|
||||||
|
bool enablecheat = false;
|
||||||
|
|
||||||
//should never get here
|
if (ocarinaChoice)
|
||||||
printf("Returning entry point: 0x%0x\n", ret);
|
{
|
||||||
|
// 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;
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <unzip/unzip.h>
|
|
||||||
|
|
||||||
#include "prompts/ProgressWindow.h"
|
#include "prompts/ProgressWindow.h"
|
||||||
#include "FileOperations/fileops.h"
|
#include "FileOperations/fileops.h"
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
#ifndef _ZIPFILE_H_
|
#ifndef _ZIPFILE_H_
|
||||||
#define _ZIPFILE_H_
|
#define _ZIPFILE_H_
|
||||||
|
|
||||||
#include <unzip/unzip.h>
|
#include <zip/unzip.h>
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include <gccore.h>
|
#include <gccore.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
/* init-globals */
|
/* init-globals */
|
||||||
bool geckoinit = false;
|
bool geckoinit = false;
|
||||||
@ -9,22 +10,24 @@ bool textVideoInit = false;
|
|||||||
#ifndef NO_DEBUG
|
#ifndef NO_DEBUG
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
//using the gprintf from crediar because it is smaller than mine
|
void gprintf(const char *format, ...)
|
||||||
void gprintf(const char *str, ...)
|
|
||||||
{
|
{
|
||||||
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;
|
if(tmp)
|
||||||
va_start( ap, str );
|
free(tmp);
|
||||||
|
|
||||||
vsprintf(astr, str, ap);
|
|
||||||
|
|
||||||
va_end( ap );
|
|
||||||
|
|
||||||
usb_sendbuffer(1, astr, strlen(astr));
|
|
||||||
//usb_sendbuffer_safe( 1, astr, strlen(astr) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InitGecko()
|
bool InitGecko()
|
||||||
|
@ -1,141 +1,3 @@
|
|||||||
#if 0
|
|
||||||
#include <gccore.h>
|
|
||||||
#include <ogcsys.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ogc/machine/processor.h>
|
|
||||||
#include <wiiuse/wpad.h>
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#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<std::string> 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 <gccore.h>
|
#include <gccore.h>
|
||||||
#include <ogcsys.h>
|
#include <ogcsys.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
@ -153,23 +15,12 @@ int BootHomebrew( const char * filepath )
|
|||||||
#include "fatmounter.h"
|
#include "fatmounter.h"
|
||||||
#include "dolloader.h"
|
#include "dolloader.h"
|
||||||
|
|
||||||
void *innetbuffer = NULL;
|
|
||||||
static u8 *homebrewbuffer = (u8 *) 0x92000000;
|
static u8 *homebrewbuffer = (u8 *) 0x92000000;
|
||||||
u32 homebrewsize = 0;
|
static u32 homebrewsize = 0;
|
||||||
static std::vector<std::string> Arguments;
|
static std::vector<std::string> Arguments;
|
||||||
|
|
||||||
extern const u8 app_booter_dol[];
|
extern const u8 app_booter_dol[];
|
||||||
|
extern const u32 app_booter_dol_size;
|
||||||
int AllocHomebrewMemory(u32 filesize)
|
|
||||||
{
|
|
||||||
|
|
||||||
innetbuffer = malloc(filesize);
|
|
||||||
|
|
||||||
if (!innetbuffer) return -1;
|
|
||||||
|
|
||||||
homebrewsize = filesize;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AddBootArgument(const char * argv)
|
void AddBootArgument(const char * argv)
|
||||||
{
|
{
|
||||||
@ -190,12 +41,6 @@ void FreeHomebrewBuffer()
|
|||||||
homebrewbuffer = (u8 *) 0x92000000;
|
homebrewbuffer = (u8 *) 0x92000000;
|
||||||
homebrewsize = 0;
|
homebrewsize = 0;
|
||||||
|
|
||||||
if (innetbuffer)
|
|
||||||
{
|
|
||||||
free(innetbuffer);
|
|
||||||
innetbuffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
Arguments.clear();
|
Arguments.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -245,6 +90,8 @@ static int RunAppbooter()
|
|||||||
{
|
{
|
||||||
if (homebrewsize == 0) return -1;
|
if (homebrewsize == 0) return -1;
|
||||||
|
|
||||||
|
ExitApp();
|
||||||
|
|
||||||
struct __argv args;
|
struct __argv args;
|
||||||
SetupARGV(&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);
|
SYS_ResetSystem(SYS_SHUTDOWN, 0, 0);
|
||||||
_CPU_ISR_Disable( cpu_isr );
|
_CPU_ISR_Disable( cpu_isr );
|
||||||
__exception_closeall();
|
__exception_closeall();
|
||||||
@ -287,7 +127,7 @@ static int RunAppbooter()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int BootHomebrew(char * filepath)
|
int BootHomebrew(const char * filepath)
|
||||||
{
|
{
|
||||||
void *buffer = NULL;
|
void *buffer = NULL;
|
||||||
u32 filesize = 0;
|
u32 filesize = 0;
|
||||||
@ -327,18 +167,5 @@ int BootHomebrew(char * filepath)
|
|||||||
|
|
||||||
int BootHomebrewFromMem()
|
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();
|
return RunAppbooter();
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,10 @@
|
|||||||
#ifndef _BOOTHOMEBREW_H_
|
#ifndef _BOOTHOMEBREW_H_
|
||||||
#define _BOOTHOMEBREW_H_
|
#define _BOOTHOMEBREW_H_
|
||||||
|
|
||||||
//int BootHomebrew();
|
int BootHomebrew(const char * filepath);
|
||||||
int BootHomebrewFromMem();
|
int BootHomebrewFromMem();
|
||||||
int BootHomebrew(char * filepath);
|
|
||||||
int CopyHomebrewMemory(u8 *temp, u32 pos, u32 len);
|
int CopyHomebrewMemory(u8 *temp, u32 pos, u32 len);
|
||||||
void AddBootArgument(const char * arg);
|
void AddBootArgument(const char * arg);
|
||||||
void FreeHomebrewBuffer();
|
void FreeHomebrewBuffer();
|
||||||
int LoadHomebrew(const char * filepath);
|
|
||||||
int AllocHomebrewMemory(u32 filesize);
|
|
||||||
extern void *innetbuffer;
|
|
||||||
extern u32 homebrewsize;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
#include <unzip/unzip.h>
|
#include <zip/unzip.h>
|
||||||
|
|
||||||
#include "language/gettext.h"
|
#include "language/gettext.h"
|
||||||
#include "libwiigui/gui.h"
|
#include "libwiigui/gui.h"
|
||||||
@ -34,16 +34,12 @@ extern void ResumeGui();
|
|||||||
extern void HaltGui();
|
extern void HaltGui();
|
||||||
|
|
||||||
/*** Extern variables ***/
|
/*** Extern variables ***/
|
||||||
extern GuiImage * bgImg;
|
|
||||||
extern u32 infilesize;
|
extern u32 infilesize;
|
||||||
extern u32 uncfilesize;
|
extern u32 uncfilesize;
|
||||||
extern char wiiloadVersion[2];
|
extern char wiiloadVersion[2];
|
||||||
extern u8 shutdown;
|
extern u8 shutdown;
|
||||||
extern u8 reset;
|
extern u8 reset;
|
||||||
|
|
||||||
/*** Variables used elsewhere ***/
|
|
||||||
u8 boothomebrew = 0;
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* roundup Function
|
* roundup Function
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
@ -54,6 +50,137 @@ int roundup(float number)
|
|||||||
else return (int) (number + 1);
|
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
|
* MenuHomebrewBrowse
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
@ -695,10 +822,9 @@ int MenuHomebrewBrowse()
|
|||||||
XMLInfo[0].GetReleasedate(), XMLInfo[0].GetLongDescription(), iconpath, filesize);
|
XMLInfo[0].GetReleasedate(), XMLInfo[0].GetLongDescription(), iconpath, filesize);
|
||||||
if (choice == 1)
|
if (choice == 1)
|
||||||
{
|
{
|
||||||
boothomebrew = 1;
|
|
||||||
menu = MENU_EXIT;
|
|
||||||
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
|
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
|
||||||
HomebrewFiles.GetFilepath(fileoffset), HomebrewFiles.GetFilename(fileoffset));
|
HomebrewFiles.GetFilepath(fileoffset), HomebrewFiles.GetFilename(fileoffset));
|
||||||
|
BootHomebrew(Settings.selected_homebrew);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
MainButton1.ResetState();
|
MainButton1.ResetState();
|
||||||
@ -728,10 +854,9 @@ int MenuHomebrewBrowse()
|
|||||||
XMLInfo[1].GetReleasedate(), XMLInfo[1].GetLongDescription(), iconpath, filesize);
|
XMLInfo[1].GetReleasedate(), XMLInfo[1].GetLongDescription(), iconpath, filesize);
|
||||||
if (choice == 1)
|
if (choice == 1)
|
||||||
{
|
{
|
||||||
boothomebrew = 1;
|
|
||||||
menu = MENU_EXIT;
|
|
||||||
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
|
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
|
||||||
HomebrewFiles.GetFilepath(fileoffset + 1), HomebrewFiles.GetFilename(fileoffset + 1));
|
HomebrewFiles.GetFilepath(fileoffset + 1), HomebrewFiles.GetFilename(fileoffset + 1));
|
||||||
|
BootHomebrew(Settings.selected_homebrew);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
MainButton2.ResetState();
|
MainButton2.ResetState();
|
||||||
@ -761,10 +886,9 @@ int MenuHomebrewBrowse()
|
|||||||
XMLInfo[2].GetReleasedate(), XMLInfo[2].GetLongDescription(), iconpath, filesize);
|
XMLInfo[2].GetReleasedate(), XMLInfo[2].GetLongDescription(), iconpath, filesize);
|
||||||
if (choice == 1)
|
if (choice == 1)
|
||||||
{
|
{
|
||||||
boothomebrew = 1;
|
|
||||||
menu = MENU_EXIT;
|
|
||||||
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
|
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
|
||||||
HomebrewFiles.GetFilepath(fileoffset + 2), HomebrewFiles.GetFilename(fileoffset + 2));
|
HomebrewFiles.GetFilepath(fileoffset + 2), HomebrewFiles.GetFilename(fileoffset + 2));
|
||||||
|
BootHomebrew(Settings.selected_homebrew);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
MainButton3.ResetState();
|
MainButton3.ResetState();
|
||||||
@ -794,10 +918,9 @@ int MenuHomebrewBrowse()
|
|||||||
XMLInfo[3].GetReleasedate(), XMLInfo[3].GetLongDescription(), iconpath, filesize);
|
XMLInfo[3].GetReleasedate(), XMLInfo[3].GetLongDescription(), iconpath, filesize);
|
||||||
if (choice == 1)
|
if (choice == 1)
|
||||||
{
|
{
|
||||||
boothomebrew = 1;
|
|
||||||
menu = MENU_EXIT;
|
|
||||||
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
|
snprintf(Settings.selected_homebrew, sizeof(Settings.selected_homebrew), "%s%s",
|
||||||
HomebrewFiles.GetFilepath(fileoffset + 3), HomebrewFiles.GetFilename(fileoffset + 3));
|
HomebrewFiles.GetFilepath(fileoffset + 3), HomebrewFiles.GetFilename(fileoffset + 3));
|
||||||
|
BootHomebrew(Settings.selected_homebrew);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
MainButton4.ResetState();
|
MainButton4.ResetState();
|
||||||
@ -864,166 +987,9 @@ int MenuHomebrewBrowse()
|
|||||||
|
|
||||||
else if (infilesize > 0)
|
else if (infilesize > 0)
|
||||||
{
|
{
|
||||||
char filesizetxt[50];
|
menu = ReceiveFile();
|
||||||
char temp[50];
|
CloseConnection();
|
||||||
|
ResumeNetworkWait();
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (channelBtn.GetState() == STATE_CLICKED)
|
else if (channelBtn.GetState() == STATE_CLICKED)
|
||||||
|
@ -116,8 +116,6 @@ int main(int argc, char *argv[])
|
|||||||
SetupDefaultFont(fontPath);
|
SetupDefaultFont(fontPath);
|
||||||
free(fontPath);
|
free(fontPath);
|
||||||
|
|
||||||
//gprintf("\tEnd of Main()\n");
|
|
||||||
InitGUIThreads();
|
|
||||||
MainMenu(MENU_DISCLIST);
|
MainMenu(MENU_DISCLIST);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,6 @@
|
|||||||
#include "usbloader/frag.h"
|
#include "usbloader/frag.h"
|
||||||
#include "usbloader/wbfs.h"
|
#include "usbloader/wbfs.h"
|
||||||
#include "wad/nandtitle.h"
|
#include "wad/nandtitle.h"
|
||||||
#include "GameBootProcess.h"
|
|
||||||
|
|
||||||
/*** Variables that are also used extern ***/
|
/*** Variables that are also used extern ***/
|
||||||
GuiWindow * mainWindow = NULL;
|
GuiWindow * mainWindow = NULL;
|
||||||
@ -61,13 +60,12 @@ bool altdoldefault = true;
|
|||||||
|
|
||||||
static lwp_t guithread = LWP_THREAD_NULL;
|
static lwp_t guithread = LWP_THREAD_NULL;
|
||||||
static bool guiHalt = true;
|
static bool guiHalt = true;
|
||||||
static int ExitRequested = 0;
|
static bool ExitRequested = false;
|
||||||
|
|
||||||
/*** Extern variables ***/
|
/*** Extern variables ***/
|
||||||
extern u8 shutdown;
|
extern u8 shutdown;
|
||||||
extern u8 reset;
|
extern u8 reset;
|
||||||
extern s32 gameSelected, gameStart;
|
extern s32 gameSelected, gameStart;
|
||||||
extern u8 boothomebrew;
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* ResumeGui
|
* ResumeGui
|
||||||
@ -168,6 +166,7 @@ static void * UpdateGUI(void *arg)
|
|||||||
Menu_DrawRectangle(0, 0, screenwidth, screenheight, (GXColor) {0, 0, 0, i}, 1);
|
Menu_DrawRectangle(0, 0, screenwidth, screenheight, (GXColor) {0, 0, 0, i}, 1);
|
||||||
Menu_Render();
|
Menu_Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
mainWindow->RemoveAll();
|
mainWindow->RemoveAll();
|
||||||
ShutoffRumble();
|
ShutoffRumble();
|
||||||
|
|
||||||
@ -181,18 +180,22 @@ static void * UpdateGUI(void *arg)
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
void InitGUIThreads()
|
void InitGUIThreads()
|
||||||
{
|
{
|
||||||
LWP_CreateThread(&guithread, UpdateGUI, NULL, NULL, 65536, LWP_PRIO_HIGHEST);
|
ExitRequested = false;
|
||||||
InitProgressThread();
|
|
||||||
InitNetworkThread();
|
|
||||||
|
|
||||||
if (Settings.autonetwork) ResumeNetworkThread();
|
if(guithread == LWP_THREAD_NULL)
|
||||||
|
LWP_CreateThread(&guithread, UpdateGUI, NULL, NULL, 65536, LWP_PRIO_HIGHEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExitGUIThreads()
|
void ExitGUIThreads()
|
||||||
{
|
{
|
||||||
ExitRequested = 1;
|
ExitRequested = true;
|
||||||
LWP_JoinThread(guithread, NULL);
|
|
||||||
guithread = LWP_THREAD_NULL;
|
if(guithread != LWP_THREAD_NULL)
|
||||||
|
{
|
||||||
|
ResumeGui();
|
||||||
|
LWP_JoinThread(guithread, NULL);
|
||||||
|
guithread = LWP_THREAD_NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -254,6 +257,14 @@ int MainMenu(int menu)
|
|||||||
{
|
{
|
||||||
currentMenu = menu;
|
currentMenu = menu;
|
||||||
|
|
||||||
|
InitGUIThreads();
|
||||||
|
|
||||||
|
InitProgressThread();
|
||||||
|
InitNetworkThread();
|
||||||
|
|
||||||
|
if (Settings.autonetwork)
|
||||||
|
ResumeNetworkThread();
|
||||||
|
|
||||||
pointer[0] = Resources::GetImageData("player1_point.png");
|
pointer[0] = Resources::GetImageData("player1_point.png");
|
||||||
pointer[1] = Resources::GetImageData("player2_point.png");
|
pointer[1] = Resources::GetImageData("player2_point.png");
|
||||||
pointer[2] = Resources::GetImageData("player3_point.png");
|
pointer[2] = Resources::GetImageData("player3_point.png");
|
||||||
@ -301,61 +312,8 @@ int MainMenu(int menu)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MemInfoPrompt();
|
//! THIS SHOULD NEVER HAPPEN ANYMORE
|
||||||
gprintf("Exiting main GUI. mountMethod = %d\n", mountMethod);
|
ExitApp();
|
||||||
|
|
||||||
CloseXMLDatabase();
|
return -1;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
#define _MENU_H_
|
#define _MENU_H_
|
||||||
|
|
||||||
#include <ogcsys.h>
|
#include <ogcsys.h>
|
||||||
|
#include "libwiigui/gui.h"
|
||||||
|
#include "libwiigui/gui_bgm.h"
|
||||||
#include "settings/CSettings.h"
|
#include "settings/CSettings.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
@ -30,8 +32,21 @@ enum
|
|||||||
BOOTHOMEBREW,
|
BOOTHOMEBREW,
|
||||||
MENU_THEMEDOWNLOADER
|
MENU_THEMEDOWNLOADER
|
||||||
};
|
};
|
||||||
class GuiImageData;
|
|
||||||
|
void ResumeGui();
|
||||||
|
void HaltGui();
|
||||||
GuiImageData *LoadCoverImage(struct discHdr *header, bool Prefere3D = true, bool noCover = true);
|
GuiImageData *LoadCoverImage(struct discHdr *header, bool Prefere3D = true, bool noCover = true);
|
||||||
class GuiSound;
|
|
||||||
extern GuiSound *btnClick2;
|
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
|
#endif
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include "settings/CGameStatistics.h"
|
#include "settings/CGameStatistics.h"
|
||||||
#include "settings/GameTitles.h"
|
#include "settings/GameTitles.h"
|
||||||
#include "themes/CTheme.h"
|
#include "themes/CTheme.h"
|
||||||
|
#include "GameBootProcess.h"
|
||||||
#include "wpad.h"
|
#include "wpad.h"
|
||||||
#include "sys.h"
|
#include "sys.h"
|
||||||
|
|
||||||
@ -1472,9 +1473,8 @@ int MenuDiscList()
|
|||||||
header->id[3], header->id[4], header->id[5], GameStatistics.GetPlayCount(header->id));
|
header->id[3], header->id[4], header->id[5], GameStatistics.GetPlayCount(header->id));
|
||||||
|
|
||||||
}
|
}
|
||||||
menu = MENU_EXIT;
|
//Just calling that shuts down everything and starts game
|
||||||
break;
|
BootGame((const char *) header->id);
|
||||||
|
|
||||||
}
|
}
|
||||||
bool returnHere = true;// prompt to start game
|
bool returnHere = true;// prompt to start game
|
||||||
while (returnHere)
|
while (returnHere)
|
||||||
@ -1494,7 +1494,7 @@ int MenuDiscList()
|
|||||||
if (exeFile == NULL)
|
if (exeFile == NULL)
|
||||||
{
|
{
|
||||||
gprintf("\n\tTried to load alt dol that isn't there");
|
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" ));
|
WindowPrompt(tr( "Error" ), nipple, tr( "OK" ));
|
||||||
menu = MENU_DISCLIST;
|
menu = MENU_DISCLIST;
|
||||||
wiilight(0);
|
wiilight(0);
|
||||||
@ -1524,8 +1524,8 @@ int MenuDiscList()
|
|||||||
}
|
}
|
||||||
wiilight(0);
|
wiilight(0);
|
||||||
returnHere = false;
|
returnHere = false;
|
||||||
menu = MENU_EXIT;
|
//Just calling that shuts down everything and starts game
|
||||||
|
BootGame((const char *) gameList[gameSelected]->id);
|
||||||
}
|
}
|
||||||
else if (choice == 2)
|
else if (choice == 2)
|
||||||
{
|
{
|
||||||
|
@ -10,10 +10,6 @@
|
|||||||
#include "filelist.h"
|
#include "filelist.h"
|
||||||
#include "sys.h"
|
#include "sys.h"
|
||||||
|
|
||||||
extern void ResumeGui();
|
|
||||||
extern void HaltGui();
|
|
||||||
extern GuiWindow * mainWindow;
|
|
||||||
extern GuiBGM * bgMusic;
|
|
||||||
extern u8 shutdown;
|
extern u8 shutdown;
|
||||||
extern u8 reset;
|
extern u8 reset;
|
||||||
|
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
#ifndef GAMEPATCHES_H_
|
#ifndef GAMEPATCHES_H_
|
||||||
#define GAMEPATCHES_H_
|
#define GAMEPATCHES_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <gccore.h>
|
#include <gccore.h>
|
||||||
|
|
||||||
bool Anti_002_fix(u8 * Address, int Size);
|
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);
|
void VideoModePatcher(u8 * dst, int len, u8 videoSelected);
|
||||||
bool PatchReturnTo(void *Address, int Size, u32 id);
|
bool PatchReturnTo(void *Address, int Size, u32 id);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#include "sys.h"
|
#include "sys.h"
|
||||||
#include "settings/GameTitles.h"
|
#include "settings/GameTitles.h"
|
||||||
#include "themes/CTheme.h"
|
#include "themes/CTheme.h"
|
||||||
#include "memory.h"
|
#include "memory/memory.h"
|
||||||
#include "../gecko.h"
|
#include "../gecko.h"
|
||||||
#include "../patches/dvd_broadway.h"
|
#include "../patches/dvd_broadway.h"
|
||||||
|
|
||||||
@ -32,7 +32,6 @@ extern void HaltGui();
|
|||||||
extern GuiWindow * mainWindow;
|
extern GuiWindow * mainWindow;
|
||||||
extern u8 shutdown;
|
extern u8 shutdown;
|
||||||
extern u8 reset;
|
extern u8 reset;
|
||||||
extern u8 mountMethod;
|
|
||||||
|
|
||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
*Disk Browser
|
*Disk Browser
|
||||||
|
@ -51,8 +51,6 @@ int cntMissFiles = 0;
|
|||||||
static char missingFiles[500][12];
|
static char missingFiles[500][12];
|
||||||
|
|
||||||
/*** Extern variables ***/
|
/*** Extern variables ***/
|
||||||
extern GuiWindow * mainWindow;
|
|
||||||
extern GuiSound * bgMusic;
|
|
||||||
s32 gameSelected = 0, gameStart = 0;
|
s32 gameSelected = 0, gameStart = 0;
|
||||||
extern float gamesize;
|
extern float gamesize;
|
||||||
extern u8 shutdown;
|
extern u8 shutdown;
|
||||||
@ -61,10 +59,6 @@ extern u8 mountMethod;
|
|||||||
extern struct discHdr *dvdheader;
|
extern struct discHdr *dvdheader;
|
||||||
extern char game_partition[6];
|
extern char game_partition[6];
|
||||||
|
|
||||||
/*** Extern functions ***/
|
|
||||||
extern void ResumeGui();
|
|
||||||
extern void HaltGui();
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* OnScreenNumpad
|
* OnScreenNumpad
|
||||||
*
|
*
|
||||||
|
@ -585,14 +585,18 @@ bool CSettings::FindConfig()
|
|||||||
if (i == 1) strcpy(BootDevice, "USB:");
|
if (i == 1) strcpy(BootDevice, "USB:");
|
||||||
if (!found)
|
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");
|
testFp = fopen(ConfigPath, "wb");
|
||||||
found = (testFp != NULL);
|
found = (testFp != NULL);
|
||||||
fclose(testFp);
|
fclose(testFp);
|
||||||
}
|
}
|
||||||
if (!found)
|
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");
|
testFp = fopen(ConfigPath, "wb");
|
||||||
found = (testFp != NULL);
|
found = (testFp != NULL);
|
||||||
fclose(testFp);
|
fclose(testFp);
|
||||||
|
@ -4,12 +4,17 @@
|
|||||||
|
|
||||||
#include "mload/mload.h"
|
#include "mload/mload.h"
|
||||||
#include "settings/CSettings.h"
|
#include "settings/CSettings.h"
|
||||||
|
#include "settings/newtitles.h"
|
||||||
|
#include "language/gettext.h"
|
||||||
#include "utils/ResourceManager.h"
|
#include "utils/ResourceManager.h"
|
||||||
|
#include "FontSystem.h"
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
#include "fatmounter.h"
|
#include "fatmounter.h"
|
||||||
#include "lstub.h"
|
#include "lstub.h"
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#include "video.h"
|
#include "video.h"
|
||||||
|
#include "gecko.h"
|
||||||
|
#include "xml/xml.h"
|
||||||
|
|
||||||
extern char game_partition[6];
|
extern char game_partition[6];
|
||||||
extern u8 load_from_fs;
|
extern u8 load_from_fs;
|
||||||
@ -49,25 +54,50 @@ void Sys_Init(void)
|
|||||||
SYS_SetPowerCallback(__Sys_PowerCallback);
|
SYS_SetPowerCallback(__Sys_PowerCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _ExitApp()
|
void AppCleanUp(void)
|
||||||
{
|
{
|
||||||
|
extern u8 mountMethod;
|
||||||
|
gprintf("Exiting main GUI. mountMethod = %d\n", mountMethod);
|
||||||
|
|
||||||
ExitGUIThreads();
|
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();
|
StopGX();
|
||||||
ShutdownAudio();
|
ShutdownAudio();
|
||||||
|
|
||||||
ResourceManager::DestroyInstance();
|
ResourceManager::DestroyInstance();
|
||||||
|
|
||||||
|
WPAD_Flush(0);
|
||||||
|
WPAD_Disconnect(0);
|
||||||
|
WPAD_Shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExitApp(void)
|
||||||
|
{
|
||||||
|
AppCleanUp();
|
||||||
UnmountNTFS();
|
UnmountNTFS();
|
||||||
SDCard_deInit();
|
SDCard_deInit();
|
||||||
USBDevice_deInit();
|
USBDevice_deInit();
|
||||||
mload_set_ES_ioctlv_vector(NULL);
|
|
||||||
mload_close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sys_Reboot(void)
|
void Sys_Reboot(void)
|
||||||
{
|
{
|
||||||
/* Restart console */
|
/* Restart console */
|
||||||
_ExitApp();
|
ExitApp();
|
||||||
STM_RebootSystem();
|
STM_RebootSystem();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,10 +107,7 @@ void Sys_Reboot(void)
|
|||||||
|
|
||||||
static void _Sys_Shutdown(int SHUTDOWN_MODE)
|
static void _Sys_Shutdown(int SHUTDOWN_MODE)
|
||||||
{
|
{
|
||||||
_ExitApp();
|
ExitApp();
|
||||||
WPAD_Flush(0);
|
|
||||||
WPAD_Disconnect(0);
|
|
||||||
WPAD_Shutdown();
|
|
||||||
|
|
||||||
/* Poweroff console */
|
/* Poweroff console */
|
||||||
if ((CONF_GetShutdownMode() == CONF_SHUTDOWN_IDLE && SHUTDOWN_MODE != ShutdownToStandby) || SHUTDOWN_MODE
|
if ((CONF_GetShutdownMode() == CONF_SHUTDOWN_IDLE && SHUTDOWN_MODE != ShutdownToStandby) || SHUTDOWN_MODE
|
||||||
@ -118,7 +145,7 @@ void Sys_ShutdownToStandby(void)
|
|||||||
|
|
||||||
void Sys_LoadMenu(void)
|
void Sys_LoadMenu(void)
|
||||||
{
|
{
|
||||||
_ExitApp();
|
ExitApp();
|
||||||
/* Return to the Wii system menu */
|
/* Return to the Wii system menu */
|
||||||
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
|
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
|
||||||
}
|
}
|
||||||
@ -128,7 +155,7 @@ void Sys_BackToLoader(void)
|
|||||||
|
|
||||||
if (hbcStubAvailable())
|
if (hbcStubAvailable())
|
||||||
{
|
{
|
||||||
_ExitApp();
|
ExitApp();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
// Channel Version
|
// Channel Version
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
void wiilight(int enable);
|
void wiilight(int enable);
|
||||||
|
|
||||||
/* Prototypes */
|
/* 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_Init(void);
|
||||||
void Sys_Reboot(void);
|
void Sys_Reboot(void);
|
||||||
void Sys_Shutdown(void);
|
void Sys_Shutdown(void);
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "../fatmounter.h"
|
#include "../fatmounter.h"
|
||||||
#include "../usbloader/usbstorage2.h"
|
#include "../usbloader/usbstorage2.h"
|
||||||
#include "../usbloader/disc.h"
|
#include "../usbloader/disc.h"
|
||||||
|
#include "../usbloader/wdvd.h"
|
||||||
#include "../wad/nandtitle.h"
|
#include "../wad/nandtitle.h"
|
||||||
#include "../mload/mload_modules.h"
|
#include "../mload/mload_modules.h"
|
||||||
#include "../settings/CSettings.h"
|
#include "../settings/CSettings.h"
|
||||||
@ -66,6 +67,35 @@ s32 IosLoader::LoadAppCios()
|
|||||||
return ret;
|
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.
|
* 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.
|
* @return a negative value if a safe reload of the ios was not possible.
|
||||||
|
@ -7,6 +7,7 @@ class IosLoader
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static s32 LoadAppCios();
|
static s32 LoadAppCios();
|
||||||
|
static s32 LoadGameCios(s32 ios);
|
||||||
static s32 ReloadIosSafe(s32 ios);
|
static s32 ReloadIosSafe(s32 ios);
|
||||||
private:
|
private:
|
||||||
static void LoadIOSModules(s32 ios, s32 ios_rev);
|
static void LoadIOSModules(s32 ios, s32 ios_rev);
|
||||||
|
@ -25,14 +25,7 @@
|
|||||||
#include "ZipFile.h"
|
#include "ZipFile.h"
|
||||||
#include "gecko.h"
|
#include "gecko.h"
|
||||||
|
|
||||||
/*** Extern functions ***/
|
|
||||||
extern void ResumeGui();
|
|
||||||
extern void HaltGui();
|
|
||||||
|
|
||||||
/*** Extern variables ***/
|
/*** Extern variables ***/
|
||||||
extern GuiWindow * mainWindow;
|
|
||||||
extern GuiSound * bgMusic;
|
|
||||||
extern GuiImage * bgImg;
|
|
||||||
extern u8 shutdown;
|
extern u8 shutdown;
|
||||||
extern u8 reset;
|
extern u8 reset;
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
#include "xml/xml.h"
|
#include "xml/xml.h"
|
||||||
#include "FreeTypeGX.h"
|
#include "FreeTypeGX.h"
|
||||||
#include "GameList.h"
|
#include "GameList.h"
|
||||||
#include "memory.h"
|
#include "memory/memory.h"
|
||||||
|
|
||||||
GameList gameList;
|
GameList gameList;
|
||||||
|
|
||||||
|
@ -37,23 +37,24 @@ void gamepatches( u8 * dst, int len, u8 videoSelected, u8 languageChoice, u8 pat
|
|||||||
VideoModePatcher( dst, len, videoSelected );
|
VideoModePatcher( dst, len, videoSelected );
|
||||||
|
|
||||||
if ( cheat )
|
if ( cheat )
|
||||||
dogamehooks( dst, len );
|
dogamehooks( dst, len );
|
||||||
|
|
||||||
if ( vipatch )
|
if ( vipatch )
|
||||||
vidolpatcher( dst, len );
|
vidolpatcher( dst, len );
|
||||||
|
|
||||||
/*LANGUAGE PATCH - FISHEARS*/
|
/*LANGUAGE PATCH - FISHEARS*/
|
||||||
langpatcher( dst, len, languageChoice );
|
langpatcher( dst, len, languageChoice );
|
||||||
|
|
||||||
/*Thanks to WiiPower*/
|
/*Thanks to WiiPower*/
|
||||||
if ( patchcountrystring == 1 ) PatchCountryStrings( dst, len );
|
if ( patchcountrystring == 1 )
|
||||||
|
PatchCountryStrings( dst, len );
|
||||||
|
|
||||||
NSMBPatch( dst, len );
|
NSMBPatch( dst, len );
|
||||||
|
|
||||||
do_wip_code( ( u8 * ) dst, len );
|
do_wip_code( ( u8 * ) dst, len );
|
||||||
|
|
||||||
if ( fix002 == 2 )
|
if ( fix002 == 2 )
|
||||||
Anti_002_fix( dst, len );
|
Anti_002_fix( dst, len );
|
||||||
|
|
||||||
PatchReturnTo( dst, len, returnTo );
|
PatchReturnTo( dst, len, returnTo );
|
||||||
}
|
}
|
||||||
@ -108,10 +109,10 @@ s32 Apploader_Run(entry_point *entry, char * dolpath, u8 cheat, u8 videoSelected
|
|||||||
/* Read data from DVD */
|
/* Read data from DVD */
|
||||||
WDVD_Read(dst, len, (u64) (offset << 2));
|
WDVD_Read(dst, len, (u64) (offset << 2));
|
||||||
|
|
||||||
if( !alternatedol )
|
if( !alternatedol )
|
||||||
gamepatches(dst, len, videoSelected, languageChoice, patchcountrystring, vipatch, cheat, returnTo, fix002 );
|
gamepatches(dst, len, videoSelected, languageChoice, patchcountrystring, vipatch, cheat, returnTo, fix002 );
|
||||||
|
|
||||||
DCFlushRange(dst, len);
|
DCFlushRange(dst, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
*entry = appldr_final();
|
*entry = appldr_final();
|
||||||
@ -123,7 +124,7 @@ s32 Apploader_Run(entry_point *entry, char * dolpath, u8 cheat, u8 videoSelected
|
|||||||
void *dolbuffer = NULL;
|
void *dolbuffer = NULL;
|
||||||
int dollen = 0;
|
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)
|
if (dolloaded)
|
||||||
{
|
{
|
||||||
*entry = (entry_point) load_dol_image(dolbuffer);
|
*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();
|
wip_reset_counter();
|
||||||
FST_ENTRY *fst = (FST_ENTRY *) *(u32 *) 0x80000038;
|
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);
|
patchcountrystring, vipatch, cheat, returnTo);
|
||||||
|
|
||||||
if (*entry == 0) SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include "video.h"
|
#include "video.h"
|
||||||
#include "wdvd.h"
|
#include "wdvd.h"
|
||||||
#include "alternatedol.h"
|
#include "alternatedol.h"
|
||||||
#include "memory.h"
|
#include "memory/memory.h"
|
||||||
#include "wbfs.h"
|
#include "wbfs.h"
|
||||||
#include "../settings/SettingsEnums.h"
|
#include "../settings/SettingsEnums.h"
|
||||||
#include "../gecko.h"
|
#include "../gecko.h"
|
||||||
@ -23,9 +23,6 @@
|
|||||||
#define PTABLE_OFFSET 0x40000
|
#define PTABLE_OFFSET 0x40000
|
||||||
#define WII_MAGIC 0x5D1C9EA3
|
#define WII_MAGIC 0x5D1C9EA3
|
||||||
|
|
||||||
//appentrypoint
|
|
||||||
u32 appentrypoint;
|
|
||||||
|
|
||||||
/* Disc pointers */
|
/* Disc pointers */
|
||||||
static u32 *buffer = (u32 *) 0x93000000;
|
static u32 *buffer = (u32 *) 0x93000000;
|
||||||
static u8 *diskid = (u8 *) Disc_ID;
|
static u8 *diskid = (u8 *) Disc_ID;
|
||||||
@ -48,11 +45,7 @@ void __Disc_SetLowMem(void)
|
|||||||
*(vu32 *) 0xCD00643C = 0x00000000; // 32Mhz on Bus
|
*(vu32 *) 0xCD00643C = 0x00000000; // 32Mhz on Bus
|
||||||
|
|
||||||
//If the game is sam & max: season 1 put this shit in
|
//If the game is sam & max: season 1 put this shit in
|
||||||
char gameid[8];
|
if ((strncmp((char*) Disc_ID, "R3XE6U", 6) == 0) || (strncmp((char*) Disc_ID, "R3XP6V", 6) == 0))
|
||||||
memset(gameid, 0, 8);
|
|
||||||
memcpy(gameid, (char*) Disc_ID, 6);
|
|
||||||
|
|
||||||
if ((strcmp(gameid, "R3XE6U") == 0) || (strcmp(gameid, "R3XP6V") == 0))
|
|
||||||
{
|
{
|
||||||
*GameID_Address = 0x80000000; // Game ID Address
|
*GameID_Address = 0x80000000; // Game ID Address
|
||||||
}
|
}
|
||||||
@ -284,84 +277,33 @@ s32 Disc_IsWii(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 Disc_BootPartition(u64 offset, char * dolpath, u8 videoselected, u8 languageChoice, u8 cheat, u8 vipatch, u8 patchcountrystring,
|
s32 Disc_JumpToEntrypoint(u8 videoselected, bool enablecheat)
|
||||||
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;
|
|
||||||
|
|
||||||
/* 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 */
|
/* Set an appropiate video mode */
|
||||||
__Disc_SetVMode(videoselected);
|
__Disc_SetVMode(videoselected);
|
||||||
|
|
||||||
/* Set time */
|
/* Set time */
|
||||||
__Disc_SetTime();
|
__Disc_SetTime();
|
||||||
|
|
||||||
/* Disconnect Wiimote */
|
|
||||||
WPAD_Flush(0);
|
|
||||||
WPAD_Disconnect(0);
|
|
||||||
WPAD_Shutdown();
|
|
||||||
|
|
||||||
// Anti-green screen fix
|
// Anti-green screen fix
|
||||||
VIDEO_SetBlack(TRUE);
|
VIDEO_SetBlack(TRUE);
|
||||||
VIDEO_Flush();
|
VIDEO_Flush();
|
||||||
VIDEO_WaitVSync();
|
VIDEO_WaitVSync();
|
||||||
|
VIDEO_WaitVSync();
|
||||||
gprintf("USB Loader GX is done.\n");
|
gprintf("USB Loader GX is done.\n");
|
||||||
|
|
||||||
/* Shutdown IOS subsystems */
|
/* Shutdown IOS subsystems */
|
||||||
// fix for PeppaPig (from NeoGamma)
|
// fix for PeppaPig (from WiiFlow)
|
||||||
extern void __exception_closeall();
|
u8 temp_data[4];
|
||||||
IRQ_Disable();
|
memcpy(temp_data, (u8 *) 0x800000F4, 4);
|
||||||
__IOS_ShutdownSubsystems();
|
SYS_ResetSystem(SYS_SHUTDOWN, 0, 0);
|
||||||
__exception_closeall();
|
memcpy((u8 *) 0x800000F4, temp_data, 4);
|
||||||
|
|
||||||
appentrypoint = (u32) p_entry;
|
if (enablecheat)
|
||||||
|
|
||||||
if (cheat == 1 && cheatloaded)
|
|
||||||
{
|
{
|
||||||
__asm__(
|
__asm__(
|
||||||
"lis %r3, appentrypoint@h\n"
|
"lis %r3, AppEntrypoint@h\n"
|
||||||
"ori %r3, %r3, appentrypoint@l\n"
|
"ori %r3, %r3, AppEntrypoint@l\n"
|
||||||
"lwz %r3, 0(%r3)\n"
|
"lwz %r3, 0(%r3)\n"
|
||||||
"mtlr %r3\n"
|
"mtlr %r3\n"
|
||||||
"lis %r3, 0x8000\n"
|
"lis %r3, 0x8000\n"
|
||||||
@ -373,8 +315,8 @@ s32 Disc_BootPartition(u64 offset, char * dolpath, u8 videoselected, u8 language
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
__asm__(
|
__asm__(
|
||||||
"lis %r3, appentrypoint@h\n"
|
"lis %r3, AppEntrypoint@h\n"
|
||||||
"ori %r3, %r3, appentrypoint@l\n"
|
"ori %r3, %r3, AppEntrypoint@l\n"
|
||||||
"lwz %r3, 0(%r3)\n"
|
"lwz %r3, 0(%r3)\n"
|
||||||
"mtlr %r3\n"
|
"mtlr %r3\n"
|
||||||
"blr\n"
|
"blr\n"
|
||||||
@ -384,21 +326,6 @@ s32 Disc_BootPartition(u64 offset, char * dolpath, u8 videoselected, u8 language
|
|||||||
return 0;
|
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)
|
void PatchCountryStrings(void *Address, int Size)
|
||||||
{
|
{
|
||||||
u8 SearchPattern[4] = { 0x00, 0x00, 0x00, 0x00 };
|
u8 SearchPattern[4] = { 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
@ -40,7 +40,7 @@ extern "C"
|
|||||||
|
|
||||||
/* Padding */
|
/* Padding */
|
||||||
u8 unused3[30];
|
u8 unused3[30];
|
||||||
}ATTRIBUTE_PACKED;
|
} ATTRIBUTE_PACKED;
|
||||||
|
|
||||||
/* Prototypes */
|
/* Prototypes */
|
||||||
s32 Disc_Init(void);
|
s32 Disc_Init(void);
|
||||||
@ -50,11 +50,10 @@ extern "C"
|
|||||||
s32 Disc_SetUSB(const u8 *);
|
s32 Disc_SetUSB(const u8 *);
|
||||||
s32 Disc_ReadHeader(void *);
|
s32 Disc_ReadHeader(void *);
|
||||||
s32 Disc_IsWii(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);
|
s32 __Disc_FindPartition(u64 *outbuf);
|
||||||
void PatchCountryStrings(void *Address, int Size);
|
void PatchCountryStrings(void *Address, int Size);
|
||||||
s32 __Disc_FindPartition(u64 *outbuf);
|
s32 __Disc_FindPartition(u64 *outbuf);
|
||||||
|
s32 Disc_JumpToEntrypoint(u8 videoselected, bool enablecheat);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ extern "C"
|
|||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <unzip/unzip.h>
|
#include <zip/unzip.h>
|
||||||
|
|
||||||
int extractZip(unzFile uf, int opt_extract_without_path, int opt_overwrite, const char* password,
|
int extractZip(unzFile uf, int opt_extract_without_path, int opt_overwrite, const char* password,
|
||||||
const char *basedir);
|
const char *basedir);
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <unzip/unzip.h>
|
#include <zip/unzip.h>
|
||||||
#include "settings/CSettings.h"
|
#include "settings/CSettings.h"
|
||||||
#include "settings/CGameSettings.h"
|
#include "settings/CGameSettings.h"
|
||||||
#include "settings/GameTitles.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 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 */
|
/* load title from nodes */
|
||||||
nodefound = mxmlFindElement(nodeid, nodedata, "locale", "lang", "EN", MXML_NO_DESCEND);
|
nodefound = mxmlFindElement(nodeid, nodedata, "locale", "lang", "EN", MXML_NO_DESCEND);
|
||||||
|
Loading…
Reference in New Issue
Block a user