mirror of
https://github.com/ogoguel/activegs-ios.git
synced 2024-09-06 15:54:24 +00:00
157 lines
2.9 KiB
C++
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;
|