Index: pcsx2/x86/ix86-32/iR5900-32.cpp =================================================================== --- pcsx2/x86/ix86-32/iR5900-32.cpp (revision 912) +++ pcsx2/x86/ix86-32/iR5900-32.cpp (working copy) @@ -1690,7 +1690,7 @@ u32 sz=(s_nEndBlock-startpc)>>2; - u32 inpage_ptr=startpc; + u32 inpage_ptr=HWADDR(startpc); u32 inpage_sz=sz*4; while(inpage_sz) @@ -1705,20 +1705,32 @@ mmap_MarkCountedRamPage(PSM(inpage_ptr),inpage_ptr&~0xFFF); else { - MOV32ItoR(ECX, startpc); MOV32ItoR(EDX, sz); - u32 lpc=inpage_ptr; - u32 stg=pgsz; - while(stg>0) - { + if (pgsz < 8) { // fine tuning needed + u32 lpc=inpage_ptr; + u32 stg=pgsz; + while(stg>0) + { + // was dyna_block_discard_recmem. See note in recResetEE for details. + MOV32ItoR(ECX, startpc); + CMP32ItoM((uptr)PSM(lpc),*(u32*)PSM(lpc)); + JNE32(((u32)&dyna_block_discard)- ( (u32)x86Ptr[0] + 6 )); + + stg-=4; + lpc+=4; + } + } else { // was dyna_block_discard_recmem. See note in recResetEE for details. - CMP32ItoM((uptr)PSM(lpc),*(u32*)PSM(lpc)); - JNE32(((u32)&dyna_block_discard)- ( (u32)x86Ptr[0] + 6 )); + MOV32ItoR(ESI, (u32)PSM(inpage_ptr)); + MOV32ItoR(EDI, (u32)&recRAMCopy[inpage_ptr / 4]); + MOV32ItoR(ECX, pgsz / 4); + *x86Ptr[_EmitterId_]++ = 0xF3; + *x86Ptr[_EmitterId_]++ = 0xA7; + MOV32ItoR(ECX, startpc); + JNE32(((u32)&dyna_block_discard) - ( (u32)x86Ptr[0] + 6 )); + } - stg-=4; - lpc+=4; - } DbgCon::WriteLn("Manual block @ %08X : %08X %d %d %d %d", params startpc,inpage_ptr,pgsz,0x1000-inpage_offs,inpage_sz,sz*4); }