BizHawk/wonderswan/v30mz.h

166 lines
3.1 KiB
C++

#ifndef __V30MZ_H_
#define __V30MZ_H_
#include "system.h"
namespace MDFN_IEN_WSWAN
{
typedef union
{ /* eight general registers */
uint16 w[8]; /* viewed as 16 bits registers */
uint8 b[16]; /* or as 8 bit registers */
} v30mz_basicregs_t;
typedef struct
{
v30mz_basicregs_t regs;
uint16 sregs[4];
uint16 pc;
int32 SignVal;
uint32 AuxVal, OverVal, ZeroVal, CarryVal, ParityVal; /* 0 or non-0 valued flags */
uint8 TF, IF, DF;
} v30mz_regs_t;
namespace V30MZEnum
{
typedef enum { DS1, PS, SS, DS0 } SREGS;
typedef enum { AW, CW, DW, BW, SP, BP, IX, IY } WREGS;
#ifdef LSB_FIRST
typedef enum { AL,AH,CL,CH,DL,DH,BL,BH,SPL,SPH,BPL,BPH,IXL,IXH,IYL,IYH } BREGS;
#else
typedef enum { AH,AL,CH,CL,DH,DL,BH,BL,SPH,SPL,BPH,BPL,IXH,IXL,IYH,IYL } BREGS;
#endif
}
class V30MZ
{
public:
V30MZ();
void execute(int cycles);
void set_reg(int, unsigned);
unsigned get_reg(int regnum) const;
void reset();
void interrupt(uint32 vector, bool IgnoreIF = FALSE);
private:
uint16 old_CS, old_IP;
public:
uint32 timestamp;
private:
int32 ICount;
v30mz_regs_t I;
bool InHLT;
uint32 prefix_base; /* base address of the latest prefix segment */
char seg_prefix; /* prefix segment indicator */
uint8 parity_table[256];
uint32 EA;
uint16 EO;
uint16 E16;
struct {
struct {
V30MZEnum::WREGS w[256];
V30MZEnum::BREGS b[256];
} reg;
struct {
V30MZEnum::WREGS w[256];
V30MZEnum::BREGS b[256];
} RM;
} Mod_RM;
private:
void nec_interrupt(unsigned int_num);
bool CheckInHLT();
void DoOP(uint8 opcode);
void i_real_pushf();
void i_real_popf();
void i_real_insb();
void i_real_insw();
void i_real_outsb();
void i_real_outsw();
void i_real_movsb();
void i_real_movsw();
void i_real_cmpsb();
void i_real_cmpsw();
void i_real_stosb();
void i_real_stosw();
void i_real_lodsb();
void i_real_lodsw();
void i_real_scasb();
void i_real_scasw();
private:
unsigned EA_000();
unsigned EA_001();
unsigned EA_002();
unsigned EA_003();
unsigned EA_004();
unsigned EA_005();
unsigned EA_006();
unsigned EA_007();
unsigned EA_100();
unsigned EA_101();
unsigned EA_102();
unsigned EA_103();
unsigned EA_104();
unsigned EA_105();
unsigned EA_106();
unsigned EA_107();
unsigned EA_200();
unsigned EA_201();
unsigned EA_202();
unsigned EA_203();
unsigned EA_204();
unsigned EA_205();
unsigned EA_206();
unsigned EA_207();
private:
void SetupEA();
typedef unsigned(V30MZ::*EAFPtr)();
EAFPtr GetEA[192];
// memory callback system plumbing
public:
void (*ReadHook)(uint32 addr);
void (*WriteHook)(uint32 addr);
void (*ExecHook)(uint32 addr);
private:
uint8 cpu_readop(uint32 addr);
uint8 cpu_readop_arg(uint32 addr);
uint8 cpu_readmem20(uint32 addr);
void cpu_writemem20(uint32 addr, uint8 val);
public:
System *sys;
template<bool isReader>void SyncState(NewState *ns);
};
enum {
NEC_PC=1, NEC_AW, NEC_CW, NEC_DW, NEC_BW, NEC_SP, NEC_BP, NEC_IX, NEC_IY,
NEC_FLAGS, NEC_DS1, NEC_PS, NEC_SS, NEC_DS0
};
}
#endif