diff --git a/Core/MIPS/MIPSDebugInterface.cpp b/Core/MIPS/MIPSDebugInterface.cpp index f81b55ca98..bffdee83b6 100644 --- a/Core/MIPS/MIPSDebugInterface.cpp +++ b/Core/MIPS/MIPSDebugInterface.cpp @@ -159,37 +159,25 @@ public: return EXPR_TYPE_UINT; } - bool getMemoryValue(uint32_t address, int size, uint32_t& dest, char* error) override - { - switch (size) - { - case 1: case 2: case 4: - break; - default: - sprintf(error,"Invalid memory access size %d",size); - return false; - } + bool getMemoryValue(uint32_t address, int size, uint32_t& dest, char* error) override { + // We allow, but ignore, bad access. + // If we didn't, log/condition statements that reference registers couldn't be configured. + bool valid = Memory::IsValidRange(address, size); - if (address % size) - { - sprintf(error,"Invalid memory access (unaligned)"); - return false; - } - - switch (size) - { + switch (size) { case 1: - dest = Memory::Read_U8(address); - break; + dest = valid ? Memory::Read_U8(address) : 0; + return true; case 2: - dest = Memory::Read_U16(address); - break; + dest = valid ? Memory::Read_U16(address) : 0; + return true; case 4: - dest = Memory::Read_U32(address); - break; + dest = valid ? Memory::Read_U32(address) : 0; + return true; } - return true; + sprintf(error, "Unexpected memory access size %d", size); + return false; } private: diff --git a/GPU/Common/GPUDebugInterface.cpp b/GPU/Common/GPUDebugInterface.cpp index a94a3b46a1..4d80d4b83c 100644 --- a/GPU/Common/GPUDebugInterface.cpp +++ b/GPU/Common/GPUDebugInterface.cpp @@ -916,20 +916,19 @@ ExpressionType GEExpressionFunctions::getFieldType(GECmdFormat fmt, GECmdField f } bool GEExpressionFunctions::getMemoryValue(uint32_t address, int size, uint32_t &dest, char *error) { - if (!Memory::IsValidRange(address, size)) { - sprintf(error, "Invalid address or size %08x + %d", address, size); - return false; - } + // We allow, but ignore, bad access. + // If we didn't, log/condition statements that reference registers couldn't be configured. + bool valid = Memory::IsValidRange(address, size); switch (size) { case 1: - dest = Memory::Read_U8(address); + dest = valid ? Memory::Read_U8(address) : 0; return true; case 2: - dest = Memory::Read_U16(address); + dest = valid ? Memory::Read_U16(address) : 0; return true; case 4: - dest = Memory::Read_U32(address); + dest = valid ? Memory::Read_U32(address) : 0; return true; }