mirror of https://github.com/PCSX2/pcsx2.git
microVU: Found another bug with double branches, when there is a conditional in a JR/JALR delay slot it may have ended up in the wrong place. Unknown what it fixes, if anything.
VIF/Path3 Masking: Put a timing break in on Path2 transfers, this gives it chance to stop being busy incase it is closely followed by a path3 mask, which caused it to go out of time. Fixes Sensible Soccer. VIF: Fixed up a couple of typo's, which may or may not have done anything, one which was not setting an offset if it stalled on 1/4 of a quadword, which could have been disasterous if done by the wrong game. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@5564 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
c64c9a16ad
commit
8c86009a27
|
@ -161,6 +161,8 @@ template<int idx> __fi int _vifCode_Direct(int pass, const u8* data, bool isDire
|
||||||
if (vif1.tag.size == 0) {
|
if (vif1.tag.size == 0) {
|
||||||
vif1.cmd = 0;
|
vif1.cmd = 0;
|
||||||
vif1.pass = 0;
|
vif1.pass = 0;
|
||||||
|
vif1.vifstalled.enabled = true;
|
||||||
|
vif1.vifstalled.value = VIF_TIMING_BREAK;
|
||||||
}
|
}
|
||||||
return ret / 4;
|
return ret / 4;
|
||||||
}
|
}
|
||||||
|
@ -188,12 +190,12 @@ vifOp(vifCode_Flush) {
|
||||||
GUNIT_WARN("Vif Flush: Stall!");
|
GUNIT_WARN("Vif Flush: Stall!");
|
||||||
//gifUnit.PrintInfo();
|
//gifUnit.PrintInfo();
|
||||||
vif1Regs.stat.VGW = true;
|
vif1Regs.stat.VGW = true;
|
||||||
vifX.vifstalled.enabled = true;
|
vif1.vifstalled.enabled = true;
|
||||||
vifX.vifstalled.value = VIF_TIMING_BREAK;
|
vif1.vifstalled.value = VIF_TIMING_BREAK;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else vifX.cmd = 0;
|
else vif1.cmd = 0;
|
||||||
vifX.pass = 0;
|
vif1.pass = 0;
|
||||||
}
|
}
|
||||||
pass3 { VifCodeLog("Flush"); }
|
pass3 { VifCodeLog("Flush"); }
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -213,8 +215,8 @@ vifOp(vifCode_FlushA) {
|
||||||
{
|
{
|
||||||
GUNIT_WARN("Vif FlushA: Stall!");
|
GUNIT_WARN("Vif FlushA: Stall!");
|
||||||
vif1Regs.stat.VGW = true;
|
vif1Regs.stat.VGW = true;
|
||||||
vifX.vifstalled.enabled = true;
|
vif1.vifstalled.enabled = true;
|
||||||
vifX.vifstalled.value = VIF_TIMING_BREAK;
|
vif1.vifstalled.value = VIF_TIMING_BREAK;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
//gifUnit.PrintInfo();
|
//gifUnit.PrintInfo();
|
||||||
|
@ -240,8 +242,8 @@ vifOp(vifCode_FlushA) {
|
||||||
}
|
}
|
||||||
else*/
|
else*/
|
||||||
//Didn't need to stall!
|
//Didn't need to stall!
|
||||||
vifX.cmd = 0;
|
vif1.cmd = 0;
|
||||||
vifX.pass = 0;
|
vif1.pass = 0;
|
||||||
}
|
}
|
||||||
pass3 { VifCodeLog("FlushA"); }
|
pass3 { VifCodeLog("FlushA"); }
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -107,9 +107,9 @@ _vifT static __fi bool vifTransfer(u32 *data, int size, bool TTE) {
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(vifX.irqoffset.value > 1)
|
if(vifX.irqoffset.value != 0){
|
||||||
vifX.irqoffset.enabled = true;
|
vifX.irqoffset.enabled = true;
|
||||||
else
|
}else
|
||||||
vifX.irqoffset.enabled = false;
|
vifX.irqoffset.enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1245,7 +1245,7 @@ void setBranchA(mP, int x, int _x_) {
|
||||||
void condEvilBranch(mV, int JMPcc) {
|
void condEvilBranch(mV, int JMPcc) {
|
||||||
if (mVUlow.badBranch) {
|
if (mVUlow.badBranch) {
|
||||||
xMOV(ptr32[&mVU.branch], gprT1);
|
xMOV(ptr32[&mVU.branch], gprT1);
|
||||||
xMOV(ptr32[&mVU.badBranch], branchAddr);
|
xMOV(ptr32[&mVU.badBranch], branchAddrN);
|
||||||
|
|
||||||
xCMP(gprT1b, 0);
|
xCMP(gprT1b, 0);
|
||||||
xForwardJump8 cJMP((JccComparisonType)JMPcc);
|
xForwardJump8 cJMP((JccComparisonType)JMPcc);
|
||||||
|
@ -1261,6 +1261,9 @@ void condEvilBranch(mV, int JMPcc) {
|
||||||
xMOV(gprT1, ptr32[&mVU.badBranch]); // Branch Not Taken
|
xMOV(gprT1, ptr32[&mVU.badBranch]); // Branch Not Taken
|
||||||
xMOV(ptr32[&mVU.evilBranch], gprT1);
|
xMOV(ptr32[&mVU.evilBranch], gprT1);
|
||||||
cJMP.SetTarget();
|
cJMP.SetTarget();
|
||||||
|
incPC(-2);
|
||||||
|
if(mVUlow.branch >= 9) DevCon.Warning("Conditional in JALR/JR delay slot - If game broken report to PCSX2 Team");
|
||||||
|
incPC(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
mVUop(mVU_B) {
|
mVUop(mVU_B) {
|
||||||
|
@ -1284,7 +1287,7 @@ mVUop(mVU_BAL) {
|
||||||
mVUallocVIb(mVU, gprT1, _It_);
|
mVUallocVIb(mVU, gprT1, _It_);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mVUlow.badBranch) { xMOV(ptr32[&mVU.badBranch], branchAddr); }
|
if (mVUlow.badBranch) { xMOV(ptr32[&mVU.badBranch], branchAddrN); }
|
||||||
if (mVUlow.evilBranch) { xMOV(ptr32[&mVU.evilBranch], branchAddr);}
|
if (mVUlow.evilBranch) { xMOV(ptr32[&mVU.evilBranch], branchAddr);}
|
||||||
mVU.profiler.EmitOp(opBAL);
|
mVU.profiler.EmitOp(opBAL);
|
||||||
}
|
}
|
||||||
|
@ -1382,9 +1385,11 @@ void normJumpPass2(mV) {
|
||||||
mVUallocVIa(mVU, gprT1, _Is_);
|
mVUallocVIa(mVU, gprT1, _Is_);
|
||||||
xSHL(gprT1, 3);
|
xSHL(gprT1, 3);
|
||||||
xAND(gprT1, mVU.microMemSize - 8);
|
xAND(gprT1, mVU.microMemSize - 8);
|
||||||
|
|
||||||
if (!mVUlow.evilBranch) xMOV(ptr32[&mVU.branch], gprT1);
|
if (!mVUlow.evilBranch) { xMOV(ptr32[&mVU.branch], gprT1 ); }
|
||||||
else { xMOV(ptr32[&mVU.evilBranch], gprT1);}
|
else { xMOV(ptr32[&mVU.evilBranch], gprT1 ); }
|
||||||
|
//If delay slot is conditional, it uses badBranch to go to its target
|
||||||
|
if (mVUlow.badBranch) { xADD(gprT1, 8); xMOV(ptr32[&mVU.badBranch], gprT1); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue