*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:
strtoul 2012-01-05 22:26:45 +00:00
parent a1e6c04b89
commit b9c86e8db9
6 changed files with 35 additions and 28 deletions

View File

@ -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>

View File

@ -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();

View File

@ -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 */

View File

@ -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

View File

@ -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)

View File

@ -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");