diff --git a/HBC/META.XML b/HBC/META.XML index 01e29aa6..b77b00eb 100644 --- a/HBC/META.XML +++ b/HBC/META.XML @@ -2,14 +2,14 @@ USB Loader GX USB Loader GX Team - 2.2 r1099 - 201106272106 + 2.2 r1101 + 201106301853 // remove this line to enable arguments + // remove this line to enable arguments --> 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. diff --git a/data/app_booter.bin b/data/app_booter.bin new file mode 100644 index 00000000..08d18063 Binary files /dev/null and b/data/app_booter.bin differ diff --git a/data/app_booter.dol b/data/app_booter.dol deleted file mode 100644 index 62c156fe..00000000 Binary files a/data/app_booter.dol and /dev/null differ diff --git a/data/fonts/font.ttf b/data/fonts/font.ttf deleted file mode 100644 index 01ce5816..00000000 Binary files a/data/fonts/font.ttf and /dev/null differ diff --git a/gui.pnproj b/gui.pnproj index e730919f..7751b92e 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/FreeTypeGX.cpp b/source/FreeTypeGX.cpp index 093e639e..c6c703ce 100644 --- a/source/FreeTypeGX.cpp +++ b/source/FreeTypeGX.cpp @@ -63,15 +63,23 @@ wchar_t* charToWideChar(const char* strChar) /** * Default constructor for the FreeTypeGX class for WiiXplorer. */ -FreeTypeGX::FreeTypeGX(const uint8_t* fontBuffer, FT_Long bufferSize) +FreeTypeGX::FreeTypeGX(const uint8_t* fontBuffer, FT_Long bufferSize, bool lastFace) { + int faceIndex = 0; ftPointSize = 0; FT_Init_FreeType(&ftLibrary); - FT_New_Memory_Face(ftLibrary, (FT_Byte *) fontBuffer, bufferSize, 0, &ftFace); + if(lastFace) + { + FT_New_Memory_Face(ftLibrary, (FT_Byte *)fontBuffer, bufferSize, -1, &ftFace); + faceIndex = ftFace->num_faces - 1; // Use the last face + FT_Done_Face(ftFace); + ftFace = NULL; + } + FT_New_Memory_Face(ftLibrary, (FT_Byte *) fontBuffer, bufferSize, faceIndex, &ftFace); setVertexFormat(GX_VTXFMT1); - ftKerningEnabled = false; + ftKerningEnabled = false;//FT_HAS_KERNING(ftFace); } /** diff --git a/source/FreeTypeGX.h b/source/FreeTypeGX.h index 7b50215d..50a70411 100644 --- a/source/FreeTypeGX.h +++ b/source/FreeTypeGX.h @@ -132,7 +132,7 @@ class FreeTypeGX int16_t screenZ, GXColor color); public: - FreeTypeGX(const uint8_t* fontBuffer, FT_Long bufferSize); + FreeTypeGX(const uint8_t* fontBuffer, FT_Long bufferSize, bool lastFace = false); ~FreeTypeGX(); void setVertexFormat(uint8_t vertexIndex); diff --git a/source/GUI/Text.cpp b/source/GUI/Text.cpp index 2462c0ee..ff1449c4 100644 --- a/source/GUI/Text.cpp +++ b/source/GUI/Text.cpp @@ -312,7 +312,7 @@ void Text::Draw() GXColor c = color; c.a = this->GetAlpha(); - int newSize = (int) (size * GetScale() * Settings.FontScaleFactor); + int newSize = (int) (size * GetScale()); if (newSize != currentSize) { diff --git a/source/GUI/gui_text.cpp b/source/GUI/gui_text.cpp index d0f4d3d0..153841ef 100644 --- a/source/GUI/gui_text.cpp +++ b/source/GUI/gui_text.cpp @@ -32,7 +32,7 @@ static GXColor presetColor = (GXColor) {255, 255, 255, 255}; GuiText::GuiText(const char * t, int s, GXColor c) { text = NULL; - size = s; + size = (int) (s * Settings.FontScaleFactor); currentSize = size; color = c; alpha = c.a; @@ -61,7 +61,7 @@ GuiText::GuiText(const char * t, int s, GXColor c) GuiText::GuiText(const wchar_t * t, int s, GXColor c) { text = NULL; - size = s; + size = (int) (s * Settings.FontScaleFactor); currentSize = size; color = c; alpha = c.a; @@ -95,7 +95,7 @@ GuiText::GuiText(const wchar_t * t, int s, GXColor c) GuiText::GuiText(const char * t) { text = NULL; - size = presetSize; + size = (int) (presetSize * Settings.FontScaleFactor); currentSize = size; color = presetColor; alpha = presetColor.a; @@ -531,7 +531,7 @@ void GuiText::Draw() GXColor c = color; c.a = GetAlpha(); - int newSize = (int) (size * GetScale() * Settings.FontScaleFactor); + int newSize = (int) (size * GetScale()); if (newSize != currentSize) { diff --git a/source/StartUpProcess.cpp b/source/StartUpProcess.cpp index 44b10121..7adc5bf2 100644 --- a/source/StartUpProcess.cpp +++ b/source/StartUpProcess.cpp @@ -158,6 +158,7 @@ int StartUpProcess::Run(int argc, char *argv[]) int StartUpProcess::Execute() { + Settings.EntryIOS = IOS_GetVersion(); SetTextf("Start up\n"); if(IosLoader::LoadAppCios() < 0) diff --git a/source/banner/OpeningBNR.cpp b/source/banner/OpeningBNR.cpp index f9eefb62..f2f9434d 100644 --- a/source/banner/OpeningBNR.cpp +++ b/source/banner/OpeningBNR.cpp @@ -5,44 +5,6 @@ #include "utils/uncompress.h" #include "OpeningBNR.hpp" -typedef struct _IMD5Header -{ - u32 fcc; - u32 filesize; - u8 zeroes[8]; - u8 crypto[16]; -} __attribute__((packed)) IMD5Header; - -typedef struct _U8Header -{ - u32 fcc; - u32 rootNodeOffset; - u32 headerSize; - u32 dataOffset; - u8 zeroes[16]; -} __attribute__((packed)) U8Header; - -typedef struct _U8Entry -{ - struct - { - u32 fileType :8; - u32 nameOffset :24; - }; - u32 fileOffset; - union - { - u32 fileLength; - u32 numEntries; - }; -} __attribute__( ( packed ) ) U8Entry; - - -static inline const char * u8Filename(const U8Entry *fst, int i) -{ - return (char *) (fst + fst[0].numEntries) + fst[i].nameOffset; -} - BNRInstance * BNRInstance::instance = NULL; OpeningBNR::OpeningBNR() diff --git a/source/banner/OpeningBNR.hpp b/source/banner/OpeningBNR.hpp index 2ec69a22..4419b78f 100644 --- a/source/banner/OpeningBNR.hpp +++ b/source/banner/OpeningBNR.hpp @@ -17,6 +17,44 @@ typedef struct _IMETHeader u8 crypto[16]; } __attribute__((packed)) IMETHeader; +typedef struct _IMD5Header +{ + u32 fcc; + u32 filesize; + u8 zeroes[8]; + u8 crypto[16]; +} __attribute__((packed)) IMD5Header; + +typedef struct _U8Header +{ + u32 fcc; + u32 rootNodeOffset; + u32 headerSize; + u32 dataOffset; + u8 zeroes[16]; +} __attribute__((packed)) U8Header; + +typedef struct _U8Entry +{ + struct + { + u32 fileType :8; + u32 nameOffset :24; + }; + u32 fileOffset; + union + { + u32 fileLength; + u32 numEntries; + }; +} __attribute__( ( packed ) ) U8Entry; + + +static inline const char * u8Filename(const U8Entry *fst, int i) +{ + return (char *) (fst + fst[0].numEntries) + fst[i].nameOffset; +} + class OpeningBNR { public: diff --git a/source/homebrewboot/BootHomebrew.cpp b/source/homebrewboot/BootHomebrew.cpp index 33ba5c71..81805bb3 100644 --- a/source/homebrewboot/BootHomebrew.cpp +++ b/source/homebrewboot/BootHomebrew.cpp @@ -9,18 +9,25 @@ #include #include #include "Controls/DeviceHandler.hpp" -#include "../lstub.h" -#include "../sys.h" -#include "../gecko.h" +#include "settings/CSettings.h" +#include "lstub.h" +#include "sys.h" +#include "gecko.h" -#include "dolloader.h" +#define EXECUTE_ADDR ((u8 *) 0x92000000) +#define BOOTER_ADDR ((u8 *) 0x93000000) +#define ARGS_ADDR ((u8 *) 0x93200000) -static u8 *homebrewbuffer = (u8 *) 0x92000000; +extern const u8 app_booter_bin[]; +extern const u32 app_booter_bin_size; + +typedef void (*entrypoint) (void); +extern "C" { void __exception_closeall(); } + +static u8 *homebrewbuffer = EXECUTE_ADDR; static u32 homebrewsize = 0; static std::vector Arguments; -extern const u8 app_booter_dol[]; - void AddBootArgument(const char * argv) { std::string arg(argv); @@ -37,7 +44,7 @@ int CopyHomebrewMemory(u8 *temp, u32 pos, u32 len) void FreeHomebrewBuffer() { - homebrewbuffer = (u8 *) 0x92000000; + homebrewbuffer = EXECUTE_ADDR; homebrewsize = 0; Arguments.clear(); @@ -91,18 +98,24 @@ static int RunAppbooter() ExitApp(); + if(Settings.EntryIOS != IOS_GetVersion()) + IOS_ReloadIOS(Settings.EntryIOS); + struct __argv args; SetupARGV(&args); u32 cpu_isr; - entrypoint entry = (entrypoint) load_dol((void*) app_booter_dol, &args); + memcpy(BOOTER_ADDR, app_booter_bin, app_booter_bin_size); + DCFlushRange(BOOTER_ADDR, app_booter_bin_size); - if (!entry) - { - FreeHomebrewBuffer(); - return -1; - } + entrypoint entry = (entrypoint) BOOTER_ADDR; + + if (args.argvMagic == ARGV_MAGIC) + { + memmove(ARGS_ADDR, &args, sizeof(args)); + DCFlushRange(ARGS_ADDR, sizeof(args)); + } u64 currentStub = getStubDest(); loadStub(); diff --git a/source/homebrewboot/dolloader.c b/source/homebrewboot/dolloader.c deleted file mode 100644 index d957f7e8..00000000 --- a/source/homebrewboot/dolloader.c +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "dolloader.h" - -typedef struct _dolheader { - u32 text_pos[7]; - u32 data_pos[11]; - u32 text_start[7]; - u32 data_start[11]; - u32 text_size[7]; - u32 data_size[11]; - u32 bss_start; - u32 bss_size; - u32 entry_point; -} dolheader; - -u32 load_dol(const void *dolstart, struct __argv *argv) -{ - u32 i; - dolheader *dolfile; - - if (dolstart) - { - dolfile = (dolheader *) dolstart; - for (i = 0; i < 7; i++) - { - if ((!dolfile->text_size[i]) || (dolfile->text_start[i] < 0x100)) - continue; - - memmove((void *) dolfile->text_start[i], dolstart - + dolfile->text_pos[i], dolfile->text_size[i]); - - DCFlushRange ((void *) dolfile->text_start[i], dolfile->text_size[i]); - ICInvalidateRange((void *) dolfile->text_start[i], dolfile->text_size[i]); - } - - for (i = 0; i < 11; i++) - { - if ((!dolfile->data_size[i]) || (dolfile->data_start[i] < 0x100)) - continue; - - memmove((void *) dolfile->data_start[i], dolstart - + dolfile->data_pos[i], dolfile->data_size[i]); - - DCFlushRange((void *) dolfile->data_start[i], - dolfile->data_size[i]); - } - - if (argv && argv->argvMagic == ARGV_MAGIC) - { - void *new_argv = (void *) (dolfile->entry_point + 8); - memmove(new_argv, argv, sizeof(*argv)); - DCFlushRange(new_argv, sizeof(*argv)); - } - return dolfile->entry_point; - } - return 0; -} diff --git a/source/homebrewboot/dolloader.h b/source/homebrewboot/dolloader.h deleted file mode 100644 index af644414..00000000 --- a/source/homebrewboot/dolloader.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _DOLLOADER_H_ -#define _DOLLOADER_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -extern void __exception_closeall(); -typedef void (*entrypoint) (void); - -u32 load_dol(const void *dolstart, struct __argv *argv); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp index 4fe57648..db2be1f2 100644 --- a/source/prompts/PromptWindows.cpp +++ b/source/prompts/PromptWindows.cpp @@ -29,8 +29,7 @@ #include "utils/StringTools.h" #include "mload/mload.h" #include "FileOperations/fileops.h" -#include "menu.h" -#include "menu.h" +#include "menu/menus.h" #include "sys.h" #include "wpad.h" #include "wad/wad.h" @@ -42,11 +41,6 @@ #include "gecko.h" #include "lstub.h" -/*** Extern variables ***/ -s32 gameStart = 0; -extern u8 shutdown; -extern u8 reset; - /**************************************************************************** * OnScreenNumpad * @@ -237,9 +231,9 @@ void WindowCredits() char SvnRev[80]; #ifdef FULLCHANNEL - snprintf(SvnRev, sizeof(SvnRev), "V2.2c IOS%u (Rev %u)", IOS_GetVersion(), IOS_GetRevision()); + snprintf(SvnRev, sizeof(SvnRev), "Rev%sc IOS%u (Rev %u)", GetRev(), IOS_GetVersion(), IOS_GetRevision()); #else - snprintf(SvnRev, sizeof(SvnRev), "V2.2 IOS%u (Rev %u)", IOS_GetVersion(), IOS_GetRevision()); + snprintf(SvnRev, sizeof(SvnRev), "Rev%s IOS%u (Rev %u)", GetRev(), IOS_GetVersion(), IOS_GetRevision()); #endif char IosInfo[80] = ""; diff --git a/source/prompts/gameinfo.cpp b/source/prompts/gameinfo.cpp index 1dc4a8d2..7fc6555a 100644 --- a/source/prompts/gameinfo.cpp +++ b/source/prompts/gameinfo.cpp @@ -1114,13 +1114,10 @@ bool save_gamelist(int txt) // save gamelist { struct discHdr* header = gameList[i]; WBFS_GameSize(header->id, &size); - if (i < 500) - { - fprintf(f, "%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2], header->id[3], header->id[4], - header->id[5]); - fprintf(f, " [%.2f] ", size); - fprintf(f, " %s", GameTitles.GetTitle(header)); - } + fprintf(f, "%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2], header->id[3], header->id[4], + header->id[5]); + fprintf(f, " [%.2f] ", size); + fprintf(f, " %s", GameTitles.GetTitle(header)); fprintf(f, "\n"); } } @@ -1132,11 +1129,8 @@ bool save_gamelist(int txt) // save gamelist { struct discHdr* header = gameList[i]; WBFS_GameSize(header->id, &size); - if (i < 500) - { - fprintf(f, "\"%c%c%c%c%c%c\",\"%.2f\",\"%s\"\n", header->id[0], header->id[1], header->id[2], - header->id[3], header->id[4], header->id[5], size, GameTitles.GetTitle(header)); - } + fprintf(f, "\"%c%c%c%c%c%c\",\"%.2f\",\"%s\"\n", header->id[0], header->id[1], header->id[2], + header->id[3], header->id[4], header->id[5], size, GameTitles.GetTitle(header)); } } fclose(f); diff --git a/source/settings/CSettings.cpp b/source/settings/CSettings.cpp index af832db4..f0dd4e68 100644 --- a/source/settings/CSettings.cpp +++ b/source/settings/CSettings.cpp @@ -119,7 +119,7 @@ void CSettings::SetDefault() USBPort = 0; CacheTitles = ON; WSFactor = 0.8f; //actually should be 0.75 for real widescreen - FontScaleFactor = 1.0f; + FontScaleFactor = 0.8f; //it's a work around to not have to change ALL fonts now EnabledCategories.resize(1); EnabledCategories[0] = 0; Wiinnertag = OFF; diff --git a/source/settings/CSettings.h b/source/settings/CSettings.h index 3f5a9dc4..dbcf6f33 100644 --- a/source/settings/CSettings.h +++ b/source/settings/CSettings.h @@ -125,6 +125,7 @@ class CSettings short GameListOffset; short sneekVideoPatch; std::vector EnabledCategories; + u8 EntryIOS; protected: bool ValidVersion(FILE * file); bool SetSetting(char *name, char *value); diff --git a/source/themes/CTheme.cpp b/source/themes/CTheme.cpp index b3763586..2326bf07 100644 --- a/source/themes/CTheme.cpp +++ b/source/themes/CTheme.cpp @@ -29,13 +29,27 @@ #include "CTheme.h" #include "GUI/gui.h" #include "settings/CSettings.h" +#include "banner/OpeningBNR.hpp" #include "FileOperations/fileops.h" #include "menu/menus.h" +#include "wad/nandtitle.h" #include "FreeTypeGX.h" +typedef struct map_entry +{ + char name[8]; + u8 hash[20]; +} __attribute__((packed)) map_entry_t; + +static const char contentMapPath[] ATTRIBUTE_ALIGN(32) = "/shared1/content.map"; +static const u8 WIIFONT_HASH[] = {0x32, 0xb3, 0x39, 0xcb, 0xbb, 0x50, 0x7d, 0x50, 0x27, 0x79, 0x25, 0x9a, 0x78, 0x66, 0x99, 0x5d, 0x03, 0x0b, 0x1d, 0x88}; +static const u8 WIIFONT_HASH_KOR[] = {0xb7, 0x15, 0x6d, 0xf0, 0xf4, 0xae, 0x07, 0x8f, 0xd1, 0x53, 0x58, 0x3e, 0x93, 0x6e, 0x07, 0xc0, 0x98, 0x77, 0x49, 0x0e}; + FreeTypeGX * fontSystem = NULL; -static FT_Byte * MainFont = NULL; -static u32 MainFontSize = 0; +static FT_Byte * systemFont = NULL; +static u32 systemFontSize = 0; +static FT_Byte * customFont = NULL; +static u32 customFontSize = 0; bool Theme::ShowTooltips = true; @@ -149,13 +163,76 @@ bool Theme::Load(const char * theme_file_path) return result; } +bool Theme::loadSystemFont(bool korean) +{ + u8 *contentMap = NULL; + u32 mapsize = 0; + + NandTitle::LoadFileFromNand(contentMapPath, &contentMap, &mapsize); + if(!contentMap) + return false; + + int fileCount = mapsize / sizeof(map_entry_t); + + map_entry_t *mapEntryList = (map_entry_t *) contentMap; + + for (int i = 0; i < fileCount; i++) + { + if (memcmp(mapEntryList[i].hash, korean ? WIIFONT_HASH_KOR : WIIFONT_HASH, 20) != 0) + continue; + + // Name found, load it and unpack it + char font_filename[32] ATTRIBUTE_ALIGN(32); + snprintf(font_filename, sizeof(font_filename), "/shared1/%.8s.app", mapEntryList[i].name); + + u8 *fontArchive = NULL; + u32 filesize = 0; + + NandTitle::LoadFileFromNand(font_filename, &fontArchive, &filesize); + if(!fontArchive) + continue; + + const U8Header *u8Archive = (U8Header *) fontArchive; + const U8Entry *fst = (const U8Entry *) (((const u8 *) u8Archive) + u8Archive->rootNodeOffset); + + if(fst[0].numEntries < 1) + { + free(fontArchive); + continue; + } + + if(systemFont) + delete [] systemFont; + + systemFontSize = fst[1].fileLength; + systemFont = new (std::nothrow) FT_Byte[systemFontSize]; + if(!systemFont) + { + free(fontArchive); + continue; + } + + memcpy(systemFont, fontArchive + fst[1].fileOffset, systemFontSize); + + free(fontArchive); + free(contentMap); + gprintf("Loaded Wii System Font: %s\n", u8Filename(fst, 1)); + return true; + } + + free(contentMap); + + return false; +} + bool Theme::LoadFont(const char *path) { char FontPath[300]; bool result = false; FILE *pfile = NULL; - ClearFontData(); + delete [] customFont; + customFont = NULL; snprintf(FontPath, sizeof(FontPath), "%s/font.ttf", path); @@ -164,22 +241,32 @@ bool Theme::LoadFont(const char *path) if (pfile) { fseek(pfile, 0, SEEK_END); - MainFontSize = ftell(pfile); + customFontSize = ftell(pfile); rewind(pfile); - MainFont = new (std::nothrow) FT_Byte[MainFontSize]; - if (MainFont) + customFont = new (std::nothrow) FT_Byte[customFontSize]; + if (customFont) { - fread(MainFont, 1, MainFontSize, pfile); + fread(customFont, 1, customFontSize, pfile); result = true; } fclose(pfile); } - FT_Byte * loadedFont = MainFont ? MainFont : (FT_Byte *) Resources::GetFile("font.ttf"); - u32 loadedFontSize = MainFont ? MainFontSize : Resources::GetFileSize("font.ttf"); + FT_Byte *loadedFont = customFont; + u32 loadedFontSize = customFontSize; - fontSystem = new FreeTypeGX(loadedFont, loadedFontSize); + if(!loadedFont) + { + if(!systemFont) + loadSystemFont(CONF_GetLanguage() == CONF_LANG_KOREAN); + + //! Default to system font if no custom is loaded + loadedFont = systemFont; + loadedFontSize = systemFontSize; + } + + fontSystem = new FreeTypeGX(loadedFont, loadedFontSize, loadedFont == systemFont); return result; } @@ -190,7 +277,11 @@ void Theme::ClearFontData() delete fontSystem; fontSystem = NULL; - if (MainFont) - delete [] MainFont; - MainFont = NULL; + if(customFont) + delete [] customFont; + customFont = NULL; + + if (systemFont) + delete [] systemFont; + systemFont = NULL; } diff --git a/source/themes/CTheme.h b/source/themes/CTheme.h index 5a7304ea..ecfe6aac 100644 --- a/source/themes/CTheme.h +++ b/source/themes/CTheme.h @@ -24,6 +24,8 @@ class Theme //!Enable tooltips: special case treaded because it is called every frame static bool ShowTooltips; private: + //!Load the original Wii System Menu font + static bool loadSystemFont(bool korean); //!Clear the font data and free the memory static void ClearFontData(); }; diff --git a/source/themes/filelist.h b/source/themes/filelist.h index d05fe8ac..c8c41261 100644 --- a/source/themes/filelist.h +++ b/source/themes/filelist.h @@ -1,7 +1,7 @@ /**************************************************************************** * USB Loader GX resource files. * This file is generated automatically. - * Includes 189 files. + * Includes 188 files. * * NOTE: * Any manual modification of this file will be overwriten by the generation. @@ -575,9 +575,6 @@ extern const u32 success_ogg_size; extern const u8 clock_ttf[]; extern const u32 clock_ttf_size; -extern const u8 font_ttf[]; -extern const u32 font_ttf_size; - RecourceFile Resources::RecourceFiles[] = { {"abcIcon.png", abcIcon_png, abcIcon_png_size, NULL, 0}, @@ -768,7 +765,6 @@ RecourceFile Resources::RecourceFiles[] = {"menuout.ogg", menuout_ogg, menuout_ogg_size, NULL, 0}, {"success.ogg", success_ogg, success_ogg_size, NULL, 0}, {"clock.ttf", clock_ttf, clock_ttf_size, NULL, 0}, - {"font.ttf", font_ttf, font_ttf_size, NULL, 0}, {NULL, NULL, 0, NULL, 0} }; diff --git a/source/usbloader/frag.c b/source/usbloader/frag.c index 700057f8..e03f1009 100644 --- a/source/usbloader/frag.c +++ b/source/usbloader/frag.c @@ -282,9 +282,9 @@ int set_frag_list(u8 *id) return ret; // verify id matches - char discid[8]; + char discid[32] ATTRIBUTE_ALIGN(32); memset(discid, 0, sizeof(discid)); - ret = WDVD_UnencryptedRead(discid, 8, 0); + ret = WDVD_UnencryptedRead(discid, 32, 0); gprintf("Reading ID after setting fraglist: %s (expected: %s)\n", discid, id); return (strncasecmp((char *) id, discid, 6) != 0) ? -3 : 0; } diff --git a/svnrev.sh b/svnrev.sh index 6dcd149d..ea571a3c 100644 --- a/svnrev.sh +++ b/svnrev.sh @@ -50,7 +50,7 @@ EOF --ios=250 --usbport=0 - --> // remove this line to enable arguments + // remove this line to enable arguments --> 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.