mirror of https://github.com/PCSX2/pcsx2.git
Save States: Added PADfreeze calls to PCSX2, though they're currently only implemented by LilyPad. Also fixed a bug where a save state would failed to load when the last plugin's freeze function actually saved something. Minor changes to new plugin API as well.
Because of a convenient bug in load state function, older save states with no saved pad info should still work. Don't blame me if they don't, though. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@791 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
493ecaa206
commit
0efde91a92
|
@ -548,6 +548,7 @@ typedef void (CALLBACK* _PADgsDriverInfo)(GSdriverInfo *info);
|
||||||
typedef void (CALLBACK* _PADconfigure)();
|
typedef void (CALLBACK* _PADconfigure)();
|
||||||
typedef s32 (CALLBACK* _PADtest)();
|
typedef s32 (CALLBACK* _PADtest)();
|
||||||
typedef void (CALLBACK* _PADabout)();
|
typedef void (CALLBACK* _PADabout)();
|
||||||
|
typedef int (CALLBACK* _PADfreeze)(int mode, freezeData *data);
|
||||||
|
|
||||||
// SIO
|
// SIO
|
||||||
typedef s32 (CALLBACK* _SIOinit)(u32 port, u32 slot, SIOchangeSlotCB f);
|
typedef s32 (CALLBACK* _SIOinit)(u32 port, u32 slot, SIOchangeSlotCB f);
|
||||||
|
@ -732,6 +733,7 @@ extern _PADgsDriverInfo PAD1gsDriverInfo;
|
||||||
extern _PADconfigure PAD1configure;
|
extern _PADconfigure PAD1configure;
|
||||||
extern _PADtest PAD1test;
|
extern _PADtest PAD1test;
|
||||||
extern _PADabout PAD1about;
|
extern _PADabout PAD1about;
|
||||||
|
extern _PADfreeze PAD1freeze;
|
||||||
|
|
||||||
// PAD2
|
// PAD2
|
||||||
extern _PADinit PAD2init;
|
extern _PADinit PAD2init;
|
||||||
|
@ -748,6 +750,7 @@ extern _PADgsDriverInfo PAD2gsDriverInfo;
|
||||||
extern _PADconfigure PAD2configure;
|
extern _PADconfigure PAD2configure;
|
||||||
extern _PADtest PAD2test;
|
extern _PADtest PAD2test;
|
||||||
extern _PADabout PAD2about;
|
extern _PADabout PAD2about;
|
||||||
|
extern _PADfreeze PAD2freeze;
|
||||||
|
|
||||||
// SIO[2]
|
// SIO[2]
|
||||||
extern _SIOinit SIOinit[2][9];
|
extern _SIOinit SIOinit[2][9];
|
||||||
|
|
|
@ -26,7 +26,7 @@ extern "C"
|
||||||
typedef u32 (CALLBACK* _PS2EgetLibType)(void);
|
typedef u32 (CALLBACK* _PS2EgetLibType)(void);
|
||||||
typedef u32 (CALLBACK* _PS2EgetLibVersion2)(u32 type);
|
typedef u32 (CALLBACK* _PS2EgetLibVersion2)(u32 type);
|
||||||
typedef char*(CALLBACK* _PS2EgetLibName)(void);
|
typedef char*(CALLBACK* _PS2EgetLibName)(void);
|
||||||
typedef void (CALLBACK* _PS2EpassConfig)(PcsxConfig Config);
|
typedef void (CALLBACK* _PS2EpassConfig)(PcsxConfig *Config);
|
||||||
|
|
||||||
// GS
|
// GS
|
||||||
// NOTE: GSreadFIFOX/GSwriteCSR functions CANNOT use XMM/MMX regs
|
// NOTE: GSreadFIFOX/GSwriteCSR functions CANNOT use XMM/MMX regs
|
||||||
|
@ -276,7 +276,7 @@ extern _PADpoll PAD1poll;
|
||||||
extern _PADquery PAD1query;
|
extern _PADquery PAD1query;
|
||||||
extern _PADupdate PAD1update;
|
extern _PADupdate PAD1update;
|
||||||
|
|
||||||
extern _PADfreeze PAD1freeze;
|
extern _PADfreeze PAD1freeze;
|
||||||
extern _PADgsDriverInfo PAD1gsDriverInfo;
|
extern _PADgsDriverInfo PAD1gsDriverInfo;
|
||||||
extern _PADconfigure PAD1configure;
|
extern _PADconfigure PAD1configure;
|
||||||
extern _PADtest PAD1test;
|
extern _PADtest PAD1test;
|
||||||
|
@ -293,7 +293,7 @@ extern _PADpoll PAD2poll;
|
||||||
extern _PADquery PAD2query;
|
extern _PADquery PAD2query;
|
||||||
extern _PADupdate PAD2update;
|
extern _PADupdate PAD2update;
|
||||||
|
|
||||||
extern _PADfreeze PAD2freeze;
|
extern _PADfreeze PAD2freeze;
|
||||||
extern _PADgsDriverInfo PAD2gsDriverInfo;
|
extern _PADgsDriverInfo PAD2gsDriverInfo;
|
||||||
extern _PADconfigure PAD2configure;
|
extern _PADconfigure PAD2configure;
|
||||||
extern _PADtest PAD2test;
|
extern _PADtest PAD2test;
|
||||||
|
@ -307,9 +307,9 @@ extern _SIOshutdown SIOshutdown[2][9];
|
||||||
extern _SIOstartPoll SIOstartPoll[2][9];
|
extern _SIOstartPoll SIOstartPoll[2][9];
|
||||||
extern _SIOpoll SIOpoll[2][9];
|
extern _SIOpoll SIOpoll[2][9];
|
||||||
extern _SIOquery SIOquery[2][9];
|
extern _SIOquery SIOquery[2][9];
|
||||||
extern _SIOkeyEvent SIOkeyEvent;
|
extern _SIOkeyEvent SIOkeyEvent;
|
||||||
|
|
||||||
extern _SIOfreeze SIOfreeze[2][9];
|
extern _SIOfreeze SIOfreeze[2][9];
|
||||||
extern _SIOconfigure SIOconfigure[2][9];
|
extern _SIOconfigure SIOconfigure[2][9];
|
||||||
extern _SIOtest SIOtest[2][9];
|
extern _SIOtest SIOtest[2][9];
|
||||||
extern _SIOabout SIOabout[2][9];
|
extern _SIOabout SIOabout[2][9];
|
||||||
|
|
|
@ -35,8 +35,10 @@
|
||||||
|
|
||||||
// Called by SIO_TYPE_MTAP plugins to change the slot.
|
// Called by SIO_TYPE_MTAP plugins to change the slot.
|
||||||
// Slot is then passed to memcard and pad plugins on SIOstartPoll.
|
// Slot is then passed to memcard and pad plugins on SIOstartPoll.
|
||||||
// MTAP SIO plugins should ignore slot vvalues on startPoll, as should RMs (probably).
|
// MTAP SIO plugins should ignore slot values on startPoll, as should RMs (probably).
|
||||||
typedef int (CALLBACK * SIOchangeSlotCB)(int slot);
|
|
||||||
|
// Port isn't strictly necessary, but doesn't hurt.
|
||||||
|
typedef int (CALLBACK * SIOchangeSlotCB)(int port, int slot);
|
||||||
|
|
||||||
// Basic functions.
|
// Basic functions.
|
||||||
|
|
||||||
|
@ -67,7 +69,10 @@ EXPORT_C_(u32) SIOquery();
|
||||||
|
|
||||||
EXPORT_C_(void) SIOconfigure();
|
EXPORT_C_(void) SIOconfigure();
|
||||||
EXPORT_C_(keyEvent*) CALLBACK SIOkeyEvent();
|
EXPORT_C_(keyEvent*) CALLBACK SIOkeyEvent();
|
||||||
EXPORT_C_(s32) SIOfreeze(u8 mode, freezeData *data);
|
|
||||||
|
// Save one type at a time. If a plugin supports all 4 types,
|
||||||
|
// should expect 4 calls. Increases savestate compatibility.
|
||||||
|
EXPORT_C_(s32) SIOfreeze(u8 mode, freezeData *data, int type);
|
||||||
EXPORT_C_(void) SIOabout();
|
EXPORT_C_(void) SIOabout();
|
||||||
EXPORT_C_(s32) SIOtest();
|
EXPORT_C_(s32) SIOtest();
|
||||||
|
|
||||||
|
@ -78,6 +83,4 @@ SIO_TYPE_RM = 0x00000040,
|
||||||
SIO_TYPE_MC = 0x00000100
|
SIO_TYPE_MC = 0x00000100
|
||||||
} SioTypes;
|
} SioTypes;
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // __SIOAPI_H__
|
#endif // __SIOAPI_H__
|
|
@ -71,6 +71,7 @@ _PADgsDriverInfo PAD1gsDriverInfo;
|
||||||
_PADconfigure PAD1configure;
|
_PADconfigure PAD1configure;
|
||||||
_PADtest PAD1test;
|
_PADtest PAD1test;
|
||||||
_PADabout PAD1about;
|
_PADabout PAD1about;
|
||||||
|
_PADfreeze PAD1freeze;
|
||||||
|
|
||||||
// PAD2
|
// PAD2
|
||||||
_PADinit PAD2init;
|
_PADinit PAD2init;
|
||||||
|
@ -87,6 +88,7 @@ _PADgsDriverInfo PAD2gsDriverInfo;
|
||||||
_PADconfigure PAD2configure;
|
_PADconfigure PAD2configure;
|
||||||
_PADtest PAD2test;
|
_PADtest PAD2test;
|
||||||
_PADabout PAD2about;
|
_PADabout PAD2about;
|
||||||
|
_PADfreeze PAD2freeze;
|
||||||
|
|
||||||
// SIO[2]
|
// SIO[2]
|
||||||
_SIOinit SIOinit[2][9];
|
_SIOinit SIOinit[2][9];
|
||||||
|
@ -330,6 +332,7 @@ void *PAD1plugin;
|
||||||
void CALLBACK PAD1_configure() {}
|
void CALLBACK PAD1_configure() {}
|
||||||
void CALLBACK PAD1_about() {}
|
void CALLBACK PAD1_about() {}
|
||||||
s32 CALLBACK PAD1_test() { return 0; }
|
s32 CALLBACK PAD1_test() { return 0; }
|
||||||
|
s32 CALLBACK PAD1_freeze(int mode, freezeData *data) { data->size = 0; return 0; }
|
||||||
|
|
||||||
int LoadPAD1plugin(const string& filename) {
|
int LoadPAD1plugin(const string& filename) {
|
||||||
void *drv;
|
void *drv;
|
||||||
|
@ -352,6 +355,7 @@ int LoadPAD1plugin(const string& filename) {
|
||||||
MapSymbolPAD_Fallback(PAD1,PAD,configure);
|
MapSymbolPAD_Fallback(PAD1,PAD,configure);
|
||||||
MapSymbolPAD_Fallback(PAD1,PAD,about);
|
MapSymbolPAD_Fallback(PAD1,PAD,about);
|
||||||
MapSymbolPAD_Fallback(PAD1,PAD,test);
|
MapSymbolPAD_Fallback(PAD1,PAD,test);
|
||||||
|
MapSymbolPAD_Fallback(PAD1,PAD,freeze);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -361,6 +365,7 @@ void *PAD2plugin;
|
||||||
void CALLBACK PAD2_configure() {}
|
void CALLBACK PAD2_configure() {}
|
||||||
void CALLBACK PAD2_about() {}
|
void CALLBACK PAD2_about() {}
|
||||||
s32 CALLBACK PAD2_test() { return 0; }
|
s32 CALLBACK PAD2_test() { return 0; }
|
||||||
|
s32 CALLBACK PAD2_freeze(int mode, freezeData *data) { data->size = 0; return 0; }
|
||||||
|
|
||||||
int LoadPAD2plugin(const string& filename) {
|
int LoadPAD2plugin(const string& filename) {
|
||||||
void *drv;
|
void *drv;
|
||||||
|
@ -383,6 +388,7 @@ int LoadPAD2plugin(const string& filename) {
|
||||||
MapSymbolPAD_Fallback(PAD2,PAD,configure);
|
MapSymbolPAD_Fallback(PAD2,PAD,configure);
|
||||||
MapSymbolPAD_Fallback(PAD2,PAD,about);
|
MapSymbolPAD_Fallback(PAD2,PAD,about);
|
||||||
MapSymbolPAD_Fallback(PAD2,PAD,test);
|
MapSymbolPAD_Fallback(PAD2,PAD,test);
|
||||||
|
MapSymbolPAD_Fallback(PAD2,PAD,freeze);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,6 +139,8 @@ void SaveState::FreezeAll()
|
||||||
FreezePlugin( "SPU2", SPU2freeze );
|
FreezePlugin( "SPU2", SPU2freeze );
|
||||||
FreezePlugin( "DEV9", DEV9freeze );
|
FreezePlugin( "DEV9", DEV9freeze );
|
||||||
FreezePlugin( "USB", USBfreeze );
|
FreezePlugin( "USB", USBfreeze );
|
||||||
|
FreezePlugin( "PAD1", PAD1freeze );
|
||||||
|
FreezePlugin( "PAD2", PAD2freeze );
|
||||||
|
|
||||||
if( IsLoading() )
|
if( IsLoading() )
|
||||||
PostLoadPrep();
|
PostLoadPrep();
|
||||||
|
@ -267,9 +269,9 @@ void gzLoadingState::FreezePlugin( const char* name, s32 (CALLBACK *freezer)(int
|
||||||
fP.data = (s8*)malloc(fP.size);
|
fP.data = (s8*)malloc(fP.size);
|
||||||
if (fP.data == NULL)
|
if (fP.data == NULL)
|
||||||
throw Exception::OutOfMemory();
|
throw Exception::OutOfMemory();
|
||||||
gzread(m_file, fP.data, fP.size);
|
int read = gzread(m_file, fP.data, fP.size);
|
||||||
|
|
||||||
if( gzeof( m_file ) )
|
if( read != fP.size )
|
||||||
throw Exception::BadSavedState( m_filename );
|
throw Exception::BadSavedState( m_filename );
|
||||||
|
|
||||||
if(freezer(FREEZE_LOAD, &fP) == -1)
|
if(freezer(FREEZE_LOAD, &fP) == -1)
|
||||||
|
|
Loading…
Reference in New Issue