1 #include "../copyright" 2 3 #ifndef _CPUADDR_H_ 4 #define _CPUADDR_H_ 5 6 #include <retro_inline.h> 7 8 extern int32_t OpAddress; 9 Immediate8(void)10static INLINE void Immediate8(void) 11 { 12 OpAddress = ICPU.ShiftedPB + CPU.PC - CPU.PCBase; 13 CPU.PC++; 14 } 15 Immediate16(void)16static INLINE void Immediate16(void) 17 { 18 OpAddress = ICPU.ShiftedPB + CPU.PC - CPU.PCBase; 19 CPU.PC += 2; 20 } 21 Relative(void)22static INLINE void Relative(void) 23 { 24 int8_t Int8 = *CPU.PC++; 25 #ifndef SA1_OPCODES 26 CPU.Cycles += CPU.MemSpeed; 27 #endif 28 OpAddress = ((int32_t)(CPU.PC - CPU.PCBase) + Int8) & 0xffff; 29 } 30 RelativeLong(void)31static INLINE void RelativeLong(void) 32 { 33 #ifdef FAST_LSB_WORD_ACCESS 34 OpAddress = *(uint16_t*) CPU.PC; 35 #else 36 OpAddress = CPU.PC[0] + (CPU.PC[1] << 8); 37 #endif 38 #ifndef SA1_OPCODES 39 CPU.Cycles += CPU.MemSpeedx2 + ONE_CYCLE; 40 #endif 41 CPU.PC += 2; 42 OpAddress += (CPU.PC - CPU.PCBase); 43 OpAddress &= 0xffff; 44 } 45 AbsoluteIndexedIndirect(bool read)46static INLINE void AbsoluteIndexedIndirect(bool read) 47 { 48 #ifdef FAST_LSB_WORD_ACCESS 49 OpAddress = (ICPU.Registers.X.W + * (uint16_t*) CPU.PC) & 0xffff; 50 #else 51 OpAddress = (ICPU.Registers.X.W + CPU.PC[0] + (CPU.PC[1] << 8)) & 0xffff; 52 #endif 53 #ifndef SA1_OPCODES 54 CPU.Cycles += CPU.MemSpeedx2; 55 #endif 56 OpenBus = CPU.PC[1]; 57 CPU.PC += 2; 58 OpAddress = S9xGetWord(ICPU.ShiftedPB + OpAddress); 59 if (read) 60 OpenBus = (uint8_t)(OpAddress >> 8); 61 } 62 AbsoluteIndirectLong(bool read)63static INLINE void AbsoluteIndirectLong(bool read) 64 { 65 #ifdef FAST_LSB_WORD_ACCESS 66 OpAddress = *(uint16_t*) CPU.PC; 67 #else 68 OpAddress = CPU.PC[0] + (CPU.PC[1] << 8); 69 #endif 70 #ifndef SA1_OPCODES 71 CPU.Cycles += CPU.MemSpeedx2; 72 #endif 73 OpenBus = CPU.PC[1]; 74 CPU.PC += 2; 75 if (read) 76 OpAddress = S9xGetWord(OpAddress) | ((OpenBus = S9xGetByte(OpAddress + 2)) << 16); 77 else 78 OpAddress = S9xGetWord(OpAddress) | (S9xGetByte(OpAddress + 2) << 16); 79 } 80 AbsoluteIndirect(bool read)81static INLINE void AbsoluteIndirect(bool read) 82 { 83 #ifdef FAST_LSB_WORD_ACCESS 84 OpAddress = *(uint16_t*) CPU.PC; 85 #else 86 OpAddress = CPU.PC[0] + (CPU.PC[1] << 8); 87 #endif 88 #ifndef SA1_OPCODES 89 CPU.Cycles += CPU.MemSpeedx2; 90 #endif 91 OpenBus = CPU.PC[1]; 92 CPU.PC += 2; 93 OpAddress = S9xGetWord(OpAddress); 94 if (read) 95 OpenBus = (uint8_t) (OpAddress >> 8); 96 OpAddress += ICPU.ShiftedPB; 97 } 98 Absolute(bool read)99static INLINE void Absolute(bool read) 100 { 101 #ifdef FAST_LSB_WORD_ACCESS 102 OpAddress = *(uint16_t*) CPU.PC + ICPU.ShiftedDB; 103 #else 104 OpAddress = CPU.PC[0] + (CPU.PC[1] << 8) + ICPU.ShiftedDB; 105 #endif 106 if (read) 107 OpenBus = CPU.PC[1]; 108 CPU.PC += 2; 109 #ifndef SA1_OPCODES 110 CPU.Cycles += CPU.MemSpeedx2; 111 #endif 112 } 113 AbsoluteLong(bool read)114static INLINE void AbsoluteLong(bool read) 115 { 116 #ifdef FAST_LSB_WORD_ACCESS 117 OpAddress = (*(uint32_t*) CPU.PC) & 0xffffff; 118 #elif defined FAST_ALIGNED_LSB_WORD_ACCESS 119 if (((int32_t) CPU.PC & 1) == 0) 120 OpAddress = (*(uint16_t*) CPU.PC) + (CPU.PC[2] << 16); 121 else 122 OpAddress = *CPU.PC + ((*(uint16_t*) (CPU.PC + 1)) << 8); 123 #else 124 OpAddress = CPU.PC[0] + (CPU.PC[1] << 8) + (CPU.PC[2] << 16); 125 #endif 126 if (read) 127 OpenBus = CPU.PC[2]; 128 CPU.PC += 3; 129 #ifndef SA1_OPCODES 130 CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; 131 #endif 132 } 133 Direct(bool read)134static INLINE void Direct(bool read) 135 { 136 if (read) 137 OpenBus = *CPU.PC; 138 OpAddress = (*CPU.PC++ + ICPU.Registers.D.W) & 0xffff; 139 #ifndef SA1_OPCODES 140 CPU.Cycles += CPU.MemSpeed; 141 #endif 142 } 143 DirectIndirectIndexed(bool read)144static INLINE void DirectIndirectIndexed(bool read) 145 { 146 OpenBus = *CPU.PC; 147 OpAddress = (*CPU.PC++ + ICPU.Registers.D.W) & 0xffff; 148 #ifndef SA1_OPCODES 149 CPU.Cycles += CPU.MemSpeed; 150 #endif 151 OpAddress = S9xGetWord(OpAddress); 152 if (read) 153 OpenBus = (uint8_t)(OpAddress >> 8); 154 OpAddress += ICPU.ShiftedDB + ICPU.Registers.Y.W; 155 } 156 DirectIndirectIndexedLong(bool read)157static INLINE void DirectIndirectIndexedLong(bool read) 158 { 159 OpenBus = *CPU.PC; 160 OpAddress = (*CPU.PC++ + ICPU.Registers.D.W) & 0xffff; 161 #ifndef SA1_OPCODES 162 CPU.Cycles += CPU.MemSpeed; 163 #endif 164 if (read) 165 OpAddress = S9xGetWord(OpAddress) + ((OpenBus = S9xGetByte(OpAddress + 2)) << 16) + ICPU.Registers.Y.W; 166 else 167 OpAddress = S9xGetWord(OpAddress) + (S9xGetByte(OpAddress + 2) << 16) + ICPU.Registers.Y.W; 168 } 169 DirectIndexedIndirect(bool read)170static INLINE void DirectIndexedIndirect(bool read) 171 { 172 OpenBus = *CPU.PC; 173 OpAddress = (*CPU.PC++ + ICPU.Registers.D.W + ICPU.Registers.X.W) & 0xffff; 174 #ifndef SA1_OPCODES 175 CPU.Cycles += CPU.MemSpeed; 176 #endif 177 OpAddress = S9xGetWord(OpAddress); 178 if (read) 179 OpenBus = (uint8_t)(OpAddress >> 8); 180 OpAddress += ICPU.ShiftedDB; 181 #ifndef SA1_OPCODES 182 CPU.Cycles += ONE_CYCLE; 183 #endif 184 } 185 DirectIndexedX(bool read)186static INLINE void DirectIndexedX(bool read) 187 { 188 if (read) 189 OpenBus = *CPU.PC; 190 OpAddress = (*CPU.PC++ + ICPU.Registers.D.W + ICPU.Registers.X.W); 191 OpAddress &= CheckEmulation() ? 0xff : 0xffff; 192 #ifndef SA1_OPCODES 193 CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; 194 #endif 195 } 196 DirectIndexedY(bool read)197static INLINE void DirectIndexedY(bool read) 198 { 199 if (read) 200 OpenBus = *CPU.PC; 201 OpAddress = (*CPU.PC++ + ICPU.Registers.D.W + ICPU.Registers.Y.W); 202 OpAddress &= CheckEmulation() ? 0xff : 0xffff; 203 #ifndef SA1_OPCODES 204 CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; 205 #endif 206 } 207 AbsoluteIndexedX(bool read)208static INLINE void AbsoluteIndexedX(bool read) 209 { 210 #ifdef FAST_LSB_WORD_ACCESS 211 OpAddress = ICPU.ShiftedDB + *(uint16_t*) CPU.PC + ICPU.Registers.X.W; 212 #else 213 OpAddress = ICPU.ShiftedDB + CPU.PC[0] + (CPU.PC[1] << 8) + ICPU.Registers.X.W; 214 #endif 215 if (read) 216 OpenBus = CPU.PC[1]; 217 CPU.PC += 2; 218 #ifndef SA1_OPCODES 219 CPU.Cycles += CPU.MemSpeedx2; 220 #endif 221 } 222 AbsoluteIndexedY(bool read)223static INLINE void AbsoluteIndexedY(bool read) 224 { 225 #ifdef FAST_LSB_WORD_ACCESS 226 OpAddress = ICPU.ShiftedDB + *(uint16_t*) CPU.PC + ICPU.Registers.Y.W; 227 #else 228 OpAddress = ICPU.ShiftedDB + CPU.PC[0] + (CPU.PC[1] << 8) + ICPU.Registers.Y.W; 229 #endif 230 if (read) 231 OpenBus = CPU.PC[1]; 232 CPU.PC += 2; 233 #ifndef SA1_OPCODES 234 CPU.Cycles += CPU.MemSpeedx2; 235 #endif 236 } 237 AbsoluteLongIndexedX(bool read)238static INLINE void AbsoluteLongIndexedX(bool read) 239 { 240 #ifdef FAST_LSB_WORD_ACCESS 241 OpAddress = (*(uint32_t*) CPU.PC + ICPU.Registers.X.W) & 0xffffff; 242 #elif defined FAST_ALIGNED_LSB_WORD_ACCESS 243 if (((int32_t) CPU.PC & 1) == 0) 244 OpAddress = ((*(uint16_t*) CPU.PC) + (CPU.PC[2] << 16) + ICPU.Registers.X.W) & 0xFFFFFF; 245 else 246 OpAddress = (*CPU.PC + ((*(uint16_t*) (CPU.PC + 1)) << 8) + ICPU.Registers.X.W) & 0xFFFFFF; 247 #else 248 OpAddress = (CPU.PC[0] + (CPU.PC[1] << 8) + (CPU.PC[2] << 16) + ICPU.Registers.X.W) & 0xffffff; 249 #endif 250 if (read) 251 OpenBus = CPU.PC[2]; 252 CPU.PC += 3; 253 #ifndef SA1_OPCODES 254 CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; 255 #endif 256 } 257 DirectIndirect(bool read)258static INLINE void DirectIndirect(bool read) 259 { 260 OpenBus = *CPU.PC; 261 OpAddress = (*CPU.PC++ + ICPU.Registers.D.W) & 0xffff; 262 #ifndef SA1_OPCODES 263 CPU.Cycles += CPU.MemSpeed; 264 #endif 265 OpAddress = S9xGetWord(OpAddress); 266 if (read) 267 OpenBus = (uint8_t)(OpAddress >> 8); 268 OpAddress += ICPU.ShiftedDB; 269 } 270 DirectIndirectLong(bool read)271static INLINE void DirectIndirectLong(bool read) 272 { 273 OpenBus = *CPU.PC; 274 OpAddress = (*CPU.PC++ + ICPU.Registers.D.W) & 0xffff; 275 #ifndef SA1_OPCODES 276 CPU.Cycles += CPU.MemSpeed; 277 #endif 278 if (read) 279 OpAddress = S9xGetWord(OpAddress) + ((OpenBus = S9xGetByte(OpAddress + 2)) << 16); 280 else 281 OpAddress = S9xGetWord(OpAddress) + (S9xGetByte(OpAddress + 2) << 16); 282 } 283 StackRelative(bool read)284static INLINE void StackRelative(bool read) 285 { 286 if (read) 287 OpenBus = *CPU.PC; 288 OpAddress = (*CPU.PC++ + ICPU.Registers.S.W) & 0xffff; 289 #ifndef SA1_OPCODES 290 CPU.Cycles += CPU.MemSpeed + ONE_CYCLE; 291 #endif 292 } 293 StackRelativeIndirectIndexed(bool read)294static INLINE void StackRelativeIndirectIndexed(bool read) 295 { 296 OpenBus = *CPU.PC; 297 OpAddress = (*CPU.PC++ + ICPU.Registers.S.W) & 0xffff; 298 #ifndef SA1_OPCODES 299 CPU.Cycles += CPU.MemSpeed + TWO_CYCLES; 300 #endif 301 OpAddress = S9xGetWord(OpAddress); 302 if (read) 303 OpenBus = (uint8_t)(OpAddress >> 8); 304 OpAddress = (OpAddress + ICPU.ShiftedDB + ICPU.Registers.Y.W) & 0xffffff; 305 } 306 #endif 307