diff --git a/pcsx2/SPR.cpp b/pcsx2/SPR.cpp index bdedf6ed2d..88c8ee53d4 100644 --- a/pcsx2/SPR.cpp +++ b/pcsx2/SPR.cpp @@ -179,7 +179,7 @@ static __forceinline void _dmaSPR0() { spr0->madr = ptag[1]; //MADR = ADDR field SPR_LOG("spr0 dmaChain %8.8x_%8.8x size=%d, id=%d, addr=%lx spr=%lx\n", - ptag[1], ptag[0], spr0->qwc, id, spr0->madr); + ptag[1], ptag[0], spr0->qwc, id, spr0->madr, spr0->sadr); if ((psHu32(DMAC_CTRL) & 0x30) == 0x20) { // STS == fromSPR SysPrintf("SPR stall control\n"); @@ -270,12 +270,12 @@ void dmaSPR0() { // fromSPR SPR_LOG("dmaSPR0 chcr = %lx, madr = %lx, qwc = %lx, sadr = %lx\n", spr0->chcr, spr0->madr, spr0->qwc, spr0->sadr); - if ((spr0->chcr & 0xc) == 0x4){ + if ((spr0->chcr & 0xc) == 0x4 && spr0->qwc == 0){ u32 *ptag; ptag = (u32*)&PS2MEM_SCRATCH[spr0->sadr & 0x3fff]; //Set memory pointer to SADR - spr0->qwc = (u16)ptag[0]; //QWC set to lower 16bits of the tag - CPU_INT(8, spr0->qwc / BIAS); - spr0->qwc = 0; + ptag[0] &= 0xffff; //QWC set to lower 16bits of the tag + CPU_INT(8, ptag[0] / BIAS); + // spr0->qwc = 0; return; } // COMPLETE HACK!!! For now at least.. FFX Videos dont rely on interrupts or reading DMA values @@ -429,12 +429,12 @@ void dmaSPR1() { // toSPR spr1->tadr, spr1->sadr); #endif - if ((spr1->chcr & 0xc) == 0x4){ + if ((spr1->chcr & 0xc) == 0x4 && spr1->qwc == 0){ u32 *ptag; ptag = (u32*)dmaGetAddr(spr1->tadr); //Set memory pointer to TADR - spr1->qwc = (u16)ptag[0]; //QWC set to lower 16bits of the tag - CPU_INT(9, spr1->qwc / BIAS); - spr1->qwc = 0; + ptag[0] &= 0xffff; //QWC set to lower 16bits of the tag + CPU_INT(9, ptag[0] / BIAS); + //spr1->qwc = 0; return; } // COMPLETE HACK!!! For now at least.. FFX Videos dont rely on interrupts or reading DMA values diff --git a/pcsx2/x86/iVUmicroUpper.cpp b/pcsx2/x86/iVUmicroUpper.cpp index ebf09fe1bf..28b52c48c2 100644 --- a/pcsx2/x86/iVUmicroUpper.cpp +++ b/pcsx2/x86/iVUmicroUpper.cpp @@ -1746,6 +1746,7 @@ void recVUMI_MADD_toD(VURegs *VU, int regd, int info) vuFloat5_useEAX( EEREC_ACC, EEREC_TEMP, _X_Y_Z_W ); } + if( _X_Y_Z_W == 8 ) { if( regd == EEREC_ACC ) { SSE_MOVSS_XMM_to_XMM(EEREC_TEMP, EEREC_S); @@ -2583,7 +2584,8 @@ void recVUMI_MAX_xyzw(VURegs *VU, int xyzw, int info) VU_MERGE_REGS(EEREC_D, EEREC_TEMP); } else { - if( xyzw < 3 ) SSE_XORPS_XMM_to_XMM(EEREC_D, EEREC_D); + //If VF0.w isnt chosen as the constant, then its going to be MAX( 0, VF0 ), so the result is VF0 + if( xyzw < 3 ) { SSE_MOVAPS_M128_to_XMM(EEREC_D, (uptr)&VU->VF[0].UL[0]); } else SSE_MOVAPS_M128_to_XMM(EEREC_D, (uptr)s_fones); } return; @@ -2753,6 +2755,23 @@ void recVUMI_MINI_xyzw(VURegs *VU, int xyzw, int info) if ( _Fd_ == 0 ) return; //SysPrintf ("recVUMI_MINI_xyzw \n"); + if (_Fs_ == 0 && _Ft_ == 0) + { + if( _X_Y_Z_W == 0xf ) + { + //If VF0.w is the constant, the result will match VF0, else its all 0's + if(xyzw == 3) SSE_MOVAPS_M128_to_XMM(EEREC_D, (uptr)&VU->VF[0].UL[0]); + else SSE_XORPS_XMM_to_XMM(EEREC_D, EEREC_D); + } + else + { + //If VF0.w is the constant, the result will match VF0, else its all 0's + if(xyzw == 3) SSE_MOVAPS_M128_to_XMM(EEREC_TEMP, (uptr)&VU->VF[0].UL[0]); + else SSE_XORPS_XMM_to_XMM(EEREC_TEMP, EEREC_TEMP); + VU_MERGE_REGS(EEREC_D, EEREC_TEMP); + } + return; + } if (MINMAXFIX) MINMAXlogical(VU, info, 1, 2, 0, xyzw); else