From fa3e63d46bbab6abf44c06f21ad7a88ccb88e83e Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 23 Sep 2013 21:46:45 +0200 Subject: [PATCH] On 32-bit platforms, PSPPointer must mask off the cache bit etc from pointers. --- Core/MemMap.h | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/Core/MemMap.h b/Core/MemMap.h index ee0546b158..11aa0cf471 100644 --- a/Core/MemMap.h +++ b/Core/MemMap.h @@ -15,8 +15,7 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#ifndef _MEMMAP_H -#define _MEMMAP_H +#pragma once // Includes #include @@ -89,7 +88,7 @@ enum SCRATCHPAD_SIZE = 0x4000, SCRATCHPAD_MASK = SCRATCHPAD_SIZE - 1, -#if defined(_M_IX86) || defined(_M_ARM32) +#if defined(_M_IX86) || defined(_M_ARM32) || defined (_XBOX) // This wraparound should work for PSP too. MEMVIEW32_MASK = 0x3FFFFFFF, #endif @@ -308,17 +307,29 @@ struct PSPPointer inline T &operator*() const { - return *(T *)(Memory::base + ptr); +#if defined(_M_IX86) || defined(_M_ARM32) || defined (_XBOX) + return *(T *)(Memory::base + (ptr & Memory::MEMVIEW32_MASK)); +#else + return *(T *)(Memory::base + ptr; +#endif } inline T &operator[](int i) const { +#if defined(_M_IX86) || defined(_M_ARM32) || defined (_XBOX) + return *((T *)(Memory::base + (ptr & Memory::MEMVIEW32_MASK)) + i); +#else return *((T *)(Memory::base + ptr) + i); +#endif } inline T *operator->() const { +#if defined(_M_IX86) || defined(_M_ARM32) || defined (_XBOX) + return (T *)(Memory::base + (ptr & Memory::MEMVIEW32_MASK)); +#else return (T *)(Memory::base + ptr); +#endif } inline PSPPointer operator+(int i) const @@ -444,5 +455,3 @@ inline bool operator>=(const PSPPointer &lhs, const PSPPointer &rhs) { return lhs.ptr >= rhs.ptr; } - -#endif