activegs-ios/kegs/Src/SaveState.h

157 lines
2.9 KiB
C++

/*
ActiveGS, Copyright 2004-2016 Olivier Goguel, https://github.com/ogoguel/ActiveGS
Based on Kegs, Copyright 2004 Kent Dickey, https://kegs.sourceforge.net
This code is covered by the GNU GPL licence
*/
#pragma once
#include "defc.h"
#include "StdString.h"
enum
{
STATE_NONE=0,
STATE_SAVE,
STATE_RESTORE,
STATE_REWIND,
};
#define SAVEDSTATE_SIG 0x02007ADE
#ifdef _WIN32
#pragma pack(push,PRAGMA_PACK_SIZE)
#endif
enum savedStateFlags
{
SAVESTATEFLAG_VIDEOSINGLEVLINE=1<<1,
SAVESTATEFLAG_VIDEOSINGLEHLINE=1<<2
};
struct savedStateParam
{
int size;
int version;
double dcycs;
int vbl;
int memory_size;
int rom;
int flags;
savedStateParam() {
size = sizeof(savedStateParam);
version = SAVEDSTATE_SIG;
rom = 0;
dcycs=0.0;
flags = 0;
#ifdef VIDEO_SINGLEVLINE
flags |= SAVESTATEFLAG_VIDEOSINGLEVLINE;
#endif
#ifdef VIDEO_SINGLEHLINE
flags |= SAVESTATEFLAG_VIDEOSINGLEHLINE;;
#endif
memory_size = -1;
};
} XCODE_PRAGMA_PACK;
#ifdef _WIN32
#pragma pack(pop)
#endif
class savedState
{
public:
static int maxSize;
serialize adb;
serialize async_event;
serialize clock;
serialize iwm;
serialize moremem;
serialize paddles;
serialize scc;
serialize sim65816;
serialize sound;
serialize video;
serialize offscreen;
savedStateParam param;
int fullsave;
int fastalloc;
int loadFromDiskInternal(const char* _filename);
public:
savedState();
~savedState()
{
release();
}
void save(int _fullsave, int _usefastalloc);
void writeToDisk(const char* _filename);
int loadFromDisk(const char* _filename);
void restore();
void release();
void display();
int isEmpty() { return !param.vbl; };
};
#define NB_KEY_STATE 10
#define NB_SCREEN_PER_STATE (2*60/VBL_DELAY_BETWEEN_SCREEN)
#define VBL_DELAY_BETWEEN_SCREEN 2
#define MAX_STATE (NB_KEY_STATE*NB_SCREEN_PER_STATE)
#if !defined(DRIVER_IOS) && !defined(DRIVER_ANDROID)
#define CACHE_SIZE (256*1024*1024)
#endif
class s_savestate
{
savedState states[MAX_STATE];
int iNextState;
int iCurState;
word32 nextStateVBL;
word32 nextScreenVBL;
int targetStateSens;
double lastrefreshcycs;
byte* cache;
int cachepos;
int cachefree;
int cacheSize;
public:
savedState state;
MyString filename;
int stateActionRequired;
s_savestate();
~s_savestate();
void reset_rewind();
void reset_state();
void delete_state(int);
void init();
void shut();
void saveState(const char* _filename);
void restoreState(const char* _filename);
// void saveStateToDisk(const char* _filename);
// void restoreStateFromDisk(const char* _filename);
int getSavedStateVBL();
void handleState();
void handleKey(int _key,int _isup);
void* x_free(void*,int,int);
void* x_malloc(int,int);
int get_free_memory_size();
};
extern s_savestate g_savestate;