diff --git a/src/core/memory.cpp b/src/core/memory.cpp index fd892b762c..9d87045a05 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -119,15 +119,33 @@ struct Memory::Impl { } u16 Read16(const VAddr addr) { - return Read(addr); + if ((addr & 1) == 0) { + return Read(addr); + } else { + const u8 a{Read(addr)}; + const u8 b{Read(addr + sizeof(u8))}; + return (static_cast(b) << 8) | a; + } } u32 Read32(const VAddr addr) { - return Read(addr); + if ((addr & 3) == 0) { + return Read(addr); + } else { + const u16 a{Read16(addr)}; + const u16 b{Read16(addr + sizeof(u16))}; + return (static_cast(b) << 16) | a; + } } u64 Read64(const VAddr addr) { - return Read(addr); + if ((addr & 7) == 0) { + return Read(addr); + } else { + const u32 a{Read32(addr)}; + const u32 b{Read32(addr + sizeof(u32))}; + return (static_cast(b) << 32) | a; + } } void Write8(const VAddr addr, const u8 data) { @@ -135,15 +153,30 @@ struct Memory::Impl { } void Write16(const VAddr addr, const u16 data) { - Write(addr, data); + if ((addr & 1) == 0) { + Write(addr, data); + } else { + Write(addr, static_cast(data)); + Write(addr + sizeof(u8), static_cast(data >> 8)); + } } void Write32(const VAddr addr, const u32 data) { - Write(addr, data); + if ((addr & 3) == 0) { + Write(addr, data); + } else { + Write16(addr, static_cast(data)); + Write16(addr + sizeof(u16), static_cast(data >> 16)); + } } void Write64(const VAddr addr, const u64 data) { - Write(addr, data); + if ((addr & 7) == 0) { + Write(addr, data); + } else { + Write32(addr, static_cast(data)); + Write32(addr + sizeof(u32), static_cast(data >> 32)); + } } std::string ReadCString(VAddr vaddr, std::size_t max_length) {