mirror of
https://github.com/ogoguel/activegs-ios.git
synced 2024-12-27 17:29:42 +00:00
418 lines
8.9 KiB
C++
418 lines
8.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
|
|
|
|
//#ifndef MAC
|
|
#ifdef _WIN32
|
|
#include <atlstr.h>
|
|
#endif
|
|
|
|
#include "../Common/ActiveGSList.h"
|
|
#include "../Common/ActiveDownload.h"
|
|
#include "../Common/ki.h"
|
|
|
|
#include "../kegs/Src/sound.h"
|
|
|
|
extern int outputInfoInternal(const char*);
|
|
|
|
|
|
/*
|
|
#if defined(_DEBUG)|| defined(_GLIBCXX_DEBUG)
|
|
#define ADD2CONSOLE(X)
|
|
#else
|
|
extern void add2Console(const char*);
|
|
#define ADD2CONSOLE(X) addConsole(X)
|
|
#endif
|
|
*/
|
|
|
|
#define ACTIVEGSXMLPATH "_XML"
|
|
|
|
#if defined(WIN32) && !defined(UNDER_CE)
|
|
#define STRING2CONSTCHAR(X) ((const char*)X)
|
|
#else
|
|
#define STRING2CONSTCHAR(X) (X.c_str())
|
|
#endif
|
|
|
|
|
|
enum eParamType
|
|
{
|
|
EMULATOR,
|
|
BRAM
|
|
};
|
|
|
|
struct param
|
|
{
|
|
MyString data;
|
|
MyString value;
|
|
int hex;
|
|
};
|
|
|
|
class CSetStart
|
|
{
|
|
public:
|
|
int slot;
|
|
// int addr;
|
|
MyString file;
|
|
|
|
CSetStart() { slot=0; };
|
|
};
|
|
|
|
typedef enum
|
|
{
|
|
OPTION_ERROR = -1,
|
|
OPTION_CONFIGVERSION = 0,
|
|
OPTION_GUID,
|
|
OPTION_HALTONBADREAD,
|
|
OPTION_HALTONBADACC,
|
|
OPTION_HALTONHALTS,
|
|
OPTION_ENABLEREWIND,
|
|
OPTION_COLORMODE,
|
|
OPTION_VIDEOFX,
|
|
OPTION_JOYSTICKMODE,
|
|
OPTION_BROWSERNAME,
|
|
OPTION_BROWSERVERSION,
|
|
OPTION_LATESTRUNBUILD,
|
|
OPTION_LATESTUPDATECHECK,
|
|
OPTION_DONOTSHOWUPDATEALERT,
|
|
|
|
OPTION_DONOTSHOWDISKSTATUS,
|
|
OPTION_PNGBORDER,
|
|
OPTION_SIMULATESPACE,
|
|
OPTION_LATESTVERSION,
|
|
|
|
OPTION_SPEED,
|
|
OPTION_LATESTVERSIONDATE,
|
|
OPTION_AUDIORATE,
|
|
OPTION_MEMORYSIZE,
|
|
OPTION_JOYXSCALE,
|
|
OPTION_JOYYSCALE,
|
|
OPTION_DISKSOUND,
|
|
OPTION_FIXEDVBLANK,
|
|
OPTION_ADBDELAY,
|
|
OPTION_ADBRATE,
|
|
|
|
#ifdef DRIVER_IOS
|
|
OPTION_FRAMERATE,
|
|
OPTION_LOCKZOOM,
|
|
OPTION_LASTTAB,
|
|
OPTION_DEBUGMODE,
|
|
OPTION_EXTERNALKBD,
|
|
#endif
|
|
#ifdef ACTIVEGSKARATEKA
|
|
OPTION_SHOWICONS,
|
|
OPTION_ENABLECHEAT,
|
|
OPTION_SOUNDMODE,
|
|
OPTION_KARATEKAREWIND,
|
|
#endif
|
|
#ifdef VIRTUALAPPLE
|
|
OPTION_DEBUG,
|
|
OPTION_SCORES,
|
|
OPTION_GAMECENTER,
|
|
#endif
|
|
NB_OPTIONS
|
|
} option_id;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
int inConfig;
|
|
int inDefault;
|
|
const char* name ;
|
|
int defaultint;
|
|
const char* defaultstr;
|
|
const char** convertTableDesc;
|
|
const char** convertTableAlias;
|
|
const int* convertTableInt;
|
|
} namevaluedef;
|
|
|
|
class namevalue
|
|
{
|
|
public:
|
|
const namevaluedef* def;
|
|
MyString strvalue;
|
|
int intvalue;
|
|
int confOverrided;
|
|
|
|
namevalue() { intvalue=0;confOverrided=0; def=NULL; }
|
|
|
|
int convertToInt(const char* _value);
|
|
int belongsToValue(int v);
|
|
void getAlias( MyString& _str);
|
|
const char* getDescription(int _value);
|
|
int getOrder(int _value);
|
|
|
|
};
|
|
|
|
|
|
|
|
class COption
|
|
{
|
|
public:
|
|
int initiliazed;
|
|
namevalue options[NB_OPTIONS];
|
|
namevalue& find(option_id _id) { return options[_id]; };
|
|
option_id findByName(const char* _name);
|
|
|
|
void getParameterFilename(MyString& filename,int nb);
|
|
void getStrValue(MyString& str,option_id _id);
|
|
int getIntValue(option_id _id);
|
|
void setValue(option_id _id,const char* _value, int overideConf=0);
|
|
void setIntValue(option_id _id,int _value,int overideConf=0);
|
|
//void setConfValue(option_id _id,const char* _value);
|
|
//void setConfIntValue(option_id _id,int _value);
|
|
void initOptions();
|
|
void setDefaultOptions();
|
|
void generateGUID(MyString& guid);
|
|
void loadOptions();
|
|
int loadParameters(int _nb);
|
|
void saveOptions(int _nb);
|
|
bool addEmulatorParam(const char* _param);
|
|
const char* getDescription(option_id _id, int _value);
|
|
COption() { initiliazed = 0; };
|
|
/// void initOptions();
|
|
void enableOptions();
|
|
};
|
|
|
|
|
|
|
|
enum eslotstatus
|
|
{
|
|
UNDEFINED,
|
|
MOUNTED,
|
|
READY2MOUNT,
|
|
EJECTED,
|
|
FAILED,
|
|
NOTHING,
|
|
DELAYEDMOUNT
|
|
};
|
|
|
|
enum eSetSlotPos
|
|
{
|
|
ADD,
|
|
REPLACECURRENT
|
|
};
|
|
|
|
class CActiveImage
|
|
{
|
|
public:
|
|
int iActive;
|
|
int iNb;
|
|
CActiveImage(){iActive=0; iNb=0;}
|
|
};
|
|
|
|
class CSlotInfo
|
|
{
|
|
public:
|
|
|
|
#if defined(WIN32) && !defined(UNDER_CE)
|
|
CString url;
|
|
#else
|
|
MyString url; // original url
|
|
#endif
|
|
|
|
MyString filename; // physical name
|
|
MyString prefix;
|
|
MyString shortname; // physical filename
|
|
int patch_addr;
|
|
MyString patch_value;
|
|
int size;
|
|
int delay;
|
|
eslotstatus status;
|
|
CSlotInfo() { delay=0; size=0; status=UNDEFINED; patch_addr=0; }
|
|
};
|
|
|
|
#define ACTIVEGSMAXIMAGE 16
|
|
|
|
|
|
#define MAX_CHECK 16
|
|
struct ConfigBP
|
|
{
|
|
MyString value;
|
|
char check[MAX_CHECK];
|
|
int addr;
|
|
enum mode_breakpoint mode;
|
|
};
|
|
|
|
class CEmulatorConfig
|
|
{
|
|
public:
|
|
|
|
CActiveImage activeImages[3][MAXSLOT7DRIVES];
|
|
|
|
CSlotInfo localImages[3][MAXSLOT7DRIVES][ACTIVEGSMAXIMAGE];
|
|
MyString baseURL;
|
|
CEmulatorConfig();
|
|
int nb_bps;
|
|
ConfigBP BPs[MAX_BREAK_POINTS];
|
|
void setBaseURL(const char* _url);
|
|
MyString uid;
|
|
MyString name;
|
|
MyString nameurl;
|
|
MyString desc;
|
|
MyString year;
|
|
MyString publisher;
|
|
MyString publisherurl;
|
|
// MyString persistentPath;
|
|
MyString visibleName;
|
|
|
|
bool need2remount;
|
|
// bool fastConfig; // pour ignore les images dans le xml si le parametre a ÈtÈ passÈ en ligne de commande
|
|
#if defined(WIN32) && defined(_USRDLL)
|
|
LONG speed;
|
|
LONG bootslot;
|
|
CString xmlconfig;
|
|
CString emulatorParam;
|
|
CString systemParam;
|
|
CString bramParam;
|
|
CString setStartParam;
|
|
#else
|
|
int speed;
|
|
int bootslot;
|
|
MyString xmlconfig;
|
|
MyString emulatorParam;
|
|
MyString bramParam;
|
|
MyString systemParam;
|
|
MyString setStartParam;
|
|
#endif
|
|
MyString xmlEmulatorParam;
|
|
MyString xmlSystemParam;
|
|
MyString xmlBramParam;
|
|
MyString stateFilename;
|
|
|
|
simplexml* pXML;
|
|
CSlotInfo* setSlot(int _slot, int _drive, const char* _image, eSetSlotPos _pos);
|
|
CActiveImage& getActiveImage(int _slot, int _drive);
|
|
CSlotInfo& getLocalImage(int _slot,int _drive, int _pos);
|
|
const char* getSlot(int _slot, int _drive);
|
|
int xmlAlreadyLoaded;
|
|
int processXML(const char*_path,simplexml* ptrconfig);
|
|
void loadXMLFile();
|
|
void saveXMLFile(const char* _desc);
|
|
void processCommandLine(int argc, char** argv);
|
|
void resetConfig();
|
|
};
|
|
|
|
#define EMULATOR_MAX_PARAMS 256
|
|
|
|
|
|
extern COption option;
|
|
|
|
class CEmulator
|
|
{
|
|
|
|
public:
|
|
CEmulator** parent;
|
|
static CEmulator* theEmulator;
|
|
|
|
#ifdef ACTIVEGSPLUGIN
|
|
void* pInstance;
|
|
void setPluginInstance(void*);
|
|
#endif
|
|
|
|
int lights[4];
|
|
int tracks[4];
|
|
void setLight(int _motorOn,int _slot, int _drive, int _curtrack);
|
|
CEmulatorConfig* config;
|
|
int nbparams;
|
|
struct param params[EMULATOR_MAX_PARAMS];
|
|
volatile bool bInThread;
|
|
void* theWindow; // HWND or WINDOWREF
|
|
int x;
|
|
int y;
|
|
int width;
|
|
int height;
|
|
|
|
public:
|
|
void onSpeedChanged(int _speed, bool _ignoreAcceptEvents=false);
|
|
void onBootSlotChanged(int _bootslot);
|
|
void onXMLConfigChanged(const char *_xmlconfig,simplexml* _pXML);
|
|
void onEmulatorParamChanged(const char* _param);
|
|
void addUniqueParam(struct param _p);
|
|
void sendStats();
|
|
void checkAlerts();
|
|
int acceptEvents();
|
|
|
|
public:
|
|
void setConfig(CEmulatorConfig* _config);
|
|
CSetStart setStart;
|
|
|
|
void resetLocalIMG();
|
|
int loadDiskImage(int _slot,int _drive);
|
|
void reloadDisk(int _slot,int _drive);
|
|
void relaunchEmulator();
|
|
void launchEmulator();
|
|
void terminateEmulator();
|
|
// To be defined in son
|
|
virtual void x_LaunchThread() = 0;
|
|
virtual void x_WaitForEndThread() = 0;
|
|
|
|
|
|
public:
|
|
// void setURL(const char* _url);
|
|
|
|
bool setEmulatorParam(const char* _p ) {return parseParam(_p,EMULATOR); }
|
|
MyString bramParam;
|
|
void setBramParam(const char* _p);
|
|
bool parseParam(const char* _p,eParamType _param);
|
|
bool setParam(eParamType _type, const char* _data, const char* _value);
|
|
|
|
|
|
bool setStartParam();
|
|
bool extractSetStartParam(const char* run);
|
|
|
|
public:
|
|
void mountDisks();
|
|
void forceFocus();
|
|
|
|
|
|
//protected:
|
|
public:
|
|
|
|
CEmulator(CEmulator** _parent);
|
|
virtual ~CEmulator() ;
|
|
void destroy();
|
|
|
|
public:
|
|
void updateBramParameters();
|
|
CSlotInfo& getLocalIMGInfo(int _slot,int _drive);
|
|
int getLocalMultipleIMGInfo(int _slot,int _drive,CSlotInfo& info, int pos);
|
|
int getSmartSwap();
|
|
int smartSwap();
|
|
int swapDisk(int _slot,int _drive, int pos=-1);
|
|
int theThread();
|
|
void mountDisk(int _slot,int _drive, const char* _url);
|
|
int mountImages();
|
|
int mountDelayedDisk();
|
|
bool remainingDelayedDisk();
|
|
void ejectDisk(int _slot,int _drive);
|
|
void readImageInfo(int _slot,int _drive, int _imagelen, int _imagestart, int _isprodos);
|
|
|
|
MyString statusMsg;
|
|
|
|
void initBramParam(const char* _param);
|
|
void initEmulatorParam(const char* _param);
|
|
|
|
void processCommand(const char* _val, MyString& ret);
|
|
|
|
virtual void refreshStatus(const char* _msg) {} ;
|
|
virtual void showLoading( int _loading,int _disk) {};
|
|
|
|
|
|
virtual void showStatus(const char* _msg) {} ;
|
|
virtual void disableConsole() {} ;
|
|
virtual void loadingInProgress(int _motorOn,int _slot, int _drive) {};
|
|
virtual int activeRead(char *buf) { buf[0]=0; return 0; }
|
|
|
|
virtual void getEngineString(MyString& _engine) {};
|
|
};
|
|
|
|
void x_display_alert(int _abort, const char* _title, const char* _message);
|
|
|
|
|
|
|
|
|