diff --git a/rpcs3/Emu/Cell/PPCDecoder.cpp b/rpcs3/Emu/Cell/PPCDecoder.cpp index 078d383322..c9bf8139b2 100644 --- a/rpcs3/Emu/Cell/PPCDecoder.cpp +++ b/rpcs3/Emu/Cell/PPCDecoder.cpp @@ -3,7 +3,9 @@ u8 PPCDecoder::DecodeMemory(const u64 address) { - Decode(Memory.Read32(address)); + u32 instr; + Memory.Read32ByAddr(address, &instr); + Decode(instr); return 4; } \ No newline at end of file diff --git a/rpcs3/Emu/Memory/Memory.cpp b/rpcs3/Emu/Memory/Memory.cpp index b71bea4e6c..c4d30012f2 100644 --- a/rpcs3/Emu/Memory/Memory.cpp +++ b/rpcs3/Emu/Memory/Memory.cpp @@ -498,35 +498,35 @@ bool MemoryBase::Write128NN(u64 addr, const u128 data) u8 MemoryBase::Read8(u64 addr) { u8 res; - GetMemByAddr(addr).Read8(addr, &res); + Read8ByAddr(addr, &res); return res; } u16 MemoryBase::Read16(u64 addr) { u16 res; - GetMemByAddr(addr).Read16(addr, &res); + Read16ByAddr(addr, &res); return res; } u32 MemoryBase::Read32(u64 addr) { u32 res; - GetMemByAddr(addr).Read32(addr, &res); + Read32ByAddr(addr, &res); return res; } u64 MemoryBase::Read64(u64 addr) { u64 res; - GetMemByAddr(addr).Read64(addr, &res); + Read64ByAddr(addr, &res); return res; } u128 MemoryBase::Read128(u64 addr) { u128 res; - GetMemByAddr(addr).Read128(addr, &res); + Read128ByAddr(addr, &res); return res; } @@ -655,9 +655,11 @@ bool VirtualMemoryBlock::Read16(const u64 addr, u16* value) bool VirtualMemoryBlock::Read32(const u64 addr, u32* value) { - u64 realAddr; - *value = Memory.Read32(realAddr = getRealAddr(addr)); - return realAddr != 0; + u64 realAddr = getRealAddr(addr); + if (realAddr == 0) + return false; + *value = Memory.Read32(realAddr); + return true; } bool VirtualMemoryBlock::Read64(const u64 addr, u64* value) diff --git a/rpcs3/Emu/Memory/Memory.h b/rpcs3/Emu/Memory/Memory.h index 7bb7729177..6e949e8bfa 100644 --- a/rpcs3/Emu/Memory/Memory.h +++ b/rpcs3/Emu/Memory/Memory.h @@ -105,7 +105,7 @@ public: MemoryBlock& GetMemByAddr(const u64 addr) { - for(uint i=0; iIsMyAddress(addr)) return *MemoryBlocks[i]; } @@ -113,6 +113,61 @@ public: return NullMem; } + bool Read8ByAddr(const u64 addr, u8 *value) + { + for (size_t i = 0, end = MemoryBlocks.size(); i < end; ++i) + { + if (MemoryBlocks[i]->Read8(addr, value)) + return true; + } + + return NullMem.Read8(addr, value); + } + + bool Read16ByAddr(const u64 addr, u16 *value) + { + for (size_t i = 0, end = MemoryBlocks.size(); i < end; ++i) + { + if (MemoryBlocks[i]->Read16(addr, value)) + return true; + } + + return NullMem.Read16(addr, value); + } + + bool Read32ByAddr(const u64 addr, u32 *value) + { + for (size_t i = 0, end = MemoryBlocks.size(); i < end; ++i) + { + if (MemoryBlocks[i]->Read32(addr, value)) + return true; + } + + return NullMem.Read32(addr, value); + } + + bool Read64ByAddr(const u64 addr, u64 *value) + { + for (size_t i = 0, end = MemoryBlocks.size(); i < end; ++i) + { + if (MemoryBlocks[i]->Read64(addr, value)) + return true; + } + + return NullMem.Read64(addr, value); + } + + bool Read128ByAddr(const u64 addr, u128 *value) + { + for (size_t i = 0, end = MemoryBlocks.size(); i < end; ++i) + { + if (MemoryBlocks[i]->Read128(addr, value)) + return true; + } + + return NullMem.Read128(addr, value); + } + u8* GetMemFromAddr(const u64 addr) { return GetMemByAddr(addr).GetMemFromAddr(addr); @@ -188,7 +243,7 @@ public: bool IsGoodAddr(const u64 addr) { - for(uint i=0; iIsMyAddress(addr)) return true; } @@ -198,7 +253,7 @@ public: bool IsGoodAddr(const u64 addr, const u32 size) { - for(uint i=0; iIsMyAddress(addr) && MemoryBlocks[i]->IsMyAddress(addr + size - 1) ) return true; @@ -214,7 +269,7 @@ public: ConLog.Write("Closing memory..."); - for(uint i=0; iDelete(); } diff --git a/rpcs3/Emu/Memory/MemoryBlock.h b/rpcs3/Emu/Memory/MemoryBlock.h index 8716b3f37f..4451cb76e9 100644 --- a/rpcs3/Emu/Memory/MemoryBlock.h +++ b/rpcs3/Emu/Memory/MemoryBlock.h @@ -187,6 +187,7 @@ public: class NullMemoryBlock : public MemoryBlock { +public: virtual bool IsNULL() { return true; } virtual bool IsMyAddress(const u64 addr) { return true; }