From 12d63f137a6a962d46b0c7b1526903ceeb391ade Mon Sep 17 00:00:00 2001
From: cottonvibes <cottonvibes@a6443dda-0b58-4228-96e9-037be469359c>
Date: Thu, 28 Aug 2008 21:53:39 +0000
Subject: [PATCH] Rockstar games shouldn't have SPS anymore; also added 2
 game-specific hacks, one for God of War, and one for Grand Turismo 4 the God
 of War hack brings back the SPS in the Rockstar games; so only turn it on for
 God of War.

hopefully we won't need these hacks in the future, once stuff is handled properly :p

git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@66 a6443dda-0b58-4228-96e9-037be469359c
---
 pcsx2/Misc.h             |  7 +++++--
 pcsx2/windows/WinMain.c  |  5 +++++
 pcsx2/windows/pcsx2.rc   | 24 ++++++++++++++----------
 pcsx2/windows/resource.h |  3 +++
 pcsx2/x86/iVUmicro.c     | 40 +++++++++++++++++++++++++++++-----------
 5 files changed, 56 insertions(+), 23 deletions(-)

diff --git a/pcsx2/Misc.h b/pcsx2/Misc.h
index 6da04ee125..407ee91eeb 100644
--- a/pcsx2/Misc.h
+++ b/pcsx2/Misc.h
@@ -52,14 +52,17 @@
 #define CHECK_DUALCORE (Config.Options&PCSX2_DUALCORE)
 #define CHECK_EEREC (Config.Options&PCSX2_EEREC)
 #define CHECK_COP2REC (Config.Options&PCSX2_COP2REC) // goes with ee option
-//------------ SPEED HACKS!!! ---------------
+//------------ SPEED/MISC HACKS!!! ---------------
 #define CHECK_OVERFLOW (!(Config.Hacks & 0x2))
 #define CHECK_EXTRA_OVERFLOW (Config.Hacks & 0x40) // If enabled, Operands are checked for infinities before being used in the VU recs
 #define CHECK_EESYNC_HACK (Config.Hacks & 0x1)
 #define CHECK_IOPSYNC_HACK (Config.Hacks & 0x10)
 #define CHECK_EE_IOP_EXTRA (Config.Hacks & 0x20)
-#define CHECK_DENORMALS ((Config.Hacks & 0x8) ? 0xffc0 : 0x7f80) //If enabled, Denormals are Zero for the recs; and flush to zero is enabled as well
+#define CHECK_DENORMALS ((Config.Hacks & 0x8) ? 0xffc0 : 0x7f80) //If enabled, Denormals are Zero for the recs and flush to zero is enabled as well
 #define CHECK_FASTBRANCHES (Config.Hacks & 0x80)
+#define CHECK_VUCLIPHACK (Config.Hacks & 0x100) // Special Fix for GoW, updates the clipflag differently in recVUMI_CLIP() (note: turning this hack on, breaks Rockstar games)
+#define CHECK_VUMINIHACK (Config.Hacks & 0x200) // Special Fix for GT4, different clamping for recVUMI_MINI() (Note: sets negative infinity to positive fMax when clamping, which the real ps2 doesn't do)
+
 
 #define CHECK_FRAMELIMIT (Config.Options&PCSX2_FRAMELIMIT_MASK)
 
diff --git a/pcsx2/windows/WinMain.c b/pcsx2/windows/WinMain.c
index 374fb78854..b5379b208f 100644
--- a/pcsx2/windows/WinMain.c
+++ b/pcsx2/windows/WinMain.c
@@ -728,6 +728,9 @@ BOOL APIENTRY HacksProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
 			if(Config.Hacks & 0x20) CheckDlgButton(hDlg, IDC_SYNCHACK3, TRUE);
 			if(Config.Hacks & 0x40) CheckDlgButton(hDlg, IDC_OVERFLOWHACK_EXTRA, TRUE);
 			if(Config.Hacks & 0x80) CheckDlgButton(hDlg, IDC_FASTBRANCHES, TRUE);
+			if(Config.Hacks & 0x100) CheckDlgButton(hDlg, IDC_VUCLIPHACK, TRUE);
+			if(Config.Hacks & 0x200) CheckDlgButton(hDlg, IDC_VUMINIHACK, TRUE);
+
 			return TRUE;
 
         case WM_COMMAND:
@@ -741,6 +744,8 @@ BOOL APIENTRY HacksProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
 				Config.Hacks |= IsDlgButtonChecked(hDlg, IDC_SYNCHACK3) ? 0x20 : 0;
 				Config.Hacks |= IsDlgButtonChecked(hDlg, IDC_OVERFLOWHACK_EXTRA) ? 0x40 : 0;
 				Config.Hacks |= IsDlgButtonChecked(hDlg, IDC_FASTBRANCHES) ? 0x80 : 0;
+				Config.Hacks |= IsDlgButtonChecked(hDlg, IDC_VUCLIPHACK) ? 0x100 : 0;
+				Config.Hacks |= IsDlgButtonChecked(hDlg, IDC_VUMINIHACK) ? 0x200 : 0;
 
 				SaveConfig(); 
 
