mirror of https://github.com/PCSX2/pcsx2.git
Changed the FFX speedhack to also set all EE timed events to happen near instantly.
This is now a multi purpose hack, which could potentially fix / break a lot of games. It mostly affects FMV and PATH3 masking issues, but also stops games from booting, or makes them boot. Use with caution :) git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2965 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
d6eeb6a438
commit
575a56dc5c
|
@ -20,38 +20,17 @@
|
||||||
#include "coroutine.h"
|
#include "coroutine.h"
|
||||||
#include "IPU_Fifo.h"
|
#include "IPU_Fifo.h"
|
||||||
|
|
||||||
// IPU_INLINE_IRQS
|
|
||||||
// Scheduling ints into the future is a purist approach to emulation, and
|
|
||||||
// is mostly cosmetic since the emulator itself performs all actions instantly
|
|
||||||
// (as far as the emulated CPU is concerned). In some cases this can actually
|
|
||||||
// cause more sync problems than it supposedly solves, due to accumulated
|
|
||||||
// delays incurred by the recompiler's low cycle update rate and also Pcsx2
|
|
||||||
// failing to properly handle pre-emptive DMA/IRQs or cpu exceptions.
|
|
||||||
|
|
||||||
// Uncomment the following line to enable inline IRQs for the IPU. Tests show
|
|
||||||
// that it doesn't have any effect on compatibility or audio/video sync, and it
|
|
||||||
// speeds up movie playback by some 6-8%. But it lacks the purist touch, so it's
|
|
||||||
// not enabled by default.
|
|
||||||
|
|
||||||
//#define IPU_INLINE_IRQS
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define ipumsk( src ) ( (src) & 0xff )
|
#define ipumsk( src ) ( (src) & 0xff )
|
||||||
#define ipucase( src ) case ipumsk(src)
|
#define ipucase( src ) case ipumsk(src)
|
||||||
|
|
||||||
#ifdef IPU_INLINE_IRQS
|
|
||||||
# define IPU_INT_TO( cycles ) ipu1Interrupt()
|
|
||||||
# define IPU_INT_FROM( cycles ) ipu0Interrupt()
|
|
||||||
# define IPU_FORCEINLINE
|
|
||||||
#else
|
|
||||||
#define IPU_INT_TO( cycles ) if(!(cpuRegs.interrupt & (1<<4))) CPU_INT( DMAC_TO_IPU, cycles )
|
#define IPU_INT_TO( cycles ) if(!(cpuRegs.interrupt & (1<<4))) CPU_INT( DMAC_TO_IPU, cycles )
|
||||||
#define IPU_INT_FROM( cycles ) CPU_INT( DMAC_FROM_IPU, cycles )
|
#define IPU_INT_FROM( cycles ) CPU_INT( DMAC_FROM_IPU, cycles )
|
||||||
|
|
||||||
#define IPU_FORCEINLINE __forceinline
|
#define IPU_FORCEINLINE __forceinline
|
||||||
#endif
|
|
||||||
|
|
||||||
struct IPUStatus {
|
struct IPUStatus {
|
||||||
bool InProgress;
|
bool InProgress;
|
||||||
|
|
|
@ -305,10 +305,10 @@ static __forceinline void _cpuTestInterrupts()
|
||||||
if( cpuRegs.interrupt & 0xF19 ) // Bits 0 3 4 8 9 10 11 ( 111100011001 )
|
if( cpuRegs.interrupt & 0xF19 ) // Bits 0 3 4 8 9 10 11 ( 111100011001 )
|
||||||
{
|
{
|
||||||
TESTINT(0, vif0Interrupt);
|
TESTINT(0, vif0Interrupt);
|
||||||
#ifndef IPU_INLINE_IRQS
|
|
||||||
TESTINT(3, ipu0Interrupt);
|
TESTINT(3, ipu0Interrupt);
|
||||||
TESTINT(4, ipu1Interrupt);
|
TESTINT(4, ipu1Interrupt);
|
||||||
#endif
|
|
||||||
TESTINT(8, SPRFROMinterrupt);
|
TESTINT(8, SPRFROMinterrupt);
|
||||||
TESTINT(9, SPRTOinterrupt);
|
TESTINT(9, SPRTOinterrupt);
|
||||||
|
|
||||||
|
@ -550,9 +550,10 @@ __forceinline void CPU_INT( u32 n, s32 ecycle)
|
||||||
DevCon.Warning( "***** EE > Twice-thrown int on IRQ %d", n );
|
DevCon.Warning( "***** EE > Twice-thrown int on IRQ %d", n );
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (ecycle > 8192 && n != DMAC_TO_IPU && n != DMAC_FROM_IPU) {
|
// Abusing the IPU hack to also fix EE events to happen 1 cycle in the future.
|
||||||
// DevCon.Warning( "EE cycles high: %d, n %d", ecycle, n );
|
// This can be used on games with PATH3 masking issues for example, or when
|
||||||
//}
|
// some FMV look bad.
|
||||||
|
if(CHECK_IPUWAITHACK) ecycle = 1;
|
||||||
|
|
||||||
cpuRegs.interrupt|= 1 << n;
|
cpuRegs.interrupt|= 1 << n;
|
||||||
cpuRegs.sCycle[n] = cpuRegs.cycle;
|
cpuRegs.sCycle[n] = cpuRegs.cycle;
|
||||||
|
|
|
@ -59,8 +59,8 @@ Panels::GameFixesPanel::GameFixesPanel( wxWindow* parent ) :
|
||||||
wxEmptyString
|
wxEmptyString
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
_("IPU Wait Hack - Fix Ripping/Corrupted videos (FFX, Digital Devil Saga), Causes others to cut short"),
|
_("EE timing hack / FFX videos fix - Multi purpose hack. Try if all else fails."),
|
||||||
wxEmptyString
|
_("Known to affect following games:\n * Final Fantasy 10 (Fixes FMV)\n * Digital Devil Saga (Fixes FMV and crashes)\n * SSX (Fixes bad graphics and crashes)\n * Resident Evil: Dead Aim (Causes garbled textures)")
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -154,6 +154,7 @@ CRC::Game CRC::m_games[] =
|
||||||
{0x47B9B2FD, RadiataStories, US, 0},
|
{0x47B9B2FD, RadiataStories, US, 0},
|
||||||
{0xE8FCF8EC, SMTNocturne, US, ZWriteMustNotClear}, // saves/reloads z buffer around shadow drawing, same issue with all the SMT games following
|
{0xE8FCF8EC, SMTNocturne, US, ZWriteMustNotClear}, // saves/reloads z buffer around shadow drawing, same issue with all the SMT games following
|
||||||
{0xF0A31EE3, SMTNocturne, EU, ZWriteMustNotClear}, // SMTNocturne (Lucifers Call in EU)
|
{0xF0A31EE3, SMTNocturne, EU, ZWriteMustNotClear}, // SMTNocturne (Lucifers Call in EU)
|
||||||
|
{0xAE0DE7B7, SMTNocturne, EU, ZWriteMustNotClear}, // SMTNocturne (Lucifers Call in EU)
|
||||||
{0xD60DA6D4, SMTNocturne, JP, ZWriteMustNotClear}, // SMTNocturne
|
{0xD60DA6D4, SMTNocturne, JP, ZWriteMustNotClear}, // SMTNocturne
|
||||||
{0x0e762e8d, SMTNocturne, JP, ZWriteMustNotClear}, // SMTNocturne Maniacs
|
{0x0e762e8d, SMTNocturne, JP, ZWriteMustNotClear}, // SMTNocturne Maniacs
|
||||||
{0x47BA9034, SMTNocturne, JP, ZWriteMustNotClear}, // SMTNocturne Maniacs Chronicle
|
{0x47BA9034, SMTNocturne, JP, ZWriteMustNotClear}, // SMTNocturne Maniacs Chronicle
|
||||||
|
|
Loading…
Reference in New Issue