2014-06-09 01:10:29 +03:00
|
|
|
#ifndef _runmode__hpp__included__
|
|
|
|
#define _runmode__hpp__included__
|
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
class emulator_runmode
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
const static uint64_t QUIT;
|
|
|
|
const static uint64_t NORMAL;
|
|
|
|
const static uint64_t LOAD;
|
|
|
|
const static uint64_t ADVANCE_FRAME;
|
|
|
|
const static uint64_t ADVANCE_SUBFRAME;
|
|
|
|
const static uint64_t SKIPLAG;
|
|
|
|
const static uint64_t SKIPLAG_PENDING;
|
|
|
|
const static uint64_t PAUSE;
|
|
|
|
const static uint64_t PAUSE_BREAK;
|
|
|
|
const static uint64_t CORRUPT;
|
|
|
|
|
|
|
|
const static unsigned P_START;
|
|
|
|
const static unsigned P_VIDEO;
|
|
|
|
const static unsigned P_SAVE;
|
|
|
|
const static unsigned P_NONE;
|
|
|
|
/**
|
|
|
|
* Ctor.
|
|
|
|
*/
|
|
|
|
emulator_runmode();
|
|
|
|
/**
|
|
|
|
* Save current mode and set mode to LOAD.
|
|
|
|
*/
|
|
|
|
void start_load();
|
|
|
|
/**
|
|
|
|
* Restore saved mode.
|
|
|
|
*/
|
|
|
|
void end_load();
|
|
|
|
/**
|
|
|
|
* Decay SKIPLAG_PENDING to SKIPLAG.
|
|
|
|
*/
|
|
|
|
void decay_skiplag();
|
|
|
|
/**
|
|
|
|
* Decay PAUSE_BREAK into PAUSE.
|
|
|
|
*/
|
|
|
|
void decay_break();
|
|
|
|
/**
|
|
|
|
* Is paused?
|
|
|
|
*/
|
|
|
|
bool is_paused() { return is(PAUSE | PAUSE_BREAK); }
|
|
|
|
/**
|
|
|
|
* Is paused normally?
|
|
|
|
*/
|
|
|
|
bool is_paused_normal() { return is(PAUSE); }
|
|
|
|
/**
|
|
|
|
* Is paused debug break?
|
|
|
|
*/
|
|
|
|
bool is_paused_break() { return is(PAUSE_BREAK); }
|
|
|
|
/**
|
|
|
|
* Is advancing frames?
|
|
|
|
*/
|
|
|
|
bool is_advance_frame() { return is(ADVANCE_FRAME); }
|
|
|
|
/**
|
|
|
|
* Is advancing subframes?
|
|
|
|
*/
|
|
|
|
bool is_advance_subframe() { return is(ADVANCE_SUBFRAME); }
|
|
|
|
/**
|
|
|
|
* Is advancing (frames or subframes)?
|
|
|
|
*/
|
|
|
|
bool is_advance() { return is(ADVANCE_FRAME|ADVANCE_SUBFRAME); }
|
|
|
|
/**
|
|
|
|
* Is skipping lag?
|
|
|
|
*/
|
|
|
|
bool is_skiplag() { return is(SKIPLAG); }
|
|
|
|
/**
|
|
|
|
* Is running free?
|
|
|
|
*/
|
|
|
|
bool is_freerunning() { return is(NORMAL); }
|
|
|
|
/**
|
|
|
|
* Is special?
|
|
|
|
*/
|
|
|
|
bool is_special() { return is(QUIT|LOAD|CORRUPT); }
|
|
|
|
/**
|
|
|
|
* Is load?
|
|
|
|
*/
|
|
|
|
bool is_load() { return is(LOAD); }
|
|
|
|
/**
|
|
|
|
* Is quit?
|
|
|
|
*/
|
|
|
|
bool is_quit() { return is(QUIT); }
|
|
|
|
/**
|
|
|
|
* Set pause.
|
|
|
|
*/
|
|
|
|
void set_pause() { set(PAUSE); }
|
|
|
|
/**
|
|
|
|
* Set break.
|
|
|
|
*/
|
|
|
|
void set_break() { set(PAUSE_BREAK); }
|
|
|
|
/**
|
|
|
|
* Set quit.
|
|
|
|
*/
|
|
|
|
void set_quit() { set(QUIT); }
|
|
|
|
/**
|
|
|
|
* Set freerunning.
|
|
|
|
*/
|
|
|
|
void set_freerunning() { set(NORMAL); }
|
|
|
|
/**
|
|
|
|
* Set advance frame.
|
|
|
|
*
|
|
|
|
* The advanced and cancel flags are cleared.
|
|
|
|
*/
|
|
|
|
void set_frameadvance() { set(ADVANCE_FRAME); }
|
|
|
|
/**
|
|
|
|
* Set advance subframe.
|
|
|
|
*
|
|
|
|
* The advanced and cancel flags are cleared.
|
|
|
|
*/
|
|
|
|
void set_subframeadvance() { set(ADVANCE_SUBFRAME); }
|
|
|
|
/**
|
|
|
|
* Set pending skiplag.
|
|
|
|
*/
|
|
|
|
void set_skiplag_pending() { set(SKIPLAG_PENDING); }
|
|
|
|
/**
|
|
|
|
* Set pause or freerunning.
|
|
|
|
*/
|
|
|
|
void set_pause_cond(bool paused) { set(paused ? PAUSE : NORMAL); }
|
|
|
|
/**
|
|
|
|
* Set advanced flag and return previous value.
|
|
|
|
*/
|
|
|
|
bool set_and_test_advanced();
|
|
|
|
/**
|
|
|
|
* Set cancel flag.
|
|
|
|
*/
|
|
|
|
void set_cancel();
|
|
|
|
/**
|
|
|
|
* Test and clear cancel flag.
|
|
|
|
*/
|
|
|
|
bool clear_and_test_cancel();
|
|
|
|
/**
|
|
|
|
* Is cancel flag set?
|
|
|
|
*/
|
|
|
|
bool test_cancel();
|
|
|
|
/**
|
|
|
|
* Is advanced flag set?
|
|
|
|
*/
|
|
|
|
bool test_advanced();
|
|
|
|
/**
|
|
|
|
* Test corrupt flag.
|
|
|
|
*/
|
|
|
|
bool is_corrupt() { return is(CORRUPT); }
|
|
|
|
/**
|
|
|
|
* Set corrupt flag.
|
|
|
|
*/
|
|
|
|
void set_corrupt() { set(CORRUPT); }
|
|
|
|
/**
|
|
|
|
* Clear corrupt flag.
|
|
|
|
*/
|
|
|
|
void clear_corrupt() { set(LOAD); }
|
|
|
|
/**
|
|
|
|
* Set current point
|
|
|
|
*/
|
|
|
|
void set_point(unsigned _point);
|
|
|
|
/**
|
|
|
|
* Get current point
|
|
|
|
*/
|
|
|
|
unsigned get_point();
|
2015-02-11 21:24:06 +02:00
|
|
|
/**
|
|
|
|
* Get the current runmode.
|
|
|
|
*/
|
|
|
|
uint64_t get();
|
2014-06-09 01:10:29 +03:00
|
|
|
private:
|
|
|
|
void revalidate();
|
|
|
|
void set(uint64_t m);
|
|
|
|
bool is(uint64_t m);
|
|
|
|
uint64_t mode;
|
|
|
|
uint64_t saved_mode;
|
|
|
|
uint64_t magic; //If mode is QUIT, this has to be QUIT_MAGIC.
|
|
|
|
//Flags relating to repeating advance.
|
|
|
|
bool advanced; //This is second or subsequent advance.
|
|
|
|
bool cancel; //Cancel advance at next oppurtunity.
|
|
|
|
bool saved_advanced;
|
|
|
|
bool saved_cancel;
|
|
|
|
//Current point.
|
|
|
|
unsigned point;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|