Skip to content

Commit

Permalink
Configurable MEM1 and MEM2 sizes at runtime via Dolphin.ini
Browse files Browse the repository at this point in the history
Changed several enums from Memmap.h to be static vars and implemented Get functions to query them. This seems to have boosted speed a bit in some titles? The new variables and some statically initialized items are now initialized via functions called by HW::Init().

s_ram_size_real and the new s_exram_size_real are initialized from SConfig values in the aeformentioned HW::Init() function.

GUI features have been added to Config > Advanced to adjust the new SConfig values.

A check has been added to State::doState to ensure savestates with memory configurations different from the current settings aren't loaded. The STATE_VERSION is now 115.
  • Loading branch information
Minty-Meeo committed Apr 8, 2020
1 parent 960ba4f commit 75d6bca
Show file tree
Hide file tree
Showing 24 changed files with 354 additions and 109 deletions.
32 changes: 16 additions & 16 deletions Source/Core/Core/Boot/Boot_BS2Emu.cpp
Expand Up @@ -172,7 +172,7 @@ void CBoot::SetupGCMemory()
PowerPC::HostWrite_U32(0x0D15EA5E, 0x80000020);

// Physical Memory Size (24MB on retail)
PowerPC::HostWrite_U32(Memory::REALRAM_SIZE, 0x80000028);
PowerPC::HostWrite_U32(Memory::GetRamSizeReal(), 0x80000028);

// Console type - DevKit (retail ID == 0x00000003) see YAGCD 4.2.1.1.2
// TODO: determine why some games fail when using a retail ID.
Expand Down Expand Up @@ -369,26 +369,26 @@ bool CBoot::SetupWiiMemory(IOS::HLE::IOSC::ConsoleType console_type)
0x80000060 Copyright code
*/

Memory::Write_U32(0x0D15EA5E, 0x00000020); // Another magic word
Memory::Write_U32(0x00000001, 0x00000024); // Unknown
Memory::Write_U32(Memory::REALRAM_SIZE, 0x00000028); // MEM1 size 24MB
Memory::Write_U32(0x0D15EA5E, 0x00000020); // Another magic word
Memory::Write_U32(0x00000001, 0x00000024); // Unknown
Memory::Write_U32(Memory::GetRamSizeReal(), 0x00000028); // MEM1 size 24MB
u32 board_model = console_type == IOS::HLE::IOSC::ConsoleType::RVT ? 0x10000021 : 0x00000023;
Memory::Write_U32(board_model, 0x0000002c); // Board Model
Memory::Write_U32(0x00000000, 0x00000030); // Init
Memory::Write_U32(0x817FEC60, 0x00000034); // Init
// 38, 3C should get start, size of FST through apploader
Memory::Write_U32(0x8008f7b8, 0x000000e4); // Thread Init
Memory::Write_U32(Memory::REALRAM_SIZE, 0x000000f0); // "Simulated memory size" (debug mode?)
Memory::Write_U32(0x8179b500, 0x000000f4); // __start
Memory::Write_U32(0x0e7be2c0, 0x000000f8); // Bus speed
Memory::Write_U32(0x2B73A840, 0x000000fc); // CPU speed
Memory::Write_U16(0x0000, 0x000030e6); // Console type
Memory::Write_U32(0x00000000, 0x000030c0); // EXI
Memory::Write_U32(0x00000000, 0x000030c4); // EXI
Memory::Write_U32(0x00000000, 0x000030dc); // Time
Memory::Write_U32(0xffffffff, 0x000030d8); // Unknown, set by any official NAND title
Memory::Write_U16(0x8201, 0x000030e6); // Dev console / debug capable
Memory::Write_U32(0x00000000, 0x000030f0); // Apploader
Memory::Write_U32(0x8008f7b8, 0x000000e4); // Thread Init
Memory::Write_U32(Memory::GetRamSizeReal(), 0x000000f0); // "Simulated memory size" (debug mode?)
Memory::Write_U32(0x8179b500, 0x000000f4); // __start
Memory::Write_U32(0x0e7be2c0, 0x000000f8); // Bus speed
Memory::Write_U32(0x2B73A840, 0x000000fc); // CPU speed
Memory::Write_U16(0x0000, 0x000030e6); // Console type
Memory::Write_U32(0x00000000, 0x000030c0); // EXI
Memory::Write_U32(0x00000000, 0x000030c4); // EXI
Memory::Write_U32(0x00000000, 0x000030dc); // Time
Memory::Write_U32(0xffffffff, 0x000030d8); // Unknown, set by any official NAND title
Memory::Write_U16(0x8201, 0x000030e6); // Dev console / debug capable
Memory::Write_U32(0x00000000, 0x000030f0); // Apploader

