All pastes #1398852 Raw Edit

Something

public diff v1 · immutable
#1398852 ·published 2009-04-21 21:24 UTC
rendered paste body
Index: pcsx2/Memory.cpp===================================================================--- pcsx2/Memory.cpp	(revision 1037)+++ pcsx2/Memory.cpp	(working copy)@@ -820,6 +820,7 @@  	u32 offset=((u8*)ptr-psM); 	offset>>=12;+	psMPWC[(offset/32)] &= ~(1<<(offset&31));  	for (u32 i=0;i<psMPWVA[offset].size();i++) 	{Index: pcsx2/x86/ix86-32/iR5900-32.cpp===================================================================--- pcsx2/x86/ix86-32/iR5900-32.cpp	(revision 1037)+++ pcsx2/x86/ix86-32/iR5900-32.cpp	(working copy)@@ -48,6 +48,8 @@  #include "NakedAsm.h" +using namespace x86Emitter;+ using namespace R5900;  // used to disable register freezing during cpuBranchTests (registers@@ -92,6 +94,7 @@ static BASEBLOCKEX* s_pCurBlockEx = NULL; static u32 s_nEndBlock = 0; // what pc the current block ends	 static u32 s_nHasDelay = 0;+static bool speedHackBlock;  // save states for branches GPR_reg64 s_saveConstRegs[32];@@ -1147,19 +1150,23 @@ 	// Equiv code to: 	//    cpuRegs.cycle += blockcycles; 	//    if( cpuRegs.cycle > g_nextBranchCycle ) { DoEvents(); }-	MOV32MtoR(EAX, (uptr)&cpuRegs.cycle);-	ADD32ItoR(EAX, eeScaleBlockCycles());-	MOV32RtoM((uptr)&cpuRegs.cycle, EAX); // update cycles-	SUB32MtoR(EAX, (uptr)&g_nextBranchCycle);--	if (!noDispatch) {-		if (newpc == 0xffffffff)-			JS32((uptr)DispatcherReg - ( (uptr)x86Ptr + 6 ));-		else-			iBranch(newpc, 1);+	if (speedHackBlock) {+		xMOV(eax, ptr32[&g_nextBranchCycle]);+		xMOV(ptr32[&cpuRegs.cycle], eax);+		RET();+	} else {+		MOV32MtoR(EAX, (uptr)&cpuRegs.cycle);+		ADD32ItoR(EAX, eeScaleBlockCycles());+		MOV32RtoM((uptr)&cpuRegs.cycle, EAX); // update cycles+		SUB32MtoR(EAX, (uptr)&g_nextBranchCycle);+		if (!noDispatch) {+			if (newpc == 0xffffffff)+				JS32((uptr)DispatcherReg - ( (uptr)x86Ptr + 6 ));+			else+				iBranch(newpc, 1);+		}+		RET(); 	}--	RET(); }  static void checkcodefn()@@ -1355,6 +1362,13 @@ 	Cpu->Clear(start,sz); } +void __fastcall dyna_block_reset(u32 start,u32 sz)+{+	DevCon::WriteLn("dyna_block_reset %08X , count %d", params start,sz);+	Cpu->Clear(start & ~0xfffUL, 0x400);+	mmap_MarkCountedRamPage(PSM(start), start & ~0xfffUL);+}+ void recRecompile( const u32 startpc ) { 	u32 i = 0;@@ -1384,6 +1398,10 @@ 	x86Align(16); 	recPtr = x86Ptr; +	speedHackBlock = false;+	if (HWADDR(startpc) == 0x81fc0)+		speedHackBlock = true;+ 	s_pCurBlock = PC_GETBLOCK(startpc);  	assert(s_pCurBlock->GetFnptr() == (uptr)JITCompile@@ -1695,9 +1713,10 @@ 		iDumpBlock(startpc, recPtr); #endif +	static u16 manual_page[Ps2MemSize::Base >> 12]; 	u32 sz=(s_nEndBlock-startpc)>>2; -	u32 inpage_ptr=startpc;+	u32 inpage_ptr=HWADDR(startpc); 	u32 inpage_sz=sz*4;  	while(inpage_sz)@@ -1708,12 +1727,14 @@  		if(PageType!=-1) 		{-			if (PageType==0)+			if (PageType==0) { 				mmap_MarkCountedRamPage(PSM(inpage_ptr),inpage_ptr&~0xFFF);+				manual_page[inpage_ptr >> 12] = 0;+			} 			else 			{-				MOV32ItoR(ECX, startpc);-				MOV32ItoR(EDX, sz);+				MOV32ItoR(ECX, inpage_ptr);+				MOV32ItoR(EDX, pgsz);  				u32 lpc=inpage_ptr; 				u32 stg=pgsz;@@ -1726,6 +1747,11 @@ 					stg-=4; 					lpc+=4; 				}+				if (startpc != 0x81fc0) {+					xADD(ptr16[&manual_page[inpage_ptr >> 12]], 1);+					iJccKnownTarget(Jcc_Carry, dyna_block_reset);+				}+ 				DbgCon::WriteLn("Manual block @ %08X : %08X %d %d %d %d", params 					startpc,inpage_ptr,pgsz,0x1000-inpage_offs,inpage_sz,sz*4); 			}