| 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; |
| 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 ) const {} |
| 30 |
template< bool> ALWAYS_INLINE void POST_MEM (unsigned ) const {} |
| 31 |
template<bool, bool> ALWAYS_INLINE void PRE_WORD (unsigned ) const {} |
| 32 |
template< bool> ALWAYS_INLINE void POST_WORD(unsigned ) const {} |
| 33 |
|
| 34 |
ALWAYS_INLINE void R800Refresh(CPURegs& ) 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, |
| 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, |
| 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, |
| 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, |
| 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, |
| 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, |
| 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, |
| 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, |
| 132 |
EE_ED = 5, |
| 133 |
CC_RDMEM = 3, |
| 134 |
CC_WRMEM = 3; |
| 135 |
|
| 136 |
|
| 137 |
|
| 138 |
|
| 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 |
} |
| 154 |
|
| 155 |
#endif |