From 7476baced6bb1b673402f664611a381b3e5866cc Mon Sep 17 00:00:00 2001 From: Stenzek Date: Fri, 17 May 2024 22:25:02 +1000 Subject: [PATCH] CPU/PGXP: Track valid Z for lower/upper halves of 32-bit values Dragon Valor writes both lower and upper halfwords separately from non-valid-Z values. The Z needs to be cleared out. --- src/core/cpu_pgxp.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/core/cpu_pgxp.cpp b/src/core/cpu_pgxp.cpp index d1c0d41eb..e3679ea84 100644 --- a/src/core/cpu_pgxp.cpp +++ b/src/core/cpu_pgxp.cpp @@ -46,7 +46,9 @@ enum : u32 VALID_X = (1u << 0), VALID_Y = (1u << 1), VALID_Z = (1u << 2), - VALID_TAINTED_Z = (1u << 31), + VALID_LOWZ = (1u << 16), // Valid Z from the low part of a 32-bit value. + VALID_HIGHZ = (1u << 17), // Valid Z from the high part of a 32-bit value. + VALID_TAINTED_Z = (1u << 31), // X/Y has been changed, Z may not be accurate. VALID_XY = (VALID_X | VALID_Y), VALID_XYZ = (VALID_X | VALID_Y | VALID_Z), @@ -338,7 +340,10 @@ ALWAYS_INLINE_RELEASE void CPU::PGXP::WriteMem(const PGXP_value* value, u32 addr PGXP_value* pMem = GetPtr(addr); if (pMem) + { *pMem = *value; + pMem->flags |= VALID_LOWZ | VALID_HIGHZ; + } } ALWAYS_INLINE_RELEASE void CPU::PGXP::WriteMem16(const PGXP_value* src, u32 addr) @@ -368,6 +373,13 @@ ALWAYS_INLINE_RELEASE void CPU::PGXP::WriteMem16(const PGXP_value* src, u32 addr { dest->z = src->z; dest->SetValid(COMP_Z); + dest->flags |= hiword ? VALID_HIGHZ : VALID_LOWZ; + } + else + { + dest->flags &= hiword ? ~VALID_HIGHZ : ~VALID_LOWZ; + if (dest->flags & VALID_Z && !(dest->flags & (VALID_HIGHZ | VALID_LOWZ))) + dest->flags &= ~VALID_Z; } }