change references to this strange "bios" thing to BS2 internally, IPL for gui stuff (figured it's easier...) :)
dolphin loads unmodified bootrom dumps now, instead of pre-descrambled ones. -should we allow loading pre-descrambled dumps still? yes, segher is a supercomputer! also make it so we only display the "failed to load fonts" message when they are accessed, like bushing suggested git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4395 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
92b0d620b9
commit
480b648ed5
|
@ -710,6 +710,14 @@
|
|||
RelativePath=".\Src\Hw\EXI_DeviceAD16.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\HW\EXI_DeviceAMBaseboard.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\HW\EXI_DeviceAMBaseboard.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\HW\EXI_DeviceEthernet.cpp"
|
||||
>
|
||||
|
@ -782,6 +790,14 @@
|
|||
RelativePath=".\Src\HW\SI_Device.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\HW\SI_DeviceAMBaseboard.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\HW\SI_DeviceAMBaseboard.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\HW\SI_DeviceGBA.cpp"
|
||||
>
|
||||
|
@ -1976,7 +1992,7 @@
|
|||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\Boot\Boot_BIOSEmu.cpp"
|
||||
RelativePath=".\Src\Boot\Boot_BS2Emu.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
|
|
|
@ -95,8 +95,8 @@ std::string CBoot::GenerateMapFilename()
|
|||
char tmpBuffer[32];
|
||||
sprintf(tmpBuffer, "%08x_%08x", (u32)(TitleID >> 32) & 0xFFFFFFFF , (u32)TitleID & 0xFFFFFFFF );
|
||||
return FULL_MAPS_DIR + std::string(tmpBuffer) + ".map";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SCoreStartupParameter::BOOT_ELF:
|
||||
|
@ -136,17 +136,23 @@ bool CBoot::LoadMapFromFilename(const std::string &_rFilename, const char *_game
|
|||
return success;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Load a GC or Wii BIOS file
|
||||
bool CBoot::Load_BIOS(const std::string& _rBiosFilename)
|
||||
// This function does *some* of what BS1 does: loading IPL(BS2) and jumping to it
|
||||
// It does not initialize the hardware or anything else like BS1 does
|
||||
// We should eventually just load BS1 and let it take care of everything :)
|
||||
bool CBoot::Load_BS2(const std::string& _rBootROMFilename)
|
||||
{
|
||||
// Load the whole ROM dump
|
||||
std::string data;
|
||||
if (!File::ReadFileToString(false, _rBiosFilename.c_str(), data))
|
||||
if (!File::ReadFileToString(false, _rBootROMFilename.c_str(), data))
|
||||
return false;
|
||||
|
||||
Memory::WriteBigEData((const u8*)data.data() + 0x820, 0x81300000, (int)data.size() - 0x820);
|
||||
PC = 0x81300000;
|
||||
// Run the descrambler over the encrypted section containing BS1/BS2
|
||||
CEXIIPL::Descrambler((u8*)data.data()+0x100, 0x1AFE00);
|
||||
|
||||
//File::WriteStringToFile(false, data, "decrypted_bs1_bs2.bin");
|
||||
//Memory::WriteBigEData((const u8*)data.data() + 0x100, 0x81200000, 0x700);
|
||||
Memory::WriteBigEData((const u8*)data.data() + 0x820, 0x81300000, 0x1AFE00);
|
||||
PC = 0x81300000;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -189,29 +195,28 @@ bool CBoot::BootUp()
|
|||
|
||||
DVDInterface::SetDiscInside(VolumeHandler::IsValid());
|
||||
|
||||
// Use HLE BIOS or not
|
||||
if (_StartupPara.bHLEBios)
|
||||
// HLE BS2 or not
|
||||
if (_StartupPara.bHLE_BS2)
|
||||
{
|
||||
if (!VolumeHandler::IsWii())
|
||||
EmulatedBIOS(bDebugIsoBootup);
|
||||
EmulatedBS2(bDebugIsoBootup);
|
||||
else
|
||||
{
|
||||
_StartupPara.bWii = true;
|
||||
EmulatedBIOS_Wii(bDebugIsoBootup);
|
||||
EmulatedBS2_Wii(bDebugIsoBootup);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// If we can't load the BIOS file we use the HLE BIOS instead
|
||||
if (!Load_BIOS(_StartupPara.m_strBios))
|
||||
// If we can't load the bootrom file we HLE it instead
|
||||
if (!Load_BS2(_StartupPara.m_strBootROM))
|
||||
{
|
||||
// fails to load a BIOS so HLE it
|
||||
if (!VolumeHandler::IsWii())
|
||||
EmulatedBIOS(bDebugIsoBootup);
|
||||
EmulatedBS2(bDebugIsoBootup);
|
||||
else
|
||||
{
|
||||
_StartupPara.bWii = true;
|
||||
EmulatedBIOS_Wii(bDebugIsoBootup);
|
||||
EmulatedBS2_Wii(bDebugIsoBootup);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -237,19 +242,19 @@ bool CBoot::BootUp()
|
|||
PanicAlert("Warning - starting DOL in wrong console mode!");
|
||||
}
|
||||
|
||||
// stop apploader from running when BIOS boots
|
||||
// stop apploader from running when the BS2 HLE funcs run
|
||||
VolumeHandler::SetVolumeName("");
|
||||
|
||||
if (dolWii)
|
||||
{
|
||||
EmulatedBIOS_Wii(false);
|
||||
EmulatedBS2_Wii(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!VolumeHandler::IsWii() && !_StartupPara.m_strDefaultGCM.empty())
|
||||
{
|
||||
VolumeHandler::SetVolumeName(_StartupPara.m_strDefaultGCM.c_str());
|
||||
EmulatedBIOS(false);
|
||||
EmulatedBS2(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -282,19 +287,19 @@ bool CBoot::BootUp()
|
|||
PanicAlert("Warning - starting ELF in wrong console mode!");
|
||||
}
|
||||
|
||||
// stop apploader from running when BIOS boots
|
||||
// stop apploader from running when the BS2 HLE funcs run
|
||||
VolumeHandler::SetVolumeName("");
|
||||
|
||||
if (elfWii)
|
||||
{
|
||||
EmulatedBIOS_Wii(false);
|
||||
EmulatedBS2_Wii(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!VolumeHandler::IsWii() && !_StartupPara.m_strDefaultGCM.empty())
|
||||
{
|
||||
VolumeHandler::SetVolumeName(_StartupPara.m_strDefaultGCM.c_str());
|
||||
EmulatedBIOS(false);
|
||||
EmulatedBS2(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -342,12 +347,12 @@ bool CBoot::BootUp()
|
|||
break;
|
||||
|
||||
|
||||
// BIOS
|
||||
// Bootstrap 2 (AKA: Initial Program Loader, "BIOS")
|
||||
// ===================================================================================
|
||||
case SCoreStartupParameter::BOOT_BIOS:
|
||||
case SCoreStartupParameter::BOOT_BS2:
|
||||
{
|
||||
DVDInterface::SetDiscInside(VolumeHandler::IsValid());
|
||||
if (Load_BIOS(_StartupPara.m_strBios))
|
||||
if (Load_BS2(_StartupPara.m_strBootROM))
|
||||
{
|
||||
if (LoadMapFromFilename(_StartupPara.m_strFilename))
|
||||
HLE::PatchFunctions();
|
||||
|
|
|
@ -36,8 +36,6 @@ public:
|
|||
static bool Install_WiiWAD(const char *filename);
|
||||
|
||||
private:
|
||||
enum { BIOS_SIZE = 2*1024*1024 };
|
||||
|
||||
static void RunFunction(u32 _iAddr);
|
||||
|
||||
static void UpdateDebugger_MapLoaded(const char* _gameID = NULL);
|
||||
|
@ -46,9 +44,9 @@ private:
|
|||
static bool Boot_ELF(const char *filename);
|
||||
static bool Boot_WiiWAD(const char *filename);
|
||||
|
||||
static void EmulatedBIOS(bool _bDebug);
|
||||
static bool EmulatedBIOS_Wii(bool _bDebug);
|
||||
static bool Load_BIOS(const std::string& _rBiosFilename);
|
||||
static void EmulatedBS2(bool _bDebug);
|
||||
static bool EmulatedBS2_Wii(bool _bDebug);
|
||||
static bool Load_BS2(const std::string& _rBootROMFilename);
|
||||
static void Load_FST(bool _bIsWii);
|
||||
|
||||
static bool SetupWiiMemory(unsigned int _CountryCode);
|
||||
|
|
|
@ -44,13 +44,12 @@ void CBoot::RunFunction(u32 _iAddr)
|
|||
}
|
||||
|
||||
// __________________________________________________________________________________________________
|
||||
//
|
||||
// GameCube BIOS HLE:
|
||||
// GameCube Bootstrap 2 HLE:
|
||||
// copy the apploader to 0x81200000
|
||||
// execute the apploader, function by function, using the above utility.
|
||||
void CBoot::EmulatedBIOS(bool _bDebug)
|
||||
void CBoot::EmulatedBS2(bool _bDebug)
|
||||
{
|
||||
INFO_LOG(BOOT, "Faking GC BIOS...");
|
||||
INFO_LOG(BOOT, "Faking GC BS2...");
|
||||
UReg_MSR& m_MSR = ((UReg_MSR&)PowerPC::ppcState.msr);
|
||||
m_MSR.FP = 1;
|
||||
|
||||
|
@ -153,14 +152,14 @@ void CBoot::EmulatedBIOS(bool _bDebug)
|
|||
// return
|
||||
PC = PowerPC::ppcState.gpr[3];
|
||||
|
||||
// --- preinit some stuff from bios ---
|
||||
// --- preinit some stuff from IPL ---
|
||||
|
||||
// Bus Clock Speed
|
||||
Memory::Write_U32(0x09a7ec80, 0x800000F8);
|
||||
// CPU Clock Speed
|
||||
Memory::Write_U32(0x1cf7c580, 0x800000FC);
|
||||
|
||||
// fake the VI Init of the BIOS
|
||||
// fake the VI Init of the IPL
|
||||
Memory::Write_U32(SConfig::GetInstance().m_LocalCoreStartupParameter.bNTSC
|
||||
? 0 : 1, 0x800000CC);
|
||||
|
||||
|
@ -277,7 +276,7 @@ bool CBoot::SetupWiiMemory(unsigned int _CountryCode)
|
|||
Memory::Write_U16(0x0000, 0x000030e0); // PADInit
|
||||
Memory::Write_U32(0x80000000, 0x00003184); // GameID Address
|
||||
|
||||
// Fake the VI Init of the BIOS
|
||||
// Fake the VI Init of the IPL
|
||||
Memory::Write_U32(SConfig::GetInstance().m_LocalCoreStartupParameter.bNTSC ? 0 : 1, 0x000000CC);
|
||||
|
||||
// Clear exception handler. Why? Don't we begin with only zeros?
|
||||
|
@ -289,14 +288,12 @@ bool CBoot::SetupWiiMemory(unsigned int _CountryCode)
|
|||
}
|
||||
|
||||
// __________________________________________________________________________________________________
|
||||
//
|
||||
// Wii BIOS HLE:
|
||||
// Wii Bootstrap 2 HLE:
|
||||
// copy the apploader to 0x81200000
|
||||
// execute the apploader
|
||||
//
|
||||
bool CBoot::EmulatedBIOS_Wii(bool _bDebug)
|
||||
bool CBoot::EmulatedBS2_Wii(bool _bDebug)
|
||||
{
|
||||
INFO_LOG(BOOT, "Faking Wii BIOS...");
|
||||
INFO_LOG(BOOT, "Faking Wii BS2...");
|
||||
|
||||
// setup wii memory
|
||||
DiscIO::IVolume::ECountry CountryCode = DiscIO::IVolume::COUNTRY_UNKNOWN;
|
|
@ -96,7 +96,7 @@ void SConfig::SaveSettings()
|
|||
ini.Set("GameList", "ListUsa", m_ListUsa);
|
||||
|
||||
// Core
|
||||
ini.Set("Core", "HLEBios", m_LocalCoreStartupParameter.bHLEBios);
|
||||
ini.Set("Core", "HLE_BS2", m_LocalCoreStartupParameter.bHLE_BS2);
|
||||
ini.Set("Core", "UseDynarec", m_LocalCoreStartupParameter.bUseJIT);
|
||||
ini.Set("Core", "UseDualCore", m_LocalCoreStartupParameter.bUseDualCore);
|
||||
ini.Set("Core", "DSPThread", m_LocalCoreStartupParameter.bDSPThread);
|
||||
|
@ -208,7 +208,7 @@ void SConfig::LoadSettings()
|
|||
ini.Get("GameList", "ListUsa", &m_ListUsa, true);
|
||||
|
||||
// Core
|
||||
ini.Get("Core", "HLEBios", &m_LocalCoreStartupParameter.bHLEBios, true);
|
||||
ini.Get("Core", "HLE_BS2", &m_LocalCoreStartupParameter.bHLE_BS2, true);
|
||||
ini.Get("Core", "UseDynarec", &m_LocalCoreStartupParameter.bUseJIT, true);
|
||||
ini.Get("Core", "DSPThread", &m_LocalCoreStartupParameter.bDSPThread, true);
|
||||
ini.Get("Core", "UseDualCore", &m_LocalCoreStartupParameter.bUseDualCore, false);
|
||||
|
|
|
@ -61,11 +61,11 @@ void SCoreStartupParameter::LoadDefaults()
|
|||
m_strUniqueID = "00000000";
|
||||
}
|
||||
|
||||
bool SCoreStartupParameter::AutoSetup(EBootBios _BootBios)
|
||||
bool SCoreStartupParameter::AutoSetup(EBootBS2 _BootBS2)
|
||||
{
|
||||
std::string Region(EUR_DIR);
|
||||
|
||||
switch (_BootBios)
|
||||
switch (_BootBS2)
|
||||
{
|
||||
case BOOT_DEFAULT:
|
||||
{
|
||||
|
@ -191,19 +191,19 @@ bool SCoreStartupParameter::AutoSetup(EBootBios _BootBios)
|
|||
}
|
||||
break;
|
||||
|
||||
case BOOT_BIOS_USA:
|
||||
case BOOT_BS2_USA:
|
||||
Region = USA_DIR;
|
||||
m_strFilename.clear();
|
||||
bNTSC = true;
|
||||
break;
|
||||
|
||||
case BOOT_BIOS_JAP:
|
||||
case BOOT_BS2_JAP:
|
||||
Region = JAP_DIR;
|
||||
m_strFilename.clear();
|
||||
bNTSC = true;
|
||||
break;
|
||||
|
||||
case BOOT_BIOS_EUR:
|
||||
case BOOT_BS2_EUR:
|
||||
Region = EUR_DIR;
|
||||
m_strFilename.clear();
|
||||
bNTSC = false;
|
||||
|
@ -216,20 +216,20 @@ bool SCoreStartupParameter::AutoSetup(EBootBios _BootBios)
|
|||
m_strSRAM = GC_SRAM_FILE;
|
||||
if (!bWii)
|
||||
{
|
||||
m_strBios = File::GetSysDirectory() + GC_SYS_DIR + DIR_SEP + Region + DIR_SEP GC_IPL;
|
||||
if (!bHLEBios)
|
||||
m_strBootROM = File::GetSysDirectory() + GC_SYS_DIR + DIR_SEP + Region + DIR_SEP GC_IPL;
|
||||
if (!bHLE_BS2)
|
||||
{
|
||||
if (!File::Exists(m_strBios.c_str()))
|
||||
if (!File::Exists(m_strBootROM.c_str()))
|
||||
{
|
||||
WARN_LOG(BOOT, "BIOS file %s not found - using HLE.", m_strBios.c_str());
|
||||
bHLEBios = true;
|
||||
WARN_LOG(BOOT, "bootrom file %s not found - using HLE.", m_strBootROM.c_str());
|
||||
bHLE_BS2 = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bWii && !bHLEBios)
|
||||
else if (bWii && !bHLE_BS2)
|
||||
{
|
||||
WARN_LOG(BOOT, "GC BIOS file will not be loaded for Wii mode.");
|
||||
bHLEBios = true;
|
||||
WARN_LOG(BOOT, "GC bootrom file will not be loaded for Wii mode.");
|
||||
bHLE_BS2 = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -60,7 +60,7 @@ struct SCoreStartupParameter
|
|||
bool bDSPThread;
|
||||
bool bSkipIdle;
|
||||
bool bNTSC;
|
||||
bool bHLEBios;
|
||||
bool bHLE_BS2;
|
||||
bool bUseFastMem;
|
||||
bool bLockThreads;
|
||||
bool bOptimizeQuantizers;
|
||||
|
@ -81,12 +81,12 @@ struct SCoreStartupParameter
|
|||
bool bConfirmStop, bHideCursor, bAutoHideCursor, bUsePanicHandlers;
|
||||
int iTheme;
|
||||
|
||||
enum EBootBios
|
||||
enum EBootBS2
|
||||
{
|
||||
BOOT_DEFAULT,
|
||||
BOOT_BIOS_JAP,
|
||||
BOOT_BIOS_USA,
|
||||
BOOT_BIOS_EUR,
|
||||
BOOT_BS2_JAP,
|
||||
BOOT_BS2_USA,
|
||||
BOOT_BS2_EUR,
|
||||
};
|
||||
|
||||
enum EBootType
|
||||
|
@ -95,7 +95,7 @@ struct SCoreStartupParameter
|
|||
BOOT_ELF,
|
||||
BOOT_DOL,
|
||||
BOOT_WII_NAND,
|
||||
BOOT_BIOS
|
||||
BOOT_BS2
|
||||
};
|
||||
EBootType m_BootType;
|
||||
|
||||
|
@ -106,7 +106,7 @@ struct SCoreStartupParameter
|
|||
std::string m_strWiimotePlugin[MAXWIIMOTES];
|
||||
|
||||
std::string m_strFilename;
|
||||
std::string m_strBios;
|
||||
std::string m_strBootROM;
|
||||
std::string m_strSRAM;
|
||||
std::string m_strDefaultGCM;
|
||||
std::string m_strDVDRoot;
|
||||
|
@ -118,7 +118,7 @@ struct SCoreStartupParameter
|
|||
SCoreStartupParameter();
|
||||
|
||||
void LoadDefaults();
|
||||
bool AutoSetup(EBootBios _BootBios);
|
||||
bool AutoSetup(EBootBS2 _BootBS2);
|
||||
const std::string &GetUniqueID() const { return m_strUniqueID; }
|
||||
void CheckMemcardPath(std::string& memcardPath, std::string Region, bool isSlotA);
|
||||
};
|
||||
|
|
|
@ -58,27 +58,91 @@ static const char iplverPAL[0x100] = "(C) 1999-2001 Nintendo. All rights reserv
|
|||
static const char iplverNTSC[0x100] = "(C) 1999-2001 Nintendo. All rights reserved."
|
||||
"(C) 1999 ArtX Inc. All rights reserved.";
|
||||
|
||||
// segher is a supercomputer
|
||||
void CEXIIPL::Descrambler(u8* data, u32 size)
|
||||
{
|
||||
u8 acc = 0;
|
||||
u8 nacc = 0;
|
||||
|
||||
u16 t = 0x2953;
|
||||
u16 u = 0xd9c2;
|
||||
u16 v = 0x3ff1;
|
||||
|
||||
u8 x = 1;
|
||||
|
||||
for (u32 it = 0; it < size;)
|
||||
{
|
||||
int t0 = t & 1;
|
||||
int t1 = (t >> 1) & 1;
|
||||
int u0 = u & 1;
|
||||
int u1 = (u >> 1) & 1;
|
||||
int v0 = v & 1;
|
||||
|
||||
x ^= t1 ^ v0;
|
||||
x ^= (u0 | u1);
|
||||
x ^= (t0 ^ u1 ^ v0) & (t0 ^ u0);
|
||||
|
||||
if (t0 == u0)
|
||||
{
|
||||
v >>= 1;
|
||||
if (v0)
|
||||
v ^= 0xb3d0;
|
||||
}
|
||||
|
||||
if (t0 == 0)
|
||||
{
|
||||
u >>= 1;
|
||||
if (u0)
|
||||
u ^= 0xfb10;
|
||||
}
|
||||
|
||||
t >>= 1;
|
||||
if (t0)
|
||||
t ^= 0xa740;
|
||||
|
||||
nacc++;
|
||||
acc = 2*acc + x;
|
||||
if (nacc == 8)
|
||||
{
|
||||
data[it++] ^= acc;
|
||||
nacc = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CEXIIPL::CEXIIPL() :
|
||||
m_uPosition(0),
|
||||
m_uAddress(0),
|
||||
m_uRWOffset(0),
|
||||
m_count(0)
|
||||
m_count(0),
|
||||
m_FontsLoaded(false)
|
||||
{
|
||||
// Determine region
|
||||
m_bNTSC = SConfig::GetInstance().m_LocalCoreStartupParameter.bNTSC;
|
||||
|
||||
// Create the IPL
|
||||
m_pIPL = (u8*)AllocateMemoryPages(ROM_SIZE);
|
||||
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHLE_BS2)
|
||||
{
|
||||
// Copy header
|
||||
memcpy(m_pIPL, m_bNTSC ? iplverNTSC : iplverPAL, sizeof(m_bNTSC ? iplverNTSC : iplverPAL));
|
||||
|
||||
// Copy header
|
||||
memcpy(m_pIPL, m_bNTSC ? iplverNTSC : iplverPAL, sizeof(m_bNTSC ? iplverNTSC : iplverPAL));
|
||||
// Load fonts
|
||||
LoadFileToIPL((File::GetSysDirectory() + GC_SYS_DIR + DIR_SEP + FONT_SJIS), 0x1aff00);
|
||||
LoadFileToIPL((File::GetSysDirectory() + GC_SYS_DIR + DIR_SEP + FONT_ANSI), 0x1fcf00);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_FontsLoaded = true;
|
||||
// Load whole ROM dump
|
||||
LoadFileToIPL(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strBootROM, 0);
|
||||
// Descramble the encrypted section (contains BS1 and BS2)
|
||||
Descrambler(m_pIPL + 0x100, 0x1aff00);
|
||||
INFO_LOG(BOOT, "Loaded bootrom: %s", m_pIPL); // yay for null-terminated strings ;p
|
||||
}
|
||||
|
||||
// Load fonts
|
||||
LoadFileToIPL((File::GetSysDirectory() + GC_SYS_DIR + DIR_SEP + FONT_SJIS).c_str(), 0x001aff00);
|
||||
LoadFileToIPL((File::GetSysDirectory() + GC_SYS_DIR + DIR_SEP + FONT_ANSI).c_str(), 0x001fcf00);
|
||||
|
||||
// Clear RTC
|
||||
// Clear RTC
|
||||
memset(m_RTC, 0, sizeof(m_RTC));
|
||||
|
||||
// SRAM
|
||||
|
@ -92,7 +156,7 @@ CEXIIPL::CEXIIPL() :
|
|||
{
|
||||
m_SRAM = sram_dump;
|
||||
}
|
||||
// We Overwrite it here since it's possible on the GC to change the language as you please
|
||||
// We Overwrite language selection here since it's possible on the GC to change the language as you please
|
||||
m_SRAM.syssram.lang = SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage;
|
||||
|
||||
WriteProtectMemory(m_pIPL, ROM_SIZE);
|
||||
|
@ -110,7 +174,7 @@ CEXIIPL::~CEXIIPL()
|
|||
{
|
||||
FreeMemoryPages(m_pIPL, ROM_SIZE);
|
||||
m_pIPL = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// SRAM
|
||||
FILE *file = fopen(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strSRAM.c_str(), "wb");
|
||||
|
@ -122,15 +186,12 @@ CEXIIPL::~CEXIIPL()
|
|||
}
|
||||
void CEXIIPL::DoState(PointerWrap &p)
|
||||
{
|
||||
// commented out to not break current savestates
|
||||
// TODO: uncomment when adding the next savestate change
|
||||
//p.DoArray(m_RTC, 4);
|
||||
p.DoArray(m_RTC, 4);
|
||||
}
|
||||
|
||||
void CEXIIPL::LoadFileToIPL(const char* filename, u32 offset)
|
||||
void CEXIIPL::LoadFileToIPL(std::string filename, u32 offset)
|
||||
{
|
||||
FILE* pStream = NULL;
|
||||
pStream = fopen(filename, "rb");
|
||||
FILE* pStream = fopen(filename.c_str(), "rb");
|
||||
if (pStream != NULL)
|
||||
{
|
||||
fseek(pStream, 0, SEEK_END);
|
||||
|
@ -139,13 +200,8 @@ void CEXIIPL::LoadFileToIPL(const char* filename, u32 offset)
|
|||
|
||||
fread(m_pIPL + offset, 1, filesize, pStream);
|
||||
fclose(pStream);
|
||||
}
|
||||
else
|
||||
{
|
||||
// This is a poor way to handle failure. We should either not display this message unless fonts
|
||||
// are actually accessed, or better yet, emulate them using a system font. -bushing
|
||||
PanicAlert("Error: failed to load %s. Fonts in a few games may not work, or crash the game.",
|
||||
filename);
|
||||
|
||||
m_FontsLoaded = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -229,41 +285,34 @@ void CEXIIPL::TransferByte(u8& _uByte)
|
|||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// --- ROM ---
|
||||
//
|
||||
// --- Encrypted ROM ---
|
||||
// atm we pre-decrypt the whole thing, see CEXIIPL ctor
|
||||
if ((m_uAddress & 0x60000000) == 0)
|
||||
{
|
||||
if ((m_uAddress & 0x80000000) == 0)
|
||||
_uByte = m_pIPL[((m_uAddress >> 6) & ROM_MASK) + m_uRWOffset];
|
||||
#if 0
|
||||
u32 position = ((m_uAddress >> 6) & ROM_MASK) + m_uRWOffset;
|
||||
char msg[5] = "";
|
||||
if (position >= 0 && position < 0x100)
|
||||
sprintf(msg, "COPY");
|
||||
else if (position >= 0x00000100 && position <= 0x001aeee8)
|
||||
sprintf(msg, "BIOS");
|
||||
else if (position >= 0x001AFF00 && position <= 0x001FA0E0)
|
||||
sprintf(msg, "SJIS");
|
||||
else if (position >= 0x001FCF00 && position <= 0x001FF474)
|
||||
sprintf(msg, "ANSI");
|
||||
WARN_LOG(EXPANSIONINTERFACE, "m_pIPL[0x%08x] = 0x%02x %s\t0x%08x 0x%08x 0x%08x",
|
||||
position, _uByte, msg, m_uPosition,m_uAddress,m_uRWOffset);
|
||||
#endif
|
||||
{
|
||||
u32 position = ((m_uAddress >> 6) & ROM_MASK) + m_uRWOffset;
|
||||
|
||||
// Technically we should apply descrambling here, if it's currently enabled.
|
||||
_uByte = m_pIPL[position];
|
||||
|
||||
if ((position >= 0x001AFF00) && (position <= 0x001FF474) && !m_FontsLoaded)
|
||||
{
|
||||
PanicAlert("Error: Trying to access %s fonts but they are not loaded. Games may not show fonts correctly, or crash.",
|
||||
(position >= 0x001FCF00)?"ANSI":"SJIS");
|
||||
m_FontsLoaded = true; // Don't be a nag :p
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// --- Real Time Clock (RTC) ---
|
||||
//
|
||||
else if ((m_uAddress & 0x7FFFFF00) == 0x20000000)
|
||||
{
|
||||
if (m_uAddress & 0x80000000)
|
||||
m_RTC[(m_uAddress & 0x03) + m_uRWOffset] = _uByte;
|
||||
else
|
||||
_uByte = m_RTC[(m_uAddress & 0x03) + m_uRWOffset];
|
||||
}
|
||||
//
|
||||
}
|
||||
// --- SRAM ---
|
||||
//
|
||||
else if ((m_uAddress & 0x7FFFFF00) == 0x20000100)
|
||||
{
|
||||
if (m_uAddress & 0x80000000)
|
||||
|
@ -271,9 +320,7 @@ void CEXIIPL::TransferByte(u8& _uByte)
|
|||
else
|
||||
_uByte = m_SRAM.p_SRAM[(m_uAddress & 0x3F) + m_uRWOffset];
|
||||
}
|
||||
//
|
||||
// --- UART ---
|
||||
//
|
||||
else if ((m_uAddress & 0x7FFFFF00) == 0x20010000)
|
||||
{
|
||||
if (m_uAddress & 0x80000000)
|
||||
|
|
|
@ -26,13 +26,15 @@ class CEXIIPL : public IEXIDevice
|
|||
public:
|
||||
CEXIIPL();
|
||||
virtual ~CEXIIPL();
|
||||
|
||||
virtual void SetCS(int _iCS);
|
||||
bool IsPresent();
|
||||
static u32 GetGCTime();
|
||||
void DoState(PointerWrap &p);
|
||||
|
||||
private:
|
||||
static u32 GetGCTime();
|
||||
static void Descrambler(u8* data, u32 size);
|
||||
|
||||
private:
|
||||
enum
|
||||
{
|
||||
ROM_SIZE = 1024*1024*2,
|
||||
|
@ -59,10 +61,11 @@ private:
|
|||
|
||||
char m_szBuffer[256];
|
||||
int m_count;
|
||||
bool m_FontsLoaded;
|
||||
|
||||
virtual void TransferByte(u8 &_uByte);
|
||||
|
||||
void LoadFileToIPL(const char* filename, u32 offset);
|
||||
void LoadFileToIPL(std::string filename, u32 offset);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -36,9 +36,10 @@ enum
|
|||
PI_FIFO_BASE = 0x0C,
|
||||
PI_FIFO_END = 0x10,
|
||||
PI_FIFO_WPTR = 0x14,
|
||||
PI_FIFO_RESET = 0x18, // ??? - GXAbortFrameWrites to it
|
||||
PI_FIFO_RESET = 0x18, // ??? - GXAbortFrame writes to it
|
||||
PI_RESET_CODE = 0x24,
|
||||
PI_MB_REV = 0x2C,
|
||||
PI_UNKNOWN = 0x30 // ??? - BS1 writes to it
|
||||
};
|
||||
|
||||
|
||||
|
@ -49,9 +50,11 @@ volatile u32 m_InterruptMask;
|
|||
u32 Fifo_CPUBase;
|
||||
u32 Fifo_CPUEnd;
|
||||
u32 Fifo_CPUWritePointer;
|
||||
|
||||
u32 m_Fifo_Reset;
|
||||
u32 m_ResetCode;
|
||||
u32 m_MBRev;
|
||||
u32 m_Unknown;
|
||||
|
||||
|
||||
// ID and callback for scheduling reset button presses/releases
|
||||
|
@ -69,10 +72,10 @@ void DoState(PointerWrap &p)
|
|||
p.Do(Fifo_CPUBase);
|
||||
p.Do(Fifo_CPUEnd);
|
||||
p.Do(Fifo_CPUWritePointer);
|
||||
// (shuffle2) Enable sometime ;p
|
||||
// p.Do(m_Fifo_Reset);
|
||||
// p.Do(m_ResetCode);
|
||||
// p.Do(m_MBRev);
|
||||
p.Do(m_Fifo_Reset);
|
||||
p.Do(m_ResetCode);
|
||||
p.Do(m_MBRev);
|
||||
p.Do(m_Unknown);
|
||||
}
|
||||
|
||||
void Init()
|
||||
|
@ -85,6 +88,7 @@ void Init()
|
|||
Fifo_CPUWritePointer = 0;
|
||||
|
||||
m_MBRev = 2 << 28; // HW2 production board
|
||||
m_Unknown = 0;
|
||||
|
||||
// Bleh, why?
|
||||
//m_ResetCode |= 0x80000000;
|
||||
|
|
|
@ -22,7 +22,7 @@ class PointerWrap;
|
|||
|
||||
namespace VideoInterface
|
||||
{
|
||||
// For BIOS HLE
|
||||
// For BS2 HLE
|
||||
void PreInit(bool _bNTSC);
|
||||
void SetRegionReg(char _region);
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ files = ["ActionReplay.cpp",
|
|||
"Tracer.cpp",
|
||||
"VolumeHandler.cpp",
|
||||
"Boot/Boot.cpp",
|
||||
"Boot/Boot_BIOSEmu.cpp",
|
||||
"Boot/Boot_BS2Emu.cpp",
|
||||
"Boot/Boot_DOL.cpp",
|
||||
"Boot/Boot_ELF.cpp",
|
||||
"Boot/Boot_WiiWAD.cpp",
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
Core Core.cpp Init Thread creation
|
||||
EmuThread Calls CBoot::BootUp
|
||||
Boot.cpp CBoot::BootUp()
|
||||
CBoot::EmulatedBIOS_Wii() / GC() or Load_BIOS()
|
||||
CBoot::EmulatedBS2_Wii() / GC() or Load_BS2()
|
||||
*/
|
||||
// =============
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ EVT_CHECKBOX(ID_INTERFACE_WIIMOTE_LEDS, CConfigMain::CoreSettingsChanged)
|
|||
EVT_CHECKBOX(ID_INTERFACE_WIIMOTE_SPEAKERS, CConfigMain::CoreSettingsChanged)
|
||||
EVT_CHOICE(ID_INTERFACE_LANG, CConfigMain::CoreSettingsChanged)
|
||||
|
||||
EVT_CHECKBOX(ID_ALLWAYS_HLEBIOS, CConfigMain::CoreSettingsChanged)
|
||||
EVT_CHECKBOX(ID_ALLWAYS_HLE_BS2, CConfigMain::CoreSettingsChanged)
|
||||
EVT_CHECKBOX(ID_USEDYNAREC, CConfigMain::CoreSettingsChanged)
|
||||
EVT_CHECKBOX(ID_USEDUALCORE, CConfigMain::CoreSettingsChanged)
|
||||
EVT_CHECKBOX(ID_DSPTHREAD, CConfigMain::CoreSettingsChanged)
|
||||
|
@ -119,7 +119,7 @@ void CConfigMain::UpdateGUI()
|
|||
if(Core::GetState() != Core::CORE_UNINITIALIZED)
|
||||
{
|
||||
// Disable the Core stuff on GeneralPage
|
||||
AlwaysUseHLEBIOS->Disable();
|
||||
AlwaysHLE_BS2->Disable();
|
||||
UseDynaRec->Disable();
|
||||
UseDualCore->Disable();
|
||||
DSPThread->Disable();
|
||||
|
@ -206,8 +206,8 @@ void CConfigMain::CreateGUIControls()
|
|||
Framelimit->SetSelection(SConfig::GetInstance().m_Framelimit);
|
||||
|
||||
// Core Settings - Advanced
|
||||
AlwaysUseHLEBIOS = new wxCheckBox(GeneralPage, ID_ALLWAYS_HLEBIOS, wxT("HLE the BIOS all the time"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
AlwaysUseHLEBIOS->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bHLEBios);
|
||||
AlwaysHLE_BS2 = new wxCheckBox(GeneralPage, ID_ALLWAYS_HLE_BS2, wxT("Always HLE the IPL"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
AlwaysHLE_BS2->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bHLE_BS2);
|
||||
UseDynaRec = new wxCheckBox(GeneralPage, ID_USEDYNAREC, wxT("Enable the JIT dynarec"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
UseDynaRec->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bUseJIT);
|
||||
LockThreads = new wxCheckBox(GeneralPage, ID_LOCKTHREADS, wxT("Lock threads to cores"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||
|
@ -296,7 +296,7 @@ void CConfigMain::CreateGUIControls()
|
|||
sbBasic->Add(sFramelimit, 0, wxALL | wxEXPAND, 5);
|
||||
|
||||
sbAdvanced = new wxStaticBoxSizer(wxVERTICAL, GeneralPage, wxT("Advanced Settings"));
|
||||
sbAdvanced->Add(AlwaysUseHLEBIOS, 0, wxALL, 5);
|
||||
sbAdvanced->Add(AlwaysHLE_BS2, 0, wxALL, 5);
|
||||
sbAdvanced->Add(UseDynaRec, 0, wxALL, 5);
|
||||
sbAdvanced->Add(LockThreads, 0, wxALL, 5);
|
||||
sbAdvanced->Add(OptimizeQuantizers, 0, wxALL, 5);
|
||||
|
@ -630,8 +630,8 @@ void CConfigMain::CoreSettingsChanged(wxCommandEvent& event)
|
|||
case ID_FRAMELIMIT:
|
||||
SConfig::GetInstance().m_Framelimit = (u32)Framelimit->GetSelection();
|
||||
break;
|
||||
case ID_ALLWAYS_HLEBIOS: // Core
|
||||
SConfig::GetInstance().m_LocalCoreStartupParameter.bHLEBios = AlwaysUseHLEBIOS->IsChecked();
|
||||
case ID_ALLWAYS_HLE_BS2: // Core
|
||||
SConfig::GetInstance().m_LocalCoreStartupParameter.bHLE_BS2 = AlwaysHLE_BS2->IsChecked();
|
||||
break;
|
||||
case ID_USEDYNAREC:
|
||||
SConfig::GetInstance().m_LocalCoreStartupParameter.bUseJIT = UseDynaRec->IsChecked();
|
||||
|
|
|
@ -62,7 +62,7 @@ private:
|
|||
|
||||
wxBoxSizer* sCore;
|
||||
wxStaticBoxSizer* sbBasic, *sbAdvanced, *sbInterface;
|
||||
wxCheckBox* AlwaysUseHLEBIOS;
|
||||
wxCheckBox* AlwaysHLE_BS2;
|
||||
wxCheckBox* UseDynaRec;
|
||||
wxCheckBox* UseDualCore;
|
||||
wxCheckBox* DSPThread;
|
||||
|
@ -153,7 +153,7 @@ private:
|
|||
ID_PATHSPAGE,
|
||||
ID_PLUGINPAGE,
|
||||
|
||||
ID_ALLWAYS_HLEBIOS,
|
||||
ID_ALLWAYS_HLE_BS2,
|
||||
ID_USEDYNAREC,
|
||||
ID_USEDUALCORE,
|
||||
ID_DSPTHREAD,
|
||||
|
|
|
@ -51,7 +51,7 @@ std::string Summarize_Settings()
|
|||
{
|
||||
return StringFromFormat(
|
||||
"Dolphin Settings\n\n"
|
||||
"Always HLE Bios: %s\n"
|
||||
"HLE the IPL: %s\n"
|
||||
"Use Dynarec: %s\n"
|
||||
"Use Dual Core: %s\n"
|
||||
"DSP Thread: %s\n"
|
||||
|
@ -74,7 +74,7 @@ std::string Summarize_Settings()
|
|||
"Frame Limit: %d\n"
|
||||
"[Wii]Widescreen: %s\n"
|
||||
"[Wii]Progressive Scan: %s\n",
|
||||
Core::GetStartupParameter().bHLEBios?"True":"False",
|
||||
Core::GetStartupParameter().bHLE_BS2?"True":"False",
|
||||
Core::GetStartupParameter().bUseJIT?"True":"False",
|
||||
Core::GetStartupParameter().bUseDualCore?"True":"False",
|
||||
Core::GetStartupParameter().bDSPThread?"True":"False",
|
||||
|
|
Loading…
Reference in New Issue