VU: Put XGKick 1 cycle behind to fix sync issues with Jaws Unleashed

Also added Jaws unleashed xgkick gamefixes to the DB
This commit is contained in:
refractionpcsx2 2021-09-14 19:52:56 +01:00
parent 59dfe52b52
commit d9c4ace613
4 changed files with 12 additions and 4 deletions

View File

@ -15189,6 +15189,8 @@ SLES-54169:
SLES-54170:
name: "Jaws Unleashed"
region: "PAL-M5"
gameFixes:
- XGKickHack # Fixes GS packet errors (and potential crash).
SLES-54171:
name: "Yakuza"
region: "PAL-M5"
@ -36646,6 +36648,8 @@ SLUS-21062:
name: "Jaws Unleashed"
region: "NTSC-U"
compat: 5
gameFixes:
- XGKickHack # Fixes GS packet errors (and potential crash).
SLUS-21063:
name: "Shining Tears"
region: "NTSC-U"

View File

@ -215,7 +215,7 @@ __fi void _vuTestPipes(VURegs* VU)
{
if (VU1.xgkickenable)
{
_vuXGKICKTransfer((VU1.cycle - VU1.xgkicklastcycle), false);
_vuXGKICKTransfer((VU1.cycle - VU1.xgkicklastcycle) - 1, false);
}
}
}
@ -2618,7 +2618,7 @@ static __ri void _vuXITOP(VURegs* VU)
VU->VI[_It_].US[0] = VU->GetVifRegs().itop;
}
void _vuXGKICKTransfer(u32 cycles, bool flush)
void _vuXGKICKTransfer(s32 cycles, bool flush)
{
if (!VU1.xgkickenable)
return;

View File

@ -59,4 +59,4 @@ extern void _vuTestUpperStalls(VURegs * VU, _VURegsNum *VUregsn);
extern void _vuTestLowerStalls(VURegs * VU, _VURegsNum *VUregsn);
extern void _vuAddUpperStalls(VURegs * VU, _VURegsNum *VUregsn);
extern void _vuAddLowerStalls(VURegs * VU, _VURegsNum *VUregsn);
extern void _vuXGKICKTransfer(u32 cycles, bool flush);
extern void _vuXGKICKTransfer(s32 cycles, bool flush);

View File

@ -1634,15 +1634,19 @@ void __fastcall _vuXGKICKTransfermVU(bool flush)
static __fi void mVU_XGKICK_SYNC(mV, bool flush)
{
// Add the single cycle remainder after this instruction, some games do the store
// on the second instruction after the kick and that needs to go through first
// but that's VERY close..
xTEST(ptr32[&VU1.xgkickenable], 0x1);
xForwardJZ32 skipxgkick;
xADD(ptr32[&VU1.xgkickcyclecount], mVUlow.kickcycles);
xADD(ptr32[&VU1.xgkickcyclecount], mVUlow.kickcycles-1);
xCMP(ptr32[&VU1.xgkickcyclecount], 2);
xForwardJL32 needcycles;
mVUbackupRegs(mVU, true, true);
xFastCall(_vuXGKICKTransfermVU, flush);
mVUrestoreRegs(mVU, true, true);
needcycles.SetTarget();
xADD(ptr32[&VU1.xgkickcyclecount], 1);
skipxgkick.SetTarget();
}