Added 2 gamefixes to the Windows Side (untested since I don't have the games xD):

- DMA Execution hack - Fixes Fatal frame problems by ignoring dma transfers while another one is being executed.
- VU XGkick hack - Fixes Erementar Gerad by delaying XGkick. Similar to what SO3 needs, except this game needs more delay. Emulating this correctly is impossible with the current DMAC system, and will most-likely never be fixed correctly. The best (and fastest) way to simulate proper behavior is with a gamefix. (Super VU was doing this by a CRC hack, but I changed it to use this gamefix instead along with microVU.)

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1437 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
cottonvibes 2009-06-26 04:27:18 +00:00
parent 89dc306861
commit 6b2c26a617
6 changed files with 40 additions and 35 deletions

View File

@ -66,11 +66,12 @@ extern SessionOverrideFlags g_Session;
#define CHECK_VU1REC (!g_Session.ForceDisableVU1rec && (Config.Options&PCSX2_VU1REC)) #define CHECK_VU1REC (!g_Session.ForceDisableVU1rec && (Config.Options&PCSX2_VU1REC))
//------------ SPECIAL GAME FIXES!!! --------------- //------------ SPECIAL GAME FIXES!!! ---------------
#define CHECK_VUADDSUBHACK (Config.GameFixes & 0x1) // Special Fix for Tri-ace games, they use an encryption algorithm that requires VU addi opcode to be bit-accurate. #define CHECK_VUADDSUBHACK (Config.GameFixes & 0x01) // Special Fix for Tri-ace games, they use an encryption algorithm that requires VU addi opcode to be bit-accurate.
#define CHECK_FPUCOMPAREHACK (Config.GameFixes & 0x4) // Special Fix for Digimon Rumble Arena 2, fixes spinning/hanging on intro-menu. #define CHECK_FPUCOMPAREHACK (Config.GameFixes & 0x04) // Special Fix for Digimon Rumble Arena 2, fixes spinning/hanging on intro-menu.
#define CHECK_VUCLIPFLAGHACK (Config.GameFixes & 0x2) // Special Fix for Persona games, maybe others. It's to do with the VU clip flag (again). #define CHECK_VUCLIPFLAGHACK (Config.GameFixes & 0x02) // Special Fix for Persona games, maybe others. It's to do with the VU clip flag (again).
#define CHECK_FPUMULHACK (Config.GameFixes & 0x8) // Special Fix for Tales of Destiny hangs. #define CHECK_FPUMULHACK (Config.GameFixes & 0x08) // Special Fix for Tales of Destiny hangs.
#define CHECK_DMAEXECHACK (Config.GameFixes & 0x10) // Special Fix for Fatal Frame; breaks Gust and Tri-Ace games. #define CHECK_DMAEXECHACK (Config.GameFixes & 0x10) // Special Fix for Fatal Frame; breaks Gust and Tri-Ace games.
#define CHECK_XGKICKHACK (Config.GameFixes & 0x20) // Special Fix for Erementar Gerad, adds more delay to VU XGkick instructions. Corrects the color of some graphics.
//------------ Advanced Options!!! --------------- //------------ Advanced Options!!! ---------------
#define CHECK_VU_OVERFLOW (Config.vuOptions & 0x1) #define CHECK_VU_OVERFLOW (Config.vuOptions & 0x1)

View File

@ -521,22 +521,25 @@ BOOL APIENTRY GameFixes(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{ {
switch (message) { switch (message) {
case WM_INITDIALOG: case WM_INITDIALOG:
if(Config.GameFixes & 0x1) CheckDlgButton(hDlg, IDC_GAMEFIX2, TRUE);//Tri-Ace fix if (Config.GameFixes & 0x01) CheckDlgButton(hDlg, IDC_GAMEFIX2, TRUE); // Tri-Ace fix
if(Config.GameFixes & 0x4) CheckDlgButton(hDlg, IDC_GAMEFIX3, TRUE);//Digimon FPU compare fix if (Config.GameFixes & 0x04) CheckDlgButton(hDlg, IDC_GAMEFIX3, TRUE); // Digimon FPU compare fix
if(Config.GameFixes & 0x2) CheckDlgButton(hDlg, IDC_GAMEFIX4, TRUE);//Persona3/4 fix if (Config.GameFixes & 0x02) CheckDlgButton(hDlg, IDC_GAMEFIX4, TRUE); // Persona3/4 fix
if(Config.GameFixes & 0x8) CheckDlgButton(hDlg, IDC_GAMEFIX5, TRUE);//Tales of Destiny fix if (Config.GameFixes & 0x08) CheckDlgButton(hDlg, IDC_GAMEFIX5, TRUE); // Tales of Destiny fix
//if(Config.GameFixes & 0x10) CheckDlgButton(hDlg, IDC_GAMEFIX?, TRUE);//Fatal Frame fix if (Config.GameFixes & 0x10) CheckDlgButton(hDlg, IDC_GAMEFIX6, TRUE); // Fatal Frame fix
if (Config.GameFixes & 0x20) CheckDlgButton(hDlg, IDC_GAMEFIX8, TRUE); // Erementar Gerad fix
return TRUE; return TRUE;
case WM_COMMAND: case WM_COMMAND:
if (LOWORD(wParam) == IDOK) if (LOWORD(wParam) == IDOK)
{ {
uint newfixes = 0; uint newfixes = 0;
newfixes |= IsDlgButtonChecked(hDlg, IDC_GAMEFIX2) ? 0x1 : 0; newfixes |= IsDlgButtonChecked(hDlg, IDC_GAMEFIX2) ? 0x01 : 0;
newfixes |= IsDlgButtonChecked(hDlg, IDC_GAMEFIX3) ? 0x4 : 0; newfixes |= IsDlgButtonChecked(hDlg, IDC_GAMEFIX3) ? 0x04 : 0;
newfixes |= IsDlgButtonChecked(hDlg, IDC_GAMEFIX4) ? 0x2 : 0; newfixes |= IsDlgButtonChecked(hDlg, IDC_GAMEFIX4) ? 0x02 : 0;
newfixes |= IsDlgButtonChecked(hDlg, IDC_GAMEFIX5) ? 0x8 : 0; newfixes |= IsDlgButtonChecked(hDlg, IDC_GAMEFIX5) ? 0x08 : 0;
//newfixes |= IsDlgButtonChecked(hDlg, IDC_GAMEFIX?) ? 0x10 : 0; newfixes |= IsDlgButtonChecked(hDlg, IDC_GAMEFIX6) ? 0x10 : 0;
newfixes |= IsDlgButtonChecked(hDlg, IDC_GAMEFIX8) ? 0x20 : 0;
EndDialog(hDlg, TRUE); EndDialog(hDlg, TRUE);

View File

@ -74,23 +74,26 @@ LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
// Dialog // Dialog
// //
IDD_GAMEFIXES DIALOGEX 0, 0, 279, 123 IDD_GAMEFIXES DIALOGEX 0, 0, 279, 154
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Game Special Fixes"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "OK",IDOK,87,96,50,14 DEFPUSHBUTTON "OK",IDOK,86,133,50,14
PUSHBUTTON "Cancel",IDCANCEL,142,96,50,14 PUSHBUTTON "Cancel",IDCANCEL,142,133,50,14
CTEXT "Some games need special settings.\nConfigure them here.",IDC_STATIC,7,7,265,17 CTEXT "Some games need special settings.\nConfigure them here.",IDC_STATIC,7,7,265,17
GROUPBOX "PCSX2 Gamefixes",IDC_STATIC,7,22,265,94 GROUPBOX "PCSX2 Gamefixes",IDC_STATIC,7,22,265,104
CONTROL "FPU Compare Hack - Special fix for Digimon Rumble Arena 2.",IDC_GAMEFIX3, CONTROL "FPU Compare Hack - Special fix for Digimon Rumble Arena 2.",IDC_GAMEFIX3,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,36,249,10 "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,51,249,10
CONTROL "VU Add Hack - Special fix for Tri-Ace games!",IDC_GAMEFIX2, CONTROL "VU Add Hack - Special fix for Tri-Ace games!",IDC_GAMEFIX2,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,65,252,10 "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,80,252,10
CONTROL "VU Clip Hack - Fixes missing ground geometry in Persona.",IDC_GAMEFIX4, CONTROL "VU Clip Hack - Fixes missing ground geometry in Persona. (Super VU)",IDC_GAMEFIX4,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,79,238,10 "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,94,238,10
CONTROL "FPU Mul Hack - Special fix for Tales of Destiny.",IDC_GAMEFIX5, CONTROL "FPU Mul Hack - Special fix for Tales of Destiny.",IDC_GAMEFIX5,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,50,249,10 "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,65,249,10
CONTROL "DMA Execution Hack - Special fix for Fatal Frame.",IDC_GAMEFIX6,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,37,238,10
CONTROL "VU XGkick Hack - Special fix for Erementar Gerad.",IDC_GAMEFIX8,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,108,238,10
END END
@ -108,8 +111,7 @@ BEGIN
RIGHTMARGIN, 272 RIGHTMARGIN, 272
VERTGUIDE, 14 VERTGUIDE, 14
TOPMARGIN, 7 TOPMARGIN, 7
BOTTOMMARGIN, 116 BOTTOMMARGIN, 147
HORZGUIDE, 103
END END
END END
#endif // APSTUDIO_INVOKED #endif // APSTUDIO_INVOKED

View File

@ -237,7 +237,9 @@
#define IDC_EE_ROUNDMODE0 1305 #define IDC_EE_ROUNDMODE0 1305
#define IDC_FCOR 1305 #define IDC_FCOR 1305
#define IDC_GAMEFIX7 1305 #define IDC_GAMEFIX7 1305
#define IDC_GAMEFIX6 1305
#define IDC_EE_ROUNDMODE1 1306 #define IDC_EE_ROUNDMODE1 1306
#define IDC_GAMEFIX8 1306
#define IDC_EE_ROUNDMODE2 1307 #define IDC_EE_ROUNDMODE2 1307
#define IDC_EE_ROUNDMODE3 1308 #define IDC_EE_ROUNDMODE3 1308
#define IDC_EESYNC_DEFAULT 1308 #define IDC_EESYNC_DEFAULT 1308

View File

@ -275,9 +275,11 @@ typedef u32 (__fastcall *mVUCall)(void*, void*);
#define CHECK_VU_MINMAXHACK (u32)Config.Hacks.vuMinMax // (Can cause SPS, Black Screens, etc...) #define CHECK_VU_MINMAXHACK (u32)Config.Hacks.vuMinMax // (Can cause SPS, Black Screens, etc...)
// Unknown Data // Unknown Data
#define mVU_XGKICK_CYCLES 1 // Its unknown at recompile time how long the xgkick transfer will take #define mVU_XGKICK_CYCLES ((CHECK_XGKICKHACK) ? 3 : 1)
// Its unknown at recompile time how long the xgkick transfer will take
// so give it a value that makes games happy :) (SO3 is fine at 1 cycle delay) // so give it a value that makes games happy :) (SO3 is fine at 1 cycle delay)
// Cache Limit Check // Cache Limit Check
#define mVUcacheCheck(ptr, start, limit) { \ #define mVUcacheCheck(ptr, start, limit) { \
uptr diff = ptr - start; \ uptr diff = ptr - start; \

View File

@ -4417,12 +4417,7 @@ void recVUMI_XGKICK(VURegs *VU, int info)
recVUMI_XGKICK_(VU); recVUMI_XGKICK_(VU);
} }
else { else {
// Erementar Gerad hack. s_ScheduleXGKICK = (CHECK_XGKICKHACK) ? (min((u32)4, (s_pCurBlock->endpc-pc)/8)) : 2;
// Corrects the color of some graphics on a game that has somewhat scrambled graphics either way, and only works with ZeroGS. Not even ZZOgl. :)
if (g_VUGameFixes & VUFIX_XGKICKDELAY2)
s_ScheduleXGKICK = min((u32)4, (s_pCurBlock->endpc - pc) / 8);
else
s_ScheduleXGKICK = 2;
} }
} }