// During the boot process, 0x315c is first set to 0xdeadbeef by IOS
// in the boot_ppc syscall. The value is then partly overwritten by SDK titles.
Expand Down
4 changes: 2 additions & 2 deletions Source/Core/Core/Boot/DolReader.cpp
Expand Up @@ -102,7 +102,7 @@ bool DolReader::LoadIntoMemory(bool only_in_mem1) const
for (size_t i = 0; i < m_text_sections.size(); ++i)
if (!m_text_sections[i].empty() &&
!(only_in_mem1 &&
m_dolheader.textAddress[i] + m_text_sections[i].size() >= Memory::REALRAM_SIZE))
m_dolheader.textAddress[i] + m_text_sections[i].size() >= Memory::GetRamSizeReal()))
{
Memory::CopyToEmu(m_dolheader.textAddress[i], m_text_sections[i].data(),
m_text_sections[i].size());
Expand All @@ -112,7 +112,7 @@ bool DolReader::LoadIntoMemory(bool only_in_mem1) const
for (size_t i = 0; i < m_data_sections.size(); ++i)
if (!m_data_sections[i].empty() &&
!(only_in_mem1 &&
m_dolheader.dataAddress[i] + m_data_sections[i].size() >= Memory::REALRAM_SIZE))
m_dolheader.dataAddress[i] + m_data_sections[i].size() >= Memory::GetRamSizeReal()))
{
Memory::CopyToEmu(m_dolheader.dataAddress[i], m_data_sections[i].data(),
m_data_sections[i].size());
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/Core/Boot/ElfReader.cpp
Expand Up @@ -151,7 +151,7 @@ bool ElfReader::LoadIntoMemory(bool only_in_mem1) const
u32 srcSize = p->p_filesz;
u32 dstSize = p->p_memsz;

if (only_in_mem1 && p->p_vaddr >= Memory::REALRAM_SIZE)
if (only_in_mem1 && p->p_vaddr >= Memory::GetRamSizeReal())
continue;

Memory::CopyToEmu(writeAddr, src, srcSize);
Expand Down
16 changes: 16 additions & 0 deletions Source/Core/Core/BootManager.cpp
Expand Up @@ -95,6 +95,9 @@ struct ConfigCache
float m_EmulationSpeed;
float m_OCFactor;
bool m_OCEnable;
bool m_RAMOverrideEnable;
u32 m_MEM1Size;
u32 m_MEM2Size;
bool m_bt_passthrough_enabled;
std::string strBackend;
std::string sBackend;
Expand Down Expand Up @@ -132,6 +135,9 @@ void ConfigCache::SaveConfig(const SConfig& config)
m_strGPUDeterminismMode = config.m_strGPUDeterminismMode;
m_OCFactor = config.m_OCFactor;
m_OCEnable = config.m_OCEnable;
m_RAMOverrideEnable = config.m_RAMOverrideEnable;
m_MEM1Size = config.m_MEM1Size;
m_MEM2Size = config.m_MEM2Size;
m_bt_passthrough_enabled = config.m_bt_passthrough_enabled;

for (int i = 0; i != MAX_BBMOTES; ++i)
Expand Down Expand Up @@ -207,6 +213,9 @@ void ConfigCache::RestoreConfig(SConfig* config)
config->m_strGPUDeterminismMode = m_strGPUDeterminismMode;
config->m_OCFactor = m_OCFactor;
config->m_OCEnable = m_OCEnable;
config->m_RAMOverrideEnable = m_RAMOverrideEnable;
config->m_MEM1Size = m_MEM1Size;
config->m_MEM2Size = m_MEM2Size;
config->m_bt_passthrough_enabled = m_bt_passthrough_enabled;
VideoBackendBase::ActivateBackend(config->m_strVideoBackend);
}
Expand Down Expand Up @@ -285,6 +294,10 @@ bool BootCore(std::unique_ptr<BootParameters> boot, const WindowSystemInfo& wsi)
StartUp.m_strGPUDeterminismMode);
core_section->Get("Overclock", &StartUp.m_OCFactor, StartUp.m_OCFactor);
core_section->Get("OverclockEnable", &StartUp.m_OCEnable, StartUp.m_OCEnable);
core_section->Get("RAMOverrideEnable", &StartUp.m_RAMOverrideEnable,
StartUp.m_RAMOverrideEnable);
core_section->Get("MEM1Size", &StartUp.m_MEM1Size, StartUp.m_MEM1Size);
core_section->Get("MEM2Size", &StartUp.m_MEM2Size, StartUp.m_MEM2Size);

