1 /*****************************************************************************
2 *
3 * z80.c
4 * Portable Z80 emulator V3.5
5 *
6 * Copyright Juergen Buchmueller, all rights reserved.
7 *
8 * - This source code is released as freeware for non-commercial purposes.
9 * - You are free to use and redistribute this code in modified or
10 * unmodified form, provided you list me in the credits.
11 * - If you modify this source code, you must add a notice to each modified
12 * source file that it has been changed. If you're a nice person, you
13 * will clearly mark each change too. :)
14 * - If you wish to use this for commercial purposes, please contact me at
15 * pullmoll@t-online.de
16 * - The author of this copywritten work reserves the right to change the
17 * terms of its usage and license at any time, including retroactively
18 * - This entire notice must remain in the source code.
19 *
20 * Changes in 3.7 [Aaron Giles]
21 * - Changed NMI handling. NMIs are now latched in set_irq_state
22 * but are not taken there. Instead they are taken at the start of the
23 * execute loop.
24 * - Changed IRQ handling. IRQ state is set in set_irq_state but not taken
25 * except during the inner execute loop.
26 * - Removed x86 assembly hacks and obsolete timing loop catchers.
27 * Changes in 3.6
28 * - Got rid of the code that would inexactly emulate a Z80, i.e. removed
29 * all the #if Z80_EXACT #else branches.
30 * - Removed leading underscores from local register name shortcuts as
31 * this violates the C99 standard.
32 * - Renamed the registers inside the Z80 context to lower case to avoid
33 * ambiguities (shortcuts would have had the same names as the fields
34 * of the structure).
35 * Changes in 3.5
36 * - Implemented OTIR, INIR, etc. without look-up table for PF flag.
37 * [Ramsoft, Sean Young]
38 * Changes in 3.4
39 * - Removed Z80-MSX specific code as it's not needed any more.
40 * - Implemented DAA without look-up table [Ramsoft, Sean Young]
41 * Changes in 3.3
42 * - Fixed undocumented flags XF & YF in the non-asm versions of CP,
43 * and all the 16 bit arithmetic instructions. [Sean Young]
44 * Changes in 3.2
45 * - Fixed undocumented flags XF & YF of RRCA, and CF and HF of
46 * INI/IND/OUTI/OUTD/INIR/INDR/OTIR/OTDR [Sean Young]
47 * Changes in 3.1
48 * - removed the REPEAT_AT_ONCE execution of LDIR/CPIR etc. opcodes
49 * for readabilities sake and because the implementation was buggy
50 * (and I was not able to find the difference)
51 * Changes in 3.0
52 * - 'finished' switch to dynamically overrideable cycle count tables
53 * Changes in 2.9:
54 * - added methods to access and override the cycle count tables
55 * - fixed handling and timing of multiple DD/FD prefixed opcodes
56 * Changes in 2.8:
57 * - OUTI/OUTD/OTIR/OTDR also pre-decrement the B register now.
58 * This was wrong because of a bug fix on the wrong side
59 * (astrocade sound driver).
60 * Changes in 2.7:
61 * - removed z80_vm specific code, it's not needed (and never was).
62 * Changes in 2.6:
63 * - BUSY_LOOP_HACKS needed to call change_pc() earlier, before
64 * checking the opcodes at the new address, because otherwise they
65 * might access the old (wrong or even NULL) banked memory region.
66 * Thanks to Sean Young for finding this nasty bug.
67 * Changes in 2.5:
68 * - Burning cycles always adjusts the ICount by a multiple of 4.
69 * - In REPEAT_AT_ONCE cases the R register wasn't incremented twice
70 * per repetition as it should have been. Those repeated opcodes
71 * could also underflow the ICount.
72 * - Simplified TIME_LOOP_HACKS for BC and added two more for DE + HL
73 * timing loops. I think those hacks weren't endian safe before too.
74 * Changes in 2.4:
75 * - z80_reset zaps the entire context, sets IX and IY to 0xffff(!) and
76 * sets the Z flag. With these changes the Tehkan World Cup driver
77 * _seems_ to work again.
78 * Changes in 2.3:
79 * - External termination of the execution loop calls z80_burn() and
80 * z80_vm_burn() to burn an amount of cycles (R adjustment)
81 * - Shortcuts which burn CPU cycles (BUSY_LOOP_HACKS and TIME_LOOP_HACKS)
82 * now also adjust the R register depending on the skipped opcodes.
83 * Changes in 2.2:
84 * - Fixed bugs in CPL, SCF and CCF instructions flag handling.
85 * - Changed variable EA and ARG16() function to UINT32; this
86 * produces slightly more efficient code.
87 * - The DD/FD XY CB opcodes where XY is 40-7F and Y is not 6/E
88 * are changed to calls to the X6/XE opcodes to reduce object size.
89 * They're hardly ever used so this should not yield a speed penalty.
90 * New in 2.0:
91 * - Optional more exact Z80 emulation (#define Z80_EXACT 1) according
92 * to a detailed description by Sean Young which can be found at:
93 * http://www.msxnet.org/tech/z80-documented.pdf
94 *****************************************************************************/
95
96 #include "burnint.h"
97 #include "z80.h"
98 #include <stddef.h>
99
100 #define FALSE 0
101 #define TRUE 1
102 #define Z80_INLINE static
103 #define change_pc(newpc) Z80.pc.w.l = (newpc)
104
105 static Z80ReadIoHandler Z80IORead;
106 static Z80WriteIoHandler Z80IOWrite;
107 static Z80ReadProgHandler Z80ProgramRead;
108 static Z80WriteProgHandler Z80ProgramWrite;
109 static Z80ReadOpHandler Z80CPUReadOp;
110 static Z80ReadOpArgHandler Z80CPUReadOpArg;
111
112 #define Z80Vector Z80.vector
113
114 #define VERBOSE 0
115
116 #define LOG(x) //do { if (VERBOSE) logerror x; } while (0)
117
118 /* execute main opcodes inside a big switch statement */
119 #ifndef BIG_SWITCH
120 #define BIG_SWITCH 1
121 #endif
122
123 /* big flags array for ADD/ADC/SUB/SBC/CP results */
124 #define BIG_FLAGS_ARRAY 1
125
126 /* on JP and JR opcodes check for tight loops */
127 #define BUSY_LOOP_HACKS 1
128
129
130 /****************************************************************************/
131 /* The Z80 registers. HALT is set to 1 when the CPU is halted, the refresh */
132 /* register is calculated as follows: refresh=(Z80.r&127)|(Z80.r2&128) */
133 /****************************************************************************/
134 #define CF 0x01
135 #define NF 0x02
136 #define PF 0x04
137 #define VF PF
138 #define XF 0x08
139 #define HF 0x10
140 #define YF 0x20
141 #define ZF 0x40
142 #define SF 0x80
143
144 #define INT_IRQ 0x01
145 #define NMI_IRQ 0x02
146
147 #define PRVPC Z80.prvpc.d /* previous program counter */
148
149 #define PCD Z80.pc.d
150 #define PC Z80.pc.w.l
151
152 #define SPD Z80.sp.d
153 #define SP Z80.sp.w.l
154
155 #define AFD Z80.af.d
156 #define AF Z80.af.w.l
157 #define A Z80.af.b.h
158 #define F Z80.af.b.l
159
160 #define BCD Z80.bc.d
161 #define BC Z80.bc.w.l
162 #define B Z80.bc.b.h
163 #define C Z80.bc.b.l
164
165 #define DED Z80.de.d
166 #define DE Z80.de.w.l
167 #define D Z80.de.b.h
168 #define E Z80.de.b.l
169
170 #define HLD Z80.hl.d
171 #define HL Z80.hl.w.l
172 #define H Z80.hl.b.h
173 #define L Z80.hl.b.l
174
175 #define IXD Z80.ix.d
176 #define IX Z80.ix.w.l
177 #define HX Z80.ix.b.h
178 #define LX Z80.ix.b.l
179
180 #define IYD Z80.iy.d
181 #define IY Z80.iy.w.l
182 #define HY Z80.iy.b.h
183 #define LY Z80.iy.b.l
184
185 #define WZ Z80.wz.w.l
186 #define WZ_H Z80.wz.b.h
187 #define WZ_L Z80.wz.b.l
188
189
190 #define I Z80.i
191 #define R Z80.r
192 #define R2 Z80.r2
193 #define IM Z80.im
194 #define IFF1 Z80.iff1
195 #define IFF2 Z80.iff2
196 #define HALT Z80.halt
197
198 int z80_ICount;
199 static INT32 end_run;
200 static Z80_Regs Z80;
201 UINT32 EA;
202
203 void (*z80edfe_callback)(Z80_Regs *Regs) = NULL;
204
205 static UINT8 SZ[256]; /* zero and sign flags */
206 static UINT8 SZ_BIT[256]; /* zero, sign and parity/overflow (=zero) flags for BIT opcode */
207 static UINT8 SZP[256]; /* zero, sign and parity flags */
208 static UINT8 SZHV_inc[256]; /* zero, sign, half carry and overflow flags INC r8 */
209 static UINT8 SZHV_dec[256]; /* zero, sign, half carry and overflow flags DEC r8 */
210
211 #if BIG_FLAGS_ARRAY
212 static UINT8 *SZHVC_add = 0;
213 static UINT8 *SZHVC_sub = 0;
214 #endif
215
216 static const UINT8 cc_op[0x100] = {
217 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4,
218 8,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4,
219 7,10,16, 6, 4, 4, 7, 4, 7,11,16, 6, 4, 4, 7, 4,
220 7,10,13, 6,11,11,10, 4, 7,11,13, 6, 4, 4, 7, 4,
221 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
222 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
223 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
224 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4,
225 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
226 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
227 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
228 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
229 5,10,10,10,10,11, 7,11, 5,10,10, 0,10,17, 7,11,
230 5,10,10,11,10,11, 7,11, 5, 4,10,11,10, 0, 7,11,
231 5,10,10,19,10,11, 7,11, 5, 4,10, 4,10, 0, 7,11,
232 5,10,10, 4,10,11, 7,11, 5, 6,10, 4,10, 0, 7,11};
233
234 static const UINT8 cc_cb[0x100] = {
235 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
236 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
237 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
238 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
239 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
240 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
241 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
242 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
243 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
244 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
245 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
246 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
247 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
248 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
249 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
250 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8};
251
252 static const UINT8 cc_ed[0x100] = {
253 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
254 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
255 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
256 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
257 12,12,15,20, 8,14, 8, 9,12,12,15,20, 8,14, 8, 9,
258 12,12,15,20, 8,14, 8, 9,12,12,15,20, 8,14, 8, 9,
259 12,12,15,20, 8,14, 8,18,12,12,15,20, 8,14, 8,18,
260 12,12,15,20, 8,14, 8, 8,12,12,15,20, 8,14, 8, 8,
261 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
262 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
263 16,16,16,16, 8, 8, 8, 8,16,16,16,16, 8, 8, 8, 8,
264 16,16,16,16, 8, 8, 8, 8,16,16,16,16, 8, 8, 8, 8,
265 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
266 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
267 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
268 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8};
269
270 static const UINT8 cc_xy[0x100] = {
271 4, 4, 4, 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4,
272 4, 4, 4, 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4,
273 4,14,20,10, 9, 9, 9, 4, 4,15,20,10, 9, 9, 9, 4,
274 4, 4, 4, 4,23,23,19, 4, 4,15, 4, 4, 4, 4, 4, 4,
275 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4,
276 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4,
277 9, 9, 9, 9, 9, 9,19, 9, 9, 9, 9, 9, 9, 9,19, 9,
278 19,19,19,19,19,19, 4,19, 4, 4, 4, 4, 9, 9,19, 4,
279 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4,
280 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4,
281 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4,
282 4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4,
283 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4,
284 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
285 4,14, 4,23, 4,15, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4,
286 4, 4, 4, 4, 4, 4, 4, 4, 4,10, 4, 4, 4, 4, 4, 4};
287
288 static const UINT8 cc_xycb[0x100] = {
289 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
290 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
291 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
292 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
293 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,
294 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,
295 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,
296 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,
297 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
298 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
299 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
300 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
301 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
302 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
303 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
304 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23};
305
306 /* extra cycles if jr/jp/call taken and 'interrupt latency' on rst 0-7 */
307 static const UINT8 cc_ex[0x100] = {
308 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
309 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DJNZ */
310 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* JR NZ/JR Z */
311 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* JR NC/JR C */
312 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
313 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
314 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
315 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
316 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
317 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
318 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
319 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, /* LDIR/CPIR/INIR/OTIR LDDR/CPDR/INDR/OTDR */
320 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2,
321 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2,
322 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2,
323 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2};
324
325 static const UINT8 *cc[6];
326 #define Z80_TABLE_dd Z80_TABLE_xy
327 #define Z80_TABLE_fd Z80_TABLE_xy
328
329 static void take_interrupt(void);
330 //void Z80Burn(int cycles);
331
332 typedef void (*funcptr)(void);
333
334 #define PROTOTYPES(tablename,prefix) \
335 Z80_INLINE void prefix##_00(void); Z80_INLINE void prefix##_01(void); Z80_INLINE void prefix##_02(void); Z80_INLINE void prefix##_03(void); \
336 Z80_INLINE void prefix##_04(void); Z80_INLINE void prefix##_05(void); Z80_INLINE void prefix##_06(void); Z80_INLINE void prefix##_07(void); \
337 Z80_INLINE void prefix##_08(void); Z80_INLINE void prefix##_09(void); Z80_INLINE void prefix##_0a(void); Z80_INLINE void prefix##_0b(void); \
338 Z80_INLINE void prefix##_0c(void); Z80_INLINE void prefix##_0d(void); Z80_INLINE void prefix##_0e(void); Z80_INLINE void prefix##_0f(void); \
339 Z80_INLINE void prefix##_10(void); Z80_INLINE void prefix##_11(void); Z80_INLINE void prefix##_12(void); Z80_INLINE void prefix##_13(void); \
340 Z80_INLINE void prefix##_14(void); Z80_INLINE void prefix##_15(void); Z80_INLINE void prefix##_16(void); Z80_INLINE void prefix##_17(void); \
341 Z80_INLINE void prefix##_18(void); Z80_INLINE void prefix##_19(void); Z80_INLINE void prefix##_1a(void); Z80_INLINE void prefix##_1b(void); \
342 Z80_INLINE void prefix##_1c(void); Z80_INLINE void prefix##_1d(void); Z80_INLINE void prefix##_1e(void); Z80_INLINE void prefix##_1f(void); \
343 Z80_INLINE void prefix##_20(void); Z80_INLINE void prefix##_21(void); Z80_INLINE void prefix##_22(void); Z80_INLINE void prefix##_23(void); \
344 Z80_INLINE void prefix##_24(void); Z80_INLINE void prefix##_25(void); Z80_INLINE void prefix##_26(void); Z80_INLINE void prefix##_27(void); \
345 Z80_INLINE void prefix##_28(void); Z80_INLINE void prefix##_29(void); Z80_INLINE void prefix##_2a(void); Z80_INLINE void prefix##_2b(void); \
346 Z80_INLINE void prefix##_2c(void); Z80_INLINE void prefix##_2d(void); Z80_INLINE void prefix##_2e(void); Z80_INLINE void prefix##_2f(void); \
347 Z80_INLINE void prefix##_30(void); Z80_INLINE void prefix##_31(void); Z80_INLINE void prefix##_32(void); Z80_INLINE void prefix##_33(void); \
348 Z80_INLINE void prefix##_34(void); Z80_INLINE void prefix##_35(void); Z80_INLINE void prefix##_36(void); Z80_INLINE void prefix##_37(void); \
349 Z80_INLINE void prefix##_38(void); Z80_INLINE void prefix##_39(void); Z80_INLINE void prefix##_3a(void); Z80_INLINE void prefix##_3b(void); \
350 Z80_INLINE void prefix##_3c(void); Z80_INLINE void prefix##_3d(void); Z80_INLINE void prefix##_3e(void); Z80_INLINE void prefix##_3f(void); \
351 Z80_INLINE void prefix##_40(void); Z80_INLINE void prefix##_41(void); Z80_INLINE void prefix##_42(void); Z80_INLINE void prefix##_43(void); \
352 Z80_INLINE void prefix##_44(void); Z80_INLINE void prefix##_45(void); Z80_INLINE void prefix##_46(void); Z80_INLINE void prefix##_47(void); \
353 Z80_INLINE void prefix##_48(void); Z80_INLINE void prefix##_49(void); Z80_INLINE void prefix##_4a(void); Z80_INLINE void prefix##_4b(void); \
354 Z80_INLINE void prefix##_4c(void); Z80_INLINE void prefix##_4d(void); Z80_INLINE void prefix##_4e(void); Z80_INLINE void prefix##_4f(void); \
355 Z80_INLINE void prefix##_50(void); Z80_INLINE void prefix##_51(void); Z80_INLINE void prefix##_52(void); Z80_INLINE void prefix##_53(void); \
356 Z80_INLINE void prefix##_54(void); Z80_INLINE void prefix##_55(void); Z80_INLINE void prefix##_56(void); Z80_INLINE void prefix##_57(void); \
357 Z80_INLINE void prefix##_58(void); Z80_INLINE void prefix##_59(void); Z80_INLINE void prefix##_5a(void); Z80_INLINE void prefix##_5b(void); \
358 Z80_INLINE void prefix##_5c(void); Z80_INLINE void prefix##_5d(void); Z80_INLINE void prefix##_5e(void); Z80_INLINE void prefix##_5f(void); \
359 Z80_INLINE void prefix##_60(void); Z80_INLINE void prefix##_61(void); Z80_INLINE void prefix##_62(void); Z80_INLINE void prefix##_63(void); \
360 Z80_INLINE void prefix##_64(void); Z80_INLINE void prefix##_65(void); Z80_INLINE void prefix##_66(void); Z80_INLINE void prefix##_67(void); \
361 Z80_INLINE void prefix##_68(void); Z80_INLINE void prefix##_69(void); Z80_INLINE void prefix##_6a(void); Z80_INLINE void prefix##_6b(void); \
362 Z80_INLINE void prefix##_6c(void); Z80_INLINE void prefix##_6d(void); Z80_INLINE void prefix##_6e(void); Z80_INLINE void prefix##_6f(void); \
363 Z80_INLINE void prefix##_70(void); Z80_INLINE void prefix##_71(void); Z80_INLINE void prefix##_72(void); Z80_INLINE void prefix##_73(void); \
364 Z80_INLINE void prefix##_74(void); Z80_INLINE void prefix##_75(void); Z80_INLINE void prefix##_76(void); Z80_INLINE void prefix##_77(void); \
365 Z80_INLINE void prefix##_78(void); Z80_INLINE void prefix##_79(void); Z80_INLINE void prefix##_7a(void); Z80_INLINE void prefix##_7b(void); \
366 Z80_INLINE void prefix##_7c(void); Z80_INLINE void prefix##_7d(void); Z80_INLINE void prefix##_7e(void); Z80_INLINE void prefix##_7f(void); \
367 Z80_INLINE void prefix##_80(void); Z80_INLINE void prefix##_81(void); Z80_INLINE void prefix##_82(void); Z80_INLINE void prefix##_83(void); \
368 Z80_INLINE void prefix##_84(void); Z80_INLINE void prefix##_85(void); Z80_INLINE void prefix##_86(void); Z80_INLINE void prefix##_87(void); \
369 Z80_INLINE void prefix##_88(void); Z80_INLINE void prefix##_89(void); Z80_INLINE void prefix##_8a(void); Z80_INLINE void prefix##_8b(void); \
370 Z80_INLINE void prefix##_8c(void); Z80_INLINE void prefix##_8d(void); Z80_INLINE void prefix##_8e(void); Z80_INLINE void prefix##_8f(void); \
371 Z80_INLINE void prefix##_90(void); Z80_INLINE void prefix##_91(void); Z80_INLINE void prefix##_92(void); Z80_INLINE void prefix##_93(void); \
372 Z80_INLINE void prefix##_94(void); Z80_INLINE void prefix##_95(void); Z80_INLINE void prefix##_96(void); Z80_INLINE void prefix##_97(void); \
373 Z80_INLINE void prefix##_98(void); Z80_INLINE void prefix##_99(void); Z80_INLINE void prefix##_9a(void); Z80_INLINE void prefix##_9b(void); \
374 Z80_INLINE void prefix##_9c(void); Z80_INLINE void prefix##_9d(void); Z80_INLINE void prefix##_9e(void); Z80_INLINE void prefix##_9f(void); \
375 Z80_INLINE void prefix##_a0(void); Z80_INLINE void prefix##_a1(void); Z80_INLINE void prefix##_a2(void); Z80_INLINE void prefix##_a3(void); \
376 Z80_INLINE void prefix##_a4(void); Z80_INLINE void prefix##_a5(void); Z80_INLINE void prefix##_a6(void); Z80_INLINE void prefix##_a7(void); \
377 Z80_INLINE void prefix##_a8(void); Z80_INLINE void prefix##_a9(void); Z80_INLINE void prefix##_aa(void); Z80_INLINE void prefix##_ab(void); \
378 Z80_INLINE void prefix##_ac(void); Z80_INLINE void prefix##_ad(void); Z80_INLINE void prefix##_ae(void); Z80_INLINE void prefix##_af(void); \
379 Z80_INLINE void prefix##_b0(void); Z80_INLINE void prefix##_b1(void); Z80_INLINE void prefix##_b2(void); Z80_INLINE void prefix##_b3(void); \
380 Z80_INLINE void prefix##_b4(void); Z80_INLINE void prefix##_b5(void); Z80_INLINE void prefix##_b6(void); Z80_INLINE void prefix##_b7(void); \
381 Z80_INLINE void prefix##_b8(void); Z80_INLINE void prefix##_b9(void); Z80_INLINE void prefix##_ba(void); Z80_INLINE void prefix##_bb(void); \
382 Z80_INLINE void prefix##_bc(void); Z80_INLINE void prefix##_bd(void); Z80_INLINE void prefix##_be(void); Z80_INLINE void prefix##_bf(void); \
383 Z80_INLINE void prefix##_c0(void); Z80_INLINE void prefix##_c1(void); Z80_INLINE void prefix##_c2(void); Z80_INLINE void prefix##_c3(void); \
384 Z80_INLINE void prefix##_c4(void); Z80_INLINE void prefix##_c5(void); Z80_INLINE void prefix##_c6(void); Z80_INLINE void prefix##_c7(void); \
385 Z80_INLINE void prefix##_c8(void); Z80_INLINE void prefix##_c9(void); Z80_INLINE void prefix##_ca(void); Z80_INLINE void prefix##_cb(void); \
386 Z80_INLINE void prefix##_cc(void); Z80_INLINE void prefix##_cd(void); Z80_INLINE void prefix##_ce(void); Z80_INLINE void prefix##_cf(void); \
387 Z80_INLINE void prefix##_d0(void); Z80_INLINE void prefix##_d1(void); Z80_INLINE void prefix##_d2(void); Z80_INLINE void prefix##_d3(void); \
388 Z80_INLINE void prefix##_d4(void); Z80_INLINE void prefix##_d5(void); Z80_INLINE void prefix##_d6(void); Z80_INLINE void prefix##_d7(void); \
389 Z80_INLINE void prefix##_d8(void); Z80_INLINE void prefix##_d9(void); Z80_INLINE void prefix##_da(void); Z80_INLINE void prefix##_db(void); \
390 Z80_INLINE void prefix##_dc(void); Z80_INLINE void prefix##_dd(void); Z80_INLINE void prefix##_de(void); Z80_INLINE void prefix##_df(void); \
391 Z80_INLINE void prefix##_e0(void); Z80_INLINE void prefix##_e1(void); Z80_INLINE void prefix##_e2(void); Z80_INLINE void prefix##_e3(void); \
392 Z80_INLINE void prefix##_e4(void); Z80_INLINE void prefix##_e5(void); Z80_INLINE void prefix##_e6(void); Z80_INLINE void prefix##_e7(void); \
393 Z80_INLINE void prefix##_e8(void); Z80_INLINE void prefix##_e9(void); Z80_INLINE void prefix##_ea(void); Z80_INLINE void prefix##_eb(void); \
394 Z80_INLINE void prefix##_ec(void); Z80_INLINE void prefix##_ed(void); Z80_INLINE void prefix##_ee(void); Z80_INLINE void prefix##_ef(void); \
395 Z80_INLINE void prefix##_f0(void); Z80_INLINE void prefix##_f1(void); Z80_INLINE void prefix##_f2(void); Z80_INLINE void prefix##_f3(void); \
396 Z80_INLINE void prefix##_f4(void); Z80_INLINE void prefix##_f5(void); Z80_INLINE void prefix##_f6(void); Z80_INLINE void prefix##_f7(void); \
397 Z80_INLINE void prefix##_f8(void); Z80_INLINE void prefix##_f9(void); Z80_INLINE void prefix##_fa(void); Z80_INLINE void prefix##_fb(void); \
398 Z80_INLINE void prefix##_fc(void); Z80_INLINE void prefix##_fd(void); Z80_INLINE void prefix##_fe(void); Z80_INLINE void prefix##_ff(void); \
399 static const funcptr tablename[0x100] = { \
400 prefix##_00,prefix##_01,prefix##_02,prefix##_03,prefix##_04,prefix##_05,prefix##_06,prefix##_07, \
401 prefix##_08,prefix##_09,prefix##_0a,prefix##_0b,prefix##_0c,prefix##_0d,prefix##_0e,prefix##_0f, \
402 prefix##_10,prefix##_11,prefix##_12,prefix##_13,prefix##_14,prefix##_15,prefix##_16,prefix##_17, \
403 prefix##_18,prefix##_19,prefix##_1a,prefix##_1b,prefix##_1c,prefix##_1d,prefix##_1e,prefix##_1f, \
404 prefix##_20,prefix##_21,prefix##_22,prefix##_23,prefix##_24,prefix##_25,prefix##_26,prefix##_27, \
405 prefix##_28,prefix##_29,prefix##_2a,prefix##_2b,prefix##_2c,prefix##_2d,prefix##_2e,prefix##_2f, \
406 prefix##_30,prefix##_31,prefix##_32,prefix##_33,prefix##_34,prefix##_35,prefix##_36,prefix##_37, \
407 prefix##_38,prefix##_39,prefix##_3a,prefix##_3b,prefix##_3c,prefix##_3d,prefix##_3e,prefix##_3f, \
408 prefix##_40,prefix##_41,prefix##_42,prefix##_43,prefix##_44,prefix##_45,prefix##_46,prefix##_47, \
409 prefix##_48,prefix##_49,prefix##_4a,prefix##_4b,prefix##_4c,prefix##_4d,prefix##_4e,prefix##_4f, \
410 prefix##_50,prefix##_51,prefix##_52,prefix##_53,prefix##_54,prefix##_55,prefix##_56,prefix##_57, \
411 prefix##_58,prefix##_59,prefix##_5a,prefix##_5b,prefix##_5c,prefix##_5d,prefix##_5e,prefix##_5f, \
412 prefix##_60,prefix##_61,prefix##_62,prefix##_63,prefix##_64,prefix##_65,prefix##_66,prefix##_67, \
413 prefix##_68,prefix##_69,prefix##_6a,prefix##_6b,prefix##_6c,prefix##_6d,prefix##_6e,prefix##_6f, \
414 prefix##_70,prefix##_71,prefix##_72,prefix##_73,prefix##_74,prefix##_75,prefix##_76,prefix##_77, \
415 prefix##_78,prefix##_79,prefix##_7a,prefix##_7b,prefix##_7c,prefix##_7d,prefix##_7e,prefix##_7f, \
416 prefix##_80,prefix##_81,prefix##_82,prefix##_83,prefix##_84,prefix##_85,prefix##_86,prefix##_87, \
417 prefix##_88,prefix##_89,prefix##_8a,prefix##_8b,prefix##_8c,prefix##_8d,prefix##_8e,prefix##_8f, \
418 prefix##_90,prefix##_91,prefix##_92,prefix##_93,prefix##_94,prefix##_95,prefix##_96,prefix##_97, \
419 prefix##_98,prefix##_99,prefix##_9a,prefix##_9b,prefix##_9c,prefix##_9d,prefix##_9e,prefix##_9f, \
420 prefix##_a0,prefix##_a1,prefix##_a2,prefix##_a3,prefix##_a4,prefix##_a5,prefix##_a6,prefix##_a7, \
421 prefix##_a8,prefix##_a9,prefix##_aa,prefix##_ab,prefix##_ac,prefix##_ad,prefix##_ae,prefix##_af, \
422 prefix##_b0,prefix##_b1,prefix##_b2,prefix##_b3,prefix##_b4,prefix##_b5,prefix##_b6,prefix##_b7, \
423 prefix##_b8,prefix##_b9,prefix##_ba,prefix##_bb,prefix##_bc,prefix##_bd,prefix##_be,prefix##_bf, \
424 prefix##_c0,prefix##_c1,prefix##_c2,prefix##_c3,prefix##_c4,prefix##_c5,prefix##_c6,prefix##_c7, \
425 prefix##_c8,prefix##_c9,prefix##_ca,prefix##_cb,prefix##_cc,prefix##_cd,prefix##_ce,prefix##_cf, \
426 prefix##_d0,prefix##_d1,prefix##_d2,prefix##_d3,prefix##_d4,prefix##_d5,prefix##_d6,prefix##_d7, \
427 prefix##_d8,prefix##_d9,prefix##_da,prefix##_db,prefix##_dc,prefix##_dd,prefix##_de,prefix##_df, \
428 prefix##_e0,prefix##_e1,prefix##_e2,prefix##_e3,prefix##_e4,prefix##_e5,prefix##_e6,prefix##_e7, \
429 prefix##_e8,prefix##_e9,prefix##_ea,prefix##_eb,prefix##_ec,prefix##_ed,prefix##_ee,prefix##_ef, \
430 prefix##_f0,prefix##_f1,prefix##_f2,prefix##_f3,prefix##_f4,prefix##_f5,prefix##_f6,prefix##_f7, \
431 prefix##_f8,prefix##_f9,prefix##_fa,prefix##_fb,prefix##_fc,prefix##_fd,prefix##_fe,prefix##_ff \
432 }
433
434 PROTOTYPES(Z80op,op);
435 PROTOTYPES(Z80cb,cb);
436 PROTOTYPES(Z80dd,dd);
437 PROTOTYPES(Z80ed,ed);
438 PROTOTYPES(Z80fd,fd);
439 PROTOTYPES(Z80xycb,xycb);
440
441 /****************************************************************************/
442 /* Burn an odd amount of cycles, that is instructions taking something */
443 /* different from 4 T-states per opcode (and R increment) */
444 /****************************************************************************/
BURNODD(int cycles,int opcodes,int cyclesum)445 Z80_INLINE void BURNODD(int cycles, int opcodes, int cyclesum)
446 {
447 if( cycles > 0 )
448 {
449 R += (cycles / cyclesum) * opcodes;
450 z80_ICount -= (cycles / cyclesum) * cyclesum;
451 }
452 }
453
454 /***************************************************************
455 * define an opcode function
456 ***************************************************************/
457 #define OP(prefix,opcode) Z80_INLINE void prefix##_##opcode(void)
458
459 /***************************************************************
460 * adjust cycle count by n T-states
461 ***************************************************************/
462 #define CC(prefix,opcode) z80_ICount -= cc[Z80_TABLE_##prefix][opcode]
463
464 /***************************************************************
465 * execute an opcode
466 ***************************************************************/
467 #define EXEC(prefix,opcode) \
468 { \
469 unsigned op = opcode; \
470 CC(prefix,op); \
471 (*Z80##prefix[op])(); \
472 }
473
474 #if BIG_SWITCH
475 #define EXEC_INLINE(prefix,opcode) \
476 { \
477 unsigned op = opcode; \
478 CC(prefix,op); \
479 switch(op) \
480 { \
481 case 0x00:prefix##_##00();break; case 0x01:prefix##_##01();break; case 0x02:prefix##_##02();break; case 0x03:prefix##_##03();break; \
482 case 0x04:prefix##_##04();break; case 0x05:prefix##_##05();break; case 0x06:prefix##_##06();break; case 0x07:prefix##_##07();break; \
483 case 0x08:prefix##_##08();break; case 0x09:prefix##_##09();break; case 0x0a:prefix##_##0a();break; case 0x0b:prefix##_##0b();break; \
484 case 0x0c:prefix##_##0c();break; case 0x0d:prefix##_##0d();break; case 0x0e:prefix##_##0e();break; case 0x0f:prefix##_##0f();break; \
485 case 0x10:prefix##_##10();break; case 0x11:prefix##_##11();break; case 0x12:prefix##_##12();break; case 0x13:prefix##_##13();break; \
486 case 0x14:prefix##_##14();break; case 0x15:prefix##_##15();break; case 0x16:prefix##_##16();break; case 0x17:prefix##_##17();break; \
487 case 0x18:prefix##_##18();break; case 0x19:prefix##_##19();break; case 0x1a:prefix##_##1a();break; case 0x1b:prefix##_##1b();break; \
488 case 0x1c:prefix##_##1c();break; case 0x1d:prefix##_##1d();break; case 0x1e:prefix##_##1e();break; case 0x1f:prefix##_##1f();break; \
489 case 0x20:prefix##_##20();break; case 0x21:prefix##_##21();break; case 0x22:prefix##_##22();break; case 0x23:prefix##_##23();break; \
490 case 0x24:prefix##_##24();break; case 0x25:prefix##_##25();break; case 0x26:prefix##_##26();break; case 0x27:prefix##_##27();break; \
491 case 0x28:prefix##_##28();break; case 0x29:prefix##_##29();break; case 0x2a:prefix##_##2a();break; case 0x2b:prefix##_##2b();break; \
492 case 0x2c:prefix##_##2c();break; case 0x2d:prefix##_##2d();break; case 0x2e:prefix##_##2e();break; case 0x2f:prefix##_##2f();break; \
493 case 0x30:prefix##_##30();break; case 0x31:prefix##_##31();break; case 0x32:prefix##_##32();break; case 0x33:prefix##_##33();break; \
494 case 0x34:prefix##_##34();break; case 0x35:prefix##_##35();break; case 0x36:prefix##_##36();break; case 0x37:prefix##_##37();break; \
495 case 0x38:prefix##_##38();break; case 0x39:prefix##_##39();break; case 0x3a:prefix##_##3a();break; case 0x3b:prefix##_##3b();break; \
496 case 0x3c:prefix##_##3c();break; case 0x3d:prefix##_##3d();break; case 0x3e:prefix##_##3e();break; case 0x3f:prefix##_##3f();break; \
497 case 0x40:prefix##_##40();break; case 0x41:prefix##_##41();break; case 0x42:prefix##_##42();break; case 0x43:prefix##_##43();break; \
498 case 0x44:prefix##_##44();break; case 0x45:prefix##_##45();break; case 0x46:prefix##_##46();break; case 0x47:prefix##_##47();break; \
499 case 0x48:prefix##_##48();break; case 0x49:prefix##_##49();break; case 0x4a:prefix##_##4a();break; case 0x4b:prefix##_##4b();break; \
500 case 0x4c:prefix##_##4c();break; case 0x4d:prefix##_##4d();break; case 0x4e:prefix##_##4e();break; case 0x4f:prefix##_##4f();break; \
501 case 0x50:prefix##_##50();break; case 0x51:prefix##_##51();break; case 0x52:prefix##_##52();break; case 0x53:prefix##_##53();break; \
502 case 0x54:prefix##_##54();break; case 0x55:prefix##_##55();break; case 0x56:prefix##_##56();break; case 0x57:prefix##_##57();break; \
503 case 0x58:prefix##_##58();break; case 0x59:prefix##_##59();break; case 0x5a:prefix##_##5a();break; case 0x5b:prefix##_##5b();break; \
504 case 0x5c:prefix##_##5c();break; case 0x5d:prefix##_##5d();break; case 0x5e:prefix##_##5e();break; case 0x5f:prefix##_##5f();break; \
505 case 0x60:prefix##_##60();break; case 0x61:prefix##_##61();break; case 0x62:prefix##_##62();break; case 0x63:prefix##_##63();break; \
506 case 0x64:prefix##_##64();break; case 0x65:prefix##_##65();break; case 0x66:prefix##_##66();break; case 0x67:prefix##_##67();break; \
507 case 0x68:prefix##_##68();break; case 0x69:prefix##_##69();break; case 0x6a:prefix##_##6a();break; case 0x6b:prefix##_##6b();break; \
508 case 0x6c:prefix##_##6c();break; case 0x6d:prefix##_##6d();break; case 0x6e:prefix##_##6e();break; case 0x6f:prefix##_##6f();break; \
509 case 0x70:prefix##_##70();break; case 0x71:prefix##_##71();break; case 0x72:prefix##_##72();break; case 0x73:prefix##_##73();break; \
510 case 0x74:prefix##_##74();break; case 0x75:prefix##_##75();break; case 0x76:prefix##_##76();break; case 0x77:prefix##_##77();break; \
511 case 0x78:prefix##_##78();break; case 0x79:prefix##_##79();break; case 0x7a:prefix##_##7a();break; case 0x7b:prefix##_##7b();break; \
512 case 0x7c:prefix##_##7c();break; case 0x7d:prefix##_##7d();break; case 0x7e:prefix##_##7e();break; case 0x7f:prefix##_##7f();break; \
513 case 0x80:prefix##_##80();break; case 0x81:prefix##_##81();break; case 0x82:prefix##_##82();break; case 0x83:prefix##_##83();break; \
514 case 0x84:prefix##_##84();break; case 0x85:prefix##_##85();break; case 0x86:prefix##_##86();break; case 0x87:prefix##_##87();break; \
515 case 0x88:prefix##_##88();break; case 0x89:prefix##_##89();break; case 0x8a:prefix##_##8a();break; case 0x8b:prefix##_##8b();break; \
516 case 0x8c:prefix##_##8c();break; case 0x8d:prefix##_##8d();break; case 0x8e:prefix##_##8e();break; case 0x8f:prefix##_##8f();break; \
517 case 0x90:prefix##_##90();break; case 0x91:prefix##_##91();break; case 0x92:prefix##_##92();break; case 0x93:prefix##_##93();break; \
518 case 0x94:prefix##_##94();break; case 0x95:prefix##_##95();break; case 0x96:prefix##_##96();break; case 0x97:prefix##_##97();break; \
519 case 0x98:prefix##_##98();break; case 0x99:prefix##_##99();break; case 0x9a:prefix##_##9a();break; case 0x9b:prefix##_##9b();break; \
520 case 0x9c:prefix##_##9c();break; case 0x9d:prefix##_##9d();break; case 0x9e:prefix##_##9e();break; case 0x9f:prefix##_##9f();break; \
521 case 0xa0:prefix##_##a0();break; case 0xa1:prefix##_##a1();break; case 0xa2:prefix##_##a2();break; case 0xa3:prefix##_##a3();break; \
522 case 0xa4:prefix##_##a4();break; case 0xa5:prefix##_##a5();break; case 0xa6:prefix##_##a6();break; case 0xa7:prefix##_##a7();break; \
523 case 0xa8:prefix##_##a8();break; case 0xa9:prefix##_##a9();break; case 0xaa:prefix##_##aa();break; case 0xab:prefix##_##ab();break; \
524 case 0xac:prefix##_##ac();break; case 0xad:prefix##_##ad();break; case 0xae:prefix##_##ae();break; case 0xaf:prefix##_##af();break; \
525 case 0xb0:prefix##_##b0();break; case 0xb1:prefix##_##b1();break; case 0xb2:prefix##_##b2();break; case 0xb3:prefix##_##b3();break; \
526 case 0xb4:prefix##_##b4();break; case 0xb5:prefix##_##b5();break; case 0xb6:prefix##_##b6();break; case 0xb7:prefix##_##b7();break; \
527 case 0xb8:prefix##_##b8();break; case 0xb9:prefix##_##b9();break; case 0xba:prefix##_##ba();break; case 0xbb:prefix##_##bb();break; \
528 case 0xbc:prefix##_##bc();break; case 0xbd:prefix##_##bd();break; case 0xbe:prefix##_##be();break; case 0xbf:prefix##_##bf();break; \
529 case 0xc0:prefix##_##c0();break; case 0xc1:prefix##_##c1();break; case 0xc2:prefix##_##c2();break; case 0xc3:prefix##_##c3();break; \
530 case 0xc4:prefix##_##c4();break; case 0xc5:prefix##_##c5();break; case 0xc6:prefix##_##c6();break; case 0xc7:prefix##_##c7();break; \
531 case 0xc8:prefix##_##c8();break; case 0xc9:prefix##_##c9();break; case 0xca:prefix##_##ca();break; case 0xcb:prefix##_##cb();break; \
532 case 0xcc:prefix##_##cc();break; case 0xcd:prefix##_##cd();break; case 0xce:prefix##_##ce();break; case 0xcf:prefix##_##cf();break; \
533 case 0xd0:prefix##_##d0();break; case 0xd1:prefix##_##d1();break; case 0xd2:prefix##_##d2();break; case 0xd3:prefix##_##d3();break; \
534 case 0xd4:prefix##_##d4();break; case 0xd5:prefix##_##d5();break; case 0xd6:prefix##_##d6();break; case 0xd7:prefix##_##d7();break; \
535 case 0xd8:prefix##_##d8();break; case 0xd9:prefix##_##d9();break; case 0xda:prefix##_##da();break; case 0xdb:prefix##_##db();break; \
536 case 0xdc:prefix##_##dc();break; case 0xdd:prefix##_##dd();break; case 0xde:prefix##_##de();break; case 0xdf:prefix##_##df();break; \
537 case 0xe0:prefix##_##e0();break; case 0xe1:prefix##_##e1();break; case 0xe2:prefix##_##e2();break; case 0xe3:prefix##_##e3();break; \
538 case 0xe4:prefix##_##e4();break; case 0xe5:prefix##_##e5();break; case 0xe6:prefix##_##e6();break; case 0xe7:prefix##_##e7();break; \
539 case 0xe8:prefix##_##e8();break; case 0xe9:prefix##_##e9();break; case 0xea:prefix##_##ea();break; case 0xeb:prefix##_##eb();break; \
540 case 0xec:prefix##_##ec();break; case 0xed:prefix##_##ed();break; case 0xee:prefix##_##ee();break; case 0xef:prefix##_##ef();break; \
541 case 0xf0:prefix##_##f0();break; case 0xf1:prefix##_##f1();break; case 0xf2:prefix##_##f2();break; case 0xf3:prefix##_##f3();break; \
542 case 0xf4:prefix##_##f4();break; case 0xf5:prefix##_##f5();break; case 0xf6:prefix##_##f6();break; case 0xf7:prefix##_##f7();break; \
543 case 0xf8:prefix##_##f8();break; case 0xf9:prefix##_##f9();break; case 0xfa:prefix##_##fa();break; case 0xfb:prefix##_##fb();break; \
544 case 0xfc:prefix##_##fc();break; case 0xfd:prefix##_##fd();break; case 0xfe:prefix##_##fe();break; case 0xff:prefix##_##ff();break; \
545 } \
546 }
547 #else
548 #define EXEC_Z80_INLINE EXEC
549 #endif
550
551
552 /***************************************************************
553 * Enter HALT state; write 1 to fake port on first execution
554 ***************************************************************/
555 #define ENTER_HALT { \
556 PC--; \
557 HALT = 1; \
558 if( Z80.irq_state == Z80_CLEAR_LINE ) \
559 Z80Burn( z80_ICount ); \
560 }
561
562 /***************************************************************
563 * Leave HALT state; write 0 to fake port
564 ***************************************************************/
565 #define LEAVE_HALT { \
566 if( HALT ) \
567 { \
568 HALT = 0; \
569 PC++; \
570 } \
571 }
572
573 /***************************************************************
574 * Input a byte from given I/O port
575 ***************************************************************/
576 #define IN(port) ((UINT8)Z80IORead(port))
577
578 /***************************************************************
579 * Output a byte to given I/O port
580 ***************************************************************/
581 #define OUT(port,value) Z80IOWrite(port,value)
582
583 /***************************************************************
584 * Read a byte from given memory location
585 ***************************************************************/
586 #define RM(addr) (UINT8)Z80ProgramRead(addr)
587
588 /***************************************************************
589 * Read a word from given memory location
590 ***************************************************************/
RM16(UINT32 addr,Z80_PAIR * r)591 Z80_INLINE void RM16( UINT32 addr, Z80_PAIR *r )
592 {
593 r->b.l = RM(addr);
594 r->b.h = RM((addr+1)&0xffff);
595 }
596
597 /***************************************************************
598 * Write a byte to given memory location
599 ***************************************************************/
600 #define WM(addr,value) Z80ProgramWrite(addr,value)
601
602 #define cpu_readop(n) Z80CPUReadOp(n)
603 #define cpu_readop_arg(n) Z80CPUReadOpArg(n)
604
605 /***************************************************************
606 * Write a word to given memory location
607 ***************************************************************/
WM16(UINT32 addr,Z80_PAIR * r)608 Z80_INLINE void WM16( UINT32 addr, Z80_PAIR *r )
609 {
610 WM(addr,r->b.l);
611 WM((addr+1)&0xffff,r->b.h);
612 }
613
614 /***************************************************************
615 * ROP() is identical to RM() except it is used for
616 * reading opcodes. In case of system with memory mapped I/O,
617 * this function can be used to greatly speed up emulation
618 ***************************************************************/
ROP(void)619 Z80_INLINE UINT8 ROP(void)
620 {
621 unsigned pc = PCD;
622 PC++;
623 return cpu_readop(pc);
624 }
625
626 /****************************************************************
627 * ARG() is identical to ROP() except it is used
628 * for reading opcode arguments. This difference can be used to
629 * support systems that use different encoding mechanisms for
630 * opcodes and opcode arguments
631 ***************************************************************/
ARG(void)632 Z80_INLINE UINT8 ARG(void)
633 {
634 unsigned pc = PCD;
635 PC++;
636 return cpu_readop_arg(pc);
637 }
638
ARG16(void)639 Z80_INLINE UINT32 ARG16(void)
640 {
641 unsigned pc = PCD;
642 PC += 2;
643 return cpu_readop_arg(pc) | (cpu_readop_arg((pc+1)&0xffff) << 8);
644 }
645
646 /***************************************************************
647 * Calculate the effective address EA of an opcode using
648 * IX+offset resp. IY+offset addressing.
649 ***************************************************************/
650 #define EAX EA = (UINT32)(UINT16)(IX + (INT8)ARG()); WZ = EA;
651 #define EAY EA = (UINT32)(UINT16)(IY + (INT8)ARG()); WZ = EA;
652
653 /***************************************************************
654 * POP
655 ***************************************************************/
656 #define POP(DR) do { RM16( SPD, &Z80.DR ); SP += 2; } while (0)
657
658 /***************************************************************
659 * PUSH
660 ***************************************************************/
661 #define PUSH(SR) do { SP -= 2; WM16( SPD, &Z80.SR ); } while (0)
662
663 /***************************************************************
664 * JP
665 ***************************************************************/
666 #if BUSY_LOOP_HACKS
667 #define JP { \
668 unsigned oldpc = PCD-1; \
669 PCD = ARG16(); \
670 WZ = PCD; \
671 change_pc(PCD); \
672 /* speed up busy loop */ \
673 if( PCD == oldpc ) \
674 { \
675 if( Z80.irq_state == Z80_CLEAR_LINE ) \
676 BURNODD( z80_ICount, 1, cc[Z80_TABLE_op][0xc3] ); \
677 } \
678 else \
679 { \
680 UINT8 op = cpu_readop(PCD); \
681 if( PCD == oldpc-1 ) \
682 { \
683 /* NOP - JP $-1 or EI - JP $-1 */ \
684 if ( op == 0x00 || op == 0xfb ) \
685 { \
686 if( Z80.irq_state == Z80_CLEAR_LINE ) \
687 BURNODD( z80_ICount-cc[Z80_TABLE_op][0x00], \
688 2, cc[Z80_TABLE_op][0x00]+cc[Z80_TABLE_op][0xc3]); \
689 } \
690 } \
691 else \
692 /* LD SP,#xxxx - JP $-3 (Galaga) */ \
693 if( PCD == oldpc-3 && op == 0x31 ) \
694 { \
695 if( Z80.irq_state == Z80_CLEAR_LINE ) \
696 BURNODD( z80_ICount-cc[Z80_TABLE_op][0x31], \
697 2, cc[Z80_TABLE_op][0x31]+cc[Z80_TABLE_op][0xc3]); \
698 } \
699 } \
700 }
701 #else
702 #define JP { \
703 PCD = ARG16(); \
704 WZ = PCD; \
705 change_pc(PCD); \
706 }
707 #endif
708
709 /***************************************************************
710 * JP_COND
711 ***************************************************************/
712
713 #define JP_COND(cond) \
714 if( cond ) \
715 { \
716 PCD = ARG16(); \
717 WZ = PCD; \
718 change_pc(PCD); \
719 } \
720 else \
721 { \
722 PC += 2; \
723 WZ = PCD; \
724 }
725
726 /***************************************************************
727 * JR
728 ***************************************************************/
729 #define JR() \
730 { \
731 unsigned oldpc = PCD-1; \
732 INT8 arg = (INT8)ARG(); /* ARG() also increments PC */ \
733 PC += arg; /* so don't do PC += ARG() */ \
734 WZ = PC; \
735 change_pc(PCD); \
736 /* speed up busy loop */ \
737 if( PCD == oldpc ) \
738 { \
739 if( Z80.irq_state == Z80_CLEAR_LINE ) \
740 BURNODD( z80_ICount, 1, cc[Z80_TABLE_op][0x18] ); \
741 } \
742 else \
743 { \
744 UINT8 op = cpu_readop(PCD); \
745 if( PCD == oldpc-1 ) \
746 { \
747 /* NOP - JR $-1 or EI - JR $-1 */ \
748 if ( op == 0x00 || op == 0xfb ) \
749 { \
750 if( Z80.irq_state == Z80_CLEAR_LINE ) \
751 BURNODD( z80_ICount-cc[Z80_TABLE_op][0x00], \
752 2, cc[Z80_TABLE_op][0x00]+cc[Z80_TABLE_op][0x18]); \
753 } \
754 } \
755 else \
756 /* LD SP,#xxxx - JR $-3 */ \
757 if( PCD == oldpc-3 && op == 0x31 ) \
758 { \
759 if( Z80.irq_state == Z80_CLEAR_LINE ) \
760 BURNODD( z80_ICount-cc[Z80_TABLE_op][0x31], \
761 2, cc[Z80_TABLE_op][0x31]+cc[Z80_TABLE_op][0x18]); \
762 } \
763 } \
764 }
765
766 /***************************************************************
767 * JR_COND
768 ***************************************************************/
769 #define JR_COND(cond,opcode) \
770 if( cond ) \
771 { \
772 INT8 arg = (INT8)ARG(); /* ARG() also increments PC */ \
773 PC += arg; /* so don't do PC += ARG() */ \
774 WZ = PC; \
775 CC(ex,opcode); \
776 change_pc(PCD); \
777 } \
778 else PC++; \
779
780 /***************************************************************
781 * CALL
782 ***************************************************************/
783 #define CALL() \
784 EA = ARG16(); \
785 WZ = EA; \
786 PUSH( pc ); \
787 PCD = EA; \
788 change_pc(PCD)
789
790 /***************************************************************
791 * CALL_COND
792 ***************************************************************/
793 #define CALL_COND(cond,opcode) \
794 if( cond ) \
795 { \
796 EA = ARG16(); \
797 WZ = EA; \
798 PUSH( pc ); \
799 PCD = EA; \
800 CC(ex,opcode); \
801 change_pc(PCD); \
802 } \
803 else \
804 { \
805 WZ = ARG16(); /* implicit call PC+=2; */ \
806 }
807
808 /***************************************************************
809 * RET_COND
810 ***************************************************************/
811 #define RET_COND(cond,opcode) \
812 if( cond ) \
813 { \
814 POP( pc ); \
815 WZ = PC; \
816 change_pc(PCD); \
817 CC(ex,opcode); \
818 }
819
820 /***************************************************************
821 * RETN
822 ***************************************************************/
823 #define RETN { \
824 LOG(("Z80 #%d RETN IFF1:%d IFF2:%d\n", cpu_getactivecpu(), IFF1, IFF2)); \
825 POP( pc ); \
826 WZ = PC; \
827 change_pc(PCD); \
828 IFF1 = IFF2; \
829 }
830
831 /***************************************************************
832 * RETI
833 ***************************************************************/
834 #define RETI { \
835 POP( pc ); \
836 WZ = PC; \
837 change_pc(PCD); \
838 /* according to http://www.msxnet.org/tech/z80-documented.pdf */\
839 IFF1 = IFF2; \
840 if (Z80.daisy) \
841 z80daisy_call_reti_device(Z80.daisy); \
842 }
843
844 /***************************************************************
845 * LD R,A
846 ***************************************************************/
847 #define LD_R_A { \
848 R = A; \
849 R2 = A & 0x80; /* keep bit 7 of R */ \
850 }
851
852 /***************************************************************
853 * LD A,R
854 ***************************************************************/
855 #define LD_A_R { \
856 A = (R & 0x7f) | R2; \
857 F = (F & CF) | SZ[A] | ( IFF2 << 2 ); \
858 }
859
860 /***************************************************************
861 * LD I,A
862 ***************************************************************/
863 #define LD_I_A { \
864 I = A; \
865 }
866
867 /***************************************************************
868 * LD A,I
869 ***************************************************************/
870 #define LD_A_I { \
871 A = I; \
872 F = (F & CF) | SZ[A] | ( IFF2 << 2 ); \
873 }
874
875 /***************************************************************
876 * RST
877 ***************************************************************/
878 #define RST(addr) \
879 PUSH( pc ); \
880 PCD = addr; \
881 WZ = PC; \
882 change_pc(PCD)
883
884 /***************************************************************
885 * INC r8
886 ***************************************************************/
INC(UINT8 value)887 Z80_INLINE UINT8 INC(UINT8 value)
888 {
889 UINT8 res = value + 1;
890 F = (F & CF) | SZHV_inc[res];
891 return (UINT8)res;
892 }
893
894 /***************************************************************
895 * DEC r8
896 ***************************************************************/
DEC(UINT8 value)897 Z80_INLINE UINT8 DEC(UINT8 value)
898 {
899 UINT8 res = value - 1;
900 F = (F & CF) | SZHV_dec[res];
901 return res;
902 }
903
904 /***************************************************************
905 * RLCA
906 ***************************************************************/
907 #define RLCA \
908 A = (A << 1) | (A >> 7); \
909 F = (F & (SF | ZF | PF)) | (A & (YF | XF | CF))
910
911 /***************************************************************
912 * RRCA
913 ***************************************************************/
914 #define RRCA \
915 F = (F & (SF | ZF | PF)) | (A & CF); \
916 A = (A >> 1) | (A << 7); \
917 F |= (A & (YF | XF) )
918
919 /***************************************************************
920 * RLA
921 ***************************************************************/
922 #define RLA { \
923 UINT8 res = (A << 1) | (F & CF); \
924 UINT8 c = (A & 0x80) ? CF : 0; \
925 F = (F & (SF | ZF | PF)) | c | (res & (YF | XF)); \
926 A = res; \
927 }
928
929 /***************************************************************
930 * RRA
931 ***************************************************************/
932 #define RRA { \
933 UINT8 res = (A >> 1) | (F << 7); \
934 UINT8 c = (A & 0x01) ? CF : 0; \
935 F = (F & (SF | ZF | PF)) | c | (res & (YF | XF)); \
936 A = res; \
937 }
938
939 /***************************************************************
940 * RRD
941 ***************************************************************/
942 #define RRD { \
943 UINT8 n = RM(HL); \
944 WZ = HL+1; \
945 WM( HL, (n >> 4) | (A << 4) ); \
946 A = (A & 0xf0) | (n & 0x0f); \
947 F = (F & CF) | SZP[A]; \
948 }
949
950 /***************************************************************
951 * RLD
952 ***************************************************************/
953 #define RLD { \
954 UINT8 n = RM(HL); \
955 WZ = HL+1; \
956 WM( HL, (n << 4) | (A & 0x0f) ); \
957 A = (A & 0xf0) | (n >> 4); \
958 F = (F & CF) | SZP[A]; \
959 }
960
961 /***************************************************************
962 * ADD A,n
963 ***************************************************************/
964 #if BIG_FLAGS_ARRAY
965 #define ADD(value) \
966 { \
967 UINT32 ah = AFD & 0xff00; \
968 UINT32 res = (UINT8)((ah >> 8) + value); \
969 F = SZHVC_add[ah | res]; \
970 A = res; \
971 }
972 #else
973 #define ADD(value) \
974 { \
975 unsigned val = value; \
976 unsigned res = A + val; \
977 F = SZ[(UINT8)res] | ((res >> 8) & CF) | \
978 ((A ^ res ^ val) & HF) | \
979 (((val ^ A ^ 0x80) & (val ^ res) & 0x80) >> 5); \
980 A = (UINT8)res; \
981 }
982 #endif
983
984 /***************************************************************
985 * ADC A,n
986 ***************************************************************/
987 #if BIG_FLAGS_ARRAY
988 #define ADC(value) \
989 { \
990 UINT32 ah = AFD & 0xff00, c = AFD & 1; \
991 UINT32 res = (UINT8)((ah >> 8) + value + c); \
992 F = SZHVC_add[(c << 16) | ah | res]; \
993 A = res; \
994 }
995 #else
996 #define ADC(value) \
997 { \
998 unsigned val = value; \
999 unsigned res = A + val + (F & CF); \
1000 F = SZ[res & 0xff] | ((res >> 8) & CF) | \
1001 ((A ^ res ^ val) & HF) | \
1002 (((val ^ A ^ 0x80) & (val ^ res) & 0x80) >> 5); \
1003 A = res; \
1004 }
1005 #endif
1006
1007 /***************************************************************
1008 * SUB n
1009 ***************************************************************/
1010 #if BIG_FLAGS_ARRAY
1011 #define SUB(value) \
1012 { \
1013 UINT32 ah = AFD & 0xff00; \
1014 UINT32 res = (UINT8)((ah >> 8) - value); \
1015 F = SZHVC_sub[ah | res]; \
1016 A = res; \
1017 }
1018 #else
1019 #define SUB(value) \
1020 { \
1021 unsigned val = value; \
1022 unsigned res = A - val; \
1023 F = SZ[res & 0xff] | ((res >> 8) & CF) | NF | \
1024 ((A ^ res ^ val) & HF) | \
1025 (((val ^ A) & (A ^ res) & 0x80) >> 5); \
1026 A = res; \
1027 }
1028 #endif
1029
1030 /***************************************************************
1031 * SBC A,n
1032 ***************************************************************/
1033 #if BIG_FLAGS_ARRAY
1034 #define SBC(value) \
1035 { \
1036 UINT32 ah = AFD & 0xff00, c = AFD & 1; \
1037 UINT32 res = (UINT8)((ah >> 8) - value - c); \
1038 F = SZHVC_sub[(c<<16) | ah | res]; \
1039 A = res; \
1040 }
1041 #else
1042 #define SBC(value) \
1043 { \
1044 unsigned val = value; \
1045 unsigned res = A - val - (F & CF); \
1046 F = SZ[res & 0xff] | ((res >> 8) & CF) | NF | \
1047 ((A ^ res ^ val) & HF) | \
1048 (((val ^ A) & (A ^ res) & 0x80) >> 5); \
1049 A = res; \
1050 }
1051 #endif
1052
1053 /***************************************************************
1054 * NEG
1055 ***************************************************************/
1056 #define NEG { \
1057 UINT8 value = A; \
1058 A = 0; \
1059 SUB(value); \
1060 }
1061
1062 /***************************************************************
1063 * DAA
1064 ***************************************************************/
1065 #define DAA { \
1066 UINT8 a = A; \
1067 if (F & NF) { \
1068 if ((F&HF) | ((A&0xf)>9)) a-=6; \
1069 if ((F&CF) | (A>0x99)) a-=0x60; \
1070 } \
1071 else { \
1072 if ((F&HF) | ((A&0xf)>9)) a+=6; \
1073 if ((F&CF) | (A>0x99)) a+=0x60; \
1074 } \
1075 \
1076 F = (F&(CF|NF)) | (A>0x99) | ((A^a)&HF) | SZP[a]; \
1077 A = a; \
1078 }
1079
1080 /***************************************************************
1081 * AND n
1082 ***************************************************************/
1083 #define AND(value) \
1084 A &= value; \
1085 F = SZP[A] | HF
1086
1087 /***************************************************************
1088 * OR n
1089 ***************************************************************/
1090 #define OR(value) \
1091 A |= value; \
1092 F = SZP[A]
1093
1094 /***************************************************************
1095 * XOR n
1096 ***************************************************************/
1097 #define XOR(value) \
1098 A ^= value; \
1099 F = SZP[A]
1100
1101 /***************************************************************
1102 * CP n
1103 ***************************************************************/
1104 #if BIG_FLAGS_ARRAY
1105 #define CP(value) \
1106 { \
1107 unsigned val = value; \
1108 UINT32 ah = AFD & 0xff00; \
1109 UINT32 res = (UINT8)((ah >> 8) - val); \
1110 F = (SZHVC_sub[ah | res] & ~(YF | XF)) | \
1111 (val & (YF | XF)); \
1112 }
1113 #else
1114 #define CP(value) \
1115 { \
1116 unsigned val = value; \
1117 unsigned res = A - val; \
1118 F = (SZ[res & 0xff] & (SF | ZF)) | \
1119 (val & (YF | XF)) | ((res >> 8) & CF) | NF | \
1120 ((A ^ res ^ val) & HF) | \
1121 ((((val ^ A) & (A ^ res)) >> 5) & VF); \
1122 }
1123 #endif
1124
1125 /***************************************************************
1126 * EX AF,AF'
1127 ***************************************************************/
1128 #define EX_AF { \
1129 Z80_PAIR tmp; \
1130 tmp = Z80.af; Z80.af = Z80.af2; Z80.af2 = tmp; \
1131 }
1132
1133 /***************************************************************
1134 * EX DE,HL
1135 ***************************************************************/
1136 #define EX_DE_HL { \
1137 Z80_PAIR tmp; \
1138 tmp = Z80.de; Z80.de = Z80.hl; Z80.hl = tmp; \
1139 }
1140
1141 /***************************************************************
1142 * EXX
1143 ***************************************************************/
1144 #define EXX { \
1145 Z80_PAIR tmp; \
1146 tmp = Z80.bc; Z80.bc = Z80.bc2; Z80.bc2 = tmp; \
1147 tmp = Z80.de; Z80.de = Z80.de2; Z80.de2 = tmp; \
1148 tmp = Z80.hl; Z80.hl = Z80.hl2; Z80.hl2 = tmp; \
1149 }
1150
1151 /***************************************************************
1152 * EX (SP),r16
1153 ***************************************************************/
1154 #define EXSP(DR) \
1155 { \
1156 Z80_PAIR tmp = { { 0, 0, 0, 0 } }; \
1157 RM16( SPD, &tmp ); \
1158 WM16( SPD, &Z80.DR ); \
1159 Z80.DR = tmp; \
1160 WZ = Z80.DR.d; \
1161 }
1162
1163
1164 /***************************************************************
1165 * ADD16
1166 ***************************************************************/
1167 #define ADD16(DR,SR) \
1168 { \
1169 UINT32 res = Z80.DR.d + Z80.SR.d; \
1170 WZ = Z80.DR.d + 1; \
1171 F = (F & (SF | ZF | VF)) | \
1172 (((Z80.DR.d ^ res ^ Z80.SR.d) >> 8) & HF) | \
1173 ((res >> 16) & CF) | ((res >> 8) & (YF | XF)); \
1174 Z80.DR.w.l = (UINT16)res; \
1175 }
1176
1177 /***************************************************************
1178 * ADC r16,r16
1179 ***************************************************************/
1180 #define ADC16(Reg) \
1181 { \
1182 UINT32 res = HLD + Z80.Reg.d + (F & CF); \
1183 WZ = HL + 1; \
1184 F = (((HLD ^ res ^ Z80.Reg.d) >> 8) & HF) | \
1185 ((res >> 16) & CF) | \
1186 ((res >> 8) & (SF | YF | XF)) | \
1187 ((res & 0xffff) ? 0 : ZF) | \
1188 (((Z80.Reg.d ^ HLD ^ 0x8000) & (Z80.Reg.d ^ res) & 0x8000) >> 13); \
1189 HL = (UINT16)res; \
1190 }
1191
1192 /***************************************************************
1193 * SBC r16,r16
1194 ***************************************************************/
1195 #define SBC16(Reg) \
1196 { \
1197 UINT32 res = HLD - Z80.Reg.d - (F & CF); \
1198 WZ = HL + 1; \
1199 F = (((HLD ^ res ^ Z80.Reg.d) >> 8) & HF) | NF | \
1200 ((res >> 16) & CF) | \
1201 ((res >> 8) & (SF | YF | XF)) | \
1202 ((res & 0xffff) ? 0 : ZF) | \
1203 (((Z80.Reg.d ^ HLD) & (HLD ^ res) &0x8000) >> 13); \
1204 HL = (UINT16)res; \
1205 }
1206
1207 /***************************************************************
1208 * RLC r8
1209 ***************************************************************/
RLC(UINT8 value)1210 Z80_INLINE UINT8 RLC(UINT8 value)
1211 {
1212 unsigned res = value;
1213 unsigned c = (res & 0x80) ? CF : 0;
1214 res = ((res << 1) | (res >> 7)) & 0xff;
1215 F = SZP[res] | c;
1216 return res;
1217 }
1218
1219 /***************************************************************
1220 * RRC r8
1221 ***************************************************************/
RRC(UINT8 value)1222 Z80_INLINE UINT8 RRC(UINT8 value)
1223 {
1224 unsigned res = value;
1225 unsigned c = (res & 0x01) ? CF : 0;
1226 res = ((res >> 1) | (res << 7)) & 0xff;
1227 F = SZP[res] | c;
1228 return res;
1229 }
1230
1231 /***************************************************************
1232 * RL r8
1233 ***************************************************************/
RL(UINT8 value)1234 Z80_INLINE UINT8 RL(UINT8 value)
1235 {
1236 unsigned res = value;
1237 unsigned c = (res & 0x80) ? CF : 0;
1238 res = ((res << 1) | (F & CF)) & 0xff;
1239 F = SZP[res] | c;
1240 return res;
1241 }
1242
1243 /***************************************************************
1244 * RR r8
1245 ***************************************************************/
RR(UINT8 value)1246 Z80_INLINE UINT8 RR(UINT8 value)
1247 {
1248 unsigned res = value;
1249 unsigned c = (res & 0x01) ? CF : 0;
1250 res = ((res >> 1) | (F << 7)) & 0xff;
1251 F = SZP[res] | c;
1252 return res;
1253 }
1254
1255 /***************************************************************
1256 * SLA r8
1257 ***************************************************************/
SLA(UINT8 value)1258 Z80_INLINE UINT8 SLA(UINT8 value)
1259 {
1260 unsigned res = value;
1261 unsigned c = (res & 0x80) ? CF : 0;
1262 res = (res << 1) & 0xff;
1263 F = SZP[res] | c;
1264 return res;
1265 }
1266
1267 /***************************************************************
1268 * SRA r8
1269 ***************************************************************/
SRA(UINT8 value)1270 Z80_INLINE UINT8 SRA(UINT8 value)
1271 {
1272 unsigned res = value;
1273 unsigned c = (res & 0x01) ? CF : 0;
1274 res = ((res >> 1) | (res & 0x80)) & 0xff;
1275 F = SZP[res] | c;
1276 return res;
1277 }
1278
1279 /***************************************************************
1280 * SLL r8
1281 ***************************************************************/
SLL(UINT8 value)1282 Z80_INLINE UINT8 SLL(UINT8 value)
1283 {
1284 unsigned res = value;
1285 unsigned c = (res & 0x80) ? CF : 0;
1286 res = ((res << 1) | 0x01) & 0xff;
1287 F = SZP[res] | c;
1288 return res;
1289 }
1290
1291 /***************************************************************
1292 * SRL r8
1293 ***************************************************************/
SRL(UINT8 value)1294 Z80_INLINE UINT8 SRL(UINT8 value)
1295 {
1296 unsigned res = value;
1297 unsigned c = (res & 0x01) ? CF : 0;
1298 res = (res >> 1) & 0xff;
1299 F = SZP[res] | c;
1300 return res;
1301 }
1302
1303 /***************************************************************
1304 * BIT bit,r8
1305 ***************************************************************/
1306 #undef BIT
1307 #define BIT(bit,reg) \
1308 F = (F & CF) | HF | (SZ_BIT[reg & (1<<bit)] & ~(YF|XF)) | (reg & (YF|XF));
1309
1310
1311
1312 /***************************************************************
1313 * BIT bit,(HL)
1314 ***************************************************************/
1315 #define BIT_HL(bit,reg) \
1316 F = (F & CF) | HF | (SZ_BIT[reg & (1<<bit)] & ~(YF|XF)) | (WZ_H & (YF|XF));
1317
1318 /***************************************************************
1319 * BIT bit,(IX/Y+o)
1320 ***************************************************************/
1321
1322 #define BIT_XY(bit,reg) \
1323 F = (F & CF) | HF | (SZ_BIT[reg & (1<<bit)] & ~(YF|XF)) | ((EA>>8) & (YF|XF))
1324
1325 /***************************************************************
1326 * RES bit,r8
1327 ***************************************************************/
RES(UINT8 bit,UINT8 value)1328 Z80_INLINE UINT8 RES(UINT8 bit, UINT8 value)
1329 {
1330 return value & ~(1<<bit);
1331 }
1332
1333 /***************************************************************
1334 * SET bit,r8
1335 ***************************************************************/
SET(UINT8 bit,UINT8 value)1336 Z80_INLINE UINT8 SET(UINT8 bit, UINT8 value)
1337 {
1338 return value | (1<<bit);
1339 }
1340
1341 /***************************************************************
1342 * LDI
1343 ***************************************************************/
1344 #define LDI { \
1345 UINT8 io = RM(HL); \
1346 WM( DE, io ); \
1347 F &= SF | ZF | CF; \
1348 if( (A + io) & 0x02 ) F |= YF; /* bit 1 -> flag 5 */ \
1349 if( (A + io) & 0x08 ) F |= XF; /* bit 3 -> flag 3 */ \
1350 HL++; DE++; BC--; \
1351 if( BC ) F |= VF; \
1352 }
1353
1354 /***************************************************************
1355 * CPI
1356 ***************************************************************/
1357 #define CPI { \
1358 UINT8 val = RM(HL); \
1359 UINT8 res = A - val; \
1360 WZ++; \
1361 HL++; BC--; \
1362 F = (F & CF) | (SZ[res]&~(YF|XF)) | ((A^val^res)&HF) | NF; \
1363 if( F & HF ) res -= 1; \
1364 if( res & 0x02 ) F |= YF; /* bit 1 -> flag 5 */ \
1365 if( res & 0x08 ) F |= XF; /* bit 3 -> flag 3 */ \
1366 if( BC ) F |= VF; \
1367 }
1368
1369 /***************************************************************
1370 * INI
1371 ***************************************************************/
1372 #define INI { \
1373 unsigned t; \
1374 UINT8 io = IN(BC); \
1375 WZ = BC + 1; \
1376 B--; \
1377 WM( HL, io ); \
1378 HL++; \
1379 F = SZ[B]; \
1380 t = (unsigned)((C + 1) & 0xff) + (unsigned)io; \
1381 if( io & SF ) F |= NF; \
1382 if( t & 0x100 ) F |= HF | CF; \
1383 F |= SZP[(UINT8)(t & 0x07) ^ B] & PF; \
1384 }
1385
1386 /***************************************************************
1387 * OUTI
1388 ***************************************************************/
1389 #define OUTI { \
1390 unsigned t; \
1391 UINT8 io = RM(HL); \
1392 B--; \
1393 WZ = BC + 1; \
1394 OUT( BC, io ); \
1395 HL++; \
1396 F = SZ[B]; \
1397 t = (unsigned)L + (unsigned)io; \
1398 if( io & SF ) F |= NF; \
1399 if( t & 0x100 ) F |= HF | CF; \
1400 F |= SZP[(UINT8)(t & 0x07) ^ B] & PF; \
1401 }
1402
1403 /***************************************************************
1404 * LDD
1405 ***************************************************************/
1406 #define LDD { \
1407 UINT8 io = RM(HL); \
1408 WM( DE, io ); \
1409 F &= SF | ZF | CF; \
1410 if( (A + io) & 0x02 ) F |= YF; /* bit 1 -> flag 5 */ \
1411 if( (A + io) & 0x08 ) F |= XF; /* bit 3 -> flag 3 */ \
1412 HL--; DE--; BC--; \
1413 if( BC ) F |= VF; \
1414 }
1415
1416 /***************************************************************
1417 * CPD
1418 ***************************************************************/
1419 #define CPD { \
1420 UINT8 val = RM(HL); \
1421 UINT8 res = A - val; \
1422 WZ--; \
1423 HL--; BC--; \
1424 F = (F & CF) | (SZ[res]&~(YF|XF)) | ((A^val^res)&HF) | NF; \
1425 if( F & HF ) res -= 1; \
1426 if( res & 0x02 ) F |= YF; /* bit 1 -> flag 5 */ \
1427 if( res & 0x08 ) F |= XF; /* bit 3 -> flag 3 */ \
1428 if( BC ) F |= VF; \
1429 }
1430
1431 /***************************************************************
1432 * IND
1433 ***************************************************************/
1434 #define IND { \
1435 unsigned t; \
1436 UINT8 io = IN(BC); \
1437 WZ = BC - 1; \
1438 B--; \
1439 WM( HL, io ); \
1440 HL--; \
1441 F = SZ[B]; \
1442 t = ((unsigned)(C - 1) & 0xff) + (unsigned)io; \
1443 if( io & SF ) F |= NF; \
1444 if( t & 0x100 ) F |= HF | CF; \
1445 F |= SZP[(UINT8)(t & 0x07) ^ B] & PF; \
1446 }
1447
1448 /***************************************************************
1449 * OUTD
1450 ***************************************************************/
1451 #define OUTD { \
1452 unsigned t; \
1453 UINT8 io = RM(HL); \
1454 B--; \
1455 WZ = BC - 1; \
1456 OUT( BC, io ); \
1457 HL--; \
1458 F = SZ[B]; \
1459 t = (unsigned)L + (unsigned)io; \
1460 if( io & SF ) F |= NF; \
1461 if( t & 0x100 ) F |= HF | CF; \
1462 F |= SZP[(UINT8)(t & 0x07) ^ B] & PF; \
1463 }
1464
1465 /***************************************************************
1466 * LDIR
1467 ***************************************************************/
1468 #define LDIR \
1469 LDI; \
1470 if( BC ) \
1471 { \
1472 PC -= 2; \
1473 WZ = PC + 1; \
1474 CC(ex,0xb0); \
1475 }
1476
1477 /***************************************************************
1478 * CPIR
1479 ***************************************************************/
1480 #define CPIR \
1481 CPI; \
1482 if( BC && !(F & ZF) ) \
1483 { \
1484 PC -= 2; \
1485 WZ = PC + 1; \
1486 CC(ex,0xb1); \
1487 }
1488
1489 /***************************************************************
1490 * INIR
1491 ***************************************************************/
1492 #define INIR \
1493 INI; \
1494 if( B ) \
1495 { \
1496 PC -= 2; \
1497 CC(ex,0xb2); \
1498 }
1499
1500 /***************************************************************
1501 * OTIR
1502 ***************************************************************/
1503 #define OTIR \
1504 OUTI; \
1505 if( B ) \
1506 { \
1507 PC -= 2; \
1508 CC(ex,0xb3); \
1509 }
1510
1511 /***************************************************************
1512 * LDDR
1513 ***************************************************************/
1514 #define LDDR \
1515 LDD; \
1516 if( BC ) \
1517 { \
1518 PC -= 2; \
1519 WZ = PC + 1; \
1520 CC(ex,0xb8); \
1521 }
1522
1523 /***************************************************************
1524 * CPDR
1525 ***************************************************************/
1526 #define CPDR \
1527 CPD; \
1528 if( BC && !(F & ZF) ) \
1529 { \
1530 PC -= 2; \
1531 WZ = PC + 1; \
1532 CC(ex,0xb9); \
1533 }
1534
1535 /***************************************************************
1536 * INDR
1537 ***************************************************************/
1538 #define INDR \
1539 IND; \
1540 if( B ) \
1541 { \
1542 PC -= 2; \
1543 CC(ex,0xba); \
1544 }
1545
1546 /***************************************************************
1547 * OTDR
1548 ***************************************************************/
1549 #define OTDR \
1550 OUTD; \
1551 if( B ) \
1552 { \
1553 PC -= 2; \
1554 CC(ex,0xbb); \
1555 }
1556
1557 /***************************************************************
1558 * EI
1559 ***************************************************************/
1560 #define EI { \
1561 IFF1 = IFF2 = 1; \
1562 Z80.after_ei = TRUE; \
1563 }
1564
1565 /**********************************************************
1566 * opcodes with CB prefix
1567 * rotate, shift and bit operations
1568 **********************************************************/
1569 OP(cb,00) { B = RLC(B); } /* RLC B */
1570 OP(cb,01) { C = RLC(C); } /* RLC C */
1571 OP(cb,02) { D = RLC(D); } /* RLC D */
1572 OP(cb,03) { E = RLC(E); } /* RLC E */
1573 OP(cb,04) { H = RLC(H); } /* RLC H */
1574 OP(cb,05) { L = RLC(L); } /* RLC L */
1575 OP(cb,06) { WM( HL, RLC(RM(HL)) ); } /* RLC (HL) */
1576 OP(cb,07) { A = RLC(A); } /* RLC A */
1577
1578 OP(cb,08) { B = RRC(B); } /* RRC B */
1579 OP(cb,09) { C = RRC(C); } /* RRC C */
1580 OP(cb,0a) { D = RRC(D); } /* RRC D */
1581 OP(cb,0b) { E = RRC(E); } /* RRC E */
1582 OP(cb,0c) { H = RRC(H); } /* RRC H */
1583 OP(cb,0d) { L = RRC(L); } /* RRC L */
1584 OP(cb,0e) { WM( HL, RRC(RM(HL)) ); } /* RRC (HL) */
1585 OP(cb,0f) { A = RRC(A); } /* RRC A */
1586
1587 OP(cb,10) { B = RL(B); } /* RL B */
1588 OP(cb,11) { C = RL(C); } /* RL C */
1589 OP(cb,12) { D = RL(D); } /* RL D */
1590 OP(cb,13) { E = RL(E); } /* RL E */
1591 OP(cb,14) { H = RL(H); } /* RL H */
1592 OP(cb,15) { L = RL(L); } /* RL L */
1593 OP(cb,16) { WM( HL, RL(RM(HL)) ); } /* RL (HL) */
1594 OP(cb,17) { A = RL(A); } /* RL A */
1595
1596 OP(cb,18) { B = RR(B); } /* RR B */
1597 OP(cb,19) { C = RR(C); } /* RR C */
1598 OP(cb,1a) { D = RR(D); } /* RR D */
1599 OP(cb,1b) { E = RR(E); } /* RR E */
1600 OP(cb,1c) { H = RR(H); } /* RR H */
1601 OP(cb,1d) { L = RR(L); } /* RR L */
1602 OP(cb,1e) { WM( HL, RR(RM(HL)) ); } /* RR (HL) */
1603 OP(cb,1f) { A = RR(A); } /* RR A */
1604
1605 OP(cb,20) { B = SLA(B); } /* SLA B */
1606 OP(cb,21) { C = SLA(C); } /* SLA C */
1607 OP(cb,22) { D = SLA(D); } /* SLA D */
1608 OP(cb,23) { E = SLA(E); } /* SLA E */
1609 OP(cb,24) { H = SLA(H); } /* SLA H */
1610 OP(cb,25) { L = SLA(L); } /* SLA L */
1611 OP(cb,26) { WM( HL, SLA(RM(HL)) ); } /* SLA (HL) */
1612 OP(cb,27) { A = SLA(A); } /* SLA A */
1613
1614 OP(cb,28) { B = SRA(B); } /* SRA B */
1615 OP(cb,29) { C = SRA(C); } /* SRA C */
1616 OP(cb,2a) { D = SRA(D); } /* SRA D */
1617 OP(cb,2b) { E = SRA(E); } /* SRA E */
1618 OP(cb,2c) { H = SRA(H); } /* SRA H */
1619 OP(cb,2d) { L = SRA(L); } /* SRA L */
1620 OP(cb,2e) { WM( HL, SRA(RM(HL)) ); } /* SRA (HL) */
1621 OP(cb,2f) { A = SRA(A); } /* SRA A */
1622
1623 OP(cb,30) { B = SLL(B); } /* SLL B */
1624 OP(cb,31) { C = SLL(C); } /* SLL C */
1625 OP(cb,32) { D = SLL(D); } /* SLL D */
1626 OP(cb,33) { E = SLL(E); } /* SLL E */
1627 OP(cb,34) { H = SLL(H); } /* SLL H */
1628 OP(cb,35) { L = SLL(L); } /* SLL L */
1629 OP(cb,36) { WM( HL, SLL(RM(HL)) ); } /* SLL (HL) */
1630 OP(cb,37) { A = SLL(A); } /* SLL A */
1631
1632 OP(cb,38) { B = SRL(B); } /* SRL B */
1633 OP(cb,39) { C = SRL(C); } /* SRL C */
1634 OP(cb,3a) { D = SRL(D); } /* SRL D */
1635 OP(cb,3b) { E = SRL(E); } /* SRL E */
1636 OP(cb,3c) { H = SRL(H); } /* SRL H */
1637 OP(cb,3d) { L = SRL(L); } /* SRL L */
1638 OP(cb,3e) { WM( HL, SRL(RM(HL)) ); } /* SRL (HL) */
1639 OP(cb,3f) { A = SRL(A); } /* SRL A */
1640
1641 OP(cb,40) { BIT(0,B); } /* BIT 0,B */
1642 OP(cb,41) { BIT(0,C); } /* BIT 0,C */
1643 OP(cb,42) { BIT(0,D); } /* BIT 0,D */
1644 OP(cb,43) { BIT(0,E); } /* BIT 0,E */
1645 OP(cb,44) { BIT(0,H); } /* BIT 0,H */
1646 OP(cb,45) { BIT(0,L); } /* BIT 0,L */
1647 OP(cb,46) { BIT_HL(0,RM(HL)); } /* BIT 0,(HL) */
1648 OP(cb,47) { BIT(0,A); } /* BIT 0,A */
1649
1650 OP(cb,48) { BIT(1,B); } /* BIT 1,B */
1651 OP(cb,49) { BIT(1,C); } /* BIT 1,C */
1652 OP(cb,4a) { BIT(1,D); } /* BIT 1,D */
1653 OP(cb,4b) { BIT(1,E); } /* BIT 1,E */
1654 OP(cb,4c) { BIT(1,H); } /* BIT 1,H */
1655 OP(cb,4d) { BIT(1,L); } /* BIT 1,L */
1656 OP(cb,4e) { BIT_HL(1,RM(HL)); } /* BIT 1,(HL) */
1657 OP(cb,4f) { BIT(1,A); } /* BIT 1,A */
1658
1659 OP(cb,50) { BIT(2,B); } /* BIT 2,B */
1660 OP(cb,51) { BIT(2,C); } /* BIT 2,C */
1661 OP(cb,52) { BIT(2,D); } /* BIT 2,D */
1662 OP(cb,53) { BIT(2,E); } /* BIT 2,E */
1663 OP(cb,54) { BIT(2,H); } /* BIT 2,H */
1664 OP(cb,55) { BIT(2,L); } /* BIT 2,L */
1665 OP(cb,56) { BIT_HL(2,RM(HL)); } /* BIT 2,(HL) */
1666 OP(cb,57) { BIT(2,A); } /* BIT 2,A */
1667
1668 OP(cb,58) { BIT(3,B); } /* BIT 3,B */
1669 OP(cb,59) { BIT(3,C); } /* BIT 3,C */
1670 OP(cb,5a) { BIT(3,D); } /* BIT 3,D */
1671 OP(cb,5b) { BIT(3,E); } /* BIT 3,E */
1672 OP(cb,5c) { BIT(3,H); } /* BIT 3,H */
1673 OP(cb,5d) { BIT(3,L); } /* BIT 3,L */
1674 OP(cb,5e) { BIT_HL(3,RM(HL)); } /* BIT 3,(HL) */
1675 OP(cb,5f) { BIT(3,A); } /* BIT 3,A */
1676
1677 OP(cb,60) { BIT(4,B); } /* BIT 4,B */
1678 OP(cb,61) { BIT(4,C); } /* BIT 4,C */
1679 OP(cb,62) { BIT(4,D); } /* BIT 4,D */
1680 OP(cb,63) { BIT(4,E); } /* BIT 4,E */
1681 OP(cb,64) { BIT(4,H); } /* BIT 4,H */
1682 OP(cb,65) { BIT(4,L); } /* BIT 4,L */
1683 OP(cb,66) { BIT_HL(4,RM(HL)); } /* BIT 4,(HL) */
1684 OP(cb,67) { BIT(4,A); } /* BIT 4,A */
1685
1686 OP(cb,68) { BIT(5,B); } /* BIT 5,B */
1687 OP(cb,69) { BIT(5,C); } /* BIT 5,C */
1688 OP(cb,6a) { BIT(5,D); } /* BIT 5,D */
1689 OP(cb,6b) { BIT(5,E); } /* BIT 5,E */
1690 OP(cb,6c) { BIT(5,H); } /* BIT 5,H */
1691 OP(cb,6d) { BIT(5,L); } /* BIT 5,L */
1692 OP(cb,6e) { BIT_HL(5,RM(HL)); } /* BIT 5,(HL) */
1693 OP(cb,6f) { BIT(5,A); } /* BIT 5,A */
1694
1695 OP(cb,70) { BIT(6,B); } /* BIT 6,B */
1696 OP(cb,71) { BIT(6,C); } /* BIT 6,C */
1697 OP(cb,72) { BIT(6,D); } /* BIT 6,D */
1698 OP(cb,73) { BIT(6,E); } /* BIT 6,E */
1699 OP(cb,74) { BIT(6,H); } /* BIT 6,H */
1700 OP(cb,75) { BIT(6,L); } /* BIT 6,L */
1701 OP(cb,76) { BIT_HL(6,RM(HL)); } /* BIT 6,(HL) */
1702 OP(cb,77) { BIT(6,A); } /* BIT 6,A */
1703
1704 OP(cb,78) { BIT(7,B); } /* BIT 7,B */
1705 OP(cb,79) { BIT(7,C); } /* BIT 7,C */
1706 OP(cb,7a) { BIT(7,D); } /* BIT 7,D */
1707 OP(cb,7b) { BIT(7,E); } /* BIT 7,E */
1708 OP(cb,7c) { BIT(7,H); } /* BIT 7,H */
1709 OP(cb,7d) { BIT(7,L); } /* BIT 7,L */
1710 OP(cb,7e) { BIT_HL(7,RM(HL)); } /* BIT 7,(HL) */
1711 OP(cb,7f) { BIT(7,A); } /* BIT 7,A */
1712
1713 OP(cb,80) { B = RES(0,B); } /* RES 0,B */
1714 OP(cb,81) { C = RES(0,C); } /* RES 0,C */
1715 OP(cb,82) { D = RES(0,D); } /* RES 0,D */
1716 OP(cb,83) { E = RES(0,E); } /* RES 0,E */
1717 OP(cb,84) { H = RES(0,H); } /* RES 0,H */
1718 OP(cb,85) { L = RES(0,L); } /* RES 0,L */
1719 OP(cb,86) { WM( HL, RES(0,RM(HL)) ); } /* RES 0,(HL) */
1720 OP(cb,87) { A = RES(0,A); } /* RES 0,A */
1721
1722 OP(cb,88) { B = RES(1,B); } /* RES 1,B */
1723 OP(cb,89) { C = RES(1,C); } /* RES 1,C */
1724 OP(cb,8a) { D = RES(1,D); } /* RES 1,D */
1725 OP(cb,8b) { E = RES(1,E); } /* RES 1,E */
1726 OP(cb,8c) { H = RES(1,H); } /* RES 1,H */
1727 OP(cb,8d) { L = RES(1,L); } /* RES 1,L */
1728 OP(cb,8e) { WM( HL, RES(1,RM(HL)) ); } /* RES 1,(HL) */
1729 OP(cb,8f) { A = RES(1,A); } /* RES 1,A */
1730
1731 OP(cb,90) { B = RES(2,B); } /* RES 2,B */
1732 OP(cb,91) { C = RES(2,C); } /* RES 2,C */
1733 OP(cb,92) { D = RES(2,D); } /* RES 2,D */
1734 OP(cb,93) { E = RES(2,E); } /* RES 2,E */
1735 OP(cb,94) { H = RES(2,H); } /* RES 2,H */
1736 OP(cb,95) { L = RES(2,L); } /* RES 2,L */
1737 OP(cb,96) { WM( HL, RES(2,RM(HL)) ); } /* RES 2,(HL) */
1738 OP(cb,97) { A = RES(2,A); } /* RES 2,A */
1739
1740 OP(cb,98) { B = RES(3,B); } /* RES 3,B */
1741 OP(cb,99) { C = RES(3,C); } /* RES 3,C */
1742 OP(cb,9a) { D = RES(3,D); } /* RES 3,D */
1743 OP(cb,9b) { E = RES(3,E); } /* RES 3,E */
1744 OP(cb,9c) { H = RES(3,H); } /* RES 3,H */
1745 OP(cb,9d) { L = RES(3,L); } /* RES 3,L */
1746 OP(cb,9e) { WM( HL, RES(3,RM(HL)) ); } /* RES 3,(HL) */
1747 OP(cb,9f) { A = RES(3,A); } /* RES 3,A */
1748
OP(cb,a0)1749 OP(cb,a0) { B = RES(4,B); } /* RES 4,B */
OP(cb,a1)1750 OP(cb,a1) { C = RES(4,C); } /* RES 4,C */
OP(cb,a2)1751 OP(cb,a2) { D = RES(4,D); } /* RES 4,D */
OP(cb,a3)1752 OP(cb,a3) { E = RES(4,E); } /* RES 4,E */
OP(cb,a4)1753 OP(cb,a4) { H = RES(4,H); } /* RES 4,H */
OP(cb,a5)1754 OP(cb,a5) { L = RES(4,L); } /* RES 4,L */
OP(cb,a6)1755 OP(cb,a6) { WM( HL, RES(4,RM(HL)) ); } /* RES 4,(HL) */
OP(cb,a7)1756 OP(cb,a7) { A = RES(4,A); } /* RES 4,A */
1757
OP(cb,a8)1758 OP(cb,a8) { B = RES(5,B); } /* RES 5,B */
OP(cb,a9)1759 OP(cb,a9) { C = RES(5,C); } /* RES 5,C */
OP(cb,aa)1760 OP(cb,aa) { D = RES(5,D); } /* RES 5,D */
OP(cb,ab)1761 OP(cb,ab) { E = RES(5,E); } /* RES 5,E */
OP(cb,ac)1762 OP(cb,ac) { H = RES(5,H); } /* RES 5,H */
OP(cb,ad)1763 OP(cb,ad) { L = RES(5,L); } /* RES 5,L */
OP(cb,ae)1764 OP(cb,ae) { WM( HL, RES(5,RM(HL)) ); } /* RES 5,(HL) */
OP(cb,af)1765 OP(cb,af) { A = RES(5,A); } /* RES 5,A */
1766
OP(cb,b0)1767 OP(cb,b0) { B = RES(6,B); } /* RES 6,B */
OP(cb,b1)1768 OP(cb,b1) { C = RES(6,C); } /* RES 6,C */
OP(cb,b2)1769 OP(cb,b2) { D = RES(6,D); } /* RES 6,D */
OP(cb,b3)1770 OP(cb,b3) { E = RES(6,E); } /* RES 6,E */
OP(cb,b4)1771 OP(cb,b4) { H = RES(6,H); } /* RES 6,H */
OP(cb,b5)1772 OP(cb,b5) { L = RES(6,L); } /* RES 6,L */
OP(cb,b6)1773 OP(cb,b6) { WM( HL, RES(6,RM(HL)) ); } /* RES 6,(HL) */
OP(cb,b7)1774 OP(cb,b7) { A = RES(6,A); } /* RES 6,A */
1775
OP(cb,b8)1776 OP(cb,b8) { B = RES(7,B); } /* RES 7,B */
OP(cb,b9)1777 OP(cb,b9) { C = RES(7,C); } /* RES 7,C */
OP(cb,ba)1778 OP(cb,ba) { D = RES(7,D); } /* RES 7,D */
OP(cb,bb)1779 OP(cb,bb) { E = RES(7,E); } /* RES 7,E */
OP(cb,bc)1780 OP(cb,bc) { H = RES(7,H); } /* RES 7,H */
OP(cb,bd)1781 OP(cb,bd) { L = RES(7,L); } /* RES 7,L */
OP(cb,be)1782 OP(cb,be) { WM( HL, RES(7,RM(HL)) ); } /* RES 7,(HL) */
OP(cb,bf)1783 OP(cb,bf) { A = RES(7,A); } /* RES 7,A */
1784
OP(cb,c0)1785 OP(cb,c0) { B = SET(0,B); } /* SET 0,B */
OP(cb,c1)1786 OP(cb,c1) { C = SET(0,C); } /* SET 0,C */
OP(cb,c2)1787 OP(cb,c2) { D = SET(0,D); } /* SET 0,D */
OP(cb,c3)1788 OP(cb,c3) { E = SET(0,E); } /* SET 0,E */
OP(cb,c4)1789 OP(cb,c4) { H = SET(0,H); } /* SET 0,H */
OP(cb,c5)1790 OP(cb,c5) { L = SET(0,L); } /* SET 0,L */
OP(cb,c6)1791 OP(cb,c6) { WM( HL, SET(0,RM(HL)) ); } /* SET 0,(HL) */
OP(cb,c7)1792 OP(cb,c7) { A = SET(0,A); } /* SET 0,A */
1793
OP(cb,c8)1794 OP(cb,c8) { B = SET(1,B); } /* SET 1,B */
OP(cb,c9)1795 OP(cb,c9) { C = SET(1,C); } /* SET 1,C */
OP(cb,ca)1796 OP(cb,ca) { D = SET(1,D); } /* SET 1,D */
OP(cb,cb)1797 OP(cb,cb) { E = SET(1,E); } /* SET 1,E */
OP(cb,cc)1798 OP(cb,cc) { H = SET(1,H); } /* SET 1,H */
OP(cb,cd)1799 OP(cb,cd) { L = SET(1,L); } /* SET 1,L */
OP(cb,ce)1800 OP(cb,ce) { WM( HL, SET(1,RM(HL)) ); } /* SET 1,(HL) */
OP(cb,cf)1801 OP(cb,cf) { A = SET(1,A); } /* SET 1,A */
1802
OP(cb,d0)1803 OP(cb,d0) { B = SET(2,B); } /* SET 2,B */
OP(cb,d1)1804 OP(cb,d1) { C = SET(2,C); } /* SET 2,C */
OP(cb,d2)1805 OP(cb,d2) { D = SET(2,D); } /* SET 2,D */
OP(cb,d3)1806 OP(cb,d3) { E = SET(2,E); } /* SET 2,E */
OP(cb,d4)1807 OP(cb,d4) { H = SET(2,H); } /* SET 2,H */
OP(cb,d5)1808 OP(cb,d5) { L = SET(2,L); } /* SET 2,L */
OP(cb,d6)1809 OP(cb,d6) { WM( HL, SET(2,RM(HL)) ); } /* SET 2,(HL) */
OP(cb,d7)1810 OP(cb,d7) { A = SET(2,A); } /* SET 2,A */
1811
OP(cb,d8)1812 OP(cb,d8) { B = SET(3,B); } /* SET 3,B */
OP(cb,d9)1813 OP(cb,d9) { C = SET(3,C); } /* SET 3,C */
OP(cb,da)1814 OP(cb,da) { D = SET(3,D); } /* SET 3,D */
OP(cb,db)1815 OP(cb,db) { E = SET(3,E); } /* SET 3,E */
OP(cb,dc)1816 OP(cb,dc) { H = SET(3,H); } /* SET 3,H */
OP(cb,dd)1817 OP(cb,dd) { L = SET(3,L); } /* SET 3,L */
OP(cb,de)1818 OP(cb,de) { WM( HL, SET(3,RM(HL)) ); } /* SET 3,(HL) */
OP(cb,df)1819 OP(cb,df) { A = SET(3,A); } /* SET 3,A */
1820
OP(cb,e0)1821 OP(cb,e0) { B = SET(4,B); } /* SET 4,B */
OP(cb,e1)1822 OP(cb,e1) { C = SET(4,C); } /* SET 4,C */
OP(cb,e2)1823 OP(cb,e2) { D = SET(4,D); } /* SET 4,D */
OP(cb,e3)1824 OP(cb,e3) { E = SET(4,E); } /* SET 4,E */
OP(cb,e4)1825 OP(cb,e4) { H = SET(4,H); } /* SET 4,H */
OP(cb,e5)1826 OP(cb,e5) { L = SET(4,L); } /* SET 4,L */
OP(cb,e6)1827 OP(cb,e6) { WM( HL, SET(4,RM(HL)) ); } /* SET 4,(HL) */
OP(cb,e7)1828 OP(cb,e7) { A = SET(4,A); } /* SET 4,A */
1829
OP(cb,e8)1830 OP(cb,e8) { B = SET(5,B); } /* SET 5,B */
OP(cb,e9)1831 OP(cb,e9) { C = SET(5,C); } /* SET 5,C */
OP(cb,ea)1832 OP(cb,ea) { D = SET(5,D); } /* SET 5,D */
OP(cb,eb)1833 OP(cb,eb) { E = SET(5,E); } /* SET 5,E */
OP(cb,ec)1834 OP(cb,ec) { H = SET(5,H); } /* SET 5,H */
OP(cb,ed)1835 OP(cb,ed) { L = SET(5,L); } /* SET 5,L */
OP(cb,ee)1836 OP(cb,ee) { WM( HL, SET(5,RM(HL)) ); } /* SET 5,(HL) */
OP(cb,ef)1837 OP(cb,ef) { A = SET(5,A); } /* SET 5,A */
1838
OP(cb,f0)1839 OP(cb,f0) { B = SET(6,B); } /* SET 6,B */
OP(cb,f1)1840 OP(cb,f1) { C = SET(6,C); } /* SET 6,C */
OP(cb,f2)1841 OP(cb,f2) { D = SET(6,D); } /* SET 6,D */
OP(cb,f3)1842 OP(cb,f3) { E = SET(6,E); } /* SET 6,E */
OP(cb,f4)1843 OP(cb,f4) { H = SET(6,H); } /* SET 6,H */
OP(cb,f5)1844 OP(cb,f5) { L = SET(6,L); } /* SET 6,L */
OP(cb,f6)1845 OP(cb,f6) { WM( HL, SET(6,RM(HL)) ); } /* SET 6,(HL) */
OP(cb,f7)1846 OP(cb,f7) { A = SET(6,A); } /* SET 6,A */
1847
OP(cb,f8)1848 OP(cb,f8) { B = SET(7,B); } /* SET 7,B */
OP(cb,f9)1849 OP(cb,f9) { C = SET(7,C); } /* SET 7,C */
OP(cb,fa)1850 OP(cb,fa) { D = SET(7,D); } /* SET 7,D */
OP(cb,fb)1851 OP(cb,fb) { E = SET(7,E); } /* SET 7,E */
OP(cb,fc)1852 OP(cb,fc) { H = SET(7,H); } /* SET 7,H */
OP(cb,fd)1853 OP(cb,fd) { L = SET(7,L); } /* SET 7,L */
OP(cb,fe)1854 OP(cb,fe) { WM( HL, SET(7,RM(HL)) ); } /* SET 7,(HL) */
OP(cb,ff)1855 OP(cb,ff) { A = SET(7,A); } /* SET 7,A */
1856
1857
1858 /**********************************************************
1859 * opcodes with DD/FD CB prefix
1860 * rotate, shift and bit operations with (IX+o)
1861 **********************************************************/
1862 OP(xycb,00) { B = RLC( RM(EA) ); WM( EA,B ); } /* RLC B=(XY+o) */
1863 OP(xycb,01) { C = RLC( RM(EA) ); WM( EA,C ); } /* RLC C=(XY+o) */
1864 OP(xycb,02) { D = RLC( RM(EA) ); WM( EA,D ); } /* RLC D=(XY+o) */
1865 OP(xycb,03) { E = RLC( RM(EA) ); WM( EA,E ); } /* RLC E=(XY+o) */
1866 OP(xycb,04) { H = RLC( RM(EA) ); WM( EA,H ); } /* RLC H=(XY+o) */
1867 OP(xycb,05) { L = RLC( RM(EA) ); WM( EA,L ); } /* RLC L=(XY+o) */
1868 OP(xycb,06) { WM( EA, RLC( RM(EA) ) ); } /* RLC (XY+o) */
1869 OP(xycb,07) { A = RLC( RM(EA) ); WM( EA,A ); } /* RLC A=(XY+o) */
1870
1871 OP(xycb,08) { B = RRC( RM(EA) ); WM( EA,B ); } /* RRC B=(XY+o) */
1872 OP(xycb,09) { C = RRC( RM(EA) ); WM( EA,C ); } /* RRC C=(XY+o) */
1873 OP(xycb,0a) { D = RRC( RM(EA) ); WM( EA,D ); } /* RRC D=(XY+o) */
1874 OP(xycb,0b) { E = RRC( RM(EA) ); WM( EA,E ); } /* RRC E=(XY+o) */
1875 OP(xycb,0c) { H = RRC( RM(EA) ); WM( EA,H ); } /* RRC H=(XY+o) */
1876 OP(xycb,0d) { L = RRC( RM(EA) ); WM( EA,L ); } /* RRC L=(XY+o) */
1877 OP(xycb,0e) { WM( EA,RRC( RM(EA) ) ); } /* RRC (XY+o) */
1878 OP(xycb,0f) { A = RRC( RM(EA) ); WM( EA,A ); } /* RRC A=(XY+o) */
1879
1880 OP(xycb,10) { B = RL( RM(EA) ); WM( EA,B ); } /* RL B=(XY+o) */
1881 OP(xycb,11) { C = RL( RM(EA) ); WM( EA,C ); } /* RL C=(XY+o) */
1882 OP(xycb,12) { D = RL( RM(EA) ); WM( EA,D ); } /* RL D=(XY+o) */
1883 OP(xycb,13) { E = RL( RM(EA) ); WM( EA,E ); } /* RL E=(XY+o) */
1884 OP(xycb,14) { H = RL( RM(EA) ); WM( EA,H ); } /* RL H=(XY+o) */
1885 OP(xycb,15) { L = RL( RM(EA) ); WM( EA,L ); } /* RL L=(XY+o) */
1886 OP(xycb,16) { WM( EA,RL( RM(EA) ) ); } /* RL (XY+o) */
1887 OP(xycb,17) { A = RL( RM(EA) ); WM( EA,A ); } /* RL A=(XY+o) */
1888
1889 OP(xycb,18) { B = RR( RM(EA) ); WM( EA,B ); } /* RR B=(XY+o) */
1890 OP(xycb,19) { C = RR( RM(EA) ); WM( EA,C ); } /* RR C=(XY+o) */
1891 OP(xycb,1a) { D = RR( RM(EA) ); WM( EA,D ); } /* RR D=(XY+o) */
1892 OP(xycb,1b) { E = RR( RM(EA) ); WM( EA,E ); } /* RR E=(XY+o) */
1893 OP(xycb,1c) { H = RR( RM(EA) ); WM( EA,H ); } /* RR H=(XY+o) */
1894 OP(xycb,1d) { L = RR( RM(EA) ); WM( EA,L ); } /* RR L=(XY+o) */
1895 OP(xycb,1e) { WM( EA,RR( RM(EA) ) ); } /* RR (XY+o) */
1896 OP(xycb,1f) { A = RR( RM(EA) ); WM( EA,A ); } /* RR A=(XY+o) */
1897
1898 OP(xycb,20) { B = SLA( RM(EA) ); WM( EA,B ); } /* SLA B=(XY+o) */
1899 OP(xycb,21) { C = SLA( RM(EA) ); WM( EA,C ); } /* SLA C=(XY+o) */
1900 OP(xycb,22) { D = SLA( RM(EA) ); WM( EA,D ); } /* SLA D=(XY+o) */
1901 OP(xycb,23) { E = SLA( RM(EA) ); WM( EA,E ); } /* SLA E=(XY+o) */
1902 OP(xycb,24) { H = SLA( RM(EA) ); WM( EA,H ); } /* SLA H=(XY+o) */
1903 OP(xycb,25) { L = SLA( RM(EA) ); WM( EA,L ); } /* SLA L=(XY+o) */
1904 OP(xycb,26) { WM( EA,SLA( RM(EA) ) ); } /* SLA (XY+o) */
1905 OP(xycb,27) { A = SLA( RM(EA) ); WM( EA,A ); } /* SLA A=(XY+o) */
1906
1907 OP(xycb,28) { B = SRA( RM(EA) ); WM( EA,B ); } /* SRA B=(XY+o) */
1908 OP(xycb,29) { C = SRA( RM(EA) ); WM( EA,C ); } /* SRA C=(XY+o) */
1909 OP(xycb,2a) { D = SRA( RM(EA) ); WM( EA,D ); } /* SRA D=(XY+o) */
1910 OP(xycb,2b) { E = SRA( RM(EA) ); WM( EA,E ); } /* SRA E=(XY+o) */
1911 OP(xycb,2c) { H = SRA( RM(EA) ); WM( EA,H ); } /* SRA H=(XY+o) */
1912 OP(xycb,2d) { L = SRA( RM(EA) ); WM( EA,L ); } /* SRA L=(XY+o) */
1913 OP(xycb,2e) { WM( EA,SRA( RM(EA) ) ); } /* SRA (XY+o) */
1914 OP(xycb,2f) { A = SRA( RM(EA) ); WM( EA,A ); } /* SRA A=(XY+o) */
1915
1916 OP(xycb,30) { B = SLL( RM(EA) ); WM( EA,B ); } /* SLL B=(XY+o) */
1917 OP(xycb,31) { C = SLL( RM(EA) ); WM( EA,C ); } /* SLL C=(XY+o) */
1918 OP(xycb,32) { D = SLL( RM(EA) ); WM( EA,D ); } /* SLL D=(XY+o) */
1919 OP(xycb,33) { E = SLL( RM(EA) ); WM( EA,E ); } /* SLL E=(XY+o) */
1920 OP(xycb,34) { H = SLL( RM(EA) ); WM( EA,H ); } /* SLL H=(XY+o) */
1921 OP(xycb,35) { L = SLL( RM(EA) ); WM( EA,L ); } /* SLL L=(XY+o) */
1922 OP(xycb,36) { WM( EA,SLL( RM(EA) ) ); } /* SLL (XY+o) */
1923 OP(xycb,37) { A = SLL( RM(EA) ); WM( EA,A ); } /* SLL A=(XY+o) */
1924
1925 OP(xycb,38) { B = SRL( RM(EA) ); WM( EA,B ); } /* SRL B=(XY+o) */
1926 OP(xycb,39) { C = SRL( RM(EA) ); WM( EA,C ); } /* SRL C=(XY+o) */
1927 OP(xycb,3a) { D = SRL( RM(EA) ); WM( EA,D ); } /* SRL D=(XY+o) */
1928 OP(xycb,3b) { E = SRL( RM(EA) ); WM( EA,E ); } /* SRL E=(XY+o) */
1929 OP(xycb,3c) { H = SRL( RM(EA) ); WM( EA,H ); } /* SRL H=(XY+o) */
1930 OP(xycb,3d) { L = SRL( RM(EA) ); WM( EA,L ); } /* SRL L=(XY+o) */
1931 OP(xycb,3e) { WM( EA,SRL( RM(EA) ) ); } /* SRL (XY+o) */
1932 OP(xycb,3f) { A = SRL( RM(EA) ); WM( EA,A ); } /* SRL A=(XY+o) */
1933
1934 OP(xycb,40) { xycb_46(); } /* BIT 0,(XY+o) */
1935 OP(xycb,41) { xycb_46(); } /* BIT 0,(XY+o) */
1936 OP(xycb,42) { xycb_46(); } /* BIT 0,(XY+o) */
1937 OP(xycb,43) { xycb_46(); } /* BIT 0,(XY+o) */
1938 OP(xycb,44) { xycb_46(); } /* BIT 0,(XY+o) */
1939 OP(xycb,45) { xycb_46(); } /* BIT 0,(XY+o) */
1940 OP(xycb,46) { BIT_XY(0,RM(EA)); } /* BIT 0,(XY+o) */
1941 OP(xycb,47) { xycb_46(); } /* BIT 0,(XY+o) */
1942
1943 OP(xycb,48) { xycb_4e(); } /* BIT 1,(XY+o) */
1944 OP(xycb,49) { xycb_4e(); } /* BIT 1,(XY+o) */
1945 OP(xycb,4a) { xycb_4e(); } /* BIT 1,(XY+o) */
1946 OP(xycb,4b) { xycb_4e(); } /* BIT 1,(XY+o) */
1947 OP(xycb,4c) { xycb_4e(); } /* BIT 1,(XY+o) */
1948 OP(xycb,4d) { xycb_4e(); } /* BIT 1,(XY+o) */
1949 OP(xycb,4e) { BIT_XY(1,RM(EA)); } /* BIT 1,(XY+o) */
1950 OP(xycb,4f) { xycb_4e(); } /* BIT 1,(XY+o) */
1951
1952 OP(xycb,50) { xycb_56(); } /* BIT 2,(XY+o) */
1953 OP(xycb,51) { xycb_56(); } /* BIT 2,(XY+o) */
1954 OP(xycb,52) { xycb_56(); } /* BIT 2,(XY+o) */
1955 OP(xycb,53) { xycb_56(); } /* BIT 2,(XY+o) */
1956 OP(xycb,54) { xycb_56(); } /* BIT 2,(XY+o) */
1957 OP(xycb,55) { xycb_56(); } /* BIT 2,(XY+o) */
1958 OP(xycb,56) { BIT_XY(2,RM(EA)); } /* BIT 2,(XY+o) */
1959 OP(xycb,57) { xycb_56(); } /* BIT 2,(XY+o) */
1960
1961 OP(xycb,58) { xycb_5e(); } /* BIT 3,(XY+o) */
1962 OP(xycb,59) { xycb_5e(); } /* BIT 3,(XY+o) */
1963 OP(xycb,5a) { xycb_5e(); } /* BIT 3,(XY+o) */
1964 OP(xycb,5b) { xycb_5e(); } /* BIT 3,(XY+o) */
1965 OP(xycb,5c) { xycb_5e(); } /* BIT 3,(XY+o) */
1966 OP(xycb,5d) { xycb_5e(); } /* BIT 3,(XY+o) */
1967 OP(xycb,5e) { BIT_XY(3,RM(EA)); } /* BIT 3,(XY+o) */
1968 OP(xycb,5f) { xycb_5e(); } /* BIT 3,(XY+o) */
1969
1970 OP(xycb,60) { xycb_66(); } /* BIT 4,(XY+o) */
1971 OP(xycb,61) { xycb_66(); } /* BIT 4,(XY+o) */
1972 OP(xycb,62) { xycb_66(); } /* BIT 4,(XY+o) */
1973 OP(xycb,63) { xycb_66(); } /* BIT 4,(XY+o) */
1974 OP(xycb,64) { xycb_66(); } /* BIT 4,(XY+o) */
1975 OP(xycb,65) { xycb_66(); } /* BIT 4,(XY+o) */
1976 OP(xycb,66) { BIT_XY(4,RM(EA)); } /* BIT 4,(XY+o) */
1977 OP(xycb,67) { xycb_66(); } /* BIT 4,(XY+o) */
1978
1979 OP(xycb,68) { xycb_6e(); } /* BIT 5,(XY+o) */
1980 OP(xycb,69) { xycb_6e(); } /* BIT 5,(XY+o) */
1981 OP(xycb,6a) { xycb_6e(); } /* BIT 5,(XY+o) */
1982 OP(xycb,6b) { xycb_6e(); } /* BIT 5,(XY+o) */
1983 OP(xycb,6c) { xycb_6e(); } /* BIT 5,(XY+o) */
1984 OP(xycb,6d) { xycb_6e(); } /* BIT 5,(XY+o) */
1985 OP(xycb,6e) { BIT_XY(5,RM(EA)); } /* BIT 5,(XY+o) */
1986 OP(xycb,6f) { xycb_6e(); } /* BIT 5,(XY+o) */
1987
1988 OP(xycb,70) { xycb_66(); } /* BIT 6,(XY+o) */
1989 OP(xycb,71) { xycb_66(); } /* BIT 6,(XY+o) */
1990 OP(xycb,72) { xycb_66(); } /* BIT 6,(XY+o) */
1991 OP(xycb,73) { xycb_66(); } /* BIT 6,(XY+o) */
1992 OP(xycb,74) { xycb_66(); } /* BIT 6,(XY+o) */
1993 OP(xycb,75) { xycb_66(); } /* BIT 6,(XY+o) */
1994 OP(xycb,76) { BIT_XY(6,RM(EA)); } /* BIT 6,(XY+o) */
1995 OP(xycb,77) { xycb_66(); } /* BIT 6,(XY+o) */
1996
1997 OP(xycb,78) { xycb_7e(); } /* BIT 7,(XY+o) */
1998 OP(xycb,79) { xycb_7e(); } /* BIT 7,(XY+o) */
1999 OP(xycb,7a) { xycb_7e(); } /* BIT 7,(XY+o) */
2000 OP(xycb,7b) { xycb_7e(); } /* BIT 7,(XY+o) */
2001 OP(xycb,7c) { xycb_7e(); } /* BIT 7,(XY+o) */
2002 OP(xycb,7d) { xycb_7e(); } /* BIT 7,(XY+o) */
2003 OP(xycb,7e) { BIT_XY(7,RM(EA)); } /* BIT 7,(XY+o) */
2004 OP(xycb,7f) { xycb_7e(); } /* BIT 7,(XY+o) */
2005
2006 OP(xycb,80) { B = RES(0, RM(EA) ); WM( EA,B ); } /* RES 0,B=(XY+o) */
2007 OP(xycb,81) { C = RES(0, RM(EA) ); WM( EA,C ); } /* RES 0,C=(XY+o) */
2008 OP(xycb,82) { D = RES(0, RM(EA) ); WM( EA,D ); } /* RES 0,D=(XY+o) */
2009 OP(xycb,83) { E = RES(0, RM(EA) ); WM( EA,E ); } /* RES 0,E=(XY+o) */
2010 OP(xycb,84) { H = RES(0, RM(EA) ); WM( EA,H ); } /* RES 0,H=(XY+o) */
2011 OP(xycb,85) { L = RES(0, RM(EA) ); WM( EA,L ); } /* RES 0,L=(XY+o) */
2012 OP(xycb,86) { WM( EA, RES(0,RM(EA)) ); } /* RES 0,(XY+o) */
2013 OP(xycb,87) { A = RES(0, RM(EA) ); WM( EA,A ); } /* RES 0,A=(XY+o) */
2014
2015 OP(xycb,88) { B = RES(1, RM(EA) ); WM( EA,B ); } /* RES 1,B=(XY+o) */
2016 OP(xycb,89) { C = RES(1, RM(EA) ); WM( EA,C ); } /* RES 1,C=(XY+o) */
2017 OP(xycb,8a) { D = RES(1, RM(EA) ); WM( EA,D ); } /* RES 1,D=(XY+o) */
2018 OP(xycb,8b) { E = RES(1, RM(EA) ); WM( EA,E ); } /* RES 1,E=(XY+o) */
2019 OP(xycb,8c) { H = RES(1, RM(EA) ); WM( EA,H ); } /* RES 1,H=(XY+o) */
2020 OP(xycb,8d) { L = RES(1, RM(EA) ); WM( EA,L ); } /* RES 1,L=(XY+o) */
2021 OP(xycb,8e) { WM( EA, RES(1,RM(EA)) ); } /* RES 1,(XY+o) */
2022 OP(xycb,8f) { A = RES(1, RM(EA) ); WM( EA,A ); } /* RES 1,A=(XY+o) */
2023
2024 OP(xycb,90) { B = RES(2, RM(EA) ); WM( EA,B ); } /* RES 2,B=(XY+o) */
2025 OP(xycb,91) { C = RES(2, RM(EA) ); WM( EA,C ); } /* RES 2,C=(XY+o) */
2026 OP(xycb,92) { D = RES(2, RM(EA) ); WM( EA,D ); } /* RES 2,D=(XY+o) */
2027 OP(xycb,93) { E = RES(2, RM(EA) ); WM( EA,E ); } /* RES 2,E=(XY+o) */
2028 OP(xycb,94) { H = RES(2, RM(EA) ); WM( EA,H ); } /* RES 2,H=(XY+o) */
2029 OP(xycb,95) { L = RES(2, RM(EA) ); WM( EA,L ); } /* RES 2,L=(XY+o) */
2030 OP(xycb,96) { WM( EA, RES(2,RM(EA)) ); } /* RES 2,(XY+o) */
2031 OP(xycb,97) { A = RES(2, RM(EA) ); WM( EA,A ); } /* RES 2,A=(XY+o) */
2032
2033 OP(xycb,98) { B = RES(3, RM(EA) ); WM( EA,B ); } /* RES 3,B=(XY+o) */
2034 OP(xycb,99) { C = RES(3, RM(EA) ); WM( EA,C ); } /* RES 3,C=(XY+o) */
2035 OP(xycb,9a) { D = RES(3, RM(EA) ); WM( EA,D ); } /* RES 3,D=(XY+o) */
2036 OP(xycb,9b) { E = RES(3, RM(EA) ); WM( EA,E ); } /* RES 3,E=(XY+o) */
2037 OP(xycb,9c) { H = RES(3, RM(EA) ); WM( EA,H ); } /* RES 3,H=(XY+o) */
2038 OP(xycb,9d) { L = RES(3, RM(EA) ); WM( EA,L ); } /* RES 3,L=(XY+o) */
2039 OP(xycb,9e) { WM( EA, RES(3,RM(EA)) ); } /* RES 3,(XY+o) */
2040 OP(xycb,9f) { A = RES(3, RM(EA) ); WM( EA,A ); } /* RES 3,A=(XY+o) */
2041
OP(xycb,a0)2042 OP(xycb,a0) { B = RES(4, RM(EA) ); WM( EA,B ); } /* RES 4,B=(XY+o) */
OP(xycb,a1)2043 OP(xycb,a1) { C = RES(4, RM(EA) ); WM( EA,C ); } /* RES 4,C=(XY+o) */
OP(xycb,a2)2044 OP(xycb,a2) { D = RES(4, RM(EA) ); WM( EA,D ); } /* RES 4,D=(XY+o) */
OP(xycb,a3)2045 OP(xycb,a3) { E = RES(4, RM(EA) ); WM( EA,E ); } /* RES 4,E=(XY+o) */
OP(xycb,a4)2046 OP(xycb,a4) { H = RES(4, RM(EA) ); WM( EA,H ); } /* RES 4,H=(XY+o) */
OP(xycb,a5)2047 OP(xycb,a5) { L = RES(4, RM(EA) ); WM( EA,L ); } /* RES 4,L=(XY+o) */
OP(xycb,a6)2048 OP(xycb,a6) { WM( EA, RES(4,RM(EA)) ); } /* RES 4,(XY+o) */
OP(xycb,a7)2049 OP(xycb,a7) { A = RES(4, RM(EA) ); WM( EA,A ); } /* RES 4,A=(XY+o) */
2050
OP(xycb,a8)2051 OP(xycb,a8) { B = RES(5, RM(EA) ); WM( EA,B ); } /* RES 5,B=(XY+o) */
OP(xycb,a9)2052 OP(xycb,a9) { C = RES(5, RM(EA) ); WM( EA,C ); } /* RES 5,C=(XY+o) */
OP(xycb,aa)2053 OP(xycb,aa) { D = RES(5, RM(EA) ); WM( EA,D ); } /* RES 5,D=(XY+o) */
OP(xycb,ab)2054 OP(xycb,ab) { E = RES(5, RM(EA) ); WM( EA,E ); } /* RES 5,E=(XY+o) */
OP(xycb,ac)2055 OP(xycb,ac) { H = RES(5, RM(EA) ); WM( EA,H ); } /* RES 5,H=(XY+o) */
OP(xycb,ad)2056 OP(xycb,ad) { L = RES(5, RM(EA) ); WM( EA,L ); } /* RES 5,L=(XY+o) */
OP(xycb,ae)2057 OP(xycb,ae) { WM( EA, RES(5,RM(EA)) ); } /* RES 5,(XY+o) */
OP(xycb,af)2058 OP(xycb,af) { A = RES(5, RM(EA) ); WM( EA,A ); } /* RES 5,A=(XY+o) */
2059
OP(xycb,b0)2060 OP(xycb,b0) { B = RES(6, RM(EA) ); WM( EA,B ); } /* RES 6,B=(XY+o) */
OP(xycb,b1)2061 OP(xycb,b1) { C = RES(6, RM(EA) ); WM( EA,C ); } /* RES 6,C=(XY+o) */
OP(xycb,b2)2062 OP(xycb,b2) { D = RES(6, RM(EA) ); WM( EA,D ); } /* RES 6,D=(XY+o) */
OP(xycb,b3)2063 OP(xycb,b3) { E = RES(6, RM(EA) ); WM( EA,E ); } /* RES 6,E=(XY+o) */
OP(xycb,b4)2064 OP(xycb,b4) { H = RES(6, RM(EA) ); WM( EA,H ); } /* RES 6,H=(XY+o) */
OP(xycb,b5)2065 OP(xycb,b5) { L = RES(6, RM(EA) ); WM( EA,L ); } /* RES 6,L=(XY+o) */
OP(xycb,b6)2066 OP(xycb,b6) { WM( EA, RES(6,RM(EA)) ); } /* RES 6,(XY+o) */
OP(xycb,b7)2067 OP(xycb,b7) { A = RES(6, RM(EA) ); WM( EA,A ); } /* RES 6,A=(XY+o) */
2068
OP(xycb,b8)2069 OP(xycb,b8) { B = RES(7, RM(EA) ); WM( EA,B ); } /* RES 7,B=(XY+o) */
OP(xycb,b9)2070 OP(xycb,b9) { C = RES(7, RM(EA) ); WM( EA,C ); } /* RES 7,C=(XY+o) */
OP(xycb,ba)2071 OP(xycb,ba) { D = RES(7, RM(EA) ); WM( EA,D ); } /* RES 7,D=(XY+o) */
OP(xycb,bb)2072 OP(xycb,bb) { E = RES(7, RM(EA) ); WM( EA,E ); } /* RES 7,E=(XY+o) */
OP(xycb,bc)2073 OP(xycb,bc) { H = RES(7, RM(EA) ); WM( EA,H ); } /* RES 7,H=(XY+o) */
OP(xycb,bd)2074 OP(xycb,bd) { L = RES(7, RM(EA) ); WM( EA,L ); } /* RES 7,L=(XY+o) */
OP(xycb,be)2075 OP(xycb,be) { WM( EA, RES(7,RM(EA)) ); } /* RES 7,(XY+o) */
OP(xycb,bf)2076 OP(xycb,bf) { A = RES(7, RM(EA) ); WM( EA,A ); } /* RES 7,A=(XY+o) */
2077
OP(xycb,c0)2078 OP(xycb,c0) { B = SET(0, RM(EA) ); WM( EA,B ); } /* SET 0,B=(XY+o) */
OP(xycb,c1)2079 OP(xycb,c1) { C = SET(0, RM(EA) ); WM( EA,C ); } /* SET 0,C=(XY+o) */
OP(xycb,c2)2080 OP(xycb,c2) { D = SET(0, RM(EA) ); WM( EA,D ); } /* SET 0,D=(XY+o) */
OP(xycb,c3)2081 OP(xycb,c3) { E = SET(0, RM(EA) ); WM( EA,E ); } /* SET 0,E=(XY+o) */
OP(xycb,c4)2082 OP(xycb,c4) { H = SET(0, RM(EA) ); WM( EA,H ); } /* SET 0,H=(XY+o) */
OP(xycb,c5)2083 OP(xycb,c5) { L = SET(0, RM(EA) ); WM( EA,L ); } /* SET 0,L=(XY+o) */
OP(xycb,c6)2084 OP(xycb,c6) { WM( EA, SET(0,RM(EA)) ); } /* SET 0,(XY+o) */
OP(xycb,c7)2085 OP(xycb,c7) { A = SET(0, RM(EA) ); WM( EA,A ); } /* SET 0,A=(XY+o) */
2086
OP(xycb,c8)2087 OP(xycb,c8) { B = SET(1, RM(EA) ); WM( EA,B ); } /* SET 1,B=(XY+o) */
OP(xycb,c9)2088 OP(xycb,c9) { C = SET(1, RM(EA) ); WM( EA,C ); } /* SET 1,C=(XY+o) */
OP(xycb,ca)2089 OP(xycb,ca) { D = SET(1, RM(EA) ); WM( EA,D ); } /* SET 1,D=(XY+o) */
OP(xycb,cb)2090 OP(xycb,cb) { E = SET(1, RM(EA) ); WM( EA,E ); } /* SET 1,E=(XY+o) */
OP(xycb,cc)2091 OP(xycb,cc) { H = SET(1, RM(EA) ); WM( EA,H ); } /* SET 1,H=(XY+o) */
OP(xycb,cd)2092 OP(xycb,cd) { L = SET(1, RM(EA) ); WM( EA,L ); } /* SET 1,L=(XY+o) */
OP(xycb,ce)2093 OP(xycb,ce) { WM( EA, SET(1,RM(EA)) ); } /* SET 1,(XY+o) */
OP(xycb,cf)2094 OP(xycb,cf) { A = SET(1, RM(EA) ); WM( EA,A ); } /* SET 1,A=(XY+o) */
2095
OP(xycb,d0)2096 OP(xycb,d0) { B = SET(2, RM(EA) ); WM( EA,B ); } /* SET 2,B=(XY+o) */
OP(xycb,d1)2097 OP(xycb,d1) { C = SET(2, RM(EA) ); WM( EA,C ); } /* SET 2,C=(XY+o) */
OP(xycb,d2)2098 OP(xycb,d2) { D = SET(2, RM(EA) ); WM( EA,D ); } /* SET 2,D=(XY+o) */
OP(xycb,d3)2099 OP(xycb,d3) { E = SET(2, RM(EA) ); WM( EA,E ); } /* SET 2,E=(XY+o) */
OP(xycb,d4)2100 OP(xycb,d4) { H = SET(2, RM(EA) ); WM( EA,H ); } /* SET 2,H=(XY+o) */
OP(xycb,d5)2101 OP(xycb,d5) { L = SET(2, RM(EA) ); WM( EA,L ); } /* SET 2,L=(XY+o) */
OP(xycb,d6)2102 OP(xycb,d6) { WM( EA, SET(2,RM(EA)) ); } /* SET 2,(XY+o) */
OP(xycb,d7)2103 OP(xycb,d7) { A = SET(2, RM(EA) ); WM( EA,A ); } /* SET 2,A=(XY+o) */
2104
OP(xycb,d8)2105 OP(xycb,d8) { B = SET(3, RM(EA) ); WM( EA,B ); } /* SET 3,B=(XY+o) */
OP(xycb,d9)2106 OP(xycb,d9) { C = SET(3, RM(EA) ); WM( EA,C ); } /* SET 3,C=(XY+o) */
OP(xycb,da)2107 OP(xycb,da) { D = SET(3, RM(EA) ); WM( EA,D ); } /* SET 3,D=(XY+o) */
OP(xycb,db)2108 OP(xycb,db) { E = SET(3, RM(EA) ); WM( EA,E ); } /* SET 3,E=(XY+o) */
OP(xycb,dc)2109 OP(xycb,dc) { H = SET(3, RM(EA) ); WM( EA,H ); } /* SET 3,H=(XY+o) */
OP(xycb,dd)2110 OP(xycb,dd) { L = SET(3, RM(EA) ); WM( EA,L ); } /* SET 3,L=(XY+o) */
OP(xycb,de)2111 OP(xycb,de) { WM( EA, SET(3,RM(EA)) ); } /* SET 3,(XY+o) */
OP(xycb,df)2112 OP(xycb,df) { A = SET(3, RM(EA) ); WM( EA,A ); } /* SET 3,A=(XY+o) */
2113
OP(xycb,e0)2114 OP(xycb,e0) { B = SET(4, RM(EA) ); WM( EA,B ); } /* SET 4,B=(XY+o) */
OP(xycb,e1)2115 OP(xycb,e1) { C = SET(4, RM(EA) ); WM( EA,C ); } /* SET 4,C=(XY+o) */
OP(xycb,e2)2116 OP(xycb,e2) { D = SET(4, RM(EA) ); WM( EA,D ); } /* SET 4,D=(XY+o) */
OP(xycb,e3)2117 OP(xycb,e3) { E = SET(4, RM(EA) ); WM( EA,E ); } /* SET 4,E=(XY+o) */
OP(xycb,e4)2118 OP(xycb,e4) { H = SET(4, RM(EA) ); WM( EA,H ); } /* SET 4,H=(XY+o) */
OP(xycb,e5)2119 OP(xycb,e5) { L = SET(4, RM(EA) ); WM( EA,L ); } /* SET 4,L=(XY+o) */
OP(xycb,e6)2120 OP(xycb,e6) { WM( EA, SET(4,RM(EA)) ); } /* SET 4,(XY+o) */
OP(xycb,e7)2121 OP(xycb,e7) { A = SET(4, RM(EA) ); WM( EA,A ); } /* SET 4,A=(XY+o) */
2122
OP(xycb,e8)2123 OP(xycb,e8) { B = SET(5, RM(EA) ); WM( EA,B ); } /* SET 5,B=(XY+o) */
OP(xycb,e9)2124 OP(xycb,e9) { C = SET(5, RM(EA) ); WM( EA,C ); } /* SET 5,C=(XY+o) */
OP(xycb,ea)2125 OP(xycb,ea) { D = SET(5, RM(EA) ); WM( EA,D ); } /* SET 5,D=(XY+o) */
OP(xycb,eb)2126 OP(xycb,eb) { E = SET(5, RM(EA) ); WM( EA,E ); } /* SET 5,E=(XY+o) */
OP(xycb,ec)2127 OP(xycb,ec) { H = SET(5, RM(EA) ); WM( EA,H ); } /* SET 5,H=(XY+o) */
OP(xycb,ed)2128 OP(xycb,ed) { L = SET(5, RM(EA) ); WM( EA,L ); } /* SET 5,L=(XY+o) */
OP(xycb,ee)2129 OP(xycb,ee) { WM( EA, SET(5,RM(EA)) ); } /* SET 5,(XY+o) */
OP(xycb,ef)2130 OP(xycb,ef) { A = SET(5, RM(EA) ); WM( EA,A ); } /* SET 5,A=(XY+o) */
2131
OP(xycb,f0)2132 OP(xycb,f0) { B = SET(6, RM(EA) ); WM( EA,B ); } /* SET 6,B=(XY+o) */
OP(xycb,f1)2133 OP(xycb,f1) { C = SET(6, RM(EA) ); WM( EA,C ); } /* SET 6,C=(XY+o) */
OP(xycb,f2)2134 OP(xycb,f2) { D = SET(6, RM(EA) ); WM( EA,D ); } /* SET 6,D=(XY+o) */
OP(xycb,f3)2135 OP(xycb,f3) { E = SET(6, RM(EA) ); WM( EA,E ); } /* SET 6,E=(XY+o) */
OP(xycb,f4)2136 OP(xycb,f4) { H = SET(6, RM(EA) ); WM( EA,H ); } /* SET 6,H=(XY+o) */
OP(xycb,f5)2137 OP(xycb,f5) { L = SET(6, RM(EA) ); WM( EA,L ); } /* SET 6,L=(XY+o) */
OP(xycb,f6)2138 OP(xycb,f6) { WM( EA, SET(6,RM(EA)) ); } /* SET 6,(XY+o) */
OP(xycb,f7)2139 OP(xycb,f7) { A = SET(6, RM(EA) ); WM( EA,A ); } /* SET 6,A=(XY+o) */
2140
OP(xycb,f8)2141 OP(xycb,f8) { B = SET(7, RM(EA) ); WM( EA,B ); } /* SET 7,B=(XY+o) */
OP(xycb,f9)2142 OP(xycb,f9) { C = SET(7, RM(EA) ); WM( EA,C ); } /* SET 7,C=(XY+o) */
OP(xycb,fa)2143 OP(xycb,fa) { D = SET(7, RM(EA) ); WM( EA,D ); } /* SET 7,D=(XY+o) */
OP(xycb,fb)2144 OP(xycb,fb) { E = SET(7, RM(EA) ); WM( EA,E ); } /* SET 7,E=(XY+o) */
OP(xycb,fc)2145 OP(xycb,fc) { H = SET(7, RM(EA) ); WM( EA,H ); } /* SET 7,H=(XY+o) */
OP(xycb,fd)2146 OP(xycb,fd) { L = SET(7, RM(EA) ); WM( EA,L ); } /* SET 7,L=(XY+o) */
OP(xycb,fe)2147 OP(xycb,fe) { WM( EA, SET(7,RM(EA)) ); } /* SET 7,(XY+o) */
OP(xycb,ff)2148 OP(xycb,ff) { A = SET(7, RM(EA) ); WM( EA,A ); } /* SET 7,A=(XY+o) */
2149
2150 OP(illegal,1) {
2151 // logerror("Z80 #%d ill. opcode $%02x $%02x\n",
2152 // cpu_getactivecpu(), cpu_readop((PCD-1)&0xffff), cpu_readop(PCD));
2153 }
2154
2155 /**********************************************************
2156 * IX register related opcodes (DD prefix)
2157 **********************************************************/
2158 OP(dd,00) { illegal_1(); op_00(); } /* DB DD */
2159 OP(dd,01) { illegal_1(); op_01(); } /* DB DD */
2160 OP(dd,02) { illegal_1(); op_02(); } /* DB DD */
2161 OP(dd,03) { illegal_1(); op_03(); } /* DB DD */
2162 OP(dd,04) { illegal_1(); op_04(); } /* DB DD */
2163 OP(dd,05) { illegal_1(); op_05(); } /* DB DD */
2164 OP(dd,06) { illegal_1(); op_06(); } /* DB DD */
2165 OP(dd,07) { illegal_1(); op_07(); } /* DB DD */
2166
2167 OP(dd,08) { illegal_1(); op_08(); } /* DB DD */
2168 OP(dd,09) { ADD16(ix,bc); } /* ADD IX,BC */
2169 OP(dd,0a) { illegal_1(); op_0a(); } /* DB DD */
2170 OP(dd,0b) { illegal_1(); op_0b(); } /* DB DD */
2171 OP(dd,0c) { illegal_1(); op_0c(); } /* DB DD */
2172 OP(dd,0d) { illegal_1(); op_0d(); } /* DB DD */
2173 OP(dd,0e) { illegal_1(); op_0e(); } /* DB DD */
2174 OP(dd,0f) { illegal_1(); op_0f(); } /* DB DD */
2175
2176 OP(dd,10) { illegal_1(); op_10(); } /* DB DD */
2177 OP(dd,11) { illegal_1(); op_11(); } /* DB DD */
2178 OP(dd,12) { illegal_1(); op_12(); } /* DB DD */
2179 OP(dd,13) { illegal_1(); op_13(); } /* DB DD */
2180 OP(dd,14) { illegal_1(); op_14(); } /* DB DD */
2181 OP(dd,15) { illegal_1(); op_15(); } /* DB DD */
2182 OP(dd,16) { illegal_1(); op_16(); } /* DB DD */
2183 OP(dd,17) { illegal_1(); op_17(); } /* DB DD */
2184
2185 OP(dd,18) { illegal_1(); op_18(); } /* DB DD */
2186 OP(dd,19) { ADD16(ix,de); } /* ADD IX,DE */
2187 OP(dd,1a) { illegal_1(); op_1a(); } /* DB DD */
2188 OP(dd,1b) { illegal_1(); op_1b(); } /* DB DD */
2189 OP(dd,1c) { illegal_1(); op_1c(); } /* DB DD */
2190 OP(dd,1d) { illegal_1(); op_1d(); } /* DB DD */
2191 OP(dd,1e) { illegal_1(); op_1e(); } /* DB DD */
2192 OP(dd,1f) { illegal_1(); op_1f(); } /* DB DD */
2193
2194 OP(dd,20) { illegal_1(); op_20(); } /* DB DD */
2195 OP(dd,21) { IX = ARG16(); } /* LD IX,w */
2196 OP(dd,22) { EA = ARG16(); WM16( EA, &Z80.ix ); WZ = EA + 1;} /* LD (w),IX */
2197 OP(dd,23) { IX++; } /* INC IX */
2198 OP(dd,24) { HX = INC(HX); } /* INC HX */
2199 OP(dd,25) { HX = DEC(HX); } /* DEC HX */
2200 OP(dd,26) { HX = ARG(); } /* LD HX,n */
2201 OP(dd,27) { illegal_1(); op_27(); } /* DB DD */
2202
2203 OP(dd,28) { illegal_1(); op_28(); } /* DB DD */
2204 OP(dd,29) { ADD16(ix,ix); } /* ADD IX,IX */
2205 OP(dd,2a) { EA = ARG16(); RM16( EA, &Z80.ix ); WZ = EA + 1;} /* LD IX,(w) */
2206 OP(dd,2b) { IX--; } /* DEC IX */
2207 OP(dd,2c) { LX = INC(LX); } /* INC LX */
2208 OP(dd,2d) { LX = DEC(LX); } /* DEC LX */
2209 OP(dd,2e) { LX = ARG(); } /* LD LX,n */
2210 OP(dd,2f) { illegal_1(); op_2f(); } /* DB DD */
2211
2212 OP(dd,30) { illegal_1(); op_30(); } /* DB DD */
2213 OP(dd,31) { illegal_1(); op_31(); } /* DB DD */
2214 OP(dd,32) { illegal_1(); op_32(); } /* DB DD */
2215 OP(dd,33) { illegal_1(); op_33(); } /* DB DD */
2216 OP(dd,34) { EAX; WM( EA, INC(RM(EA)) ); } /* INC (IX+o) */
2217 OP(dd,35) { EAX; WM( EA, DEC(RM(EA)) ); } /* DEC (IX+o) */
2218 OP(dd,36) { EAX; WM( EA, ARG() ); } /* LD (IX+o),n */
2219 OP(dd,37) { illegal_1(); op_37(); } /* DB DD */
2220
2221 OP(dd,38) { illegal_1(); op_38(); } /* DB DD */
2222 OP(dd,39) { ADD16(ix,sp); } /* ADD IX,SP */
2223 OP(dd,3a) { illegal_1(); op_3a(); } /* DB DD */
2224 OP(dd,3b) { illegal_1(); op_3b(); } /* DB DD */
2225 OP(dd,3c) { illegal_1(); op_3c(); } /* DB DD */
2226 OP(dd,3d) { illegal_1(); op_3d(); } /* DB DD */
2227 OP(dd,3e) { illegal_1(); op_3e(); } /* DB DD */
2228 OP(dd,3f) { illegal_1(); op_3f(); } /* DB DD */
2229
2230 OP(dd,40) { illegal_1(); op_40(); } /* DB DD */
2231 OP(dd,41) { illegal_1(); op_41(); } /* DB DD */
2232 OP(dd,42) { illegal_1(); op_42(); } /* DB DD */
2233 OP(dd,43) { illegal_1(); op_43(); } /* DB DD */
2234 OP(dd,44) { B = HX; } /* LD B,HX */
2235 OP(dd,45) { B = LX; } /* LD B,LX */
2236 OP(dd,46) { EAX; B = RM(EA); } /* LD B,(IX+o) */
2237 OP(dd,47) { illegal_1(); op_47(); } /* DB DD */
2238
2239 OP(dd,48) { illegal_1(); op_48(); } /* DB DD */
2240 OP(dd,49) { illegal_1(); op_49(); } /* DB DD */
2241 OP(dd,4a) { illegal_1(); op_4a(); } /* DB DD */
2242 OP(dd,4b) { illegal_1(); op_4b(); } /* DB DD */
2243 OP(dd,4c) { C = HX; } /* LD C,HX */
2244 OP(dd,4d) { C = LX; } /* LD C,LX */
2245 OP(dd,4e) { EAX; C = RM(EA); } /* LD C,(IX+o) */
2246 OP(dd,4f) { illegal_1(); op_4f(); } /* DB DD */
2247
2248 OP(dd,50) { illegal_1(); op_50(); } /* DB DD */
2249 OP(dd,51) { illegal_1(); op_51(); } /* DB DD */
2250 OP(dd,52) { illegal_1(); op_52(); } /* DB DD */
2251 OP(dd,53) { illegal_1(); op_53(); } /* DB DD */
2252 OP(dd,54) { D = HX; } /* LD D,HX */
2253 OP(dd,55) { D = LX; } /* LD D,LX */
2254 OP(dd,56) { EAX; D = RM(EA); } /* LD D,(IX+o) */
2255 OP(dd,57) { illegal_1(); op_57(); } /* DB DD */
2256
2257 OP(dd,58) { illegal_1(); op_58(); } /* DB DD */
2258 OP(dd,59) { illegal_1(); op_59(); } /* DB DD */
2259 OP(dd,5a) { illegal_1(); op_5a(); } /* DB DD */
2260 OP(dd,5b) { illegal_1(); op_5b(); } /* DB DD */
2261 OP(dd,5c) { E = HX; } /* LD E,HX */
2262 OP(dd,5d) { E = LX; } /* LD E,LX */
2263 OP(dd,5e) { EAX; E = RM(EA); } /* LD E,(IX+o) */
2264 OP(dd,5f) { illegal_1(); op_5f(); } /* DB DD */
2265
2266 OP(dd,60) { HX = B; } /* LD HX,B */
2267 OP(dd,61) { HX = C; } /* LD HX,C */
2268 OP(dd,62) { HX = D; } /* LD HX,D */
2269 OP(dd,63) { HX = E; } /* LD HX,E */
2270 OP(dd,64) { } /* LD HX,HX */
2271 OP(dd,65) { HX = LX; } /* LD HX,LX */
2272 OP(dd,66) { EAX; H = RM(EA); } /* LD H,(IX+o) */
2273 OP(dd,67) { HX = A; } /* LD HX,A */
2274
2275 OP(dd,68) { LX = B; } /* LD LX,B */
2276 OP(dd,69) { LX = C; } /* LD LX,C */
2277 OP(dd,6a) { LX = D; } /* LD LX,D */
2278 OP(dd,6b) { LX = E; } /* LD LX,E */
2279 OP(dd,6c) { LX = HX; } /* LD LX,HX */
2280 OP(dd,6d) { } /* LD LX,LX */
2281 OP(dd,6e) { EAX; L = RM(EA); } /* LD L,(IX+o) */
2282 OP(dd,6f) { LX = A; } /* LD LX,A */
2283
2284 OP(dd,70) { EAX; WM( EA, B ); } /* LD (IX+o),B */
2285 OP(dd,71) { EAX; WM( EA, C ); } /* LD (IX+o),C */
2286 OP(dd,72) { EAX; WM( EA, D ); } /* LD (IX+o),D */
2287 OP(dd,73) { EAX; WM( EA, E ); } /* LD (IX+o),E */
2288 OP(dd,74) { EAX; WM( EA, H ); } /* LD (IX+o),H */
2289 OP(dd,75) { EAX; WM( EA, L ); } /* LD (IX+o),L */
2290 OP(dd,76) { illegal_1(); op_76(); } /* DB DD */
2291 OP(dd,77) { EAX; WM( EA, A ); } /* LD (IX+o),A */
2292
2293 OP(dd,78) { illegal_1(); op_78(); } /* DB DD */
2294 OP(dd,79) { illegal_1(); op_79(); } /* DB DD */
2295 OP(dd,7a) { illegal_1(); op_7a(); } /* DB DD */
2296 OP(dd,7b) { illegal_1(); op_7b(); } /* DB DD */
2297 OP(dd,7c) { A = HX; } /* LD A,HX */
2298 OP(dd,7d) { A = LX; } /* LD A,LX */
2299 OP(dd,7e) { EAX; A = RM(EA); } /* LD A,(IX+o) */
2300 OP(dd,7f) { illegal_1(); op_7f(); } /* DB DD */
2301
2302 OP(dd,80) { illegal_1(); op_80(); } /* DB DD */
2303 OP(dd,81) { illegal_1(); op_81(); } /* DB DD */
2304 OP(dd,82) { illegal_1(); op_82(); } /* DB DD */
2305 OP(dd,83) { illegal_1(); op_83(); } /* DB DD */
2306 OP(dd,84) { ADD(HX); } /* ADD A,HX */
2307 OP(dd,85) { ADD(LX); } /* ADD A,LX */
2308 OP(dd,86) { EAX; ADD(RM(EA)); } /* ADD A,(IX+o) */
2309 OP(dd,87) { illegal_1(); op_87(); } /* DB DD */
2310
2311 OP(dd,88) { illegal_1(); op_88(); } /* DB DD */
2312 OP(dd,89) { illegal_1(); op_89(); } /* DB DD */
2313 OP(dd,8a) { illegal_1(); op_8a(); } /* DB DD */
2314 OP(dd,8b) { illegal_1(); op_8b(); } /* DB DD */
2315 OP(dd,8c) { ADC(HX); } /* ADC A,HX */
2316 OP(dd,8d) { ADC(LX); } /* ADC A,LX */
2317 OP(dd,8e) { EAX; ADC(RM(EA)); } /* ADC A,(IX+o) */
2318 OP(dd,8f) { illegal_1(); op_8f(); } /* DB DD */
2319
2320 OP(dd,90) { illegal_1(); op_90(); } /* DB DD */
2321 OP(dd,91) { illegal_1(); op_91(); } /* DB DD */
2322 OP(dd,92) { illegal_1(); op_92(); } /* DB DD */
2323 OP(dd,93) { illegal_1(); op_93(); } /* DB DD */
2324 OP(dd,94) { SUB(HX); } /* SUB HX */
2325 OP(dd,95) { SUB(LX); } /* SUB LX */
2326 OP(dd,96) { EAX; SUB(RM(EA)); } /* SUB (IX+o) */
2327 OP(dd,97) { illegal_1(); op_97(); } /* DB DD */
2328
2329 OP(dd,98) { illegal_1(); op_98(); } /* DB DD */
2330 OP(dd,99) { illegal_1(); op_99(); } /* DB DD */
2331 OP(dd,9a) { illegal_1(); op_9a(); } /* DB DD */
2332 OP(dd,9b) { illegal_1(); op_9b(); } /* DB DD */
2333 OP(dd,9c) { SBC(HX); } /* SBC A,HX */
2334 OP(dd,9d) { SBC(LX); } /* SBC A,LX */
2335 OP(dd,9e) { EAX; SBC(RM(EA)); } /* SBC A,(IX+o) */
2336 OP(dd,9f) { illegal_1(); op_9f(); } /* DB DD */
2337
OP(dd,a0)2338 OP(dd,a0) { illegal_1(); op_a0(); } /* DB DD */
OP(dd,a1)2339 OP(dd,a1) { illegal_1(); op_a1(); } /* DB DD */
OP(dd,a2)2340 OP(dd,a2) { illegal_1(); op_a2(); } /* DB DD */
OP(dd,a3)2341 OP(dd,a3) { illegal_1(); op_a3(); } /* DB DD */
OP(dd,a4)2342 OP(dd,a4) { AND(HX); } /* AND HX */
OP(dd,a5)2343 OP(dd,a5) { AND(LX); } /* AND LX */
OP(dd,a6)2344 OP(dd,a6) { EAX; AND(RM(EA)); } /* AND (IX+o) */
OP(dd,a7)2345 OP(dd,a7) { illegal_1(); op_a7(); } /* DB DD */
2346
OP(dd,a8)2347 OP(dd,a8) { illegal_1(); op_a8(); } /* DB DD */
OP(dd,a9)2348 OP(dd,a9) { illegal_1(); op_a9(); } /* DB DD */
OP(dd,aa)2349 OP(dd,aa) { illegal_1(); op_aa(); } /* DB DD */
OP(dd,ab)2350 OP(dd,ab) { illegal_1(); op_ab(); } /* DB DD */
OP(dd,ac)2351 OP(dd,ac) { XOR(HX); } /* XOR HX */
OP(dd,ad)2352 OP(dd,ad) { XOR(LX); } /* XOR LX */
OP(dd,ae)2353 OP(dd,ae) { EAX; XOR(RM(EA)); } /* XOR (IX+o) */
OP(dd,af)2354 OP(dd,af) { illegal_1(); op_af(); } /* DB DD */
2355
OP(dd,b0)2356 OP(dd,b0) { illegal_1(); op_b0(); } /* DB DD */
OP(dd,b1)2357 OP(dd,b1) { illegal_1(); op_b1(); } /* DB DD */
OP(dd,b2)2358 OP(dd,b2) { illegal_1(); op_b2(); } /* DB DD */
OP(dd,b3)2359 OP(dd,b3) { illegal_1(); op_b3(); } /* DB DD */
OP(dd,b4)2360 OP(dd,b4) { OR(HX); } /* OR HX */
OP(dd,b5)2361 OP(dd,b5) { OR(LX); } /* OR LX */
OP(dd,b6)2362 OP(dd,b6) { EAX; OR(RM(EA)); } /* OR (IX+o) */
OP(dd,b7)2363 OP(dd,b7) { illegal_1(); op_b7(); } /* DB DD */
2364
OP(dd,b8)2365 OP(dd,b8) { illegal_1(); op_b8(); } /* DB DD */
OP(dd,b9)2366 OP(dd,b9) { illegal_1(); op_b9(); } /* DB DD */
OP(dd,ba)2367 OP(dd,ba) { illegal_1(); op_ba(); } /* DB DD */
OP(dd,bb)2368 OP(dd,bb) { illegal_1(); op_bb(); } /* DB DD */
OP(dd,bc)2369 OP(dd,bc) { CP(HX); } /* CP HX */
OP(dd,bd)2370 OP(dd,bd) { CP(LX); } /* CP LX */
OP(dd,be)2371 OP(dd,be) { EAX; CP(RM(EA)); } /* CP (IX+o) */
OP(dd,bf)2372 OP(dd,bf) { illegal_1(); op_bf(); } /* DB DD */
2373
OP(dd,c0)2374 OP(dd,c0) { illegal_1(); op_c0(); } /* DB DD */
OP(dd,c1)2375 OP(dd,c1) { illegal_1(); op_c1(); } /* DB DD */
OP(dd,c2)2376 OP(dd,c2) { illegal_1(); op_c2(); } /* DB DD */
OP(dd,c3)2377 OP(dd,c3) { illegal_1(); op_c3(); } /* DB DD */
OP(dd,c4)2378 OP(dd,c4) { illegal_1(); op_c4(); } /* DB DD */
OP(dd,c5)2379 OP(dd,c5) { illegal_1(); op_c5(); } /* DB DD */
OP(dd,c6)2380 OP(dd,c6) { illegal_1(); op_c6(); } /* DB DD */
OP(dd,c7)2381 OP(dd,c7) { illegal_1(); op_c7(); } /* DB DD */
2382
OP(dd,c8)2383 OP(dd,c8) { illegal_1(); op_c8(); } /* DB DD */
OP(dd,c9)2384 OP(dd,c9) { illegal_1(); op_c9(); } /* DB DD */
OP(dd,ca)2385 OP(dd,ca) { illegal_1(); op_ca(); } /* DB DD */
OP(dd,cb)2386 OP(dd,cb) { EAX; EXEC(xycb,ARG()); } /* ** DD CB xx */
OP(dd,cc)2387 OP(dd,cc) { illegal_1(); op_cc(); } /* DB DD */
OP(dd,cd)2388 OP(dd,cd) { illegal_1(); op_cd(); } /* DB DD */
OP(dd,ce)2389 OP(dd,ce) { illegal_1(); op_ce(); } /* DB DD */
OP(dd,cf)2390 OP(dd,cf) { illegal_1(); op_cf(); } /* DB DD */
2391
OP(dd,d0)2392 OP(dd,d0) { illegal_1(); op_d0(); } /* DB DD */
OP(dd,d1)2393 OP(dd,d1) { illegal_1(); op_d1(); } /* DB DD */
OP(dd,d2)2394 OP(dd,d2) { illegal_1(); op_d2(); } /* DB DD */
OP(dd,d3)2395 OP(dd,d3) { illegal_1(); op_d3(); } /* DB DD */
OP(dd,d4)2396 OP(dd,d4) { illegal_1(); op_d4(); } /* DB DD */
OP(dd,d5)2397 OP(dd,d5) { illegal_1(); op_d5(); } /* DB DD */
OP(dd,d6)2398 OP(dd,d6) { illegal_1(); op_d6(); } /* DB DD */
OP(dd,d7)2399 OP(dd,d7) { illegal_1(); op_d7(); } /* DB DD */
2400
OP(dd,d8)2401 OP(dd,d8) { illegal_1(); op_d8(); } /* DB DD */
OP(dd,d9)2402 OP(dd,d9) { illegal_1(); op_d9(); } /* DB DD */
OP(dd,da)2403 OP(dd,da) { illegal_1(); op_da(); } /* DB DD */
OP(dd,db)2404 OP(dd,db) { illegal_1(); op_db(); } /* DB DD */
OP(dd,dc)2405 OP(dd,dc) { illegal_1(); op_dc(); } /* DB DD */
OP(dd,dd)2406 OP(dd,dd) { illegal_1(); op_dd(); } /* DB DD */
OP(dd,de)2407 OP(dd,de) { illegal_1(); op_de(); } /* DB DD */
OP(dd,df)2408 OP(dd,df) { illegal_1(); op_df(); } /* DB DD */
2409
OP(dd,e0)2410 OP(dd,e0) { illegal_1(); op_e0(); } /* DB DD */
OP(dd,e1)2411 OP(dd,e1) { POP( ix ); } /* POP IX */
OP(dd,e2)2412 OP(dd,e2) { illegal_1(); op_e2(); } /* DB DD */
OP(dd,e3)2413 OP(dd,e3) { EXSP( ix ); } /* EX (SP),IX */
OP(dd,e4)2414 OP(dd,e4) { illegal_1(); op_e4(); } /* DB DD */
OP(dd,e5)2415 OP(dd,e5) { PUSH( ix ); } /* PUSH IX */
OP(dd,e6)2416 OP(dd,e6) { illegal_1(); op_e6(); } /* DB DD */
OP(dd,e7)2417 OP(dd,e7) { illegal_1(); op_e7(); } /* DB DD */
2418
OP(dd,e8)2419 OP(dd,e8) { illegal_1(); op_e8(); } /* DB DD */
OP(dd,e9)2420 OP(dd,e9) { PC = IX; change_pc(PCD); } /* JP (IX) */
OP(dd,ea)2421 OP(dd,ea) { illegal_1(); op_ea(); } /* DB DD */
OP(dd,eb)2422 OP(dd,eb) { illegal_1(); op_eb(); } /* DB DD */
OP(dd,ec)2423 OP(dd,ec) { illegal_1(); op_ec(); } /* DB DD */
OP(dd,ed)2424 OP(dd,ed) { illegal_1(); op_ed(); } /* DB DD */
OP(dd,ee)2425 OP(dd,ee) { illegal_1(); op_ee(); } /* DB DD */
OP(dd,ef)2426 OP(dd,ef) { illegal_1(); op_ef(); } /* DB DD */
2427
OP(dd,f0)2428 OP(dd,f0) { illegal_1(); op_f0(); } /* DB DD */
OP(dd,f1)2429 OP(dd,f1) { illegal_1(); op_f1(); } /* DB DD */
OP(dd,f2)2430 OP(dd,f2) { illegal_1(); op_f2(); } /* DB DD */
OP(dd,f3)2431 OP(dd,f3) { illegal_1(); op_f3(); } /* DB DD */
OP(dd,f4)2432 OP(dd,f4) { illegal_1(); op_f4(); } /* DB DD */
OP(dd,f5)2433 OP(dd,f5) { illegal_1(); op_f5(); } /* DB DD */
OP(dd,f6)2434 OP(dd,f6) { illegal_1(); op_f6(); } /* DB DD */
OP(dd,f7)2435 OP(dd,f7) { illegal_1(); op_f7(); } /* DB DD */
2436
OP(dd,f8)2437 OP(dd,f8) { illegal_1(); op_f8(); } /* DB DD */
OP(dd,f9)2438 OP(dd,f9) { SP = IX; } /* LD SP,IX */
OP(dd,fa)2439 OP(dd,fa) { illegal_1(); op_fa(); } /* DB DD */
OP(dd,fb)2440 OP(dd,fb) { illegal_1(); op_fb(); } /* DB DD */
OP(dd,fc)2441