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.
This commit is contained in:
Stenzek 2024-05-17 22:25:02 +10:00
parent ea4efb4e52
commit 7476baced6
No known key found for this signature in database

View file

@ -46,7 +46,9 @@ enum : u32
VALID_X = (1u << 0), VALID_X = (1u << 0),
VALID_Y = (1u << 1), VALID_Y = (1u << 1),
VALID_Z = (1u << 2), 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_XY = (VALID_X | VALID_Y),
VALID_XYZ = (VALID_X | VALID_Y | VALID_Z), 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); PGXP_value* pMem = GetPtr(addr);
if (pMem) if (pMem)
{
*pMem = *value; *pMem = *value;
pMem->flags |= VALID_LOWZ | VALID_HIGHZ;
}
} }
ALWAYS_INLINE_RELEASE void CPU::PGXP::WriteMem16(const PGXP_value* src, u32 addr) 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->z = src->z;
dest->SetValid(COMP_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;
} }
} }