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 OP(dd,fc) { illegal_1(); op_fc();								} /* DB   DD          */
OP(dd,fd)2442 OP(dd,fd) { illegal_1(); op_fd();								} /* DB   DD          */
OP(dd,fe)2443 OP(dd,fe) { illegal_1(); op_fe();								} /* DB   DD          */
OP(dd,ff)2444 OP(dd,ff) { illegal_1(); op_ff();								} /* DB   DD          */
2445 
2446 /**********************************************************
2447  * IY register related opcodes (FD prefix)
2448  **********************************************************/
2449 OP(fd,00) { illegal_1(); op_00();								} /* DB   FD          */
2450 OP(fd,01) { illegal_1(); op_01();								} /* DB   FD          */
2451 OP(fd,02) { illegal_1(); op_02();								} /* DB   FD          */
2452 OP(fd,03) { illegal_1(); op_03();								} /* DB   FD          */
2453 OP(fd,04) { illegal_1(); op_04();								} /* DB   FD          */
2454 OP(fd,05) { illegal_1(); op_05();								} /* DB   FD          */
2455 OP(fd,06) { illegal_1(); op_06();								} /* DB   FD          */
2456 OP(fd,07) { illegal_1(); op_07();								} /* DB   FD          */
2457 
2458 OP(fd,08) { illegal_1(); op_08();								} /* DB   FD          */
2459 OP(fd,09) { ADD16(iy,bc);									} /* ADD  IY,BC       */
2460 OP(fd,0a) { illegal_1(); op_0a();								} /* DB   FD          */
2461 OP(fd,0b) { illegal_1(); op_0b();								} /* DB   FD          */
2462 OP(fd,0c) { illegal_1(); op_0c();								} /* DB   FD          */
2463 OP(fd,0d) { illegal_1(); op_0d();								} /* DB   FD          */
2464 OP(fd,0e) { illegal_1(); op_0e();								} /* DB   FD          */
2465 OP(fd,0f) { illegal_1(); op_0f();								} /* DB   FD          */
2466 
2467 OP(fd,10) { illegal_1(); op_10();								} /* DB   FD          */
2468 OP(fd,11) { illegal_1(); op_11();								} /* DB   FD          */
2469 OP(fd,12) { illegal_1(); op_12();								} /* DB   FD          */
2470 OP(fd,13) { illegal_1(); op_13();								} /* DB   FD          */
2471 OP(fd,14) { illegal_1(); op_14();								} /* DB   FD          */
2472 OP(fd,15) { illegal_1(); op_15();								} /* DB   FD          */
2473 OP(fd,16) { illegal_1(); op_16();								} /* DB   FD          */
2474 OP(fd,17) { illegal_1(); op_17();								} /* DB   FD          */
2475 
2476 OP(fd,18) { illegal_1(); op_18();								} /* DB   FD          */
2477 OP(fd,19) { ADD16(iy,de);									} /* ADD  IY,DE       */
2478 OP(fd,1a) { illegal_1(); op_1a();								} /* DB   FD          */
2479 OP(fd,1b) { illegal_1(); op_1b();								} /* DB   FD          */
2480 OP(fd,1c) { illegal_1(); op_1c();								} /* DB   FD          */
2481 OP(fd,1d) { illegal_1(); op_1d();								} /* DB   FD          */
2482 OP(fd,1e) { illegal_1(); op_1e();								} /* DB   FD          */
2483 OP(fd,1f) { illegal_1(); op_1f();								} /* DB   FD          */
2484 
2485 OP(fd,20) { illegal_1(); op_20();								} /* DB   FD          */
2486 OP(fd,21) { IY = ARG16();									} /* LD   IY,w        */
2487 OP(fd,22) { EA = ARG16(); WM16( EA, &Z80.iy );	WZ = EA + 1;			} /* LD   (w),IY      */
2488 OP(fd,23) { IY++;											} /* INC  IY          */
2489 OP(fd,24) { HY = INC(HY);									} /* INC  HY          */
2490 OP(fd,25) { HY = DEC(HY);									} /* DEC  HY          */
2491 OP(fd,26) { HY = ARG();									} /* LD   HY,n        */
2492 OP(fd,27) { illegal_1(); op_27();								} /* DB   FD          */
2493 
2494 OP(fd,28) { illegal_1(); op_28();								} /* DB   FD          */
2495 OP(fd,29) { ADD16(iy,iy);									} /* ADD  IY,IY       */
2496 OP(fd,2a) { EA = ARG16(); RM16( EA, &Z80.iy );	WZ = EA + 1;			} /* LD   IY,(w)      */
2497 OP(fd,2b) { IY--;											} /* DEC  IY          */
2498 OP(fd,2c) { LY = INC(LY);									} /* INC  LY          */
2499 OP(fd,2d) { LY = DEC(LY);									} /* DEC  LY          */
2500 OP(fd,2e) { LY = ARG();									} /* LD   LY,n        */
2501 OP(fd,2f) { illegal_1(); op_2f();								} /* DB   FD          */
2502 
2503 OP(fd,30) { illegal_1(); op_30();								} /* DB   FD          */
2504 OP(fd,31) { illegal_1(); op_31();								} /* DB   FD          */
2505 OP(fd,32) { illegal_1(); op_32();								} /* DB   FD          */
2506 OP(fd,33) { illegal_1(); op_33();								} /* DB   FD          */
2507 OP(fd,34) { EAY; WM( EA, INC(RM(EA)) );					} /* INC  (IY+o)      */
2508 OP(fd,35) { EAY; WM( EA, DEC(RM(EA)) );					} /* DEC  (IY+o)      */
2509 OP(fd,36) { EAY; WM( EA, ARG() );							} /* LD   (IY+o),n    */
2510 OP(fd,37) { illegal_1(); op_37();								} /* DB   FD          */
2511 
2512 OP(fd,38) { illegal_1(); op_38();								} /* DB   FD          */
2513 OP(fd,39) { ADD16(iy,sp);									} /* ADD  IY,SP       */
2514 OP(fd,3a) { illegal_1(); op_3a();								} /* DB   FD          */
2515 OP(fd,3b) { illegal_1(); op_3b();								} /* DB   FD          */
2516 OP(fd,3c) { illegal_1(); op_3c();								} /* DB   FD          */
2517 OP(fd,3d) { illegal_1(); op_3d();								} /* DB   FD          */
2518 OP(fd,3e) { illegal_1(); op_3e();								} /* DB   FD          */
2519 OP(fd,3f) { illegal_1(); op_3f();								} /* DB   FD          */
2520 
2521 OP(fd,40) { illegal_1(); op_40();								} /* DB   FD          */
2522 OP(fd,41) { illegal_1(); op_41();								} /* DB   FD          */
2523 OP(fd,42) { illegal_1(); op_42();								} /* DB   FD          */
2524 OP(fd,43) { illegal_1(); op_43();								} /* DB   FD          */
2525 OP(fd,44) { B = HY;										} /* LD   B,HY        */
2526 OP(fd,45) { B = LY;										} /* LD   B,LY        */
2527 OP(fd,46) { EAY; B = RM(EA);								} /* LD   B,(IY+o)    */
2528 OP(fd,47) { illegal_1(); op_47();								} /* DB   FD          */
2529 
2530 OP(fd,48) { illegal_1(); op_48();								} /* DB   FD          */
2531 OP(fd,49) { illegal_1(); op_49();								} /* DB   FD          */
2532 OP(fd,4a) { illegal_1(); op_4a();								} /* DB   FD          */
2533 OP(fd,4b) { illegal_1(); op_4b();								} /* DB   FD          */
2534 OP(fd,4c) { C = HY;										} /* LD   C,HY        */
2535 OP(fd,4d) { C = LY;										} /* LD   C,LY        */
2536 OP(fd,4e) { EAY; C = RM(EA);								} /* LD   C,(IY+o)    */
2537 OP(fd,4f) { illegal_1(); op_4f();								} /* DB   FD          */
2538 
2539 OP(fd,50) { illegal_1(); op_50();								} /* DB   FD          */
2540 OP(fd,51) { illegal_1(); op_51();								} /* DB   FD          */
2541 OP(fd,52) { illegal_1(); op_52();								} /* DB   FD          */
2542 OP(fd,53) { illegal_1(); op_53();								} /* DB   FD          */
2543 OP(fd,54) { D = HY;										} /* LD   D,HY        */
2544 OP(fd,55) { D = LY;										} /* LD   D,LY        */
2545 OP(fd,56) { EAY; D = RM(EA);								} /* LD   D,(IY+o)    */
2546 OP(fd,57) { illegal_1(); op_57();								} /* DB   FD          */
2547 
2548 OP(fd,58) { illegal_1(); op_58();								} /* DB   FD          */
2549 OP(fd,59) { illegal_1(); op_59();								} /* DB   FD          */
2550 OP(fd,5a) { illegal_1(); op_5a();								} /* DB   FD          */
2551 OP(fd,5b) { illegal_1(); op_5b();								} /* DB   FD          */
2552 OP(fd,5c) { E = HY;										} /* LD   E,HY        */
2553 OP(fd,5d) { E = LY;										} /* LD   E,LY        */
2554 OP(fd,5e) { EAY; E = RM(EA);								} /* LD   E,(IY+o)    */
2555 OP(fd,5f) { illegal_1(); op_5f();								} /* DB   FD          */
2556 
2557 OP(fd,60) { HY = B;										} /* LD   HY,B        */
2558 OP(fd,61) { HY = C;										} /* LD   HY,C        */
2559 OP(fd,62) { HY = D;										} /* LD   HY,D        */
2560 OP(fd,63) { HY = E;										} /* LD   HY,E        */
2561 OP(fd,64) {												} /* LD   HY,HY       */
2562 OP(fd,65) { HY = LY;										} /* LD   HY,LY       */
2563 OP(fd,66) { EAY; H = RM(EA);								} /* LD   H,(IY+o)    */
2564 OP(fd,67) { HY = A;										} /* LD   HY,A        */
2565 
2566 OP(fd,68) { LY = B;										} /* LD   LY,B        */
2567 OP(fd,69) { LY = C;										} /* LD   LY,C        */
2568 OP(fd,6a) { LY = D;										} /* LD   LY,D        */
2569 OP(fd,6b) { LY = E;										} /* LD   LY,E        */
2570 OP(fd,6c) { LY = HY;										} /* LD   LY,HY       */
2571 OP(fd,6d) {												} /* LD   LY,LY       */
2572 OP(fd,6e) { EAY; L = RM(EA);								} /* LD   L,(IY+o)    */
2573 OP(fd,6f) { LY = A;										} /* LD   LY,A        */
2574 
2575 OP(fd,70) { EAY; WM( EA, B );								} /* LD   (IY+o),B    */
2576 OP(fd,71) { EAY; WM( EA, C );								} /* LD   (IY+o),C    */
2577 OP(fd,72) { EAY; WM( EA, D );								} /* LD   (IY+o),D    */
2578 OP(fd,73) { EAY; WM( EA, E );								} /* LD   (IY+o),E    */
2579 OP(fd,74) { EAY; WM( EA, H );								} /* LD   (IY+o),H    */
2580 OP(fd,75) { EAY; WM( EA, L );								} /* LD   (IY+o),L    */
2581 OP(fd,76) { illegal_1(); op_76();								} /* DB   FD          */
2582 OP(fd,77) { EAY; WM( EA, A );								} /* LD   (IY+o),A    */
2583 
2584 OP(fd,78) { illegal_1(); op_78();								} /* DB   FD          */
2585 OP(fd,79) { illegal_1(); op_79();								} /* DB   FD          */
2586 OP(fd,7a) { illegal_1(); op_7a();								} /* DB   FD          */
2587 OP(fd,7b) { illegal_1(); op_7b();								} /* DB   FD          */
2588 OP(fd,7c) { A = HY;										} /* LD   A,HY        */
2589 OP(fd,7d) { A = LY;										} /* LD   A,LY        */
2590 OP(fd,7e) { EAY; A = RM(EA);								} /* LD   A,(IY+o)    */
2591 OP(fd,7f) { illegal_1(); op_7f();								} /* DB   FD          */
2592 
2593 OP(fd,80) { illegal_1(); op_80();								} /* DB   FD          */
2594 OP(fd,81) { illegal_1(); op_81();								} /* DB   FD          */
2595 OP(fd,82) { illegal_1(); op_82();								} /* DB   FD          */
2596 OP(fd,83) { illegal_1(); op_83();								} /* DB   FD          */
2597 OP(fd,84) { ADD(HY);										} /* ADD  A,HY        */
2598 OP(fd,85) { ADD(LY);										} /* ADD  A,LY        */
2599 OP(fd,86) { EAY; ADD(RM(EA));								} /* ADD  A,(IY+o)    */
2600 OP(fd,87) { illegal_1(); op_87();								} /* DB   FD          */
2601 
2602 OP(fd,88) { illegal_1(); op_88();								} /* DB   FD          */
2603 OP(fd,89) { illegal_1(); op_89();								} /* DB   FD          */
2604 OP(fd,8a) { illegal_1(); op_8a();								} /* DB   FD          */
2605 OP(fd,8b) { illegal_1(); op_8b();								} /* DB   FD          */
2606 OP(fd,8c) { ADC(HY);										} /* ADC  A,HY        */
2607 OP(fd,8d) { ADC(LY);										} /* ADC  A,LY        */
2608 OP(fd,8e) { EAY; ADC(RM(EA));								} /* ADC  A,(IY+o)    */
2609 OP(fd,8f) { illegal_1(); op_8f();								} /* DB   FD          */
2610 
2611 OP(fd,90) { illegal_1(); op_90();								} /* DB   FD          */
2612 OP(fd,91) { illegal_1(); op_91();								} /* DB   FD          */
2613 OP(fd,92) { illegal_1(); op_92();								} /* DB   FD          */
2614 OP(fd,93) { illegal_1(); op_93();								} /* DB   FD          */
2615 OP(fd,94) { SUB(HY);										} /* SUB  HY          */
2616 OP(fd,95) { SUB(LY);										} /* SUB  LY          */
2617 OP(fd,96) { EAY; SUB(RM(EA));								} /* SUB  (IY+o)      */
2618 OP(fd,97) { illegal_1(); op_97();								} /* DB   FD          */
2619 
2620 OP(fd,98) { illegal_1(); op_98();								} /* DB   FD          */
2621 OP(fd,99) { illegal_1(); op_99();								} /* DB   FD          */
2622 OP(fd,9a) { illegal_1(); op_9a();								} /* DB   FD          */
2623 OP(fd,9b) { illegal_1(); op_9b();								} /* DB   FD          */
2624 OP(fd,9c) { SBC(HY);										} /* SBC  A,HY        */
2625 OP(fd,9d) { SBC(LY);										} /* SBC  A,LY        */
2626 OP(fd,9e) { EAY; SBC(RM(EA));								} /* SBC  A,(IY+o)    */
2627 OP(fd,9f) { illegal_1(); op_9f();								} /* DB   FD          */
2628 
OP(fd,a0)2629 OP(fd,a0) { illegal_1(); op_a0();								} /* DB   FD          */
OP(fd,a1)2630 OP(fd,a1) { illegal_1(); op_a1();								} /* DB   FD          */
OP(fd,a2)2631 OP(fd,a2) { illegal_1(); op_a2();								} /* DB   FD          */
OP(fd,a3)2632 OP(fd,a3) { illegal_1(); op_a3();								} /* DB   FD          */
OP(fd,a4)2633 OP(fd,a4) { AND(HY);										} /* AND  HY          */
OP(fd,a5)2634 OP(fd,a5) { AND(LY);										} /* AND  LY          */
OP(fd,a6)2635 OP(fd,a6) { EAY; AND(RM(EA));								} /* AND  (IY+o)      */
OP(fd,a7)2636 OP(fd,a7) { illegal_1(); op_a7();								} /* DB   FD          */
2637 
OP(fd,a8)2638 OP(fd,a8) { illegal_1(); op_a8();								} /* DB   FD          */
OP(fd,a9)2639 OP(fd,a9) { illegal_1(); op_a9();								} /* DB   FD          */
OP(fd,aa)2640 OP(fd,aa) { illegal_1(); op_aa();								} /* DB   FD          */
OP(fd,ab)2641 OP(fd,ab) { illegal_1(); op_ab();								} /* DB   FD          */
OP(fd,ac)2642 OP(fd,ac) { XOR(HY);										} /* XOR  HY          */
OP(fd,ad)2643 OP(fd,ad) { XOR(LY);										} /* XOR  LY          */
OP(fd,ae)2644 OP(fd,ae) { EAY; XOR(RM(EA));								} /* XOR  (IY+o)      */
OP(fd,af)2645 OP(fd,af) { illegal_1(); op_af();								} /* DB   FD          */
2646 
OP(fd,b0)2647 OP(fd,b0) { illegal_1(); op_b0();								} /* DB   FD          */
OP(fd,b1)2648 OP(fd,b1) { illegal_1(); op_b1();								} /* DB   FD          */
OP(fd,b2)2649 OP(fd,b2) { illegal_1(); op_b2();								} /* DB   FD          */
OP(fd,b3)2650 OP(fd,b3) { illegal_1(); op_b3();								} /* DB   FD          */
OP(fd,b4)2651 OP(fd,b4) { OR(HY);										} /* OR   HY          */
OP(fd,b5)2652 OP(fd,b5) { OR(LY);										} /* OR   LY          */
OP(fd,b6)2653 OP(fd,b6) { EAY; OR(RM(EA));								} /* OR   (IY+o)      */
OP(fd,b7)2654 OP(fd,b7) { illegal_1(); op_b7();								} /* DB   FD          */
2655 
OP(fd,b8)2656 OP(fd,b8) { illegal_1(); op_b8();								} /* DB   FD          */
OP(fd,b9)2657 OP(fd,b9) { illegal_1(); op_b9();								} /* DB   FD          */
OP(fd,ba)2658 OP(fd,ba) { illegal_1(); op_ba();								} /* DB   FD          */
OP(fd,bb)2659 OP(fd,bb) { illegal_1(); op_bb();								} /* DB   FD          */
OP(fd,bc)2660 OP(fd,bc) { CP(HY);										} /* CP   HY          */
OP(fd,bd)2661 OP(fd,bd) { CP(LY);										} /* CP   LY          */
OP(fd,be)2662 OP(fd,be) { EAY; CP(RM(EA));								} /* CP   (IY+o)      */
OP(fd,bf)2663 OP(fd,bf) { illegal_1(); op_bf();								} /* DB   FD          */
2664 
OP(fd,c0)2665 OP(fd,c0) { illegal_1(); op_c0();								} /* DB   FD          */
OP(fd,c1)2666 OP(fd,c1) { illegal_1(); op_c1();								} /* DB   FD          */
OP(fd,c2)2667 OP(fd,c2) { illegal_1(); op_c2();								} /* DB   FD          */
OP(fd,c3)2668 OP(fd,c3) { illegal_1(); op_c3();								} /* DB   FD          */
OP(fd,c4)2669 OP(fd,c4) { illegal_1(); op_c4();								} /* DB   FD          */
OP(fd,c5)2670 OP(fd,c5) { illegal_1(); op_c5();								} /* DB   FD          */
OP(fd,c6)2671 OP(fd,c6) { illegal_1(); op_c6();								} /* DB   FD          */
OP(fd,c7)2672 OP(fd,c7) { illegal_1(); op_c7();								} /* DB   FD          */
2673 
OP(fd,c8)2674 OP(fd,c8) { illegal_1(); op_c8();								} /* DB   FD          */
OP(fd,c9)2675 OP(fd,c9) { illegal_1(); op_c9();								} /* DB   FD          */
OP(fd,ca)2676 OP(fd,ca) { illegal_1(); op_ca();								} /* DB   FD          */
OP(fd,cb)2677 OP(fd,cb) { EAY; EXEC(xycb,ARG());							} /* **   FD CB xx    */
OP(fd,cc)2678 OP(fd,cc) { illegal_1(); op_cc();								} /* DB   FD          */
OP(fd,cd)2679 OP(fd,cd) { illegal_1(); op_cd();								} /* DB   FD          */
OP(fd,ce)2680 OP(fd,ce) { illegal_1(); op_ce();								} /* DB   FD          */
OP(fd,cf)2681 OP(fd,cf) { illegal_1(); op_cf();								} /* DB   FD          */
2682 
OP(fd,d0)2683 OP(fd,d0) { illegal_1(); op_d0();								} /* DB   FD          */
OP(fd,d1)2684 OP(fd,d1) { illegal_1(); op_d1();								} /* DB   FD          */
OP(fd,d2)2685 OP(fd,d2) { illegal_1(); op_d2();								} /* DB   FD          */
OP(fd,d3)2686 OP(fd,d3) { illegal_1(); op_d3();								} /* DB   FD          */
OP(fd,d4)2687 OP(fd,d4) { illegal_1(); op_d4();								} /* DB   FD          */
OP(fd,d5)2688 OP(fd,d5) { illegal_1(); op_d5();								} /* DB   FD          */
OP(fd,d6)2689 OP(fd,d6) { illegal_1(); op_d6();								} /* DB   FD          */
OP(fd,d7)2690 OP(fd,d7) { illegal_1(); op_d7();								} /* DB   FD          */
2691 
OP(fd,d8)2692 OP(fd,d8) { illegal_1(); op_d8();								} /* DB   FD          */
OP(fd,d9)2693 OP(fd,d9) { illegal_1(); op_d9();								} /* DB   FD          */
OP(fd,da)2694 OP(fd,da) { illegal_1(); op_da();								} /* DB   FD          */
OP(fd,db)2695 OP(fd,db) { illegal_1(); op_db();								} /* DB   FD          */
OP(fd,dc)2696 OP(fd,dc) { illegal_1(); op_dc();								} /* DB   FD          */
OP(fd,dd)2697 OP(fd,dd) { illegal_1(); op_dd();								} /* DB   FD          */
OP(fd,de)2698 OP(fd,de) { illegal_1(); op_de();								} /* DB   FD          */
OP(fd,df)2699 OP(fd,df) { illegal_1(); op_df();								} /* DB   FD          */
2700 
OP(fd,e0)2701 OP(fd,e0) { illegal_1(); op_e0();								} /* DB   FD          */
OP(fd,e1)2702 OP(fd,e1) { POP( iy );										} /* POP  IY          */
OP(fd,e2)2703 OP(fd,e2) { illegal_1(); op_e2();								} /* DB   FD          */
OP(fd,e3)2704 OP(fd,e3) { EXSP( iy );									} /* EX   (SP),IY     */
OP(fd,e4)2705 OP(fd,e4) { illegal_1(); op_e4();								} /* DB   FD          */
OP(fd,e5)2706 OP(fd,e5) { PUSH( iy );									} /* PUSH IY          */
OP(fd,e6)2707 OP(fd,e6) { illegal_1(); op_e6();								} /* DB   FD          */
OP(fd,e7)2708 OP(fd,e7) { illegal_1(); op_e7();								} /* DB   FD          */
2709 
OP(fd,e8)2710 OP(fd,e8) { illegal_1(); op_e8();								} /* DB   FD          */
OP(fd,e9)2711 OP(fd,e9) { PC = IY; change_pc(PCD);						} /* JP   (IY)        */
OP(fd,ea)2712 OP(fd,ea) { illegal_1(); op_ea();								} /* DB   FD          */
OP(fd,eb)2713 OP(fd,eb) { illegal_1(); op_eb();								} /* DB   FD          */
OP(fd,ec)2714 OP(fd,ec) { illegal_1(); op_ec();								} /* DB   FD          */
OP(fd,ed)2715 OP(fd,ed) { illegal_1(); op_ed();								} /* DB   FD          */
OP(fd,ee)2716 OP(fd,ee) { illegal_1(); op_ee();								} /* DB   FD          */
OP(fd,ef)2717 OP(fd,ef) { illegal_1(); op_ef();								} /* DB   FD          */
2718 
OP(fd,f0)2719 OP(fd,f0) { illegal_1(); op_f0();								} /* DB   FD          */
OP(fd,f1)2720 OP(fd,f1) { illegal_1(); op_f1();								} /* DB   FD          */
OP(fd,f2)2721 OP(fd,f2) { illegal_1(); op_f2();								} /* DB   FD          */
OP(fd,f3)2722 OP(fd,f3) { illegal_1(); op_f3();								} /* DB   FD          */
OP(fd,f4)2723 OP(fd,f4) { illegal_1(); op_f4();								} /* DB   FD          */
OP(fd,f5)2724 OP(fd,f5) { illegal_1(); op_f5();								} /* DB   FD          */
OP(fd,f6)2725 OP(fd,f6) { illegal_1(); op_f6();								} /* DB   FD          */
OP(fd,f7)2726 OP(fd,f7) { illegal_1(); op_f7();								} /* DB   FD          */
2727 
OP(fd,f8)2728 OP(fd,f8) { illegal_1(); op_f8();								} /* DB   FD          */
OP(fd,f9)2729 OP(fd,f9) { SP = IY;										} /* LD   SP,IY       */
OP(fd,fa)2730 OP(fd,fa) { illegal_1(); op_fa();								} /* DB   FD          */
OP(fd,fb)2731 OP(fd,fb) { illegal_1(); op_fb();								} /* DB   FD          */
OP(fd,fc)2732 OP(fd,fc) { illegal_1(); op_fc();								} /* DB   FD          */
OP(fd,fd)2733 OP(fd,fd) { illegal_1(); op_fd();								} /* DB   FD          */
OP(fd,fe)2734 OP(fd,fe) { illegal_1(); op_fe();								} /* DB   FD          */
OP(fd,ff)2735 OP(fd,ff) { illegal_1(); op_ff();								} /* DB   FD          */
2736 
2737 OP(illegal,2)
2738 {
2739 //	logerror("Z80 #%d ill. opcode $ed $%02x\n",
2740 //			cpu_getactivecpu(), cpu_readop((PCD-1)&0xffff));
2741 }
2742 
2743 /**********************************************************
2744  * special opcodes (ED prefix)
2745  **********************************************************/
2746 OP(ed,00) { illegal_2();										} /* DB   ED          */
2747 OP(ed,01) { illegal_2();										} /* DB   ED          */
2748 OP(ed,02) { illegal_2();										} /* DB   ED          */
2749 OP(ed,03) { illegal_2();										} /* DB   ED          */
2750 OP(ed,04) { illegal_2();										} /* DB   ED          */
2751 OP(ed,05) { illegal_2();										} /* DB   ED          */
2752 OP(ed,06) { illegal_2();										} /* DB   ED          */
2753 OP(ed,07) { illegal_2();										} /* DB   ED          */
2754 
2755 OP(ed,08) { illegal_2();										} /* DB   ED          */
2756 OP(ed,09) { illegal_2();										} /* DB   ED          */
2757 OP(ed,0a) { illegal_2();										} /* DB   ED          */
2758 OP(ed,0b) { illegal_2();										} /* DB   ED          */
2759 OP(ed,0c) { illegal_2();										} /* DB   ED          */
2760 OP(ed,0d) { illegal_2();										} /* DB   ED          */
2761 OP(ed,0e) { illegal_2();										} /* DB   ED          */
2762 OP(ed,0f) { illegal_2();										} /* DB   ED          */
2763 
2764 OP(ed,10) { illegal_2();										} /* DB   ED          */
2765 OP(ed,11) { illegal_2();										} /* DB   ED          */
2766 OP(ed,12) { illegal_2();										} /* DB   ED          */
2767 OP(ed,13) { illegal_2();										} /* DB   ED          */
2768 OP(ed,14) { illegal_2();										} /* DB   ED          */
2769 OP(ed,15) { illegal_2();										} /* DB   ED          */
2770 OP(ed,16) { illegal_2();										} /* DB   ED          */
2771 OP(ed,17) { illegal_2();										} /* DB   ED          */
2772 
2773 OP(ed,18) { illegal_2();										} /* DB   ED          */
2774 OP(ed,19) { illegal_2();										} /* DB   ED          */
2775 OP(ed,1a) { illegal_2();										} /* DB   ED          */
2776 OP(ed,1b) { illegal_2();										} /* DB   ED          */
2777 OP(ed,1c) { illegal_2();										} /* DB   ED          */
2778 OP(ed,1d) { illegal_2();										} /* DB   ED          */
2779 OP(ed,1e) { illegal_2();										} /* DB   ED          */
2780 OP(ed,1f) { illegal_2();										} /* DB   ED          */
2781 
2782 OP(ed,20) { illegal_2();										} /* DB   ED          */
2783 OP(ed,21) { illegal_2();										} /* DB   ED          */
2784 OP(ed,22) { illegal_2();										} /* DB   ED          */
2785 OP(ed,23) { illegal_2();										} /* DB   ED          */
2786 OP(ed,24) { illegal_2();										} /* DB   ED          */
2787 OP(ed,25) { illegal_2();										} /* DB   ED          */
2788 OP(ed,26) { illegal_2();										} /* DB   ED          */
2789 OP(ed,27) { illegal_2();										} /* DB   ED          */
2790 
2791 OP(ed,28) { illegal_2();										} /* DB   ED          */
2792 OP(ed,29) { illegal_2();										} /* DB   ED          */
2793 OP(ed,2a) { illegal_2();										} /* DB   ED          */
2794 OP(ed,2b) { illegal_2();										} /* DB   ED          */
2795 OP(ed,2c) { illegal_2();										} /* DB   ED          */
2796 OP(ed,2d) { illegal_2();										} /* DB   ED          */
2797 OP(ed,2e) { illegal_2();										} /* DB   ED          */
2798 OP(ed,2f) { illegal_2();										} /* DB   ED          */
2799 
2800 OP(ed,30) { illegal_2();										} /* DB   ED          */
2801 OP(ed,31) { illegal_2();										} /* DB   ED          */
2802 OP(ed,32) { illegal_2();										} /* DB   ED          */
2803 OP(ed,33) { illegal_2();										} /* DB   ED          */
2804 OP(ed,34) { illegal_2();										} /* DB   ED          */
2805 OP(ed,35) { illegal_2();										} /* DB   ED          */
2806 OP(ed,36) { illegal_2();										} /* DB   ED          */
2807 OP(ed,37) { illegal_2();										} /* DB   ED          */
2808 
2809 OP(ed,38) { illegal_2();										} /* DB   ED          */
2810 OP(ed,39) { illegal_2();										} /* DB   ED          */
2811 OP(ed,3a) { illegal_2();										} /* DB   ED          */
2812 OP(ed,3b) { illegal_2();										} /* DB   ED          */
2813 OP(ed,3c) { illegal_2();										} /* DB   ED          */
2814 OP(ed,3d) { illegal_2();										} /* DB   ED          */
2815 OP(ed,3e) { illegal_2();										} /* DB   ED          */
2816 OP(ed,3f) { illegal_2();										} /* DB   ED          */
2817 
2818 OP(ed,40) { B = IN(BC); F = (F & CF) | SZP[B];					} /* IN   B,(C)       */
2819 OP(ed,41) { OUT(BC, B);											} /* OUT  (C),B       */
2820 OP(ed,42) { SBC16( bc );										} /* SBC  HL,BC       */
2821 OP(ed,43) { EA = ARG16(); WM16( EA, &Z80.bc ); WZ = EA + 1;		} /* LD   (w),BC      */
2822 OP(ed,44) { NEG;												} /* NEG              */
2823 OP(ed,45) { RETN;												} /* RETN;            */
2824 OP(ed,46) { IM = 0;												} /* IM   0           */
2825 OP(ed,47) { LD_I_A;												} /* LD   I,A         */
2826 
2827 OP(ed,48) { C = IN(BC); F = (F & CF) | SZP[C];					} /* IN   C,(C)       */
2828 OP(ed,49) { OUT(BC, C);											} /* OUT  (C),C       */
2829 OP(ed,4a) { ADC16( bc );										} /* ADC  HL,BC       */
2830 OP(ed,4b) { EA = ARG16(); RM16( EA, &Z80.bc ); WZ = EA + 1;		} /* LD   BC,(w)      */
2831 OP(ed,4c) { NEG;												} /* NEG              */
2832 OP(ed,4d) { RETI;												} /* RETI             */
2833 OP(ed,4e) { IM = 0;												} /* IM   0           */
2834 OP(ed,4f) { LD_R_A;												} /* LD   R,A         */
2835 
2836 OP(ed,50) { D = IN(BC); F = (F & CF) | SZP[D];					} /* IN   D,(C)       */
2837 OP(ed,51) { OUT(BC, D);											} /* OUT  (C),D       */
2838 OP(ed,52) { SBC16( de );										} /* SBC  HL,DE       */
2839 OP(ed,53) { EA = ARG16(); WM16( EA, &Z80.de ); WZ = EA + 1;		} /* LD   (w),DE      */
2840 OP(ed,54) { NEG;												} /* NEG              */
2841 OP(ed,55) { RETN;												} /* RETN;            */
2842 OP(ed,56) { IM = 1;												} /* IM   1           */
2843 OP(ed,57) { LD_A_I;												} /* LD   A,I         */
2844 
2845 OP(ed,58) { E = IN(BC); F = (F & CF) | SZP[E];					} /* IN   E,(C)       */
2846 OP(ed,59) { OUT(BC, E);											} /* OUT  (C),E       */
2847 OP(ed,5a) { ADC16( de );										} /* ADC  HL,DE       */
2848 OP(ed,5b) { EA = ARG16(); RM16( EA, &Z80.de ); WZ = EA + 1;		} /* LD   DE,(w)      */
2849 OP(ed,5c) { NEG;												} /* NEG              */
2850 OP(ed,5d) { RETI;												} /* RETI             */
2851 OP(ed,5e) { IM = 2;												} /* IM   2           */
2852 OP(ed,5f) { LD_A_R;												} /* LD   A,R         */
2853 
2854 OP(ed,60) { H = IN(BC); F = (F & CF) | SZP[H];					} /* IN   H,(C)       */
2855 OP(ed,61) { OUT(BC, H);											} /* OUT  (C),H       */
2856 OP(ed,62) { SBC16( hl );										} /* SBC  HL,HL       */
2857 OP(ed,63) { EA = ARG16(); WM16( EA, &Z80.hl ); WZ = EA + 1;		} /* LD   (w),HL      */
2858 OP(ed,64) { NEG;												} /* NEG              */
2859 OP(ed,65) { RETN;												} /* RETN;            */
2860 OP(ed,66) { IM = 0;												} /* IM   0           */
2861 OP(ed,67) { RRD;												} /* RRD  (HL)        */
2862 
2863 OP(ed,68) { L = IN(BC); F = (F & CF) | SZP[L];					} /* IN   L,(C)       */
2864 OP(ed,69) { OUT(BC, L);											} /* OUT  (C),L       */
2865 OP(ed,6a) { ADC16( hl );										} /* ADC  HL,HL       */
2866 OP(ed,6b) { EA = ARG16(); RM16( EA, &Z80.hl ); WZ = EA + 1;		} /* LD   HL,(w)      */
2867 OP(ed,6c) { NEG;												} /* NEG              */
2868 OP(ed,6d) { RETI;												} /* RETI             */
2869 OP(ed,6e) { IM = 0;												} /* IM   0           */
2870 OP(ed,6f) { RLD;												} /* RLD  (HL)        */
2871 
2872 OP(ed,70) { UINT8 res = IN(BC); F = (F & CF) | SZP[res];		} /* IN   0,(C)       */
2873 OP(ed,71) { OUT(BC, 0);											} /* OUT  (C),0       */
2874 OP(ed,72) { SBC16( sp );										} /* SBC  HL,SP       */
2875 OP(ed,73) { EA = ARG16(); WM16( EA, &Z80.sp ); WZ = EA + 1;		} /* LD   (w),SP      */
2876 OP(ed,74) { NEG;												} /* NEG              */
2877 OP(ed,75) { RETN;												} /* RETN;            */
2878 OP(ed,76) { IM = 1;												} /* IM   1           */
2879 OP(ed,77) { illegal_2();										} /* DB   ED,77       */
2880 
2881 OP(ed,78) { A = IN(BC); F = (F & CF) | SZP[A]; WZ = BC + 1;		} /* IN   E,(C)       */
2882 OP(ed,79) { OUT(BC, A);WZ = BC + 1;								} /* OUT  (C),A       */
2883 OP(ed,7a) { ADC16( sp );										} /* ADC  HL,SP       */
2884 OP(ed,7b) { EA = ARG16(); RM16( EA, &Z80.sp ); WZ = EA + 1;		} /* LD   SP,(w)      */
2885 OP(ed,7c) { NEG;												} /* NEG              */
2886 OP(ed,7d) { RETI;												} /* RETI             */
2887 OP(ed,7e) { IM = 2;												} /* IM   2           */
2888 OP(ed,7f) { illegal_2();										} /* DB   ED,7F       */
2889 
2890 OP(ed,80) { illegal_2();										} /* DB   ED          */
2891 OP(ed,81) { illegal_2();										} /* DB   ED          */
2892 OP(ed,82) { illegal_2();										} /* DB   ED          */
2893 OP(ed,83) { illegal_2();										} /* DB   ED          */
2894 OP(ed,84) { illegal_2();										} /* DB   ED          */
2895 OP(ed,85) { illegal_2();										} /* DB   ED          */
2896 OP(ed,86) { illegal_2();										} /* DB   ED          */
2897 OP(ed,87) { illegal_2();										} /* DB   ED          */
2898 
2899 OP(ed,88) { illegal_2();										} /* DB   ED          */
2900 OP(ed,89) { illegal_2();										} /* DB   ED          */
2901 OP(ed,8a) { illegal_2();										} /* DB   ED          */
2902 OP(ed,8b) { illegal_2();										} /* DB   ED          */
2903 OP(ed,8c) { illegal_2();										} /* DB   ED          */
2904 OP(ed,8d) { illegal_2();										} /* DB   ED          */
2905 OP(ed,8e) { illegal_2();										} /* DB   ED          */
2906 OP(ed,8f) { illegal_2();										} /* DB   ED          */
2907 
2908 OP(ed,90) { illegal_2();										} /* DB   ED          */
2909 OP(ed,91) { illegal_2();										} /* DB   ED          */
2910 OP(ed,92) { illegal_2();										} /* DB   ED          */
2911 OP(ed,93) { illegal_2();										} /* DB   ED          */
2912 OP(ed,94) { illegal_2();										} /* DB   ED          */
2913 OP(ed,95) { illegal_2();										} /* DB   ED          */
2914 OP(ed,96) { illegal_2();										} /* DB   ED          */
2915 OP(ed,97) { illegal_2();										} /* DB   ED          */
2916 
2917 OP(ed,98) { illegal_2();										} /* DB   ED          */
2918 OP(ed,99) { illegal_2();										} /* DB   ED          */
2919 OP(ed,9a) { illegal_2();										} /* DB   ED          */
2920 OP(ed,9b) { illegal_2();										} /* DB   ED          */
2921 OP(ed,9c) { illegal_2();										} /* DB   ED          */
2922 OP(ed,9d) { illegal_2();										} /* DB   ED          */
2923 OP(ed,9e) { illegal_2();										} /* DB   ED          */
2924 OP(ed,9f) { illegal_2();										} /* DB   ED          */
2925 
OP(ed,a0)2926 OP(ed,a0) { LDI;												} /* LDI              */
OP(ed,a1)2927 OP(ed,a1) { CPI;												} /* CPI              */
OP(ed,a2)2928 OP(ed,a2) { INI;												} /* INI              */
OP(ed,a3)2929 OP(ed,a3) { OUTI;												} /* OUTI             */
OP(ed,a4)2930 OP(ed,a4) { illegal_2();										} /* DB   ED          */
OP(ed,a5)2931 OP(ed,a5) { illegal_2();										} /* DB   ED          */
OP(ed,a6)2932 OP(ed,a6) { illegal_2();										} /* DB   ED          */
OP(ed,a7)2933 OP(ed,a7) { illegal_2();										} /* DB   ED          */
2934 
OP(ed,a8)2935 OP(ed,a8) { LDD;												} /* LDD              */
OP(ed,a9)2936 OP(ed,a9) { CPD;												} /* CPD              */
OP(ed,aa)2937 OP(ed,aa) { IND;												} /* IND              */
OP(ed,ab)2938 OP(ed,ab) { OUTD;												} /* OUTD             */
OP(ed,ac)2939 OP(ed,ac) { illegal_2();										} /* DB   ED          */
OP(ed,ad)2940 OP(ed,ad) { illegal_2();										} /* DB   ED          */
OP(ed,ae)2941 OP(ed,ae) { illegal_2();										} /* DB   ED          */
OP(ed,af)2942 OP(ed,af) { illegal_2();										} /* DB   ED          */
2943 
OP(ed,b0)2944 OP(ed,b0) { LDIR;												} /* LDIR             */
OP(ed,b1)2945 OP(ed,b1) { CPIR;												} /* CPIR             */
OP(ed,b2)2946 OP(ed,b2) { INIR;												} /* INIR             */
OP(ed,b3)2947 OP(ed,b3) { OTIR;												} /* OTIR             */
OP(ed,b4)2948 OP(ed,b4) { illegal_2();										} /* DB   ED          */
OP(ed,b5)2949 OP(ed,b5) { illegal_2();										} /* DB   ED          */
OP(ed,b6)2950 OP(ed,b6) { illegal_2();										} /* DB   ED          */
OP(ed,b7)2951 OP(ed,b7) { illegal_2();										} /* DB   ED          */
2952 
OP(ed,b8)2953 OP(ed,b8) { LDDR;												} /* LDDR             */
OP(ed,b9)2954 OP(ed,b9) { CPDR;												} /* CPDR             */
OP(ed,ba)2955 OP(ed,ba) { INDR;												} /* INDR             */
OP(ed,bb)2956 OP(ed,bb) { OTDR;												} /* OTDR             */
OP(ed,bc)2957 OP(ed,bc) { illegal_2();										} /* DB   ED          */
OP(ed,bd)2958 OP(ed,bd) { illegal_2();										} /* DB   ED          */
OP(ed,be)2959 OP(ed,be) { illegal_2();										} /* DB   ED          */
OP(ed,bf)2960 OP(ed,bf) { illegal_2();										} /* DB   ED          */
2961 
OP(ed,c0)2962 OP(ed,c0) { illegal_2();										} /* DB   ED          */
OP(ed,c1)2963 OP(ed,c1) { illegal_2();										} /* DB   ED          */
OP(ed,c2)2964 OP(ed,c2) { illegal_2();										} /* DB   ED          */
OP(ed,c3)2965 OP(ed,c3) { illegal_2();										} /* DB   ED          */
OP(ed,c4)2966 OP(ed,c4) { illegal_2();										} /* DB   ED          */
OP(ed,c5)2967 OP(ed,c5) { illegal_2();										} /* DB   ED          */
OP(ed,c6)2968 OP(ed,c6) { illegal_2();										} /* DB   ED          */
OP(ed,c7)2969 OP(ed,c7) { illegal_2();										} /* DB   ED          */
2970 
OP(ed,c8)2971 OP(ed,c8) { illegal_2();										} /* DB   ED          */
OP(ed,c9)2972 OP(ed,c9) { illegal_2();										} /* DB   ED          */
OP(ed,ca)2973 OP(ed,ca) { illegal_2();										} /* DB   ED          */
OP(ed,cb)2974 OP(ed,cb) { illegal_2();										} /* DB   ED          */
OP(ed,cc)2975 OP(ed,cc) { illegal_2();										} /* DB   ED          */
OP(ed,cd)2976 OP(ed,cd) { illegal_2();										} /* DB   ED          */
OP(ed,ce)2977 OP(ed,ce) { illegal_2();										} /* DB   ED          */
OP(ed,cf)2978 OP(ed,cf) { illegal_2();										} /* DB   ED          */
2979 
OP(ed,d0)2980 OP(ed,d0) { illegal_2();										} /* DB   ED          */
OP(ed,d1)2981 OP(ed,d1) { illegal_2();										} /* DB   ED          */
OP(ed,d2)2982 OP(ed,d2) { illegal_2();										} /* DB   ED          */
OP(ed,d3)2983 OP(ed,d3) { illegal_2();										} /* DB   ED          */
OP(ed,d4)2984 OP(ed,d4) { illegal_2();										} /* DB   ED          */
OP(ed,d5)2985 OP(ed,d5) { illegal_2();										} /* DB   ED          */
OP(ed,d6)2986 OP(ed,d6) { illegal_2();										} /* DB   ED          */
OP(ed,d7)2987 OP(ed,d7) { illegal_2();										} /* DB   ED          */
2988 
OP(ed,d8)2989 OP(ed,d8) { illegal_2();										} /* DB   ED          */
OP(ed,d9)2990 OP(ed,d9) { illegal_2();										} /* DB   ED          */
OP(ed,da)2991 OP(ed,da) { illegal_2();										} /* DB   ED          */
OP(ed,db)2992 OP(ed,db) { illegal_2();										} /* DB   ED          */
OP(ed,dc)2993 OP(ed,dc) { illegal_2();										} /* DB   ED          */
OP(ed,dd)2994 OP(ed,dd) { illegal_2();										} /* DB   ED          */
OP(ed,de)2995 OP(ed,de) { illegal_2();										} /* DB   ED          */
OP(ed,df)2996 OP(ed,df) { illegal_2();										} /* DB   ED          */
2997 
OP(ed,e0)2998 OP(ed,e0) { illegal_2();										} /* DB   ED          */
OP(ed,e1)2999 OP(ed,e1) { illegal_2();										} /* DB   ED          */
OP(ed,e2)3000 OP(ed,e2) { illegal_2();										} /* DB   ED          */
OP(ed,e3)3001 OP(ed,e3) { illegal_2();										} /* DB   ED          */
OP(ed,e4)3002 OP(ed,e4) { illegal_2();										} /* DB   ED          */
OP(ed,e5)3003 OP(ed,e5) { illegal_2();										} /* DB   ED          */
OP(ed,e6)3004 OP(ed,e6) { illegal_2();										} /* DB   ED          */
OP(ed,e7)3005 OP(ed,e7) { illegal_2();										} /* DB   ED          */
3006 
OP(ed,e8)3007 OP(ed,e8) { illegal_2();										} /* DB   ED          */
OP(ed,e9)3008 OP(ed,e9) { illegal_2();										} /* DB   ED          */
OP(ed,ea)3009 OP(ed,ea) { illegal_2();										} /* DB   ED          */
OP(ed,eb)3010 OP(ed,eb) { illegal_2();										} /* DB   ED          */
OP(ed,ec)3011 OP(ed,ec) { illegal_2();										} /* DB   ED          */
OP(ed,ed)3012 OP(ed,ed) { illegal_2();										} /* DB   ED          */
OP(ed,ee)3013 OP(ed,ee) { illegal_2();										} /* DB   ED          */
OP(ed,ef)3014 OP(ed,ef) { illegal_2();										} /* DB   ED          */
3015 
OP(ed,f0)3016 OP(ed,f0) { illegal_2();										} /* DB   ED          */
OP(ed,f1)3017 OP(ed,f1) { illegal_2();										} /* DB   ED          */
OP(ed,f2)3018 OP(ed,f2) { illegal_2();										} /* DB   ED          */
OP(ed,f3)3019 OP(ed,f3) { illegal_2();										} /* DB   ED          */
OP(ed,f4)3020 OP(ed,f4) { illegal_2();										} /* DB   ED          */
OP(ed,f5)3021 OP(ed,f5) { illegal_2();										} /* DB   ED          */
OP(ed,f6)3022 OP(ed,f6) { illegal_2();										} /* DB   ED          */
OP(ed,f7)3023 OP(ed,f7) { illegal_2();										} /* DB   ED          */
3024 
OP(ed,f8)3025 OP(ed,f8) { illegal_2();										} /* DB   ED          */
OP(ed,f9)3026 OP(ed,f9) { illegal_2();										} /* DB   ED          */
OP(ed,fa)3027 OP(ed,fa) { illegal_2();										} /* DB   ED          */
OP(ed,fb)3028 OP(ed,fb) { illegal_2();										} /* DB   ED          */
OP(ed,fc)3029 OP(ed,fc) { illegal_2();										} /* DB   ED          */
OP(ed,fd)3030 OP(ed,fd) { illegal_2();										} /* DB   ED          */
OP(ed,fe)3031 OP(ed,fe) {
3032 	if (z80edfe_callback) {
3033 		(*z80edfe_callback)(&Z80);
3034 	} else {
3035 		illegal_2();
3036 	} } /* DB   ED          */
OP(ed,ff)3037 OP(ed,ff) { illegal_2();										} /* DB   ED          */
3038 
3039 
3040 /**********************************************************
3041  * main opcodes
3042  **********************************************************/
3043 OP(op,00) {														} /* NOP              */
3044 OP(op,01) { BC = ARG16();										} /* LD   BC,w        */
3045 OP(op,02) { WM( BC, A );WZ_L = (BC + 1) & 0xFF;  WZ_H = A;		} /* LD   (BC),A      */
3046 OP(op,03) { BC++;												} /* INC  BC          */
3047 OP(op,04) { B = INC(B);											} /* INC  B           */
3048 OP(op,05) { B = DEC(B);											} /* DEC  B           */
3049 OP(op,06) { B = ARG();											} /* LD   B,n         */
3050 OP(op,07) { RLCA;												} /* RLCA             */
3051 
3052 OP(op,08) { EX_AF;												} /* EX   AF,AF'      */
3053 OP(op,09) { ADD16(hl, bc);										} /* ADD  HL,BC       */
3054 OP(op,0a) { A = RM( BC );	WZ=BC+1; 							} /* LD   A,(BC)      */
3055 OP(op,0b) { BC--; 												} /* DEC  BC          */
3056 OP(op,0c) { C = INC(C);											} /* INC  C           */
3057 OP(op,0d) { C = DEC(C);											} /* DEC  C           */
3058 OP(op,0e) { C = ARG();											} /* LD   C,n         */
3059 OP(op,0f) { RRCA;												} /* RRCA             */
3060 
3061 OP(op,10) { B--; JR_COND( B, 0x10 );							} /* DJNZ o           */
3062 OP(op,11) { DE = ARG16();										} /* LD   DE,w        */
3063 OP(op,12) { WM( DE, A ); WZ_L = (DE + 1) & 0xFF;  WZ_H = A;		} /* LD   (DE),A      */
3064 OP(op,13) { DE++;												} /* INC  DE          */
3065 OP(op,14) { D = INC(D);											} /* INC  D           */
3066 OP(op,15) { D = DEC(D);											} /* DEC  D           */
3067 OP(op,16) { D = ARG();											} /* LD   D,n         */
3068 OP(op,17) { RLA;												} /* RLA              */
3069 
3070 OP(op,18) { JR();												} /* JR   o           */
3071 OP(op,19) { ADD16(hl, de);										} /* ADD  HL,DE       */
3072 OP(op,1a) { A = RM( DE );	WZ = DE + 1;  						} /* LD   A,(DE)      */
3073 OP(op,1b) { DE--; 												} /* DEC  DE          */
3074 OP(op,1c) { E = INC(E);											} /* INC  E           */
3075 OP(op,1d) { E = DEC(E);											} /* DEC  E           */
3076 OP(op,1e) { E = ARG();											} /* LD   E,n         */
3077 OP(op,1f) { RRA;												} /* RRA              */
3078 
3079 OP(op,20) { JR_COND( !(F & ZF), 0x20 );							} /* JR   NZ,o        */
3080 OP(op,21) { HL = ARG16();										} /* LD   HL,w        */
3081 OP(op,22) { EA = ARG16(); WM16( EA, &Z80.hl );	WZ = EA + 1; 	} /* LD   (w),HL      */
3082 OP(op,23) { HL++;												} /* INC  HL          */
3083 OP(op,24) { H = INC(H);											} /* INC  H           */
3084 OP(op,25) { H = DEC(H);											} /* DEC  H           */
3085 OP(op,26) { H = ARG();											} /* LD   H,n         */
3086 OP(op,27) { DAA;												} /* DAA              */
3087 
3088 OP(op,28) { JR_COND( F & ZF, 0x28 );							} /* JR   Z,o         */
3089 OP(op,29) { ADD16(hl, hl);										} /* ADD  HL,HL       */
3090 OP(op,2a) { EA = ARG16(); RM16( EA, &Z80.hl );WZ = EA + 1;		} /* LD   HL,(w)      */
3091 OP(op,2b) { HL--; 												} /* DEC  HL          */
3092 OP(op,2c) { L = INC(L);											} /* INC  L           */
3093 OP(op,2d) { L = DEC(L);											} /* DEC  L           */
3094 OP(op,2e) { L = ARG();											} /* LD   L,n         */
3095 OP(op,2f) { A ^= 0xff; F = (F&(SF|ZF|PF|CF))|HF|NF|(A&(YF|XF));	} /* CPL              */
3096 
3097 OP(op,30) { JR_COND( !(F & CF), 0x30 );							} /* JR   NC,o        */
3098 OP(op,31) { SP = ARG16();										} /* LD   SP,w        */
3099 OP(op,32) { EA = ARG16(); WM( EA, A );WZ_L = (EA + 1) & 0xFF; WZ_H = A; } /* LD   (w),A       */
3100 OP(op,33) { SP++;												} /* INC  SP          */
3101 OP(op,34) { WM( HL, INC(RM(HL)) );								} /* INC  (HL)        */
3102 OP(op,35) { WM( HL, DEC(RM(HL)) );								} /* DEC  (HL)        */
3103 OP(op,36) { WM( HL, ARG() );									} /* LD   (HL),n      */
3104 OP(op,37) { F = (F & (SF|ZF|YF|XF|PF)) | CF | (A & (YF|XF));			} /* SCF              */
3105 
3106 OP(op,38) { JR_COND( F & CF, 0x38 );							} /* JR   C,o         */
3107 OP(op,39) { ADD16(hl, sp);										} /* ADD  HL,SP       */
3108 OP(op,3a) { EA = ARG16(); A = RM( EA );WZ = EA + 1;			} /* LD   A,(w)       */
3109 OP(op,3b) { SP--;												} /* DEC  SP          */
3110 OP(op,3c) { A = INC(A);											} /* INC  A           */
3111 OP(op,3d) { A = DEC(A);											} /* DEC  A           */
3112 OP(op,3e) { A = ARG();											} /* LD   A,n         */
3113 OP(op,3f) { F = ((F&(SF|ZF|YF|XF|PF|CF))|((F&CF)<<4)|(A&(YF|XF)))^CF;	} /* CCF              */
3114 
3115 OP(op,40) {														} /* LD   B,B         */
3116 OP(op,41) { B = C;												} /* LD   B,C         */
3117 OP(op,42) { B = D;												} /* LD   B,D         */
3118 OP(op,43) { B = E;												} /* LD   B,E         */
3119 OP(op,44) { B = H;												} /* LD   B,H         */
3120 OP(op,45) { B = L;												} /* LD   B,L         */
3121 OP(op,46) { B = RM(HL);											} /* LD   B,(HL)      */
3122 OP(op,47) { B = A;												} /* LD   B,A         */
3123 
3124 OP(op,48) { C = B;												} /* LD   C,B         */
3125 OP(op,49) {														} /* LD   C,C         */
3126 OP(op,4a) { C = D;												} /* LD   C,D         */
3127 OP(op,4b) { C = E;												} /* LD   C,E         */
3128 OP(op,4c) { C = H;												} /* LD   C,H         */
3129 OP(op,4d) { C = L;												} /* LD   C,L         */
3130 OP(op,4e) { C = RM(HL);											} /* LD   C,(HL)      */
3131 OP(op,4f) { C = A;												} /* LD   C,A         */
3132 
3133 OP(op,50) { D = B;												} /* LD   D,B         */
3134 OP(op,51) { D = C;												} /* LD   D,C         */
3135 OP(op,52) {														} /* LD   D,D         */
3136 OP(op,53) { D = E;												} /* LD   D,E         */
3137 OP(op,54) { D = H;												} /* LD   D,H         */
3138 OP(op,55) { D = L;												} /* LD   D,L         */
3139 OP(op,56) { D = RM(HL);											} /* LD   D,(HL)      */
3140 OP(op,57) { D = A;												} /* LD   D,A         */
3141 
3142 OP(op,58) { E = B;												} /* LD   E,B         */
3143 OP(op,59) { E = C;												} /* LD   E,C         */
3144 OP(op,5a) { E = D;												} /* LD   E,D         */
3145 OP(op,5b) {														} /* LD   E,E         */
3146 OP(op,5c) { E = H;												} /* LD   E,H         */
3147 OP(op,5d) { E = L;												} /* LD   E,L         */
3148 OP(op,5e) { E = RM(HL);											} /* LD   E,(HL)      */
3149 OP(op,5f) { E = A;												} /* LD   E,A         */
3150 
3151 OP(op,60) { H = B;												} /* LD   H,B         */
3152 OP(op,61) { H = C;												} /* LD   H,C         */
3153 OP(op,62) { H = D;												} /* LD   H,D         */
3154 OP(op,63) { H = E;												} /* LD   H,E         */
3155 OP(op,64) {														} /* LD   H,H         */
3156 OP(op,65) { H = L;												} /* LD   H,L         */
3157 OP(op,66) { H = RM(HL);											} /* LD   H,(HL)      */
3158 OP(op,67) { H = A;												} /* LD   H,A         */
3159 
3160 OP(op,68) { L = B;												} /* LD   L,B         */
3161 OP(op,69) { L = C;												} /* LD   L,C         */
3162 OP(op,6a) { L = D;												} /* LD   L,D         */
3163 OP(op,6b) { L = E;												} /* LD   L,E         */
3164 OP(op,6c) { L = H;												} /* LD   L,H         */
3165 OP(op,6d) {														} /* LD   L,L         */
3166 OP(op,6e) { L = RM(HL);											} /* LD   L,(HL)      */
3167 OP(op,6f) { L = A;												} /* LD   L,A         */
3168 
3169 OP(op,70) { WM( HL, B );										} /* LD   (HL),B      */
3170 OP(op,71) { WM( HL, C );										} /* LD   (HL),C      */
3171 OP(op,72) { WM( HL, D );										} /* LD   (HL),D      */
3172 OP(op,73) { WM( HL, E );										} /* LD   (HL),E      */
3173 OP(op,74) { WM( HL, H );										} /* LD   (HL),H      */
3174 OP(op,75) { WM( HL, L );										} /* LD   (HL),L      */
3175 OP(op,76) { ENTER_HALT;											} /* HALT             */
3176 OP(op,77) { WM( HL, A );										} /* LD   (HL),A      */
3177 
3178 OP(op,78) { A = B;												} /* LD   A,B         */
3179 OP(op,79) { A = C;												} /* LD   A,C         */
3180 OP(op,7a) { A = D;												} /* LD   A,D         */
3181 OP(op,7b) { A = E;												} /* LD   A,E         */
3182 OP(op,7c) { A = H;												} /* LD   A,H         */
3183 OP(op,7d) { A = L;												} /* LD   A,L         */
3184 OP(op,7e) { A = RM(HL);											} /* LD   A,(HL)      */
3185 OP(op,7f) {														} /* LD   A,A         */
3186 
3187 OP(op,80) { ADD(B);												} /* ADD  A,B         */
3188 OP(op,81) { ADD(C);												} /* ADD  A,C         */
3189 OP(op,82) { ADD(D);												} /* ADD  A,D         */
3190 OP(op,83) { ADD(E);												} /* ADD  A,E         */
3191 OP(op,84) { ADD(H);												} /* ADD  A,H         */
3192 OP(op,85) { ADD(L);												} /* ADD  A,L         */
3193 OP(op,86) { ADD(RM(HL));										} /* ADD  A,(HL)      */
3194 OP(op,87) { ADD(A);												} /* ADD  A,A         */
3195 
3196 OP(op,88) { ADC(B);												} /* ADC  A,B         */
3197 OP(op,89) { ADC(C);												} /* ADC  A,C         */
3198 OP(op,8a) { ADC(D);												} /* ADC  A,D         */
3199 OP(op,8b) { ADC(E);												} /* ADC  A,E         */
3200 OP(op,8c) { ADC(H);												} /* ADC  A,H         */
3201 OP(op,8d) { ADC(L);												} /* ADC  A,L         */
3202 OP(op,8e) { ADC(RM(HL));										} /* ADC  A,(HL)      */
3203 OP(op,8f) { ADC(A);												} /* ADC  A,A         */
3204 
3205 OP(op,90) { SUB(B);												} /* SUB  B           */
3206 OP(op,91) { SUB(C);												} /* SUB  C           */
3207 OP(op,92) { SUB(D);												} /* SUB  D           */
3208 OP(op,93) { SUB(E);												} /* SUB  E           */
3209 OP(op,94) { SUB(H);												} /* SUB  H           */
3210 OP(op,95) { SUB(L);												} /* SUB  L           */
3211 OP(op,96) { SUB(RM(HL));										} /* SUB  (HL)        */
3212 OP(op,97) { SUB(A);												} /* SUB  A           */
3213 
3214 OP(op,98) { SBC(B);												} /* SBC  A,B         */
3215 OP(op,99) { SBC(C);												} /* SBC  A,C         */
3216 OP(op,9a) { SBC(D);												} /* SBC  A,D         */
3217 OP(op,9b) { SBC(E);												} /* SBC  A,E         */
3218 OP(op,9c) { SBC(H);												} /* SBC  A,H         */
3219 OP(op,9d) { SBC(L);												} /* SBC  A,L         */
3220 OP(op,9e) { SBC(RM(HL));										} /* SBC  A,(HL)      */
3221 OP(op,9f) { SBC(A);												} /* SBC  A,A         */
3222 
OP(op,a0)3223 OP(op,a0) { AND(B);												} /* AND  B           */
OP(op,a1)3224 OP(op,a1) { AND(C);												} /* AND  C           */
OP(op,a2)3225 OP(op,a2) { AND(D);												} /* AND  D           */
OP(op,a3)3226 OP(op,a3) { AND(E);												} /* AND  E           */
OP(op,a4)3227 OP(op,a4) { AND(H);												} /* AND  H           */
OP(op,a5)3228 OP(op,a5) { AND(L);												} /* AND  L           */
OP(op,a6)3229 OP(op,a6) { AND(RM(HL));										} /* AND  (HL)        */
OP(op,a7)3230 OP(op,a7) { AND(A);												} /* AND  A           */
3231 
OP(op,a8)3232 OP(op,a8) { XOR(B);												} /* XOR  B           */
OP(op,a9)3233 OP(op,a9) { XOR(C);												} /* XOR  C           */
OP(op,aa)3234 OP(op,aa) { XOR(D);												} /* XOR  D           */
OP(op,ab)3235 OP(op,ab) { XOR(E);												} /* XOR  E           */
OP(op,ac)3236 OP(op,ac) { XOR(H);												} /* XOR  H           */
OP(op,ad)3237 OP(op,ad) { XOR(L);												} /* XOR  L           */
OP(op,ae)3238 OP(op,ae) { XOR(RM(HL));										} /* XOR  (HL)        */
OP(op,af)3239 OP(op,af) { XOR(A);												} /* XOR  A           */
3240 
OP(op,b0)3241 OP(op,b0) { OR(B);												} /* OR   B           */
OP(op,b1)3242 OP(op,b1) { OR(C);												} /* OR   C           */
OP(op,b2)3243 OP(op,b2) { OR(D);												} /* OR   D           */
OP(op,b3)3244 OP(op,b3) { OR(E);												} /* OR   E           */
OP(op,b4)3245 OP(op,b4) { OR(H);												} /* OR   H           */
OP(op,b5)3246 OP(op,b5) { OR(L);												} /* OR   L           */
OP(op,b6)3247 OP(op,b6) { OR(RM(HL));											} /* OR   (HL)        */
OP(op,b7)3248 OP(op,b7) { OR(A);												} /* OR   A           */
3249 
OP(op,b8)3250 OP(op,b8) { CP(B);												} /* CP   B           */
OP(op,b9)3251 OP(op,b9) { CP(C);												} /* CP   C           */
OP(op,ba)3252 OP(op,ba) { CP(D);												} /* CP   D           */
OP(op,bb)3253 OP(op,bb) { CP(E);												} /* CP   E           */
OP(op,bc)3254 OP(op,bc) { CP(H);												} /* CP   H           */
OP(op,bd)3255 OP(op,bd) { CP(L);												} /* CP   L           */
OP(op,be)3256 OP(op,be) { CP(RM(HL));											} /* CP   (HL)        */
OP(op,bf)3257 OP(op,bf) { CP(A);												} /* CP   A           */
3258 
OP(op,c0)3259 OP(op,c0) { RET_COND( !(F & ZF), 0xc0 );						} /* RET  NZ          */
OP(op,c1)3260 OP(op,c1) { POP( bc );											} /* POP  BC          */
OP(op,c2)3261 OP(op,c2) { JP_COND( !(F & ZF) );								} /* JP   NZ,a        */
OP(op,c3)3262 OP(op,c3) { JP;													} /* JP   a           */
OP(op,c4)3263 OP(op,c4) { CALL_COND( !(F & ZF), 0xc4 );						} /* CALL NZ,a        */
OP(op,c5)3264 OP(op,c5) { PUSH( bc );											} /* PUSH BC          */
OP(op,c6)3265 OP(op,c6) { ADD(ARG());											} /* ADD  A,n         */
OP(op,c7)3266 OP(op,c7) { RST(0x00);											} /* RST  0           */
3267 
OP(op,c8)3268 OP(op,c8) { RET_COND( F & ZF, 0xc8 );							} /* RET  Z           */
OP(op,c9)3269 OP(op,c9) { POP( pc ); change_pc(PCD);WZ = PCD;  				} /* RET              */
OP(op,ca)3270 OP(op,ca) { JP_COND( F & ZF );									} /* JP   Z,a         */
OP(op,cb)3271 OP(op,cb) { R++; EXEC(cb,ROP());								} /* **** CB xx       */
OP(op,cc)3272 OP(op,cc) { CALL_COND( F & ZF, 0xcc );							} /* CALL Z,a         */
OP(op,cd)3273 OP(op,cd) { CALL();												} /* CALL a           */
OP(op,ce)3274 OP(op,ce) { ADC(ARG());											} /* ADC  A,n         */
OP(op,cf)3275 OP(op,cf) { RST(0x08);											} /* RST  1           */
3276 
OP(op,d0)3277 OP(op,d0) { RET_COND( !(F & CF), 0xd0 );						} /* RET  NC          */
OP(op,d1)3278 OP(op,d1) { POP( de );											} /* POP  DE          */
OP(op,d2)3279 OP(op,d2) { JP_COND( !(F & CF) );								} /* JP   NC,a        */
OP(op,d3)3280 OP(op,d3) { unsigned n = ARG() | (A << 8); OUT( n, A );WZ_L = ((n & 0xff) + 1) & 0xff;  WZ_H = A;  			} /* OUT  (n),A       */
OP(op,d4)3281 OP(op,d4) { CALL_COND( !(F & CF), 0xd4 );						} /* CALL NC,a        */
OP(op,d5)3282 OP(op,d5) { PUSH( de );											} /* PUSH DE          */
OP(op,d6)3283 OP(op,d6) { SUB(ARG());											} /* SUB  n           */
OP(op,d7)3284 OP(op,d7) { RST(0x10);											} /* RST  2           */
3285 
OP(op,d8)3286 OP(op,d8) { RET_COND( F & CF, 0xd8 );							} /* RET  C           */
OP(op,d9)3287 OP(op,d9) { EXX;												} /* EXX              */
OP(op,da)3288 OP(op,da) { JP_COND( F & CF );									} /* JP   C,a         */
OP(op,db)3289 OP(op,db) { unsigned n = ARG() | (A << 8); A = IN( n ); WZ = n + 1;			} /* IN   A,(n)       */
OP(op,dc)3290 OP(op,dc) { CALL_COND( F & CF, 0xdc );							} /* CALL C,a         */
OP(op,dd)3291 OP(op,dd) { R++; EXEC(dd,ROP());								} /* **** DD xx       */
OP(op,de)3292 OP(op,de) { SBC(ARG());											} /* SBC  A,n         */
OP(op,df)3293 OP(op,df) { RST(0x18);											} /* RST  3           */
3294 
OP(op,e0)3295 OP(op,e0) { RET_COND( !(F & PF), 0xe0 );						} /* RET  PO          */
OP(op,e1)3296 OP(op,e1) { POP( hl );											} /* POP  HL          */
OP(op,e2)3297 OP(op,e2) { JP_COND( !(F & PF) );								} /* JP   PO,a        */
OP(op,e3)3298 OP(op,e3) { EXSP( hl );											} /* EX   HL,(SP)     */
OP(op,e4)3299 OP(op,e4) { CALL_COND( !(F & PF), 0xe4 );						} /* CALL PO,a        */
OP(op,e5)3300 OP(op,e5) { PUSH( hl );											} /* PUSH HL          */
OP(op,e6)3301 OP(op,e6) { AND(ARG());											} /* AND  n           */
OP(op,e7)3302 OP(op,e7) { RST(0x20);											} /* RST  4           */
3303 
OP(op,e8)3304 OP(op,e8) { RET_COND( F & PF, 0xe8 );							} /* RET  PE          */
OP(op,e9)3305 OP(op,e9) { PC = HL; change_pc(PCD);							} /* JP   (HL)        */
OP(op,ea)3306 OP(op,ea) { JP_COND( F & PF );									} /* JP   PE,a        */
OP(op,eb)3307 OP(op,eb) { EX_DE_HL;											} /* EX   DE,HL       */
OP(op,ec)3308 OP(op,ec) { CALL_COND( F & PF, 0xec );							} /* CALL PE,a        */
OP(op,ed)3309 OP(op,ed) { R++; EXEC(ed,ROP());								} /* **** ED xx       */
OP(op,ee)3310 OP(op,ee) { XOR(ARG());											} /* XOR  n           */
OP(op,ef)3311 OP(op,ef) { RST(0x28);											} /* RST  5           */
3312 
OP(op,f0)3313 OP(op,f0) { RET_COND( !(F & SF), 0xf0 );						} /* RET  P           */
OP(op,f1)3314 OP(op,f1) { POP( af );											} /* POP  AF          */
OP(op,f2)3315 OP(op,f2) { JP_COND( !(F & SF) );								} /* JP   P,a         */
OP(op,f3)3316 OP(op,f3) { IFF1 = IFF2 = 0;									} /* DI               */
OP(op,f4)3317 OP(op,f4) { CALL_COND( !(F & SF), 0xf4 );						} /* CALL P,a         */
OP(op,f5)3318 OP(op,f5) { PUSH( af );											} /* PUSH AF          */
OP(op,f6)3319 OP(op,f6) { OR(ARG());											} /* OR   n           */
OP(op,f7)3320 OP(op,f7) { RST(0x30);											} /* RST  6           */
3321 
OP(op,f8)3322 OP(op,f8) { RET_COND( F & SF, 0xf8 );							} /* RET  M           */
OP(op,f9)3323 OP(op,f9) { SP = HL;											} /* LD   SP,HL       */
OP(op,fa)3324 OP(op,fa) { JP_COND(F & SF);									} /* JP   M,a         */
OP(op,fb)3325 OP(op,fb) { EI;													} /* EI               */
OP(op,fc)3326 OP(op,fc) { CALL_COND( F & SF, 0xfc );							} /* CALL M,a         */
OP(op,fd)3327 OP(op,fd) { R++; EXEC(fd,ROP());								} /* **** FD xx       */
OP(op,fe)3328 OP(op,fe) { CP(ARG());											} /* CP   n           */
OP(op,ff)3329 OP(op,ff) { RST(0x38);											} /* RST  7           */
3330 
3331 
take_interrupt(void)3332 static void take_interrupt(void)
3333 {
3334 	int irq_vector = Z80Vector;
3335 
3336 	/* there isn't a valid previous program counter */
3337 	PRVPC = (UINT32)-1;
3338 
3339 	/* Check if processor was halted */
3340 	LEAVE_HALT;
3341 
3342 	/* Clear both interrupt flip flops */
3343 	IFF1 = IFF2 = 0;
3344 
3345 	/* Daisy chain mode? If so, call the requesting device */
3346 	if (Z80.daisy)
3347 		irq_vector = z80daisy_call_ack_device(Z80.daisy);
3348 
3349 	/* else call back the cpu interface to retrieve the vector */
3350 //	else
3351 //		irq_vector = (*Z80.irq_callback)(0);
3352 
3353 	/* "hold_irq" assures that an irq request (with CPU_IRQSTATUS_HOLD) gets
3354 	   acknowleged.  This is designed to get around the following 2 problems:
3355 
3356 	   1) Requests made with CPU_IRQSTATUS_AUTO might get skipped in
3357 	   circumstances where IRQs are disabled at the moment it was requested.
3358 
3359 	   2) Requests made with CPU_IRQSTATUS_ACK might cause more than 1 irq to
3360 	   get taken if is held in the _ACK state for too long(!) - dink jan.2016
3361 	*/
3362 	if (Z80.hold_irq) {
3363 		Z80.hold_irq = 0;
3364 		Z80.irq_state = 0;
3365 	}
3366 
3367 //	LOG(("Z80 #%d single int. irq_vector $%02x\n", cpu_getactivecpu(), irq_vector));
3368 
3369 	/* Interrupt mode 2. Call [Z80.i:databyte] */
3370 	if( IM == 2 )
3371 	{
3372 		irq_vector = (irq_vector & 0xff) | (I << 8);
3373 		PUSH( pc );
3374 		RM16( irq_vector, &Z80.pc );
3375 //		LOG(("Z80 #%d IM2 [$%04x] = $%04x\n",cpu_getactivecpu() , irq_vector, PCD));
3376 		/* CALL opcode timing */
3377 		z80_ICount -= cc[Z80_TABLE_op][0xcd];
3378 	}
3379 	else
3380 	/* Interrupt mode 1. RST 38h */
3381 	if( IM == 1 )
3382 	{
3383 //		LOG(("Z80 #%d IM1 $0038\n",cpu_getactivecpu() ));
3384 		PUSH( pc );
3385 		PCD = 0x0038;
3386 		/* RST $38 + 'interrupt latency' cycles */
3387 		z80_ICount -= cc[Z80_TABLE_op][0xff] + cc[Z80_TABLE_ex][0xff];
3388 	}
3389 	else
3390 	{
3391 		/* Interrupt mode 0. We check for CALL and JP instructions, */
3392 		/* if neither of these were found we assume a 1 byte opcode */
3393 		/* was placed on the databus                                */
3394 //		LOG(("Z80 #%d IM0 $%04x\n",cpu_getactivecpu() , irq_vector));
3395 		switch (irq_vector & 0xff0000)
3396 		{
3397 			case 0xcd0000:	/* call */
3398 				PUSH( pc );
3399 				PCD = irq_vector & 0xffff;
3400 				 /* CALL $xxxx + 'interrupt latency' cycles */
3401 				z80_ICount -= cc[Z80_TABLE_op][0xcd] + cc[Z80_TABLE_ex][0xff];
3402 				break;
3403 			case 0xc30000:	/* jump */
3404 				PCD = irq_vector & 0xffff;
3405 				/* JP $xxxx + 2 cycles */
3406 				z80_ICount -= cc[Z80_TABLE_op][0xc3] + cc[Z80_TABLE_ex][0xff];
3407 				break;
3408 			default:		/* rst (or other opcodes?) */
3409 				PUSH( pc );
3410 				PCD = irq_vector & 0x0038;
3411 				/* RST $xx + 2 cycles */
3412 				z80_ICount -= cc[Z80_TABLE_op][PCD] + cc[Z80_TABLE_ex][PCD];
3413 				break;
3414 		}
3415 	}
3416 	WZ=PCD;
3417 	change_pc(PCD);
3418 }
3419 
Z80Init()3420 void Z80Init()
3421 {
3422 	int i, p;
3423 
3424 	/* setup cycle tables */
3425 	cc[Z80_TABLE_op] = cc_op;
3426 	cc[Z80_TABLE_cb] = cc_cb;
3427 	cc[Z80_TABLE_ed] = cc_ed;
3428 	cc[Z80_TABLE_xy] = cc_xy;
3429 	cc[Z80_TABLE_xycb] = cc_xycb;
3430 	cc[Z80_TABLE_ex] = cc_ex;
3431 
3432 #if BIG_FLAGS_ARRAY
3433 	if( !SZHVC_add || !SZHVC_sub )
3434 	{
3435 		int oldval, newval, val;
3436 		UINT8 *padd, *padc, *psub, *psbc;
3437 		/* allocate big flag arrays once */
3438 		SZHVC_add = (UINT8 *)malloc(2*256*256);
3439 		SZHVC_sub = (UINT8 *)malloc(2*256*256);
3440 		if( !SZHVC_add || !SZHVC_sub )
3441 		{
3442 //			fatalerror("Z80: failed to allocate 2 * 128K flags arrays!!!");
3443 		}
3444 		padd = &SZHVC_add[	0*256];
3445 		padc = &SZHVC_add[256*256];
3446 		psub = &SZHVC_sub[	0*256];
3447 		psbc = &SZHVC_sub[256*256];
3448 		for (oldval = 0; oldval < 256; oldval++)
3449 		{
3450 			for (newval = 0; newval < 256; newval++)
3451 			{
3452 				/* add or adc w/o carry set */
3453 				val = newval - oldval;
3454 				*padd = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
3455 				*padd |= (newval & (YF | XF));	/* undocumented flag bits 5+3 */
3456 				if( (newval & 0x0f) < (oldval & 0x0f) ) *padd |= HF;
3457 				if( newval < oldval ) *padd |= CF;
3458 				if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padd |= VF;
3459 				padd++;
3460 
3461 				/* adc with carry set */
3462 				val = newval - oldval - 1;
3463 				*padc = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
3464 				*padc |= (newval & (YF | XF));	/* undocumented flag bits 5+3 */
3465 				if( (newval & 0x0f) <= (oldval & 0x0f) ) *padc |= HF;
3466 				if( newval <= oldval ) *padc |= CF;
3467 				if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padc |= VF;
3468 				padc++;
3469 
3470 				/* cp, sub or sbc w/o carry set */
3471 				val = oldval - newval;
3472 				*psub = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
3473 				*psub |= (newval & (YF | XF));	/* undocumented flag bits 5+3 */
3474 				if( (newval & 0x0f) > (oldval & 0x0f) ) *psub |= HF;
3475 				if( newval > oldval ) *psub |= CF;
3476 				if( (val^oldval) & (oldval^newval) & 0x80 ) *psub |= VF;
3477 				psub++;
3478 
3479 				/* sbc with carry set */
3480 				val = oldval - newval - 1;
3481 				*psbc = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
3482 				*psbc |= (newval & (YF | XF));	/* undocumented flag bits 5+3 */
3483 				if( (newval & 0x0f) >= (oldval & 0x0f) ) *psbc |= HF;
3484 				if( newval >= oldval ) *psbc |= CF;
3485 				if( (val^oldval) & (oldval^newval) & 0x80 ) *psbc |= VF;
3486 				psbc++;
3487 			}
3488 		}
3489 	}
3490 #endif
3491 	for (i = 0; i < 256; i++)
3492 	{
3493 		p = 0;
3494 		if( i&0x01 ) ++p;
3495 		if( i&0x02 ) ++p;
3496 		if( i&0x04 ) ++p;
3497 		if( i&0x08 ) ++p;
3498 		if( i&0x10 ) ++p;
3499 		if( i&0x20 ) ++p;
3500 		if( i&0x40 ) ++p;
3501 		if( i&0x80 ) ++p;
3502 		SZ[i] = i ? i & SF : ZF;
3503 		SZ[i] |= (i & (YF | XF));		/* undocumented flag bits 5+3 */
3504 		SZ_BIT[i] = i ? i & SF : ZF | PF;
3505 		SZ_BIT[i] |= (i & (YF | XF));	/* undocumented flag bits 5+3 */
3506 		SZP[i] = SZ[i] | ((p & 1) ? 0 : PF);
3507 		SZHV_inc[i] = SZ[i];
3508 		if( i == 0x80 ) SZHV_inc[i] |= VF;
3509 		if( (i & 0x0f) == 0x00 ) SZHV_inc[i] |= HF;
3510 		SZHV_dec[i] = SZ[i] | NF;
3511 		if( i == 0x7f ) SZHV_dec[i] |= VF;
3512 		if( (i & 0x0f) == 0x0f ) SZHV_dec[i] |= HF;
3513 	}
3514 
3515 	/* Reset registers to their initial values */
3516 	memset(&Z80, 0, sizeof(Z80));
3517 	Z80.hold_irq = 0;
3518 	WZ = PCD;
3519 //	Z80.daisy = config;
3520 //	Z80.irq_callback = irqcallback;
3521 	IX = IY = 0xffff; /* IX and IY are FFFF after a reset! */
3522 	F = ZF;			/* Zero flag is set */
3523 }
3524 
Z80SetDaisy(void * dptr)3525 void Z80SetDaisy(void *dptr)
3526 {
3527 	Z80.daisy = (z80_irq_daisy_chain *)dptr;
3528 }
3529 
Z80Reset()3530 void Z80Reset()
3531 {
3532 	memset(&Z80, 0, STRUCT_SIZE_HELPER(Z80_Regs, hold_irq)); // don't clear the callback pointers
3533 	Z80.hold_irq = 0;
3534 
3535 	PC = 0x0000;
3536 	I = 0;
3537 	R = 0;
3538 	R2 = 0;
3539 	WZ = PCD;
3540 	Z80.nmi_state = Z80_CLEAR_LINE;
3541 	Z80.nmi_pending = FALSE;
3542 	Z80.irq_state = Z80_CLEAR_LINE;
3543 	Z80.after_ei = FALSE;
3544 	IX = IY = 0xffff; /* IX and IY are FFFF after a reset! */
3545 	IFF1 = 0;
3546 	IFF2 = 0;
3547 	WZ = PCD;
3548 	Z80Vector = 0xff;
3549 
3550 	if (Z80.daisy)
3551 		z80daisy_reset(Z80.daisy);
3552 
3553 	change_pc(PCD);
3554 }
3555 
Z80Exit()3556 void Z80Exit()
3557 {
3558     if (Z80.daisy) {
3559         z80daisy_exit();
3560     }
3561 
3562 	if (SZHVC_add) free(SZHVC_add);
3563 	SZHVC_add = NULL;
3564 	if (SZHVC_sub) free(SZHVC_sub);
3565 	SZHVC_sub = NULL;
3566 	z80edfe_callback = NULL;
3567 }
3568 
Z80Execute(int cycles)3569 int Z80Execute(int cycles)
3570 {
3571 	z80_ICount = cycles;
3572 	Z80.cycles_left = cycles;
3573 	end_run = 0;
3574 
3575 	/* check for NMIs on the way in; they can only be set externally */
3576 	/* via timers, and can't be dynamically enabled, so it is safe */
3577 	/* to just check here */
3578 	if (Z80.nmi_pending)
3579 	{
3580 //		LOG(("Z80 #%d take NMI\n", cpu_getactivecpu()));
3581 		PRVPC = (UINT32)-1;			/* there isn't a valid previous program counter */
3582 		LEAVE_HALT;			/* Check if processor was halted */
3583 
3584 		IFF1 = 0;
3585 		PUSH( pc );
3586 		PCD = 0x0066;
3587 		WZ=PCD;
3588 		change_pc(PCD);
3589 		z80_ICount -= 11;
3590 		Z80.nmi_pending = FALSE;
3591 	}
3592 
3593 	do
3594 	{
3595 		/* check for IRQs before each instruction */
3596 		if (Z80.irq_state != Z80_CLEAR_LINE && IFF1 && !Z80.after_ei)
3597 			take_interrupt();
3598 		Z80.after_ei = FALSE;
3599 
3600 		PRVPC = PCD;
3601 //		CALL_DEBUGGER(PCD);
3602 		R++;
3603 		EXEC_INLINE(op,ROP());
3604 	} while( z80_ICount > 0 && !end_run );
3605 
3606 	cycles = cycles - z80_ICount;
3607 
3608 	Z80.cycles_left = z80_ICount = 0;
3609 
3610     if (Z80.daisy && z80daisy_has_ctc) {
3611         z80ctc_timer_update(cycles);
3612     }
3613 
3614 	return cycles;
3615 }
3616 
Z80StopExecute()3617 void Z80StopExecute()
3618 {
3619 	end_run = 1;
3620 }
3621 
z80TotalCycles()3622 INT32 z80TotalCycles()
3623 {
3624 	return Z80.cycles_left - z80_ICount;
3625 }
3626 
Z80Burn(int cycles)3627 void Z80Burn(int cycles)
3628 {
3629 	if( cycles > 0 )
3630 	{
3631 		/* NOP takes 4 cycles per instruction */
3632 		int n = (cycles + 3) / 4;
3633 		R += n;
3634 		z80_ICount -= 4 * n;
3635 	}
3636 }
3637 
Z80SetIrqLine(int irqline,int state)3638 void Z80SetIrqLine(int irqline, int state)
3639 {
3640 	if (irqline == Z80_INPUT_LINE_NMI)
3641 	{
3642 		/* mark an NMI pending on the rising edge */
3643 		if (Z80.nmi_state == Z80_CLEAR_LINE && state != Z80_CLEAR_LINE)
3644 			Z80.nmi_pending = TRUE;
3645 		Z80.nmi_state = state;
3646 	}
3647 	else
3648 	{
3649 		/* update the IRQ state via the daisy chain */
3650 		Z80.irq_state = state;
3651 		if (Z80.daisy)
3652 			Z80.irq_state = z80daisy_update_irq_state(Z80.daisy);
3653 
3654 		/* the main execute loop will take the interrupt */
3655 	}
3656 }
3657 
Z80GetContext(void * dst)3658 void Z80GetContext (void *dst)
3659 {
3660 	if( dst )
3661 		*(Z80_Regs*)dst = Z80;
3662 }
3663 
Z80SetContext(void * src)3664 void Z80SetContext (void *src)
3665 {
3666 	if( src )
3667 		Z80 = *(Z80_Regs*)src;
3668 	change_pc(PCD);
3669 }
3670 
Z80Scan(int nAction)3671 int Z80Scan(int nAction)
3672 {
3673     if (Z80.daisy) {
3674         z80daisy_scan(nAction);
3675     }
3676 
3677 	return 0;
3678 }
3679 
Z80SetIOReadHandler(Z80ReadIoHandler handler)3680 void Z80SetIOReadHandler(Z80ReadIoHandler handler)
3681 {
3682 	Z80IORead = handler;
3683 }
3684 
Z80SetIOWriteHandler(Z80WriteIoHandler handler)3685 void Z80SetIOWriteHandler(Z80WriteIoHandler handler)
3686 {
3687 	Z80IOWrite = handler;
3688 }
3689 
Z80SetProgramReadHandler(Z80ReadProgHandler handler)3690 void Z80SetProgramReadHandler(Z80ReadProgHandler handler)
3691 {
3692 	Z80ProgramRead = handler;
3693 }
3694 
Z80SetProgramWriteHandler(Z80WriteProgHandler handler)3695 void Z80SetProgramWriteHandler(Z80WriteProgHandler handler)
3696 {
3697 	Z80ProgramWrite = handler;
3698 }
3699 
Z80SetCPUOpReadHandler(Z80ReadOpHandler handler)3700 void Z80SetCPUOpReadHandler(Z80ReadOpHandler handler)
3701 {
3702 	Z80CPUReadOp = handler;
3703 }
3704 
Z80SetCPUOpArgReadHandler(Z80ReadOpArgHandler handler)3705 void Z80SetCPUOpArgReadHandler(Z80ReadOpArgHandler handler)
3706 {
3707 	Z80CPUReadOpArg = handler;
3708 }
3709 
ActiveZ80GetPC()3710 int ActiveZ80GetPC()
3711 {
3712 	return Z80.pc.w.l;
3713 }
3714 
ActiveZ80GetBC()3715 int ActiveZ80GetBC()
3716 {
3717 	return Z80.bc.w.l;
3718 }
3719 
ActiveZ80GetDE()3720 int ActiveZ80GetDE()
3721 {
3722 	return Z80.de.w.l;
3723 }
3724 
ActiveZ80GetHL()3725 int ActiveZ80GetHL()
3726 {
3727 	return Z80.hl.w.l;
3728 }
3729 
ActiveZ80GetI()3730 int ActiveZ80GetI()
3731 {
3732 	return Z80.i;
3733 }
3734 
ActiveZ80GetIM()3735 int ActiveZ80GetIM()
3736 {
3737 	return Z80.im;
3738 }
3739 
ActiveZ80GetSP()3740 int ActiveZ80GetSP()
3741 {
3742 	return Z80.sp.w.l;
3743 }
3744 
ActiveZ80GetPrevPC()3745 int ActiveZ80GetPrevPC()
3746 {
3747 	return Z80.prvpc.w.l;
3748 }
3749 
ActiveZ80SetIRQHold()3750 void ActiveZ80SetIRQHold()
3751 {
3752 	Z80.hold_irq = 1;
3753 }
3754 
ActiveZ80SetVector(INT32 vector)3755 void ActiveZ80SetVector(INT32 vector)
3756 {
3757 	Z80Vector = vector;
3758 }
3759 
ActiveZ80GetVector()3760 int ActiveZ80GetVector()
3761 {
3762 	return Z80Vector;
3763 }
3764 
3765 #if 0
3766 /****************************************************************************
3767  * Processor initialization
3768  ****************************************************************************/
3769 static void z80_init(int index, int clock, const void *config, int (*irqcallback)(int))
3770 {
3771 	int i, p;
3772 
3773 	/* setup cycle tables */
3774 	cc[Z80_TABLE_op] = cc_op;
3775 	cc[Z80_TABLE_cb] = cc_cb;
3776 	cc[Z80_TABLE_ed] = cc_ed;
3777 	cc[Z80_TABLE_xy] = cc_xy;
3778 	cc[Z80_TABLE_xycb] = cc_xycb;
3779 	cc[Z80_TABLE_ex] = cc_ex;
3780 
3781 #if BIG_FLAGS_ARRAY
3782 	if( !SZHVC_add || !SZHVC_sub )
3783 	{
3784 		int oldval, newval, val;
3785 		UINT8 *padd, *padc, *psub, *psbc;
3786 		/* allocate big flag arrays once */
3787 		SZHVC_add = (UINT8 *)malloc(2*256*256);
3788 		SZHVC_sub = (UINT8 *)malloc(2*256*256);
3789 		if( !SZHVC_add || !SZHVC_sub )
3790 		{
3791 			fatalerror("Z80: failed to allocate 2 * 128K flags arrays!!!");
3792 		}
3793 		padd = &SZHVC_add[	0*256];
3794 		padc = &SZHVC_add[256*256];
3795 		psub = &SZHVC_sub[	0*256];
3796 		psbc = &SZHVC_sub[256*256];
3797 		for (oldval = 0; oldval < 256; oldval++)
3798 		{
3799 			for (newval = 0; newval < 256; newval++)
3800 			{
3801 				/* add or adc w/o carry set */
3802 				val = newval - oldval;
3803 				*padd = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
3804 				*padd |= (newval & (YF | XF));	/* undocumented flag bits 5+3 */
3805 				if( (newval & 0x0f) < (oldval & 0x0f) ) *padd |= HF;
3806 				if( newval < oldval ) *padd |= CF;
3807 				if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padd |= VF;
3808 				padd++;
3809 
3810 				/* adc with carry set */
3811 				val = newval - oldval - 1;
3812 				*padc = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
3813 				*padc |= (newval & (YF | XF));	/* undocumented flag bits 5+3 */
3814 				if( (newval & 0x0f) <= (oldval & 0x0f) ) *padc |= HF;
3815 				if( newval <= oldval ) *padc |= CF;
3816 				if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padc |= VF;
3817 				padc++;
3818 
3819 				/* cp, sub or sbc w/o carry set */
3820 				val = oldval - newval;
3821 				*psub = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
3822 				*psub |= (newval & (YF | XF));	/* undocumented flag bits 5+3 */
3823 				if( (newval & 0x0f) > (oldval & 0x0f) ) *psub |= HF;
3824 				if( newval > oldval ) *psub |= CF;
3825 				if( (val^oldval) & (oldval^newval) & 0x80 ) *psub |= VF;
3826 				psub++;
3827 
3828 				/* sbc with carry set */
3829 				val = oldval - newval - 1;
3830 				*psbc = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
3831 				*psbc |= (newval & (YF | XF));	/* undocumented flag bits 5+3 */
3832 				if( (newval & 0x0f) >= (oldval & 0x0f) ) *psbc |= HF;
3833 				if( newval >= oldval ) *psbc |= CF;
3834 				if( (val^oldval) & (oldval^newval) & 0x80 ) *psbc |= VF;
3835 				psbc++;
3836 			}
3837 		}
3838 	}
3839 #endif
3840 	for (i = 0; i < 256; i++)
3841 	{
3842 		p = 0;
3843 		if( i&0x01 ) ++p;
3844 		if( i&0x02 ) ++p;
3845 		if( i&0x04 ) ++p;
3846 		if( i&0x08 ) ++p;
3847 		if( i&0x10 ) ++p;
3848 		if( i&0x20 ) ++p;
3849 		if( i&0x40 ) ++p;
3850 		if( i&0x80 ) ++p;
3851 		SZ[i] = i ? i & SF : ZF;
3852 		SZ[i] |= (i & (YF | XF));		/* undocumented flag bits 5+3 */
3853 		SZ_BIT[i] = i ? i & SF : ZF | PF;
3854 		SZ_BIT[i] |= (i & (YF | XF));	/* undocumented flag bits 5+3 */
3855 		SZP[i] = SZ[i] | ((p & 1) ? 0 : PF);
3856 		SZHV_inc[i] = SZ[i];
3857 		if( i == 0x80 ) SZHV_inc[i] |= VF;
3858 		if( (i & 0x0f) == 0x00 ) SZHV_inc[i] |= HF;
3859 		SZHV_dec[i] = SZ[i] | NF;
3860 		if( i == 0x7f ) SZHV_dec[i] |= VF;
3861 		if( (i & 0x0f) == 0x0f ) SZHV_dec[i] |= HF;
3862 	}
3863 
3864 	state_save_register_item("z80", index, Z80.prvpc.w.l);
3865 	state_save_register_item("z80", index, Z80.pc.w.l);
3866 	state_save_register_item("z80", index, Z80.sp.w.l);
3867 	state_save_register_item("z80", index, Z80.af.w.l);
3868 	state_save_register_item("z80", index, Z80.bc.w.l);
3869 	state_save_register_item("z80", index, Z80.de.w.l);
3870 	state_save_register_item("z80", index, Z80.hl.w.l);
3871 	state_save_register_item("z80", index, Z80.ix.w.l);
3872 	state_save_register_item("z80", index, Z80.iy.w.l);
3873 	state_save_register_item("z80", index, Z80.af2.w.l);
3874 	state_save_register_item("z80", index, Z80.bc2.w.l);
3875 	state_save_register_item("z80", index, Z80.de2.w.l);
3876 	state_save_register_item("z80", index, Z80.hl2.w.l);
3877 	state_save_register_item("z80", index, Z80.r);
3878 	state_save_register_item("z80", index, Z80.r2);
3879 	state_save_register_item("z80", index, Z80.iff1);
3880 	state_save_register_item("z80", index, Z80.iff2);
3881 	state_save_register_item("z80", index, Z80.halt);
3882 	state_save_register_item("z80", index, Z80.im);
3883 	state_save_register_item("z80", index, Z80.i);
3884 	state_save_register_item("z80", index, Z80.nmi_state);
3885 	state_save_register_item("z80", index, Z80.nmi_pending);
3886 	state_save_register_item("z80", index, Z80.irq_state);
3887 	state_save_register_item("z80", index, Z80.after_ei);
3888 
3889 	/* Reset registers to their initial values */
3890 	memset(&Z80, 0, sizeof(Z80));
3891 	Z80.daisy = config;
3892 	Z80.irq_callback = irqcallback;
3893 	IX = IY = 0xffff; /* IX and IY are FFFF after a reset! */
3894 	F = ZF;			/* Zero flag is set */
3895 }
3896 
3897 /****************************************************************************
3898  * Do a reset
3899  ****************************************************************************/
3900 
3901 // NOTE:
3902 // This is here for reference only!!  Z80Reset(); is what you're looking for.
3903 
3904 static void z80_reset(void)
3905 {
3906 	PC = 0x0000;
3907 	I = 0;
3908 	R = 0;
3909 	R2 = 0;
3910 	Z80.nmi_state = Z80_CLEAR_LINE;
3911 	Z80.nmi_pending = FALSE;
3912 	Z80.irq_state = Z80_CLEAR_LINE;
3913 	Z80.after_ei = FALSE;
3914 
3915 	Z80Vector = 0xff; // Correct to reset this to 0xff?
3916 
3917 	if (Z80.daisy)
3918 		z80daisy_reset(Z80.daisy);
3919 
3920 	change_pc(PCD);
3921 }
3922 
3923 static void z80_exit(void)
3924 {
3925 #if BIG_FLAGS_ARRAY
3926 	if (SZHVC_add) free(SZHVC_add);
3927 	SZHVC_add = NULL;
3928 	if (SZHVC_sub) free(SZHVC_sub);
3929 	SZHVC_sub = NULL;
3930 #endif
3931 }
3932 
3933 /****************************************************************************
3934  * Execute 'cycles' T-states. Return number of T-states really executed
3935  ****************************************************************************/
3936 
3937 // NOTE:
3938 // This is here for reference only!!  Z80Execute(); is what you're looking for.
3939 
3940 static int z80_execute(int cycles)
3941 {
3942 	z80_ICount = cycles;
3943 
3944 	/* check for NMIs on the way in; they can only be set externally */
3945 	/* via timers, and can't be dynamically enabled, so it is safe */
3946 	/* to just check here */
3947 	if (Z80.nmi_pending)
3948 	{
3949 		LOG(("Z80 #%d take NMI\n", cpu_getactivecpu()));
3950 		PRVPC = -1;			/* there isn't a valid previous program counter */
3951 		LEAVE_HALT;			/* Check if processor was halted */
3952 
3953 		IFF1 = 0;
3954 		PUSH( pc );
3955 		PCD = 0x0066;
3956 		WZ=PCD;
3957 		change_pc(PCD);
3958 		z80_ICount -= 11;
3959 		Z80.nmi_pending = FALSE;
3960 	}
3961 
3962 	do
3963 	{
3964 		/* check for IRQs before each instruction */
3965 		if (Z80.irq_state != Z80_CLEAR_LINE && IFF1 && !Z80.after_ei)
3966 			take_interrupt();
3967 		Z80.after_ei = FALSE;
3968 
3969 		PRVPC = PCD;
3970 		CALL_DEBUGGER(PCD);
3971 		R++;
3972 		EXEC_INLINE(op,ROP());
3973 	} while( z80_ICount > 0 );
3974 
3975 	return cycles - z80_ICount;
3976 }
3977 
3978 /****************************************************************************
3979  * Burn 'cycles' T-states. Adjust R register for the lost time
3980  ****************************************************************************/
3981 static void z80_burn(int cycles)
3982 {
3983 	if( cycles > 0 )
3984 	{
3985 		/* NOP takes 4 cycles per instruction */
3986 		int n = (cycles + 3) / 4;
3987 		R += n;
3988 		z80_ICount -= 4 * n;
3989 	}
3990 }
3991 
3992 /****************************************************************************
3993  * Get all registers in given buffer
3994  ****************************************************************************/
3995 static void z80_get_context (void *dst)
3996 {
3997 	if( dst )
3998 		*(Z80_Regs*)dst = Z80;
3999 }
4000 
4001 /****************************************************************************
4002  * Set all registers to given values
4003  ****************************************************************************/
4004 static void z80_set_context (void *src)
4005 {
4006 	if( src )
4007 		Z80 = *(Z80_Regs*)src;
4008 	change_pc(PCD);
4009 }
4010 
4011 /****************************************************************************
4012  * Set IRQ line state
4013  ****************************************************************************/
4014 static void set_irq_line(int irqline, int state)
4015 {
4016 	if (irqline == INPUT_LINE_NMI)
4017 	{
4018 		/* mark an NMI pending on the rising edge */
4019 		if (Z80.nmi_state == Z80_CLEAR_LINE && state != Z80_CLEAR_LINE)
4020 			Z80.nmi_pending = TRUE;
4021 		Z80.nmi_state = state;
4022 	}
4023 	else
4024 	{
4025 		/* update the IRQ state via the daisy chain */
4026 		Z80.irq_state = state;
4027 		if (Z80.daisy)
4028 			Z80.irq_state = z80daisy_update_irq_state(Z80.daisy);
4029 
4030 		/* the main execute loop will take the interrupt */
4031 	}
4032 }
4033 
4034 /**************************************************************************
4035  * Generic set_info
4036  **************************************************************************/
4037 
4038 static void z80_set_info(UINT32 state, cpuinfo *info)
4039 {
4040 	switch (state)
4041 	{
4042 		/* --- the following bits of info are set as 64-bit signed integers --- */
4043 		case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI:		set_irq_line(INPUT_LINE_NMI, info->i); break;
4044 		case CPUINFO_INT_INPUT_STATE + 0:					set_irq_line(0, info->i);			break;
4045 
4046 		case CPUINFO_INT_PC:								PC = info->i; change_pc(PCD);		break;
4047 		case CPUINFO_INT_REGISTER + Z80_PC:					Z80.pc.w.l = info->i;				break;
4048 		case CPUINFO_INT_SP:								SP = info->i;						break;
4049 		case CPUINFO_INT_REGISTER + Z80_SP:					Z80.sp.w.l = info->i;				break;
4050 		case CPUINFO_INT_REGISTER + Z80_A:					Z80.af.b.h = info->i;				break;
4051 		case CPUINFO_INT_REGISTER + Z80_B:					Z80.bc.b.h = info->i;				break;
4052 		case CPUINFO_INT_REGISTER + Z80_C:					Z80.bc.b.l = info->i;				break;
4053 		case CPUINFO_INT_REGISTER + Z80_D:					Z80.de.b.h = info->i;				break;
4054 		case CPUINFO_INT_REGISTER + Z80_E:					Z80.de.b.l = info->i;				break;
4055 		case CPUINFO_INT_REGISTER + Z80_H:					Z80.hl.b.h = info->i;				break;
4056 		case CPUINFO_INT_REGISTER + Z80_L:					Z80.hl.b.l = info->i;				break;
4057 		case CPUINFO_INT_REGISTER + Z80_AF:					Z80.af.w.l = info->i;				break;
4058 		case CPUINFO_INT_REGISTER + Z80_BC:					Z80.bc.w.l = info->i;				break;
4059 		case CPUINFO_INT_REGISTER + Z80_DE:					Z80.de.w.l = info->i;				break;
4060 		case CPUINFO_INT_REGISTER + Z80_HL:					Z80.hl.w.l = info->i;				break;
4061 		case CPUINFO_INT_REGISTER + Z80_IX:					Z80.ix.w.l = info->i;				break;
4062 		case CPUINFO_INT_REGISTER + Z80_IY:					Z80.iy.w.l = info->i;				break;
4063 		case CPUINFO_INT_REGISTER + Z80_R:					Z80.r = info->i; Z80.r2 = info->i & 0x80; break;
4064 		case CPUINFO_INT_REGISTER + Z80_I:					Z80.i = info->i;					break;
4065 		case CPUINFO_INT_REGISTER + Z80_AF2:				Z80.af2.w.l = info->i;				break;
4066 		case CPUINFO_INT_REGISTER + Z80_BC2:				Z80.bc2.w.l = info->i;				break;
4067 		case CPUINFO_INT_REGISTER + Z80_DE2:				Z80.de2.w.l = info->i;				break;
4068 		case CPUINFO_INT_REGISTER + Z80_HL2:				Z80.hl2.w.l = info->i;				break;
4069 		case CPUINFO_INT_REGISTER + Z80_IM:					Z80.im = info->i;					break;
4070 		case CPUINFO_INT_REGISTER + Z80_IFF1:				Z80.iff1 = info->i;					break;
4071 		case CPUINFO_INT_REGISTER + Z80_IFF2:				Z80.iff2 = info->i;					break;
4072 		case CPUINFO_INT_REGISTER + Z80_HALT:				Z80.halt = info->i;					break;
4073 
4074 		/* --- the following bits of info are set as pointers to data or functions --- */
4075 		case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_op:	cc[Z80_TABLE_op] = info->p;			break;
4076 		case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_cb:	cc[Z80_TABLE_cb] = info->p;			break;
4077 		case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ed:	cc[Z80_TABLE_ed] = info->p;			break;
4078 		case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_xy:	cc[Z80_TABLE_xy] = info->p;			break;
4079 		case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_xycb:	cc[Z80_TABLE_xycb] = info->p;		break;
4080 		case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ex:	cc[Z80_TABLE_ex] = info->p;			break;
4081 	}
4082 }
4083 
4084 
4085 
4086 /**************************************************************************
4087  * Generic get_info
4088  **************************************************************************/
4089 
4090 void z80_get_info(UINT32 state, cpuinfo *info)
4091 {
4092 	switch (state)
4093 	{
4094 		/* --- the following bits of info are returned as 64-bit signed integers --- */
4095 		case CPUINFO_INT_CONTEXT_SIZE:				info->i = sizeof(Z80);						break;
4096 		case CPUINFO_INT_INPUT_LINES:				info->i = 1;								break;
4097 		case CPUINFO_INT_DEFAULT_IRQ_VECTOR:		info->i = 0xff;								break;
4098 		case CPUINFO_INT_ENDIANNESS:				info->i = CPU_IS_LE;						break;
4099 		case CPUINFO_INT_CLOCK_MULTIPLIER:			info->i = 1;								break;
4100 		case CPUINFO_INT_CLOCK_DIVIDER:				info->i = 1;								break;
4101 		case CPUINFO_INT_MIN_INSTRUCTION_BYTES:		info->i = 1;								break;
4102 		case CPUINFO_INT_MAX_INSTRUCTION_BYTES:		info->i = 4;								break;
4103 		case CPUINFO_INT_MIN_CYCLES:				info->i = 1;								break;
4104 		case CPUINFO_INT_MAX_CYCLES:				info->i = 16;								break;
4105 
4106 		case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_PROGRAM:	info->i = 8;					break;
4107 		case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_PROGRAM:	info->i = 16;					break;
4108 		case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_PROGRAM:	info->i = 0;					break;
4109 		case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_DATA:	info->i = 0;					break;
4110 		case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_DATA:	info->i = 0;					break;
4111 		case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_DATA:	info->i = 0;					break;
4112 		case CPUINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_IO:		info->i = 8;					break;
4113 		case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_IO:		info->i = 16;					break;
4114 		case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_IO:		info->i = 0;					break;
4115 
4116 		case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI:	info->i = Z80.nmi_state;				break;
4117 		case CPUINFO_INT_INPUT_STATE + 0:			info->i = Z80.irq_state;					break;
4118 
4119 		case CPUINFO_INT_PREVIOUSPC:				info->i = Z80.prvpc.w.l;					break;
4120 
4121 		case CPUINFO_INT_PC:						info->i = PCD;								break;
4122 		case CPUINFO_INT_REGISTER + Z80_PC:			info->i = Z80.pc.w.l;						break;
4123 		case CPUINFO_INT_SP:						info->i = SPD;								break;
4124 		case CPUINFO_INT_REGISTER + Z80_SP:			info->i = Z80.sp.w.l;						break;
4125 		case CPUINFO_INT_REGISTER + Z80_A:			info->i = Z80.af.b.h;						break;
4126 		case CPUINFO_INT_REGISTER + Z80_B:			info->i = Z80.bc.b.h;						break;
4127 		case CPUINFO_INT_REGISTER + Z80_C:			info->i = Z80.bc.b.l;						break;
4128 		case CPUINFO_INT_REGISTER + Z80_D:			info->i = Z80.de.b.h;						break;
4129 		case CPUINFO_INT_REGISTER + Z80_E:			info->i = Z80.de.b.l;						break;
4130 		case CPUINFO_INT_REGISTER + Z80_H:			info->i = Z80.hl.b.h;						break;
4131 		case CPUINFO_INT_REGISTER + Z80_L:			info->i = Z80.hl.b.l;						break;
4132 		case CPUINFO_INT_REGISTER + Z80_AF:			info->i = Z80.af.w.l;						break;
4133 		case CPUINFO_INT_REGISTER + Z80_BC:			info->i = Z80.bc.w.l;						break;
4134 		case CPUINFO_INT_REGISTER + Z80_DE:			info->i = Z80.de.w.l;						break;
4135 		case CPUINFO_INT_REGISTER + Z80_HL:			info->i = Z80.hl.w.l;						break;
4136 		case CPUINFO_INT_REGISTER + Z80_IX:			info->i = Z80.ix.w.l;						break;
4137 		case CPUINFO_INT_REGISTER + Z80_IY:			info->i = Z80.iy.w.l;						break;
4138 		case CPUINFO_INT_REGISTER + Z80_R:			info->i = (Z80.r & 0x7f) | (Z80.r2 & 0x80);	break;
4139 		case CPUINFO_INT_REGISTER + Z80_I:			info->i = Z80.i;							break;
4140 		case CPUINFO_INT_REGISTER + Z80_AF2:		info->i = Z80.af2.w.l;						break;
4141 		case CPUINFO_INT_REGISTER + Z80_BC2:		info->i = Z80.bc2.w.l;						break;
4142 		case CPUINFO_INT_REGISTER + Z80_DE2:		info->i = Z80.de2.w.l;						break;
4143 		case CPUINFO_INT_REGISTER + Z80_HL2:		info->i = Z80.hl2.w.l;						break;
4144 		case CPUINFO_INT_REGISTER + Z80_IM:			info->i = Z80.im;							break;
4145 		case CPUINFO_INT_REGISTER + Z80_IFF1:		info->i = Z80.iff1;							break;
4146 		case CPUINFO_INT_REGISTER + Z80_IFF2:		info->i = Z80.iff2;							break;
4147 		case CPUINFO_INT_REGISTER + Z80_HALT:		info->i = Z80.halt;							break;
4148 
4149 		/* --- the following bits of info are returned as pointers to data or functions --- */
4150 		case CPUINFO_PTR_SET_INFO:					info->setinfo = z80_set_info;				break;
4151 		case CPUINFO_PTR_GET_CONTEXT:				info->getcontext = z80_get_context;			break;
4152 		case CPUINFO_PTR_SET_CONTEXT:				info->setcontext = z80_set_context;			break;
4153 		case CPUINFO_PTR_INIT:						info->init = z80_init;						break;
4154 		case CPUINFO_PTR_RESET:						info->reset = z80_reset;					break;
4155 		case CPUINFO_PTR_EXIT:						info->exit = z80_exit;						break;
4156 		case CPUINFO_PTR_EXECUTE:					info->execute = z80_execute;				break;
4157 		case CPUINFO_PTR_BURN:						info->burn = NULL;							break;
4158 #ifdef ENABLE_DEBUGGER
4159 		case CPUINFO_PTR_DISASSEMBLE:				info->disassemble = z80_dasm;				break;
4160 #endif
4161 		case CPUINFO_PTR_INSTRUCTION_COUNTER:				info->icount = &z80_ICount;			break;
4162 		case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_op:	info->p = (void *)cc[Z80_TABLE_op];	break;
4163 		case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_cb:	info->p = (void *)cc[Z80_TABLE_cb];	break;
4164 		case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ed:	info->p = (void *)cc[Z80_TABLE_ed];	break;
4165 		case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_xy:	info->p = (void *)cc[Z80_TABLE_xy];	break;
4166 		case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_xycb:	info->p = (void *)cc[Z80_TABLE_xycb]; break;
4167 		case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ex:	info->p = (void *)cc[Z80_TABLE_ex];	break;
4168 
4169 		/* --- the following bits of info are returned as NULL-terminated strings --- */
4170 		case CPUINFO_STR_NAME:						strcpy(info->s, "Z80");						break;
4171 		case CPUINFO_STR_CORE_FAMILY:				strcpy(info->s, "Zilog Z80");				break;
4172 		case CPUINFO_STR_CORE_VERSION:				strcpy(info->s, "3.7");						break;
4173 		case CPUINFO_STR_CORE_FILE:					strcpy(info->s, __FILE__);					break;
4174 		case CPUINFO_STR_CORE_CREDITS:				strcpy(info->s, "Copyright Juergen Buchmueller, all rights reserved."); break;
4175 
4176 		case CPUINFO_STR_FLAGS:
4177 			sprintf(info->s, "%c%c%c%c%c%c%c%c",
4178 				Z80.af.b.l & 0x80 ? 'S':'.',
4179 				Z80.af.b.l & 0x40 ? 'Z':'.',
4180 				Z80.af.b.l & 0x20 ? '5':'.',
4181 				Z80.af.b.l & 0x10 ? 'H':'.',
4182 				Z80.af.b.l & 0x08 ? '3':'.',
4183 				Z80.af.b.l & 0x04 ? 'P':'.',
4184 				Z80.af.b.l & 0x02 ? 'N':'.',
4185 				Z80.af.b.l & 0x01 ? 'C':'.');
4186 			break;
4187 
4188 		case CPUINFO_STR_REGISTER + Z80_PC:			sprintf(info->s, "PC:%04X", Z80.pc.w.l);	break;
4189 		case CPUINFO_STR_REGISTER + Z80_SP:			sprintf(info->s, "SP:%04X", Z80.sp.w.l);	break;
4190 		case CPUINFO_STR_REGISTER + Z80_A:			sprintf(info->s, "~A:%02X", Z80.af.b.h);	break;
4191 		case CPUINFO_STR_REGISTER + Z80_B:			sprintf(info->s, "~B:%02X", Z80.bc.b.h);	break;
4192 		case CPUINFO_STR_REGISTER + Z80_C:			sprintf(info->s, "~C:%02X", Z80.bc.b.l);	break;
4193 		case CPUINFO_STR_REGISTER + Z80_D:			sprintf(info->s, "~D:%02X", Z80.de.b.h);	break;
4194 		case CPUINFO_STR_REGISTER + Z80_E:			sprintf(info->s, "~E:%02X", Z80.de.b.l);	break;
4195 		case CPUINFO_STR_REGISTER + Z80_H:			sprintf(info->s, "~H:%02X", Z80.hl.b.h);	break;
4196 		case CPUINFO_STR_REGISTER + Z80_L:			sprintf(info->s, "~L:%02X", Z80.hl.b.l);	break;
4197 		case CPUINFO_STR_REGISTER + Z80_AF:			sprintf(info->s, "AF:%04X", Z80.af.w.l);	break;
4198 		case CPUINFO_STR_REGISTER + Z80_BC:			sprintf(info->s, "BC:%04X", Z80.bc.w.l);	break;
4199 		case CPUINFO_STR_REGISTER + Z80_DE:			sprintf(info->s, "DE:%04X", Z80.de.w.l);	break;
4200 		case CPUINFO_STR_REGISTER + Z80_HL:			sprintf(info->s, "HL:%04X", Z80.hl.w.l);	break;
4201 		case CPUINFO_STR_REGISTER + Z80_IX:			sprintf(info->s, "IX:%04X", Z80.ix.w.l);	break;
4202 		case CPUINFO_STR_REGISTER + Z80_IY:			sprintf(info->s, "IY:%04X", Z80.iy.w.l);
4203 			break;
4204 		case CPUINFO_STR_REGISTER + Z80_R:			sprintf(info->s, "R:%02X", (Z80.r & 0x7f) | (Z80.r2 & 0x80)); break;
4205 		case CPUINFO_STR_REGISTER + Z80_I:			sprintf(info->s, "I:%02X", Z80.i);			break;
4206 		case CPUINFO_STR_REGISTER + Z80_AF2:		sprintf(info->s, "AF2:%04X", Z80.af2.w.l);	break;
4207 		case CPUINFO_STR_REGISTER + Z80_BC2:		sprintf(info->s, "BC2:%04X", Z80.bc2.w.l);	break;
4208 		case CPUINFO_STR_REGISTER + Z80_DE2:		sprintf(info->s, "DE2:%04X", Z80.de2.w.l);	break;
4209 		case CPUINFO_STR_REGISTER + Z80_HL2:		sprintf(info->s, "HL2:%04X", Z80.hl2.w.l);	break;
4210 		case CPUINFO_STR_REGISTER + Z80_IM:			sprintf(info->s, "IM:%X", Z80.im);			break;
4211 		case CPUINFO_STR_REGISTER + Z80_IFF1:		sprintf(info->s, "IFF1:%X", Z80.iff1);		break;
4212 		case CPUINFO_STR_REGISTER + Z80_IFF2:		sprintf(info->s, "IFF2:%X", Z80.iff2);		break;
4213 		case CPUINFO_STR_REGISTER + Z80_HALT:		sprintf(info->s, "HALT:%X", Z80.halt);		break;
4214 	}
4215 }
4216 
4217 #endif
4218