mirror of https://github.com/PCSX2/pcsx2.git
Fixed a freeze up bug from r252. The IOP must run at least one branch test for every EE branch test, which was a problem with the extended-length IOP_WAIT_CYCLE.
git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@254 a6443dda-0b58-4228-96e9-037be469359c
This commit is contained in:
parent
76f08e165e
commit
41d466120b
|
@ -71,7 +71,7 @@ void psxShutdown() {
|
||||||
|
|
||||||
void psxException(u32 code, u32 bd) {
|
void psxException(u32 code, u32 bd) {
|
||||||
// PSXCPU_LOG("psxException %x: %x, %x\n", code, psxHu32(0x1070), psxHu32(0x1074));
|
// PSXCPU_LOG("psxException %x: %x, %x\n", code, psxHu32(0x1070), psxHu32(0x1074));
|
||||||
// SysPrintf("psxException %x: %x, %x\n", code, psxHu32(0x1070), psxHu32(0x1074));
|
//SysPrintf("!! psxException %x: %x, %x\n", code, psxHu32(0x1070), psxHu32(0x1074));
|
||||||
// Set the Cause
|
// Set the Cause
|
||||||
psxRegs.CP0.n.Cause &= ~0x7f;
|
psxRegs.CP0.n.Cause &= ~0x7f;
|
||||||
psxRegs.CP0.n.Cause |= code;
|
psxRegs.CP0.n.Cause |= code;
|
||||||
|
@ -171,16 +171,6 @@ static void _psxTestInterrupts() {
|
||||||
|
|
||||||
void psxBranchTest()
|
void psxBranchTest()
|
||||||
{
|
{
|
||||||
// EEsCycle update was moved to outside the psxBranchTest. Since it gets run
|
|
||||||
// for every branch now, the following code block is obsolete.
|
|
||||||
|
|
||||||
/*EEsCycle -= (psxRegs.cycle - IOPoCycle) << 3;
|
|
||||||
IOPoCycle = psxRegs.cycle;
|
|
||||||
if( EEsCycle > 0 )
|
|
||||||
g_psxNextBranchCycle = psxRegs.cycle + min(IOP_WAIT_CYCLE, (EEsCycle>>3));
|
|
||||||
else
|
|
||||||
g_psxNextBranchCycle = psxRegs.cycle;*/
|
|
||||||
|
|
||||||
g_psxNextBranchCycle = psxRegs.cycle + IOP_WAIT_CYCLE;
|
g_psxNextBranchCycle = psxRegs.cycle + IOP_WAIT_CYCLE;
|
||||||
|
|
||||||
if ((int)(psxRegs.cycle - psxNextsCounter) >= psxNextCounter)
|
if ((int)(psxRegs.cycle - psxNextsCounter) >= psxNextCounter)
|
||||||
|
|
|
@ -438,6 +438,9 @@ void cpuBranchTest()
|
||||||
EEsCycle += cpuRegs.cycle - EEoCycle;
|
EEsCycle += cpuRegs.cycle - EEoCycle;
|
||||||
EEoCycle = cpuRegs.cycle;
|
EEoCycle = cpuRegs.cycle;
|
||||||
|
|
||||||
|
// Force the IOP to run at least one branch test:
|
||||||
|
// If the IOP doesn't run it's branch test, bad things can happen.
|
||||||
|
g_psxNextBranchCycle = min( g_psxNextBranchCycle, EEsCycle >> 3 );
|
||||||
psxCpu->ExecuteBlock();
|
psxCpu->ExecuteBlock();
|
||||||
|
|
||||||
if (VU0.VI[REG_VPU_STAT].UL & 0x1) {
|
if (VU0.VI[REG_VPU_STAT].UL & 0x1) {
|
||||||
|
|
|
@ -984,34 +984,38 @@ static void iPsxBranchTest(u32 newpc, u32 cpuBranch)
|
||||||
if( !USE_FAST_BRANCHES || cpuBranch ) {
|
if( !USE_FAST_BRANCHES || cpuBranch ) {
|
||||||
MOV32MtoR(ECX, (uptr)&psxRegs.cycle);
|
MOV32MtoR(ECX, (uptr)&psxRegs.cycle);
|
||||||
ADD32ItoR(ECX, s_psxBlockCycles*PSXCYCLE_MULT); // greater mult factor causes nfsmw to crash
|
ADD32ItoR(ECX, s_psxBlockCycles*PSXCYCLE_MULT); // greater mult factor causes nfsmw to crash
|
||||||
SUB32ItoM((uptr)&EEsCycle, s_psxBlockCycles*PSXCYCLE_MULT*8); // 8 EE clocks for every IOP clock.
|
|
||||||
MOV32RtoM((uptr)&psxRegs.cycle, ECX); // update cycles
|
MOV32RtoM((uptr)&psxRegs.cycle, ECX); // update cycles
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SUB32ItoM((uptr)&EEsCycle, s_psxBlockCycles*8); // 8 EE clocks for every IOP clock.
|
SUB32ItoM((uptr)&EEsCycle, s_psxBlockCycles*PSXCYCLE_MULT*8); // 8 EE clocks for every IOP clock.
|
||||||
ADD32ItoM((uptr)&psxRegs.cycle, s_psxBlockCycles*PSXCYCLE_MULT);
|
ADD32ItoM((uptr)&psxRegs.cycle, s_psxBlockCycles*PSXCYCLE_MULT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SUB32MtoR(ECX, (uptr)&g_psxNextBranchCycle);
|
// check if we've caught up with the EE
|
||||||
|
SUB32ItoM((uptr)&EEsCycle, s_psxBlockCycles*PSXCYCLE_MULT*8); // 8 EE clocks for every IOP clock.
|
||||||
// check if should branch
|
|
||||||
j8Ptr[0] = JS8( 0 );
|
|
||||||
|
|
||||||
CALLFunc((uptr)psxBranchTest);
|
|
||||||
|
|
||||||
CMP32ItoM((uptr)&EEsCycle, 0);
|
|
||||||
j8Ptr[2] = JG8(0);
|
j8Ptr[2] = JG8(0);
|
||||||
|
|
||||||
|
// Break the Block-execute Loop here.
|
||||||
if( REC_INC_STACK )
|
if( REC_INC_STACK )
|
||||||
ADD64ItoR(ESP, REC_INC_STACK);
|
ADD64ItoR(ESP, REC_INC_STACK);
|
||||||
RET2();
|
RET2();
|
||||||
|
|
||||||
|
// Continue onward with branching here:
|
||||||
x86SetJ8( j8Ptr[2] );
|
x86SetJ8( j8Ptr[2] );
|
||||||
|
|
||||||
|
// check if should branch
|
||||||
|
SUB32MtoR(ECX, (uptr)&g_psxNextBranchCycle);
|
||||||
|
j8Ptr[0] = JS8( 0 );
|
||||||
|
|
||||||
|
CALLFunc((uptr)psxBranchTest);
|
||||||
|
|
||||||
if( newpc != 0xffffffff ) {
|
if( newpc != 0xffffffff ) {
|
||||||
CMP32ItoM((uptr)&psxRegs.pc, newpc);
|
CMP32ItoM((uptr)&psxRegs.pc, newpc);
|
||||||
JNE32((uptr)psxDispatcherReg - ( (uptr)x86Ptr + 6 ));
|
JNE32((uptr)psxDispatcherReg - ( (uptr)x86Ptr + 6 ));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Skip branch jump target here:
|
||||||
x86SetJ8( j8Ptr[0] );
|
x86SetJ8( j8Ptr[0] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue