T/D flag interrupting was missing on the VUs.

Nneeve implemented it :)

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@886 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
ramapcsx2 2009-04-02 21:04:45 +00:00
parent a8d9cbc25d
commit 2caebe0069
4 changed files with 10 additions and 2 deletions

View File

@ -76,12 +76,14 @@ static void _vu0Exec(VURegs* VU)
VU0.VI[REG_VPU_STAT].UL|= 0x2;
hwIntcIrq(INTC_VU0);
}
VU->ebit = 1;
}
if (ptr[1] & 0x08000000) { /* T flag */
if (VU0.VI[REG_FBRST].UL & 0x8) {
VU0.VI[REG_VPU_STAT].UL|= 0x4;
hwIntcIrq(INTC_VU0);
}
VU->ebit = 1;
}
VU->code = ptr[1];

View File

@ -71,12 +71,14 @@ static void _vu1Exec(VURegs* VU)
VU0.VI[REG_VPU_STAT].UL|= 0x200;
hwIntcIrq(INTC_VU1);
}
VU->ebit = 1;
}
if (ptr[1] & 0x08000000) { /* T flag */
if (VU0.VI[REG_FBRST].UL & 0x800) {
VU0.VI[REG_VPU_STAT].UL|= 0x400;
hwIntcIrq(INTC_VU1);
}
VU->ebit = 1;
}
VUM_LOG("VU->cycle = %d (flags st=%x;mac=%x;clip=%x,q=%f)", VU->cycle, VU->statusflag, VU->macflag, VU->clipflag, VU->q.F);

View File

@ -474,7 +474,11 @@ void SuperVUAnalyzeOp(VURegs *VU, _vuopinfo *info, _VURegsNum* pCodeRegs)
if (ptr[1] & 0x40000000) { // EOP
branch |= 8;
}
if (ptr[1] & 0x18000000) { // T/D flags
branch |= 16 | 8; //stop right after this instruction
}
VU->code = ptr[1];
if (VU == &VU1) VU1regs_UPPER_OPCODE[VU->code & 0x3f](uregs);
else VU0regs_UPPER_OPCODE[VU->code & 0x3f](uregs);

View File

@ -1246,7 +1246,7 @@ static VuBaseBlock* SuperVUBuildBlocks(VuBaseBlock* parent, u32 startpc, const V
if( pinst->info.p&VUOP_WRITE )
pinst->pqcycles = PWaitTimes[pinst->info.pqinst]+1;
if( prevbranch ) {
if( prevbranch || (branch & 16)) {
break;
}