From 1d5c90d3707406a5712b07e7075f75e277b13e0a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 5 Sep 2022 19:37:58 -0700 Subject: [PATCH] Ge: Read matrix num/data back like hardware. In case any game accidentally relies on this. --- Core/HLE/sceGe.cpp | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/Core/HLE/sceGe.cpp b/Core/HLE/sceGe.cpp index 46230373d28e..81667a448e8e 100644 --- a/Core/HLE/sceGe.cpp +++ b/Core/HLE/sceGe.cpp @@ -565,8 +565,32 @@ static int sceGeGetMtx(int type, u32 matrixPtr) { static u32 sceGeGetCmd(int cmd) { if (cmd >= 0 && cmd < (int)ARRAY_SIZE(gstate.cmdmem)) { - // Does not mask away the high bits. - return hleLogSuccessInfoX(SCEGE, gstate.cmdmem[cmd]); + // Does not mask away the high bits. But matrix regs don't read back. + u32 val = gstate.cmdmem[cmd]; + switch (cmd) { + case GE_CMD_BONEMATRIXDATA: + case GE_CMD_WORLDMATRIXDATA: + case GE_CMD_VIEWMATRIXDATA: + case GE_CMD_PROJMATRIXDATA: + case GE_CMD_TGENMATRIXDATA: + val &= 0xFF000000; + break; + + case GE_CMD_BONEMATRIXNUMBER: + val &= 0xFF00007F; + break; + + case GE_CMD_WORLDMATRIXNUMBER: + case GE_CMD_VIEWMATRIXNUMBER: + case GE_CMD_PROJMATRIXNUMBER: + case GE_CMD_TGENMATRIXNUMBER: + val &= 0xFF00000F; + break; + + default: + break; + } + return hleLogSuccessInfoX(SCEGE, val); } return hleLogError(SCEGE, SCE_KERNEL_ERROR_INVALID_INDEX); }