Tweaks to Elfheader & cdvdReadKey. For the moment, lets not read or write Dev9 memory locations in the null plugin...

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2436 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
arcum42 2010-01-16 12:29:24 +00:00
parent 1aa3f77dad
commit 37611e4eb0
6 changed files with 66 additions and 57 deletions

View File

@ -305,15 +305,30 @@ s32 cdvdWriteConfig(const u8* config)
static MutexLockRecursive Mutex_NewDiskCB; static MutexLockRecursive Mutex_NewDiskCB;
// Sets ElfCRC to the CRC of the game bound to the CDVD plugin.
static __forceinline ElfObject *loadElfCRC( const wxString filename )
{
// Note: calling loadElfFile here causes bad things to happen.
IsoFSCDVD isofs;
IsoFile file(isofs, filename);
ElfObject *elfptr;
elfptr = new ElfObject(filename, file);
elfptr->getCRC();
Console.WriteLn(wxsFormat(L"loadElfCRC(" + filename + L") = %8.8X", ElfCRC));
return elfptr;
}
static __forceinline void _reloadElfInfo(wxString str) static __forceinline void _reloadElfInfo(wxString str)
{ {
ElfObject *elfptr;
// Now's a good time to reload the ELF info... // Now's a good time to reload the ELF info...
ScopedLock locker( Mutex_NewDiskCB ); ScopedLock locker( Mutex_NewDiskCB );
ElfCRC = loadElfCRC(str); elfptr = loadElfCRC(str);
elfptr->applyPatches();
ElfApplyPatches();
GetMTGS().SendGameCRC(ElfCRC);
} }
static __forceinline void reloadElfInfo(u32 discType, wxString str) static __forceinline void reloadElfInfo(u32 discType, wxString str)
@ -334,31 +349,30 @@ static __forceinline void reloadElfInfo(u32 discType, wxString str)
} }
} }
static __forceinline s32 StrToS32(const wxString& str, int base = 10)
{
long l;
str.ToLong(&l, base);
return l;
}
void cdvdReadKey(u8 arg0, u16 arg1, u32 arg2, u8* key) void cdvdReadKey(u8 arg0, u16 arg1, u32 arg2, u8* key)
{ {
s32 numbers, letters; s32 numbers, letters;
u32 key_0_3; u32 key_0_3;
u8 key_4, key_14; u8 key_4, key_14;
wxString fname; wxString fname, exeName;
char exeName[12];
// Get the main elf name. // Get the main elf name.
u32 discType = GetPS2ElfName(fname); u32 discType = GetPS2ElfName(fname);
const wxCharBuffer crap( fname.To8BitData() ); exeName = fname(8, 11);
const char* str = crap.data(); DevCon.Warning(L"exeName = " + exeName);
// convert the number characters to a real 32 bit number
numbers = StrToS32(exeName(5,3) + exeName(9,2));
sprintf(exeName, "%c%c%c%c%c%c%c%c%c%c%c",str[8],str[9],str[10],str[11],str[12],str[13],str[14],str[15],str[16],str[17],str[18]);
DevCon.Warning("exeName = %s", &str[8]);
// convert the number characters to a real 32bit number
numbers = ((((exeName[5] - '0'))*10000) +
(((exeName[ 6] - '0'))*1000) +
(((exeName[ 7] - '0'))*100) +
(((exeName[ 9] - '0'))*10) +
(((exeName[10] - '0'))*1) );
// combine the lower 7 bits of each char // combine the lower 7 bits of each char
// to make the 4 letters fit into a single u32 // to make the 4 letters fit into a single u32
letters = (s32)((exeName[3]&0x7F)<< 0) | letters = (s32)((exeName[3]&0x7F)<< 0) |

View File

@ -169,7 +169,7 @@ ElfObject::ElfObject( const wxString& srcfile, uint hdrsize )
void ElfObject::initElfHeaders() void ElfObject::initElfHeaders()
{ {
Console.WriteLn( L"Initializing Elf: %d bytes", data.GetSizeInBytes()); Console.WriteLn( L"Initializing Elf: %d bytes", data.GetSizeInBytes());
if ( header.e_phnum > 0 ) if ( header.e_phnum > 0 )
proghead = (ELF_PHR*)&data[header.e_phoff]; proghead = (ELF_PHR*)&data[header.e_phoff];
@ -181,7 +181,9 @@ void ElfObject::initElfHeaders()
if ( ( header.e_phnum > 0 ) && ( header.e_phentsize != sizeof(ELF_PHR) ) ) if ( ( header.e_phnum > 0 ) && ( header.e_phentsize != sizeof(ELF_PHR) ) )
Console.Error( "(ELF) Size of program headers is not standard" ); Console.Error( "(ELF) Size of program headers is not standard" );
//getCRC();
const char* elftype = NULL; const char* elftype = NULL;
switch( header.e_type ) switch( header.e_type )
{ {
@ -228,6 +230,8 @@ void ElfObject::initElfHeaders()
ELF_LOG("sh strndx: %08x",header.e_shstrndx); ELF_LOG("sh strndx: %08x",header.e_shstrndx);
ELF_LOG("\n"); ELF_LOG("\n");
//applyPatches();
} }
bool ElfObject::hasProgramHeaders() { return (proghead != NULL); } bool ElfObject::hasProgramHeaders() { return (proghead != NULL); }
@ -267,7 +271,7 @@ void ElfObject::checkElfSize(s64 elfsize)
throw Exception::BadStream( filename, wxLt("Unexpected end of ELF file: ") ); throw Exception::BadStream( filename, wxLt("Unexpected end of ELF file: ") );
} }
u32 ElfObject::getCRC() const void ElfObject::getCRC()
{ {
u32 CRC = 0; u32 CRC = 0;
@ -275,7 +279,7 @@ u32 ElfObject::getCRC() const
for(u32 i=data.GetSizeInBytes()/4; i; --i, ++srcdata) for(u32 i=data.GetSizeInBytes()/4; i; --i, ++srcdata)
CRC ^= *srcdata; CRC ^= *srcdata;
return CRC; ElfCRC = CRC;
} }
void ElfObject::loadProgramHeaders() void ElfObject::loadProgramHeaders()
@ -411,7 +415,7 @@ void ElfObject::loadHeaders()
loadSectionHeaders(); loadSectionHeaders();
} }
void ElfApplyPatches() void ElfObject::applyPatches()
{ {
wxString filename( wxsFormat( L"%8.8x", ElfCRC ) ); wxString filename( wxsFormat( L"%8.8x", ElfCRC ) );
@ -419,21 +423,7 @@ void ElfApplyPatches()
Console.SetTitle(L"Game running [CRC=" + filename +L"]"); Console.SetTitle(L"Game running [CRC=" + filename +L"]");
if (EmuConfig.EnablePatches) InitPatch(filename); if (EmuConfig.EnablePatches) InitPatch(filename);
} GetMTGS().SendGameCRC(ElfCRC);
// Fetches the CRC of the game bound to the CDVD plugin.
u32 loadElfCRC( const wxString filename )
{
// Note: calling loadElfFile here causes bad things to happen.
u32 crcval = 0;
IsoFSCDVD isofs;
IsoFile file(isofs, filename);
crcval = ElfObject(filename, file).getCRC();
Console.WriteLn(wxsFormat(L"loadElfCRC(" + filename + L") = %8.8X", crcval));
return crcval;
} }
// Loads the elf binary data from the specified file into PS2 memory, and injects the ELF's // Loads the elf binary data from the specified file into PS2 memory, and injects the ELF's
@ -504,10 +494,9 @@ void loadElfFile(const wxString& filename)
DevCon.WriteLn( wxsFormat(L"loadElfFile: addr %x \"rom0:OSDSYS\" -> \"" + filename + L"\"", i)); DevCon.WriteLn( wxsFormat(L"loadElfFile: addr %x \"rom0:OSDSYS\" -> \"" + filename + L"\"", i));
} }
} }
ElfCRC = elfptr->getCRC(); elfptr->getCRC();
Console.WriteLn( L"loadElfFile: %s; CRC = %8.8X", filename.c_str(), ElfCRC ); Console.WriteLn( L"loadElfFile: %s; CRC = %8.8X", filename.c_str(), ElfCRC );
ElfApplyPatches(); elfptr->applyPatches();
GetMTGS().SendGameCRC( ElfCRC );
return; return;
} }

