-updated to version 2.3-
*Fixed creating NMM save file folders in FST mode *Fixed CardFindEntryByName which incorrectly compared file names *Added a hack for Phantasy Star Online 1&2 version 1.0 *GCLoader improvements that include warning the user if an incorrect CONFIG_VERSION is used *Hardcoded the only worthy DVDGetDriveStatus patching, so once again the NODISC cfg doesn't do anything *Removed unused code *Removed unused files git-svn-id: svn://localhost/Users/andi/Downloads/code/trunk@29 be6c1b03-d731-4111-a574-e37d80d43941
This commit is contained in:
parent
e15e2b2d8c
commit
8cebe92a4d
54
Card.c
54
Card.c
|
@ -1,12 +1,16 @@
|
||||||
#include "Card.h"
|
#include "Card.h"
|
||||||
|
|
||||||
FIL CardStat;
|
FIL CardStat;
|
||||||
|
extern u32 FSTMode;
|
||||||
|
extern FIL GameFile;
|
||||||
|
|
||||||
void CardInit( void )
|
void CardInit( void )
|
||||||
{
|
{
|
||||||
FILINFO f;
|
FILINFO f;
|
||||||
u32 i,wrote;
|
u32 i,wrote;
|
||||||
CARDStat CStat;
|
CARDStat CStat;
|
||||||
|
char GameID[0x20];
|
||||||
|
|
||||||
|
|
||||||
memset32( (void*)CARD_BASE, 0xdeadbeef, 0x20 );
|
memset32( (void*)CARD_BASE, 0xdeadbeef, 0x20 );
|
||||||
memset32( (void*)CARD_SHADOW, 0, 0x20 );
|
memset32( (void*)CARD_SHADOW, 0, 0x20 );
|
||||||
|
@ -18,10 +22,20 @@ void CardInit( void )
|
||||||
f_chdir("/saves");
|
f_chdir("/saves");
|
||||||
}
|
}
|
||||||
|
|
||||||
if( f_chdir((const TCHAR*)0) != FR_OK )
|
if( FSTMode )
|
||||||
{
|
{
|
||||||
f_mkdir((const TCHAR*)0);
|
FSTRead( (char*)GameID, 0x20, 0 );
|
||||||
f_chdir((const TCHAR*)0);
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
f_lseek( &GameFile, 0 );
|
||||||
|
f_read( &GameFile, (char*)GameID, 0x20, &wrote );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( f_chdir(GameID) != FR_OK )
|
||||||
|
{
|
||||||
|
f_mkdir(GameID);
|
||||||
|
f_chdir(GameID);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( f_stat( "stats.bin", &f ) )
|
switch( f_stat( "stats.bin", &f ) )
|
||||||
|
@ -57,6 +71,7 @@ void CardInit( void )
|
||||||
|
|
||||||
write32( 0x2FA0, 0 );
|
write32( 0x2FA0, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 CardFindFreeEntry( void )
|
s32 CardFindFreeEntry( void )
|
||||||
{
|
{
|
||||||
CARDStat CStat;
|
CARDStat CStat;
|
||||||
|
@ -88,8 +103,8 @@ s32 CardFindEntryByName( char *Filename )
|
||||||
{
|
{
|
||||||
f_lseek( &CardStat, sizeof(CARDStat) * i );
|
f_lseek( &CardStat, sizeof(CARDStat) * i );
|
||||||
f_read( &CardStat, &CStat, sizeof(CARDStat), &read );
|
f_read( &CardStat, &CStat, sizeof(CARDStat), &read );
|
||||||
|
|
||||||
if( memcmp( Filename, CStat.fileName, strlen(Filename) ) == 0 )
|
if( strcmp( Filename, CStat.fileName ) == 0 )
|
||||||
{
|
{
|
||||||
//dbgprintf("CardFindEntryByName(%d,%s,%s)\n", i, Filename, CStat.fileName );
|
//dbgprintf("CardFindEntryByName(%d,%s,%s)\n", i, Filename, CStat.fileName );
|
||||||
return i;
|
return i;
|
||||||
|
@ -144,7 +159,7 @@ s32 CardFastOpenFile( u32 FileNo, CARDFileInfo *CFInfo )
|
||||||
{
|
{
|
||||||
CARDStat CStat;
|
CARDStat CStat;
|
||||||
FIL savefile;
|
FIL savefile;
|
||||||
s32 fres;
|
s32 Slot,fres;
|
||||||
u32 read;
|
u32 read;
|
||||||
|
|
||||||
if( FileNo >= CARD_MAX_FILES )
|
if( FileNo >= CARD_MAX_FILES )
|
||||||
|
@ -505,10 +520,9 @@ void CardUpdateStats( CARDStat *CStat )
|
||||||
|
|
||||||
CStat->offsetData = Offset;
|
CStat->offsetData = Offset;
|
||||||
}
|
}
|
||||||
u32 Device = 0;
|
|
||||||
void CARDUpdateRegisters( void )
|
void CARDUpdateRegisters( void )
|
||||||
{
|
{
|
||||||
u32 read;
|
u32 read,i;
|
||||||
|
|
||||||
if( read32(CARD_CONTROL) != 0xdeadbeef )
|
if( read32(CARD_CONTROL) != 0xdeadbeef )
|
||||||
{
|
{
|
||||||
|
@ -524,20 +538,17 @@ void CARDUpdateRegisters( void )
|
||||||
|
|
||||||
write32( CARD_CONTROL, 0xdeadbeef );
|
write32( CARD_CONTROL, 0xdeadbeef );
|
||||||
|
|
||||||
#ifdef ACTIVITYLED
|
if( ConfigGetConfig(DML_CFG_ACTIVITY_LED) )
|
||||||
set32( HW_GPIO_OUT, 1<<5 );
|
set32( HW_GPIO_OUT, 1<<5 );
|
||||||
#endif
|
|
||||||
|
|
||||||
while( read32(CARD_CMD) == 0xdeadbeef );
|
while( read32(CARD_CMD) == 0xdeadbeef );
|
||||||
write32( CARD_SCMD, read32(CARD_CMD) );
|
write32( CARD_SCMD, read32(CARD_CMD) );
|
||||||
write32( CARD_CMD, 0xdeadbeef );
|
write32( CARD_CMD, 0xdeadbeef );
|
||||||
|
|
||||||
if( read32(CARD_CMD_1) != 0xdeadbeef )
|
|
||||||
{
|
|
||||||
write32( CARD_SCMD_1, read32(CARD_CMD_1) );
|
|
||||||
write32( CARD_CMD_1, 0xdeadbeef );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
while( read32(CARD_CMD_1) == 0xdeadbeef );
|
||||||
|
write32( CARD_SCMD_1, read32(CARD_CMD_1) );
|
||||||
|
write32( CARD_CMD_1, 0xdeadbeef );
|
||||||
|
|
||||||
if( read32(CARD_CMD_2) != 0xdeadbeef )
|
if( read32(CARD_CMD_2) != 0xdeadbeef )
|
||||||
{
|
{
|
||||||
write32( CARD_SCMD_2, read32(CARD_CMD_2) );
|
write32( CARD_SCMD_2, read32(CARD_CMD_2) );
|
||||||
|
@ -565,12 +576,9 @@ void CARDUpdateRegisters( void )
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
//EXIControl(1);
|
//EXIControl(1);
|
||||||
|
|
||||||
dbgprintf("CARD:Unknown CMD:%08X %08X %08X %08X %08X %08X\n", read32(CARD_SCMD), read32(CARD_SCMD_1), read32(CARD_SCMD_2), read32(CARD_SCMD_3), read32(CARD_SCMD_4), read32(CARD_SCONTROL) );
|
dbgprintf("CARD:Unknown CMD:%08X %08X %08X %08X %08X %08X\n", read32(CARD_SCMD), read32(CARD_SCMD_1), read32(CARD_SCMD_2), read32(CARD_SCMD_3), read32(CARD_SCMD_4), read32(CARD_SCONTROL) );
|
||||||
|
|
||||||
Shutdown();
|
Shutdown();
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
/* CARDOpen( char *FileName ) */
|
/* CARDOpen( char *FileName ) */
|
||||||
case 0xC0:
|
case 0xC0:
|
||||||
{
|
{
|
||||||
|
@ -942,8 +950,8 @@ void CARDUpdateRegisters( void )
|
||||||
#endif
|
#endif
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
#ifdef ACTIVITYLED
|
|
||||||
clear32( HW_GPIO_OUT, 1<<5 );
|
if( ConfigGetConfig(DML_CFG_ACTIVITY_LED) )
|
||||||
#endif
|
clear32( HW_GPIO_OUT, 1<<5 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
10
Config.c
10
Config.c
|
@ -9,15 +9,15 @@ void ConfigInit( DML_CFG *Cfg )
|
||||||
memset32( DMLCfg, 0, sizeof(DML_CFG) );
|
memset32( DMLCfg, 0, sizeof(DML_CFG) );
|
||||||
|
|
||||||
//If a loader supplied any options we use them otherwise use the code defines
|
//If a loader supplied any options we use them otherwise use the code defines
|
||||||
if( Cfg->Magicbytes == 0xD1050CF6 && Cfg->Version == CONFIG_VERSION )
|
if( Cfg->Magicbytes == 0xD1050CF6 )
|
||||||
{
|
{
|
||||||
memcpy( DMLCfg, Cfg, sizeof( DML_CFG ) );
|
memcpy( DMLCfg, Cfg, sizeof( DML_CFG ) );
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
dbgprintf("No config found in RAM\n");
|
dbgprintf("No valid config found in RAM\n");
|
||||||
dbgprintf("Version:%08X\n", DMLCfg->Version );
|
dbgprintf("Version:%08X\n", DMLCfg->Version );
|
||||||
dbgprintf("Config:%08X\n", DMLCfg->Config );
|
dbgprintf("Config :%08X\n", DMLCfg->Config );
|
||||||
|
|
||||||
DMLCfg->Config = 0;
|
DMLCfg->Config = 0;
|
||||||
#ifdef CHEATHOOK
|
#ifdef CHEATHOOK
|
||||||
|
@ -41,9 +41,9 @@ void ConfigInit( DML_CFG *Cfg )
|
||||||
#ifdef PADHOOK
|
#ifdef PADHOOK
|
||||||
DMLCfg->Config |= DML_CFG_PADHOOK;
|
DMLCfg->Config |= DML_CFG_PADHOOK;
|
||||||
#endif
|
#endif
|
||||||
DMLCfg->VideoMode = DML_VID_DML_AUTO;
|
|
||||||
DMLCfg->Version = CONFIG_VERSION;
|
|
||||||
DMLCfg->Magicbytes = 0xD1050CF6;
|
DMLCfg->Magicbytes = 0xD1050CF6;
|
||||||
|
DMLCfg->Version = CONFIG_VERSION;
|
||||||
|
DMLCfg->VideoMode = DML_VID_DML_AUTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check if a memcard is inserted in Slot A
|
//Check if a memcard is inserted in Slot A
|
||||||
|
|
1
Config.h
1
Config.h
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "ipc.h"
|
|
||||||
#include "alloc.h"
|
#include "alloc.h"
|
||||||
#include "vsprintf.h"
|
#include "vsprintf.h"
|
||||||
#include "HW.h"
|
#include "HW.h"
|
||||||
|
|
1
HW.h
1
HW.h
|
@ -4,7 +4,6 @@
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "ipc.h"
|
|
||||||
|
|
||||||
#include "alloc.h"
|
#include "alloc.h"
|
||||||
#include "dip.h"
|
#include "dip.h"
|
||||||
|
|
|
@ -887,8 +887,11 @@ void DoPatches( char *ptr, u32 size, u32 SectionOffset )
|
||||||
|
|
||||||
if( FPatterns[j].Patch == (u8*)DVDGetDriveStatus )
|
if( FPatterns[j].Patch == (u8*)DVDGetDriveStatus )
|
||||||
{
|
{
|
||||||
if( !ConfigGetConfig( DML_CFG_NODISC ) )
|
if( (read32(0) >> 8) != 0x474754 && // Chibi-Robo!
|
||||||
|
(read32(0) >> 8) != 0x475041 ) // Pokémon Channel
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
dbgprintf("Patch:DVDGetDriveStatus\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (FPatterns[j].Length >> 16) == 0xdead )
|
if( (FPatterns[j].Length >> 16) == 0xdead )
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "ipc.h"
|
|
||||||
#include "alloc.h"
|
#include "alloc.h"
|
||||||
#include "ff.h"
|
#include "ff.h"
|
||||||
#include "vsprintf.h"
|
#include "vsprintf.h"
|
||||||
|
|
11
dip.c
11
dip.c
|
@ -37,6 +37,7 @@ char *getfilenamebyoffset(u32 offset)
|
||||||
return (char*)NULL;
|
return (char*)NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DIInit( void )
|
void DIInit( void )
|
||||||
{
|
{
|
||||||
memset32( (void*)DI_BASE, 0xdeadbeef, 0x30 );
|
memset32( (void*)DI_BASE, 0xdeadbeef, 0x30 );
|
||||||
|
@ -53,7 +54,7 @@ u32 DIUpdateRegisters( void )
|
||||||
static u32 PatchState = 0;
|
static u32 PatchState = 0;
|
||||||
static u32 DOLReadSize = 0;
|
static u32 DOLReadSize = 0;
|
||||||
static u32 PSOHack = 0;
|
static u32 PSOHack = 0;
|
||||||
|
|
||||||
if( read32(DI_CONTROL) != 0xdeadbeef )
|
if( read32(DI_CONTROL) != 0xdeadbeef )
|
||||||
{
|
{
|
||||||
write32( DI_SCONTROL, read32(DI_CONTROL) & 3 );
|
write32( DI_SCONTROL, read32(DI_CONTROL) & 3 );
|
||||||
|
@ -102,7 +103,7 @@ u32 DIUpdateRegisters( void )
|
||||||
write32( DI_SIMM, read32(DI_IMM) );
|
write32( DI_SIMM, read32(DI_IMM) );
|
||||||
write32( DI_IMM, 0xdeadbeef );
|
write32( DI_IMM, 0xdeadbeef );
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( read32(DI_SCMD_0) >> 24 )
|
switch( read32(DI_SCMD_0) >> 24 )
|
||||||
{
|
{
|
||||||
case 0xA7:
|
case 0xA7:
|
||||||
|
@ -156,7 +157,8 @@ u32 DIUpdateRegisters( void )
|
||||||
switch( Offset )
|
switch( Offset )
|
||||||
{
|
{
|
||||||
case 0x56B8E7E0: // AppSwitcher [EUR]
|
case 0x56B8E7E0: // AppSwitcher [EUR]
|
||||||
case 0x56C49600: // [USA]
|
case 0x56C49600: // [USA] v1.1
|
||||||
|
case 0x56C4C980: // [USA] v1.0
|
||||||
{
|
{
|
||||||
DMLCfg->Config &= ~(DML_CFG_CHEATS|DML_CFG_PADHOOK|DML_CFG_DEBUGGER|DML_CFG_DEBUGWAIT);
|
DMLCfg->Config &= ~(DML_CFG_CHEATS|DML_CFG_PADHOOK|DML_CFG_DEBUGGER|DML_CFG_DEBUGWAIT);
|
||||||
|
|
||||||
|
@ -164,7 +166,8 @@ u32 DIUpdateRegisters( void )
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case 0x5668FE20: // psov3.dol [EUR]
|
case 0x5668FE20: // psov3.dol [EUR]
|
||||||
case 0x56750660: // [USA]
|
case 0x56750660: // [USA] v1.1
|
||||||
|
case 0x56753EC0: // [USA] v1.0
|
||||||
{
|
{
|
||||||
PSOHack = 1;
|
PSOHack = 1;
|
||||||
} break;
|
} break;
|
||||||
|
|
2
global.h
2
global.h
|
@ -15,7 +15,7 @@
|
||||||
#define PADHOOK 1
|
#define PADHOOK 1
|
||||||
|
|
||||||
#define CONFIG_VERSION 0x00000002
|
#define CONFIG_VERSION 0x00000002
|
||||||
#define DM_VERSION 0x00020002
|
#define DM_VERSION 0x00020003
|
||||||
|
|
||||||
#define DI_SUCCESS 1
|
#define DI_SUCCESS 1
|
||||||
#define DI_ERROR 2
|
#define DI_ERROR 2
|
||||||
|
|
67
ipc.h
67
ipc.h
|
@ -1,67 +0,0 @@
|
||||||
#ifndef __IPC_H__
|
|
||||||
#define __IPC_H__ 1
|
|
||||||
|
|
||||||
struct ioctl_vector {
|
|
||||||
void *data;
|
|
||||||
unsigned int len;
|
|
||||||
} __attribute__((packed));
|
|
||||||
|
|
||||||
struct ipcmessage
|
|
||||||
{
|
|
||||||
unsigned int command; // 0
|
|
||||||
unsigned int result; // 4
|
|
||||||
union
|
|
||||||
{
|
|
||||||
unsigned int fd; // 8
|
|
||||||
};
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
char *device; // 12
|
|
||||||
unsigned int mode; // 16
|
|
||||||
unsigned int resultfd; // 20
|
|
||||||
} open;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
void *data;
|
|
||||||
unsigned int length;
|
|
||||||
} read, write;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
int offset;
|
|
||||||
int origin;
|
|
||||||
} seek;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
unsigned int command;
|
|
||||||
|
|
||||||
unsigned int *buffer_in;
|
|
||||||
unsigned int length_in;
|
|
||||||
unsigned int *buffer_io;
|
|
||||||
unsigned int length_io;
|
|
||||||
} ioctl;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
unsigned int command; // C
|
|
||||||
|
|
||||||
unsigned int argc_in; // 10
|
|
||||||
unsigned int argc_io; // 14
|
|
||||||
struct ioctl_vector *argv; // 18
|
|
||||||
} ioctlv;
|
|
||||||
};
|
|
||||||
} __attribute__((packed)) ipcmessage;
|
|
||||||
|
|
||||||
#define IOS_OPEN 0x01
|
|
||||||
#define IOS_CLOSE 0x02
|
|
||||||
#define IOS_READ 0x03
|
|
||||||
#define IOS_WRITE 0x04
|
|
||||||
#define IOS_SEEK 0x05
|
|
||||||
#define IOS_IOCTL 0x06
|
|
||||||
#define IOS_IOCTLV 0x07
|
|
||||||
|
|
||||||
#endif
|
|
1
main.c
1
main.c
|
@ -7,7 +7,6 @@ Copyright (C) 2010-2012 crediar
|
||||||
*/
|
*/
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "ipc.h"
|
|
||||||
#include "alloc.h"
|
#include "alloc.h"
|
||||||
#include "ff.h"
|
#include "ff.h"
|
||||||
#include "diskio.h"
|
#include "diskio.h"
|
||||||
|
|
Loading…
Reference in New Issue