Merge pull request #10746 from Pokechu22/bs2-emu-registers
BS2Emu: Set HID0/1/2/4 and MSR with correct default values
This commit is contained in:
commit
e18053d307
|
@ -538,14 +538,12 @@ bool CBoot::BootUp(std::unique_ptr<BootParameters> boot)
|
||||||
SetDefaultDisc();
|
SetDefaultDisc();
|
||||||
|
|
||||||
SetupMSR();
|
SetupMSR();
|
||||||
|
SetupHID(config.bWii);
|
||||||
SetupBAT(config.bWii);
|
SetupBAT(config.bWii);
|
||||||
CopyDefaultExceptionHandlers();
|
CopyDefaultExceptionHandlers();
|
||||||
|
|
||||||
if (config.bWii)
|
if (config.bWii)
|
||||||
{
|
{
|
||||||
PowerPC::ppcState.spr[SPR_HID0] = 0x0011c464;
|
|
||||||
PowerPC::ppcState.spr[SPR_HID4] = 0x82000000;
|
|
||||||
|
|
||||||
// Set a value for the SP. It doesn't matter where this points to,
|
// Set a value for the SP. It doesn't matter where this points to,
|
||||||
// as long as it is a valid location. This value is taken from a homebrew binary.
|
// as long as it is a valid location. This value is taken from a homebrew binary.
|
||||||
PowerPC::ppcState.gpr[1] = 0x8004d4bc;
|
PowerPC::ppcState.gpr[1] = 0x8004d4bc;
|
||||||
|
|
|
@ -160,6 +160,7 @@ private:
|
||||||
static bool BootNANDTitle(u64 title_id);
|
static bool BootNANDTitle(u64 title_id);
|
||||||
|
|
||||||
static void SetupMSR();
|
static void SetupMSR();
|
||||||
|
static void SetupHID(bool is_wii);
|
||||||
static void SetupBAT(bool is_wii);
|
static void SetupBAT(bool is_wii);
|
||||||
static bool RunApploader(bool is_wii, const DiscIO::VolumeDisc& volume,
|
static bool RunApploader(bool is_wii, const DiscIO::VolumeDisc& volume,
|
||||||
const std::vector<DiscIO::Riivolution::Patch>& riivolution_patches);
|
const std::vector<DiscIO::Riivolution::Patch>& riivolution_patches);
|
||||||
|
|
|
@ -37,6 +37,10 @@
|
||||||
#include "DiscIO/RiivolutionPatcher.h"
|
#include "DiscIO/RiivolutionPatcher.h"
|
||||||
#include "DiscIO/VolumeDisc.h"
|
#include "DiscIO/VolumeDisc.h"
|
||||||
|
|
||||||
|
#include "VideoCommon/VertexManagerBase.h"
|
||||||
|
#include "VideoCommon/VertexShaderManager.h"
|
||||||
|
#include "VideoCommon/XFMemory.h"
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
void PresetTimeBaseTicks()
|
void PresetTimeBaseTicks()
|
||||||
|
@ -61,10 +65,44 @@ void CBoot::RunFunction(u32 address)
|
||||||
|
|
||||||
void CBoot::SetupMSR()
|
void CBoot::SetupMSR()
|
||||||
{
|
{
|
||||||
MSR.FP = 1;
|
// 0x0002032
|
||||||
|
MSR.RI = 1;
|
||||||
MSR.DR = 1;
|
MSR.DR = 1;
|
||||||
MSR.IR = 1;
|
MSR.IR = 1;
|
||||||
MSR.EE = 1;
|
MSR.FP = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CBoot::SetupHID(bool is_wii)
|
||||||
|
{
|
||||||
|
// HID0 is 0x0011c464 on GC, 0x0011c664 on Wii
|
||||||
|
HID0.BHT = 1;
|
||||||
|
HID0.BTIC = 1;
|
||||||
|
HID0.DCFA = 1;
|
||||||
|
if (is_wii)
|
||||||
|
HID0.SPD = 1;
|
||||||
|
HID0.DCFI = 1;
|
||||||
|
HID0.DCE = 1;
|
||||||
|
// Note that Datel titles will fail to boot if the instruction cache is not enabled; see
|
||||||
|
// https://bugs.dolphin-emu.org/issues/8223
|
||||||
|
HID0.ICE = 1;
|
||||||
|
HID0.NHR = 1;
|
||||||
|
HID0.DPM = 1;
|
||||||
|
|
||||||
|
// HID1 is initialized in PowerPC.cpp to 0x80000000
|
||||||
|
// HID2 is 0xe0000000
|
||||||
|
HID2.PSE = 1;
|
||||||
|
HID2.WPE = 1;
|
||||||
|
HID2.LSQE = 1;
|
||||||
|
|
||||||
|
// HID4 is 0 on GC and 0x83900000 on Wii
|
||||||
|
if (is_wii)
|
||||||
|
{
|
||||||
|
HID4.L2CFI = 1;
|
||||||
|
HID4.LPE = 1;
|
||||||
|
HID4.ST0 = 1;
|
||||||
|
HID4.SBE = 1;
|
||||||
|
HID4.reserved_3 = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBoot::SetupBAT(bool is_wii)
|
void CBoot::SetupBAT(bool is_wii)
|
||||||
|
@ -214,10 +252,22 @@ bool CBoot::EmulatedBS2_GC(const DiscIO::VolumeDisc& volume,
|
||||||
INFO_LOG_FMT(BOOT, "Faking GC BS2...");
|
INFO_LOG_FMT(BOOT, "Faking GC BS2...");
|
||||||
|
|
||||||
SetupMSR();
|
SetupMSR();
|
||||||
|
SetupHID(/*is_wii*/ false);
|
||||||
SetupBAT(/*is_wii*/ false);
|
SetupBAT(/*is_wii*/ false);
|
||||||
|
|
||||||
SetupGCMemory();
|
SetupGCMemory();
|
||||||
|
|
||||||
|
// Datel titles don't initialize the postMatrices, but they have dual-texture coordinate
|
||||||
|
// transformation enabled. We initialize all of xfmem to 0, which results in everything using
|
||||||
|
// a texture coordinate of (0, 0), breaking textures. Normally the IPL will initialize the last
|
||||||
|
// entry to the identity matrix, but the whole point of BS2 EMU is that it skips the IPL, so we
|
||||||
|
// need to do this initialization ourselves.
|
||||||
|
xfmem.postMatrices[0x3d * 4 + 0] = 1.0f;
|
||||||
|
xfmem.postMatrices[0x3e * 4 + 1] = 1.0f;
|
||||||
|
xfmem.postMatrices[0x3f * 4 + 2] = 1.0f;
|
||||||
|
g_vertex_manager->Flush();
|
||||||
|
VertexShaderManager::InvalidateXFRange(XFMEM_POSTMATRICES + 0x3d * 4, XFMEM_POSTMATRICES_END);
|
||||||
|
|
||||||
DVDReadDiscID(volume, 0x00000000);
|
DVDReadDiscID(volume, 0x00000000);
|
||||||
|
|
||||||
bool streaming = Memory::Read_U8(0x80000008);
|
bool streaming = Memory::Read_U8(0x80000008);
|
||||||
|
@ -500,6 +550,7 @@ bool CBoot::EmulatedBS2_Wii(const DiscIO::VolumeDisc& volume,
|
||||||
DVDRead(volume, 0, 0x3180, 4, partition);
|
DVDRead(volume, 0, 0x3180, 4, partition);
|
||||||
|
|
||||||
SetupMSR();
|
SetupMSR();
|
||||||
|
SetupHID(/*is_wii*/ true);
|
||||||
SetupBAT(/*is_wii*/ true);
|
SetupBAT(/*is_wii*/ true);
|
||||||
|
|
||||||
Memory::Write_U32(0x4c000064, 0x00000300); // Write default DSI Handler: rfi
|
Memory::Write_U32(0x4c000064, 0x00000300); // Write default DSI Handler: rfi
|
||||||
|
|
Loading…
Reference in New Issue