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)10 static INLINE void Immediate8(void)
11 {
12    OpAddress = ICPU.ShiftedPB + CPU.PC - CPU.PCBase;
13    CPU.PC++;
14 }
15 
Immediate16(void)16 static INLINE void Immediate16(void)
17 {
18    OpAddress = ICPU.ShiftedPB + CPU.PC - CPU.PCBase;
19    CPU.PC += 2;
20 }
21 
Relative(void)22 static 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)31 static 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)46 static 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)63 static 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)81 static 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)99 static 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)114 static 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)134 static 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)144 static 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)157 static 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)170 static 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)186 static 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)197 static 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)208 static 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)223 static 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)238 static 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)258 static 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)271 static 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)284 static 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)294 static 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