diff --git a/Source/Core/Core/HW/Memmap.cpp b/Source/Core/Core/HW/Memmap.cpp index 4c59a642ce..049b53a0de 100644 --- a/Source/Core/Core/HW/Memmap.cpp +++ b/Source/Core/Core/HW/Memmap.cpp @@ -214,13 +214,30 @@ u32 Read_Instruction(const u32 em_address) return inst.hex; } +static inline bool ValidCopyRange(u32 address, size_t size) +{ + return (GetPointer(address) != nullptr && + GetPointer(address + u32(size)) != nullptr && + size < EXRAM_SIZE); // Make sure we don't have a range spanning seperate 2 banks +} + void CopyFromEmu(void* data, u32 address, size_t size) { + if (!ValidCopyRange(address, size)) + { + PanicAlert("Invalid range in CopyFromEmu. %lx bytes from 0x%08x", size, address); + return; + } memcpy(data, GetPointer(address), size); } void CopyToEmu(u32 address, const void* data, size_t size) { + if (!ValidCopyRange(address, size)) + { + PanicAlert("Invalid range in CopyToEmu. %lx bytes to 0x%08x", size, address); + return; + } memcpy(GetPointer(address), data, size); } diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp index cd3302beb3..79c24778bd 100644 --- a/Source/Core/VideoCommon/BPStructs.cpp +++ b/Source/Core/VideoCommon/BPStructs.cpp @@ -269,19 +269,13 @@ static void BPWritten(const BPCmd& bp) { u32 tlutTMemAddr = (bp.newvalue & 0x3FF) << 9; u32 tlutXferCount = (bp.newvalue & 0x1FFC00) >> 5; + u32 addr = bpmem.tmem_config.tlut_src << 5; - u32 addr = 0; + // The GameCube ignores the upper bits of this address. Some games (WW, MKDD) set them. + if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) + addr = addr & 0x01FFFFFF; - // TODO - figure out a cleaner way. - if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) - addr = bpmem.tmem_config.tlut_src << 5; - else - addr = (bpmem.tmem_config.tlut_src & 0xFFFFF) << 5; - - if (addr) - Memory::CopyFromEmu(texMem + tlutTMemAddr, addr, tlutXferCount); - else - PanicAlert("Invalid palette pointer %08x %08x %08x", bpmem.tmem_config.tlut_src, bpmem.tmem_config.tlut_src << 5, (bpmem.tmem_config.tlut_src & 0xFFFFF)<< 5); + Memory::CopyFromEmu(texMem + tlutTMemAddr, addr, tlutXferCount); return; }