diff --git a/pcsx2/windows/pcsx2.rc b/pcsx2/windows/pcsx2.rc
index 74d513978d..be5d340e26 100644
--- a/pcsx2/windows/pcsx2.rc
+++ b/pcsx2/windows/pcsx2.rc
@@ -938,18 +938,18 @@ BEGIN
     CONTROL         132,IDC_PS2SILVER_RECT,"Static",SS_BITMAP,0,167,70,74
 END
 
-IDD_HACKS DIALOGEX 0, 0, 405, 251
+IDD_HACKS DIALOGEX 0, 0, 406, 273
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "PCSX2 Speed Hacks"
 FONT 8, "MS Shell Dlg", 400, 0, 0x1
 BEGIN
-    DEFPUSHBUTTON   "OK",IDOK,146,230,50,14
-    PUSHBUTTON      "Cancel",IDCANCEL,202,230,50,14
+    DEFPUSHBUTTON   "OK",IDOK,146,252,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,202,252,50,14
     CONTROL         "EE Sync Hack (x2) - Doubles the cycle rate of the EE.",IDC_SYNCHACK,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,114,252,10
     CONTROL         "Disable All Overflow Checks - Doesn't check for overflow at all in the VU Recs.",IDC_OVERFLOWHACK,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,63,373,10
-    CTEXT           "These hacks will effect the speed of PCSX2 but possibly comprimise on compatability",IDC_HACKDESC,7,7,391,8
+    CTEXT           "These hacks will effect the speed of PCSX2 but possibly comprimise on compatability",IDC_HACKDESC,7,7,392,8
     CONTROL         "Tighter SPU2 Sync ( FFXII vids) - Slower, not useful anymore.",IDC_SOUNDHACK,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,197,323,10
     CONTROL         "IOP Sync Hack (x2) - Doubles the cycle rate of the IOP.",IDC_SYNCHACK2,
@@ -960,12 +960,16 @@ BEGIN
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,50,377,10
     CONTROL         "EE/IOP Fast Branches - Quick branching ( Very small speedup, use only when you need every fps! )",IDC_FASTBRANCHES,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,183,351,10
-    CTEXT           "If you have problems, disable all these and try again",IDC_STATIC,7,22,391,8
-    GROUPBOX        "Overflow and Underflow",IDC_STATIC,7,36,391,60
+    CTEXT           "If you have problems, disable all these and try again",IDC_STATIC,7,22,392,8
+    GROUPBOX        "Overflow and Underflow",IDC_STATIC,7,36,392,60
     CONTROL         "Denormals are Zero - Makes very small numbers equal zero. ( Big speedup on Intel CPUs ) ( Needs Restart! )",IDC_DENORMALS,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,76,377,10
-    GROUPBOX        "Sync Hacks",IDC_STATIC,7,101,391,59
-    GROUPBOX        "Miscellaneous",IDC_STATIC,7,168,391,46
+    GROUPBOX        "Sync Hacks",IDC_STATIC,7,101,392,59
+    GROUPBOX        "Miscellaneous / Special Game Fixes",IDC_STATIC,7,168,392,76
+    CONTROL         "VU Clip Hack - Special fix for God of War; Breaks Rockstar games!",IDC_VUCLIPHACK,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,211,323,10
+    CONTROL         "VU Mini Hack - Special fix for Grand Turismo 4",IDC_VUMINIHACK,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,224,323,10
 END
 
 
@@ -986,9 +990,9 @@ BEGIN
     IDD_HACKS, DIALOG
     BEGIN
         LEFTMARGIN, 7
-        RIGHTMARGIN, 398
+        RIGHTMARGIN, 399
         TOPMARGIN, 7
-        BOTTOMMARGIN, 244
+        BOTTOMMARGIN, 266
     END
 END
 #endif    // APSTUDIO_INVOKED
diff --git a/pcsx2/windows/resource.h b/pcsx2/windows/resource.h
index 7b45d766ef..eb6e17c1c5 100644
--- a/pcsx2/windows/resource.h
+++ b/pcsx2/windows/resource.h
@@ -606,7 +606,10 @@
 #define IDC_CHECK1                      1300
 #define IDC_SOUNDHACK                   1300
 #define IDC_DENORMALS                   1301
+#define IDC_SOUNDHACK2                  1302
+#define IDC_VUCLIPHACK                  1302
 #define IDC_FRAMELIMIT_OPTIONS          1303
+#define IDC_VUMINIHACK                  1303
 #define IDC_LOG                         1500
 #define IDC_CPULOG                      1500
 #define IDC_MEMLOG                      1501
