Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/wonderswan/v30mz.h
2 views
1
#ifndef __V30MZ_H_
2
#define __V30MZ_H_
3
4
#include "system.h"
5
6
namespace MDFN_IEN_WSWAN
7
{
8
9
typedef union
10
{ /* eight general registers */
11
uint16 w[8]; /* viewed as 16 bits registers */
12
uint8 b[16]; /* or as 8 bit registers */
13
} v30mz_basicregs_t;
14
15
typedef struct
16
{
17
v30mz_basicregs_t regs;
18
uint16 sregs[4];
19
20
uint16 pc;
21
22
int32 SignVal;
23
uint32 AuxVal, OverVal, ZeroVal, CarryVal, ParityVal; /* 0 or non-0 valued flags */
24
uint8 TF, IF, DF;
25
} v30mz_regs_t;
26
27
namespace V30MZEnum
28
{
29
30
typedef enum { DS1, PS, SS, DS0 } SREGS;
31
typedef enum { AW, CW, DW, BW, SP, BP, IX, IY } WREGS;
32
33
#ifdef LSB_FIRST
34
typedef enum { AL,AH,CL,CH,DL,DH,BL,BH,SPL,SPH,BPL,BPH,IXL,IXH,IYL,IYH } BREGS;
35
#else
36
typedef enum { AH,AL,CH,CL,DH,DL,BH,BL,SPH,SPL,BPH,BPL,IXH,IXL,IYH,IYL } BREGS;
37
#endif
38
}
39
40
class V30MZ
41
{
42
public:
43
V30MZ();
44
45
void execute(int cycles);
46
void set_reg(int, unsigned);
47
unsigned get_reg(int regnum) const;
48
void reset();
49
50
void interrupt(uint32 vector, bool IgnoreIF = FALSE);
51
52
private:
53
uint16 old_CS, old_IP;
54
55
public:
56
uint32 timestamp;
57
private:
58
int32 ICount;
59
60
v30mz_regs_t I;
61
bool InHLT;
62
63
uint32 prefix_base; /* base address of the latest prefix segment */
64
char seg_prefix; /* prefix segment indicator */
65
66
uint8 parity_table[256];
67
68
uint32 EA;
69
uint16 EO;
70
uint16 E16;
71
72
struct {
73
struct {
74
V30MZEnum::WREGS w[256];
75
V30MZEnum::BREGS b[256];
76
} reg;
77
struct {
78
V30MZEnum::WREGS w[256];
79
V30MZEnum::BREGS b[256];
80
} RM;
81
} Mod_RM;
82
83
private:
84
void nec_interrupt(unsigned int_num);
85
bool CheckInHLT();
86
void DoOP(uint8 opcode);
87
88
void i_real_pushf();
89
void i_real_popf();
90
91
void i_real_insb();
92
void i_real_insw();
93
void i_real_outsb();
94
void i_real_outsw();
95
void i_real_movsb();
96
void i_real_movsw();
97
void i_real_cmpsb();
98
void i_real_cmpsw();
99
void i_real_stosb();
100
void i_real_stosw();
101
void i_real_lodsb();
102
void i_real_lodsw();
103
void i_real_scasb();
104
void i_real_scasw();
105
106
private:
107
unsigned EA_000();
108
unsigned EA_001();
109
unsigned EA_002();
110
unsigned EA_003();
111
unsigned EA_004();
112
unsigned EA_005();
113
unsigned EA_006();
114
unsigned EA_007();
115
116
unsigned EA_100();
117
unsigned EA_101();
118
unsigned EA_102();
119
unsigned EA_103();
120
unsigned EA_104();
121
unsigned EA_105();
122
unsigned EA_106();
123
unsigned EA_107();
124
125
unsigned EA_200();
126
unsigned EA_201();
127
unsigned EA_202();
128
unsigned EA_203();
129
unsigned EA_204();
130
unsigned EA_205();
131
unsigned EA_206();
132
unsigned EA_207();
133
134
private:
135
void SetupEA();
136
137
typedef unsigned(V30MZ::*EAFPtr)();
138
EAFPtr GetEA[192];
139
140
// memory callback system plumbing
141
public:
142
void (*ReadHook)(uint32 addr);
143
void (*WriteHook)(uint32 addr);
144
void (*ExecHook)(uint32 addr);
145
private:
146
uint8 cpu_readop(uint32 addr);
147
uint8 cpu_readop_arg(uint32 addr);
148
uint8 cpu_readmem20(uint32 addr);
149
void cpu_writemem20(uint32 addr, uint8 val);
150
151
152
public:
153
System *sys;
154
template<bool isReader>void SyncState(NewState *ns);
155
};
156
157
158
enum {
159
NEC_PC=1, NEC_AW, NEC_CW, NEC_DW, NEC_BW, NEC_SP, NEC_BP, NEC_IX, NEC_IY,
160
NEC_FLAGS, NEC_DS1, NEC_PS, NEC_SS, NEC_DS0
161
};
162
163
}
164
165
#endif
166
167