for (unsigned int i = 0; i < SerialInterface::MAX_SI_CHANNELS; ++i)
{
Expand Down Expand Up @@ -369,6 +382,9 @@ bool BootCore(std::unique_ptr<BootParameters> boot, const WindowSystemInfo& wsi)
StartUp.m_DSPEnableJIT = netplay_settings.m_DSPEnableJIT;
StartUp.m_OCEnable = netplay_settings.m_OCEnable;
StartUp.m_OCFactor = netplay_settings.m_OCFactor;
StartUp.m_RAMOverrideEnable = netplay_settings.m_RAMOverrideEnable;
StartUp.m_MEM1Size = netplay_settings.m_MEM1Size;
StartUp.m_MEM2Size = netplay_settings.m_MEM2Size;
StartUp.m_EXIDevice[0] = netplay_settings.m_EXIDevice[0];
StartUp.m_EXIDevice[1] = netplay_settings.m_EXIDevice[1];
StartUp.m_EXIDevice[2] = netplay_settings.m_EXIDevice[2];
Expand Down
3 changes: 3 additions & 0 deletions Source/Core/Core/Config/MainSettings.cpp
Expand Up @@ -98,6 +98,9 @@ const ConfigInfo<bool> MAIN_ACCURATE_NANS{{System::Main, "Core", "AccurateNaNs"}
const ConfigInfo<float> MAIN_EMULATION_SPEED{{System::Main, "Core", "EmulationSpeed"}, 1.0f};
const ConfigInfo<float> MAIN_OVERCLOCK{{System::Main, "Core", "Overclock"}, 1.0f};
const ConfigInfo<bool> MAIN_OVERCLOCK_ENABLE{{System::Main, "Core", "OverclockEnable"}, false};
const ConfigInfo<bool> MAIN_RAM_OVERRIDE_ENABLE{{System::Main, "Core", "RAMOverrideEnable"}, false};
const ConfigInfo<u32> MAIN_MEM1_SIZE{{System::Main, "Core", "MEM1Size"}, 0x01800000};
const ConfigInfo<u32> MAIN_MEM2_SIZE{{System::Main, "Core", "MEM2Size"}, 0x04000000};
const ConfigInfo<std::string> MAIN_GFX_BACKEND{{System::Main, "Core", "GFXBackend"}, ""};
const ConfigInfo<std::string> MAIN_GPU_DETERMINISM_MODE{
{System::Main, "Core", "GPUDeterminismMode"}, "auto"};
Expand Down
3 changes: 3 additions & 0 deletions Source/Core/Core/Config/MainSettings.h
Expand Up @@ -76,6 +76,9 @@ extern const ConfigInfo<bool> MAIN_ACCURATE_NANS;
extern const ConfigInfo<float> MAIN_EMULATION_SPEED;
extern const ConfigInfo<float> MAIN_OVERCLOCK;
extern const ConfigInfo<bool> MAIN_OVERCLOCK_ENABLE;
extern const ConfigInfo<bool> MAIN_RAM_OVERRIDE_ENABLE;
extern const ConfigInfo<u32> MAIN_MEM1_SIZE;
extern const ConfigInfo<u32> MAIN_MEM2_SIZE;
// Should really be part of System::GFX, but again, we're stuck with past mistakes.
extern const ConfigInfo<std::string> MAIN_GFX_BACKEND;
extern const ConfigInfo<std::string> MAIN_GPU_DETERMINISM_MODE;
Expand Down
6 changes: 6 additions & 0 deletions Source/Core/Core/ConfigManager.cpp
Expand Up @@ -242,6 +242,9 @@ void SConfig::SaveCoreSettings(IniFile& ini)
core->Set("EmulationSpeed", m_EmulationSpeed);
core->Set("Overclock", m_OCFactor);
core->Set("OverclockEnable", m_OCEnable);
core->Set("RAMOverrideEnable", m_RAMOverrideEnable);
core->Set("MEM1Size", m_MEM1Size);
core->Set("MEM2Size", m_MEM2Size);
core->Set("GFXBackend", m_strVideoBackend);
core->Set("GPUDeterminismMode", m_strGPUDeterminismMode);
core->Set("PerfMapDir", m_perfDir);
Expand Down Expand Up @@ -530,6 +533,9 @@ void SConfig::LoadCoreSettings(IniFile& ini)
core->Get("EmulationSpeed", &m_EmulationSpeed, 1.0f);
core->Get("Overclock", &m_OCFactor, 1.0f);
core->Get("OverclockEnable", &m_OCEnable, false);
core->Get("RAMOverrideEnable", &m_RAMOverrideEnable, false);
core->Get("MEM1Size", &m_MEM1Size, 0x01800000);
core->Get("MEM2Size", &m_MEM2Size, 0x04000000);
core->Get("GFXBackend", &m_strVideoBackend, "");
core->Get("GPUDeterminismMode", &m_strGPUDeterminismMode, "auto");
core->Get("PerfMapDir", &m_perfDir, "");
Expand Down
3 changes: 3 additions & 0 deletions Source/Core/Core/ConfigManager.h
Expand Up @@ -234,6 +234,9 @@ struct SConfig
float m_EmulationSpeed;
bool m_OCEnable;
float m_OCFactor;
bool m_RAMOverrideEnable;
u32 m_MEM1Size;
u32 m_MEM2Size;
// other interface settings
bool m_InterfaceExtendedFPSInfo;
bool m_show_active_title = false;
Expand Down
4 changes: 2 additions & 2 deletions Source/Core/Core/FifoPlayer/FifoPlayer.cpp
Expand Up @@ -356,9 +356,9 @@ void FifoPlayer::WriteMemory(const MemoryUpdate& memUpdate)
u8* mem = nullptr;

if (memUpdate.address & 0x10000000)
mem = &Memory::m_pEXRAM[memUpdate.address & Memory::EXRAM_MASK];
mem = &Memory::m_pEXRAM[memUpdate.address & Memory::GetExRamMask()];
else
mem = &Memory::m_pRAM[memUpdate.address & Memory::RAM_MASK];
mem = &Memory::m_pRAM[memUpdate.address & Memory::GetRamMask()];

std::copy(memUpdate.data.begin(), memUpdate.data.end(), mem);
}
Expand Down
12 changes: 6 additions & 6 deletions Source/Core/Core/FifoPlayer/FifoRecorder.cpp
Expand Up @@ -36,8 +36,8 @@ void FifoRecorder::StartRecording(s32 numFrames, CallbackFunc finishedCb)
// - Global variables suck
// - Multithreading with the above two sucks
//
m_Ram.resize(Memory::RAM_SIZE);
m_ExRam.resize(Memory::EXRAM_SIZE);
m_Ram.resize(Memory::GetRamSize());
m_ExRam.resize(Memory::GetExRamSize());

std::fill(m_Ram.begin(), m_Ram.end(), 0);
std::fill(m_ExRam.begin(), m_ExRam.end(), 0);
Expand Down Expand Up @@ -121,13 +121,13 @@ void FifoRecorder::UseMemory(u32 address, u32 size, MemoryUpdate::Type type, boo
u8* newData;
if (address & 0x10000000)
{
curData = &m_ExRam[address & Memory::EXRAM_MASK];
newData = &Memory::m_pEXRAM[address & Memory::EXRAM_MASK];
curData = &m_ExRam[address & Memory::GetExRamMask()];
newData = &Memory::m_pEXRAM[address & Memory::GetExRamMask()];
}
else
{
curData = &m_Ram[address & Memory::RAM_MASK];
newData = &Memory::m_pRAM[address & Memory::RAM_MASK];
curData = &m_Ram[address & Memory::GetRamMask()];
newData = &Memory::m_pRAM[address & Memory::GetRamMask()];
}

if (!dynamicUpdate && memcmp(curData, newData, size) != 0)
Expand Down
25 changes: 17 additions & 8 deletions Source/Core/Core/HW/AddressSpace.cpp
Expand Up @@ -234,6 +234,7 @@ struct AccessorMapping

struct CompositeAddressSpaceAccessors : Accessors
{
CompositeAddressSpaceAccessors() = default;
CompositeAddressSpaceAccessors(std::initializer_list<AccessorMapping> accessors)
: m_accessor_mappings(accessors.begin(), accessors.end())
{
Expand Down Expand Up @@ -303,6 +304,7 @@ struct CompositeAddressSpaceAccessors : Accessors

struct SmallBlockAccessors : Accessors
{
SmallBlockAccessors() = default;
SmallBlockAccessors(u8** alloc_base_, u32 size_) : alloc_base{alloc_base_}, size{size_} {}

bool IsValidAddress(u32 address) const override
Expand Down Expand Up @@ -365,14 +367,11 @@ struct NullAccessors : Accessors

static EffectiveAddressSpaceAccessors s_effective_address_space_accessors;
static AuxiliaryAddressSpaceAccessors s_auxiliary_address_space_accessors;
static SmallBlockAccessors s_mem1_address_space_accessors{&Memory::m_pRAM, Memory::REALRAM_SIZE};
static SmallBlockAccessors s_mem2_address_space_accessors{&Memory::m_pEXRAM, Memory::EXRAM_SIZE};
static SmallBlockAccessors s_fake_address_space_accessors{&Memory::m_pFakeVMEM,
Memory::FAKEVMEM_SIZE};
static CompositeAddressSpaceAccessors s_physical_address_space_accessors_gcn{
{0x00000000, &s_mem1_address_space_accessors}};
static CompositeAddressSpaceAccessors s_physical_address_space_accessors_wii{
{0x00000000, &s_mem1_address_space_accessors}, {0x10000000, &s_mem2_address_space_accessors}};
static SmallBlockAccessors s_mem1_address_space_accessors;
static SmallBlockAccessors s_mem2_address_space_accessors;
static SmallBlockAccessors s_fake_address_space_accessors;
static CompositeAddressSpaceAccessors s_physical_address_space_accessors_gcn;
static CompositeAddressSpaceAccessors s_physical_address_space_accessors_wii;
static NullAccessors s_null_accessors;

Accessors* GetAccessors(Type address_space)
Expand Down Expand Up @@ -412,4 +411,14 @@ Accessors* GetAccessors(Type address_space)
return &s_null_accessors;
}

void Init()
{
s_mem1_address_space_accessors = {&Memory::m_pRAM, Memory::GetRamSizeReal()};
s_mem2_address_space_accessors = {&Memory::m_pEXRAM, Memory::GetExRamSizeReal()};
s_fake_address_space_accessors = {&Memory::m_pFakeVMEM, Memory::GetFakeVMemSize()};
s_physical_address_space_accessors_gcn = {{0x00000000, &s_mem1_address_space_accessors}};
s_physical_address_space_accessors_wii = {{0x00000000, &s_mem1_address_space_accessors},
{0x10000000, &s_mem2_address_space_accessors}};
}

} // namespace AddressSpace
2 changes: 2 additions & 0 deletions Source/Core/Core/HW/AddressSpace.h
Expand Up @@ -47,4 +47,6 @@ struct Accessors

Accessors* GetAccessors(Type address_space);

void Init();

} // namespace AddressSpace
6 changes: 3 additions & 3 deletions Source/Core/Core/HW/DSP.cpp
Expand Up @@ -193,8 +193,8 @@ void Reinit(bool hle)
if (SConfig::GetInstance().bWii)
{
s_ARAM.wii_mode = true;
s_ARAM.size = Memory::EXRAM_SIZE;
s_ARAM.mask = Memory::EXRAM_MASK;
s_ARAM.size = Memory::GetExRamSizeReal();
s_ARAM.mask = Memory::GetExRamMask();
s_ARAM.ptr = Memory::m_pEXRAM;
}
else
Expand Down Expand Up @@ -589,7 +589,7 @@ u8 ReadARAM(u32 address)
if (address & 0x10000000)
return s_ARAM.ptr[address & s_ARAM.mask];
else
return Memory::Read_U8(address & Memory::RAM_MASK);
return Memory::Read_U8(address & Memory::GetRamMask());
}
else
{
Expand Down
28 changes: 14 additions & 14 deletions Source/Core/Core/HW/DSPHLE/UCodes/UCodes.cpp
Expand Up @@ -39,27 +39,27 @@ constexpr bool ExramRead(u32 address)
u8 HLEMemory_Read_U8(u32 address)
{
if (ExramRead(address))
return Memory::m_pEXRAM[address & Memory::EXRAM_MASK];
return Memory::m_pEXRAM[address & Memory::GetExRamMask()];

return Memory::m_pRAM[address & Memory::RAM_MASK];
return Memory::m_pRAM[address & Memory::GetRamMask()];
}

void HLEMemory_Write_U8(u32 address, u8 value)
{
if (ExramRead(address))
Memory::m_pEXRAM[address & Memory::EXRAM_MASK] = value;
Memory::m_pEXRAM[address & Memory::GetExRamMask()] = value;
else
Memory::m_pRAM[address & Memory::RAM_MASK] = value;
Memory::m_pRAM[address & Memory::GetRamMask()] = value;
}

u16 HLEMemory_Read_U16LE(u32 address)
{
u16 value;

if (ExramRead(address))
std::memcpy(&value, &Memory::m_pEXRAM[address & Memory::EXRAM_MASK], sizeof(u16));
std::memcpy(&value, &Memory::m_pEXRAM[address & Memory::GetExRamMask()], sizeof(u16));
else
std::memcpy(&value, &Memory::m_pRAM[address & Memory::RAM_MASK], sizeof(u16));
std::memcpy(&value, &Memory::m_pRAM[address & Memory::GetRamMask()], sizeof(u16));

return value;
}
Expand All @@ -72,9 +72,9 @@ u16 HLEMemory_Read_U16(u32 address)
void HLEMemory_Write_U16LE(u32 address, u16 value)
{
if (ExramRead(address))
std::memcpy(&Memory::m_pEXRAM[address & Memory::EXRAM_MASK], &value, sizeof(u16));
std::memcpy(&Memory::m_pEXRAM[address & Memory::GetExRamMask()], &value, sizeof(u16));
else
std::memcpy(&Memory::m_pRAM[address & Memory::RAM_MASK], &value, sizeof(u16));
std::memcpy(&Memory::m_pRAM[address & Memory::GetRamMask()], &value, sizeof(u16));
}

void HLEMemory_Write_U16(u32 address, u16 value)
Expand All @@ -87,9 +87,9 @@ u32 HLEMemory_Read_U32LE(u32 address)
u32 value;

if (ExramRead(address))
std::memcpy(&value, &Memory::m_pEXRAM[address & Memory::EXRAM_MASK], sizeof(u32));
std::memcpy(&value, &Memory::m_pEXRAM[address & Memory::GetExRamMask()], sizeof(u32));
else
std::memcpy(&value, &Memory::m_pRAM[address & Memory::RAM_MASK], sizeof(u32));
std::memcpy(&value, &Memory::m_pRAM[address & Memory::GetRamMask()], sizeof(u32));

return value;
}
Expand All @@ -102,9 +102,9 @@ u32 HLEMemory_Read_U32(u32 address)
void HLEMemory_Write_U32LE(u32 address, u32 value)
{
if (ExramRead(address))
std::memcpy(&Memory::m_pEXRAM[address & Memory::EXRAM_MASK], &value, sizeof(u32));
std::memcpy(&Memory::m_pEXRAM[address & Memory::GetExRamMask()], &value, sizeof(u32));
else
std::memcpy(&Memory::m_pRAM[address & Memory::RAM_MASK], &value, sizeof(u32));
std::memcpy(&Memory::m_pRAM[address & Memory::GetRamMask()], &value, sizeof(u32));
}

void HLEMemory_Write_U32(u32 address, u32 value)
Expand All @@ -115,9 +115,9 @@ void HLEMemory_Write_U32(u32 address, u32 value)
void* HLEMemory_Get_Pointer(u32 address)
{
if (ExramRead(address))
return &Memory::m_pEXRAM[address & Memory::EXRAM_MASK];
return &Memory::m_pEXRAM[address & Memory::GetExRamMask()];

return &Memory::m_pRAM[address & Memory::RAM_MASK];
return &Memory::m_pRAM[address & Memory::GetRamMask()];
}

UCodeInterface::UCodeInterface(DSPHLE* dsphle, u32 crc)
Expand Down
2 changes: 2 additions & 0 deletions Source/Core/Core/HW/HW.cpp
Expand Up @@ -10,6 +10,7 @@
#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "Core/CoreTiming.h"
#include "Core/HW/AddressSpace.h"
#include "Core/HW/AudioInterface.h"
#include "Core/HW/CPU.h"
#include "Core/HW/DSP.h"
Expand Down Expand Up @@ -42,6 +43,7 @@ void Init()
ProcessorInterface::Init();
ExpansionInterface::Init(); // Needs to be initialized before Memory
Memory::Init();
AddressSpace::Init();
DSP::Init(SConfig::GetInstance().bDSPHLE);
DVDInterface::Init();
GPFifo::Init();
Expand Down

0 comments on commit 75d6bca

Please sign in to comment.