Move the HLE hack of setting.txt file redirection to the BS2Emu
we already copy the file to memory here, now we also copy the file to 1/2/data/ This should really fix issue 4287. Thanks to hosigumayuugi for finding the exact cause of the issue git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7521 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
9222a818ae
commit
69645d421b
|
@ -121,6 +121,7 @@
|
||||||
#define GC_MEMCARDA "MemoryCardA"
|
#define GC_MEMCARDA "MemoryCardA"
|
||||||
#define GC_MEMCARDB "MemoryCardB"
|
#define GC_MEMCARDB "MemoryCardB"
|
||||||
|
|
||||||
|
#define WII_SETTING. "setting.txt"
|
||||||
#define WII_EUR_SETTING "setting-eur.txt"
|
#define WII_EUR_SETTING "setting-eur.txt"
|
||||||
#define WII_USA_SETTING "setting-usa.txt"
|
#define WII_USA_SETTING "setting-usa.txt"
|
||||||
#define WII_JAP_SETTING "setting-jpn.txt"
|
#define WII_JAP_SETTING "setting-jpn.txt"
|
||||||
|
|
|
@ -121,7 +121,7 @@ bool Delete(const std::string &filename)
|
||||||
// We can't delete a directory
|
// We can't delete a directory
|
||||||
if (IsDirectory(filename))
|
if (IsDirectory(filename))
|
||||||
{
|
{
|
||||||
WARN_LOG(COMMON, "Delete: %s is a directory", filename.c_str());
|
WARN_LOG(COMMON, "Delete failed: %s is a directory", filename.c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -235,7 +235,7 @@ void SysConf::GenerateSysConf()
|
||||||
|
|
||||||
// IPL.SADR
|
// IPL.SADR
|
||||||
current_offset += create_item(items[7], Type_BigArray, "IPL.SADR", 0x1007, current_offset);
|
current_offset += create_item(items[7], Type_BigArray, "IPL.SADR", 0x1007, current_offset);
|
||||||
items[7].data[0] = 0x6c;
|
items[7].data[0] = 0x6c; //(Switzerland) TODO should this default be changed?
|
||||||
|
|
||||||
// IPL.CB
|
// IPL.CB
|
||||||
current_offset += create_item(items[8], Type_Long, "IPL.CB", 4, current_offset);
|
current_offset += create_item(items[8], Type_Long, "IPL.CB", 4, current_offset);
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
#include "CommonPaths.h"
|
#include "CommonPaths.h"
|
||||||
#include "FileUtil.h"
|
#include "FileUtil.h"
|
||||||
|
#include "NandPaths.h"
|
||||||
|
|
||||||
#include "../PowerPC/PowerPC.h"
|
#include "../PowerPC/PowerPC.h"
|
||||||
#include "../Core.h"
|
#include "../Core.h"
|
||||||
|
@ -181,39 +182,47 @@ bool CBoot::SetupWiiMemory(unsigned int _CountryCode)
|
||||||
// \title\00000001\00000002\data\setting.txt directly after the read the
|
// \title\00000001\00000002\data\setting.txt directly after the read the
|
||||||
// SYSCONF file. The games also read it to 0x3800, what is a little strange
|
// SYSCONF file. The games also read it to 0x3800, what is a little strange
|
||||||
// however is that it only reads the first 100 bytes of it.
|
// however is that it only reads the first 100 bytes of it.
|
||||||
std::string filename(File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_EUR_SETTING);
|
std::string region_filename,
|
||||||
|
settings_Filename(Common::CreateTitleDataPath(TITLEID_SYSMENU)+ DIR_SEP + WII_SETTING);
|
||||||
|
|
||||||
switch((DiscIO::IVolume::ECountry)_CountryCode)
|
switch((DiscIO::IVolume::ECountry)_CountryCode)
|
||||||
{
|
{
|
||||||
case DiscIO::IVolume::COUNTRY_KOREA:
|
case DiscIO::IVolume::COUNTRY_KOREA:
|
||||||
case DiscIO::IVolume::COUNTRY_TAIWAN:
|
case DiscIO::IVolume::COUNTRY_TAIWAN:
|
||||||
// TODO: Determine if Korea / Taiwan have their own specific settings.
|
// TODO: Determine if Korea / Taiwan have their own specific settings.
|
||||||
case DiscIO::IVolume::COUNTRY_JAPAN:
|
case DiscIO::IVolume::COUNTRY_JAPAN:
|
||||||
filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_JAP_SETTING;
|
region_filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_JAP_SETTING;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DiscIO::IVolume::COUNTRY_USA:
|
case DiscIO::IVolume::COUNTRY_USA:
|
||||||
filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_USA_SETTING;
|
region_filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_USA_SETTING;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DiscIO::IVolume::COUNTRY_EUROPE:
|
case DiscIO::IVolume::COUNTRY_EUROPE:
|
||||||
filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_EUR_SETTING;
|
region_filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_EUR_SETTING;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// PanicAlertT("SetupWiiMem: Unknown country. Wii boot process will be switched to European settings.");
|
// PanicAlertT("SetupWiiMem: Unknown country. Wii boot process will be switched to European settings.");
|
||||||
filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_EUR_SETTING;
|
region_filename = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP + WII_EUR_SETTING;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
File::IOFile pTmp(filename, "rb");
|
if (File::Exists(settings_Filename))
|
||||||
if (!pTmp)
|
{
|
||||||
|
File::Delete(settings_Filename);
|
||||||
|
}
|
||||||
|
File::CreateFullPath(settings_Filename);
|
||||||
|
File::Copy(region_filename, settings_Filename);
|
||||||
|
File::IOFile settingsFile(settings_Filename, "rb");
|
||||||
|
if (!settingsFile)
|
||||||
{
|
{
|
||||||
PanicAlertT("SetupWiiMem: Cant find setting file");
|
PanicAlertT("SetupWiiMem: Cant find setting file");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
pTmp.ReadBytes(Memory::GetPointer(0x3800), 256);
|
settingsFile.ReadBytes(Memory::GetPointer(0x3800), 256);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -200,32 +200,6 @@ IWII_IPC_HLE_Device* CreateFileIO(u32 _DeviceID, const std::string& _rDeviceName
|
||||||
return pDevice;
|
return pDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to make sure the game is always reading the setting.txt file we provide
|
|
||||||
void CopySettingsFile(std::string& DeviceName)
|
|
||||||
{
|
|
||||||
std::string Source = File::GetSysDirectory() + WII_SYS_DIR + DIR_SEP;
|
|
||||||
if(SConfig::GetInstance().m_LocalCoreStartupParameter.bNTSC)
|
|
||||||
Source += "setting-usa.txt";
|
|
||||||
else
|
|
||||||
Source += "setting-eur.txt";
|
|
||||||
|
|
||||||
std::string Target = File::GetUserPath(D_WIIUSER_IDX) + DeviceName;
|
|
||||||
|
|
||||||
// Check if the target dir exists, otherwise create it
|
|
||||||
std::string TargetDir = Target.substr(0, Target.find_last_of(DIR_SEP));
|
|
||||||
if (!File::IsDirectory(TargetDir))
|
|
||||||
File::CreateFullPath(Target);
|
|
||||||
|
|
||||||
if (File::Copy(Source, Target))
|
|
||||||
{
|
|
||||||
INFO_LOG(WII_IPC_FILEIO, "FS: Copied %s to %s", Source.c_str(), Target.c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ERROR_LOG(WII_IPC_FILEIO, "Could not copy %s to %s", Source.c_str(), Target.c_str());
|
|
||||||
PanicAlertT("Could not copy %s to %s", Source.c_str(), Target.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DoState(PointerWrap &p)
|
void DoState(PointerWrap &p)
|
||||||
{
|
{
|
||||||
|
@ -292,10 +266,6 @@ void ExecuteCommand(u32 _Address)
|
||||||
std::string DeviceName;
|
std::string DeviceName;
|
||||||
Memory::GetString(DeviceName, Memory::Read_U32(_Address + 0xC));
|
Memory::GetString(DeviceName, Memory::Read_U32(_Address + 0xC));
|
||||||
|
|
||||||
// The game may try to read setting.txt here, in that case copy it so it can read it
|
|
||||||
if (DeviceName.find("setting.txt") != std::string::npos)
|
|
||||||
CopySettingsFile(DeviceName);
|
|
||||||
|
|
||||||
u32 Mode = Memory::Read_U32(_Address + 0x10);
|
u32 Mode = Memory::Read_U32(_Address + 0x10);
|
||||||
DeviceID = GetDeviceIDByName(DeviceName);
|
DeviceID = GetDeviceIDByName(DeviceName);
|
||||||
|
|
||||||
|
@ -330,10 +300,13 @@ void ExecuteCommand(u32 _Address)
|
||||||
pDevice = AccessDeviceByID(DeviceID);
|
pDevice = AccessDeviceByID(DeviceID);
|
||||||
CmdSuccess = pDevice->Open(_Address, Mode);
|
CmdSuccess = pDevice->Open(_Address, Mode);
|
||||||
|
|
||||||
|
if(strcmp(pDevice->GetDeviceName().c_str(), "/dev/net/kd/request"))
|
||||||
|
{
|
||||||
INFO_LOG(WII_IPC_FILEIO, "IOP: ReOpen (Device=%s, DeviceID=%08x, Mode=%i)",
|
INFO_LOG(WII_IPC_FILEIO, "IOP: ReOpen (Device=%s, DeviceID=%08x, Mode=%i)",
|
||||||
pDevice->GetDeviceName().c_str(), DeviceID, Mode);
|
pDevice->GetDeviceName().c_str(), DeviceID, Mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case COMMAND_CLOSE_DEVICE:
|
case COMMAND_CLOSE_DEVICE:
|
||||||
|
|
|
@ -52,8 +52,6 @@ IWII_IPC_HLE_Device* AccessDeviceByID(u32 _ID);
|
||||||
|
|
||||||
void DeleteDeviceByID(u32 _ID);
|
void DeleteDeviceByID(u32 _ID);
|
||||||
|
|
||||||
void CopySettingsFile(std::string& DeviceName);
|
|
||||||
|
|
||||||
IWII_IPC_HLE_Device* CreateFileIO(u32 _DeviceID, const std::string& _rDeviceName);
|
IWII_IPC_HLE_Device* CreateFileIO(u32 _DeviceID, const std::string& _rDeviceName);
|
||||||
|
|
||||||
// Update
|
// Update
|
||||||
|
|
Loading…
Reference in New Issue