OXYGENHUB
◆ main openmsx / src / cpu / Z80.hh
5.1 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#ifndef Z80_HH
2
#define Z80_HH
3
4
#include "CPUClock.hh"
5
6
#include "inline.hh"
7
8
#include <cassert>
9
10
namespace openmsx {
11
12
class CPURegs;
13
14
class Z80TYPE : public CPUClock
15
{
16
protected:
17
	template<bool> struct Normalize { static constexpr bool value = false; };
18
19
	static constexpr int CLOCK_FREQ = 3579545;
20
	static constexpr int WAIT_CYCLES = 1;
21
	static constexpr unsigned HALT_STATES = 4 + WAIT_CYCLES; // HALT + M1
22
	static constexpr bool IS_R800 = false;
23
24
	Z80TYPE(EmuTime time, Scheduler& scheduler_)
25
		: CPUClock(time, scheduler_)
26
	{
27
	}
28
29
	template<bool, bool> ALWAYS_INLINE void PRE_MEM  (unsigned /*address*/) const {}
30
	template<      bool> ALWAYS_INLINE void POST_MEM (unsigned /*address*/) const {}
31
	template<bool, bool> ALWAYS_INLINE void PRE_WORD (unsigned /*address*/) const {}
32
	template<      bool> ALWAYS_INLINE void POST_WORD(unsigned /*address*/) const {}
33
34
	ALWAYS_INLINE void R800Refresh(CPURegs& /*R*/) const {}
35
	ALWAYS_INLINE void R800ForcePageBreak() const {}
36
37
	ALWAYS_INLINE void setMemPtr(unsigned x) { memptr = x; }
38
	[[nodiscard]] ALWAYS_INLINE unsigned getMemPtr() const { return memptr; }
39
40
	static constexpr int
41
	CC_LD_A_SS   = 5+3,       CC_LD_A_SS_1  = 5+1,
42
	CC_LD_A_NN   = 5+3+3+3,   CC_LD_A_NN_1  = 5+1,   CC_LD_A_NN_2  = 5+3+3+1,
43
	CC_LD_A_I    = 5+6,
44
	CC_LD_R_R    = 5,
45
	CC_LD_R_N    = 5+3,       CC_LD_R_N_1   = 5+1,
46
	CC_LD_R_HL   = 5+3,       CC_LD_R_HL_1  = 5+1,
47
	CC_LD_R_XIX  = 5+3+5+3,   CC_LD_R_XIX_1 = 5+1,   CC_LD_R_XIX_2 = 5+3+5+1, // +5
48
	CC_LD_HL_R   = 5+3,       CC_LD_HL_R_1  = 5+1,
49
	CC_LD_HL_N   = 5+3+3,     CC_LD_HL_N_1  = 5+1,   CC_LD_HL_N_2  = 5+3+1,
50
	CC_LD_SS_A   = 5+3,       CC_LD_SS_A_1  = 5+1,
51
	CC_LD_NN_A   = 5+3+3+3,   CC_LD_NN_A_1  = 5+1,   CC_LD_NN_A_2  = 5+3+3+1,
52
	CC_LD_XIX_R  = 5+3+5+3,   CC_LD_XIX_R_1 = 5+1,   CC_LD_XIX_R_2 = 5+3+5+1, // +5
53
	CC_LD_XIX_N  = 5+3+5+3,   CC_LD_XIX_N_1 = 5+1,   CC_LD_XIX_N_2 = 5+3+5+1, // +5
54
	CC_LD_HL_XX  = 5+3+3+3+3, CC_LD_HL_XX_1 = 5+1,   CC_LD_HL_XX_2 = 5+3+3+1,
55
	CC_LD_SP_HL  = 7,
56
	CC_LD_SS_NN  = 5+3+3,     CC_LD_SS_NN_1 = 5+1,
57
	CC_LD_XX_HL  = 5+3+3+3+3, CC_LD_XX_HL_1 = 5+1,   CC_LD_XX_HL_2 = 5+3+3+1,
58
59
	CC_CP_R      = 5,
60
	CC_CP_N      = 5+3,       CC_CP_N_1     = 5+1,
61
	CC_CP_XHL    = 5+3,       CC_CP_XHL_1   = 5+1,
62
	CC_CP_XIX    = 5+3+5+3,   CC_CP_XIX_1   = 5+1,   CC_CP_XIX_2   = 5+3+5+1, // +5
63
	CC_INC_R     = 5,
64
	CC_INC_XHL   = 5+4+3,     CC_INC_XHL_1  = 5+1,   CC_INC_XHL_2  = 5+4+1,
65
	CC_INC_XIX   = 5+3+5+4+3, CC_INC_XIX_1  = 5+1,   EE_INC_XIX    = 8,       // +5
66
	CC_INC_SS    = 7,
67
	CC_ADD_HL_SS = 5+4+3,
68
	CC_ADC_HL_SS = 5+5+4+3,
69
70
	CC_LDI       = 5+5+3+5,   CC_LDI_1      = 5+5+1, CC_LDI_2      = 5+5+3+1,
71
	CC_LDIR      = 5+5+3+5+5,
72
	CC_CPI       = 5+5+3+5,   CC_CPI_1      = 5+5+1,
73
	CC_CPIR      = 5+5+3+5+5,
74
75
	CC_PUSH      = 6+3+3,     CC_PUSH_1     = 6+1,
76
	CC_POP       = 5+3+3,     CC_POP_1      = 5+1,
77
	CC_CALL      = 5+3+4+3+3, CC_CALL_1     = 5+1,   EE_CALL       = 6,
78
	CC_CALL_A    = 5+3+4+3+3, CC_CALL_B     = 5+3+3,
79
	CC_RST       = 6+3+3,
80
	CC_RET_A     = 5+3+3,     CC_RET_B      = 5,     EE_RET_C      = 1,
81
	CC_RETN      = 5+5+3+3,   EE_RETN       = 5,
82
	CC_JP_A      = 5+3+3,     CC_JP_B       = 5+3+3, CC_JP_1       = 5+1,
83
	CC_JP_HL     = 5,
84
	CC_JR_A      = 5+3+5,     CC_JR_B       = 5+3,   CC_JR_1       = 5+1,
85
	CC_DJNZ      = 6+3+5,     EE_DJNZ       = 1,
86
87
	CC_EX_SP_HL  = 5+3+4+3+5, CC_EX_SP_HL_1 = 5+1,   CC_EX_SP_HL_2 = 5+3+4+1,
88
89
	CC_BIT_R     = 5+5,
90
	CC_BIT_XHL   = 5+5+4,     CC_BIT_XHL_1  = 5+5+1,
91
	CC_BIT_XIX   = 5+3+5+4,   CC_BIT_XIX_1  = 5+3+5+1,                        // +5
92
	CC_SET_R     = 5+5,
93
	CC_SET_XHL   = 5+5+4+3,   CC_SET_XHL_1  = 5+5+1, CC_SET_XHL_2  = 5+5+4+1,
94
	CC_SET_XIX   = 5+3+5+4+3, EE_SET_XIX    = 3,                              // +5
95
96
	CC_RLA       = 5,
97
	CC_RLD       = 5+5+3+4+3, CC_RLD_1      = 5+5+1, CC_RLD_2      = 5+5+3+4+1,
98
99
	CC_IN_A_N    = 5+3+4,     CC_IN_A_N_1   = 5+1,   CC_IN_A_N_2   = 5+3+1,
100
	CC_IN_R_C    = 5+5+4,     CC_IN_R_C_1   = 5+5+1,
101
	CC_INI       = 5+6+4+3,   CC_INI_1      = 5+6+1, CC_INI_2      = 5+6+4+1,
102
	CC_INIR      = 5+6+4+3+5,
103
	CC_OUT_N_A   = 5+3+4,     CC_OUT_N_A_1  = 5+1,   CC_OUT_N_A_2  = 5+3+1,
104
	CC_OUT_C_R   = 5+5+4,     CC_OUT_C_R_1  = 5+5+1,
105
	CC_OUTI      = 5+6+3+4,   CC_OUTI_1     = 5+6+1, CC_OUTI_2     = 5+6+3+1,
106
	CC_OTIR      = 5+6+3+4+5,
107
108
	CC_EX        = 5,
109
	CC_NOP       = 5,
110
	CC_CCF       = 5,
111
	CC_SCF       = 5,
112
	CC_DAA       = 5,
113
	CC_NEG       = 5+5,
114
	CC_CPL       = 5,
115
	CC_DI        = 5,
116
	CC_EI        = 5,
117
	CC_HALT      = 5,
118
	CC_IM        = 5+5,
119
120
	CC_MULUB     = 0,
121
	CC_MULUW     = 0,
122
123
	CC_NMI       = 5+3+3,     EE_NMI_1      = -1,
124
	CC_IRQ0      = 7+3+3,     EE_IRQ0_1     = 1,
125
	CC_IRQ1      = 7+3+3,     EE_IRQ1_1     = 1,
126
	CC_IRQ2      = 7+3+3+3+3, EE_IRQ2_1     = 1,     CC_IRQ2_2     = 7+3+3+1,
127
128
	CC_MAIN      = 1,
129
	CC_DD        = 5,
130
	CC_PREFIX    = 5+1,
131
	CC_DD_CB     = 5+1, // +5
132
	EE_ED        = 5,
133
	CC_RDMEM     = 3,
134
	CC_WRMEM     = 3;
135
136
	// versions (version number shared with CPUCore<> class)
137
	//  1 -> initial version
138
	//  2 -> moved memptr from CPUCore to here
139
	template<typename Archive>
140
	void serialize(Archive& ar, unsigned version)
141
	{
142
		CPUClock::serialize(ar, version);
143
		if (version >= 2) {
144
			ar.serialize("memptr", memptr);
145
		}
146
	}
147
148
private:
149
	unsigned memptr;
150
};
151
152
153
} // namespace openmsx
154
155
#endif