View File

@ -155,13 +155,12 @@ class ElfObject
bool hasSectionHeaders(); bool hasSectionHeaders();
bool hasHeaders(); bool hasHeaders();
u32 getCRC() const; void getCRC();
void applyPatches();
}; };
//------------------- //-------------------
extern void loadElfFile(const wxString& filename); extern void loadElfFile(const wxString& filename);
extern u32 loadElfCRC(const wxString filename);
extern void ElfApplyPatches();
extern int GetPS2ElfName( wxString& dest ); extern int GetPS2ElfName( wxString& dest );

View File

@ -200,10 +200,12 @@ Panels::LogOptionsPanel::LogOptionsPanel(wxWindow* parent )
m_SIF = new pxCheckBox( this, L"SIF (EE<->IOP)" ); m_SIF = new pxCheckBox( this, L"SIF (EE<->IOP)" );
m_VIFunpack = new pxCheckBox( this, L"VIFunpack" ); m_VIFunpack = new pxCheckBox( this, L"VIFunpack" );
m_GIFtag = new pxCheckBox( this, L"GIFtag" ); m_GIFtag = new pxCheckBox( this, L"GIFtag" );
m_Elf = new pxCheckBox( this, L"Elves" );
m_SIF ->SetToolTip(_("Enables logging of both SIF DMAs and SIF Register activity.") ); m_SIF ->SetToolTip(_("Enables logging of both SIF DMAs and SIF Register activity.") );
m_VIFunpack ->SetToolTip(_("Special detailed logs of VIF packed data handling (does not include VIF control, status, or hwRegs)")); m_VIFunpack ->SetToolTip(_("Special detailed logs of VIF packed data handling (does not include VIF control, status, or hwRegs)"));
m_GIFtag ->SetToolTip(_("(not implemented yet)")); m_GIFtag ->SetToolTip(_("(not implemented yet)"));
m_Elf ->SetToolTip(_("Logging of Elf headers."));
wxBoxSizer& topSizer = *new wxBoxSizer( wxHORIZONTAL ); wxBoxSizer& topSizer = *new wxBoxSizer( wxHORIZONTAL );
@ -215,6 +217,7 @@ Panels::LogOptionsPanel::LogOptionsPanel(wxWindow* parent )
s_misc += m_SIF; s_misc += m_SIF;
s_misc += m_VIFunpack; s_misc += m_VIFunpack;
s_misc += m_GIFtag; s_misc += m_GIFtag;
s_misc += m_Elf;
*this += m_masterEnabler | StdSpace(); *this += m_masterEnabler | StdSpace();
*this += new wxStaticLine( this, wxID_ANY ) | StdExpand().Border(wxLEFT | wxRIGHT, 20); *this += new wxStaticLine( this, wxID_ANY ) | StdExpand().Border(wxLEFT | wxRIGHT, 20);
@ -233,6 +236,7 @@ void Panels::LogOptionsPanel::OnSettingsChanged()
m_masterEnabler->SetValue( conf.Enabled ); m_masterEnabler->SetValue( conf.Enabled );
m_SIF->SetValue( conf.SIF ); m_SIF->SetValue( conf.SIF );
m_Elf->SetValue( g_Conf->EmuOptions.Log.ELF );
SetCheckValue( EE, VIFunpack ); SetCheckValue( EE, VIFunpack );
SetCheckValue( EE, GIFtag ); SetCheckValue( EE, GIFtag );
@ -248,6 +252,7 @@ void Panels::LogOptionsPanel::OnUpdateEnableAll()
bool enabled( m_masterEnabler->GetValue() ); bool enabled( m_masterEnabler->GetValue() );
m_SIF->Enable( enabled ); m_SIF->Enable( enabled );
m_Elf->Enable( enabled );
m_VIFunpack->Enable( enabled ); m_VIFunpack->Enable( enabled );
m_GIFtag->Enable( enabled ); m_GIFtag->Enable( enabled );
@ -265,9 +270,10 @@ void Panels::LogOptionsPanel::OnCheckBoxClicked(wxCommandEvent &evt)
void Panels::LogOptionsPanel::Apply() void Panels::LogOptionsPanel::Apply()
{ {
if( !m_IsDirty ) return; if( !m_IsDirty ) return;
g_Conf->EmuOptions.Trace.Enabled = m_masterEnabler->GetValue(); g_Conf->EmuOptions.Trace.Enabled = m_masterEnabler->GetValue();
g_Conf->EmuOptions.Trace.SIF = m_SIF->GetValue(); g_Conf->EmuOptions.Trace.SIF = m_SIF->GetValue();
g_Conf->EmuOptions.Log.ELF = m_Elf->GetValue();
g_Conf->EmuOptions.Trace.EE.m_VIFunpack = m_VIFunpack->GetValue(); g_Conf->EmuOptions.Trace.EE.m_VIFunpack = m_VIFunpack->GetValue();
g_Conf->EmuOptions.Trace.EE.m_GIFtag = m_GIFtag->GetValue(); g_Conf->EmuOptions.Trace.EE.m_GIFtag = m_GIFtag->GetValue();

View File

@ -103,6 +103,7 @@ namespace Panels
pxCheckBox* m_masterEnabler; pxCheckBox* m_masterEnabler;
pxCheckBox* m_SIF; pxCheckBox* m_SIF;
pxCheckBox* m_Elf;
pxCheckBox* m_VIFunpack; pxCheckBox* m_VIFunpack;
pxCheckBox* m_GIFtag; pxCheckBox* m_GIFtag;

View File

@ -102,9 +102,9 @@ EXPORT_C_(u8) DEV9read8(u32 addr)
switch(addr) switch(addr)
{ {
// case 0x1F80146E: // DEV9 hardware type (0x32 for an expansion bay) // case 0x1F80146E: // DEV9 hardware type (0x32 for an expansion bay)
case 0x10000038: value = dev9Ru8(addr); break; // We need to have at least one case to avoid warnings. case 0x10000038: /*value = dev9Ru8(addr);*/ break; // We need to have at least one case to avoid warnings.
default: default:
value = dev9Ru8(addr); //value = dev9Ru8(addr);
Dev9Log.WriteLn("*Unknown 8 bit read at address %lx", addr); Dev9Log.WriteLn("*Unknown 8 bit read at address %lx", addr);
break; break;
} }
@ -134,9 +134,9 @@ EXPORT_C_(u16) DEV9read16(u32 addr)
// case 0x1000004E: // status // case 0x1000004E: // status
// case 0x1000005C: // status // case 0x1000005C: // status
// case 0x10000064: // if_ctrl // case 0x10000064: // if_ctrl
case 0x10000038: value = dev9Ru16(addr); break; case 0x10000038: /*value = dev9Ru16(addr);*/ break;
default: default:
value = dev9Ru16(addr); //value = dev9Ru16(addr);
Dev9Log.WriteLn("*Unknown 16 bit read at address %lx", addr); Dev9Log.WriteLn("*Unknown 16 bit read at address %lx", addr);
break; break;
} }
@ -150,9 +150,9 @@ EXPORT_C_(u32 ) DEV9read32(u32 addr)
switch(addr) switch(addr)
{ {
case 0x10000038: value = dev9Ru32(addr); break; case 0x10000038: /*value = dev9Ru32(addr);*/ break;
default: default:
value = dev9Ru32(addr); //value = dev9Ru32(addr);
Dev9Log.WriteLn("*Unknown 32 bit read at address %lx", addr); Dev9Log.WriteLn("*Unknown 32 bit read at address %lx", addr);
break; break;
} }
@ -164,10 +164,10 @@ EXPORT_C_(void) DEV9write8(u32 addr, u8 value)
{ {
switch(addr) switch(addr)
{ {
case 0x10000038: dev9Ru8(addr) = value; break; case 0x10000038: /*dev9Ru8(addr) = value;*/ break;
default: default:
Dev9Log.WriteLn("*Unknown 8 bit write; address %lx = %x", addr, value); Dev9Log.WriteLn("*Unknown 8 bit write; address %lx = %x", addr, value);
dev9Ru8(addr) = value; //dev9Ru8(addr) = value;
break; break;
} }
} }
@ -178,10 +178,10 @@ EXPORT_C_(void) DEV9write16(u32 addr, u16 value)
{ {
// Remember that list on DEV9read16? You'll want to write to a // Remember that list on DEV9read16? You'll want to write to a
// lot of them, too. // lot of them, too.
case 0x10000038: dev9Ru16(addr) = value; break; case 0x10000038: /*dev9Ru16(addr) = value;*/ break;
default: default:
Dev9Log.WriteLn("*Unknown 16 bit write; address %lx = %x", addr, value); Dev9Log.WriteLn("*Unknown 16 bit write; address %lx = %x", addr, value);
dev9Ru16(addr) = value; //dev9Ru16(addr) = value;
break; break;
} }
} }
@ -190,10 +190,10 @@ EXPORT_C_(void) DEV9write32(u32 addr, u32 value)
{ {
switch(addr) switch(addr)
{ {
case 0x10000038: dev9Ru32(addr) = value; break; case 0x10000038: /*dev9Ru32(addr) = value;*/ break;
default: default:
Dev9Log.WriteLn("*Unknown 32 bit write; address %lx = %x", addr, value); Dev9Log.WriteLn("*Unknown 32 bit write; address %lx = %x", addr, value);
dev9Ru32(addr) = value; //dev9Ru32(addr) = value;
break; break;
} }
} }