summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorbooto <remornicus@gmail.com>2019-05-31 02:46:17 -0400
committerbooto <remornicus@gmail.com>2019-05-31 03:22:00 -0400
commitbc8a4f99c754c13b8e40d88ef012e93934f98125 (patch)
treed72ec5d2469d5efea2242e3aad19712502552b53 /Source/Core
parent8046f40784ac740b046b59f658aabb82edfdcc76 (diff)
VideoCommon: Constrain the array_base registers
The array_base registers as part of CP state do not seem to incorporate the upper bits in the physical address they try to access.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/VideoCommon/CommandProcessor.cpp9
-rw-r--r--Source/Core/VideoCommon/CommandProcessor.h2
-rw-r--r--Source/Core/VideoCommon/VertexLoaderManager.cpp3
3 files changed, 12 insertions, 2 deletions
diff --git a/Source/Core/VideoCommon/CommandProcessor.cpp b/Source/Core/VideoCommon/CommandProcessor.cpp
index 897675f4e0..eb571a4672 100644
--- a/Source/Core/VideoCommon/CommandProcessor.cpp
+++ b/Source/Core/VideoCommon/CommandProcessor.cpp
@@ -138,12 +138,19 @@ void Init()
et_UpdateInterrupts = CoreTiming::RegisterEvent("CPInterrupt", UpdateInterrupts_Wrapper);
}
+u32 GetPhysicalAddressMask()
+{
+ // Physical addresses in CP seem to ignore some of the upper bits (depending on platform)
+ // This can be observed in CP MMIO registers by setting to 0xffffffff and then reading back.
+ return SConfig::GetInstance().bWii ? 0x1fffffff : 0x03ffffff;
+}
+
void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
{
constexpr u16 WMASK_NONE = 0x0000;
constexpr u16 WMASK_ALL = 0xffff;
constexpr u16 WMASK_LO_ALIGN_32BIT = 0xffe0;
- const u16 WMASK_HI_RESTRICT = SConfig::GetInstance().bWii ? 0x1fff : 0x03ff;
+ const u16 WMASK_HI_RESTRICT = GetPhysicalAddressMask() >> 16;
struct
{
diff --git a/Source/Core/VideoCommon/CommandProcessor.h b/Source/Core/VideoCommon/CommandProcessor.h
index 77623357d9..c246d5651d 100644
--- a/Source/Core/VideoCommon/CommandProcessor.h
+++ b/Source/Core/VideoCommon/CommandProcessor.h
@@ -169,4 +169,6 @@ void SetCpStatusRegister();
void HandleUnknownOpcode(u8 cmd_byte, void* buffer, bool preprocess);
+u32 GetPhysicalAddressMask();
+
} // namespace CommandProcessor
diff --git a/Source/Core/VideoCommon/VertexLoaderManager.cpp b/Source/Core/VideoCommon/VertexLoaderManager.cpp
index 4fd7e164d7..a57cb71929 100644
--- a/Source/Core/VideoCommon/VertexLoaderManager.cpp
+++ b/Source/Core/VideoCommon/VertexLoaderManager.cpp
@@ -16,6 +16,7 @@
#include "Core/HW/Memmap.h"
#include "VideoCommon/BPMemory.h"
+#include "VideoCommon/CommandProcessor.h"
#include "VideoCommon/DataReader.h"
#include "VideoCommon/IndexGenerator.h"
#include "VideoCommon/NativeVertexFormat.h"
@@ -347,7 +348,7 @@ void LoadCPReg(u32 sub_cmd, u32 value, bool is_preprocess)
// Pointers to vertex arrays in GC RAM
case 0xA0:
- state->array_bases[sub_cmd & 0xF] = value;
+ state->array_bases[sub_cmd & 0xF] = value & CommandProcessor::GetPhysicalAddressMask();
state->bases_dirty = true;
break;