diff --git a/pcsx2/x86/iVUmicro.c b/pcsx2/x86/iVUmicro.c
index 6bca9d7825..85f0a8aadc 100644
--- a/pcsx2/x86/iVUmicro.c
+++ b/pcsx2/x86/iVUmicro.c
@@ -3351,12 +3351,12 @@ void recVUMI_MAXw(VURegs *VU, int info) { recVUMI_MAX_xyzw(VU, 3, info); }
 void recVUMI_MINI(VURegs *VU, int info)
 {
 	if ( _Fd_ == 0 ) return;
-	if (CHECK_EXTRA_OVERFLOW) {
-		vuFloat2( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
-		vuFloat2( EEREC_T, EEREC_TEMP, _X_Y_Z_W);
-	}
 
 	if( _X_Y_Z_W == 8 ) {
+		if (CHECK_EXTRA_OVERFLOW) {
+			vuFloat2( EEREC_S, EEREC_TEMP, 8);
+			vuFloat2( EEREC_T, EEREC_TEMP, 8);
+		}
 		if (EEREC_D == EEREC_S) SSE_MINSS_XMM_to_XMM(EEREC_D, EEREC_T);
 		else if (EEREC_D == EEREC_T) SSE_MINSS_XMM_to_XMM(EEREC_D, EEREC_S);
 		else {
@@ -3365,6 +3365,10 @@ void recVUMI_MINI(VURegs *VU, int info)
 		}
 	}
 	else if (_X_Y_Z_W != 0xf) {
+		if (CHECK_EXTRA_OVERFLOW) {
+			vuFloat2( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
+			vuFloat2( EEREC_T, EEREC_TEMP, _X_Y_Z_W);
+		}
 		SSE_MOVAPS_XMM_to_XMM(EEREC_TEMP, EEREC_S);
 		SSE_MINPS_XMM_to_XMM(EEREC_TEMP, EEREC_T);
 
@@ -3372,16 +3376,28 @@ void recVUMI_MINI(VURegs *VU, int info)
 	}
 	else {
 		if( EEREC_D == EEREC_S ) {
-			// need for GT4 vu0rec
-			//ClampUnordered(EEREC_T, EEREC_TEMP, 0);
+			if (CHECK_VUMINIHACK)
+				ClampUnordered(EEREC_T, EEREC_TEMP, 0); // need for GT4 vu0rec
+			else if (CHECK_EXTRA_OVERFLOW) {
+				vuFloat2( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
+				vuFloat2( EEREC_T, EEREC_TEMP, _X_Y_Z_W);
+			}	
 			SSE_MINPS_XMM_to_XMM(EEREC_D, EEREC_T);
 		}
 		else if( EEREC_D == EEREC_T ) {
-			// need for GT4 vu0rec
-			//ClampUnordered(EEREC_S, EEREC_TEMP, 0);
+			if (CHECK_VUMINIHACK)
+				ClampUnordered(EEREC_S, EEREC_TEMP, 0); // need for GT4 vu0rec
+			else if (CHECK_EXTRA_OVERFLOW) {
+				vuFloat2( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
+				vuFloat2( EEREC_T, EEREC_TEMP, _X_Y_Z_W);
+			}
 			SSE_MINPS_XMM_to_XMM(EEREC_D, EEREC_S);
 		}
 		else {
+			if (CHECK_EXTRA_OVERFLOW) {
+				vuFloat2( EEREC_S, EEREC_TEMP, _X_Y_Z_W);
+				vuFloat2( EEREC_T, EEREC_TEMP, _X_Y_Z_W);
+			}
 			SSE_MOVAPS_XMM_to_XMM(EEREC_D, EEREC_S);
 			SSE_MINPS_XMM_to_XMM(EEREC_D, EEREC_T);
 		}
@@ -3664,7 +3680,7 @@ void recVUMI_CLIP(VURegs *VU, int info)
 	x86temp1 = ALLOCTEMPX86(MODE_8BITREG);
 	x86temp2 = ALLOCTEMPX86(MODE_8BITREG);
 
-	if ( (x86temp1 == 0) || (x86temp2 == 0) ) SysPrintf("VU CLIP Allocation Error: EAX being allocated!");
+	//if ( (x86temp1 == 0) || (x86temp2 == 0) ) SysPrintf("VU CLIP Allocation Error: EAX being allocated! \n");
 
 	if( _Ft_ == 0 ) {
 		// all 1s
@@ -3699,9 +3715,11 @@ void recVUMI_CLIP(VURegs *VU, int info)
 	AND32ItoR(EAX, 0xffffff);
 
 	MOV32RtoM(clipaddr, EAX);
-	MOV32RtoM((uptr)&VU->VI[REG_CLIP_FLAG], EAX);
 
-	//if( !(info&(PROCESS_VU_SUPER|PROCESS_VU_COP2)) ) MOV32RtoM((uptr)&VU->VI[REG_CLIP_FLAG], EAX);
+	// God of War needs this additional move, but it breaks Rockstar games; ideally this hack shouldn't be needed, i think its a clipflag allocation bug in iVUzerorec.cpp
+	if ( ( CHECK_VUCLIPHACK ) || ( !(info & (PROCESS_VU_SUPER|PROCESS_VU_COP2)) ) ) 
+		MOV32RtoM((uptr)&VU->VI[REG_CLIP_FLAG], EAX);
+
 	//_freeXMMreg(t1reg); // We Never Allocated these regs, so no need to free them
 	//_freeXMMreg(t2reg);