mirror of https://github.com/PCSX2/pcsx2.git
microVU: Implemented some undocumented stuff which lets Champions Return to Arms get in-game.
The game still looks ugly, I'm not sure if its problems are gsdx or pcsx2. zeroGS just renders a black screen which it no help xD Note: I still need to optimize this fix. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1630 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
0efb1c534f
commit
1c37a9abf4
|
@ -83,11 +83,12 @@ public:
|
||||||
}
|
}
|
||||||
else { // Can do Simple Search (Only Matches the Important Pipeline Stuff)
|
else { // Can do Simple Search (Only Matches the Important Pipeline Stuff)
|
||||||
for (int i = 0; i <= listI; i++) {
|
for (int i = 0; i <= listI; i++) {
|
||||||
if ((linkI->block->pState.q == pState->q)
|
if ((linkI->block->pState.q == pState->q)
|
||||||
&& (linkI->block->pState.p == pState->p)
|
&& (linkI->block->pState.p == pState->p)
|
||||||
&& (linkI->block->pState.vi15 == pState->vi15)
|
&& (linkI->block->pState.vi15 == pState->vi15)
|
||||||
&& (linkI->block->pState.flags == pState->flags)
|
&& (linkI->block->pState.flags == pState->flags)
|
||||||
&& (linkI->block->pState.xgkick == pState->xgkick)
|
&& (linkI->block->pState.xgkick == pState->xgkick)
|
||||||
|
&& (linkI->block->pState.viBackUp == pState->viBackUp)
|
||||||
&& !(linkI->block->pState.needExactMatch & 5)) { return linkI->block; }
|
&& !(linkI->block->pState.needExactMatch & 5)) { return linkI->block; }
|
||||||
linkI = linkI->next;
|
linkI = linkI->next;
|
||||||
}
|
}
|
||||||
|
|
|
@ -356,10 +356,14 @@ microVUt(void) mVUanalyzeXGkick(mV, int Fs, int xCycles) {
|
||||||
microVUt(void) analyzeBranchVI(mV, int xReg, bool &infoVar) {
|
microVUt(void) analyzeBranchVI(mV, int xReg, bool &infoVar) {
|
||||||
if (!xReg) return;
|
if (!xReg) return;
|
||||||
int i;
|
int i;
|
||||||
int iEnd = aMin(5, mVUcount);
|
int iEnd = aMin(5, (mVUcount+1));
|
||||||
int bPC = iPC;
|
int bPC = iPC;
|
||||||
incPC2(-2);
|
incPC2(-2);
|
||||||
for (i = 0; i < iEnd; i++) {
|
for (i = 0; i < iEnd; i++) {
|
||||||
|
if (i == mVUcount) {
|
||||||
|
if (mVUpBlock->pState.viBackUp == xReg) infoVar = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if ((mVUlow.VI_write.reg == xReg) && mVUlow.VI_write.used) {
|
if ((mVUlow.VI_write.reg == xReg) && mVUlow.VI_write.used) {
|
||||||
if (mVUlow.readFlags || i == 5) break;
|
if (mVUlow.readFlags || i == 5) break;
|
||||||
if (i == 0) { incPC2(-2); continue; }
|
if (i == 0) { incPC2(-2); continue; }
|
||||||
|
@ -371,7 +375,7 @@ microVUt(void) analyzeBranchVI(mV, int xReg, bool &infoVar) {
|
||||||
}
|
}
|
||||||
if (i) {
|
if (i) {
|
||||||
incPC2(2);
|
incPC2(2);
|
||||||
mVUlow.backupVI = 1;
|
if (!infoVar) mVUlow.backupVI = 1;
|
||||||
iPC = bPC;
|
iPC = bPC;
|
||||||
infoVar = 1;
|
infoVar = 1;
|
||||||
DevCon::Status("microVU%d: Branch VI-Delay (%d) [%04x]", params getIndex, i, xPC);
|
DevCon::Status("microVU%d: Branch VI-Delay (%d) [%04x]", params getIndex, i, xPC);
|
||||||
|
|
|
@ -162,6 +162,12 @@ microVUt(void) branchWarning(mV) {
|
||||||
Console::Error("microVU%d Warning: Branch in E-bit/Branch delay slot! [%04x]", params mVU->index, xPC);
|
Console::Error("microVU%d Warning: Branch in E-bit/Branch delay slot! [%04x]", params mVU->index, xPC);
|
||||||
mVUlow.isNOP = 1;
|
mVUlow.isNOP = 1;
|
||||||
}
|
}
|
||||||
|
if (mVUinfo.isBdelay) { // Check if VI Reg Written to on Branch Delay
|
||||||
|
if (mVUlow.VI_write.reg && mVUlow.VI_write.used) {
|
||||||
|
mVUlow.backupVI = 1;
|
||||||
|
mVUregs.viBackUp = mVUlow.VI_write.reg;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Optimizes the End Pipeline State Removing Unnecessary Info
|
// Optimizes the End Pipeline State Removing Unnecessary Info
|
||||||
|
@ -294,6 +300,7 @@ microVUt(void) mVUinitFirstPass(microVU* mVU, microBlock* &pBlock, uptr pState,
|
||||||
mVUblock.x86ptrStart = thisPtr;
|
mVUblock.x86ptrStart = thisPtr;
|
||||||
pBlock = mVUblocks[mVUstartPC/2]->add(&mVUblock); // Add this block to block manager
|
pBlock = mVUblocks[mVUstartPC/2]->add(&mVUblock); // Add this block to block manager
|
||||||
mVUpBlock = pBlock;
|
mVUpBlock = pBlock;
|
||||||
|
mVUregs.viBackUp= 0;
|
||||||
mVUregs.flags = 0;
|
mVUregs.flags = 0;
|
||||||
mVUflagInfo = 0;
|
mVUflagInfo = 0;
|
||||||
mVUsFlagHack = CHECK_VU_FLAGHACK;
|
mVUsFlagHack = CHECK_VU_FLAGHACK;
|
||||||
|
|
|
@ -40,6 +40,7 @@ __declspec(align(16)) struct microRegInfo { // Ordered for Faster Compares
|
||||||
u8 p;
|
u8 p;
|
||||||
u8 r;
|
u8 r;
|
||||||
u8 xgkick;
|
u8 xgkick;
|
||||||
|
u8 viBackUp;
|
||||||
u8 VI[16];
|
u8 VI[16];
|
||||||
regInfo VF[32];
|
regInfo VF[32];
|
||||||
u8 flags; // clip x2 :: status x2
|
u8 flags; // clip x2 :: status x2
|
||||||
|
|
Loading…
Reference in New Issue