mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-16 00:15:08 +01:00
*fixed reading game titles from disc header on fat32/ntfs/ext (Issue 2034)
*moved low mem and video setup for channels after loading the dol (fixes/corrects video mode, little video flash on startup of channel and might fix some other stuff. hopefully doesn't brake some channels) *removed duplicate memory flush/patches *code optimizations
This commit is contained in:
parent
a1e6c04b89
commit
b9c86e8db9
@ -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>2.3 r1146</version>
|
<version>2.3 r1147</version>
|
||||||
<release_date>201201041810</release_date>
|
<release_date>201201052225</release_date>
|
||||||
<!-- // remove this line to enable arguments
|
<!-- // remove this line to enable arguments
|
||||||
<arguments>
|
<arguments>
|
||||||
<arg>--ios=250</arg>
|
<arg>--ios=250</arg>
|
||||||
|
@ -293,6 +293,9 @@ u32 Channels::LoadChannel(const u64 &chantitle)
|
|||||||
|
|
||||||
if(dolfile->bss_start)
|
if(dolfile->bss_start)
|
||||||
{
|
{
|
||||||
|
if(!(dolfile->bss_start & 0x80000000))
|
||||||
|
dolfile->bss_start |= 0x80000000;
|
||||||
|
|
||||||
ICInvalidateRange((void *)dolfile->bss_start, dolfile->bss_size);
|
ICInvalidateRange((void *)dolfile->bss_start, dolfile->bss_size);
|
||||||
memset((void *)dolfile->bss_start, 0, dolfile->bss_size);
|
memset((void *)dolfile->bss_start, 0, dolfile->bss_size);
|
||||||
DCFlushRange((void *)dolfile->bss_start, dolfile->bss_size);
|
DCFlushRange((void *)dolfile->bss_start, dolfile->bss_size);
|
||||||
@ -303,7 +306,8 @@ u32 Channels::LoadChannel(const u64 &chantitle)
|
|||||||
{
|
{
|
||||||
if (!dolfile->section_size[i]) continue;
|
if (!dolfile->section_size[i]) continue;
|
||||||
if (dolfile->section_pos[i] < sizeof(dolheader)) continue;
|
if (dolfile->section_pos[i] < sizeof(dolheader)) continue;
|
||||||
if(!(dolfile->section_start[i] & 0x80000000)) dolfile->section_start[i] |= 0x80000000;
|
if(!(dolfile->section_start[i] & 0x80000000))
|
||||||
|
dolfile->section_start[i] |= 0x80000000;
|
||||||
|
|
||||||
u8 *dolChunkOffset = (u8 *)dolfile->section_start[i];
|
u8 *dolChunkOffset = (u8 *)dolfile->section_start[i];
|
||||||
u32 dolChunkSize = dolfile->section_size[i];
|
u32 dolChunkSize = dolfile->section_size[i];
|
||||||
@ -317,17 +321,18 @@ u32 Channels::LoadChannel(const u64 &chantitle)
|
|||||||
|
|
||||||
u32 chanEntryPoint = dolfile->entry_point;
|
u32 chanEntryPoint = dolfile->entry_point;
|
||||||
|
|
||||||
|
free(dolfile);
|
||||||
|
|
||||||
// IOS Version Check
|
// IOS Version Check
|
||||||
*(vu32*)0x80003140 = ((ios << 16)) | 0xFFFF;
|
*(vu32*)0x80003140 = ((ios << 16)) | 0xFFFF;
|
||||||
*(vu32*)0x80003188 = ((ios << 16)) | 0xFFFF;
|
*(vu32*)0x80003188 = ((ios << 16)) | 0xFFFF;
|
||||||
DCFlushRange((void *)0x80003140, 32);
|
DCFlushRange((void *)0x80003140, 4);
|
||||||
DCFlushRange((void *)0x80003188, 32);
|
DCFlushRange((void *)0x80003188, 4);
|
||||||
|
|
||||||
// Game ID Online Check
|
// Game ID Online Check
|
||||||
|
memset((void *)0x80000000, 0, 6);
|
||||||
*(vu32 *)0x80000000 = TITLE_LOWER(chantitle);
|
*(vu32 *)0x80000000 = TITLE_LOWER(chantitle);
|
||||||
*(vu32 *)0x80003180 = TITLE_LOWER(chantitle);
|
DCFlushRange((void *)0x80000000, 6);
|
||||||
DCFlushRange((void *)0x80000000, 32);
|
|
||||||
DCFlushRange((void *)0x80003180, 32);
|
|
||||||
|
|
||||||
ISFS_Deinitialize();
|
ISFS_Deinitialize();
|
||||||
|
|
||||||
|
@ -44,12 +44,12 @@ u8 fi[24], ri[24];
|
|||||||
u32 fkey[120];
|
u32 fkey[120];
|
||||||
u32 rkey[120];
|
u32 rkey[120];
|
||||||
|
|
||||||
static u32 pack(u8 *b)
|
static inline u32 pack(u8 *b)
|
||||||
{ /* pack bytes into a 32-bit Word */
|
{ /* pack bytes into a 32-bit Word */
|
||||||
return ((u32 ) b[3] << 24) | ((u32 ) b[2] << 16) | ((u32 ) b[1] << 8) | (u32 ) b[0];
|
return ((u32 ) b[3] << 24) | ((u32 ) b[2] << 16) | ((u32 ) b[1] << 8) | (u32 ) b[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unpack(u32 a, u8 *b)
|
static inline void unpack(u32 a, u8 *b)
|
||||||
{ /* unpack bytes from a word */
|
{ /* unpack bytes from a word */
|
||||||
b[0] = (u8 ) a;
|
b[0] = (u8 ) a;
|
||||||
b[1] = (u8 ) (a >> 8);
|
b[1] = (u8 ) (a >> 8);
|
||||||
@ -57,7 +57,7 @@ static void unpack(u32 a, u8 *b)
|
|||||||
b[3] = (u8 ) (a >> 24);
|
b[3] = (u8 ) (a >> 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 xtime(u8 a)
|
static inline u8 xtime(u8 a)
|
||||||
{
|
{
|
||||||
u8 b;
|
u8 b;
|
||||||
if (a & 0x80)
|
if (a & 0x80)
|
||||||
@ -68,14 +68,14 @@ static u8 xtime(u8 a)
|
|||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 bmul(u8 x, u8 y)
|
static inline u8 bmul(u8 x, u8 y)
|
||||||
{ /* x.y= AntiLog(Log(x) + Log(y)) */
|
{ /* x.y= AntiLog(Log(x) + Log(y)) */
|
||||||
if (x && y)
|
if (x && y)
|
||||||
return ptab[(ltab[x] + ltab[y]) % 255];
|
return ptab[(ltab[x] + ltab[y]) % 255];
|
||||||
else return 0;
|
else return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 SubByte(u32 a)
|
static inline u32 SubByte(u32 a)
|
||||||
{
|
{
|
||||||
u8 b[4];
|
u8 b[4];
|
||||||
unpack(a, b);
|
unpack(a, b);
|
||||||
@ -86,7 +86,7 @@ static u32 SubByte(u32 a)
|
|||||||
return pack(b);
|
return pack(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 product(u32 x, u32 y)
|
static inline u8 product(u32 x, u32 y)
|
||||||
{ /* dot product of two 4-byte arrays */
|
{ /* dot product of two 4-byte arrays */
|
||||||
u8 xb[4], yb[4];
|
u8 xb[4], yb[4];
|
||||||
unpack(x, xb);
|
unpack(x, xb);
|
||||||
@ -94,7 +94,7 @@ static u8 product(u32 x, u32 y)
|
|||||||
return bmul(xb[0], yb[0]) ^ bmul(xb[1], yb[1]) ^ bmul(xb[2], yb[2]) ^ bmul(xb[3], yb[3]);
|
return bmul(xb[0], yb[0]) ^ bmul(xb[1], yb[1]) ^ bmul(xb[2], yb[2]) ^ bmul(xb[3], yb[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 InvMixCol(u32 x)
|
static inline u32 InvMixCol(u32 x)
|
||||||
{ /* matrix Multiplication */
|
{ /* matrix Multiplication */
|
||||||
u32 y, m;
|
u32 y, m;
|
||||||
u8 b[4];
|
u8 b[4];
|
||||||
@ -111,7 +111,7 @@ static u32 InvMixCol(u32 x)
|
|||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 ByteSub(u8 x)
|
static inline u8 ByteSub(u8 x)
|
||||||
{
|
{
|
||||||
u8 y = ptab[255 - ltab[x]]; /* multiplicative inverse */
|
u8 y = ptab[255 - ltab[x]]; /* multiplicative inverse */
|
||||||
x = y;
|
x = y;
|
||||||
@ -127,7 +127,7 @@ u8 ByteSub(u8 x)
|
|||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gentables(void)
|
static inline void gentables(void)
|
||||||
{ /* generate tables */
|
{ /* generate tables */
|
||||||
int i;
|
int i;
|
||||||
u8 y, b[4];
|
u8 y, b[4];
|
||||||
@ -181,7 +181,7 @@ void gentables(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void gkey(int nb, int nk, char *key)
|
static inline void gkey(int nb, int nk, char *key)
|
||||||
{ /* blocksize=32*nb bits. Key=32*nk bits */
|
{ /* blocksize=32*nb bits. Key=32*nk bits */
|
||||||
/* currently nb,bk = 4, 6 or 8 */
|
/* currently nb,bk = 4, 6 or 8 */
|
||||||
/* key comes as 4*Nk bytes */
|
/* key comes as 4*Nk bytes */
|
||||||
|
@ -332,12 +332,12 @@ int GameBooter::BootGame(struct discHdr *gameHdr)
|
|||||||
//! shutdown now and avoid later crashs with free if memory gets overwritten by channel
|
//! shutdown now and avoid later crashs with free if memory gets overwritten by channel
|
||||||
ShutDownDevices(usbport);
|
ShutDownDevices(usbport);
|
||||||
gprintf("\tChannel Boot\n");
|
gprintf("\tChannel Boot\n");
|
||||||
|
// Load dol
|
||||||
|
AppEntrypoint = Channels::LoadChannel(gameHeader.tid);
|
||||||
/* Setup low memory */
|
/* Setup low memory */
|
||||||
Disc_SetLowMem();
|
Disc_SetLowMem();
|
||||||
/* Setup video mode */
|
/* Setup video mode */
|
||||||
Disc_SelectVMode(videoChoice);
|
Disc_SelectVMode(videoChoice);
|
||||||
// Load dol
|
|
||||||
AppEntrypoint = Channels::LoadChannel(gameHeader.tid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! No entrypoint found...back to HBC/SystemMenu
|
//! No entrypoint found...back to HBC/SystemMenu
|
||||||
|
@ -53,9 +53,6 @@ void Disc_SetLowMem(void)
|
|||||||
|
|
||||||
/* Copy disc ID */
|
/* Copy disc ID */
|
||||||
memcpy((void *) Online_Check, (void *) Disc_ID, 4);
|
memcpy((void *) Online_Check, (void *) Disc_ID, 4);
|
||||||
|
|
||||||
/* Flush cache */
|
|
||||||
DCFlushRange((void *) Disc_ID, 0x3F00);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Disc_SelectVMode(u8 videoselected)
|
void Disc_SelectVMode(u8 videoselected)
|
||||||
|
@ -447,10 +447,10 @@ s32 Wbfs_Fat::GetHeadersCount()
|
|||||||
// if we have titles.txt entry use that
|
// if we have titles.txt entry use that
|
||||||
title = GameTitles.GetTitle(id);
|
title = GameTitles.GetTitle(id);
|
||||||
// if no titles.txt get title from dir or file name
|
// if no titles.txt get title from dir or file name
|
||||||
if ((!title || strlen(title) == 0) && *fname_title)
|
if ((!title || *title == 0) && *fname_title != 0)
|
||||||
title = fname_title;
|
title = fname_title;
|
||||||
|
|
||||||
if (title)
|
if (title && *title != 0)
|
||||||
{
|
{
|
||||||
memset(&tmpHdr, 0, sizeof(tmpHdr));
|
memset(&tmpHdr, 0, sizeof(tmpHdr));
|
||||||
memcpy(tmpHdr.id, id, 6);
|
memcpy(tmpHdr.id, id, 6);
|
||||||
@ -459,6 +459,7 @@ s32 Wbfs_Fat::GetHeadersCount()
|
|||||||
goto add_hdr;
|
goto add_hdr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for existing wbfs/iso/ciso file in the directory
|
||||||
if(is_dir)
|
if(is_dir)
|
||||||
{
|
{
|
||||||
if (stat(fpath, &st) != 0)
|
if (stat(fpath, &st) != 0)
|
||||||
@ -474,8 +475,12 @@ s32 Wbfs_Fat::GetHeadersCount()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sanity check
|
||||||
|
if(!fileext)
|
||||||
|
continue;
|
||||||
|
|
||||||
// else read it from file directly
|
// else read it from file directly
|
||||||
if (strcasecmp(strrchr(fpath, '.'), ".wbfs") == 0)
|
if (strcasecmp(fileext, ".wbfs") == 0)
|
||||||
{
|
{
|
||||||
// wbfs file directly
|
// wbfs file directly
|
||||||
FILE *fp = fopen(fpath, "rb");
|
FILE *fp = fopen(fpath, "rb");
|
||||||
@ -505,7 +510,7 @@ s32 Wbfs_Fat::GetHeadersCount()
|
|||||||
goto add_hdr;
|
goto add_hdr;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (strcasecmp(strrchr(fpath, '.'), ".iso") == 0)
|
else if (strcasecmp(fileext, ".iso") == 0)
|
||||||
{
|
{
|
||||||
// iso file
|
// iso file
|
||||||
FILE *fp = fopen(fpath, "rb");
|
FILE *fp = fopen(fpath, "rb");
|
||||||
@ -521,7 +526,7 @@ s32 Wbfs_Fat::GetHeadersCount()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (strcasecmp(strrchr(fpath, '.'), ".ciso") == 0)
|
else if (strcasecmp(fileext, ".ciso") == 0)
|
||||||
{
|
{
|
||||||
// ciso file
|
// ciso file
|
||||||
FILE *fp = fopen(fpath, "rb");
|
FILE *fp = fopen(fpath, "rb");
|
||||||
|
Loading…
Reference in New Issue
Block a user