OSDN Git Service

[VM][COMMON_VM] Include IO:: class to common_vm.
[csp-qt/common_source_project-fm7.git] / source / src / vm / z80_base.cpp
1 /*
2         Skelton for retropc emulator
3
4         Origin : MAME 0.145
5         Author : Takeda.Toshiya
6         Date   : 2012.02.15-
7
8         [ Z80 ]
9 */
10
11 #include "./z80.h"
12 //#ifdef USE_DEBUGGER
13 //#include "debugger.h"
14 //#endif
15
16 //#ifndef CPU_START_ADDR
17 //#define CPU_START_ADDR        0
18 //#endif
19
20 #define NMI_REQ_BIT     0x80000000
21
22 #define CF      0x01
23 #define NF      0x02
24 #define PF      0x04
25 #define VF      PF
26 #define XF      0x08
27 #define HF      0x10
28 #define YF      0x20
29 #define ZF      0x40
30 #define SF      0x80
31
32 #define PCD     pc.d
33 #define PC      pc.w.l
34
35 #define SPD     sp.d
36 #define SP      sp.w.l
37
38 #define AFD     af.d
39 #define AF      af.w.l
40 #define A       af.b.h
41 #define F       af.b.l
42
43 #define BCD     bc.d
44 #define BC      bc.w.l
45 #define B       bc.b.h
46 #define C       bc.b.l
47
48 #define DED     de.d
49 #define DE      de.w.l
50 #define D       de.b.h
51 #define E       de.b.l
52
53 #define HLD     hl.d
54 #define HL      hl.w.l
55 #define H       hl.b.h
56 #define L       hl.b.l
57
58 #define IXD     ix.d
59 #define IX      ix.w.l
60 #define HX      ix.b.h
61 #define LX      ix.b.l
62
63 #define IYD     iy.d
64 #define IY      iy.w.l
65 #define HY      iy.b.h
66 #define LY      iy.b.l
67
68 #define AF2     af2.w.l
69 #define A2      af2.b.h
70 #define F2      af2.b.l
71
72 #define BC2     bc2.w.l
73 #define B2      bc2.b.h
74 #define C2      bc2.b.l
75
76 #define DE2     de2.w.l
77 #define D2      de2.b.h
78 #define E2      de2.b.l
79
80 #define HL2     hl2.w.l
81 #define H2      hl2.b.h
82 #define L2      hl2.b.l
83
84 #define WZD     wz.d
85 #define WZ      wz.w.l
86 #define WZ_H    wz.b.h
87 #define WZ_L    wz.b.l
88
89
90 // opecode definitions
91
92 #define ENTER_HALT() do { \
93         PC--; \
94         after_halt = true; \
95 } while(0)
96
97 #define LEAVE_HALT() do { \
98         if(after_halt) { \
99                 after_halt = false; \
100                 PC++; \
101         } \
102 } while(0)
103
104 #define UPDATE_EXTRA_EVENT(clock) do { \
105         if(is_primary) { \
106                 if(busreq) { \
107                         busreq_icount += (clock); \
108                 } \
109                 update_extra_event(clock); \
110         } \
111 } while(0)
112
113 Z80_INLINE uint8_t __FASTCALL Z80_BASE::RM8(uint32_t addr)
114 {
115 //#ifdef Z80_MEMORY_WAIT
116         UPDATE_EXTRA_EVENT(1);
117         if(has_memory_wait) {
118                 int wait;
119                 uint8_t val = d_mem->read_data8w(addr, &wait);
120                 icount -= wait;
121                 UPDATE_EXTRA_EVENT(2 + wait);
122                 return val;
123         } else {
124 //#else
125                 uint8_t val = d_mem->read_data8(addr);
126                 UPDATE_EXTRA_EVENT(2);
127                 return val;
128         }
129 //#endif
130 }
131
132 Z80_INLINE void __FASTCALL Z80_BASE::WM8(uint32_t addr, uint8_t val)
133 {
134 //#ifdef Z80_MEMORY_WAIT
135         UPDATE_EXTRA_EVENT(1);
136         if(has_memory_wait) {
137                 int wait;
138                 d_mem->write_data8w(addr, val, &wait);
139                 icount -= wait;
140                 UPDATE_EXTRA_EVENT(2 + wait);
141         } else {
142 //#else
143                 d_mem->write_data8(addr, val);
144                 UPDATE_EXTRA_EVENT(2);
145         }
146 //#endif
147 }
148
149 Z80_INLINE void __FASTCALL Z80_BASE::RM16(uint32_t addr, pair32_t *r)
150 {
151         r->b.l = RM8(addr);
152         r->b.h = RM8((addr + 1) & 0xffff);
153 }
154
155 Z80_INLINE void __FASTCALL Z80_BASE::WM16(uint32_t addr, pair32_t *r)
156 {
157         WM8(addr, r->b.l);
158         WM8((addr + 1) & 0xffff, r->b.h);
159 }
160
161 Z80_INLINE uint8_t __FASTCALL Z80_BASE::FETCHOP()
162 {
163         unsigned pctmp = PCD;
164         PC++;
165         R++;
166         
167         // consider m1 cycle wait
168         UPDATE_EXTRA_EVENT(1);
169         int wait;
170         uint8_t val = d_mem->fetch_op(pctmp, &wait);
171         icount -= wait;
172         UPDATE_EXTRA_EVENT(3 + wait);
173         return val;
174 }
175
176 Z80_INLINE uint8_t __FASTCALL Z80_BASE::FETCH8()
177 {
178         unsigned pctmp = PCD;
179         PC++;
180         return RM8(pctmp);
181 }
182
183 Z80_INLINE uint32_t __FASTCALL Z80_BASE::FETCH16()
184 {
185         unsigned pctmp = PCD;
186         PC += 2;
187         return RM8(pctmp) | ((uint32_t)RM8((pctmp + 1) & 0xffff) << 8);
188 }
189
190 Z80_INLINE uint8_t __FASTCALL Z80_BASE::IN8(uint32_t addr)
191 {
192 //#ifdef Z80_IO_WAIT
193         UPDATE_EXTRA_EVENT(2);
194         if(has_io_wait) {
195                 int wait;
196                 uint8_t val = d_io->read_io8w(addr, &wait);
197                 icount -= wait;
198                 UPDATE_EXTRA_EVENT(2 + wait);
199                 return val;
200         } else {
201 //#else
202                 uint8_t val = d_io->read_io8(addr);
203                 UPDATE_EXTRA_EVENT(2);
204                 return val;
205         }
206 //#endif
207 }
208
209 Z80_INLINE void __FASTCALL Z80_BASE::OUT8(uint32_t addr, uint8_t val)
210 {
211 //#ifdef HAS_NSC800
212         UPDATE_EXTRA_EVENT(2);
213         if(has_nsc800) {
214                 if((addr & 0xff) == 0xbb) {
215                         icr = val;
216                         UPDATE_EXTRA_EVENT(2);
217                         return;
218                 }
219         }
220 //#endif
221 //#ifdef Z80_IO_WAIT
222         if(has_io_wait) {
223                 int wait;
224                 d_io->write_io8w(addr, val, &wait);
225                 icount -= wait;
226                 UPDATE_EXTRA_EVENT(2 + wait);
227         } else {
228 //#else
229                 d_io->write_io8(addr, val);
230                 UPDATE_EXTRA_EVENT(2);
231         }
232 //#endif
233 }
234
235 #define EAX() do { \
236         ea = (uint32_t)(uint16_t)(IX + (int8_t)FETCH8()); \
237         WZ = ea; \
238 } while(0)
239
240 #define EAY() do { \
241         ea = (uint32_t)(uint16_t)(IY + (int8_t)FETCH8()); \
242         WZ = ea; \
243 } while(0)
244
245 #define POP(DR) do { \
246         RM16(SPD, &DR); \
247         SP += 2; \
248 } while(0)
249
250 #define PUSH(SR) do { \
251         SP -= 2; \
252         WM16(SPD, &SR); \
253 } while(0)
254
255 #define JP() do { \
256         PCD = FETCH16(); \
257         WZ = PCD; \
258 } while(0)
259
260 #define JP_COND(cond) do { \
261         if(cond) { \
262                 PCD = FETCH16(); \
263                 WZ = PCD; \
264         } else { \
265                 WZ = FETCH16(); /* implicit do PC += 2 */ \
266         } \
267 } while(0)
268
269 #define JR() do { \
270         int8_t arg = (int8_t)FETCH8(); /* FETCH8() also increments PC */ \
271         PC += arg; /* so don't do PC += FETCH8() */ \
272         WZ = PC; \
273 } while(0)
274
275 #define JR_COND(cond, opcode) do { \
276         if(cond) { \
277                 JR(); \
278                 icount -= cc_ex[opcode]; \
279         } else FETCH8();                         \
280 } while(0)
281
282 #define CALL() do { \
283         ea = FETCH16(); \
284         WZ = ea; \
285         PUSH(pc); \
286         PCD = ea; \
287 } while(0)
288
289 #define CALL_COND(cond, opcode) do { \
290         if(cond) { \
291                 ea = FETCH16(); \
292                 WZ = ea; \
293                 PUSH(pc); \
294                 PCD = ea; \
295                 icount -= cc_ex[opcode]; \
296         } else { \
297                 WZ = FETCH16(); /* implicit call PC+=2; */ \
298         } \
299 } while(0)
300
301 #define RET_COND(cond, opcode) do { \
302         if(cond) { \
303                 POP(pc); \
304                 WZ = PC; \
305                 icount -= cc_ex[opcode]; \
306         } \
307 } while(0)
308
309 #define RETN() do { \
310         POP(pc); \
311         WZ = PC; \
312         iff1 = iff2; \
313 } while(0)
314
315 #define RETI() do { \
316         POP(pc); \
317         WZ = PC; \
318         iff1 = iff2; \
319         if(d_pic != NULL) d_pic->notify_intr_reti();    \
320 } while(0)
321
322 #define LD_R_A() do { \
323         R = A; \
324         R2 = A & 0x80; /* keep bit 7 of r */ \
325 } while(0)
326
327 #define LD_A_R() do { \
328         A = (R & 0x7f) | R2; \
329         F = (F & CF) | SZ[A] | (iff2 << 2); \
330         after_ldair = true; \
331 } while(0)
332
333 #define LD_I_A() do { \
334         I = A; \
335 } while(0)
336
337 #define LD_A_I() do { \
338         A = I; \
339         F = (F & CF) | SZ[A] | (iff2 << 2); \
340         after_ldair = true; \
341 } while(0)
342
343 #define RST(addr) do { \
344         PUSH(pc); \
345         PCD = addr; \
346         WZ = PC; \
347 } while(0)
348
349 Z80_INLINE uint8_t __FASTCALL Z80_BASE::INC(uint8_t value)
350 {
351         uint8_t res = value + 1;
352         F = (F & CF) | SZHV_inc[res];
353         return (uint8_t)res;
354 }
355
356 Z80_INLINE uint8_t Z80_BASE::DEC(uint8_t value)
357 {
358         uint8_t res = value - 1;
359         F = (F & CF) | SZHV_dec[res];
360         return res;
361 }
362
363 #define RLCA() do { \
364         A = (A << 1) | (A >> 7); \
365         F = (F & (SF | ZF | PF)) | (A & (YF | XF | CF)); \
366 } while(0)
367
368 #define RRCA() do { \
369         F = (F & (SF | ZF | PF)) | (A & CF); \
370         A = (A >> 1) | (A << 7); \
371         F |= (A & (YF | XF)); \
372 } while(0)
373
374 #define RLA() do { \
375         uint8_t res = (A << 1) | (F & CF); \
376         uint8_t c = (A & 0x80) ? CF : 0; \
377         F = (F & (SF | ZF | PF)) | c | (res & (YF | XF)); \
378         A = res; \
379 } while(0)
380
381 #define RRA() do { \
382         uint8_t res = (A >> 1) | (F << 7); \
383         uint8_t c = (A & 0x01) ? CF : 0; \
384         F = (F & (SF | ZF | PF)) | c | (res & (YF | XF)); \
385         A = res; \
386 } while(0)
387
388 #define RRD() do { \
389         uint8_t n = RM8(HL); \
390         WZ = HL + 1; \
391         WM8(HL, (n >> 4) | (A << 4)); \
392         A = (A & 0xf0) | (n & 0x0f); \
393         F = (F & CF) | SZP[A]; \
394 } while(0)
395
396 #define RLD() do { \
397         uint8_t n = RM8(HL); \
398         WZ = HL + 1; \
399         WM8(HL, (n << 4) | (A & 0x0f)); \
400         A = (A & 0xf0) | (n >> 4); \
401         F = (F & CF) | SZP[A]; \
402 } while(0)
403
404 #define ADD(value) do { \
405         uint32_t ah = AFD & 0xff00; \
406         uint32_t res = (uint8_t)((ah >> 8) + value); \
407         F = SZHVC_add[ah | res]; \
408         A = res; \
409 } while(0)
410
411 #define ADC(value) do { \
412         uint32_t ah = AFD & 0xff00, c = AFD & 1; \
413         uint32_t res = (uint8_t)((ah >> 8) + value + c); \
414         F = SZHVC_add[(c << 16) | ah | res]; \
415         A = res; \
416 } while(0)
417
418 #define SUB(value) do { \
419         uint32_t ah = AFD & 0xff00; \
420         uint32_t res = (uint8_t)((ah >> 8) - value); \
421         F = SZHVC_sub[ah | res]; \
422         A = res; \
423 } while(0)
424
425 #define SBC(value) do { \
426         uint32_t ah = AFD & 0xff00, c = AFD & 1; \
427         uint32_t res = (uint8_t)((ah >> 8) - value - c); \
428         F = SZHVC_sub[(c << 16) | ah | res]; \
429         A = res; \
430 } while(0)
431
432 #define NEG() do { \
433         uint8_t value = A; \
434         A = 0; \
435         SUB(value); \
436 } while(0)
437
438 #define DAA() do { \
439         uint8_t a = A; \
440         if(F & NF) { \
441                 if((F & HF) | ((A & 0xf) > 9)) a -= 6; \
442                 if((F & CF) | (A > 0x99)) a -= 0x60; \
443         } else { \
444                 if((F & HF) | ((A & 0xf) > 9)) a += 6; \
445                 if((F & CF) | (A > 0x99)) a += 0x60; \
446         } \
447         F = (F & (CF | NF)) | (A > 0x99) | ((A ^ a) & HF) | SZP[a]; \
448         A = a; \
449 } while(0)
450
451 #define AND(value) do { \
452         A &= value; \
453         F = SZP[A] | HF; \
454 } while(0)
455
456 #define OR(value) do { \
457         A |= value; \
458         F = SZP[A]; \
459 } while(0)
460
461 #define XOR(value) do { \
462         A ^= value; \
463         F = SZP[A]; \
464 } while(0)
465
466 #define CP(value) do { \
467         unsigned val = value; \
468         uint32_t ah = AFD & 0xff00; \
469         uint32_t res = (uint8_t)((ah >> 8) - val); \
470         F = (SZHVC_sub[ah | res] & ~(YF | XF)) | (val & (YF | XF)); \
471 } while(0)
472
473 #define EX_AF() do { \
474         pair32_t tmp; \
475         tmp = af; af = af2; af2 = tmp; \
476 } while(0)
477
478 #define EX_DE_HL() do { \
479         pair32_t tmp; \
480         tmp = de; de = hl; hl = tmp; \
481 } while(0)
482
483 #define EXX() do { \
484         pair32_t tmp; \
485         tmp = bc; bc = bc2; bc2 = tmp; \
486         tmp = de; de = de2; de2 = tmp; \
487         tmp = hl; hl = hl2; hl2 = tmp; \
488 } while(0)
489
490 #define EXSP(DR) do { \
491         pair32_t tmp; \
492         tmp.d = 0; \
493         RM16(SPD, &tmp); \
494         WM16(SPD, &DR); \
495         DR = tmp; \
496         WZ = DR.d; \
497 } while(0)
498
499 #define ADD16(DR, SR) do { \
500         uint32_t res = DR.d + SR.d; \
501         WZ = DR.d + 1; \
502         F = (F & (SF | ZF | VF)) | (((DR.d ^ res ^ SR.d) >> 8) & HF) | ((res >> 16) & CF) | ((res >> 8) & (YF | XF)); \
503         DR.w.l = (uint16_t)res; \
504 } while(0)
505
506 #define ADC16(Reg) do { \
507         uint32_t res = HLD + Reg.d + (F & CF); \
508         WZ = HL + 1; \
509         F = (((HLD ^ res ^ Reg.d) >> 8) & HF) | ((res >> 16) & CF) | ((res >> 8) & (SF | YF | XF)) | ((res & 0xffff) ? 0 : ZF) | (((Reg.d ^ HLD ^ 0x8000) & (Reg.d ^ res) & 0x8000) >> 13); \
510         HL = (uint16_t)res; \
511 } while(0)
512
513 #define SBC16(Reg) do { \
514         uint32_t res = HLD - Reg.d - (F & CF); \
515         WZ = HL + 1; \
516         F = (((HLD ^ res ^ Reg.d) >> 8) & HF) | NF | ((res >> 16) & CF) | ((res >> 8) & (SF | YF | XF)) | ((res & 0xffff) ? 0 : ZF) | (((Reg.d ^ HLD) & (HLD ^ res) &0x8000) >> 13); \
517         HL = (uint16_t)res; \
518 } while(0)
519
520 Z80_INLINE uint8_t __FASTCALL Z80_BASE::RLC(uint8_t value)
521 {
522         unsigned res = value;
523         unsigned c = (res & 0x80) ? CF : 0;
524         res = ((res << 1) | (res >> 7)) & 0xff;
525         F = SZP[res] | c;
526         return res;
527 }
528
529 Z80_INLINE uint8_t __FASTCALL Z80_BASE::RRC(uint8_t value)
530 {
531         unsigned res = value;
532         unsigned c = (res & 0x01) ? CF : 0;
533         res = ((res >> 1) | (res << 7)) & 0xff;
534         F = SZP[res] | c;
535         return res;
536 }
537
538 Z80_INLINE uint8_t __FASTCALL Z80_BASE::RL(uint8_t value)
539 {
540         unsigned res = value;
541         unsigned c = (res & 0x80) ? CF : 0;
542         res = ((res << 1) | (F & CF)) & 0xff;
543         F = SZP[res] | c;
544         return res;
545 }
546
547 Z80_INLINE uint8_t __FASTCALL Z80_BASE::RR(uint8_t value)
548 {
549         unsigned res = value;
550         unsigned c = (res & 0x01) ? CF : 0;
551         res = ((res >> 1) | (F << 7)) & 0xff;
552         F = SZP[res] | c;
553         return res;
554 }
555
556 Z80_INLINE uint8_t __FASTCALL Z80_BASE::SLA(uint8_t value)
557 {
558         unsigned res = value;
559         unsigned c = (res & 0x80) ? CF : 0;
560         res = (res << 1) & 0xff;
561         F = SZP[res] | c;
562         return res;
563 }
564
565 Z80_INLINE uint8_t __FASTCALL Z80_BASE::SRA(uint8_t value)
566 {
567         unsigned res = value;
568         unsigned c = (res & 0x01) ? CF : 0;
569         res = ((res >> 1) | (res & 0x80)) & 0xff;
570         F = SZP[res] | c;
571         return res;
572 }
573
574 Z80_INLINE uint8_t __FASTCALL Z80_BASE::SLL(uint8_t value)
575 {
576         unsigned res = value;
577         unsigned c = (res & 0x80) ? CF : 0;
578         res = ((res << 1) | 0x01) & 0xff;
579         F = SZP[res] | c;
580         return res;
581 }
582
583 Z80_INLINE uint8_t __FASTCALL Z80_BASE::SRL(uint8_t value)
584 {
585         unsigned res = value;
586         unsigned c = (res & 0x01) ? CF : 0;
587         res = (res >> 1) & 0xff;
588         F = SZP[res] | c;
589         return res;
590 }
591
592 #define BIT(bit, reg) do { \
593         F = (F & CF) | HF | (SZ_BIT[reg & (1 << bit)] & ~(YF | XF)) | (reg & (YF | XF)); \
594 } while(0)
595
596 #define BIT_HL(bit, reg) do { \
597         F = (F & CF) | HF | (SZ_BIT[reg & (1 << bit)] & ~(YF | XF)) | (WZ_H & (YF | XF)); \
598 } while(0)
599
600 #define BIT_XY(bit, reg) do { \
601         F = (F & CF) | HF | (SZ_BIT[reg & (1 << bit)] & ~(YF | XF)) | ((ea >> 8) & (YF | XF)); \
602 } while(0)
603
604 Z80_INLINE uint8_t __FASTCALL Z80_BASE::RES(uint8_t bit, uint8_t value)
605 {
606         return value & ~(1 << bit);
607 }
608
609 Z80_INLINE uint8_t __FASTCALL Z80_BASE::SET(uint8_t bit, uint8_t value)
610 {
611         return value | (1 << bit);
612 }
613
614 #define LDI() do { \
615         uint8_t io = RM8(HL); \
616         WM8(DE, io); \
617         F &= SF | ZF | CF; \
618         if((A + io) & 0x02) F |= YF; /* bit 1 -> flag 5 */ \
619         if((A + io) & 0x08) F |= XF; /* bit 3 -> flag 3 */ \
620         HL++; DE++; BC--; \
621         if(BC) F |= VF; \
622 } while(0)
623
624 #define CPI() do { \
625         uint8_t val = RM8(HL); \
626         uint8_t res = A - val; \
627         WZ++; \
628         HL++; BC--; \
629         F = (F & CF) | (SZ[res] & ~(YF | XF)) | ((A ^ val ^ res) & HF) | NF; \
630         if(F & HF) res -= 1; \
631         if(res & 0x02) F |= YF; /* bit 1 -> flag 5 */ \
632         if(res & 0x08) F |= XF; /* bit 3 -> flag 3 */ \
633         if(BC) F |= VF; \
634 } while(0)
635
636 #define INI() do { \
637         unsigned t; \
638         uint8_t io = IN8(BC); \
639         WZ = BC + 1; \
640         B--; \
641         WM8(HL, io); \
642         HL++; \
643         F = SZ[B]; \
644         t = (unsigned)((C + 1) & 0xff) + (unsigned)io; \
645         if(io & SF) F |= NF; \
646         if(t & 0x100) F |= HF | CF; \
647         F |= SZP[(uint8_t)(t & 0x07) ^ B] & PF; \
648 } while(0)
649
650 #define OUTI() do { \
651         unsigned t; \
652         uint8_t io = RM8(HL); \
653         B--; \
654         WZ = BC + 1; \
655         OUT8(BC, io); \
656         HL++; \
657         F = SZ[B]; \
658         t = (unsigned)L + (unsigned)io; \
659         if(io & SF) F |= NF; \
660         if(t & 0x100) F |= HF | CF; \
661         F |= SZP[(uint8_t)(t & 0x07) ^ B] & PF; \
662 } while(0)
663
664 #define LDD() do { \
665         uint8_t io = RM8(HL); \
666         WM8(DE, io); \
667         F &= SF | ZF | CF; \
668         if((A + io) & 0x02) F |= YF; /* bit 1 -> flag 5 */ \
669         if((A + io) & 0x08) F |= XF; /* bit 3 -> flag 3 */ \
670         HL--; DE--; BC--; \
671         if(BC) F |= VF; \
672 } while(0)
673
674 #define CPD() do { \
675         uint8_t val = RM8(HL); \
676         uint8_t res = A - val; \
677         WZ--; \
678         HL--; BC--; \
679         F = (F & CF) | (SZ[res] & ~(YF | XF)) | ((A ^ val ^ res) & HF) | NF; \
680         if(F & HF) res -= 1; \
681         if(res & 0x02) F |= YF; /* bit 1 -> flag 5 */ \
682         if(res & 0x08) F |= XF; /* bit 3 -> flag 3 */ \
683         if(BC) F |= VF; \
684 } while(0)
685
686 #define IND() do { \
687         unsigned t; \
688         uint8_t io = IN8(BC); \
689         WZ = BC - 1; \
690         B--; \
691         WM8(HL, io); \
692         HL--; \
693         F = SZ[B]; \
694         t = ((unsigned)(C - 1) & 0xff) + (unsigned)io; \
695         if(io & SF) F |= NF; \
696         if(t & 0x100) F |= HF | CF; \
697         F |= SZP[(uint8_t)(t & 0x07) ^ B] & PF; \
698 } while(0)
699
700 #define OUTD() do { \
701         unsigned t; \
702         uint8_t io = RM8(HL); \
703         B--; \
704         WZ = BC - 1; \
705         OUT8(BC, io); \
706         HL--; \
707         F = SZ[B]; \
708         t = (unsigned)L + (unsigned)io; \
709         if(io & SF) F |= NF; \
710         if(t & 0x100) F |= HF | CF; \
711         F |= SZP[(uint8_t)(t & 0x07) ^ B] & PF; \
712 } while(0)
713
714 #define LDIR() do { \
715         LDI(); \
716         if(BC != 0) { \
717                 PC -= 2; \
718                 WZ = PC + 1; \
719                 icount -= cc_ex[0xb0]; \
720         } \
721 } while(0)
722
723 #define CPIR() do { \
724         CPI(); \
725         if(BC != 0 && !(F & ZF)) { \
726                 PC -= 2; \
727                 WZ = PC + 1; \
728                 icount -= cc_ex[0xb1]; \
729         } \
730 } while(0)
731
732 #define INIR() do { \
733         INI(); \
734         if(B != 0) { \
735                 PC -= 2; \
736                 icount -= cc_ex[0xb2]; \
737         } \
738 } while(0)
739
740 #define OTIR() do { \
741         OUTI(); \
742         if(B != 0) { \
743                 PC -= 2; \
744                 icount -= cc_ex[0xb3]; \
745         } \
746 } while(0)
747
748 #define LDDR() do { \
749         LDD(); \
750         if(BC != 0) { \
751                 PC -= 2; \
752                 WZ = PC + 1; \
753                 icount -= cc_ex[0xb8]; \
754         } \
755 } while(0)
756
757 #define CPDR() do { \
758         CPD(); \
759         if(BC != 0 && !(F & ZF)) { \
760                 PC -= 2; \
761                 WZ = PC + 1; \
762                 icount -= cc_ex[0xb9]; \
763         } \
764 } while(0)
765
766 #define INDR() do { \
767         IND(); \
768         if(B != 0) { \
769                 PC -= 2; \
770                 icount -= cc_ex[0xba]; \
771         } \
772 } while(0)
773
774 #define OTDR() do { \
775         OUTD(); \
776         if(B != 0) { \
777                 PC -= 2; \
778                 icount -= cc_ex[0xbb]; \
779         } \
780 } while(0)
781
782 #define EI() do { \
783         iff1 = iff2 = 1; \
784         after_ei = true; \
785 } while(0)
786
787 void Z80_BASE::OP_CB(uint8_t code)
788 {
789         icount -= cc_cb[code];
790         
791         switch(code) {
792         case 0x00: B = RLC(B); break;                   /* RLC  B           */
793         case 0x01: C = RLC(C); break;                   /* RLC  C           */
794         case 0x02: D = RLC(D); break;                   /* RLC  D           */
795         case 0x03: E = RLC(E); break;                   /* RLC  E           */
796         case 0x04: H = RLC(H); break;                   /* RLC  H           */
797         case 0x05: L = RLC(L); break;                   /* RLC  L           */
798         case 0x06: WM8(HL, RLC(RM8(HL))); break;        /* RLC  (HL)        */
799         case 0x07: A = RLC(A); break;                   /* RLC  A           */
800         case 0x08: B = RRC(B); break;                   /* RRC  B           */
801         case 0x09: C = RRC(C); break;                   /* RRC  C           */
802         case 0x0a: D = RRC(D); break;                   /* RRC  D           */
803         case 0x0b: E = RRC(E); break;                   /* RRC  E           */
804         case 0x0c: H = RRC(H); break;                   /* RRC  H           */
805         case 0x0d: L = RRC(L); break;                   /* RRC  L           */
806         case 0x0e: WM8(HL, RRC(RM8(HL))); break;        /* RRC  (HL)        */
807         case 0x0f: A = RRC(A); break;                   /* RRC  A           */
808         case 0x10: B = RL(B); break;                    /* RL   B           */
809         case 0x11: C = RL(C); break;                    /* RL   C           */
810         case 0x12: D = RL(D); break;                    /* RL   D           */
811         case 0x13: E = RL(E); break;                    /* RL   E           */
812         case 0x14: H = RL(H); break;                    /* RL   H           */
813         case 0x15: L = RL(L); break;                    /* RL   L           */
814         case 0x16: WM8(HL, RL(RM8(HL))); break;         /* RL   (HL)        */
815         case 0x17: A = RL(A); break;                    /* RL   A           */
816         case 0x18: B = RR(B); break;                    /* RR   B           */
817         case 0x19: C = RR(C); break;                    /* RR   C           */
818         case 0x1a: D = RR(D); break;                    /* RR   D           */
819         case 0x1b: E = RR(E); break;                    /* RR   E           */
820         case 0x1c: H = RR(H); break;                    /* RR   H           */
821         case 0x1d: L = RR(L); break;                    /* RR   L           */
822         case 0x1e: WM8(HL, RR(RM8(HL))); break;         /* RR   (HL)        */
823         case 0x1f: A = RR(A); break;                    /* RR   A           */
824         case 0x20: B = SLA(B); break;                   /* SLA  B           */
825         case 0x21: C = SLA(C); break;                   /* SLA  C           */
826         case 0x22: D = SLA(D); break;                   /* SLA  D           */
827         case 0x23: E = SLA(E); break;                   /* SLA  E           */
828         case 0x24: H = SLA(H); break;                   /* SLA  H           */
829         case 0x25: L = SLA(L); break;                   /* SLA  L           */
830         case 0x26: WM8(HL, SLA(RM8(HL))); break;        /* SLA  (HL)        */
831         case 0x27: A = SLA(A); break;                   /* SLA  A           */
832         case 0x28: B = SRA(B); break;                   /* SRA  B           */
833         case 0x29: C = SRA(C); break;                   /* SRA  C           */
834         case 0x2a: D = SRA(D); break;                   /* SRA  D           */
835         case 0x2b: E = SRA(E); break;                   /* SRA  E           */
836         case 0x2c: H = SRA(H); break;                   /* SRA  H           */
837         case 0x2d: L = SRA(L); break;                   /* SRA  L           */
838         case 0x2e: WM8(HL, SRA(RM8(HL))); break;        /* SRA  (HL)        */
839         case 0x2f: A = SRA(A); break;                   /* SRA  A           */
840         case 0x30: B = SLL(B); break;                   /* SLL  B           */
841         case 0x31: C = SLL(C); break;                   /* SLL  C           */
842         case 0x32: D = SLL(D); break;                   /* SLL  D           */
843         case 0x33: E = SLL(E); break;                   /* SLL  E           */
844         case 0x34: H = SLL(H); break;                   /* SLL  H           */
845         case 0x35: L = SLL(L); break;                   /* SLL  L           */
846         case 0x36: WM8(HL, SLL(RM8(HL))); break;        /* SLL  (HL)        */
847         case 0x37: A = SLL(A); break;                   /* SLL  A           */
848         case 0x38: B = SRL(B); break;                   /* SRL  B           */
849         case 0x39: C = SRL(C); break;                   /* SRL  C           */
850         case 0x3a: D = SRL(D); break;                   /* SRL  D           */
851         case 0x3b: E = SRL(E); break;                   /* SRL  E           */
852         case 0x3c: H = SRL(H); break;                   /* SRL  H           */
853         case 0x3d: L = SRL(L); break;                   /* SRL  L           */
854         case 0x3e: WM8(HL, SRL(RM8(HL))); break;        /* SRL  (HL)        */
855         case 0x3f: A = SRL(A); break;                   /* SRL  A           */
856         case 0x40: BIT(0, B); break;                    /* BIT  0,B         */
857         case 0x41: BIT(0, C); break;                    /* BIT  0,C         */
858         case 0x42: BIT(0, D); break;                    /* BIT  0,D         */
859         case 0x43: BIT(0, E); break;                    /* BIT  0,E         */
860         case 0x44: BIT(0, H); break;                    /* BIT  0,H         */
861         case 0x45: BIT(0, L); break;                    /* BIT  0,L         */
862         case 0x46: BIT_HL(0, RM8(HL)); break;           /* BIT  0,(HL)      */
863         case 0x47: BIT(0, A); break;                    /* BIT  0,A         */
864         case 0x48: BIT(1, B); break;                    /* BIT  1,B         */
865         case 0x49: BIT(1, C); break;                    /* BIT  1,C         */
866         case 0x4a: BIT(1, D); break;                    /* BIT  1,D         */
867         case 0x4b: BIT(1, E); break;                    /* BIT  1,E         */
868         case 0x4c: BIT(1, H); break;                    /* BIT  1,H         */
869         case 0x4d: BIT(1, L); break;                    /* BIT  1,L         */
870         case 0x4e: BIT_HL(1, RM8(HL)); break;           /* BIT  1,(HL)      */
871         case 0x4f: BIT(1, A); break;                    /* BIT  1,A         */
872         case 0x50: BIT(2, B); break;                    /* BIT  2,B         */
873         case 0x51: BIT(2, C); break;                    /* BIT  2,C         */
874         case 0x52: BIT(2, D); break;                    /* BIT  2,D         */
875         case 0x53: BIT(2, E); break;                    /* BIT  2,E         */
876         case 0x54: BIT(2, H); break;                    /* BIT  2,H         */
877         case 0x55: BIT(2, L); break;                    /* BIT  2,L         */
878         case 0x56: BIT_HL(2, RM8(HL)); break;           /* BIT  2,(HL)      */
879         case 0x57: BIT(2, A); break;                    /* BIT  2,A         */
880         case 0x58: BIT(3, B); break;                    /* BIT  3,B         */
881         case 0x59: BIT(3, C); break;                    /* BIT  3,C         */
882         case 0x5a: BIT(3, D); break;                    /* BIT  3,D         */
883         case 0x5b: BIT(3, E); break;                    /* BIT  3,E         */
884         case 0x5c: BIT(3, H); break;                    /* BIT  3,H         */
885         case 0x5d: BIT(3, L); break;                    /* BIT  3,L         */
886         case 0x5e: BIT_HL(3, RM8(HL)); break;           /* BIT  3,(HL)      */
887         case 0x5f: BIT(3, A); break;                    /* BIT  3,A         */
888         case 0x60: BIT(4, B); break;                    /* BIT  4,B         */
889         case 0x61: BIT(4, C); break;                    /* BIT  4,C         */
890         case 0x62: BIT(4, D); break;                    /* BIT  4,D         */
891         case 0x63: BIT(4, E); break;                    /* BIT  4,E         */
892         case 0x64: BIT(4, H); break;                    /* BIT  4,H         */
893         case 0x65: BIT(4, L); break;                    /* BIT  4,L         */
894         case 0x66: BIT_HL(4, RM8(HL)); break;           /* BIT  4,(HL)      */
895         case 0x67: BIT(4, A); break;                    /* BIT  4,A         */
896         case 0x68: BIT(5, B); break;                    /* BIT  5,B         */
897         case 0x69: BIT(5, C); break;                    /* BIT  5,C         */
898         case 0x6a: BIT(5, D); break;                    /* BIT  5,D         */
899         case 0x6b: BIT(5, E); break;                    /* BIT  5,E         */
900         case 0x6c: BIT(5, H); break;                    /* BIT  5,H         */
901         case 0x6d: BIT(5, L); break;                    /* BIT  5,L         */
902         case 0x6e: BIT_HL(5, RM8(HL)); break;           /* BIT  5,(HL)      */
903         case 0x6f: BIT(5, A); break;                    /* BIT  5,A         */
904         case 0x70: BIT(6, B); break;                    /* BIT  6,B         */
905         case 0x71: BIT(6, C); break;                    /* BIT  6,C         */
906         case 0x72: BIT(6, D); break;                    /* BIT  6,D         */
907         case 0x73: BIT(6, E); break;                    /* BIT  6,E         */
908         case 0x74: BIT(6, H); break;                    /* BIT  6,H         */
909         case 0x75: BIT(6, L); break;                    /* BIT  6,L         */
910         case 0x76: BIT_HL(6, RM8(HL)); break;           /* BIT  6,(HL)      */
911         case 0x77: BIT(6, A); break;                    /* BIT  6,A         */
912         case 0x78: BIT(7, B); break;                    /* BIT  7,B         */
913         case 0x79: BIT(7, C); break;                    /* BIT  7,C         */
914         case 0x7a: BIT(7, D); break;                    /* BIT  7,D         */
915         case 0x7b: BIT(7, E); break;                    /* BIT  7,E         */
916         case 0x7c: BIT(7, H); break;                    /* BIT  7,H         */
917         case 0x7d: BIT(7, L); break;                    /* BIT  7,L         */
918         case 0x7e: BIT_HL(7, RM8(HL)); break;           /* BIT  7,(HL)      */
919         case 0x7f: BIT(7, A); break;                    /* BIT  7,A         */
920         case 0x80: B = RES(0, B); break;                /* RES  0,B         */
921         case 0x81: C = RES(0, C); break;                /* RES  0,C         */
922         case 0x82: D = RES(0, D); break;                /* RES  0,D         */
923         case 0x83: E = RES(0, E); break;                /* RES  0,E         */
924         case 0x84: H = RES(0, H); break;                /* RES  0,H         */
925         case 0x85: L = RES(0, L); break;                /* RES  0,L         */
926         case 0x86: WM8(HL, RES(0, RM8(HL))); break;     /* RES  0,(HL)      */
927         case 0x87: A = RES(0, A); break;                /* RES  0,A         */
928         case 0x88: B = RES(1, B); break;                /* RES  1,B         */
929         case 0x89: C = RES(1, C); break;                /* RES  1,C         */
930         case 0x8a: D = RES(1, D); break;                /* RES  1,D         */
931         case 0x8b: E = RES(1, E); break;                /* RES  1,E         */
932         case 0x8c: H = RES(1, H); break;                /* RES  1,H         */
933         case 0x8d: L = RES(1, L); break;                /* RES  1,L         */
934         case 0x8e: WM8(HL, RES(1, RM8(HL))); break;     /* RES  1,(HL)      */
935         case 0x8f: A = RES(1, A); break;                /* RES  1,A         */
936         case 0x90: B = RES(2, B); break;                /* RES  2,B         */
937         case 0x91: C = RES(2, C); break;                /* RES  2,C         */
938         case 0x92: D = RES(2, D); break;                /* RES  2,D         */
939         case 0x93: E = RES(2, E); break;                /* RES  2,E         */
940         case 0x94: H = RES(2, H); break;                /* RES  2,H         */
941         case 0x95: L = RES(2, L); break;                /* RES  2,L         */
942         case 0x96: WM8(HL, RES(2, RM8(HL))); break;     /* RES  2,(HL)      */
943         case 0x97: A = RES(2, A); break;                /* RES  2,A         */
944         case 0x98: B = RES(3, B); break;                /* RES  3,B         */
945         case 0x99: C = RES(3, C); break;                /* RES  3,C         */
946         case 0x9a: D = RES(3, D); break;                /* RES  3,D         */
947         case 0x9b: E = RES(3, E); break;                /* RES  3,E         */
948         case 0x9c: H = RES(3, H); break;                /* RES  3,H         */
949         case 0x9d: L = RES(3, L); break;                /* RES  3,L         */
950         case 0x9e: WM8(HL, RES(3, RM8(HL))); break;     /* RES  3,(HL)      */
951         case 0x9f: A = RES(3, A); break;                /* RES  3,A         */
952         case 0xa0: B = RES(4,   B); break;              /* RES  4,B         */
953         case 0xa1: C = RES(4,   C); break;              /* RES  4,C         */
954         case 0xa2: D = RES(4,   D); break;              /* RES  4,D         */
955         case 0xa3: E = RES(4,   E); break;              /* RES  4,E         */
956         case 0xa4: H = RES(4,   H); break;              /* RES  4,H         */
957         case 0xa5: L = RES(4,   L); break;              /* RES  4,L         */
958         case 0xa6: WM8(HL, RES(4, RM8(HL))); break;     /* RES  4,(HL)      */
959         case 0xa7: A = RES(4,   A); break;              /* RES  4,A         */
960         case 0xa8: B = RES(5, B); break;                /* RES  5,B         */
961         case 0xa9: C = RES(5, C); break;                /* RES  5,C         */
962         case 0xaa: D = RES(5, D); break;                /* RES  5,D         */
963         case 0xab: E = RES(5, E); break;                /* RES  5,E         */
964         case 0xac: H = RES(5, H); break;                /* RES  5,H         */
965         case 0xad: L = RES(5, L); break;                /* RES  5,L         */
966         case 0xae: WM8(HL, RES(5, RM8(HL))); break;     /* RES  5,(HL)      */
967         case 0xaf: A = RES(5, A); break;                /* RES  5,A         */
968         case 0xb0: B = RES(6, B); break;                /* RES  6,B         */
969         case 0xb1: C = RES(6, C); break;                /* RES  6,C         */
970         case 0xb2: D = RES(6, D); break;                /* RES  6,D         */
971         case 0xb3: E = RES(6, E); break;                /* RES  6,E         */
972         case 0xb4: H = RES(6, H); break;                /* RES  6,H         */
973         case 0xb5: L = RES(6, L); break;                /* RES  6,L         */
974         case 0xb6: WM8(HL, RES(6, RM8(HL))); break;     /* RES  6,(HL)      */
975         case 0xb7: A = RES(6, A); break;                /* RES  6,A         */
976         case 0xb8: B = RES(7, B); break;                /* RES  7,B         */
977         case 0xb9: C = RES(7, C); break;                /* RES  7,C         */
978         case 0xba: D = RES(7, D); break;                /* RES  7,D         */
979         case 0xbb: E = RES(7, E); break;                /* RES  7,E         */
980         case 0xbc: H = RES(7, H); break;                /* RES  7,H         */
981         case 0xbd: L = RES(7, L); break;                /* RES  7,L         */
982         case 0xbe: WM8(HL, RES(7, RM8(HL))); break;     /* RES  7,(HL)      */
983         case 0xbf: A = RES(7, A); break;                /* RES  7,A         */
984         case 0xc0: B = SET(0, B); break;                /* SET  0,B         */
985         case 0xc1: C = SET(0, C); break;                /* SET  0,C         */
986         case 0xc2: D = SET(0, D); break;                /* SET  0,D         */
987         case 0xc3: E = SET(0, E); break;                /* SET  0,E         */
988         case 0xc4: H = SET(0, H); break;                /* SET  0,H         */
989         case 0xc5: L = SET(0, L); break;                /* SET  0,L         */
990         case 0xc6: WM8(HL, SET(0, RM8(HL))); break;     /* SET  0,(HL)      */
991         case 0xc7: A = SET(0, A); break;                /* SET  0,A         */
992         case 0xc8: B = SET(1, B); break;                /* SET  1,B         */
993         case 0xc9: C = SET(1, C); break;                /* SET  1,C         */
994         case 0xca: D = SET(1, D); break;                /* SET  1,D         */
995         case 0xcb: E = SET(1, E); break;                /* SET  1,E         */
996         case 0xcc: H = SET(1, H); break;                /* SET  1,H         */
997         case 0xcd: L = SET(1, L); break;                /* SET  1,L         */
998         case 0xce: WM8(HL, SET(1, RM8(HL))); break;     /* SET  1,(HL)      */
999         case 0xcf: A = SET(1, A); break;                /* SET  1,A         */
1000         case 0xd0: B = SET(2, B); break;                /* SET  2,B         */
1001         case 0xd1: C = SET(2, C); break;                /* SET  2,C         */
1002         case 0xd2: D = SET(2, D); break;                /* SET  2,D         */
1003         case 0xd3: E = SET(2, E); break;                /* SET  2,E         */
1004         case 0xd4: H = SET(2, H); break;                /* SET  2,H         */
1005         case 0xd5: L = SET(2, L); break;                /* SET  2,L         */
1006         case 0xd6: WM8(HL, SET(2, RM8(HL))); break;     /* SET  2,(HL)      */
1007         case 0xd7: A = SET(2, A); break;                /* SET  2,A         */
1008         case 0xd8: B = SET(3, B); break;                /* SET  3,B         */
1009         case 0xd9: C = SET(3, C); break;                /* SET  3,C         */
1010         case 0xda: D = SET(3, D); break;                /* SET  3,D         */
1011         case 0xdb: E = SET(3, E); break;                /* SET  3,E         */
1012         case 0xdc: H = SET(3, H); break;                /* SET  3,H         */
1013         case 0xdd: L = SET(3, L); break;                /* SET  3,L         */
1014         case 0xde: WM8(HL, SET(3, RM8(HL))); break;     /* SET  3,(HL)      */
1015         case 0xdf: A = SET(3, A); break;                /* SET  3,A         */
1016         case 0xe0: B = SET(4, B); break;                /* SET  4,B         */
1017         case 0xe1: C = SET(4, C); break;                /* SET  4,C         */
1018         case 0xe2: D = SET(4, D); break;                /* SET  4,D         */
1019         case 0xe3: E = SET(4, E); break;                /* SET  4,E         */
1020         case 0xe4: H = SET(4, H); break;                /* SET  4,H         */
1021         case 0xe5: L = SET(4, L); break;                /* SET  4,L         */
1022         case 0xe6: WM8(HL, SET(4, RM8(HL))); break;     /* SET  4,(HL)      */
1023         case 0xe7: A = SET(4, A); break;                /* SET  4,A         */
1024         case 0xe8: B = SET(5, B); break;                /* SET  5,B         */
1025         case 0xe9: C = SET(5, C); break;                /* SET  5,C         */
1026         case 0xea: D = SET(5, D); break;                /* SET  5,D         */
1027         case 0xeb: E = SET(5, E); break;                /* SET  5,E         */
1028         case 0xec: H = SET(5, H); break;                /* SET  5,H         */
1029         case 0xed: L = SET(5, L); break;                /* SET  5,L         */
1030         case 0xee: WM8(HL, SET(5, RM8(HL))); break;     /* SET  5,(HL)      */
1031         case 0xef: A = SET(5, A); break;                /* SET  5,A         */
1032         case 0xf0: B = SET(6, B); break;                /* SET  6,B         */
1033         case 0xf1: C = SET(6, C); break;                /* SET  6,C         */
1034         case 0xf2: D = SET(6, D); break;                /* SET  6,D         */
1035         case 0xf3: E = SET(6, E); break;                /* SET  6,E         */
1036         case 0xf4: H = SET(6, H); break;                /* SET  6,H         */
1037         case 0xf5: L = SET(6, L); break;                /* SET  6,L         */
1038         case 0xf6: WM8(HL, SET(6, RM8(HL))); break;     /* SET  6,(HL)      */
1039         case 0xf7: A = SET(6, A); break;                /* SET  6,A         */
1040         case 0xf8: B = SET(7, B); break;                /* SET  7,B         */
1041         case 0xf9: C = SET(7, C); break;                /* SET  7,C         */
1042         case 0xfa: D = SET(7, D); break;                /* SET  7,D         */
1043         case 0xfb: E = SET(7, E); break;                /* SET  7,E         */
1044         case 0xfc: H = SET(7, H); break;                /* SET  7,H         */
1045         case 0xfd: L = SET(7, L); break;                /* SET  7,L         */
1046         case 0xfe: WM8(HL, SET(7, RM8(HL))); break;     /* SET  7,(HL)      */
1047         case 0xff: A = SET(7, A); break;                /* SET  7,A         */
1048 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
1049         default: __assume(0);
1050 #endif
1051         }
1052 }
1053
1054 void Z80_BASE::OP_XY(uint8_t code)
1055 {
1056         icount -= cc_xycb[code];
1057         
1058         switch(code) {
1059         case 0x00: B = RLC(RM8(ea)); WM8(ea, B); break;         /* RLC  B=(XY+o)    */
1060         case 0x01: C = RLC(RM8(ea)); WM8(ea, C); break;         /* RLC  C=(XY+o)    */
1061         case 0x02: D = RLC(RM8(ea)); WM8(ea, D); break;         /* RLC  D=(XY+o)    */
1062         case 0x03: E = RLC(RM8(ea)); WM8(ea, E); break;         /* RLC  E=(XY+o)    */
1063         case 0x04: H = RLC(RM8(ea)); WM8(ea, H); break;         /* RLC  H=(XY+o)    */
1064         case 0x05: L = RLC(RM8(ea)); WM8(ea, L); break;         /* RLC  L=(XY+o)    */
1065         case 0x06: WM8(ea, RLC(RM8(ea))); break;                /* RLC  (XY+o)      */
1066         case 0x07: A = RLC(RM8(ea)); WM8(ea, A); break;         /* RLC  A=(XY+o)    */
1067         case 0x08: B = RRC(RM8(ea)); WM8(ea, B); break;         /* RRC  B=(XY+o)    */
1068         case 0x09: C = RRC(RM8(ea)); WM8(ea, C); break;         /* RRC  C=(XY+o)    */
1069         case 0x0a: D = RRC(RM8(ea)); WM8(ea, D); break;         /* RRC  D=(XY+o)    */
1070         case 0x0b: E = RRC(RM8(ea)); WM8(ea, E); break;         /* RRC  E=(XY+o)    */
1071         case 0x0c: H = RRC(RM8(ea)); WM8(ea, H); break;         /* RRC  H=(XY+o)    */
1072         case 0x0d: L = RRC(RM8(ea)); WM8(ea, L); break;         /* RRC  L=(XY+o)    */
1073         case 0x0e: WM8(ea, RRC(RM8(ea))); break;                /* RRC  (XY+o)      */
1074         case 0x0f: A = RRC(RM8(ea)); WM8(ea, A); break;         /* RRC  A=(XY+o)    */
1075         case 0x10: B = RL(RM8(ea)); WM8(ea, B); break;          /* RL   B=(XY+o)    */
1076         case 0x11: C = RL(RM8(ea)); WM8(ea, C); break;          /* RL   C=(XY+o)    */
1077         case 0x12: D = RL(RM8(ea)); WM8(ea, D); break;          /* RL   D=(XY+o)    */
1078         case 0x13: E = RL(RM8(ea)); WM8(ea, E); break;          /* RL   E=(XY+o)    */
1079         case 0x14: H = RL(RM8(ea)); WM8(ea, H); break;          /* RL   H=(XY+o)    */
1080         case 0x15: L = RL(RM8(ea)); WM8(ea, L); break;          /* RL   L=(XY+o)    */
1081         case 0x16: WM8(ea, RL(RM8(ea))); break;                 /* RL   (XY+o)      */
1082         case 0x17: A = RL(RM8(ea)); WM8(ea, A); break;          /* RL   A=(XY+o)    */
1083         case 0x18: B = RR(RM8(ea)); WM8(ea, B); break;          /* RR   B=(XY+o)    */
1084         case 0x19: C = RR(RM8(ea)); WM8(ea, C); break;          /* RR   C=(XY+o)    */
1085         case 0x1a: D = RR(RM8(ea)); WM8(ea, D); break;          /* RR   D=(XY+o)    */
1086         case 0x1b: E = RR(RM8(ea)); WM8(ea, E); break;          /* RR   E=(XY+o)    */
1087         case 0x1c: H = RR(RM8(ea)); WM8(ea, H); break;          /* RR   H=(XY+o)    */
1088         case 0x1d: L = RR(RM8(ea)); WM8(ea, L); break;          /* RR   L=(XY+o)    */
1089         case 0x1e: WM8(ea, RR(RM8(ea))); break;                 /* RR   (XY+o)      */
1090         case 0x1f: A = RR(RM8(ea)); WM8(ea, A); break;          /* RR   A=(XY+o)    */
1091         case 0x20: B = SLA(RM8(ea)); WM8(ea, B); break;         /* SLA  B=(XY+o)    */
1092         case 0x21: C = SLA(RM8(ea)); WM8(ea, C); break;         /* SLA  C=(XY+o)    */
1093         case 0x22: D = SLA(RM8(ea)); WM8(ea, D); break;         /* SLA  D=(XY+o)    */
1094         case 0x23: E = SLA(RM8(ea)); WM8(ea, E); break;         /* SLA  E=(XY+o)    */
1095         case 0x24: H = SLA(RM8(ea)); WM8(ea, H); break;         /* SLA  H=(XY+o)    */
1096         case 0x25: L = SLA(RM8(ea)); WM8(ea, L); break;         /* SLA  L=(XY+o)    */
1097         case 0x26: WM8(ea, SLA(RM8(ea))); break;                /* SLA  (XY+o)      */
1098         case 0x27: A = SLA(RM8(ea)); WM8(ea, A); break;         /* SLA  A=(XY+o)    */
1099         case 0x28: B = SRA(RM8(ea)); WM8(ea, B); break;         /* SRA  B=(XY+o)    */
1100         case 0x29: C = SRA(RM8(ea)); WM8(ea, C); break;         /* SRA  C=(XY+o)    */
1101         case 0x2a: D = SRA(RM8(ea)); WM8(ea, D); break;         /* SRA  D=(XY+o)    */
1102         case 0x2b: E = SRA(RM8(ea)); WM8(ea, E); break;         /* SRA  E=(XY+o)    */
1103         case 0x2c: H = SRA(RM8(ea)); WM8(ea, H); break;         /* SRA  H=(XY+o)    */
1104         case 0x2d: L = SRA(RM8(ea)); WM8(ea, L); break;         /* SRA  L=(XY+o)    */
1105         case 0x2e: WM8(ea, SRA(RM8(ea))); break;                /* SRA  (XY+o)      */
1106         case 0x2f: A = SRA(RM8(ea)); WM8(ea, A); break;         /* SRA  A=(XY+o)    */
1107         case 0x30: B = SLL(RM8(ea)); WM8(ea, B); break;         /* SLL  B=(XY+o)    */
1108         case 0x31: C = SLL(RM8(ea)); WM8(ea, C); break;         /* SLL  C=(XY+o)    */
1109         case 0x32: D = SLL(RM8(ea)); WM8(ea, D); break;         /* SLL  D=(XY+o)    */
1110         case 0x33: E = SLL(RM8(ea)); WM8(ea, E); break;         /* SLL  E=(XY+o)    */
1111         case 0x34: H = SLL(RM8(ea)); WM8(ea, H); break;         /* SLL  H=(XY+o)    */
1112         case 0x35: L = SLL(RM8(ea)); WM8(ea, L); break;         /* SLL  L=(XY+o)    */
1113         case 0x36: WM8(ea, SLL(RM8(ea))); break;                /* SLL  (XY+o)      */
1114         case 0x37: A = SLL(RM8(ea)); WM8(ea, A); break;         /* SLL  A=(XY+o)    */
1115         case 0x38: B = SRL(RM8(ea)); WM8(ea, B); break;         /* SRL  B=(XY+o)    */
1116         case 0x39: C = SRL(RM8(ea)); WM8(ea, C); break;         /* SRL  C=(XY+o)    */
1117         case 0x3a: D = SRL(RM8(ea)); WM8(ea, D); break;         /* SRL  D=(XY+o)    */
1118         case 0x3b: E = SRL(RM8(ea)); WM8(ea, E); break;         /* SRL  E=(XY+o)    */
1119         case 0x3c: H = SRL(RM8(ea)); WM8(ea, H); break;         /* SRL  H=(XY+o)    */
1120         case 0x3d: L = SRL(RM8(ea)); WM8(ea, L); break;         /* SRL  L=(XY+o)    */
1121         case 0x3e: WM8(ea, SRL(RM8(ea))); break;                /* SRL  (XY+o)      */
1122         case 0x3f: A = SRL(RM8(ea)); WM8(ea, A); break;         /* SRL  A=(XY+o)    */
1123         case 0x40: BIT_XY(0, RM8(ea)); break;                   /* BIT  0,(XY+o)    */
1124         case 0x41: BIT_XY(0, RM8(ea)); break;                   /* BIT  0,(XY+o)    */
1125         case 0x42: BIT_XY(0, RM8(ea)); break;                   /* BIT  0,(XY+o)    */
1126         case 0x43: BIT_XY(0, RM8(ea)); break;                   /* BIT  0,(XY+o)    */
1127         case 0x44: BIT_XY(0, RM8(ea)); break;                   /* BIT  0,(XY+o)    */
1128         case 0x45: BIT_XY(0, RM8(ea)); break;                   /* BIT  0,(XY+o)    */
1129         case 0x46: BIT_XY(0, RM8(ea)); break;                   /* BIT  0,(XY+o)    */
1130         case 0x47: BIT_XY(0, RM8(ea)); break;                   /* BIT  0,(XY+o)    */
1131         case 0x48: BIT_XY(1, RM8(ea)); break;                   /* BIT  1,(XY+o)    */
1132         case 0x49: BIT_XY(1, RM8(ea)); break;                   /* BIT  1,(XY+o)    */
1133         case 0x4a: BIT_XY(1, RM8(ea)); break;                   /* BIT  1,(XY+o)    */
1134         case 0x4b: BIT_XY(1, RM8(ea)); break;                   /* BIT  1,(XY+o)    */
1135         case 0x4c: BIT_XY(1, RM8(ea)); break;                   /* BIT  1,(XY+o)    */
1136         case 0x4d: BIT_XY(1, RM8(ea)); break;                   /* BIT  1,(XY+o)    */
1137         case 0x4e: BIT_XY(1, RM8(ea)); break;                   /* BIT  1,(XY+o)    */
1138         case 0x4f: BIT_XY(1, RM8(ea)); break;                   /* BIT  1,(XY+o)    */
1139         case 0x50: BIT_XY(2, RM8(ea)); break;                   /* BIT  2,(XY+o)    */
1140         case 0x51: BIT_XY(2, RM8(ea)); break;                   /* BIT  2,(XY+o)    */
1141         case 0x52: BIT_XY(2, RM8(ea)); break;                   /* BIT  2,(XY+o)    */
1142         case 0x53: BIT_XY(2, RM8(ea)); break;                   /* BIT  2,(XY+o)    */
1143         case 0x54: BIT_XY(2, RM8(ea)); break;                   /* BIT  2,(XY+o)    */
1144         case 0x55: BIT_XY(2, RM8(ea)); break;                   /* BIT  2,(XY+o)    */
1145         case 0x56: BIT_XY(2, RM8(ea)); break;                   /* BIT  2,(XY+o)    */
1146         case 0x57: BIT_XY(2, RM8(ea)); break;                   /* BIT  2,(XY+o)    */
1147         case 0x58: BIT_XY(3, RM8(ea)); break;                   /* BIT  3,(XY+o)    */
1148         case 0x59: BIT_XY(3, RM8(ea)); break;                   /* BIT  3,(XY+o)    */
1149         case 0x5a: BIT_XY(3, RM8(ea)); break;                   /* BIT  3,(XY+o)    */
1150         case 0x5b: BIT_XY(3, RM8(ea)); break;                   /* BIT  3,(XY+o)    */
1151         case 0x5c: BIT_XY(3, RM8(ea)); break;                   /* BIT  3,(XY+o)    */
1152         case 0x5d: BIT_XY(3, RM8(ea)); break;                   /* BIT  3,(XY+o)    */
1153         case 0x5e: BIT_XY(3, RM8(ea)); break;                   /* BIT  3,(XY+o)    */
1154         case 0x5f: BIT_XY(3, RM8(ea)); break;                   /* BIT  3,(XY+o)    */
1155         case 0x60: BIT_XY(4, RM8(ea)); break;                   /* BIT  4,(XY+o)    */
1156         case 0x61: BIT_XY(4, RM8(ea)); break;                   /* BIT  4,(XY+o)    */
1157         case 0x62: BIT_XY(4, RM8(ea)); break;                   /* BIT  4,(XY+o)    */
1158         case 0x63: BIT_XY(4, RM8(ea)); break;                   /* BIT  4,(XY+o)    */
1159         case 0x64: BIT_XY(4, RM8(ea)); break;                   /* BIT  4,(XY+o)    */
1160         case 0x65: BIT_XY(4, RM8(ea)); break;                   /* BIT  4,(XY+o)    */
1161         case 0x66: BIT_XY(4, RM8(ea)); break;                   /* BIT  4,(XY+o)    */
1162         case 0x67: BIT_XY(4, RM8(ea)); break;                   /* BIT  4,(XY+o)    */
1163         case 0x68: BIT_XY(5, RM8(ea)); break;                   /* BIT  5,(XY+o)    */
1164         case 0x69: BIT_XY(5, RM8(ea)); break;                   /* BIT  5,(XY+o)    */
1165         case 0x6a: BIT_XY(5, RM8(ea)); break;                   /* BIT  5,(XY+o)    */
1166         case 0x6b: BIT_XY(5, RM8(ea)); break;                   /* BIT  5,(XY+o)    */
1167         case 0x6c: BIT_XY(5, RM8(ea)); break;                   /* BIT  5,(XY+o)    */
1168         case 0x6d: BIT_XY(5, RM8(ea)); break;                   /* BIT  5,(XY+o)    */
1169         case 0x6e: BIT_XY(5, RM8(ea)); break;                   /* BIT  5,(XY+o)    */
1170         case 0x6f: BIT_XY(5, RM8(ea)); break;                   /* BIT  5,(XY+o)    */
1171         case 0x70: BIT_XY(6, RM8(ea)); break;                   /* BIT  6,(XY+o)    */
1172         case 0x71: BIT_XY(6, RM8(ea)); break;                   /* BIT  6,(XY+o)    */
1173         case 0x72: BIT_XY(6, RM8(ea)); break;                   /* BIT  6,(XY+o)    */
1174         case 0x73: BIT_XY(6, RM8(ea)); break;                   /* BIT  6,(XY+o)    */
1175         case 0x74: BIT_XY(6, RM8(ea)); break;                   /* BIT  6,(XY+o)    */
1176         case 0x75: BIT_XY(6, RM8(ea)); break;                   /* BIT  6,(XY+o)    */
1177         case 0x76: BIT_XY(6, RM8(ea)); break;                   /* BIT  6,(XY+o)    */
1178         case 0x77: BIT_XY(6, RM8(ea)); break;                   /* BIT  6,(XY+o)    */
1179         case 0x78: BIT_XY(7, RM8(ea)); break;                   /* BIT  7,(XY+o)    */
1180         case 0x79: BIT_XY(7, RM8(ea)); break;                   /* BIT  7,(XY+o)    */
1181         case 0x7a: BIT_XY(7, RM8(ea)); break;                   /* BIT  7,(XY+o)    */
1182         case 0x7b: BIT_XY(7, RM8(ea)); break;                   /* BIT  7,(XY+o)    */
1183         case 0x7c: BIT_XY(7, RM8(ea)); break;                   /* BIT  7,(XY+o)    */
1184         case 0x7d: BIT_XY(7, RM8(ea)); break;                   /* BIT  7,(XY+o)    */
1185         case 0x7e: BIT_XY(7, RM8(ea)); break;                   /* BIT  7,(XY+o)    */
1186         case 0x7f: BIT_XY(7, RM8(ea)); break;                   /* BIT  7,(XY+o)    */
1187         case 0x80: B = RES(0, RM8(ea)); WM8(ea, B); break;      /* RES  0,B=(XY+o)  */
1188         case 0x81: C = RES(0, RM8(ea)); WM8(ea, C); break;      /* RES  0,C=(XY+o)  */
1189         case 0x82: D = RES(0, RM8(ea)); WM8(ea, D); break;      /* RES  0,D=(XY+o)  */
1190         case 0x83: E = RES(0, RM8(ea)); WM8(ea, E); break;      /* RES  0,E=(XY+o)  */
1191         case 0x84: H = RES(0, RM8(ea)); WM8(ea, H); break;      /* RES  0,H=(XY+o)  */
1192         case 0x85: L = RES(0, RM8(ea)); WM8(ea, L); break;      /* RES  0,L=(XY+o)  */
1193         case 0x86: WM8(ea, RES(0, RM8(ea))); break;             /* RES  0,(XY+o)    */
1194         case 0x87: A = RES(0, RM8(ea)); WM8(ea, A); break;      /* RES  0,A=(XY+o)  */
1195         case 0x88: B = RES(1, RM8(ea)); WM8(ea, B); break;      /* RES  1,B=(XY+o)  */
1196         case 0x89: C = RES(1, RM8(ea)); WM8(ea, C); break;      /* RES  1,C=(XY+o)  */
1197         case 0x8a: D = RES(1, RM8(ea)); WM8(ea, D); break;      /* RES  1,D=(XY+o)  */
1198         case 0x8b: E = RES(1, RM8(ea)); WM8(ea, E); break;      /* RES  1,E=(XY+o)  */
1199         case 0x8c: H = RES(1, RM8(ea)); WM8(ea, H); break;      /* RES  1,H=(XY+o)  */
1200         case 0x8d: L = RES(1, RM8(ea)); WM8(ea, L); break;      /* RES  1,L=(XY+o)  */
1201         case 0x8e: WM8(ea, RES(1, RM8(ea))); break;             /* RES  1,(XY+o)    */
1202         case 0x8f: A = RES(1, RM8(ea)); WM8(ea, A); break;      /* RES  1,A=(XY+o)  */
1203         case 0x90: B = RES(2, RM8(ea)); WM8(ea, B); break;      /* RES  2,B=(XY+o)  */
1204         case 0x91: C = RES(2, RM8(ea)); WM8(ea, C); break;      /* RES  2,C=(XY+o)  */
1205         case 0x92: D = RES(2, RM8(ea)); WM8(ea, D); break;      /* RES  2,D=(XY+o)  */
1206         case 0x93: E = RES(2, RM8(ea)); WM8(ea, E); break;      /* RES  2,E=(XY+o)  */
1207         case 0x94: H = RES(2, RM8(ea)); WM8(ea, H); break;      /* RES  2,H=(XY+o)  */
1208         case 0x95: L = RES(2, RM8(ea)); WM8(ea, L); break;      /* RES  2,L=(XY+o)  */
1209         case 0x96: WM8(ea, RES(2, RM8(ea))); break;             /* RES  2,(XY+o)    */
1210         case 0x97: A = RES(2, RM8(ea)); WM8(ea, A); break;      /* RES  2,A=(XY+o)  */
1211         case 0x98: B = RES(3, RM8(ea)); WM8(ea, B); break;      /* RES  3,B=(XY+o)  */
1212         case 0x99: C = RES(3, RM8(ea)); WM8(ea, C); break;      /* RES  3,C=(XY+o)  */
1213         case 0x9a: D = RES(3, RM8(ea)); WM8(ea, D); break;      /* RES  3,D=(XY+o)  */
1214         case 0x9b: E = RES(3, RM8(ea)); WM8(ea, E); break;      /* RES  3,E=(XY+o)  */
1215         case 0x9c: H = RES(3, RM8(ea)); WM8(ea, H); break;      /* RES  3,H=(XY+o)  */
1216         case 0x9d: L = RES(3, RM8(ea)); WM8(ea, L); break;      /* RES  3,L=(XY+o)  */
1217         case 0x9e: WM8(ea, RES(3, RM8(ea))); break;             /* RES  3,(XY+o)    */
1218         case 0x9f: A = RES(3, RM8(ea)); WM8(ea, A); break;      /* RES  3,A=(XY+o)  */
1219         case 0xa0: B = RES(4, RM8(ea)); WM8(ea, B); break;      /* RES  4,B=(XY+o)  */
1220         case 0xa1: C = RES(4, RM8(ea)); WM8(ea, C); break;      /* RES  4,C=(XY+o)  */
1221         case 0xa2: D = RES(4, RM8(ea)); WM8(ea, D); break;      /* RES  4,D=(XY+o)  */
1222         case 0xa3: E = RES(4, RM8(ea)); WM8(ea, E); break;      /* RES  4,E=(XY+o)  */
1223         case 0xa4: H = RES(4, RM8(ea)); WM8(ea, H); break;      /* RES  4,H=(XY+o)  */
1224         case 0xa5: L = RES(4, RM8(ea)); WM8(ea, L); break;      /* RES  4,L=(XY+o)  */
1225         case 0xa6: WM8(ea, RES(4, RM8(ea))); break;             /* RES  4,(XY+o)    */
1226         case 0xa7: A = RES(4, RM8(ea)); WM8(ea, A); break;      /* RES  4,A=(XY+o)  */
1227         case 0xa8: B = RES(5, RM8(ea)); WM8(ea, B); break;      /* RES  5,B=(XY+o)  */
1228         case 0xa9: C = RES(5, RM8(ea)); WM8(ea, C); break;      /* RES  5,C=(XY+o)  */
1229         case 0xaa: D = RES(5, RM8(ea)); WM8(ea, D); break;      /* RES  5,D=(XY+o)  */
1230         case 0xab: E = RES(5, RM8(ea)); WM8(ea, E); break;      /* RES  5,E=(XY+o)  */
1231         case 0xac: H = RES(5, RM8(ea)); WM8(ea, H); break;      /* RES  5,H=(XY+o)  */
1232         case 0xad: L = RES(5, RM8(ea)); WM8(ea, L); break;      /* RES  5,L=(XY+o)  */
1233         case 0xae: WM8(ea, RES(5, RM8(ea))); break;             /* RES  5,(XY+o)    */
1234         case 0xaf: A = RES(5, RM8(ea)); WM8(ea, A); break;      /* RES  5,A=(XY+o)  */
1235         case 0xb0: B = RES(6, RM8(ea)); WM8(ea, B); break;      /* RES  6,B=(XY+o)  */
1236         case 0xb1: C = RES(6, RM8(ea)); WM8(ea, C); break;      /* RES  6,C=(XY+o)  */
1237         case 0xb2: D = RES(6, RM8(ea)); WM8(ea, D); break;      /* RES  6,D=(XY+o)  */
1238         case 0xb3: E = RES(6, RM8(ea)); WM8(ea, E); break;      /* RES  6,E=(XY+o)  */
1239         case 0xb4: H = RES(6, RM8(ea)); WM8(ea, H); break;      /* RES  6,H=(XY+o)  */
1240         case 0xb5: L = RES(6, RM8(ea)); WM8(ea, L); break;      /* RES  6,L=(XY+o)  */
1241         case 0xb6: WM8(ea, RES(6, RM8(ea))); break;             /* RES  6,(XY+o)    */
1242         case 0xb7: A = RES(6, RM8(ea)); WM8(ea, A); break;      /* RES  6,A=(XY+o)  */
1243         case 0xb8: B = RES(7, RM8(ea)); WM8(ea, B); break;      /* RES  7,B=(XY+o)  */
1244         case 0xb9: C = RES(7, RM8(ea)); WM8(ea, C); break;      /* RES  7,C=(XY+o)  */
1245         case 0xba: D = RES(7, RM8(ea)); WM8(ea, D); break;      /* RES  7,D=(XY+o)  */
1246         case 0xbb: E = RES(7, RM8(ea)); WM8(ea, E); break;      /* RES  7,E=(XY+o)  */
1247         case 0xbc: H = RES(7, RM8(ea)); WM8(ea, H); break;      /* RES  7,H=(XY+o)  */
1248         case 0xbd: L = RES(7, RM8(ea)); WM8(ea, L); break;      /* RES  7,L=(XY+o)  */
1249         case 0xbe: WM8(ea, RES(7, RM8(ea))); break;             /* RES  7,(XY+o)    */
1250         case 0xbf: A = RES(7, RM8(ea)); WM8(ea, A); break;      /* RES  7,A=(XY+o)  */
1251         case 0xc0: B = SET(0, RM8(ea)); WM8(ea, B); break;      /* SET  0,B=(XY+o)  */
1252         case 0xc1: C = SET(0, RM8(ea)); WM8(ea, C); break;      /* SET  0,C=(XY+o)  */
1253         case 0xc2: D = SET(0, RM8(ea)); WM8(ea, D); break;      /* SET  0,D=(XY+o)  */
1254         case 0xc3: E = SET(0, RM8(ea)); WM8(ea, E); break;      /* SET  0,E=(XY+o)  */
1255         case 0xc4: H = SET(0, RM8(ea)); WM8(ea, H); break;      /* SET  0,H=(XY+o)  */
1256         case 0xc5: L = SET(0, RM8(ea)); WM8(ea, L); break;      /* SET  0,L=(XY+o)  */
1257         case 0xc6: WM8(ea, SET(0, RM8(ea))); break;             /* SET  0,(XY+o)    */
1258         case 0xc7: A = SET(0, RM8(ea)); WM8(ea, A); break;      /* SET  0,A=(XY+o)  */
1259         case 0xc8: B = SET(1, RM8(ea)); WM8(ea, B); break;      /* SET  1,B=(XY+o)  */
1260         case 0xc9: C = SET(1, RM8(ea)); WM8(ea, C); break;      /* SET  1,C=(XY+o)  */
1261         case 0xca: D = SET(1, RM8(ea)); WM8(ea, D); break;      /* SET  1,D=(XY+o)  */
1262         case 0xcb: E = SET(1, RM8(ea)); WM8(ea, E); break;      /* SET  1,E=(XY+o)  */
1263         case 0xcc: H = SET(1, RM8(ea)); WM8(ea, H); break;      /* SET  1,H=(XY+o)  */
1264         case 0xcd: L = SET(1, RM8(ea)); WM8(ea, L); break;      /* SET  1,L=(XY+o)  */
1265         case 0xce: WM8(ea, SET(1, RM8(ea))); break;             /* SET  1,(XY+o)    */
1266         case 0xcf: A = SET(1, RM8(ea)); WM8(ea, A); break;      /* SET  1,A=(XY+o)  */
1267         case 0xd0: B = SET(2, RM8(ea)); WM8(ea, B); break;      /* SET  2,B=(XY+o)  */
1268         case 0xd1: C = SET(2, RM8(ea)); WM8(ea, C); break;      /* SET  2,C=(XY+o)  */
1269         case 0xd2: D = SET(2, RM8(ea)); WM8(ea, D); break;      /* SET  2,D=(XY+o)  */
1270         case 0xd3: E = SET(2, RM8(ea)); WM8(ea, E); break;      /* SET  2,E=(XY+o)  */
1271         case 0xd4: H = SET(2, RM8(ea)); WM8(ea, H); break;      /* SET  2,H=(XY+o)  */
1272         case 0xd5: L = SET(2, RM8(ea)); WM8(ea, L); break;      /* SET  2,L=(XY+o)  */
1273         case 0xd6: WM8(ea, SET(2, RM8(ea))); break;             /* SET  2,(XY+o)    */
1274         case 0xd7: A = SET(2, RM8(ea)); WM8(ea, A); break;      /* SET  2,A=(XY+o)  */
1275         case 0xd8: B = SET(3, RM8(ea)); WM8(ea, B); break;      /* SET  3,B=(XY+o)  */
1276         case 0xd9: C = SET(3, RM8(ea)); WM8(ea, C); break;      /* SET  3,C=(XY+o)  */
1277         case 0xda: D = SET(3, RM8(ea)); WM8(ea, D); break;      /* SET  3,D=(XY+o)  */
1278         case 0xdb: E = SET(3, RM8(ea)); WM8(ea, E); break;      /* SET  3,E=(XY+o)  */
1279         case 0xdc: H = SET(3, RM8(ea)); WM8(ea, H); break;      /* SET  3,H=(XY+o)  */
1280         case 0xdd: L = SET(3, RM8(ea)); WM8(ea, L); break;      /* SET  3,L=(XY+o)  */
1281         case 0xde: WM8(ea, SET(3, RM8(ea))); break;             /* SET  3,(XY+o)    */
1282         case 0xdf: A = SET(3, RM8(ea)); WM8(ea, A); break;      /* SET  3,A=(XY+o)  */
1283         case 0xe0: B = SET(4, RM8(ea)); WM8(ea, B); break;      /* SET  4,B=(XY+o)  */
1284         case 0xe1: C = SET(4, RM8(ea)); WM8(ea, C); break;      /* SET  4,C=(XY+o)  */
1285         case 0xe2: D = SET(4, RM8(ea)); WM8(ea, D); break;      /* SET  4,D=(XY+o)  */
1286         case 0xe3: E = SET(4, RM8(ea)); WM8(ea, E); break;      /* SET  4,E=(XY+o)  */
1287         case 0xe4: H = SET(4, RM8(ea)); WM8(ea, H); break;      /* SET  4,H=(XY+o)  */
1288         case 0xe5: L = SET(4, RM8(ea)); WM8(ea, L); break;      /* SET  4,L=(XY+o)  */
1289         case 0xe6: WM8(ea, SET(4, RM8(ea))); break;             /* SET  4,(XY+o)    */
1290         case 0xe7: A = SET(4, RM8(ea)); WM8(ea, A); break;      /* SET  4,A=(XY+o)  */
1291         case 0xe8: B = SET(5, RM8(ea)); WM8(ea, B); break;      /* SET  5,B=(XY+o)  */
1292         case 0xe9: C = SET(5, RM8(ea)); WM8(ea, C); break;      /* SET  5,C=(XY+o)  */
1293         case 0xea: D = SET(5, RM8(ea)); WM8(ea, D); break;      /* SET  5,D=(XY+o)  */
1294         case 0xeb: E = SET(5, RM8(ea)); WM8(ea, E); break;      /* SET  5,E=(XY+o)  */
1295         case 0xec: H = SET(5, RM8(ea)); WM8(ea, H); break;      /* SET  5,H=(XY+o)  */
1296         case 0xed: L = SET(5, RM8(ea)); WM8(ea, L); break;      /* SET  5,L=(XY+o)  */
1297         case 0xee: WM8(ea, SET(5, RM8(ea))); break;             /* SET  5,(XY+o)    */
1298         case 0xef: A = SET(5, RM8(ea)); WM8(ea, A); break;      /* SET  5,A=(XY+o)  */
1299         case 0xf0: B = SET(6, RM8(ea)); WM8(ea, B); break;      /* SET  6,B=(XY+o)  */
1300         case 0xf1: C = SET(6, RM8(ea)); WM8(ea, C); break;      /* SET  6,C=(XY+o)  */
1301         case 0xf2: D = SET(6, RM8(ea)); WM8(ea, D); break;      /* SET  6,D=(XY+o)  */
1302         case 0xf3: E = SET(6, RM8(ea)); WM8(ea, E); break;      /* SET  6,E=(XY+o)  */
1303         case 0xf4: H = SET(6, RM8(ea)); WM8(ea, H); break;      /* SET  6,H=(XY+o)  */
1304         case 0xf5: L = SET(6, RM8(ea)); WM8(ea, L); break;      /* SET  6,L=(XY+o)  */
1305         case 0xf6: WM8(ea, SET(6, RM8(ea))); break;             /* SET  6,(XY+o)    */
1306         case 0xf7: A = SET(6, RM8(ea)); WM8(ea, A); break;      /* SET  6,A=(XY+o)  */
1307         case 0xf8: B = SET(7, RM8(ea)); WM8(ea, B); break;      /* SET  7,B=(XY+o)  */
1308         case 0xf9: C = SET(7, RM8(ea)); WM8(ea, C); break;      /* SET  7,C=(XY+o)  */
1309         case 0xfa: D = SET(7, RM8(ea)); WM8(ea, D); break;      /* SET  7,D=(XY+o)  */
1310         case 0xfb: E = SET(7, RM8(ea)); WM8(ea, E); break;      /* SET  7,E=(XY+o)  */
1311         case 0xfc: H = SET(7, RM8(ea)); WM8(ea, H); break;      /* SET  7,H=(XY+o)  */
1312         case 0xfd: L = SET(7, RM8(ea)); WM8(ea, L); break;      /* SET  7,L=(XY+o)  */
1313         case 0xfe: WM8(ea, SET(7, RM8(ea))); break;             /* SET  7,(XY+o)    */
1314         case 0xff: A = SET(7, RM8(ea)); WM8(ea, A); break;      /* SET  7,A=(XY+o)  */
1315 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
1316         default: __assume(0);
1317 #endif
1318         }
1319 }
1320
1321 void Z80_BASE::OP_DD(uint8_t code)
1322 {
1323         icount -= cc_xy[code];
1324         
1325         switch(code) {
1326         case 0x09: ADD16(ix, bc); break;                                /* ADD  IX,BC       */
1327         case 0x19: ADD16(ix, de); break;                                /* ADD  IX,DE       */
1328         case 0x21: IX = FETCH16(); break;                               /* LD   IX,w        */
1329         case 0x22: ea = FETCH16(); WM16(ea, &ix); WZ = ea + 1; break;   /* LD   (w),IX      */
1330         case 0x23: IX++; break;                                         /* INC  IX          */
1331         case 0x24: HX = INC(HX); break;                                 /* INC  HX          */
1332         case 0x25: HX = DEC(HX); break;                                 /* DEC  HX          */
1333         case 0x26: HX = FETCH8(); break;                                /* LD   HX,n        */
1334         case 0x29: ADD16(ix, ix); break;                                /* ADD  IX,IX       */
1335         case 0x2a: ea = FETCH16(); RM16(ea, &ix); WZ = ea + 1; break;   /* LD   IX,(w)      */
1336         case 0x2b: IX--; break;                                         /* DEC  IX          */
1337         case 0x2c: LX = INC(LX); break;                                 /* INC  LX          */
1338         case 0x2d: LX = DEC(LX); break;                                 /* DEC  LX          */
1339         case 0x2e: LX = FETCH8(); break;                                /* LD   LX,n        */
1340         case 0x34: EAX(); WM8(ea, INC(RM8(ea))); break;                 /* INC  (IX+o)      */
1341         case 0x35: EAX(); WM8(ea, DEC(RM8(ea))); break;                 /* DEC  (IX+o)      */
1342         case 0x36: EAX(); WM8(ea, FETCH8()); break;                     /* LD   (IX+o),n    */
1343         case 0x39: ADD16(ix, sp); break;                                /* ADD  IX,SP       */
1344         case 0x44: B = HX; break;                                       /* LD   B,HX        */
1345         case 0x45: B = LX; break;                                       /* LD   B,LX        */
1346         case 0x46: EAX(); B = RM8(ea); break;                           /* LD   B,(IX+o)    */
1347         case 0x4c: C = HX; break;                                       /* LD   C,HX        */
1348         case 0x4d: C = LX; break;                                       /* LD   C,LX        */
1349         case 0x4e: EAX(); C = RM8(ea); break;                           /* LD   C,(IX+o)    */
1350         case 0x54: D = HX; break;                                       /* LD   D,HX        */
1351         case 0x55: D = LX; break;                                       /* LD   D,LX        */
1352         case 0x56: EAX(); D = RM8(ea); break;                           /* LD   D,(IX+o)    */
1353         case 0x5c: E = HX; break;                                       /* LD   E,HX        */
1354         case 0x5d: E = LX; break;                                       /* LD   E,LX        */
1355         case 0x5e: EAX(); E = RM8(ea); break;                           /* LD   E,(IX+o)    */
1356         case 0x60: HX = B; break;                                       /* LD   HX,B        */
1357         case 0x61: HX = C; break;                                       /* LD   HX,C        */
1358         case 0x62: HX = D; break;                                       /* LD   HX,D        */
1359         case 0x63: HX = E; break;                                       /* LD   HX,E        */
1360         case 0x64: break;                                               /* LD   HX,HX       */
1361         case 0x65: HX = LX; break;                                      /* LD   HX,LX       */
1362         case 0x66: EAX(); H = RM8(ea); break;                           /* LD   H,(IX+o)    */
1363         case 0x67: HX = A; break;                                       /* LD   HX,A        */
1364         case 0x68: LX = B; break;                                       /* LD   LX,B        */
1365         case 0x69: LX = C; break;                                       /* LD   LX,C        */
1366         case 0x6a: LX = D; break;                                       /* LD   LX,D        */
1367         case 0x6b: LX = E; break;                                       /* LD   LX,E        */
1368         case 0x6c: LX = HX; break;                                      /* LD   LX,HX       */
1369         case 0x6d: break;                                               /* LD   LX,LX       */
1370         case 0x6e: EAX(); L = RM8(ea); break;                           /* LD   L,(IX+o)    */
1371         case 0x6f: LX = A; break;                                       /* LD   LX,A        */
1372         case 0x70: EAX(); WM8(ea, B); break;                            /* LD   (IX+o),B    */
1373         case 0x71: EAX(); WM8(ea, C); break;                            /* LD   (IX+o),C    */
1374         case 0x72: EAX(); WM8(ea, D); break;                            /* LD   (IX+o),D    */
1375         case 0x73: EAX(); WM8(ea, E); break;                            /* LD   (IX+o),E    */
1376         case 0x74: EAX(); WM8(ea, H); break;                            /* LD   (IX+o),H    */
1377         case 0x75: EAX(); WM8(ea, L); break;                            /* LD   (IX+o),L    */
1378         case 0x77: EAX(); WM8(ea, A); break;                            /* LD   (IX+o),A    */
1379         case 0x7c: A = HX; break;                                       /* LD   A,HX        */
1380         case 0x7d: A = LX; break;                                       /* LD   A,LX        */
1381         case 0x7e: EAX(); A = RM8(ea); break;                           /* LD   A,(IX+o)    */
1382         case 0x84: ADD(HX); break;                                      /* ADD  A,HX        */
1383         case 0x85: ADD(LX); break;                                      /* ADD  A,LX        */
1384         case 0x86: EAX(); ADD(RM8(ea)); break;                          /* ADD  A,(IX+o)    */
1385         case 0x8c: ADC(HX); break;                                      /* ADC  A,HX        */
1386         case 0x8d: ADC(LX); break;                                      /* ADC  A,LX        */
1387         case 0x8e: EAX(); ADC(RM8(ea)); break;                          /* ADC  A,(IX+o)    */
1388         case 0x94: SUB(HX); break;                                      /* SUB  HX          */
1389         case 0x95: SUB(LX); break;                                      /* SUB  LX          */
1390         case 0x96: EAX(); SUB(RM8(ea)); break;                          /* SUB  (IX+o)      */
1391         case 0x9c: SBC(HX); break;                                      /* SBC  A,HX        */
1392         case 0x9d: SBC(LX); break;                                      /* SBC  A,LX        */
1393         case 0x9e: EAX(); SBC(RM8(ea)); break;                          /* SBC  A,(IX+o)    */
1394         case 0xa4: AND(HX); break;                                      /* AND  HX          */
1395         case 0xa5: AND(LX); break;                                      /* AND  LX          */
1396         case 0xa6: EAX(); AND(RM8(ea)); break;                          /* AND  (IX+o)      */
1397         case 0xac: XOR(HX); break;                                      /* XOR  HX          */
1398         case 0xad: XOR(LX); break;                                      /* XOR  LX          */
1399         case 0xae: EAX(); XOR(RM8(ea)); break;                          /* XOR  (IX+o)      */
1400         case 0xb4: OR(HX); break;                                       /* OR   HX          */
1401         case 0xb5: OR(LX); break;                                       /* OR   LX          */
1402         case 0xb6: EAX(); OR(RM8(ea)); break;                           /* OR   (IX+o)      */
1403         case 0xbc: CP(HX); break;                                       /* CP   HX          */
1404         case 0xbd: CP(LX); break;                                       /* CP   LX          */
1405         case 0xbe: EAX(); CP(RM8(ea)); break;                           /* CP   (IX+o)      */
1406         case 0xcb: EAX(); OP_XY(FETCH8()); break;                       /* **   DD CB xx    */
1407         case 0xe1: POP(ix); break;                                      /* POP  IX          */
1408         case 0xe3: EXSP(ix); break;                                     /* EX   (SP),IX     */
1409         case 0xe5: PUSH(ix); break;                                     /* PUSH IX          */
1410         case 0xe9: PC = IX; break;                                      /* JP   (IX)        */
1411         case 0xf9: SP = IX; break;                                      /* LD   SP,IX       */
1412         default:   OP(code); break;
1413         }
1414 }
1415
1416 void Z80_BASE::OP_FD(uint8_t code)
1417 {
1418         icount -= cc_xy[code];
1419         
1420         switch(code) {
1421         case 0x09: ADD16(iy, bc); break;                                /* ADD  IY,BC       */
1422         case 0x19: ADD16(iy, de); break;                                /* ADD  IY,DE       */
1423         case 0x21: IY = FETCH16(); break;                               /* LD   IY,w        */
1424         case 0x22: ea = FETCH16(); WM16(ea, &iy); WZ = ea + 1; break;   /* LD   (w),IY      */
1425         case 0x23: IY++; break;                                         /* INC  IY          */
1426         case 0x24: HY = INC(HY); break;                                 /* INC  HY          */
1427         case 0x25: HY = DEC(HY); break;                                 /* DEC  HY          */
1428         case 0x26: HY = FETCH8(); break;                                /* LD   HY,n        */
1429         case 0x29: ADD16(iy, iy); break;                                /* ADD  IY,IY       */
1430         case 0x2a: ea = FETCH16(); RM16(ea, &iy); WZ = ea + 1; break;   /* LD   IY,(w)      */
1431         case 0x2b: IY--; break;                                         /* DEC  IY          */
1432         case 0x2c: LY = INC(LY); break;                                 /* INC  LY          */
1433         case 0x2d: LY = DEC(LY); break;                                 /* DEC  LY          */
1434         case 0x2e: LY = FETCH8(); break;                                /* LD   LY,n        */
1435         case 0x34: EAY(); WM8(ea, INC(RM8(ea))); break;                 /* INC  (IY+o)      */
1436         case 0x35: EAY(); WM8(ea, DEC(RM8(ea))); break;                 /* DEC  (IY+o)      */
1437         case 0x36: EAY(); WM8(ea, FETCH8()); break;                     /* LD   (IY+o),n    */
1438         case 0x39: ADD16(iy, sp); break;                                /* ADD  IY,SP       */
1439         case 0x44: B = HY; break;                                       /* LD   B,HY        */
1440         case 0x45: B = LY; break;                                       /* LD   B,LY        */
1441         case 0x46: EAY(); B = RM8(ea); break;                           /* LD   B,(IY+o)    */
1442         case 0x4c: C = HY; break;                                       /* LD   C,HY        */
1443         case 0x4d: C = LY; break;                                       /* LD   C,LY        */
1444         case 0x4e: EAY(); C = RM8(ea); break;                           /* LD   C,(IY+o)    */
1445         case 0x54: D = HY; break;                                       /* LD   D,HY        */
1446         case 0x55: D = LY; break;                                       /* LD   D,LY        */
1447         case 0x56: EAY(); D = RM8(ea); break;                           /* LD   D,(IY+o)    */
1448         case 0x5c: E = HY; break;                                       /* LD   E,HY        */
1449         case 0x5d: E = LY; break;                                       /* LD   E,LY        */
1450         case 0x5e: EAY(); E = RM8(ea); break;                           /* LD   E,(IY+o)    */
1451         case 0x60: HY = B; break;                                       /* LD   HY,B        */
1452         case 0x61: HY = C; break;                                       /* LD   HY,C        */
1453         case 0x62: HY = D; break;                                       /* LD   HY,D        */
1454         case 0x63: HY = E; break;                                       /* LD   HY,E        */
1455         case 0x64: break;                                               /* LD   HY,HY       */
1456         case 0x65: HY = LY; break;                                      /* LD   HY,LY       */
1457         case 0x66: EAY(); H = RM8(ea); break;                           /* LD   H,(IY+o)    */
1458         case 0x67: HY = A; break;                                       /* LD   HY,A        */
1459         case 0x68: LY = B; break;                                       /* LD   LY,B        */
1460         case 0x69: LY = C; break;                                       /* LD   LY,C        */
1461         case 0x6a: LY = D; break;                                       /* LD   LY,D        */
1462         case 0x6b: LY = E; break;                                       /* LD   LY,E        */
1463         case 0x6c: LY = HY; break;                                      /* LD   LY,HY       */
1464         case 0x6d: break;                                               /* LD   LY,LY       */
1465         case 0x6e: EAY(); L = RM8(ea); break;                           /* LD   L,(IY+o)    */
1466         case 0x6f: LY = A; break;                                       /* LD   LY,A        */
1467         case 0x70: EAY(); WM8(ea, B); break;                            /* LD   (IY+o),B    */
1468         case 0x71: EAY(); WM8(ea, C); break;                            /* LD   (IY+o),C    */
1469         case 0x72: EAY(); WM8(ea, D); break;                            /* LD   (IY+o),D    */
1470         case 0x73: EAY(); WM8(ea, E); break;                            /* LD   (IY+o),E    */
1471         case 0x74: EAY(); WM8(ea, H); break;                            /* LD   (IY+o),H    */
1472         case 0x75: EAY(); WM8(ea, L); break;                            /* LD   (IY+o),L    */
1473         case 0x77: EAY(); WM8(ea, A); break;                            /* LD   (IY+o),A    */
1474         case 0x7c: A = HY; break;                                       /* LD   A,HY        */
1475         case 0x7d: A = LY; break;                                       /* LD   A,LY        */
1476         case 0x7e: EAY(); A = RM8(ea); break;                           /* LD   A,(IY+o)    */
1477         case 0x84: ADD(HY); break;                                      /* ADD  A,HY        */
1478         case 0x85: ADD(LY); break;                                      /* ADD  A,LY        */
1479         case 0x86: EAY(); ADD(RM8(ea)); break;                          /* ADD  A,(IY+o)    */
1480         case 0x8c: ADC(HY); break;                                      /* ADC  A,HY        */
1481         case 0x8d: ADC(LY); break;                                      /* ADC  A,LY        */
1482         case 0x8e: EAY(); ADC(RM8(ea)); break;                          /* ADC  A,(IY+o)    */
1483         case 0x94: SUB(HY); break;                                      /* SUB  HY          */
1484         case 0x95: SUB(LY); break;                                      /* SUB  LY          */
1485         case 0x96: EAY(); SUB(RM8(ea)); break;                          /* SUB  (IY+o)      */
1486         case 0x9c: SBC(HY); break;                                      /* SBC  A,HY        */
1487         case 0x9d: SBC(LY); break;                                      /* SBC  A,LY        */
1488         case 0x9e: EAY(); SBC(RM8(ea)); break;                          /* SBC  A,(IY+o)    */
1489         case 0xa4: AND(HY); break;                                      /* AND  HY          */
1490         case 0xa5: AND(LY); break;                                      /* AND  LY          */
1491         case 0xa6: EAY(); AND(RM8(ea)); break;                          /* AND  (IY+o)      */
1492         case 0xac: XOR(HY); break;                                      /* XOR  HY          */
1493         case 0xad: XOR(LY); break;                                      /* XOR  LY          */
1494         case 0xae: EAY(); XOR(RM8(ea)); break;                          /* XOR  (IY+o)      */
1495         case 0xb4: OR(HY); break;                                       /* OR   HY          */
1496         case 0xb5: OR(LY); break;                                       /* OR   LY          */
1497         case 0xb6: EAY(); OR(RM8(ea)); break;                           /* OR   (IY+o)      */
1498         case 0xbc: CP(HY); break;                                       /* CP   HY          */
1499         case 0xbd: CP(LY); break;                                       /* CP   LY          */
1500         case 0xbe: EAY(); CP(RM8(ea)); break;                           /* CP   (IY+o)      */
1501         case 0xcb: EAY(); OP_XY(FETCH8()); break;                       /* **   FD CB xx    */
1502         case 0xe1: POP(iy); break;                                      /* POP  IY          */
1503         case 0xe3: EXSP(iy); break;                                     /* EX   (SP),IY     */
1504         case 0xe5: PUSH(iy); break;                                     /* PUSH IY          */
1505         case 0xe9: PC = IY; break;                                      /* JP   (IY)        */
1506         case 0xf9: SP = IY; break;                                      /* LD   SP,IY       */
1507         default:   OP(code); break;
1508         }
1509 }
1510
1511 void Z80_BASE::OP_ED(uint8_t code)
1512 {
1513         icount -= cc_ed[code];
1514         
1515         switch(code) {
1516         case 0x40: B = IN8(BC); F = (F & CF) | SZP[B]; break;                   /* IN   B,(C)       */
1517         case 0x41: OUT8(BC, B); break;                                          /* OUT  (C),B       */
1518         case 0x42: SBC16(bc); break;                                            /* SBC  HL,BC       */
1519         case 0x43: ea = FETCH16(); WM16(ea, &bc); WZ = ea + 1; break;           /* LD   (w),BC      */
1520         case 0x44: NEG(); break;                                                /* NEG              */
1521         case 0x45: RETN(); break;                                               /* RETN             */
1522         case 0x46: im = 0; break;                                               /* im   0           */
1523         case 0x47: LD_I_A(); break;                                             /* LD   i,A         */
1524         case 0x48: C = IN8(BC); F = (F & CF) | SZP[C]; break;                   /* IN   C,(C)       */
1525         case 0x49: OUT8(BC, C); break;                                          /* OUT  (C),C       */
1526         case 0x4a: ADC16(bc); break;                                            /* ADC  HL,BC       */
1527         case 0x4b: ea = FETCH16(); RM16(ea, &bc); WZ = ea + 1; break;           /* LD   BC,(w)      */
1528         case 0x4c: NEG(); break;                                                /* NEG              */
1529         case 0x4d: RETI(); break;                                               /* RETI             */
1530         case 0x4e: im = 0; break;                                               /* im   0           */
1531         case 0x4f: LD_R_A(); break;                                             /* LD   r,A         */
1532         case 0x50: D = IN8(BC); F = (F & CF) | SZP[D]; break;                   /* IN   D,(C)       */
1533         case 0x51: OUT8(BC, D); break;                                          /* OUT  (C),D       */
1534         case 0x52: SBC16(de); break;                                            /* SBC  HL,DE       */
1535         case 0x53: ea = FETCH16(); WM16(ea, &de); WZ = ea + 1; break;           /* LD   (w),DE      */
1536         case 0x54: NEG(); break;                                                /* NEG              */
1537         case 0x55: RETN(); break;                                               /* RETN             */
1538         case 0x56: im = 1; break;                                               /* im   1           */
1539         case 0x57: LD_A_I(); break;                                             /* LD   A,i         */
1540         case 0x58: E = IN8(BC); F = (F & CF) | SZP[E]; break;                   /* IN   E,(C)       */
1541         case 0x59: OUT8(BC, E); break;                                          /* OUT  (C),E       */
1542         case 0x5a: ADC16(de); break;                                            /* ADC  HL,DE       */
1543         case 0x5b: ea = FETCH16(); RM16(ea, &de); WZ = ea + 1; break;           /* LD   DE,(w)      */
1544         case 0x5c: NEG(); break;                                                /* NEG              */
1545         case 0x5d: RETI(); break;                                               /* RETI             */
1546         case 0x5e: im = 2; break;                                               /* im   2           */
1547         case 0x5f: LD_A_R(); break;                                             /* LD   A,r         */
1548         case 0x60: H = IN8(BC); F = (F & CF) | SZP[H]; break;                   /* IN   H,(C)       */
1549         case 0x61: OUT8(BC, H); break;                                          /* OUT  (C),H       */
1550         case 0x62: SBC16(hl); break;                                            /* SBC  HL,HL       */
1551         case 0x63: ea = FETCH16(); WM16(ea, &hl); WZ = ea + 1; break;           /* LD   (w),HL      */
1552         case 0x64: NEG(); break;                                                /* NEG              */
1553         case 0x65: RETN(); break;                                               /* RETN             */
1554         case 0x66: im = 0; break;                                               /* im   0           */
1555         case 0x67: RRD(); break;                                                /* RRD  (HL)        */
1556         case 0x68: L = IN8(BC); F = (F & CF) | SZP[L]; break;                   /* IN   L,(C)       */
1557         case 0x69: OUT8(BC, L); break;                                          /* OUT  (C),L       */
1558         case 0x6a: ADC16(hl); break;                                            /* ADC  HL,HL       */
1559         case 0x6b: ea = FETCH16(); RM16(ea, &hl); WZ = ea + 1; break;           /* LD   HL,(w)      */
1560         case 0x6c: NEG(); break;                                                /* NEG              */
1561         case 0x6d: RETI(); break;                                               /* RETI             */
1562         case 0x6e: im = 0; break;                                               /* im   0           */
1563         case 0x6f: RLD(); break;                                                /* RLD  (HL)        */
1564         case 0x70: {uint8_t res = IN8(BC); F = (F & CF) | SZP[res];} break;     /* IN   F,(C)       */
1565         case 0x71: OUT8(BC, 0); break;                                          /* OUT  (C),0       */
1566         case 0x72: SBC16(sp); break;                                            /* SBC  HL,SP       */
1567         case 0x73: ea = FETCH16(); WM16(ea, &sp); WZ = ea + 1; break;           /* LD   (w),SP      */
1568         case 0x74: NEG(); break;                                                /* NEG              */
1569         case 0x75: RETN(); break;                                               /* RETN             */
1570         case 0x76: im = 1; break;                                               /* im   1           */
1571         case 0x78: A = IN8(BC); F = (F & CF) | SZP[A]; WZ = BC + 1; break;      /* IN   A,(C)       */
1572         case 0x79: OUT8(BC, A); WZ = BC + 1; break;                             /* OUT  (C),A       */
1573         case 0x7a: ADC16(sp); break;                                            /* ADC  HL,SP       */
1574         case 0x7b: ea = FETCH16(); RM16(ea, &sp); WZ = ea + 1; break;           /* LD   SP,(w)      */
1575         case 0x7c: NEG(); break;                                                /* NEG              */
1576         case 0x7d: RETI(); break;                                               /* RETI             */
1577         case 0x7e: im = 2; break;                                               /* im   2           */
1578         case 0xa0: LDI(); break;                                                /* LDI              */
1579         case 0xa1: CPI(); break;                                                /* CPI              */
1580         case 0xa2: INI(); break;                                                /* INI              */
1581         case 0xa3: OUTI(); break;                                               /* OUTI             */
1582         case 0xa8: LDD(); break;                                                /* LDD              */
1583         case 0xa9: CPD(); break;                                                /* CPD              */
1584         case 0xaa: IND(); break;                                                /* IND              */
1585         case 0xab: OUTD(); break;                                               /* OUTD             */
1586         case 0xb0: LDIR(); break;                                               /* LDIR             */
1587         case 0xb1: CPIR(); break;                                               /* CPIR             */
1588         case 0xb2: INIR(); break;                                               /* INIR             */
1589         case 0xb3: OTIR(); break;                                               /* OTIR             */
1590         case 0xb8: LDDR(); break;                                               /* LDDR             */
1591         case 0xb9: CPDR(); break;                                               /* CPDR             */
1592         case 0xba: INDR(); break;                                               /* INDR             */
1593         case 0xbb: OTDR(); break;                                               /* OTDR             */
1594         default:   OP(code); break;
1595         }
1596 }
1597
1598 void Z80_BASE::OP(uint8_t code)
1599 {
1600         prevpc = PC - 1;
1601         icount -= cc_op[code];
1602         
1603         switch(code) {
1604         case 0x00: break;                                                                                               /* NOP              */
1605         case 0x01: BC = FETCH16(); break;                                                                               /* LD   BC,w        */
1606         case 0x02: WM8(BC, A); WZ_L = (BC + 1) & 0xff; WZ_H = A; break;                                                 /* LD (BC),A        */
1607         case 0x03: BC++; break;                                                                                         /* INC  BC          */
1608         case 0x04: B = INC(B); break;                                                                                   /* INC  B           */
1609         case 0x05: B = DEC(B); break;                                                                                   /* DEC  B           */
1610         case 0x06: B = FETCH8(); break;                                                                                 /* LD   B,n         */
1611         case 0x07: RLCA(); break;                                                                                       /* RLCA             */
1612         case 0x08: EX_AF(); break;                                                                                      /* EX   AF,AF'      */
1613         case 0x09: ADD16(hl, bc); break;                                                                                /* ADD  HL,BC       */
1614         case 0x0a: A = RM8(BC); WZ = BC+1; break;                                                                       /* LD   A,(BC)      */
1615         case 0x0b: BC--; break;                                                                                         /* DEC  BC          */
1616         case 0x0c: C = INC(C); break;                                                                                   /* INC  C           */
1617         case 0x0d: C = DEC(C); break;                                                                                   /* DEC  C           */
1618         case 0x0e: C = FETCH8(); break;                                                                                 /* LD   C,n         */
1619         case 0x0f: RRCA(); break;                                                                                       /* RRCA             */
1620         case 0x10: B--; JR_COND(B, 0x10); break;                                                                        /* DJNZ o           */
1621         case 0x11: DE = FETCH16(); break;                                                                               /* LD   DE,w        */
1622         case 0x12: WM8(DE, A); WZ_L = (DE + 1) & 0xff; WZ_H = A; break;                                                 /* LD (DE),A        */
1623         case 0x13: DE++; break;                                                                                         /* INC  DE          */
1624         case 0x14: D = INC(D); break;                                                                                   /* INC  D           */
1625         case 0x15: D = DEC(D); break;                                                                                   /* DEC  D           */
1626         case 0x16: D = FETCH8(); break;                                                                                 /* LD   D,n         */
1627         case 0x17: RLA(); break;                                                                                        /* RLA              */
1628         case 0x18: JR(); break;                                                                                         /* JR   o           */
1629         case 0x19: ADD16(hl, de); break;                                                                                /* ADD  HL,DE       */
1630         case 0x1a: A = RM8(DE); WZ = DE + 1; break;                                                                     /* LD   A,(DE)      */
1631         case 0x1b: DE--; break;                                                                                         /* DEC  DE          */
1632         case 0x1c: E = INC(E); break;                                                                                   /* INC  E           */
1633         case 0x1d: E = DEC(E); break;                                                                                   /* DEC  E           */
1634         case 0x1e: E = FETCH8(); break;                                                                                 /* LD   E,n         */
1635         case 0x1f: RRA(); break;                                                                                        /* RRA              */
1636         case 0x20: JR_COND(!(F & ZF), 0x20); break;                                                                     /* JR   NZ,o        */
1637         case 0x21: HL = FETCH16(); break;                                                                               /* LD   HL,w        */
1638         case 0x22: ea = FETCH16(); WM16(ea, &hl); WZ = ea + 1; break;                                                   /* LD   (w),HL      */
1639         case 0x23: HL++; break;                                                                                         /* INC  HL          */
1640         case 0x24: H = INC(H); break;                                                                                   /* INC  H           */
1641         case 0x25: H = DEC(H); break;                                                                                   /* DEC  H           */
1642         case 0x26: H = FETCH8(); break;                                                                                 /* LD   H,n         */
1643         case 0x27: DAA(); break;                                                                                        /* DAA              */
1644         case 0x28: JR_COND(F & ZF, 0x28); break;                                                                        /* JR   Z,o         */
1645         case 0x29: ADD16(hl, hl); break;                                                                                /* ADD  HL,HL       */
1646         case 0x2a: ea = FETCH16(); RM16(ea, &hl); WZ = ea + 1; break;                                                   /* LD   HL,(w)      */
1647         case 0x2b: HL--; break;                                                                                         /* DEC  HL          */
1648         case 0x2c: L = INC(L); break;                                                                                   /* INC  L           */
1649         case 0x2d: L = DEC(L); break;                                                                                   /* DEC  L           */
1650         case 0x2e: L = FETCH8(); break;                                                                                 /* LD   L,n         */
1651         case 0x2f: A ^= 0xff; F = (F & (SF | ZF | PF | CF)) | HF | NF | (A & (YF | XF)); break;                         /* CPL              */
1652         case 0x30: JR_COND(!(F & CF), 0x30); break;                                                                     /* JR   NC,o        */
1653         case 0x31: SP = FETCH16(); break;                                                                               /* LD   SP,w        */
1654         case 0x32: ea = FETCH16(); WM8(ea, A); WZ_L = (ea + 1) & 0xff; WZ_H = A; break;                                 /* LD   (w),A       */
1655         case 0x33: SP++; break;                                                                                         /* INC  SP          */
1656         case 0x34: WM8(HL, INC(RM8(HL))); break;                                                                        /* INC  (HL)        */
1657         case 0x35: WM8(HL, DEC(RM8(HL))); break;                                                                        /* DEC  (HL)        */
1658         case 0x36: WM8(HL, FETCH8()); break;                                                                            /* LD   (HL),n      */
1659         case 0x37: F = (F & (SF | ZF | YF | XF | PF)) | CF | (A & (YF | XF)); break;                                    /* SCF              */
1660         case 0x38: JR_COND(F & CF, 0x38); break;                                                                        /* JR   C,o         */
1661         case 0x39: ADD16(hl, sp); break;                                                                                /* ADD  HL,SP       */
1662         case 0x3a: ea = FETCH16(); A = RM8(ea); WZ = ea + 1; break;                                                     /* LD   A,(w)       */
1663         case 0x3b: SP--; break;                                                                                         /* DEC  SP          */
1664         case 0x3c: A = INC(A); break;                                                                                   /* INC  A           */
1665         case 0x3d: A = DEC(A); break;                                                                                   /* DEC  A           */
1666         case 0x3e: A = FETCH8(); break;                                                                                 /* LD   A,n         */
1667         case 0x3f: F = ((F & (SF | ZF | YF | XF | PF | CF)) | ((F & CF) << 4) | (A & (YF | XF))) ^ CF; break;           /* CCF              */
1668         case 0x40: break;                                                                                               /* LD   B,B         */
1669         case 0x41: B = C; break;                                                                                        /* LD   B,C         */
1670         case 0x42: B = D; break;                                                                                        /* LD   B,D         */
1671         case 0x43: B = E; break;                                                                                        /* LD   B,E         */
1672         case 0x44: B = H; break;                                                                                        /* LD   B,H         */
1673         case 0x45: B = L; break;                                                                                        /* LD   B,L         */
1674         case 0x46: B = RM8(HL); break;                                                                                  /* LD   B,(HL)      */
1675         case 0x47: B = A; break;                                                                                        /* LD   B,A         */
1676         case 0x48: C = B; break;                                                                                        /* LD   C,B         */
1677         case 0x49: break;                                                                                               /* LD   C,C         */
1678         case 0x4a: C = D; break;                                                                                        /* LD   C,D         */
1679         case 0x4b: C = E; break;                                                                                        /* LD   C,E         */
1680         case 0x4c: C = H; break;                                                                                        /* LD   C,H         */
1681         case 0x4d: C = L; break;                                                                                        /* LD   C,L         */
1682         case 0x4e: C = RM8(HL); break;                                                                                  /* LD   C,(HL)      */
1683         case 0x4f: C = A; break;                                                                                        /* LD   C,A         */
1684         case 0x50: D = B; break;                                                                                        /* LD   D,B         */
1685         case 0x51: D = C; break;                                                                                        /* LD   D,C         */
1686         case 0x52: break;                                                                                               /* LD   D,D         */
1687         case 0x53: D = E; break;                                                                                        /* LD   D,E         */
1688         case 0x54: D = H; break;                                                                                        /* LD   D,H         */
1689         case 0x55: D = L; break;                                                                                        /* LD   D,L         */
1690         case 0x56: D = RM8(HL); break;                                                                                  /* LD   D,(HL)      */
1691         case 0x57: D = A; break;                                                                                        /* LD   D,A         */
1692         case 0x58: E = B; break;                                                                                        /* LD   E,B         */
1693         case 0x59: E = C; break;                                                                                        /* LD   E,C         */
1694         case 0x5a: E = D; break;                                                                                        /* LD   E,D         */
1695         case 0x5b: break;                                                                                               /* LD   E,E         */
1696         case 0x5c: E = H; break;                                                                                        /* LD   E,H         */
1697         case 0x5d: E = L; break;                                                                                        /* LD   E,L         */
1698         case 0x5e: E = RM8(HL); break;                                                                                  /* LD   E,(HL)      */
1699         case 0x5f: E = A; break;                                                                                        /* LD   E,A         */
1700         case 0x60: H = B; break;                                                                                        /* LD   H,B         */
1701         case 0x61: H = C; break;                                                                                        /* LD   H,C         */
1702         case 0x62: H = D; break;                                                                                        /* LD   H,D         */
1703         case 0x63: H = E; break;                                                                                        /* LD   H,E         */
1704         case 0x64: break;                                                                                               /* LD   H,H         */
1705         case 0x65: H = L; break;                                                                                        /* LD   H,L         */
1706         case 0x66: H = RM8(HL); break;                                                                                  /* LD   H,(HL)      */
1707         case 0x67: H = A; break;                                                                                        /* LD   H,A         */
1708         case 0x68: L = B; break;                                                                                        /* LD   L,B         */
1709         case 0x69: L = C; break;                                                                                        /* LD   L,C         */
1710         case 0x6a: L = D; break;                                                                                        /* LD   L,D         */
1711         case 0x6b: L = E; break;                                                                                        /* LD   L,E         */
1712         case 0x6c: L = H; break;                                                                                        /* LD   L,H         */
1713         case 0x6d: break;                                                                                               /* LD   L,L         */
1714         case 0x6e: L = RM8(HL); break;                                                                                  /* LD   L,(HL)      */
1715         case 0x6f: L = A; break;                                                                                        /* LD   L,A         */
1716         case 0x70: WM8(HL, B); break;                                                                                   /* LD   (HL),B      */
1717         case 0x71: WM8(HL, C); break;                                                                                   /* LD   (HL),C      */
1718         case 0x72: WM8(HL, D); break;                                                                                   /* LD   (HL),D      */
1719         case 0x73: WM8(HL, E); break;                                                                                   /* LD   (HL),E      */
1720         case 0x74: WM8(HL, H); break;                                                                                   /* LD   (HL),H      */
1721         case 0x75: WM8(HL, L); break;                                                                                   /* LD   (HL),L      */
1722         case 0x76: ENTER_HALT(); break;                                                                                 /* halt             */
1723         case 0x77: WM8(HL, A); break;                                                                                   /* LD   (HL),A      */
1724         case 0x78: A = B; break;                                                                                        /* LD   A,B         */
1725         case 0x79: A = C; break;                                                                                        /* LD   A,C         */
1726         case 0x7a: A = D; break;                                                                                        /* LD   A,D         */
1727         case 0x7b: A = E; break;                                                                                        /* LD   A,E         */
1728         case 0x7c: A = H; break;                                                                                        /* LD   A,H         */
1729         case 0x7d: A = L; break;                                                                                        /* LD   A,L         */
1730         case 0x7e: A = RM8(HL); break;                                                                                  /* LD   A,(HL)      */
1731         case 0x7f: break;                                                                                               /* LD   A,A         */
1732         case 0x80: ADD(B); break;                                                                                       /* ADD  A,B         */
1733         case 0x81: ADD(C); break;                                                                                       /* ADD  A,C         */
1734         case 0x82: ADD(D); break;                                                                                       /* ADD  A,D         */
1735         case 0x83: ADD(E); break;                                                                                       /* ADD  A,E         */
1736         case 0x84: ADD(H); break;                                                                                       /* ADD  A,H         */
1737         case 0x85: ADD(L); break;                                                                                       /* ADD  A,L         */
1738         case 0x86: ADD(RM8(HL)); break;                                                                                 /* ADD  A,(HL)      */
1739         case 0x87: ADD(A); break;                                                                                       /* ADD  A,A         */
1740         case 0x88: ADC(B); break;                                                                                       /* ADC  A,B         */
1741         case 0x89: ADC(C); break;                                                                                       /* ADC  A,C         */
1742         case 0x8a: ADC(D); break;                                                                                       /* ADC  A,D         */
1743         case 0x8b: ADC(E); break;                                                                                       /* ADC  A,E         */
1744         case 0x8c: ADC(H); break;                                                                                       /* ADC  A,H         */
1745         case 0x8d: ADC(L); break;                                                                                       /* ADC  A,L         */
1746         case 0x8e: ADC(RM8(HL)); break;                                                                                 /* ADC  A,(HL)      */
1747         case 0x8f: ADC(A); break;                                                                                       /* ADC  A,A         */
1748         case 0x90: SUB(B); break;                                                                                       /* SUB  B           */
1749         case 0x91: SUB(C); break;                                                                                       /* SUB  C           */
1750         case 0x92: SUB(D); break;                                                                                       /* SUB  D           */
1751         case 0x93: SUB(E); break;                                                                                       /* SUB  E           */
1752         case 0x94: SUB(H); break;                                                                                       /* SUB  H           */
1753         case 0x95: SUB(L); break;                                                                                       /* SUB  L           */
1754         case 0x96: SUB(RM8(HL)); break;                                                                                 /* SUB  (HL)        */
1755         case 0x97: SUB(A); break;                                                                                       /* SUB  A           */
1756         case 0x98: SBC(B); break;                                                                                       /* SBC  A,B         */
1757         case 0x99: SBC(C); break;                                                                                       /* SBC  A,C         */
1758         case 0x9a: SBC(D); break;                                                                                       /* SBC  A,D         */
1759         case 0x9b: SBC(E); break;                                                                                       /* SBC  A,E         */
1760         case 0x9c: SBC(H); break;                                                                                       /* SBC  A,H         */
1761         case 0x9d: SBC(L); break;                                                                                       /* SBC  A,L         */
1762         case 0x9e: SBC(RM8(HL)); break;                                                                                 /* SBC  A,(HL)      */
1763         case 0x9f: SBC(A); break;                                                                                       /* SBC  A,A         */
1764         case 0xa0: AND(B); break;                                                                                       /* AND  B           */
1765         case 0xa1: AND(C); break;                                                                                       /* AND  C           */
1766         case 0xa2: AND(D); break;                                                                                       /* AND  D           */
1767         case 0xa3: AND(E); break;                                                                                       /* AND  E           */
1768         case 0xa4: AND(H); break;                                                                                       /* AND  H           */
1769         case 0xa5: AND(L); break;                                                                                       /* AND  L           */
1770         case 0xa6: AND(RM8(HL)); break;                                                                                 /* AND  (HL)        */
1771         case 0xa7: AND(A); break;                                                                                       /* AND  A           */
1772         case 0xa8: XOR(B); break;                                                                                       /* XOR  B           */
1773         case 0xa9: XOR(C); break;                                                                                       /* XOR  C           */
1774         case 0xaa: XOR(D); break;                                                                                       /* XOR  D           */
1775         case 0xab: XOR(E); break;                                                                                       /* XOR  E           */
1776         case 0xac: XOR(H); break;                                                                                       /* XOR  H           */
1777         case 0xad: XOR(L); break;                                                                                       /* XOR  L           */
1778         case 0xae: XOR(RM8(HL)); break;                                                                                 /* XOR  (HL)        */
1779         case 0xaf: XOR(A); break;                                                                                       /* XOR  A           */
1780         case 0xb0: OR(B); break;                                                                                        /* OR   B           */
1781         case 0xb1: OR(C); break;                                                                                        /* OR   C           */
1782         case 0xb2: OR(D); break;                                                                                        /* OR   D           */
1783         case 0xb3: OR(E); break;                                                                                        /* OR   E           */
1784         case 0xb4: OR(H); break;                                                                                        /* OR   H           */
1785         case 0xb5: OR(L); break;                                                                                        /* OR   L           */
1786         case 0xb6: OR(RM8(HL)); break;                                                                                  /* OR   (HL)        */
1787         case 0xb7: OR(A); break;                                                                                        /* OR   A           */
1788         case 0xb8: CP(B); break;                                                                                        /* CP   B           */
1789         case 0xb9: CP(C); break;                                                                                        /* CP   C           */
1790         case 0xba: CP(D); break;                                                                                        /* CP   D           */
1791         case 0xbb: CP(E); break;                                                                                        /* CP   E           */
1792         case 0xbc: CP(H); break;                                                                                        /* CP   H           */
1793         case 0xbd: CP(L); break;                                                                                        /* CP   L           */
1794         case 0xbe: CP(RM8(HL)); break;                                                                                  /* CP   (HL)        */
1795         case 0xbf: CP(A); break;                                                                                        /* CP   A           */
1796         case 0xc0: RET_COND(!(F & ZF), 0xc0); break;                                                                    /* RET  NZ          */
1797         case 0xc1: POP(bc); break;                                                                                      /* POP  BC          */
1798         case 0xc2: JP_COND(!(F & ZF)); break;                                                                           /* JP   NZ,a        */
1799         case 0xc3: JP(); break;                                                                                         /* JP   a           */
1800         case 0xc4: CALL_COND(!(F & ZF), 0xc4); break;                                                                   /* CALL NZ,a        */
1801         case 0xc5: PUSH(bc); break;                                                                                     /* PUSH BC          */
1802         case 0xc6: ADD(FETCH8()); break;                                                                                /* ADD  A,n         */
1803         case 0xc7: RST(0x00); break;                                                                                    /* RST  0           */
1804         case 0xc8: RET_COND(F & ZF, 0xc8); break;                                                                       /* RET  Z           */
1805 //#ifdef Z80_PSEUDO_BIOS
1806         case 0xc9:
1807                 if(has_pseudo_bios) {
1808                         if(d_bios != NULL) {
1809                                 d_bios->bios_ret_z80(prevpc, &af, &bc, &de, &hl, &ix, &iy, &iff1);
1810                         }
1811                 }
1812                 POP(pc); WZ = PCD; break;                                                                               /* RET              */
1813 //#else
1814 //      case 0xc9: POP(pc); WZ = PCD; break;                                                                            /* RET              */
1815 //#endif
1816         case 0xca: JP_COND(F & ZF); break;                                                                              /* JP   Z,a         */
1817         case 0xcb: OP_CB(FETCHOP()); break;                                                                             /* **** CB xx       */
1818         case 0xcc: CALL_COND(F & ZF, 0xcc); break;                                                                      /* CALL Z,a         */
1819         case 0xcd: CALL(); break;                                                                                       /* CALL a           */
1820         case 0xce: ADC(FETCH8()); break;                                                                                /* ADC  A,n         */
1821         case 0xcf: RST(0x08); break;                                                                                    /* RST  1           */
1822         case 0xd0: RET_COND(!(F & CF), 0xd0); break;                                                                    /* RET  NC          */
1823         case 0xd1: POP(de); break;                                                                                      /* POP  DE          */
1824         case 0xd2: JP_COND(!(F & CF)); break;                                                                           /* JP   NC,a        */
1825         case 0xd3: {unsigned n = FETCH8() | (A << 8); OUT8(n, A); WZ_L = ((n & 0xff) + 1) & 0xff; WZ_H = A;} break;     /* OUT  (n),A       */
1826         case 0xd4: CALL_COND(!(F & CF), 0xd4); break;                                                                   /* CALL NC,a        */
1827         case 0xd5: PUSH(de); break;                                                                                     /* PUSH DE          */
1828         case 0xd6: SUB(FETCH8()); break;                                                                                /* SUB  n           */
1829         case 0xd7: RST(0x10); break;                                                                                    /* RST  2           */
1830         case 0xd8: RET_COND(F & CF, 0xd8); break;                                                                       /* RET  C           */
1831         case 0xd9: EXX(); break;                                                                                        /* EXX              */
1832         case 0xda: JP_COND(F & CF); break;                                                                              /* JP   C,a         */
1833         case 0xdb: {unsigned n = FETCH8() | (A << 8); A = IN8(n); WZ = n + 1;} break;                                   /* IN   A,(n)       */
1834         case 0xdc: CALL_COND(F & CF, 0xdc); break;                                                                      /* CALL C,a         */
1835         case 0xdd: OP_DD(FETCHOP()); break;                                                                             /* **** DD xx       */
1836         case 0xde: SBC(FETCH8()); break;                                                                                /* SBC  A,n         */
1837         case 0xdf: RST(0x18); break;                                                                                    /* RST  3           */
1838         case 0xe0: RET_COND(!(F & PF), 0xe0); break;                                                                    /* RET  PO          */
1839         case 0xe1: POP(hl); break;                                                                                      /* POP  HL          */
1840         case 0xe2: JP_COND(!(F & PF)); break;                                                                           /* JP   PO,a        */
1841         case 0xe3: EXSP(hl); break;                                                                                     /* EX   HL,(SP)     */
1842         case 0xe4: CALL_COND(!(F & PF), 0xe4); break;                                                                   /* CALL PO,a        */
1843         case 0xe5: PUSH(hl); break;                                                                                     /* PUSH HL          */
1844         case 0xe6: AND(FETCH8()); break;                                                                                /* AND  n           */
1845         case 0xe7: RST(0x20); break;                                                                                    /* RST  4           */
1846         case 0xe8: RET_COND(F & PF, 0xe8); break;                                                                       /* RET  PE          */
1847         case 0xe9: PC = HL; break;                                                                                      /* JP   (HL)        */
1848         case 0xea: JP_COND(F & PF); break;                                                                              /* JP   PE,a        */
1849         case 0xeb: EX_DE_HL(); break;                                                                                   /* EX   DE,HL       */
1850         case 0xec: CALL_COND(F & PF, 0xec); break;                                                                      /* CALL PE,a        */
1851         case 0xed: OP_ED(FETCHOP()); break;                                                                             /* **** ED xx       */
1852         case 0xee: XOR(FETCH8()); break;                                                                                /* XOR  n           */
1853         case 0xef: RST(0x28); break;                                                                                    /* RST  5           */
1854         case 0xf0: RET_COND(!(F & SF), 0xf0); break;                                                                    /* RET  P           */
1855         case 0xf1: POP(af); break;                                                                                      /* POP  AF          */
1856         case 0xf2: JP_COND(!(F & SF)); break;                                                                           /* JP   P,a         */
1857         case 0xf3: iff1 = iff2 = 0; break;                                                                              /* DI               */
1858         case 0xf4: CALL_COND(!(F & SF), 0xf4); break;                                                                   /* CALL P,a         */
1859         case 0xf5: PUSH(af); break;                                                                                     /* PUSH AF          */
1860         case 0xf6: OR(FETCH8()); break;                                                                                 /* OR   n           */
1861         case 0xf7: RST(0x30); break;                                                                                    /* RST  6           */
1862         case 0xf8: RET_COND(F & SF, 0xf8); break;                                                                       /* RET  M           */
1863         case 0xf9: SP = HL; break;                                                                                      /* LD   SP,HL       */
1864         case 0xfa: JP_COND(F & SF); break;                                                                              /* JP   M,a         */
1865         case 0xfb: EI(); break;                                                                                         /* EI               */
1866         case 0xfc: CALL_COND(F & SF, 0xfc); break;                                                                      /* CALL M,a         */
1867         case 0xfd: OP_FD(FETCHOP()); break;                                                                             /* **** FD xx       */
1868         case 0xfe: CP(FETCH8()); break;                                                                                 /* CP   n           */
1869         case 0xff: RST(0x38); break;                                                                                    /* RST  7           */
1870 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
1871         default: __assume(0);
1872 #endif
1873         }
1874 }
1875
1876 // main
1877
1878 void Z80_BASE::initialize()
1879 {
1880         DEVICE::initialize();
1881         if(!flags_initialized) {
1882                 uint8_t *padd = SZHVC_add;
1883                 uint8_t *padc = SZHVC_add + 256 * 256;
1884                 uint8_t *psub = SZHVC_sub;
1885                 uint8_t *psbc = SZHVC_sub + 256 * 256;
1886                 
1887                 for(int oldval = 0; oldval < 256; oldval++) {
1888                         for(int newval = 0; newval < 256; newval++) {
1889                                 /* add or adc w/o carry set */
1890                                 int val = newval - oldval;
1891                                 *padd = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
1892                                 *padd |= (newval & (YF | XF));  /* undocumented flag bits 5+3 */
1893                                 if((newval & 0x0f) < (oldval & 0x0f)) *padd |= HF;
1894                                 if(newval < oldval) *padd |= CF;
1895                                 if((val ^ oldval ^ 0x80) & (val ^ newval) & 0x80) *padd |= VF;
1896                                 padd++;
1897                                 
1898                                 /* adc with carry set */
1899                                 val = newval - oldval - 1;
1900                                 *padc = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
1901                                 *padc |= (newval & (YF | XF));  /* undocumented flag bits 5+3 */
1902                                 if((newval & 0x0f) <= (oldval & 0x0f)) *padc |= HF;
1903                                 if(newval <= oldval) *padc |= CF;
1904                                 if((val ^ oldval ^ 0x80) & (val ^ newval) & 0x80) *padc |= VF;
1905                                 padc++;
1906                                 
1907                                 /* cp, sub or sbc w/o carry set */
1908                                 val = oldval - newval;
1909                                 *psub = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
1910                                 *psub |= (newval & (YF | XF));  /* undocumented flag bits 5+3 */
1911                                 if((newval & 0x0f) > (oldval & 0x0f)) *psub |= HF;
1912                                 if(newval > oldval) *psub |= CF;
1913                                 if((val ^ oldval) & (oldval ^ newval) & 0x80) *psub |= VF;
1914                                 psub++;
1915                                 
1916                                 /* sbc with carry set */
1917                                 val = oldval - newval - 1;
1918                                 *psbc = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
1919                                 *psbc |= (newval & (YF | XF));  /* undocumented flag bits 5+3 */
1920                                 if((newval & 0x0f) >= (oldval & 0x0f)) *psbc |= HF;
1921                                 if(newval >= oldval) *psbc |= CF;
1922                                 if((val ^ oldval) & (oldval ^ newval) & 0x80) *psbc |= VF;
1923                                 psbc++;
1924                         }
1925                 }
1926                 for(int i = 0; i < 256; i++) {
1927                         int p = 0;
1928                         if(i & 0x01) ++p;
1929                         if(i & 0x02) ++p;
1930                         if(i & 0x04) ++p;
1931                         if(i & 0x08) ++p;
1932                         if(i & 0x10) ++p;
1933                         if(i & 0x20) ++p;
1934                         if(i & 0x40) ++p;
1935                         if(i & 0x80) ++p;
1936                         SZ[i] = i ? i & SF : ZF;
1937                         SZ[i] |= (i & (YF | XF));       /* undocumented flag bits 5+3 */
1938                         SZ_BIT[i] = i ? i & SF : ZF | PF;
1939                         SZ_BIT[i] |= (i & (YF | XF));   /* undocumented flag bits 5+3 */
1940                         SZP[i] = SZ[i] | ((p & 1) ? 0 : PF);
1941                         SZHV_inc[i] = SZ[i];
1942                         if(i == 0x80) SZHV_inc[i] |= VF;
1943                         if((i & 0x0f) == 0x00) SZHV_inc[i] |= HF;
1944                         SZHV_dec[i] = SZ[i] | NF;
1945                         if(i == 0x7f) SZHV_dec[i] |= VF;
1946                         if((i & 0x0f) == 0x0f) SZHV_dec[i] |= HF;
1947                 }
1948                 flags_initialized = true;
1949         }
1950         is_primary = is_primary_cpu(this);
1951
1952         // Collecting stateus.
1953         cycles_tmp_count = 0;
1954         extra_tmp_count = 0;
1955         insns_count = 0;
1956         frames_count = 0;
1957         nmi_count = 0;
1958         irq_count = 0;
1959         nsc800_int_count = 0;
1960         nsc800_rsta_count = 0;
1961         nsc800_rsta_count = 0;
1962         nsc800_rsta_count = 0;
1963         register_frame_event(this);
1964
1965 }
1966
1967 void Z80_BASE::event_frame()
1968 {
1969         if(frames_count < 0) {
1970                 cycles_tmp_count = total_icount;
1971                 extra_tmp_count = 0;
1972                 insns_count = 0;
1973                 frames_count = 0;
1974                 nmi_count = 0;
1975                 irq_count = 0;
1976                 nsc800_int_count = 0;
1977                 nsc800_rsta_count = 0;
1978                 nsc800_rstb_count = 0;
1979                 nsc800_rstc_count = 0;
1980         } else if(frames_count >= 16) {
1981                 uint64_t _icount = total_icount - cycles_tmp_count;
1982                 if(config.print_statistics) {
1983                         if(has_nsc800) {
1984                                 out_debug_log(_T("INFO: 16 frames done.\nINFO: CLOCKS = %ld INSNS = %d EXTRA_ICOUNT = %d \nINFO: NMI# = %d IRQ# = %d NSC800_INT# = %d RSTA# = %d RSTB# = %d RSTC# = %d"),
1985                                                           _icount, insns_count, extra_tmp_count, nmi_count, irq_count,
1986                                                           nsc800_int_count, nsc800_rsta_count, nsc800_rstb_count, nsc800_rstc_count);
1987                         } else {
1988                                 out_debug_log(_T("INFO: 16 frames done.\nINFO: CLOCKS = %ld INSNS = %d EXTRA_ICOUNT = %d \nINFO: NMI# = %d IRQ# = %d"), _icount, insns_count, extra_tmp_count, nmi_count, irq_count);
1989                         }
1990                 }
1991                 cycles_tmp_count = total_icount;
1992                 insns_count = 0;
1993                 extra_tmp_count = 0;
1994                 frames_count = 0;
1995                 nmi_count = 0;
1996                 irq_count = 0;
1997                 nsc800_int_count = 0;
1998                 nsc800_rsta_count = 0;
1999                 nsc800_rstb_count = 0;
2000                 nsc800_rstc_count = 0;
2001         } else {
2002                 frames_count++;
2003         }
2004
2005 }
2006 void Z80_BASE::reset()
2007 {
2008         //PCD = CPU_START_ADDR;
2009         PCD = 0;
2010         SPD = 0;
2011         AFD = BCD = DED = HLD = 0;
2012         IXD = IYD = 0xffff;     /* IX and IY are FFFF after a reset! */
2013         F = ZF;                 /* Zero flag is set */
2014         I = R = R2 = 0;
2015         WZD = PCD;
2016         af2.d = bc2.d = de2.d = hl2.d = 0;
2017         ea = 0;
2018         
2019         im = iff1 = iff2 = icr = 0;
2020         after_halt = false;
2021         after_ei = after_ldair = false;
2022         intr_req_bit = intr_pend_bit = 0;
2023         
2024         icount = extra_icount = busreq_icount = 0;
2025 }
2026
2027 void __FASTCALL Z80_BASE::write_signal(int id, uint32_t data, uint32_t mask)
2028 {
2029         if(id == SIG_CPU_IRQ) {
2030                 intr_req_bit = (intr_req_bit & ~mask) | (data & mask);
2031                 // always pending (temporary)
2032                 intr_pend_bit = (intr_pend_bit & ~mask) | (0xffffffff & mask);
2033                 irq_count++;
2034         } else if(id == SIG_CPU_NMI) {
2035                 intr_req_bit = (data & mask) ? (intr_req_bit | NMI_REQ_BIT) : (intr_req_bit & ~NMI_REQ_BIT);
2036                 nmi_count++;
2037         } else if(id == SIG_CPU_BUSREQ) {
2038                 busreq = ((data & mask) != 0);
2039                 write_signals(&outputs_busack, busreq ? 0xffffffff : 0);
2040         } else if(has_nsc800) {
2041 //#ifdef HAS_NSC800
2042                 if(id == SIG_NSC800_INT) {
2043                         intr_req_bit = (data & mask) ? (intr_req_bit | 1) : (intr_req_bit & ~1);
2044                         nsc800_int_count++;
2045                 } else if(id == SIG_NSC800_RSTA) {
2046                         intr_req_bit = (data & mask) ? (intr_req_bit | 8) : (intr_req_bit & ~8);
2047                         nsc800_rsta_count++;
2048                 } else if(id == SIG_NSC800_RSTB) {
2049                         intr_req_bit = (data & mask) ? (intr_req_bit | 4) : (intr_req_bit & ~4);
2050                         nsc800_rstb_count++;
2051                 } else if(id == SIG_NSC800_RSTC) {
2052                         intr_req_bit = (data & mask) ? (intr_req_bit | 2) : (intr_req_bit & ~2);
2053                         nsc800_rstc_count++;
2054                 }
2055         }
2056 //#endif
2057 }
2058
2059 uint32_t __FASTCALL Z80_BASE::read_signal(int id)
2060 {
2061         if(id == SIG_CPU_IRQ) {
2062                 return intr_req_bit;
2063         }
2064         return 0;
2065 }
2066
2067
2068 int Z80_BASE::run(int clock)
2069 {
2070         if(extra_icount > 0) {
2071                 extra_tmp_count += extra_icount;
2072         }
2073         if(clock == -1) {
2074                 // this is primary cpu
2075                 if(busreq) {
2076                         // run dma once
2077                         //#ifdef SINGLE_MODE_DMA
2078                                 if(d_dma) {
2079                                         d_dma->do_dma();
2080                                 }
2081                         //#endif
2082                         // don't run cpu!
2083                         int passed_icount = max(1, extra_icount);
2084                         // this is main cpu, icount is not used
2085                         /*icount = */extra_icount = 0;
2086                         return passed_icount;
2087                 } else {
2088                         // run only one opcode
2089                         if((extra_icount += busreq_icount) > 0) {
2090                                 if(is_primary) {
2091                                         update_extra_event(extra_icount);
2092                                 }
2093                                 total_icount += extra_icount;
2094                         }
2095                         icount = -extra_icount;
2096                         extra_icount = busreq_icount = 0;
2097                         run_one_opecode();
2098                         insns_count++;
2099                         return -icount;
2100                 }
2101         } else {
2102                 icount += clock;
2103                 int first_icount = icount;
2104                 icount -= extra_icount;
2105                 extra_icount = 0;
2106                 
2107                 if(busreq) {
2108                         // run dma once
2109                         // run dma once
2110                         //#ifdef USE_DEBUGGER
2111                                 debugger_hook();
2112                         //#endif
2113                         //#ifdef SINGLE_MODE_DMA
2114                                 if(d_dma) {
2115                                         d_dma->do_dma();
2116                                 }
2117                         //#endif
2118                 } else {
2119                         // run cpu while given clocks
2120                         while(icount > 0 && !busreq) {
2121                                 run_one_opecode();
2122                                 insns_count++;
2123                         }
2124                 }
2125                 // if busreq is raised, spin cpu while remained clock
2126                 if(icount > 0 && busreq) {
2127                         icount = 0;
2128                 }
2129                 return first_icount - icount;
2130         }
2131 }
2132
2133 void __FASTCALL Z80_BASE::debugger_hook(void)
2134 {
2135 }
2136
2137 void __FASTCALL Z80_BASE::run_one_opecode()
2138 {
2139         // rune one opecode
2140         after_ei = after_ldair = false;
2141         OP(FETCHOP());
2142 #if HAS_LDAIR_QUIRK
2143         if(after_ldair) F &= ~PF;       // reset parity flag after LD A,I or LD A,R
2144 #endif
2145         // ei: run next opecode
2146         if(after_ei) {
2147                 after_ldair = false;
2148                 OP(FETCHOP());
2149 #if HAS_LDAIR_QUIRK
2150                 if(after_ldair) F &= ~PF;       // reset parity flag after LD A,I or LD A,R
2151 #endif
2152                 if(d_pic != NULL) d_pic->notify_intr_ei();
2153         }
2154         
2155         // check interrupt
2156         if(intr_req_bit) {
2157                 if(intr_req_bit & NMI_REQ_BIT) {
2158                         // nmi
2159                         LEAVE_HALT();
2160                         PUSH(pc);
2161                         PCD = WZD = 0x0066;
2162                         icount -= 11;
2163                         iff1 = 0;
2164                         intr_req_bit &= ~NMI_REQ_BIT;
2165 //#ifdef HAS_NSC800
2166                 } else if(has_nsc800) {
2167                         if((intr_req_bit & 1) && (icr & 1)) {
2168                                 // INTR
2169                                 LEAVE_HALT();
2170                                 PUSH(pc);
2171                                 if(d_pic != NULL) { // OK?
2172                                         PCD = WZ = d_pic->get_intr_ack() & 0xffff;
2173                                 } else {
2174                                         PCD = WZ = (PCD & 0xff00) | 0xcd;
2175                                 }
2176                                 icount -= cc_op[0xcd] + cc_ex[0xff];
2177                                 iff1 = iff2 = 0;
2178                                 intr_req_bit &= ~1;
2179                         } else if((intr_req_bit & 8) && (icr & 8)) {
2180                                 // RSTA
2181                                 LEAVE_HALT();
2182                                 PUSH(pc);
2183                                 PCD = WZ = 0x003c;
2184                                 icount -= cc_op[0xff] + cc_ex[0xff];
2185                                 iff1 = iff2 = 0;
2186                                 intr_req_bit &= ~8;
2187                         } else if((intr_req_bit & 4) && (icr & 4)) {
2188                         // RSTB
2189                                 LEAVE_HALT();
2190                                 PUSH(pc);
2191                                 PCD = WZ = 0x0034;
2192                                 icount -= cc_op[0xff] + cc_ex[0xff];
2193                                 iff1 = iff2 = 0;
2194                                 intr_req_bit &= ~4;
2195                         } else if((intr_req_bit & 2) && (icr & 2)) {
2196                                 // RSTC
2197                                 LEAVE_HALT();
2198                                 PUSH(pc);
2199                                 PCD = WZ = 0x002c;
2200                                 icount -= cc_op[0xff] + cc_ex[0xff];
2201                                 iff1 = iff2 = 0;
2202                                 intr_req_bit &= ~2;
2203                         }
2204                 } else { // Normal Z80
2205                         if(iff1) {
2206                                 // interrupt
2207                                 LEAVE_HALT();
2208                                 
2209                                 uint32_t vector = 0xcd; // Default
2210                                 if(d_pic != NULL) vector = d_pic->get_intr_ack();
2211                                 if(im == 0) {
2212                                         // mode 0 (support NOP/JMP/CALL/RST only)
2213                                         switch(vector & 0xff) {
2214                                         case 0x00: break;                               // NOP
2215                                         case 0xc3: PCD = vector >> 8; break;            // JMP
2216                                         case 0xcd: PUSH(pc); PCD = vector >> 8; break;  // CALL
2217                                         case 0xc7: PUSH(pc); PCD = 0x0000; break;       // RST 00H
2218                                         case 0xcf: PUSH(pc); PCD = 0x0008; break;       // RST 08H
2219                                         case 0xd7: PUSH(pc); PCD = 0x0010; break;       // RST 10H
2220                                         case 0xdf: PUSH(pc); PCD = 0x0018; break;       // RST 18H
2221                                         case 0xe7: PUSH(pc); PCD = 0x0020; break;       // RST 20H
2222                                         case 0xef: PUSH(pc); PCD = 0x0028; break;       // RST 28H
2223                                         case 0xf7: PUSH(pc); PCD = 0x0030; break;       // RST 30H
2224                                         case 0xff: PUSH(pc); PCD = 0x0038; break;       // RST 38H
2225                                         }
2226                                         icount -= cc_op[vector & 0xff] + cc_ex[0xff];
2227                                 } else if(im == 1) {
2228                                         // mode 1
2229                                         PUSH(pc);
2230                                         PCD = 0x0038;
2231                                         icount -= cc_op[0xff] + cc_ex[0xff];
2232                                 } else {
2233                                         // mode 2
2234                                         PUSH(pc);
2235                                         RM16((vector & 0xff) | (I << 8), &pc);
2236                                         icount -= cc_op[0xcd] + cc_ex[0xff];
2237                                 }
2238                                 iff1 = iff2 = 0;
2239                                 intr_req_bit = 0;
2240                                 WZ = PCD;
2241                         } else {
2242                                 intr_req_bit &= intr_pend_bit;
2243 //#endif
2244                         }
2245 //#else
2246                 }
2247         }
2248 //#ifdef SINGLE_MODE_DMA
2249         if(d_dma) {
2250                 d_dma->do_dma();
2251         }
2252 //#endif
2253         icount -= extra_icount;
2254         extra_icount = 0;
2255 }
2256
2257 //#ifdef USE_DEBUGGER
2258
2259 bool Z80_BASE::write_debug_reg(const _TCHAR *reg, uint32_t data)
2260 {
2261         if(_tcsicmp(reg, _T("PC")) == 0) {
2262                 PC = data;
2263         } else if(_tcsicmp(reg, _T("SP")) == 0) {
2264                 SP = data;
2265         } else if(_tcsicmp(reg, _T("AF")) == 0) {
2266                 AF = data;
2267         } else if(_tcsicmp(reg, _T("BC")) == 0) {
2268                 BC = data;
2269         } else if(_tcsicmp(reg, _T("DE")) == 0) {
2270                 DE = data;
2271         } else if(_tcsicmp(reg, _T("HL")) == 0) {
2272                 HL = data;
2273         } else if(_tcsicmp(reg, _T("IX")) == 0) {
2274                 IX = data;
2275         } else if(_tcsicmp(reg, _T("IY")) == 0) {
2276                 IY = data;
2277         } else if(_tcsicmp(reg, _T("A")) == 0) {
2278                 A = data;
2279         } else if(_tcsicmp(reg, _T("F")) == 0) {
2280                 F = data;
2281         } else if(_tcsicmp(reg, _T("B")) == 0) {
2282                 B = data;
2283         } else if(_tcsicmp(reg, _T("C")) == 0) {
2284                 C = data;
2285         } else if(_tcsicmp(reg, _T("D")) == 0) {
2286                 D = data;
2287         } else if(_tcsicmp(reg, _T("E")) == 0) {
2288                 E = data;
2289         } else if(_tcsicmp(reg, _T("H")) == 0) {
2290                 H = data;
2291         } else if(_tcsicmp(reg, _T("L")) == 0) {
2292                 L = data;
2293         } else if(_tcsicmp(reg, _T("HX")) == 0 || _tcsicmp(reg, _T("XH")) == 0 || _tcsicmp(reg, _T("IXH")) == 0) {
2294                 HX = data;
2295         } else if(_tcsicmp(reg, _T("LX")) == 0 || _tcsicmp(reg, _T("XL")) == 0 || _tcsicmp(reg, _T("IXL")) == 0) {
2296                 LX = data;
2297         } else if(_tcsicmp(reg, _T("HY")) == 0 || _tcsicmp(reg, _T("YH")) == 0 || _tcsicmp(reg, _T("IYH")) == 0) {
2298                 HY = data;
2299         } else if(_tcsicmp(reg, _T("LX")) == 0 || _tcsicmp(reg, _T("YL")) == 0 || _tcsicmp(reg, _T("IYL")) == 0) {
2300                 LY = data;
2301         } else if(_tcsicmp(reg, _T("I")) == 0) {
2302                 I = data;
2303         } else if(_tcsicmp(reg, _T("R")) == 0) {
2304                 R = data;
2305         } else if(_tcsicmp(reg, _T("AF'")) == 0) {
2306                 AF2 = data;
2307         } else if(_tcsicmp(reg, _T("BC'")) == 0) {
2308                 BC2 = data;
2309         } else if(_tcsicmp(reg, _T("DE'")) == 0) {
2310                 DE2 = data;
2311         } else if(_tcsicmp(reg, _T("HL'")) == 0) {
2312                 HL2 = data;
2313         } else if(_tcsicmp(reg, _T("A'")) == 0) {
2314                 A2 = data;
2315         } else if(_tcsicmp(reg, _T("F'")) == 0) {
2316                 F2 = data;
2317         } else if(_tcsicmp(reg, _T("B'")) == 0) {
2318                 B2 = data;
2319         } else if(_tcsicmp(reg, _T("C'")) == 0) {
2320                 C2 = data;
2321         } else if(_tcsicmp(reg, _T("D'")) == 0) {
2322                 D2 = data;
2323         } else if(_tcsicmp(reg, _T("E'")) == 0) {
2324                 E2 = data;
2325         } else if(_tcsicmp(reg, _T("H'")) == 0) {
2326                 H2 = data;
2327         } else if(_tcsicmp(reg, _T("L'")) == 0) {
2328                 L2 = data;
2329         } else {
2330                 return false;
2331         }
2332         return true;
2333 }
2334
2335 bool Z80_BASE::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
2336 {
2337 /*
2338 F = [--------]  A = 00  BC = 0000  DE = 0000  HL = 0000  IX = 0000  IY = 0000
2339 F'= [--------]  A'= 00  BC'= 0000  DE'= 0000  HL'= 0000  SP = 0000  PC = 0000
2340         I = 00  R = 00 (BC)= 0000 (DE)= 0000 (HL)= 0000 (SP)= 0000  EI:IFF2=0
2341 Total CPU Clocks = 0 (0) Since Scanline = 0/0 (0/0)
2342 */
2343         int wait;
2344         my_stprintf_s(buffer, buffer_len,
2345         _T("F = [%c%c%c%c%c%c%c%c]  A = %02X  BC = %04X  DE = %04X  HL = %04X  IX = %04X  IY = %04X\n")
2346         _T("F'= [%c%c%c%c%c%c%c%c]  A'= %02X  BC'= %04X  DE'= %04X  HL'= %04X  SP = %04X  PC = %04X\n")
2347         _T("        I = %02X  R = %02X (BC)= %04X (DE)= %04X (HL)= %04X (SP)= %04X  %cI:IFF2=%d\n")
2348         _T("Clocks = %llu (%llu) Since Scanline = %d/%d (%d/%d)"),
2349
2350         (F & CF) ? _T('C') : _T('-'), (F & NF) ? _T('N') : _T('-'), (F & PF) ? _T('P') : _T('-'), (F & XF) ? _T('X') : _T('-'),
2351         (F & HF) ? _T('H') : _T('-'), (F & YF) ? _T('Y') : _T('-'), (F & ZF) ? _T('Z') : _T('-'), (F & SF) ? _T('S') : _T('-'),
2352         A, BC, DE, HL, IX, IY,
2353         (F2 & CF) ? _T('C') : _T('-'), (F2 & NF) ? _T('N') : _T('-'), (F2 & PF) ? _T('P') : _T('-'), (F2 & XF) ? _T('X') : _T('-'),
2354         (F2 & HF) ? _T('H') : _T('-'), (F2 & YF) ? _T('Y') : _T('-'), (F2 & ZF) ? _T('Z') : _T('-'), (F2 & SF) ? _T('S') : _T('-'),
2355         A2, BC2, DE2, HL2, SP, PC,
2356         I, R,
2357         d_mem_stored->read_data16w(BC, &wait), d_mem_stored->read_data16w(DE, &wait), d_mem_stored->read_data16w(HL, &wait), d_mem_stored->read_data16w(SP, &wait),
2358         iff1 ? _T('E') : _T('D'), iff2,
2359         total_icount, total_icount - prev_total_icount,
2360         get_passed_clock_since_vline(), get_cur_vline_clocks(), get_cur_vline(), get_lines_per_frame());
2361         prev_total_icount = total_icount;
2362         return true;
2363 }
2364
2365 // disassembler
2366
2367 int Z80_BASE::debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata )
2368 {
2369         return -1;
2370 }
2371
2372
2373 extern "C" {
2374 int z80_dasm_main(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol);
2375 static void dasm_cb(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol);
2376 static void dasm_dd(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol);
2377 static void dasm_ed(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol);
2378 static void dasm_fd(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol);
2379 static void dasm_ddcb(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol);
2380 static void dasm_fdcb(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol);
2381
2382 uint8_t z80_dasm_ops[4];
2383 int z80_dasm_ptr;
2384
2385 inline uint8_t dasm_fetchop()
2386 {
2387         return z80_dasm_ops[z80_dasm_ptr++];
2388 }
2389
2390 inline uint8_t debug_fetch8()
2391 {
2392         return z80_dasm_ops[z80_dasm_ptr++];
2393 }
2394
2395 inline uint16_t debug_fetch16()
2396 {
2397         uint16_t val = z80_dasm_ops[z80_dasm_ptr] | (z80_dasm_ops[z80_dasm_ptr + 1] << 8);
2398         z80_dasm_ptr += 2;
2399         return val;
2400 }
2401
2402 inline int8_t debug_fetch8_rel()
2403 {
2404         return (int8_t)z80_dasm_ops[z80_dasm_ptr++];
2405 }
2406
2407 inline uint16_t debug_fetch8_relpc(uint32_t pc)
2408 {
2409         int8_t res = (int8_t)z80_dasm_ops[z80_dasm_ptr++];
2410         return pc + z80_dasm_ptr + res;
2411 }
2412
2413 int z80_dasm_main(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol)
2414 {
2415         buffer[0] = _T('\0');
2416         z80_dasm_ptr = 0;
2417         uint8_t code = dasm_fetchop();
2418         
2419         switch(code) {
2420         case 0x00: my_stprintf_s(buffer, buffer_len, _T("NOP")); break;
2421         case 0x01: my_stprintf_s(buffer, buffer_len, _T("LD BC, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2422         case 0x02: my_stprintf_s(buffer, buffer_len, _T("LD (BC), A")); break;
2423         case 0x03: my_stprintf_s(buffer, buffer_len, _T("INC BC")); break;
2424         case 0x04: my_stprintf_s(buffer, buffer_len, _T("INC B")); break;
2425         case 0x05: my_stprintf_s(buffer, buffer_len, _T("DEC B")); break;
2426         case 0x06: my_stprintf_s(buffer, buffer_len, _T("LD B, %02x"), debug_fetch8()); break;
2427         case 0x07: my_stprintf_s(buffer, buffer_len, _T("RLCA")); break;
2428         case 0x08: my_stprintf_s(buffer, buffer_len, _T("EX AF, AF'")); break;
2429         case 0x09: my_stprintf_s(buffer, buffer_len, _T("ADD HL, BC")); break;
2430         case 0x0a: my_stprintf_s(buffer, buffer_len, _T("LD A, (BC)")); break;
2431         case 0x0b: my_stprintf_s(buffer, buffer_len, _T("DEC BC")); break;
2432         case 0x0c: my_stprintf_s(buffer, buffer_len, _T("INC C")); break;
2433         case 0x0d: my_stprintf_s(buffer, buffer_len, _T("DEC C")); break;
2434         case 0x0e: my_stprintf_s(buffer, buffer_len, _T("LD C, %02x"), debug_fetch8()); break;
2435         case 0x0f: my_stprintf_s(buffer, buffer_len, _T("RRCA")); break;
2436         case 0x10: my_stprintf_s(buffer, buffer_len, _T("DJNZ %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch8_relpc(pc))); break;
2437         case 0x11: my_stprintf_s(buffer, buffer_len, _T("LD DE, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2438         case 0x12: my_stprintf_s(buffer, buffer_len, _T("LD (DE), A")); break;
2439         case 0x13: my_stprintf_s(buffer, buffer_len, _T("INC DE")); break;
2440         case 0x14: my_stprintf_s(buffer, buffer_len, _T("INC D")); break;
2441         case 0x15: my_stprintf_s(buffer, buffer_len, _T("DEC D")); break;
2442         case 0x16: my_stprintf_s(buffer, buffer_len, _T("LD D, %02x"), debug_fetch8()); break;
2443         case 0x17: my_stprintf_s(buffer, buffer_len, _T("RLA")); break;
2444         case 0x18: my_stprintf_s(buffer, buffer_len, _T("JR %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch8_relpc(pc))); break;
2445         case 0x19: my_stprintf_s(buffer, buffer_len, _T("ADD HL, DE")); break;
2446         case 0x1a: my_stprintf_s(buffer, buffer_len, _T("LD A, (DE)")); break;
2447         case 0x1b: my_stprintf_s(buffer, buffer_len, _T("DEC DE")); break;
2448         case 0x1c: my_stprintf_s(buffer, buffer_len, _T("INC E")); break;
2449         case 0x1d: my_stprintf_s(buffer, buffer_len, _T("DEC E")); break;
2450         case 0x1e: my_stprintf_s(buffer, buffer_len, _T("LD E, %02x"), debug_fetch8()); break;
2451         case 0x1f: my_stprintf_s(buffer, buffer_len, _T("RRA")); break;
2452         case 0x20: my_stprintf_s(buffer, buffer_len, _T("JR NZ, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch8_relpc(pc))); break;
2453         case 0x21: my_stprintf_s(buffer, buffer_len, _T("LD HL, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2454         case 0x22: my_stprintf_s(buffer, buffer_len, _T("LD (%s), HL"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2455         case 0x23: my_stprintf_s(buffer, buffer_len, _T("INC HL")); break;
2456         case 0x24: my_stprintf_s(buffer, buffer_len, _T("INC H")); break;
2457         case 0x25: my_stprintf_s(buffer, buffer_len, _T("DEC H")); break;
2458         case 0x26: my_stprintf_s(buffer, buffer_len, _T("LD H, %02x"), debug_fetch8()); break;
2459         case 0x27: my_stprintf_s(buffer, buffer_len, _T("DAA")); break;
2460         case 0x28: my_stprintf_s(buffer, buffer_len, _T("JR Z, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch8_relpc(pc))); break;
2461         case 0x29: my_stprintf_s(buffer, buffer_len, _T("ADD HL, HL")); break;
2462         case 0x2a: my_stprintf_s(buffer, buffer_len, _T("LD HL, (%s)"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2463         case 0x2b: my_stprintf_s(buffer, buffer_len, _T("DEC HL")); break;
2464         case 0x2c: my_stprintf_s(buffer, buffer_len, _T("INC L")); break;
2465         case 0x2d: my_stprintf_s(buffer, buffer_len, _T("DEC L")); break;
2466         case 0x2e: my_stprintf_s(buffer, buffer_len, _T("LD L, %02x"), debug_fetch8()); break;
2467         case 0x2f: my_stprintf_s(buffer, buffer_len, _T("CPL")); break;
2468         case 0x30: my_stprintf_s(buffer, buffer_len, _T("JR NC, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch8_relpc(pc))); break;
2469         case 0x31: my_stprintf_s(buffer, buffer_len, _T("LD SP, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2470         case 0x32: my_stprintf_s(buffer, buffer_len, _T("LD (%s), A"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2471         case 0x33: my_stprintf_s(buffer, buffer_len, _T("INC SP")); break;
2472         case 0x34: my_stprintf_s(buffer, buffer_len, _T("INC (HL)")); break;
2473         case 0x35: my_stprintf_s(buffer, buffer_len, _T("DEC (HL)")); break;
2474         case 0x36: my_stprintf_s(buffer, buffer_len, _T("LD (HL), %02x"), debug_fetch8()); break;
2475         case 0x37: my_stprintf_s(buffer, buffer_len, _T("SCF")); break;
2476         case 0x38: my_stprintf_s(buffer, buffer_len, _T("JR C, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch8_relpc(pc))); break;
2477         case 0x39: my_stprintf_s(buffer, buffer_len, _T("ADD HL, SP")); break;
2478         case 0x3a: my_stprintf_s(buffer, buffer_len, _T("LD A, (%s)"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2479         case 0x3b: my_stprintf_s(buffer, buffer_len, _T("DEC SP")); break;
2480         case 0x3c: my_stprintf_s(buffer, buffer_len, _T("INC A")); break;
2481         case 0x3d: my_stprintf_s(buffer, buffer_len, _T("DEC A")); break;
2482         case 0x3e: my_stprintf_s(buffer, buffer_len, _T("LD A, %02x"), debug_fetch8()); break;
2483         case 0x3f: my_stprintf_s(buffer, buffer_len, _T("CCF")); break;
2484         case 0x40: my_stprintf_s(buffer, buffer_len, _T("LD B, B")); break;
2485         case 0x41: my_stprintf_s(buffer, buffer_len, _T("LD B, C")); break;
2486         case 0x42: my_stprintf_s(buffer, buffer_len, _T("LD B, D")); break;
2487         case 0x43: my_stprintf_s(buffer, buffer_len, _T("LD B, E")); break;
2488         case 0x44: my_stprintf_s(buffer, buffer_len, _T("LD B, H")); break;
2489         case 0x45: my_stprintf_s(buffer, buffer_len, _T("LD B, L")); break;
2490         case 0x46: my_stprintf_s(buffer, buffer_len, _T("LD B, (HL)")); break;
2491         case 0x47: my_stprintf_s(buffer, buffer_len, _T("LD B, A")); break;
2492         case 0x48: my_stprintf_s(buffer, buffer_len, _T("LD C, B")); break;
2493         case 0x49: my_stprintf_s(buffer, buffer_len, _T("LD C, C")); break;
2494         case 0x4a: my_stprintf_s(buffer, buffer_len, _T("LD C, D")); break;
2495         case 0x4b: my_stprintf_s(buffer, buffer_len, _T("LD C, E")); break;
2496         case 0x4c: my_stprintf_s(buffer, buffer_len, _T("LD C, H")); break;
2497         case 0x4d: my_stprintf_s(buffer, buffer_len, _T("LD C, L")); break;
2498         case 0x4e: my_stprintf_s(buffer, buffer_len, _T("LD C, (HL)")); break;
2499         case 0x4f: my_stprintf_s(buffer, buffer_len, _T("LD C, A")); break;
2500         case 0x50: my_stprintf_s(buffer, buffer_len, _T("LD D, B")); break;
2501         case 0x51: my_stprintf_s(buffer, buffer_len, _T("LD D, C")); break;
2502         case 0x52: my_stprintf_s(buffer, buffer_len, _T("LD D, D")); break;
2503         case 0x53: my_stprintf_s(buffer, buffer_len, _T("LD D, E")); break;
2504         case 0x54: my_stprintf_s(buffer, buffer_len, _T("LD D, H")); break;
2505         case 0x55: my_stprintf_s(buffer, buffer_len, _T("LD D, L")); break;
2506         case 0x56: my_stprintf_s(buffer, buffer_len, _T("LD D, (HL)")); break;
2507         case 0x57: my_stprintf_s(buffer, buffer_len, _T("LD D, A")); break;
2508         case 0x58: my_stprintf_s(buffer, buffer_len, _T("LD E, B")); break;
2509         case 0x59: my_stprintf_s(buffer, buffer_len, _T("LD E, C")); break;
2510         case 0x5a: my_stprintf_s(buffer, buffer_len, _T("LD E, D")); break;
2511         case 0x5b: my_stprintf_s(buffer, buffer_len, _T("LD E, E")); break;
2512         case 0x5c: my_stprintf_s(buffer, buffer_len, _T("LD E, H")); break;
2513         case 0x5d: my_stprintf_s(buffer, buffer_len, _T("LD E, L")); break;
2514         case 0x5e: my_stprintf_s(buffer, buffer_len, _T("LD E, (HL)")); break;
2515         case 0x5f: my_stprintf_s(buffer, buffer_len, _T("LD E, A")); break;
2516         case 0x60: my_stprintf_s(buffer, buffer_len, _T("LD H, B")); break;
2517         case 0x61: my_stprintf_s(buffer, buffer_len, _T("LD H, C")); break;
2518         case 0x62: my_stprintf_s(buffer, buffer_len, _T("LD H, D")); break;
2519         case 0x63: my_stprintf_s(buffer, buffer_len, _T("LD H, E")); break;
2520         case 0x64: my_stprintf_s(buffer, buffer_len, _T("LD H, H")); break;
2521         case 0x65: my_stprintf_s(buffer, buffer_len, _T("LD H, L")); break;
2522         case 0x66: my_stprintf_s(buffer, buffer_len, _T("LD H, (HL)")); break;
2523         case 0x67: my_stprintf_s(buffer, buffer_len, _T("LD H, A")); break;
2524         case 0x68: my_stprintf_s(buffer, buffer_len, _T("LD L, B")); break;
2525         case 0x69: my_stprintf_s(buffer, buffer_len, _T("LD L, C")); break;
2526         case 0x6a: my_stprintf_s(buffer, buffer_len, _T("LD L, D")); break;
2527         case 0x6b: my_stprintf_s(buffer, buffer_len, _T("LD L, E")); break;
2528         case 0x6c: my_stprintf_s(buffer, buffer_len, _T("LD L, H")); break;
2529         case 0x6d: my_stprintf_s(buffer, buffer_len, _T("LD L, L")); break;
2530         case 0x6e: my_stprintf_s(buffer, buffer_len, _T("LD L, (HL)")); break;
2531         case 0x6f: my_stprintf_s(buffer, buffer_len, _T("LD L, A")); break;
2532         case 0x70: my_stprintf_s(buffer, buffer_len, _T("LD (HL), B")); break;
2533         case 0x71: my_stprintf_s(buffer, buffer_len, _T("LD (HL), C")); break;
2534         case 0x72: my_stprintf_s(buffer, buffer_len, _T("LD (HL), D")); break;
2535         case 0x73: my_stprintf_s(buffer, buffer_len, _T("LD (HL), E")); break;
2536         case 0x74: my_stprintf_s(buffer, buffer_len, _T("LD (HL), H")); break;
2537         case 0x75: my_stprintf_s(buffer, buffer_len, _T("LD (HL), L")); break;
2538         case 0x76: my_stprintf_s(buffer, buffer_len, _T("HALT")); break;
2539         case 0x77: my_stprintf_s(buffer, buffer_len, _T("LD (HL), A")); break;
2540         case 0x78: my_stprintf_s(buffer, buffer_len, _T("LD A, B")); break;
2541         case 0x79: my_stprintf_s(buffer, buffer_len, _T("LD A, C")); break;
2542         case 0x7a: my_stprintf_s(buffer, buffer_len, _T("LD A, D")); break;
2543         case 0x7b: my_stprintf_s(buffer, buffer_len, _T("LD A, E")); break;
2544         case 0x7c: my_stprintf_s(buffer, buffer_len, _T("LD A, H")); break;
2545         case 0x7d: my_stprintf_s(buffer, buffer_len, _T("LD A, L")); break;
2546         case 0x7e: my_stprintf_s(buffer, buffer_len, _T("LD A, (HL)")); break;
2547         case 0x7f: my_stprintf_s(buffer, buffer_len, _T("LD A, A")); break;
2548         case 0x80: my_stprintf_s(buffer, buffer_len, _T("ADD A, B")); break;
2549         case 0x81: my_stprintf_s(buffer, buffer_len, _T("ADD A, C")); break;
2550         case 0x82: my_stprintf_s(buffer, buffer_len, _T("ADD A, D")); break;
2551         case 0x83: my_stprintf_s(buffer, buffer_len, _T("ADD A, E")); break;
2552         case 0x84: my_stprintf_s(buffer, buffer_len, _T("ADD A, H")); break;
2553         case 0x85: my_stprintf_s(buffer, buffer_len, _T("ADD A, L")); break;
2554         case 0x86: my_stprintf_s(buffer, buffer_len, _T("ADD A, (HL)")); break;
2555         case 0x87: my_stprintf_s(buffer, buffer_len, _T("ADD A, A")); break;
2556         case 0x88: my_stprintf_s(buffer, buffer_len, _T("ADC A, B")); break;
2557         case 0x89: my_stprintf_s(buffer, buffer_len, _T("ADC A, C")); break;
2558         case 0x8a: my_stprintf_s(buffer, buffer_len, _T("ADC A, D")); break;
2559         case 0x8b: my_stprintf_s(buffer, buffer_len, _T("ADC A, E")); break;
2560         case 0x8c: my_stprintf_s(buffer, buffer_len, _T("ADC A, H")); break;
2561         case 0x8d: my_stprintf_s(buffer, buffer_len, _T("ADC A, L")); break;
2562         case 0x8e: my_stprintf_s(buffer, buffer_len, _T("ADC A, (HL)")); break;
2563         case 0x8f: my_stprintf_s(buffer, buffer_len, _T("ADC A, A")); break;
2564         case 0x90: my_stprintf_s(buffer, buffer_len, _T("SUB B")); break;
2565         case 0x91: my_stprintf_s(buffer, buffer_len, _T("SUB C")); break;
2566         case 0x92: my_stprintf_s(buffer, buffer_len, _T("SUB D")); break;
2567         case 0x93: my_stprintf_s(buffer, buffer_len, _T("SUB E")); break;
2568         case 0x94: my_stprintf_s(buffer, buffer_len, _T("SUB H")); break;
2569         case 0x95: my_stprintf_s(buffer, buffer_len, _T("SUB L")); break;
2570         case 0x96: my_stprintf_s(buffer, buffer_len, _T("SUB (HL)")); break;
2571         case 0x97: my_stprintf_s(buffer, buffer_len, _T("SUB A")); break;
2572         case 0x98: my_stprintf_s(buffer, buffer_len, _T("SBC A, B")); break;
2573         case 0x99: my_stprintf_s(buffer, buffer_len, _T("SBC A, C")); break;
2574         case 0x9a: my_stprintf_s(buffer, buffer_len, _T("SBC A, D")); break;
2575         case 0x9b: my_stprintf_s(buffer, buffer_len, _T("SBC A, E")); break;
2576         case 0x9c: my_stprintf_s(buffer, buffer_len, _T("SBC A, H")); break;
2577         case 0x9d: my_stprintf_s(buffer, buffer_len, _T("SBC A, L")); break;
2578         case 0x9e: my_stprintf_s(buffer, buffer_len, _T("SBC A, (HL)")); break;
2579         case 0x9f: my_stprintf_s(buffer, buffer_len, _T("SBC A, A")); break;
2580         case 0xa0: my_stprintf_s(buffer, buffer_len, _T("AND B")); break;
2581         case 0xa1: my_stprintf_s(buffer, buffer_len, _T("AND C")); break;
2582         case 0xa2: my_stprintf_s(buffer, buffer_len, _T("AND D")); break;
2583         case 0xa3: my_stprintf_s(buffer, buffer_len, _T("AND E")); break;
2584         case 0xa4: my_stprintf_s(buffer, buffer_len, _T("AND H")); break;
2585         case 0xa5: my_stprintf_s(buffer, buffer_len, _T("AND L")); break;
2586         case 0xa6: my_stprintf_s(buffer, buffer_len, _T("AND (HL)")); break;
2587         case 0xa7: my_stprintf_s(buffer, buffer_len, _T("AND A")); break;
2588         case 0xa8: my_stprintf_s(buffer, buffer_len, _T("XOR B")); break;
2589         case 0xa9: my_stprintf_s(buffer, buffer_len, _T("XOR C")); break;
2590         case 0xaa: my_stprintf_s(buffer, buffer_len, _T("XOR D")); break;
2591         case 0xab: my_stprintf_s(buffer, buffer_len, _T("XOR E")); break;
2592         case 0xac: my_stprintf_s(buffer, buffer_len, _T("XOR H")); break;
2593         case 0xad: my_stprintf_s(buffer, buffer_len, _T("XOR L")); break;
2594         case 0xae: my_stprintf_s(buffer, buffer_len, _T("XOR (HL)")); break;
2595         case 0xaf: my_stprintf_s(buffer, buffer_len, _T("XOR A")); break;
2596         case 0xb0: my_stprintf_s(buffer, buffer_len, _T("OR B")); break;
2597         case 0xb1: my_stprintf_s(buffer, buffer_len, _T("OR C")); break;
2598         case 0xb2: my_stprintf_s(buffer, buffer_len, _T("OR D")); break;
2599         case 0xb3: my_stprintf_s(buffer, buffer_len, _T("OR E")); break;
2600         case 0xb4: my_stprintf_s(buffer, buffer_len, _T("OR H")); break;
2601         case 0xb5: my_stprintf_s(buffer, buffer_len, _T("OR L")); break;
2602         case 0xb6: my_stprintf_s(buffer, buffer_len, _T("OR (HL)")); break;
2603         case 0xb7: my_stprintf_s(buffer, buffer_len, _T("OR A")); break;
2604         case 0xb8: my_stprintf_s(buffer, buffer_len, _T("CP B")); break;
2605         case 0xb9: my_stprintf_s(buffer, buffer_len, _T("CP C")); break;
2606         case 0xba: my_stprintf_s(buffer, buffer_len, _T("CP D")); break;
2607         case 0xbb: my_stprintf_s(buffer, buffer_len, _T("CP E")); break;
2608         case 0xbc: my_stprintf_s(buffer, buffer_len, _T("CP H")); break;
2609         case 0xbd: my_stprintf_s(buffer, buffer_len, _T("CP L")); break;
2610         case 0xbe: my_stprintf_s(buffer, buffer_len, _T("CP (HL)")); break;
2611         case 0xbf: my_stprintf_s(buffer, buffer_len, _T("CP A")); break;
2612         case 0xc0: my_stprintf_s(buffer, buffer_len, _T("RET NZ")); break;
2613         case 0xc1: my_stprintf_s(buffer, buffer_len, _T("POP BC")); break;
2614         case 0xc2: my_stprintf_s(buffer, buffer_len, _T("JP NZ, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2615         case 0xc3: my_stprintf_s(buffer, buffer_len, _T("JP %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2616         case 0xc4: my_stprintf_s(buffer, buffer_len, _T("CALL NZ, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2617         case 0xc5: my_stprintf_s(buffer, buffer_len, _T("PUSH BC")); break;
2618         case 0xc6: my_stprintf_s(buffer, buffer_len, _T("ADD A, %02x"), debug_fetch8()); break;
2619         case 0xc7: my_stprintf_s(buffer, buffer_len, _T("RST 00H")); break;
2620         case 0xc8: my_stprintf_s(buffer, buffer_len, _T("RET Z")); break;
2621         case 0xc9: my_stprintf_s(buffer, buffer_len, _T("RET")); break;
2622         case 0xca: my_stprintf_s(buffer, buffer_len, _T("JP Z, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2623         case 0xcb: dasm_cb(pc, buffer, buffer_len, first_symbol); break;
2624         case 0xcc: my_stprintf_s(buffer, buffer_len, _T("CALL Z, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2625         case 0xcd: my_stprintf_s(buffer, buffer_len, _T("CALL %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2626         case 0xce: my_stprintf_s(buffer, buffer_len, _T("ADC A, %02x"), debug_fetch8()); break;
2627         case 0xcf: my_stprintf_s(buffer, buffer_len, _T("RST 08H")); break;
2628         case 0xd0: my_stprintf_s(buffer, buffer_len, _T("RET NC")); break;
2629         case 0xd1: my_stprintf_s(buffer, buffer_len, _T("POP DE")); break;
2630         case 0xd2: my_stprintf_s(buffer, buffer_len, _T("JP NC, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2631         case 0xd3: my_stprintf_s(buffer, buffer_len, _T("OUT (%02x), A"), debug_fetch8()); break;
2632         case 0xd4: my_stprintf_s(buffer, buffer_len, _T("CALL NC, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2633         case 0xd5: my_stprintf_s(buffer, buffer_len, _T("PUSH DE")); break;
2634         case 0xd6: my_stprintf_s(buffer, buffer_len, _T("SUB %02x"), debug_fetch8()); break;
2635         case 0xd7: my_stprintf_s(buffer, buffer_len, _T("RST 10H")); break;
2636         case 0xd8: my_stprintf_s(buffer, buffer_len, _T("RET C")); break;
2637         case 0xd9: my_stprintf_s(buffer, buffer_len, _T("EXX")); break;
2638         case 0xda: my_stprintf_s(buffer, buffer_len, _T("JP C, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2639         case 0xdb: my_stprintf_s(buffer, buffer_len, _T("IN A, (%02x)"), debug_fetch8()); break;
2640         case 0xdc: my_stprintf_s(buffer, buffer_len, _T("CALL C, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2641         case 0xdd: dasm_dd(pc, buffer, buffer_len, first_symbol); break;
2642         case 0xde: my_stprintf_s(buffer, buffer_len, _T("SBC A, %02x"), debug_fetch8()); break;
2643         case 0xdf: my_stprintf_s(buffer, buffer_len, _T("RST 18H")); break;
2644         case 0xe0: my_stprintf_s(buffer, buffer_len, _T("RET PO")); break;
2645         case 0xe1: my_stprintf_s(buffer, buffer_len, _T("POP HL")); break;
2646         case 0xe2: my_stprintf_s(buffer, buffer_len, _T("JP PO, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2647         case 0xe3: my_stprintf_s(buffer, buffer_len, _T("EX HL, (SP)")); break;
2648         case 0xe4: my_stprintf_s(buffer, buffer_len, _T("CALL PO, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2649         case 0xe5: my_stprintf_s(buffer, buffer_len, _T("PUSH HL")); break;
2650         case 0xe6: my_stprintf_s(buffer, buffer_len, _T("AND %02x"), debug_fetch8()); break;
2651         case 0xe7: my_stprintf_s(buffer, buffer_len, _T("RST 20H")); break;
2652         case 0xe8: my_stprintf_s(buffer, buffer_len, _T("RET PE")); break;
2653         case 0xe9: my_stprintf_s(buffer, buffer_len, _T("JP (HL)")); break;
2654         case 0xea: my_stprintf_s(buffer, buffer_len, _T("JP PE, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2655         case 0xeb: my_stprintf_s(buffer, buffer_len, _T("EX DE, HL")); break;
2656         case 0xec: my_stprintf_s(buffer, buffer_len, _T("CALL PE, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2657         case 0xed: dasm_ed(pc, buffer, buffer_len, first_symbol); break;
2658         case 0xee: my_stprintf_s(buffer, buffer_len, _T("XOR %02x"), debug_fetch8()); break;
2659         case 0xef: my_stprintf_s(buffer, buffer_len, _T("RST 28H")); break;
2660         case 0xf0: my_stprintf_s(buffer, buffer_len, _T("RET P")); break;
2661         case 0xf1: my_stprintf_s(buffer, buffer_len, _T("POP AF")); break;
2662         case 0xf2: my_stprintf_s(buffer, buffer_len, _T("JP P, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2663         case 0xf3: my_stprintf_s(buffer, buffer_len, _T("DI")); break;
2664         case 0xf4: my_stprintf_s(buffer, buffer_len, _T("CALL P, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2665         case 0xf5: my_stprintf_s(buffer, buffer_len, _T("PUSH AF")); break;
2666         case 0xf6: my_stprintf_s(buffer, buffer_len, _T("OR %02x"), debug_fetch8()); break;
2667         case 0xf7: my_stprintf_s(buffer, buffer_len, _T("RST 30H")); break;
2668         case 0xf8: my_stprintf_s(buffer, buffer_len, _T("RET M")); break;
2669         case 0xf9: my_stprintf_s(buffer, buffer_len, _T("LD SP, HL")); break;
2670         case 0xfa: my_stprintf_s(buffer, buffer_len, _T("JP M, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2671         case 0xfb: my_stprintf_s(buffer, buffer_len, _T("EI")); break;
2672         case 0xfc: my_stprintf_s(buffer, buffer_len, _T("CALL M, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2673         case 0xfd: dasm_fd(pc, buffer, buffer_len, first_symbol); break;
2674         case 0xfe: my_stprintf_s(buffer, buffer_len, _T("CP %02x"), debug_fetch8()); break;
2675         case 0xff: my_stprintf_s(buffer, buffer_len, _T("RST 38H")); break;
2676 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
2677         default: __assume(0);
2678 #endif
2679         }
2680         return z80_dasm_ptr;
2681 }
2682
2683 static void dasm_cb(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol)
2684 {
2685         uint8_t code = dasm_fetchop();
2686         
2687         switch(code) {
2688         case 0x00: my_stprintf_s(buffer, buffer_len, _T("RLC B")); break;
2689         case 0x01: my_stprintf_s(buffer, buffer_len, _T("RLC C")); break;
2690         case 0x02: my_stprintf_s(buffer, buffer_len, _T("RLC D")); break;
2691         case 0x03: my_stprintf_s(buffer, buffer_len, _T("RLC E")); break;
2692         case 0x04: my_stprintf_s(buffer, buffer_len, _T("RLC H")); break;
2693         case 0x05: my_stprintf_s(buffer, buffer_len, _T("RLC L")); break;
2694         case 0x06: my_stprintf_s(buffer, buffer_len, _T("RLC (HL)")); break;
2695         case 0x07: my_stprintf_s(buffer, buffer_len, _T("RLC A")); break;
2696         case 0x08: my_stprintf_s(buffer, buffer_len, _T("RRC B")); break;
2697         case 0x09: my_stprintf_s(buffer, buffer_len, _T("RRC C")); break;
2698         case 0x0a: my_stprintf_s(buffer, buffer_len, _T("RRC D")); break;
2699         case 0x0b: my_stprintf_s(buffer, buffer_len, _T("RRC E")); break;
2700         case 0x0c: my_stprintf_s(buffer, buffer_len, _T("RRC H")); break;
2701         case 0x0d: my_stprintf_s(buffer, buffer_len, _T("RRC L")); break;
2702         case 0x0e: my_stprintf_s(buffer, buffer_len, _T("RRC (HL)")); break;
2703         case 0x0f: my_stprintf_s(buffer, buffer_len, _T("RRC A")); break;
2704         case 0x10: my_stprintf_s(buffer, buffer_len, _T("RL B")); break;
2705         case 0x11: my_stprintf_s(buffer, buffer_len, _T("RL C")); break;
2706         case 0x12: my_stprintf_s(buffer, buffer_len, _T("RL D")); break;
2707         case 0x13: my_stprintf_s(buffer, buffer_len, _T("RL E")); break;
2708         case 0x14: my_stprintf_s(buffer, buffer_len, _T("RL H")); break;
2709         case 0x15: my_stprintf_s(buffer, buffer_len, _T("RL L")); break;
2710         case 0x16: my_stprintf_s(buffer, buffer_len, _T("RL (HL)")); break;
2711         case 0x17: my_stprintf_s(buffer, buffer_len, _T("RL A")); break;
2712         case 0x18: my_stprintf_s(buffer, buffer_len, _T("RR B")); break;
2713         case 0x19: my_stprintf_s(buffer, buffer_len, _T("RR C")); break;
2714         case 0x1a: my_stprintf_s(buffer, buffer_len, _T("RR D")); break;
2715         case 0x1b: my_stprintf_s(buffer, buffer_len, _T("RR E")); break;
2716         case 0x1c: my_stprintf_s(buffer, buffer_len, _T("RR H")); break;
2717         case 0x1d: my_stprintf_s(buffer, buffer_len, _T("RR L")); break;
2718         case 0x1e: my_stprintf_s(buffer, buffer_len, _T("RR (HL)")); break;
2719         case 0x1f: my_stprintf_s(buffer, buffer_len, _T("RR A")); break;
2720         case 0x20: my_stprintf_s(buffer, buffer_len, _T("SLA B")); break;
2721         case 0x21: my_stprintf_s(buffer, buffer_len, _T("SLA C")); break;
2722         case 0x22: my_stprintf_s(buffer, buffer_len, _T("SLA D")); break;
2723         case 0x23: my_stprintf_s(buffer, buffer_len, _T("SLA E")); break;
2724         case 0x24: my_stprintf_s(buffer, buffer_len, _T("SLA H")); break;
2725         case 0x25: my_stprintf_s(buffer, buffer_len, _T("SLA L")); break;
2726         case 0x26: my_stprintf_s(buffer, buffer_len, _T("SLA (HL)")); break;
2727         case 0x27: my_stprintf_s(buffer, buffer_len, _T("SLA A")); break;
2728         case 0x28: my_stprintf_s(buffer, buffer_len, _T("SRA B")); break;
2729         case 0x29: my_stprintf_s(buffer, buffer_len, _T("SRA C")); break;
2730         case 0x2a: my_stprintf_s(buffer, buffer_len, _T("SRA D")); break;
2731         case 0x2b: my_stprintf_s(buffer, buffer_len, _T("SRA E")); break;
2732         case 0x2c: my_stprintf_s(buffer, buffer_len, _T("SRA H")); break;
2733         case 0x2d: my_stprintf_s(buffer, buffer_len, _T("SRA L")); break;
2734         case 0x2e: my_stprintf_s(buffer, buffer_len, _T("SRA (HL)")); break;
2735         case 0x2f: my_stprintf_s(buffer, buffer_len, _T("SRA A")); break;
2736         case 0x30: my_stprintf_s(buffer, buffer_len, _T("SLL B")); break;
2737         case 0x31: my_stprintf_s(buffer, buffer_len, _T("SLL C")); break;
2738         case 0x32: my_stprintf_s(buffer, buffer_len, _T("SLL D")); break;
2739         case 0x33: my_stprintf_s(buffer, buffer_len, _T("SLL E")); break;
2740         case 0x34: my_stprintf_s(buffer, buffer_len, _T("SLL H")); break;
2741         case 0x35: my_stprintf_s(buffer, buffer_len, _T("SLL L")); break;
2742         case 0x36: my_stprintf_s(buffer, buffer_len, _T("SLL (HL)")); break;
2743         case 0x37: my_stprintf_s(buffer, buffer_len, _T("SLL A")); break;
2744         case 0x38: my_stprintf_s(buffer, buffer_len, _T("SRL B")); break;
2745         case 0x39: my_stprintf_s(buffer, buffer_len, _T("SRL C")); break;
2746         case 0x3a: my_stprintf_s(buffer, buffer_len, _T("SRL D")); break;
2747         case 0x3b: my_stprintf_s(buffer, buffer_len, _T("SRL E")); break;
2748         case 0x3c: my_stprintf_s(buffer, buffer_len, _T("SRL H")); break;
2749         case 0x3d: my_stprintf_s(buffer, buffer_len, _T("SRL L")); break;
2750         case 0x3e: my_stprintf_s(buffer, buffer_len, _T("SRL (HL)")); break;
2751         case 0x3f: my_stprintf_s(buffer, buffer_len, _T("SRL A")); break;
2752         case 0x40: my_stprintf_s(buffer, buffer_len, _T("BIT 0, B")); break;
2753         case 0x41: my_stprintf_s(buffer, buffer_len, _T("BIT 0, C")); break;
2754         case 0x42: my_stprintf_s(buffer, buffer_len, _T("BIT 0, D")); break;
2755         case 0x43: my_stprintf_s(buffer, buffer_len, _T("BIT 0, E")); break;
2756         case 0x44: my_stprintf_s(buffer, buffer_len, _T("BIT 0, H")); break;
2757         case 0x45: my_stprintf_s(buffer, buffer_len, _T("BIT 0, L")); break;
2758         case 0x46: my_stprintf_s(buffer, buffer_len, _T("BIT 0, (HL)")); break;
2759         case 0x47: my_stprintf_s(buffer, buffer_len, _T("BIT 0, A")); break;
2760         case 0x48: my_stprintf_s(buffer, buffer_len, _T("BIT 1, B")); break;
2761         case 0x49: my_stprintf_s(buffer, buffer_len, _T("BIT 1, C")); break;
2762         case 0x4a: my_stprintf_s(buffer, buffer_len, _T("BIT 1, D")); break;
2763         case 0x4b: my_stprintf_s(buffer, buffer_len, _T("BIT 1, E")); break;
2764         case 0x4c: my_stprintf_s(buffer, buffer_len, _T("BIT 1, H")); break;
2765         case 0x4d: my_stprintf_s(buffer, buffer_len, _T("BIT 1, L")); break;
2766         case 0x4e: my_stprintf_s(buffer, buffer_len, _T("BIT 1, (HL)")); break;
2767         case 0x4f: my_stprintf_s(buffer, buffer_len, _T("BIT 1, A")); break;
2768         case 0x50: my_stprintf_s(buffer, buffer_len, _T("BIT 2, B")); break;
2769         case 0x51: my_stprintf_s(buffer, buffer_len, _T("BIT 2, C")); break;
2770         case 0x52: my_stprintf_s(buffer, buffer_len, _T("BIT 2, D")); break;
2771         case 0x53: my_stprintf_s(buffer, buffer_len, _T("BIT 2, E")); break;
2772         case 0x54: my_stprintf_s(buffer, buffer_len, _T("BIT 2, H")); break;
2773         case 0x55: my_stprintf_s(buffer, buffer_len, _T("BIT 2, L")); break;
2774         case 0x56: my_stprintf_s(buffer, buffer_len, _T("BIT 2, (HL)")); break;
2775         case 0x57: my_stprintf_s(buffer, buffer_len, _T("BIT 2, A")); break;
2776         case 0x58: my_stprintf_s(buffer, buffer_len, _T("BIT 3, B")); break;
2777         case 0x59: my_stprintf_s(buffer, buffer_len, _T("BIT 3, C")); break;
2778         case 0x5a: my_stprintf_s(buffer, buffer_len, _T("BIT 3, D")); break;
2779         case 0x5b: my_stprintf_s(buffer, buffer_len, _T("BIT 3, E")); break;
2780         case 0x5c: my_stprintf_s(buffer, buffer_len, _T("BIT 3, H")); break;
2781         case 0x5d: my_stprintf_s(buffer, buffer_len, _T("BIT 3, L")); break;
2782         case 0x5e: my_stprintf_s(buffer, buffer_len, _T("BIT 3, (HL)")); break;
2783         case 0x5f: my_stprintf_s(buffer, buffer_len, _T("BIT 3, A")); break;
2784         case 0x60: my_stprintf_s(buffer, buffer_len, _T("BIT 4, B")); break;
2785         case 0x61: my_stprintf_s(buffer, buffer_len, _T("BIT 4, C")); break;
2786         case 0x62: my_stprintf_s(buffer, buffer_len, _T("BIT 4, D")); break;
2787         case 0x63: my_stprintf_s(buffer, buffer_len, _T("BIT 4, E")); break;
2788         case 0x64: my_stprintf_s(buffer, buffer_len, _T("BIT 4, H")); break;
2789         case 0x65: my_stprintf_s(buffer, buffer_len, _T("BIT 4, L")); break;
2790         case 0x66: my_stprintf_s(buffer, buffer_len, _T("BIT 4, (HL)")); break;
2791         case 0x67: my_stprintf_s(buffer, buffer_len, _T("BIT 4, A")); break;
2792         case 0x68: my_stprintf_s(buffer, buffer_len, _T("BIT 5, B")); break;
2793         case 0x69: my_stprintf_s(buffer, buffer_len, _T("BIT 5, C")); break;
2794         case 0x6a: my_stprintf_s(buffer, buffer_len, _T("BIT 5, D")); break;
2795         case 0x6b: my_stprintf_s(buffer, buffer_len, _T("BIT 5, E")); break;
2796         case 0x6c: my_stprintf_s(buffer, buffer_len, _T("BIT 5, H")); break;
2797         case 0x6d: my_stprintf_s(buffer, buffer_len, _T("BIT 5, L")); break;
2798         case 0x6e: my_stprintf_s(buffer, buffer_len, _T("BIT 5, (HL)")); break;
2799         case 0x6f: my_stprintf_s(buffer, buffer_len, _T("BIT 5, A")); break;
2800         case 0x70: my_stprintf_s(buffer, buffer_len, _T("BIT 6, B")); break;
2801         case 0x71: my_stprintf_s(buffer, buffer_len, _T("BIT 6, C")); break;
2802         case 0x72: my_stprintf_s(buffer, buffer_len, _T("BIT 6, D")); break;
2803         case 0x73: my_stprintf_s(buffer, buffer_len, _T("BIT 6, E")); break;
2804         case 0x74: my_stprintf_s(buffer, buffer_len, _T("BIT 6, H")); break;
2805         case 0x75: my_stprintf_s(buffer, buffer_len, _T("BIT 6, L")); break;
2806         case 0x76: my_stprintf_s(buffer, buffer_len, _T("BIT 6, (HL)")); break;
2807         case 0x77: my_stprintf_s(buffer, buffer_len, _T("BIT 6, A")); break;
2808         case 0x78: my_stprintf_s(buffer, buffer_len, _T("BIT 7, B")); break;
2809         case 0x79: my_stprintf_s(buffer, buffer_len, _T("BIT 7, C")); break;
2810         case 0x7a: my_stprintf_s(buffer, buffer_len, _T("BIT 7, D")); break;
2811         case 0x7b: my_stprintf_s(buffer, buffer_len, _T("BIT 7, E")); break;
2812         case 0x7c: my_stprintf_s(buffer, buffer_len, _T("BIT 7, H")); break;
2813         case 0x7d: my_stprintf_s(buffer, buffer_len, _T("BIT 7, L")); break;
2814         case 0x7e: my_stprintf_s(buffer, buffer_len, _T("BIT 7, (HL)")); break;
2815         case 0x7f: my_stprintf_s(buffer, buffer_len, _T("BIT 7, A")); break;
2816         case 0x80: my_stprintf_s(buffer, buffer_len, _T("RES 0, B")); break;
2817         case 0x81: my_stprintf_s(buffer, buffer_len, _T("RES 0, C")); break;
2818         case 0x82: my_stprintf_s(buffer, buffer_len, _T("RES 0, D")); break;
2819         case 0x83: my_stprintf_s(buffer, buffer_len, _T("RES 0, E")); break;
2820         case 0x84: my_stprintf_s(buffer, buffer_len, _T("RES 0, H")); break;
2821         case 0x85: my_stprintf_s(buffer, buffer_len, _T("RES 0, L")); break;
2822         case 0x86: my_stprintf_s(buffer, buffer_len, _T("RES 0, (HL)")); break;
2823         case 0x87: my_stprintf_s(buffer, buffer_len, _T("RES 0, A")); break;
2824         case 0x88: my_stprintf_s(buffer, buffer_len, _T("RES 1, B")); break;
2825         case 0x89: my_stprintf_s(buffer, buffer_len, _T("RES 1, C")); break;
2826         case 0x8a: my_stprintf_s(buffer, buffer_len, _T("RES 1, D")); break;
2827         case 0x8b: my_stprintf_s(buffer, buffer_len, _T("RES 1, E")); break;
2828         case 0x8c: my_stprintf_s(buffer, buffer_len, _T("RES 1, H")); break;
2829         case 0x8d: my_stprintf_s(buffer, buffer_len, _T("RES 1, L")); break;
2830         case 0x8e: my_stprintf_s(buffer, buffer_len, _T("RES 1, (HL)")); break;
2831         case 0x8f: my_stprintf_s(buffer, buffer_len, _T("RES 1, A")); break;
2832         case 0x90: my_stprintf_s(buffer, buffer_len, _T("RES 2, B")); break;
2833         case 0x91: my_stprintf_s(buffer, buffer_len, _T("RES 2, C")); break;
2834         case 0x92: my_stprintf_s(buffer, buffer_len, _T("RES 2, D")); break;
2835         case 0x93: my_stprintf_s(buffer, buffer_len, _T("RES 2, E")); break;
2836         case 0x94: my_stprintf_s(buffer, buffer_len, _T("RES 2, H")); break;
2837         case 0x95: my_stprintf_s(buffer, buffer_len, _T("RES 2, L")); break;
2838         case 0x96: my_stprintf_s(buffer, buffer_len, _T("RES 2, (HL)")); break;
2839         case 0x97: my_stprintf_s(buffer, buffer_len, _T("RES 2, A")); break;
2840         case 0x98: my_stprintf_s(buffer, buffer_len, _T("RES 3, B")); break;
2841         case 0x99: my_stprintf_s(buffer, buffer_len, _T("RES 3, C")); break;
2842         case 0x9a: my_stprintf_s(buffer, buffer_len, _T("RES 3, D")); break;
2843         case 0x9b: my_stprintf_s(buffer, buffer_len, _T("RES 3, E")); break;
2844         case 0x9c: my_stprintf_s(buffer, buffer_len, _T("RES 3, H")); break;
2845         case 0x9d: my_stprintf_s(buffer, buffer_len, _T("RES 3, L")); break;
2846         case 0x9e: my_stprintf_s(buffer, buffer_len, _T("RES 3, (HL)")); break;
2847         case 0x9f: my_stprintf_s(buffer, buffer_len, _T("RES 3, A")); break;
2848         case 0xa0: my_stprintf_s(buffer, buffer_len, _T("RES 4, B")); break;
2849         case 0xa1: my_stprintf_s(buffer, buffer_len, _T("RES 4, C")); break;
2850         case 0xa2: my_stprintf_s(buffer, buffer_len, _T("RES 4, D")); break;
2851         case 0xa3: my_stprintf_s(buffer, buffer_len, _T("RES 4, E")); break;
2852         case 0xa4: my_stprintf_s(buffer, buffer_len, _T("RES 4, H")); break;
2853         case 0xa5: my_stprintf_s(buffer, buffer_len, _T("RES 4, L")); break;
2854         case 0xa6: my_stprintf_s(buffer, buffer_len, _T("RES 4, (HL)")); break;
2855         case 0xa7: my_stprintf_s(buffer, buffer_len, _T("RES 4, A")); break;
2856         case 0xa8: my_stprintf_s(buffer, buffer_len, _T("RES 5, B")); break;
2857         case 0xa9: my_stprintf_s(buffer, buffer_len, _T("RES 5, C")); break;
2858         case 0xaa: my_stprintf_s(buffer, buffer_len, _T("RES 5, D")); break;
2859         case 0xab: my_stprintf_s(buffer, buffer_len, _T("RES 5, E")); break;
2860         case 0xac: my_stprintf_s(buffer, buffer_len, _T("RES 5, H")); break;
2861         case 0xad: my_stprintf_s(buffer, buffer_len, _T("RES 5, L")); break;
2862         case 0xae: my_stprintf_s(buffer, buffer_len, _T("RES 5, (HL)")); break;
2863         case 0xaf: my_stprintf_s(buffer, buffer_len, _T("RES 5, A")); break;
2864         case 0xb0: my_stprintf_s(buffer, buffer_len, _T("RES 6, B")); break;
2865         case 0xb1: my_stprintf_s(buffer, buffer_len, _T("RES 6, C")); break;
2866         case 0xb2: my_stprintf_s(buffer, buffer_len, _T("RES 6, D")); break;
2867         case 0xb3: my_stprintf_s(buffer, buffer_len, _T("RES 6, E")); break;
2868         case 0xb4: my_stprintf_s(buffer, buffer_len, _T("RES 6, H")); break;
2869         case 0xb5: my_stprintf_s(buffer, buffer_len, _T("RES 6, L")); break;
2870         case 0xb6: my_stprintf_s(buffer, buffer_len, _T("RES 6, (HL)")); break;
2871         case 0xb7: my_stprintf_s(buffer, buffer_len, _T("RES 6, A")); break;
2872         case 0xb8: my_stprintf_s(buffer, buffer_len, _T("RES 7, B")); break;
2873         case 0xb9: my_stprintf_s(buffer, buffer_len, _T("RES 7, C")); break;
2874         case 0xba: my_stprintf_s(buffer, buffer_len, _T("RES 7, D")); break;
2875         case 0xbb: my_stprintf_s(buffer, buffer_len, _T("RES 7, E")); break;
2876         case 0xbc: my_stprintf_s(buffer, buffer_len, _T("RES 7, H")); break;
2877         case 0xbd: my_stprintf_s(buffer, buffer_len, _T("RES 7, L")); break;
2878         case 0xbe: my_stprintf_s(buffer, buffer_len, _T("RES 7, (HL)")); break;
2879         case 0xbf: my_stprintf_s(buffer, buffer_len, _T("RES 7, A")); break;
2880         case 0xc0: my_stprintf_s(buffer, buffer_len, _T("SET 0, B")); break;
2881         case 0xc1: my_stprintf_s(buffer, buffer_len, _T("SET 0, C")); break;
2882         case 0xc2: my_stprintf_s(buffer, buffer_len, _T("SET 0, D")); break;
2883         case 0xc3: my_stprintf_s(buffer, buffer_len, _T("SET 0, E")); break;
2884         case 0xc4: my_stprintf_s(buffer, buffer_len, _T("SET 0, H")); break;
2885         case 0xc5: my_stprintf_s(buffer, buffer_len, _T("SET 0, L")); break;
2886         case 0xc6: my_stprintf_s(buffer, buffer_len, _T("SET 0, (HL)")); break;
2887         case 0xc7: my_stprintf_s(buffer, buffer_len, _T("SET 0, A")); break;
2888         case 0xc8: my_stprintf_s(buffer, buffer_len, _T("SET 1, B")); break;
2889         case 0xc9: my_stprintf_s(buffer, buffer_len, _T("SET 1, C")); break;
2890         case 0xca: my_stprintf_s(buffer, buffer_len, _T("SET 1, D")); break;
2891         case 0xcb: my_stprintf_s(buffer, buffer_len, _T("SET 1, E")); break;
2892         case 0xcc: my_stprintf_s(buffer, buffer_len, _T("SET 1, H")); break;
2893         case 0xcd: my_stprintf_s(buffer, buffer_len, _T("SET 1, L")); break;
2894         case 0xce: my_stprintf_s(buffer, buffer_len, _T("SET 1, (HL)")); break;
2895         case 0xcf: my_stprintf_s(buffer, buffer_len, _T("SET 1, A")); break;
2896         case 0xd0: my_stprintf_s(buffer, buffer_len, _T("SET 2, B")); break;
2897         case 0xd1: my_stprintf_s(buffer, buffer_len, _T("SET 2, C")); break;
2898         case 0xd2: my_stprintf_s(buffer, buffer_len, _T("SET 2, D")); break;
2899         case 0xd3: my_stprintf_s(buffer, buffer_len, _T("SET 2, E")); break;
2900         case 0xd4: my_stprintf_s(buffer, buffer_len, _T("SET 2, H")); break;
2901         case 0xd5: my_stprintf_s(buffer, buffer_len, _T("SET 2, L")); break;
2902         case 0xd6: my_stprintf_s(buffer, buffer_len, _T("SET 2, (HL)")); break;
2903         case 0xd7: my_stprintf_s(buffer, buffer_len, _T("SET 2, A")); break;
2904         case 0xd8: my_stprintf_s(buffer, buffer_len, _T("SET 3, B")); break;
2905         case 0xd9: my_stprintf_s(buffer, buffer_len, _T("SET 3, C")); break;
2906         case 0xda: my_stprintf_s(buffer, buffer_len, _T("SET 3, D")); break;
2907         case 0xdb: my_stprintf_s(buffer, buffer_len, _T("SET 3, E")); break;
2908         case 0xdc: my_stprintf_s(buffer, buffer_len, _T("SET 3, H")); break;
2909         case 0xdd: my_stprintf_s(buffer, buffer_len, _T("SET 3, L")); break;
2910         case 0xde: my_stprintf_s(buffer, buffer_len, _T("SET 3, (HL)")); break;
2911         case 0xdf: my_stprintf_s(buffer, buffer_len, _T("SET 3, A")); break;
2912         case 0xe0: my_stprintf_s(buffer, buffer_len, _T("SET 4, B")); break;
2913         case 0xe1: my_stprintf_s(buffer, buffer_len, _T("SET 4, C")); break;
2914         case 0xe2: my_stprintf_s(buffer, buffer_len, _T("SET 4, D")); break;
2915         case 0xe3: my_stprintf_s(buffer, buffer_len, _T("SET 4, E")); break;
2916         case 0xe4: my_stprintf_s(buffer, buffer_len, _T("SET 4, H")); break;
2917         case 0xe5: my_stprintf_s(buffer, buffer_len, _T("SET 4, L")); break;
2918         case 0xe6: my_stprintf_s(buffer, buffer_len, _T("SET 4, (HL)")); break;
2919         case 0xe7: my_stprintf_s(buffer, buffer_len, _T("SET 4, A")); break;
2920         case 0xe8: my_stprintf_s(buffer, buffer_len, _T("SET 5, B")); break;
2921         case 0xe9: my_stprintf_s(buffer, buffer_len, _T("SET 5, C")); break;
2922         case 0xea: my_stprintf_s(buffer, buffer_len, _T("SET 5, D")); break;
2923         case 0xeb: my_stprintf_s(buffer, buffer_len, _T("SET 5, E")); break;
2924         case 0xec: my_stprintf_s(buffer, buffer_len, _T("SET 5, H")); break;
2925         case 0xed: my_stprintf_s(buffer, buffer_len, _T("SET 5, L")); break;
2926         case 0xee: my_stprintf_s(buffer, buffer_len, _T("SET 5, (HL)")); break;
2927         case 0xef: my_stprintf_s(buffer, buffer_len, _T("SET 5, A")); break;
2928         case 0xf0: my_stprintf_s(buffer, buffer_len, _T("SET 6, B")); break;
2929         case 0xf1: my_stprintf_s(buffer, buffer_len, _T("SET 6, C")); break;
2930         case 0xf2: my_stprintf_s(buffer, buffer_len, _T("SET 6, D")); break;
2931         case 0xf3: my_stprintf_s(buffer, buffer_len, _T("SET 6, E")); break;
2932         case 0xf4: my_stprintf_s(buffer, buffer_len, _T("SET 6, H")); break;
2933         case 0xf5: my_stprintf_s(buffer, buffer_len, _T("SET 6, L")); break;
2934         case 0xf6: my_stprintf_s(buffer, buffer_len, _T("SET 6, (HL)")); break;
2935         case 0xf7: my_stprintf_s(buffer, buffer_len, _T("SET 6, A")); break;
2936         case 0xf8: my_stprintf_s(buffer, buffer_len, _T("SET 7, B")); break;
2937         case 0xf9: my_stprintf_s(buffer, buffer_len, _T("SET 7, C")); break;
2938         case 0xfa: my_stprintf_s(buffer, buffer_len, _T("SET 7, D")); break;
2939         case 0xfb: my_stprintf_s(buffer, buffer_len, _T("SET 7, E")); break;
2940         case 0xfc: my_stprintf_s(buffer, buffer_len, _T("SET 7, H")); break;
2941         case 0xfd: my_stprintf_s(buffer, buffer_len, _T("SET 7, L")); break;
2942         case 0xfe: my_stprintf_s(buffer, buffer_len, _T("SET 7, (HL)")); break;
2943         case 0xff: my_stprintf_s(buffer, buffer_len, _T("SET 7, A")); break;
2944 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
2945         default: __assume(0);
2946 #endif
2947         }
2948 }
2949
2950 static void dasm_dd(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol)
2951 {
2952         uint8_t code = dasm_fetchop();
2953         int8_t ofs;
2954         
2955         switch(code) {
2956         case 0x09: my_stprintf_s(buffer, buffer_len, _T("ADD IX, BC")); break;
2957         case 0x19: my_stprintf_s(buffer, buffer_len, _T("ADD IX, DE")); break;
2958         case 0x21: my_stprintf_s(buffer, buffer_len, _T("LD IX, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2959         case 0x22: my_stprintf_s(buffer, buffer_len, _T("LD (%s), IX"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2960         case 0x23: my_stprintf_s(buffer, buffer_len, _T("INC IX")); break;
2961         case 0x24: my_stprintf_s(buffer, buffer_len, _T("INC HX")); break;
2962         case 0x25: my_stprintf_s(buffer, buffer_len, _T("DEC HX")); break;
2963         case 0x26: my_stprintf_s(buffer, buffer_len, _T("LD HX, %02x"), debug_fetch8()); break;
2964         case 0x29: my_stprintf_s(buffer, buffer_len, _T("ADD IX, IX")); break;
2965         case 0x2a: my_stprintf_s(buffer, buffer_len, _T("LD IX, (%s)"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
2966         case 0x2b: my_stprintf_s(buffer, buffer_len, _T("DEC IX")); break;
2967         case 0x2c: my_stprintf_s(buffer, buffer_len, _T("INC LX")); break;
2968         case 0x2d: my_stprintf_s(buffer, buffer_len, _T("DEC LX")); break;
2969         case 0x2e: my_stprintf_s(buffer, buffer_len, _T("LD LX, %02x"), debug_fetch8()); break;
2970         case 0x34: my_stprintf_s(buffer, buffer_len, _T("INC (IX+(%d))"), debug_fetch8_rel()); break;
2971         case 0x35: my_stprintf_s(buffer, buffer_len, _T("DEC (IX+(%d))"), debug_fetch8_rel()); break;
2972         case 0x36: ofs = debug_fetch8_rel(); my_stprintf_s(buffer, buffer_len, _T("LD (IX+(%d)), %02x"), ofs, debug_fetch8()); break;
2973         case 0x39: my_stprintf_s(buffer, buffer_len, _T("ADD IX, SP")); break;
2974         case 0x44: my_stprintf_s(buffer, buffer_len, _T("LD B, HX")); break;
2975         case 0x45: my_stprintf_s(buffer, buffer_len, _T("LD B, LX")); break;
2976         case 0x46: my_stprintf_s(buffer, buffer_len, _T("LD B, (IX+(%d))"), debug_fetch8_rel()); break;
2977         case 0x4c: my_stprintf_s(buffer, buffer_len, _T("LD C, HX")); break;
2978         case 0x4d: my_stprintf_s(buffer, buffer_len, _T("LD C, LX")); break;
2979         case 0x4e: my_stprintf_s(buffer, buffer_len, _T("LD C, (IX+(%d))"), debug_fetch8_rel()); break;
2980         case 0x54: my_stprintf_s(buffer, buffer_len, _T("LD D, HX")); break;
2981         case 0x55: my_stprintf_s(buffer, buffer_len, _T("LD D, LX")); break;
2982         case 0x56: my_stprintf_s(buffer, buffer_len, _T("LD D, (IX+(%d))"), debug_fetch8_rel()); break;
2983         case 0x5c: my_stprintf_s(buffer, buffer_len, _T("LD E, HX")); break;
2984         case 0x5d: my_stprintf_s(buffer, buffer_len, _T("LD E, LX")); break;
2985         case 0x5e: my_stprintf_s(buffer, buffer_len, _T("LD E, (IX+(%d))"), debug_fetch8_rel()); break;
2986         case 0x60: my_stprintf_s(buffer, buffer_len, _T("LD HX, B")); break;
2987         case 0x61: my_stprintf_s(buffer, buffer_len, _T("LD HX, C")); break;
2988         case 0x62: my_stprintf_s(buffer, buffer_len, _T("LD HX, D")); break;
2989         case 0x63: my_stprintf_s(buffer, buffer_len, _T("LD HX, E")); break;
2990         case 0x64: my_stprintf_s(buffer, buffer_len, _T("LD HX, HX")); break;
2991         case 0x65: my_stprintf_s(buffer, buffer_len, _T("LD HX, LX")); break;
2992         case 0x66: my_stprintf_s(buffer, buffer_len, _T("LD H, (IX+(%d))"), debug_fetch8_rel()); break;
2993         case 0x67: my_stprintf_s(buffer, buffer_len, _T("LD HX, A")); break;
2994         case 0x68: my_stprintf_s(buffer, buffer_len, _T("LD LX, B")); break;
2995         case 0x69: my_stprintf_s(buffer, buffer_len, _T("LD LX, C")); break;
2996         case 0x6a: my_stprintf_s(buffer, buffer_len, _T("LD LX, D")); break;
2997         case 0x6b: my_stprintf_s(buffer, buffer_len, _T("LD LX, E")); break;
2998         case 0x6c: my_stprintf_s(buffer, buffer_len, _T("LD LX, HX")); break;
2999         case 0x6d: my_stprintf_s(buffer, buffer_len, _T("LD LX, LX")); break;
3000         case 0x6e: my_stprintf_s(buffer, buffer_len, _T("LD L, (IX+(%d))"), debug_fetch8_rel()); break;
3001         case 0x6f: my_stprintf_s(buffer, buffer_len, _T("LD LX, A")); break;
3002         case 0x70: my_stprintf_s(buffer, buffer_len, _T("LD (IX+(%d)), B"), debug_fetch8_rel()); break;
3003         case 0x71: my_stprintf_s(buffer, buffer_len, _T("LD (IX+(%d)), C"), debug_fetch8_rel()); break;
3004         case 0x72: my_stprintf_s(buffer, buffer_len, _T("LD (IX+(%d)), D"), debug_fetch8_rel()); break;
3005         case 0x73: my_stprintf_s(buffer, buffer_len, _T("LD (IX+(%d)), E"), debug_fetch8_rel()); break;
3006         case 0x74: my_stprintf_s(buffer, buffer_len, _T("LD (IX+(%d)), H"), debug_fetch8_rel()); break;
3007         case 0x75: my_stprintf_s(buffer, buffer_len, _T("LD (IX+(%d)), L"), debug_fetch8_rel()); break;
3008         case 0x77: my_stprintf_s(buffer, buffer_len, _T("LD (IX+(%d)), A"), debug_fetch8_rel()); break;
3009         case 0x7c: my_stprintf_s(buffer, buffer_len, _T("LD A, HX")); break;
3010         case 0x7d: my_stprintf_s(buffer, buffer_len, _T("LD A, LX")); break;
3011         case 0x7e: my_stprintf_s(buffer, buffer_len, _T("LD A, (IX+(%d))"), debug_fetch8_rel()); break;
3012         case 0x84: my_stprintf_s(buffer, buffer_len, _T("ADD A, HX")); break;
3013         case 0x85: my_stprintf_s(buffer, buffer_len, _T("ADD A, LX")); break;
3014         case 0x86: my_stprintf_s(buffer, buffer_len, _T("ADD A, (IX+(%d))"), debug_fetch8_rel()); break;
3015         case 0x8c: my_stprintf_s(buffer, buffer_len, _T("ADC A, HX")); break;
3016         case 0x8d: my_stprintf_s(buffer, buffer_len, _T("ADC A, LX")); break;
3017         case 0x8e: my_stprintf_s(buffer, buffer_len, _T("ADC A, (IX+(%d))"), debug_fetch8_rel()); break;
3018         case 0x94: my_stprintf_s(buffer, buffer_len, _T("SUB HX")); break;
3019         case 0x95: my_stprintf_s(buffer, buffer_len, _T("SUB LX")); break;
3020         case 0x96: my_stprintf_s(buffer, buffer_len, _T("SUB (IX+(%d))"), debug_fetch8_rel()); break;
3021         case 0x9c: my_stprintf_s(buffer, buffer_len, _T("SBC A, HX")); break;
3022         case 0x9d: my_stprintf_s(buffer, buffer_len, _T("SBC A, LX")); break;
3023         case 0x9e: my_stprintf_s(buffer, buffer_len, _T("SBC A, (IX+(%d))"), debug_fetch8_rel()); break;
3024         case 0xa4: my_stprintf_s(buffer, buffer_len, _T("AND HX")); break;
3025         case 0xa5: my_stprintf_s(buffer, buffer_len, _T("AND LX")); break;
3026         case 0xa6: my_stprintf_s(buffer, buffer_len, _T("AND (IX+(%d))"), debug_fetch8_rel()); break;
3027         case 0xac: my_stprintf_s(buffer, buffer_len, _T("XOR HX")); break;
3028         case 0xad: my_stprintf_s(buffer, buffer_len, _T("XOR LX")); break;
3029         case 0xae: my_stprintf_s(buffer, buffer_len, _T("XOR (IX+(%d))"), debug_fetch8_rel()); break;
3030         case 0xb4: my_stprintf_s(buffer, buffer_len, _T("OR HX")); break;
3031         case 0xb5: my_stprintf_s(buffer, buffer_len, _T("OR LX")); break;
3032         case 0xb6: my_stprintf_s(buffer, buffer_len, _T("OR (IX+(%d))"), debug_fetch8_rel()); break;
3033         case 0xbc: my_stprintf_s(buffer, buffer_len, _T("CP HX")); break;
3034         case 0xbd: my_stprintf_s(buffer, buffer_len, _T("CP LX")); break;
3035         case 0xbe: my_stprintf_s(buffer, buffer_len, _T("CP (IX+(%d))"), debug_fetch8_rel()); break;
3036         case 0xcb: dasm_ddcb(pc, buffer, buffer_len, first_symbol); break;
3037         case 0xe1: my_stprintf_s(buffer, buffer_len, _T("POP IX")); break;
3038         case 0xe3: my_stprintf_s(buffer, buffer_len, _T("EX (SP), IX")); break;
3039         case 0xe5: my_stprintf_s(buffer, buffer_len, _T("PUSH IX")); break;
3040         case 0xe9: my_stprintf_s(buffer, buffer_len, _T("JP (IX)")); break;
3041         case 0xf9: my_stprintf_s(buffer, buffer_len, _T("LD SP, IX")); break;
3042         default:   my_stprintf_s(buffer, buffer_len, _T("DB dd")); z80_dasm_ptr--; break;
3043         }
3044 }
3045
3046 void dasm_ed(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol)
3047 {
3048         uint8_t code = dasm_fetchop();
3049         
3050         switch(code) {
3051         case 0x40: my_stprintf_s(buffer, buffer_len, _T("IN B, (C)")); break;
3052         case 0x41: my_stprintf_s(buffer, buffer_len, _T("OUT (C), B")); break;
3053         case 0x42: my_stprintf_s(buffer, buffer_len, _T("SBC HL, BC")); break;
3054         case 0x43: my_stprintf_s(buffer, buffer_len, _T("LD (%s), BC"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
3055         case 0x44: my_stprintf_s(buffer, buffer_len, _T("NEG")); break;
3056         case 0x45: my_stprintf_s(buffer, buffer_len, _T("RETN")); break;
3057         case 0x46: my_stprintf_s(buffer, buffer_len, _T("IM 0")); break;
3058         case 0x47: my_stprintf_s(buffer, buffer_len, _T("LD I, A")); break;
3059         case 0x48: my_stprintf_s(buffer, buffer_len, _T("IN C, (C)")); break;
3060         case 0x49: my_stprintf_s(buffer, buffer_len, _T("OUT (C), C")); break;
3061         case 0x4a: my_stprintf_s(buffer, buffer_len, _T("ADC HL, BC")); break;
3062         case 0x4b: my_stprintf_s(buffer, buffer_len, _T("LD BC, (%s)"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
3063         case 0x4c: my_stprintf_s(buffer, buffer_len, _T("NEG")); break;
3064         case 0x4d: my_stprintf_s(buffer, buffer_len, _T("RETI")); break;
3065         case 0x4e: my_stprintf_s(buffer, buffer_len, _T("IM 0")); break;
3066         case 0x4f: my_stprintf_s(buffer, buffer_len, _T("LD R, A")); break;
3067         case 0x50: my_stprintf_s(buffer, buffer_len, _T("IN D, (C)")); break;
3068         case 0x51: my_stprintf_s(buffer, buffer_len, _T("OUT (C), D")); break;
3069         case 0x52: my_stprintf_s(buffer, buffer_len, _T("SBC HL, DE")); break;
3070         case 0x53: my_stprintf_s(buffer, buffer_len, _T("LD (%s), DE"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
3071         case 0x54: my_stprintf_s(buffer, buffer_len, _T("NEG")); break;
3072         case 0x55: my_stprintf_s(buffer, buffer_len, _T("RETN")); break;
3073         case 0x56: my_stprintf_s(buffer, buffer_len, _T("IM 1")); break;
3074         case 0x57: my_stprintf_s(buffer, buffer_len, _T("LD A, I")); break;
3075         case 0x58: my_stprintf_s(buffer, buffer_len, _T("IN E, (C)")); break;
3076         case 0x59: my_stprintf_s(buffer, buffer_len, _T("OUT (C), E")); break;
3077         case 0x5a: my_stprintf_s(buffer, buffer_len, _T("ADC HL, DE")); break;
3078         case 0x5b: my_stprintf_s(buffer, buffer_len, _T("LD DE, (%s)"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
3079         case 0x5c: my_stprintf_s(buffer, buffer_len, _T("NEG")); break;
3080         case 0x5d: my_stprintf_s(buffer, buffer_len, _T("RETI")); break;
3081         case 0x5e: my_stprintf_s(buffer, buffer_len, _T("IM 2")); break;
3082         case 0x5f: my_stprintf_s(buffer, buffer_len, _T("LD A, R")); break;
3083         case 0x60: my_stprintf_s(buffer, buffer_len, _T("IN H, (C)")); break;
3084         case 0x61: my_stprintf_s(buffer, buffer_len, _T("OUT (C), H")); break;
3085         case 0x62: my_stprintf_s(buffer, buffer_len, _T("SBC HL, HL")); break;
3086         case 0x63: my_stprintf_s(buffer, buffer_len, _T("LD (%s), HL"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
3087         case 0x64: my_stprintf_s(buffer, buffer_len, _T("NEG")); break;
3088         case 0x65: my_stprintf_s(buffer, buffer_len, _T("RETN")); break;
3089         case 0x66: my_stprintf_s(buffer, buffer_len, _T("IM 0")); break;
3090         case 0x67: my_stprintf_s(buffer, buffer_len, _T("RRD (HL)")); break;
3091         case 0x68: my_stprintf_s(buffer, buffer_len, _T("IN L, (C)")); break;
3092         case 0x69: my_stprintf_s(buffer, buffer_len, _T("OUT (C), L")); break;
3093         case 0x6a: my_stprintf_s(buffer, buffer_len, _T("ADC HL, HL")); break;
3094         case 0x6b: my_stprintf_s(buffer, buffer_len, _T("LD HL, (%s)"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
3095         case 0x6c: my_stprintf_s(buffer, buffer_len, _T("NEG")); break;
3096         case 0x6d: my_stprintf_s(buffer, buffer_len, _T("RETI")); break;
3097         case 0x6e: my_stprintf_s(buffer, buffer_len, _T("IM 0")); break;
3098         case 0x6f: my_stprintf_s(buffer, buffer_len, _T("RLD (HL)")); break;
3099         case 0x70: my_stprintf_s(buffer, buffer_len, _T("IN F, (C)")); break;
3100         case 0x71: my_stprintf_s(buffer, buffer_len, _T("OUT (C), 0")); break;
3101         case 0x72: my_stprintf_s(buffer, buffer_len, _T("SBC HL, SP")); break;
3102         case 0x73: my_stprintf_s(buffer, buffer_len, _T("LD (%s), SP"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
3103         case 0x74: my_stprintf_s(buffer, buffer_len, _T("NEG")); break;
3104         case 0x75: my_stprintf_s(buffer, buffer_len, _T("RETN")); break;
3105         case 0x76: my_stprintf_s(buffer, buffer_len, _T("IM 1")); break;
3106         case 0x78: my_stprintf_s(buffer, buffer_len, _T("IN A, (C)")); break;
3107         case 0x79: my_stprintf_s(buffer, buffer_len, _T("OUT (C), A")); break;
3108         case 0x7a: my_stprintf_s(buffer, buffer_len, _T("ADC HL, SP")); break;
3109         case 0x7b: my_stprintf_s(buffer, buffer_len, _T("LD SP, (%s)"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
3110         case 0x7c: my_stprintf_s(buffer, buffer_len, _T("NEG")); break;
3111         case 0x7d: my_stprintf_s(buffer, buffer_len, _T("RETI")); break;
3112         case 0x7e: my_stprintf_s(buffer, buffer_len, _T("IM 2")); break;
3113         case 0xa0: my_stprintf_s(buffer, buffer_len, _T("LDI")); break;
3114         case 0xa1: my_stprintf_s(buffer, buffer_len, _T("CPI")); break;
3115         case 0xa2: my_stprintf_s(buffer, buffer_len, _T("INI")); break;
3116         case 0xa3: my_stprintf_s(buffer, buffer_len, _T("OUTI")); break;
3117         case 0xa8: my_stprintf_s(buffer, buffer_len, _T("LDD")); break;
3118         case 0xa9: my_stprintf_s(buffer, buffer_len, _T("CPD")); break;
3119         case 0xaa: my_stprintf_s(buffer, buffer_len, _T("IND")); break;
3120         case 0xab: my_stprintf_s(buffer, buffer_len, _T("OUTD")); break;
3121         case 0xb0: my_stprintf_s(buffer, buffer_len, _T("LDIR")); break;
3122         case 0xb1: my_stprintf_s(buffer, buffer_len, _T("CPIR")); break;
3123         case 0xb2: my_stprintf_s(buffer, buffer_len, _T("INIR")); break;
3124         case 0xb3: my_stprintf_s(buffer, buffer_len, _T("OTIR")); break;
3125         case 0xb8: my_stprintf_s(buffer, buffer_len, _T("LDDR")); break;
3126         case 0xb9: my_stprintf_s(buffer, buffer_len, _T("CPDR")); break;
3127         case 0xba: my_stprintf_s(buffer, buffer_len, _T("INDR")); break;
3128         case 0xbb: my_stprintf_s(buffer, buffer_len, _T("OTDR")); break;
3129         default:   my_stprintf_s(buffer, buffer_len, _T("DB ed")); z80_dasm_ptr--; break;
3130         }
3131 }
3132
3133 void dasm_fd(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol)
3134 {
3135         uint8_t code = dasm_fetchop();
3136         int8_t ofs;
3137         
3138         switch(code) {
3139         case 0x09: my_stprintf_s(buffer, buffer_len, _T("ADD IY, BC")); break;
3140         case 0x19: my_stprintf_s(buffer, buffer_len, _T("ADD IY, DE")); break;
3141         case 0x21: my_stprintf_s(buffer, buffer_len, _T("LD IY, %s"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
3142         case 0x22: my_stprintf_s(buffer, buffer_len, _T("LD (%s), IY"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
3143         case 0x23: my_stprintf_s(buffer, buffer_len, _T("INC IY")); break;
3144         case 0x24: my_stprintf_s(buffer, buffer_len, _T("INC HY")); break;
3145         case 0x25: my_stprintf_s(buffer, buffer_len, _T("DEC HY")); break;
3146         case 0x26: my_stprintf_s(buffer, buffer_len, _T("LD HY, %02x"), debug_fetch8()); break;
3147         case 0x29: my_stprintf_s(buffer, buffer_len, _T("ADD IY, IY")); break;
3148         case 0x2a: my_stprintf_s(buffer, buffer_len, _T("LD IY, (%s)"), get_value_or_symbol(first_symbol, _T("%04x"), debug_fetch16())); break;
3149         case 0x2b: my_stprintf_s(buffer, buffer_len, _T("DEC IY")); break;
3150         case 0x2c: my_stprintf_s(buffer, buffer_len, _T("INC LY")); break;
3151         case 0x2d: my_stprintf_s(buffer, buffer_len, _T("DEC LY")); break;
3152         case 0x2e: my_stprintf_s(buffer, buffer_len, _T("LD LY, %02x"), debug_fetch8()); break;
3153         case 0x34: my_stprintf_s(buffer, buffer_len, _T("INC (IY+(%d))"), debug_fetch8_rel()); break;
3154         case 0x35: my_stprintf_s(buffer, buffer_len, _T("DEC (IY+(%d))"), debug_fetch8_rel()); break;
3155         case 0x36: ofs = debug_fetch8_rel(); my_stprintf_s(buffer, buffer_len, _T("LD (IY+(%d)), %02x"), ofs, debug_fetch8()); break;
3156         case 0x39: my_stprintf_s(buffer, buffer_len, _T("ADD IY, SP")); break;
3157         case 0x44: my_stprintf_s(buffer, buffer_len, _T("LD B, HY")); break;
3158         case 0x45: my_stprintf_s(buffer, buffer_len, _T("LD B, LY")); break;
3159         case 0x46: my_stprintf_s(buffer, buffer_len, _T("LD B, (IY+(%d))"), debug_fetch8_rel()); break;
3160         case 0x4c: my_stprintf_s(buffer, buffer_len, _T("LD C, HY")); break;
3161         case 0x4d: my_stprintf_s(buffer, buffer_len, _T("LD C, LY")); break;
3162         case 0x4e: my_stprintf_s(buffer, buffer_len, _T("LD C, (IY+(%d))"), debug_fetch8_rel()); break;
3163         case 0x54: my_stprintf_s(buffer, buffer_len, _T("LD D, HY")); break;
3164         case 0x55: my_stprintf_s(buffer, buffer_len, _T("LD D, LY")); break;
3165         case 0x56: my_stprintf_s(buffer, buffer_len, _T("LD D, (IY+(%d))"), debug_fetch8_rel()); break;
3166         case 0x5c: my_stprintf_s(buffer, buffer_len, _T("LD E, HY")); break;
3167         case 0x5d: my_stprintf_s(buffer, buffer_len, _T("LD E, LY")); break;
3168         case 0x5e: my_stprintf_s(buffer, buffer_len, _T("LD E, (IY+(%d))"), debug_fetch8_rel()); break;
3169         case 0x60: my_stprintf_s(buffer, buffer_len, _T("LD HY, B")); break;
3170         case 0x61: my_stprintf_s(buffer, buffer_len, _T("LD HY, C")); break;
3171         case 0x62: my_stprintf_s(buffer, buffer_len, _T("LD HY, D")); break;
3172         case 0x63: my_stprintf_s(buffer, buffer_len, _T("LD HY, E")); break;
3173         case 0x64: my_stprintf_s(buffer, buffer_len, _T("LD HY, HY")); break;
3174         case 0x65: my_stprintf_s(buffer, buffer_len, _T("LD HY, LY")); break;
3175         case 0x66: my_stprintf_s(buffer, buffer_len, _T("LD H, (IY+(%d))"), debug_fetch8_rel()); break;
3176         case 0x67: my_stprintf_s(buffer, buffer_len, _T("LD HY, A")); break;
3177         case 0x68: my_stprintf_s(buffer, buffer_len, _T("LD LY, B")); break;
3178         case 0x69: my_stprintf_s(buffer, buffer_len, _T("LD LY, C")); break;
3179         case 0x6a: my_stprintf_s(buffer, buffer_len, _T("LD LY, D")); break;
3180         case 0x6b: my_stprintf_s(buffer, buffer_len, _T("LD LY, E")); break;
3181         case 0x6c: my_stprintf_s(buffer, buffer_len, _T("LD LY, HY")); break;
3182         case 0x6d: my_stprintf_s(buffer, buffer_len, _T("LD LY, LY")); break;
3183         case 0x6e: my_stprintf_s(buffer, buffer_len, _T("LD L, (IY+(%d))"), debug_fetch8_rel()); break;
3184         case 0x6f: my_stprintf_s(buffer, buffer_len, _T("LD LY, A")); break;
3185         case 0x70: my_stprintf_s(buffer, buffer_len, _T("LD (IY+(%d)), B"), debug_fetch8_rel()); break;
3186         case 0x71: my_stprintf_s(buffer, buffer_len, _T("LD (IY+(%d)), C"), debug_fetch8_rel()); break;
3187         case 0x72: my_stprintf_s(buffer, buffer_len, _T("LD (IY+(%d)), D"), debug_fetch8_rel()); break;
3188         case 0x73: my_stprintf_s(buffer, buffer_len, _T("LD (IY+(%d)), E"), debug_fetch8_rel()); break;
3189         case 0x74: my_stprintf_s(buffer, buffer_len, _T("LD (IY+(%d)), H"), debug_fetch8_rel()); break;
3190         case 0x75: my_stprintf_s(buffer, buffer_len, _T("LD (IY+(%d)), L"), debug_fetch8_rel()); break;
3191         case 0x77: my_stprintf_s(buffer, buffer_len, _T("LD (IY+(%d)), A"), debug_fetch8_rel()); break;
3192         case 0x7c: my_stprintf_s(buffer, buffer_len, _T("LD A, HY")); break;
3193         case 0x7d: my_stprintf_s(buffer, buffer_len, _T("LD A, LY")); break;
3194         case 0x7e: my_stprintf_s(buffer, buffer_len, _T("LD A, (IY+(%d))"), debug_fetch8_rel()); break;
3195         case 0x84: my_stprintf_s(buffer, buffer_len, _T("ADD A, HY")); break;
3196         case 0x85: my_stprintf_s(buffer, buffer_len, _T("ADD A, LY")); break;
3197         case 0x86: my_stprintf_s(buffer, buffer_len, _T("ADD A, (IY+(%d))"), debug_fetch8_rel()); break;
3198         case 0x8c: my_stprintf_s(buffer, buffer_len, _T("ADC A, HY")); break;
3199         case 0x8d: my_stprintf_s(buffer, buffer_len, _T("ADC A, LY")); break;
3200         case 0x8e: my_stprintf_s(buffer, buffer_len, _T("ADC A, (IY+(%d))"), debug_fetch8_rel()); break;
3201         case 0x94: my_stprintf_s(buffer, buffer_len, _T("SUB HY")); break;
3202         case 0x95: my_stprintf_s(buffer, buffer_len, _T("SUB LY")); break;
3203         case 0x96: my_stprintf_s(buffer, buffer_len, _T("SUB (IY+(%d))"), debug_fetch8_rel()); break;
3204         case 0x9c: my_stprintf_s(buffer, buffer_len, _T("SBC A, HY")); break;
3205         case 0x9d: my_stprintf_s(buffer, buffer_len, _T("SBC A, LY")); break;
3206         case 0x9e: my_stprintf_s(buffer, buffer_len, _T("SBC A, (IY+(%d))"), debug_fetch8_rel()); break;
3207         case 0xa4: my_stprintf_s(buffer, buffer_len, _T("AND HY")); break;
3208         case 0xa5: my_stprintf_s(buffer, buffer_len, _T("AND LY")); break;
3209         case 0xa6: my_stprintf_s(buffer, buffer_len, _T("AND (IY+(%d))"), debug_fetch8_rel()); break;
3210         case 0xac: my_stprintf_s(buffer, buffer_len, _T("XOR HY")); break;
3211         case 0xad: my_stprintf_s(buffer, buffer_len, _T("XOR LY")); break;
3212         case 0xae: my_stprintf_s(buffer, buffer_len, _T("XOR (IY+(%d))"), debug_fetch8_rel()); break;
3213         case 0xb4: my_stprintf_s(buffer, buffer_len, _T("OR HY")); break;
3214         case 0xb5: my_stprintf_s(buffer, buffer_len, _T("OR LY")); break;
3215         case 0xb6: my_stprintf_s(buffer, buffer_len, _T("OR (IY+(%d))"), debug_fetch8_rel()); break;
3216         case 0xbc: my_stprintf_s(buffer, buffer_len, _T("CP HY")); break;
3217         case 0xbd: my_stprintf_s(buffer, buffer_len, _T("CP LY")); break;
3218         case 0xbe: my_stprintf_s(buffer, buffer_len, _T("CP (IY+(%d))"), debug_fetch8_rel()); break;
3219         case 0xcb: dasm_fdcb(pc, buffer, buffer_len, first_symbol); break;
3220         case 0xe1: my_stprintf_s(buffer, buffer_len, _T("POP IY")); break;
3221         case 0xe3: my_stprintf_s(buffer, buffer_len, _T("EX (SP), IY")); break;
3222         case 0xe5: my_stprintf_s(buffer, buffer_len, _T("PUSH IY")); break;
3223         case 0xe9: my_stprintf_s(buffer, buffer_len, _T("JP (IY)")); break;
3224         case 0xf9: my_stprintf_s(buffer, buffer_len, _T("LD SP, IY")); break;
3225         default:   my_stprintf_s(buffer, buffer_len, _T("DB fd")); z80_dasm_ptr--; break;
3226         }
3227 }
3228
3229 static void dasm_ddcb(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol)
3230 {
3231         int8_t ofs = debug_fetch8_rel();
3232         uint8_t code = debug_fetch8();
3233         
3234         switch(code) {
3235         case 0x00: my_stprintf_s(buffer, buffer_len, _T("RLC B=(IX+(%d))"), ofs); break;
3236         case 0x01: my_stprintf_s(buffer, buffer_len, _T("RLC C=(IX+(%d))"), ofs); break;
3237         case 0x02: my_stprintf_s(buffer, buffer_len, _T("RLC D=(IX+(%d))"), ofs); break;
3238         case 0x03: my_stprintf_s(buffer, buffer_len, _T("RLC E=(IX+(%d))"), ofs); break;
3239         case 0x04: my_stprintf_s(buffer, buffer_len, _T("RLC H=(IX+(%d))"), ofs); break;
3240         case 0x05: my_stprintf_s(buffer, buffer_len, _T("RLC L=(IX+(%d))"), ofs); break;
3241         case 0x06: my_stprintf_s(buffer, buffer_len, _T("RLC (IX+(%d))"), ofs); break;
3242         case 0x07: my_stprintf_s(buffer, buffer_len, _T("RLC A=(IX+(%d))"), ofs); break;
3243         case 0x08: my_stprintf_s(buffer, buffer_len, _T("RRC B=(IX+(%d))"), ofs); break;
3244         case 0x09: my_stprintf_s(buffer, buffer_len, _T("RRC C=(IX+(%d))"), ofs); break;
3245         case 0x0a: my_stprintf_s(buffer, buffer_len, _T("RRC D=(IX+(%d))"), ofs); break;
3246         case 0x0b: my_stprintf_s(buffer, buffer_len, _T("RRC E=(IX+(%d))"), ofs); break;
3247         case 0x0c: my_stprintf_s(buffer, buffer_len, _T("RRC H=(IX+(%d))"), ofs); break;
3248         case 0x0d: my_stprintf_s(buffer, buffer_len, _T("RRC L=(IX+(%d))"), ofs); break;
3249         case 0x0e: my_stprintf_s(buffer, buffer_len, _T("RRC (IX+(%d))"), ofs); break;
3250         case 0x0f: my_stprintf_s(buffer, buffer_len, _T("RRC A=(IX+(%d))"), ofs); break;
3251         case 0x10: my_stprintf_s(buffer, buffer_len, _T("RL B=(IX+(%d))"), ofs); break;
3252         case 0x11: my_stprintf_s(buffer, buffer_len, _T("RL C=(IX+(%d))"), ofs); break;
3253         case 0x12: my_stprintf_s(buffer, buffer_len, _T("RL D=(IX+(%d))"), ofs); break;
3254         case 0x13: my_stprintf_s(buffer, buffer_len, _T("RL E=(IX+(%d))"), ofs); break;
3255         case 0x14: my_stprintf_s(buffer, buffer_len, _T("RL H=(IX+(%d))"), ofs); break;
3256         case 0x15: my_stprintf_s(buffer, buffer_len, _T("RL L=(IX+(%d))"), ofs); break;
3257         case 0x16: my_stprintf_s(buffer, buffer_len, _T("RL (IX+(%d))"), ofs); break;
3258         case 0x17: my_stprintf_s(buffer, buffer_len, _T("RL A=(IX+(%d))"), ofs); break;
3259         case 0x18: my_stprintf_s(buffer, buffer_len, _T("RR B=(IX+(%d))"), ofs); break;
3260         case 0x19: my_stprintf_s(buffer, buffer_len, _T("RR C=(IX+(%d))"), ofs); break;
3261         case 0x1a: my_stprintf_s(buffer, buffer_len, _T("RR D=(IX+(%d))"), ofs); break;
3262         case 0x1b: my_stprintf_s(buffer, buffer_len, _T("RR E=(IX+(%d))"), ofs); break;
3263         case 0x1c: my_stprintf_s(buffer, buffer_len, _T("RR H=(IX+(%d))"), ofs); break;
3264         case 0x1d: my_stprintf_s(buffer, buffer_len, _T("RR L=(IX+(%d))"), ofs); break;
3265         case 0x1e: my_stprintf_s(buffer, buffer_len, _T("RR (IX+(%d))"), ofs); break;
3266         case 0x1f: my_stprintf_s(buffer, buffer_len, _T("RR A=(IX+(%d))"), ofs); break;
3267         case 0x20: my_stprintf_s(buffer, buffer_len, _T("SLA B=(IX+(%d))"), ofs); break;
3268         case 0x21: my_stprintf_s(buffer, buffer_len, _T("SLA C=(IX+(%d))"), ofs); break;
3269         case 0x22: my_stprintf_s(buffer, buffer_len, _T("SLA D=(IX+(%d))"), ofs); break;
3270         case 0x23: my_stprintf_s(buffer, buffer_len, _T("SLA E=(IX+(%d))"), ofs); break;
3271         case 0x24: my_stprintf_s(buffer, buffer_len, _T("SLA H=(IX+(%d))"), ofs); break;
3272         case 0x25: my_stprintf_s(buffer, buffer_len, _T("SLA L=(IX+(%d))"), ofs); break;
3273         case 0x26: my_stprintf_s(buffer, buffer_len, _T("SLA (IX+(%d))"), ofs); break;
3274         case 0x27: my_stprintf_s(buffer, buffer_len, _T("SLA A=(IX+(%d))"), ofs); break;
3275         case 0x28: my_stprintf_s(buffer, buffer_len, _T("SRA B=(IX+(%d))"), ofs); break;
3276         case 0x29: my_stprintf_s(buffer, buffer_len, _T("SRA C=(IX+(%d))"), ofs); break;
3277         case 0x2a: my_stprintf_s(buffer, buffer_len, _T("SRA D=(IX+(%d))"), ofs); break;
3278         case 0x2b: my_stprintf_s(buffer, buffer_len, _T("SRA E=(IX+(%d))"), ofs); break;
3279         case 0x2c: my_stprintf_s(buffer, buffer_len, _T("SRA H=(IX+(%d))"), ofs); break;
3280         case 0x2d: my_stprintf_s(buffer, buffer_len, _T("SRA L=(IX+(%d))"), ofs); break;
3281         case 0x2e: my_stprintf_s(buffer, buffer_len, _T("SRA (IX+(%d))"), ofs); break;
3282         case 0x2f: my_stprintf_s(buffer, buffer_len, _T("SRA A=(IX+(%d))"), ofs); break;
3283         case 0x30: my_stprintf_s(buffer, buffer_len, _T("SLL B=(IX+(%d))"), ofs); break;
3284         case 0x31: my_stprintf_s(buffer, buffer_len, _T("SLL C=(IX+(%d))"), ofs); break;
3285         case 0x32: my_stprintf_s(buffer, buffer_len, _T("SLL D=(IX+(%d))"), ofs); break;
3286         case 0x33: my_stprintf_s(buffer, buffer_len, _T("SLL E=(IX+(%d))"), ofs); break;
3287         case 0x34: my_stprintf_s(buffer, buffer_len, _T("SLL H=(IX+(%d))"), ofs); break;
3288         case 0x35: my_stprintf_s(buffer, buffer_len, _T("SLL L=(IX+(%d))"), ofs); break;
3289         case 0x36: my_stprintf_s(buffer, buffer_len, _T("SLL (IX+(%d))"), ofs); break;
3290         case 0x37: my_stprintf_s(buffer, buffer_len, _T("SLL A=(IX+(%d))"), ofs); break;
3291         case 0x38: my_stprintf_s(buffer, buffer_len, _T("SRL B=(IX+(%d))"), ofs); break;
3292         case 0x39: my_stprintf_s(buffer, buffer_len, _T("SRL C=(IX+(%d))"), ofs); break;
3293         case 0x3a: my_stprintf_s(buffer, buffer_len, _T("SRL D=(IX+(%d))"), ofs); break;
3294         case 0x3b: my_stprintf_s(buffer, buffer_len, _T("SRL E=(IX+(%d))"), ofs); break;
3295         case 0x3c: my_stprintf_s(buffer, buffer_len, _T("SRL H=(IX+(%d))"), ofs); break;
3296         case 0x3d: my_stprintf_s(buffer, buffer_len, _T("SRL L=(IX+(%d))"), ofs); break;
3297         case 0x3e: my_stprintf_s(buffer, buffer_len, _T("SRL (IX+(%d))"), ofs); break;
3298         case 0x3f: my_stprintf_s(buffer, buffer_len, _T("SRL A=(IX+(%d))"), ofs); break;
3299         case 0x40: my_stprintf_s(buffer, buffer_len, _T("BIT 0, B=(IX+(%d))"), ofs); break;
3300         case 0x41: my_stprintf_s(buffer, buffer_len, _T("BIT 0, C=(IX+(%d))"), ofs); break;
3301         case 0x42: my_stprintf_s(buffer, buffer_len, _T("BIT 0, D=(IX+(%d))"), ofs); break;
3302         case 0x43: my_stprintf_s(buffer, buffer_len, _T("BIT 0, E=(IX+(%d))"), ofs); break;
3303         case 0x44: my_stprintf_s(buffer, buffer_len, _T("BIT 0, H=(IX+(%d))"), ofs); break;
3304         case 0x45: my_stprintf_s(buffer, buffer_len, _T("BIT 0, L=(IX+(%d))"), ofs); break;
3305         case 0x46: my_stprintf_s(buffer, buffer_len, _T("BIT 0, (IX+(%d))"), ofs); break;
3306         case 0x47: my_stprintf_s(buffer, buffer_len, _T("BIT 0, A=(IX+(%d))"), ofs); break;
3307         case 0x48: my_stprintf_s(buffer, buffer_len, _T("BIT 1, B=(IX+(%d))"), ofs); break;
3308         case 0x49: my_stprintf_s(buffer, buffer_len, _T("BIT 1, C=(IX+(%d))"), ofs); break;
3309         case 0x4a: my_stprintf_s(buffer, buffer_len, _T("BIT 1, D=(IX+(%d))"), ofs); break;
3310         case 0x4b: my_stprintf_s(buffer, buffer_len, _T("BIT 1, E=(IX+(%d))"), ofs); break;
3311         case 0x4c: my_stprintf_s(buffer, buffer_len, _T("BIT 1, H=(IX+(%d))"), ofs); break;
3312         case 0x4d: my_stprintf_s(buffer, buffer_len, _T("BIT 1, L=(IX+(%d))"), ofs); break;
3313         case 0x4e: my_stprintf_s(buffer, buffer_len, _T("BIT 1, (IX+(%d))"), ofs); break;
3314         case 0x4f: my_stprintf_s(buffer, buffer_len, _T("BIT 1, A=(IX+(%d))"), ofs); break;
3315         case 0x50: my_stprintf_s(buffer, buffer_len, _T("BIT 2, B=(IX+(%d))"), ofs); break;
3316         case 0x51: my_stprintf_s(buffer, buffer_len, _T("BIT 2, C=(IX+(%d))"), ofs); break;
3317         case 0x52: my_stprintf_s(buffer, buffer_len, _T("BIT 2, D=(IX+(%d))"), ofs); break;
3318         case 0x53: my_stprintf_s(buffer, buffer_len, _T("BIT 2, E=(IX+(%d))"), ofs); break;
3319         case 0x54: my_stprintf_s(buffer, buffer_len, _T("BIT 2, H=(IX+(%d))"), ofs); break;
3320         case 0x55: my_stprintf_s(buffer, buffer_len, _T("BIT 2, L=(IX+(%d))"), ofs); break;
3321         case 0x56: my_stprintf_s(buffer, buffer_len, _T("BIT 2, (IX+(%d))"), ofs); break;
3322         case 0x57: my_stprintf_s(buffer, buffer_len, _T("BIT 2, A=(IX+(%d))"), ofs); break;
3323         case 0x58: my_stprintf_s(buffer, buffer_len, _T("BIT 3, B=(IX+(%d))"), ofs); break;
3324         case 0x59: my_stprintf_s(buffer, buffer_len, _T("BIT 3, C=(IX+(%d))"), ofs); break;
3325         case 0x5a: my_stprintf_s(buffer, buffer_len, _T("BIT 3, D=(IX+(%d))"), ofs); break;
3326         case 0x5b: my_stprintf_s(buffer, buffer_len, _T("BIT 3, E=(IX+(%d))"), ofs); break;
3327         case 0x5c: my_stprintf_s(buffer, buffer_len, _T("BIT 3, H=(IX+(%d))"), ofs); break;
3328         case 0x5d: my_stprintf_s(buffer, buffer_len, _T("BIT 3, L=(IX+(%d))"), ofs); break;
3329         case 0x5e: my_stprintf_s(buffer, buffer_len, _T("BIT 3, (IX+(%d))"), ofs); break;
3330         case 0x5f: my_stprintf_s(buffer, buffer_len, _T("BIT 3, A=(IX+(%d))"), ofs); break;
3331         case 0x60: my_stprintf_s(buffer, buffer_len, _T("BIT 4, B=(IX+(%d))"), ofs); break;
3332         case 0x61: my_stprintf_s(buffer, buffer_len, _T("BIT 4, C=(IX+(%d))"), ofs); break;
3333         case 0x62: my_stprintf_s(buffer, buffer_len, _T("BIT 4, D=(IX+(%d))"), ofs); break;
3334         case 0x63: my_stprintf_s(buffer, buffer_len, _T("BIT 4, E=(IX+(%d))"), ofs); break;
3335         case 0x64: my_stprintf_s(buffer, buffer_len, _T("BIT 4, H=(IX+(%d))"), ofs); break;
3336         case 0x65: my_stprintf_s(buffer, buffer_len, _T("BIT 4, L=(IX+(%d))"), ofs); break;
3337         case 0x66: my_stprintf_s(buffer, buffer_len, _T("BIT 4, (IX+(%d))"), ofs); break;
3338         case 0x67: my_stprintf_s(buffer, buffer_len, _T("BIT 4, A=(IX+(%d))"), ofs); break;
3339         case 0x68: my_stprintf_s(buffer, buffer_len, _T("BIT 5, B=(IX+(%d))"), ofs); break;
3340         case 0x69: my_stprintf_s(buffer, buffer_len, _T("BIT 5, C=(IX+(%d))"), ofs); break;
3341         case 0x6a: my_stprintf_s(buffer, buffer_len, _T("BIT 5, D=(IX+(%d))"), ofs); break;
3342         case 0x6b: my_stprintf_s(buffer, buffer_len, _T("BIT 5, E=(IX+(%d))"), ofs); break;
3343         case 0x6c: my_stprintf_s(buffer, buffer_len, _T("BIT 5, H=(IX+(%d))"), ofs); break;
3344         case 0x6d: my_stprintf_s(buffer, buffer_len, _T("BIT 5, L=(IX+(%d))"), ofs); break;
3345         case 0x6e: my_stprintf_s(buffer, buffer_len, _T("BIT 5, (IX+(%d))"), ofs); break;
3346         case 0x6f: my_stprintf_s(buffer, buffer_len, _T("BIT 5, A=(IX+(%d))"), ofs); break;
3347         case 0x70: my_stprintf_s(buffer, buffer_len, _T("BIT 6, B=(IX+(%d))"), ofs); break;
3348         case 0x71: my_stprintf_s(buffer, buffer_len, _T("BIT 6, C=(IX+(%d))"), ofs); break;
3349         case 0x72: my_stprintf_s(buffer, buffer_len, _T("BIT 6, D=(IX+(%d))"), ofs); break;
3350         case 0x73: my_stprintf_s(buffer, buffer_len, _T("BIT 6, E=(IX+(%d))"), ofs); break;
3351         case 0x74: my_stprintf_s(buffer, buffer_len, _T("BIT 6, H=(IX+(%d))"), ofs); break;
3352         case 0x75: my_stprintf_s(buffer, buffer_len, _T("BIT 6, L=(IX+(%d))"), ofs); break;
3353         case 0x76: my_stprintf_s(buffer, buffer_len, _T("BIT 6, (IX+(%d))"), ofs); break;
3354         case 0x77: my_stprintf_s(buffer, buffer_len, _T("BIT 6, A=(IX+(%d))"), ofs); break;
3355         case 0x78: my_stprintf_s(buffer, buffer_len, _T("BIT 7, B=(IX+(%d))"), ofs); break;
3356         case 0x79: my_stprintf_s(buffer, buffer_len, _T("BIT 7, C=(IX+(%d))"), ofs); break;
3357         case 0x7a: my_stprintf_s(buffer, buffer_len, _T("BIT 7, D=(IX+(%d))"), ofs); break;
3358         case 0x7b: my_stprintf_s(buffer, buffer_len, _T("BIT 7, E=(IX+(%d))"), ofs); break;
3359         case 0x7c: my_stprintf_s(buffer, buffer_len, _T("BIT 7, H=(IX+(%d))"), ofs); break;
3360         case 0x7d: my_stprintf_s(buffer, buffer_len, _T("BIT 7, L=(IX+(%d))"), ofs); break;
3361         case 0x7e: my_stprintf_s(buffer, buffer_len, _T("BIT 7, (IX+(%d))"), ofs); break;
3362         case 0x7f: my_stprintf_s(buffer, buffer_len, _T("BIT 7, A=(IX+(%d))"), ofs); break;
3363         case 0x80: my_stprintf_s(buffer, buffer_len, _T("RES 0, B=(IX+(%d))"), ofs); break;
3364         case 0x81: my_stprintf_s(buffer, buffer_len, _T("RES 0, C=(IX+(%d))"), ofs); break;
3365         case 0x82: my_stprintf_s(buffer, buffer_len, _T("RES 0, D=(IX+(%d))"), ofs); break;
3366         case 0x83: my_stprintf_s(buffer, buffer_len, _T("RES 0, E=(IX+(%d))"), ofs); break;
3367         case 0x84: my_stprintf_s(buffer, buffer_len, _T("RES 0, H=(IX+(%d))"), ofs); break;
3368         case 0x85: my_stprintf_s(buffer, buffer_len, _T("RES 0, L=(IX+(%d))"), ofs); break;
3369         case 0x86: my_stprintf_s(buffer, buffer_len, _T("RES 0, (IX+(%d))"), ofs); break;
3370         case 0x87: my_stprintf_s(buffer, buffer_len, _T("RES 0, A=(IX+(%d))"), ofs); break;
3371         case 0x88: my_stprintf_s(buffer, buffer_len, _T("RES 1, B=(IX+(%d))"), ofs); break;
3372         case 0x89: my_stprintf_s(buffer, buffer_len, _T("RES 1, C=(IX+(%d))"), ofs); break;
3373         case 0x8a: my_stprintf_s(buffer, buffer_len, _T("RES 1, D=(IX+(%d))"), ofs); break;
3374         case 0x8b: my_stprintf_s(buffer, buffer_len, _T("RES 1, E=(IX+(%d))"), ofs); break;
3375         case 0x8c: my_stprintf_s(buffer, buffer_len, _T("RES 1, H=(IX+(%d))"), ofs); break;
3376         case 0x8d: my_stprintf_s(buffer, buffer_len, _T("RES 1, L=(IX+(%d))"), ofs); break;
3377         case 0x8e: my_stprintf_s(buffer, buffer_len, _T("RES 1, (IX+(%d))"), ofs); break;
3378         case 0x8f: my_stprintf_s(buffer, buffer_len, _T("RES 1, A=(IX+(%d))"), ofs); break;
3379         case 0x90: my_stprintf_s(buffer, buffer_len, _T("RES 2, B=(IX+(%d))"), ofs); break;
3380         case 0x91: my_stprintf_s(buffer, buffer_len, _T("RES 2, C=(IX+(%d))"), ofs); break;
3381         case 0x92: my_stprintf_s(buffer, buffer_len, _T("RES 2, D=(IX+(%d))"), ofs); break;
3382         case 0x93: my_stprintf_s(buffer, buffer_len, _T("RES 2, E=(IX+(%d))"), ofs); break;
3383         case 0x94: my_stprintf_s(buffer, buffer_len, _T("RES 2, H=(IX+(%d))"), ofs); break;
3384         case 0x95: my_stprintf_s(buffer, buffer_len, _T("RES 2, L=(IX+(%d))"), ofs); break;
3385         case 0x96: my_stprintf_s(buffer, buffer_len, _T("RES 2, (IX+(%d))"), ofs); break;
3386         case 0x97: my_stprintf_s(buffer, buffer_len, _T("RES 2, A=(IX+(%d))"), ofs); break;
3387         case 0x98: my_stprintf_s(buffer, buffer_len, _T("RES 3, B=(IX+(%d))"), ofs); break;
3388         case 0x99: my_stprintf_s(buffer, buffer_len, _T("RES 3, C=(IX+(%d))"), ofs); break;
3389         case 0x9a: my_stprintf_s(buffer, buffer_len, _T("RES 3, D=(IX+(%d))"), ofs); break;
3390         case 0x9b: my_stprintf_s(buffer, buffer_len, _T("RES 3, E=(IX+(%d))"), ofs); break;
3391         case 0x9c: my_stprintf_s(buffer, buffer_len, _T("RES 3, H=(IX+(%d))"), ofs); break;
3392         case 0x9d: my_stprintf_s(buffer, buffer_len, _T("RES 3, L=(IX+(%d))"), ofs); break;
3393         case 0x9e: my_stprintf_s(buffer, buffer_len, _T("RES 3, (IX+(%d))"), ofs); break;
3394         case 0x9f: my_stprintf_s(buffer, buffer_len, _T("RES 3, A=(IX+(%d))"), ofs); break;
3395         case 0xa0: my_stprintf_s(buffer, buffer_len, _T("RES 4, B=(IX+(%d))"), ofs); break;
3396         case 0xa1: my_stprintf_s(buffer, buffer_len, _T("RES 4, C=(IX+(%d))"), ofs); break;
3397         case 0xa2: my_stprintf_s(buffer, buffer_len, _T("RES 4, D=(IX+(%d))"), ofs); break;
3398         case 0xa3: my_stprintf_s(buffer, buffer_len, _T("RES 4, E=(IX+(%d))"), ofs); break;
3399         case 0xa4: my_stprintf_s(buffer, buffer_len, _T("RES 4, H=(IX+(%d))"), ofs); break;
3400         case 0xa5: my_stprintf_s(buffer, buffer_len, _T("RES 4, L=(IX+(%d))"), ofs); break;
3401         case 0xa6: my_stprintf_s(buffer, buffer_len, _T("RES 4, (IX+(%d))"), ofs); break;
3402         case 0xa7: my_stprintf_s(buffer, buffer_len, _T("RES 4, A=(IX+(%d))"), ofs); break;
3403         case 0xa8: my_stprintf_s(buffer, buffer_len, _T("RES 5, B=(IX+(%d))"), ofs); break;
3404         case 0xa9: my_stprintf_s(buffer, buffer_len, _T("RES 5, C=(IX+(%d))"), ofs); break;
3405         case 0xaa: my_stprintf_s(buffer, buffer_len, _T("RES 5, D=(IX+(%d))"), ofs); break;
3406         case 0xab: my_stprintf_s(buffer, buffer_len, _T("RES 5, E=(IX+(%d))"), ofs); break;
3407         case 0xac: my_stprintf_s(buffer, buffer_len, _T("RES 5, H=(IX+(%d))"), ofs); break;
3408         case 0xad: my_stprintf_s(buffer, buffer_len, _T("RES 5, L=(IX+(%d))"), ofs); break;
3409         case 0xae: my_stprintf_s(buffer, buffer_len, _T("RES 5, (IX+(%d))"), ofs); break;
3410         case 0xaf: my_stprintf_s(buffer, buffer_len, _T("RES 5, A=(IX+(%d))"), ofs); break;
3411         case 0xb0: my_stprintf_s(buffer, buffer_len, _T("RES 6, B=(IX+(%d))"), ofs); break;
3412         case 0xb1: my_stprintf_s(buffer, buffer_len, _T("RES 6, C=(IX+(%d))"), ofs); break;
3413         case 0xb2: my_stprintf_s(buffer, buffer_len, _T("RES 6, D=(IX+(%d))"), ofs); break;
3414         case 0xb3: my_stprintf_s(buffer, buffer_len, _T("RES 6, E=(IX+(%d))"), ofs); break;
3415         case 0xb4: my_stprintf_s(buffer, buffer_len, _T("RES 6, H=(IX+(%d))"), ofs); break;
3416         case 0xb5: my_stprintf_s(buffer, buffer_len, _T("RES 6, L=(IX+(%d))"), ofs); break;
3417         case 0xb6: my_stprintf_s(buffer, buffer_len, _T("RES 6, (IX+(%d))"), ofs); break;
3418         case 0xb7: my_stprintf_s(buffer, buffer_len, _T("RES 6, A=(IX+(%d))"), ofs); break;
3419         case 0xb8: my_stprintf_s(buffer, buffer_len, _T("RES 7, B=(IX+(%d))"), ofs); break;
3420         case 0xb9: my_stprintf_s(buffer, buffer_len, _T("RES 7, C=(IX+(%d))"), ofs); break;
3421         case 0xba: my_stprintf_s(buffer, buffer_len, _T("RES 7, D=(IX+(%d))"), ofs); break;
3422         case 0xbb: my_stprintf_s(buffer, buffer_len, _T("RES 7, E=(IX+(%d))"), ofs); break;
3423         case 0xbc: my_stprintf_s(buffer, buffer_len, _T("RES 7, H=(IX+(%d))"), ofs); break;
3424         case 0xbd: my_stprintf_s(buffer, buffer_len, _T("RES 7, L=(IX+(%d))"), ofs); break;
3425         case 0xbe: my_stprintf_s(buffer, buffer_len, _T("RES 7, (IX+(%d))"), ofs); break;
3426         case 0xbf: my_stprintf_s(buffer, buffer_len, _T("RES 7, A=(IX+(%d))"), ofs); break;
3427         case 0xc0: my_stprintf_s(buffer, buffer_len, _T("SET 0, B=(IX+(%d))"), ofs); break;
3428         case 0xc1: my_stprintf_s(buffer, buffer_len, _T("SET 0, C=(IX+(%d))"), ofs); break;
3429         case 0xc2: my_stprintf_s(buffer, buffer_len, _T("SET 0, D=(IX+(%d))"), ofs); break;
3430         case 0xc3: my_stprintf_s(buffer, buffer_len, _T("SET 0, E=(IX+(%d))"), ofs); break;
3431         case 0xc4: my_stprintf_s(buffer, buffer_len, _T("SET 0, H=(IX+(%d))"), ofs); break;
3432         case 0xc5: my_stprintf_s(buffer, buffer_len, _T("SET 0, L=(IX+(%d))"), ofs); break;
3433         case 0xc6: my_stprintf_s(buffer, buffer_len, _T("SET 0, (IX+(%d))"), ofs); break;
3434         case 0xc7: my_stprintf_s(buffer, buffer_len, _T("SET 0, A=(IX+(%d))"), ofs); break;
3435         case 0xc8: my_stprintf_s(buffer, buffer_len, _T("SET 1, B=(IX+(%d))"), ofs); break;
3436         case 0xc9: my_stprintf_s(buffer, buffer_len, _T("SET 1, C=(IX+(%d))"), ofs); break;
3437         case 0xca: my_stprintf_s(buffer, buffer_len, _T("SET 1, D=(IX+(%d))"), ofs); break;
3438         case 0xcb: my_stprintf_s(buffer, buffer_len, _T("SET 1, E=(IX+(%d))"), ofs); break;
3439         case 0xcc: my_stprintf_s(buffer, buffer_len, _T("SET 1, H=(IX+(%d))"), ofs); break;
3440         case 0xcd: my_stprintf_s(buffer, buffer_len, _T("SET 1, L=(IX+(%d))"), ofs); break;
3441         case 0xce: my_stprintf_s(buffer, buffer_len, _T("SET 1, (IX+(%d))"), ofs); break;
3442         case 0xcf: my_stprintf_s(buffer, buffer_len, _T("SET 1, A=(IX+(%d))"), ofs); break;
3443         case 0xd0: my_stprintf_s(buffer, buffer_len, _T("SET 2, B=(IX+(%d))"), ofs); break;
3444         case 0xd1: my_stprintf_s(buffer, buffer_len, _T("SET 2, C=(IX+(%d))"), ofs); break;
3445         case 0xd2: my_stprintf_s(buffer, buffer_len, _T("SET 2, D=(IX+(%d))"), ofs); break;
3446         case 0xd3: my_stprintf_s(buffer, buffer_len, _T("SET 2, E=(IX+(%d))"), ofs); break;
3447         case 0xd4: my_stprintf_s(buffer, buffer_len, _T("SET 2, H=(IX+(%d))"), ofs); break;
3448         case 0xd5: my_stprintf_s(buffer, buffer_len, _T("SET 2, L=(IX+(%d))"), ofs); break;
3449         case 0xd6: my_stprintf_s(buffer, buffer_len, _T("SET 2, (IX+(%d))"), ofs); break;
3450         case 0xd7: my_stprintf_s(buffer, buffer_len, _T("SET 2, A=(IX+(%d))"), ofs); break;
3451         case 0xd8: my_stprintf_s(buffer, buffer_len, _T("SET 3, B=(IX+(%d))"), ofs); break;
3452         case 0xd9: my_stprintf_s(buffer, buffer_len, _T("SET 3, C=(IX+(%d))"), ofs); break;
3453         case 0xda: my_stprintf_s(buffer, buffer_len, _T("SET 3, D=(IX+(%d))"), ofs); break;
3454         case 0xdb: my_stprintf_s(buffer, buffer_len, _T("SET 3, E=(IX+(%d))"), ofs); break;
3455         case 0xdc: my_stprintf_s(buffer, buffer_len, _T("SET 3, H=(IX+(%d))"), ofs); break;
3456         case 0xdd: my_stprintf_s(buffer, buffer_len, _T("SET 3, L=(IX+(%d))"), ofs); break;
3457         case 0xde: my_stprintf_s(buffer, buffer_len, _T("SET 3, (IX+(%d))"), ofs); break;
3458         case 0xdf: my_stprintf_s(buffer, buffer_len, _T("SET 3, A=(IX+(%d))"), ofs); break;
3459         case 0xe0: my_stprintf_s(buffer, buffer_len, _T("SET 4, B=(IX+(%d))"), ofs); break;
3460         case 0xe1: my_stprintf_s(buffer, buffer_len, _T("SET 4, C=(IX+(%d))"), ofs); break;
3461         case 0xe2: my_stprintf_s(buffer, buffer_len, _T("SET 4, D=(IX+(%d))"), ofs); break;
3462         case 0xe3: my_stprintf_s(buffer, buffer_len, _T("SET 4, E=(IX+(%d))"), ofs); break;
3463         case 0xe4: my_stprintf_s(buffer, buffer_len, _T("SET 4, H=(IX+(%d))"), ofs); break;
3464         case 0xe5: my_stprintf_s(buffer, buffer_len, _T("SET 4, L=(IX+(%d))"), ofs); break;
3465         case 0xe6: my_stprintf_s(buffer, buffer_len, _T("SET 4, (IX+(%d))"), ofs); break;
3466         case 0xe7: my_stprintf_s(buffer, buffer_len, _T("SET 4, A=(IX+(%d))"), ofs); break;
3467         case 0xe8: my_stprintf_s(buffer, buffer_len, _T("SET 5, B=(IX+(%d))"), ofs); break;
3468         case 0xe9: my_stprintf_s(buffer, buffer_len, _T("SET 5, C=(IX+(%d))"), ofs); break;
3469         case 0xea: my_stprintf_s(buffer, buffer_len, _T("SET 5, D=(IX+(%d))"), ofs); break;
3470         case 0xeb: my_stprintf_s(buffer, buffer_len, _T("SET 5, E=(IX+(%d))"), ofs); break;
3471         case 0xec: my_stprintf_s(buffer, buffer_len, _T("SET 5, H=(IX+(%d))"), ofs); break;
3472         case 0xed: my_stprintf_s(buffer, buffer_len, _T("SET 5, L=(IX+(%d))"), ofs); break;
3473         case 0xee: my_stprintf_s(buffer, buffer_len, _T("SET 5, (IX+(%d))"), ofs); break;
3474         case 0xef: my_stprintf_s(buffer, buffer_len, _T("SET 5, A=(IX+(%d))"), ofs); break;
3475         case 0xf0: my_stprintf_s(buffer, buffer_len, _T("SET 6, B=(IX+(%d))"), ofs); break;
3476         case 0xf1: my_stprintf_s(buffer, buffer_len, _T("SET 6, C=(IX+(%d))"), ofs); break;
3477         case 0xf2: my_stprintf_s(buffer, buffer_len, _T("SET 6, D=(IX+(%d))"), ofs); break;
3478         case 0xf3: my_stprintf_s(buffer, buffer_len, _T("SET 6, E=(IX+(%d))"), ofs); break;
3479         case 0xf4: my_stprintf_s(buffer, buffer_len, _T("SET 6, H=(IX+(%d))"), ofs); break;
3480         case 0xf5: my_stprintf_s(buffer, buffer_len, _T("SET 6, L=(IX+(%d))"), ofs); break;
3481         case 0xf6: my_stprintf_s(buffer, buffer_len, _T("SET 6, (IX+(%d))"), ofs); break;
3482         case 0xf7: my_stprintf_s(buffer, buffer_len, _T("SET 6, A=(IX+(%d))"), ofs); break;
3483         case 0xf8: my_stprintf_s(buffer, buffer_len, _T("SET 7, B=(IX+(%d))"), ofs); break;
3484         case 0xf9: my_stprintf_s(buffer, buffer_len, _T("SET 7, C=(IX+(%d))"), ofs); break;
3485         case 0xfa: my_stprintf_s(buffer, buffer_len, _T("SET 7, D=(IX+(%d))"), ofs); break;
3486         case 0xfb: my_stprintf_s(buffer, buffer_len, _T("SET 7, E=(IX+(%d))"), ofs); break;
3487         case 0xfc: my_stprintf_s(buffer, buffer_len, _T("SET 7, H=(IX+(%d))"), ofs); break;
3488         case 0xfd: my_stprintf_s(buffer, buffer_len, _T("SET 7, L=(IX+(%d))"), ofs); break;
3489         case 0xfe: my_stprintf_s(buffer, buffer_len, _T("SET 7, (IX+(%d))"), ofs); break;
3490         case 0xff: my_stprintf_s(buffer, buffer_len, _T("SET 7, A=(IX+(%d))"), ofs); break;
3491 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
3492         default: __assume(0);
3493 #endif
3494         }
3495 }
3496
3497 static void dasm_fdcb(uint32_t pc, _TCHAR *buffer, size_t buffer_len, symbol_t *first_symbol)
3498 {
3499         int8_t ofs = debug_fetch8_rel();
3500         uint8_t code = debug_fetch8();
3501         
3502         switch(code) {
3503         case 0x00: my_stprintf_s(buffer, buffer_len, _T("RLC B=(IY+(%d))"), ofs); break;
3504         case 0x01: my_stprintf_s(buffer, buffer_len, _T("RLC C=(IY+(%d))"), ofs); break;
3505         case 0x02: my_stprintf_s(buffer, buffer_len, _T("RLC D=(IY+(%d))"), ofs); break;
3506         case 0x03: my_stprintf_s(buffer, buffer_len, _T("RLC E=(IY+(%d))"), ofs); break;
3507         case 0x04: my_stprintf_s(buffer, buffer_len, _T("RLC H=(IY+(%d))"), ofs); break;
3508         case 0x05: my_stprintf_s(buffer, buffer_len, _T("RLC L=(IY+(%d))"), ofs); break;
3509         case 0x06: my_stprintf_s(buffer, buffer_len, _T("RLC (IY+(%d))"), ofs); break;
3510         case 0x07: my_stprintf_s(buffer, buffer_len, _T("RLC A=(IY+(%d))"), ofs); break;
3511         case 0x08: my_stprintf_s(buffer, buffer_len, _T("RRC B=(IY+(%d))"), ofs); break;
3512         case 0x09: my_stprintf_s(buffer, buffer_len, _T("RRC C=(IY+(%d))"), ofs); break;
3513         case 0x0a: my_stprintf_s(buffer, buffer_len, _T("RRC D=(IY+(%d))"), ofs); break;
3514         case 0x0b: my_stprintf_s(buffer, buffer_len, _T("RRC E=(IY+(%d))"), ofs); break;
3515         case 0x0c: my_stprintf_s(buffer, buffer_len, _T("RRC H=(IY+(%d))"), ofs); break;
3516         case 0x0d: my_stprintf_s(buffer, buffer_len, _T("RRC L=(IY+(%d))"), ofs); break;
3517         case 0x0e: my_stprintf_s(buffer, buffer_len, _T("RRC (IY+(%d))"), ofs); break;
3518         case 0x0f: my_stprintf_s(buffer, buffer_len, _T("RRC A=(IY+(%d))"), ofs); break;
3519         case 0x10: my_stprintf_s(buffer, buffer_len, _T("RL B=(IY+(%d))"), ofs); break;
3520         case 0x11: my_stprintf_s(buffer, buffer_len, _T("RL C=(IY+(%d))"), ofs); break;
3521         case 0x12: my_stprintf_s(buffer, buffer_len, _T("RL D=(IY+(%d))"), ofs); break;
3522         case 0x13: my_stprintf_s(buffer, buffer_len, _T("RL E=(IY+(%d))"), ofs); break;
3523         case 0x14: my_stprintf_s(buffer, buffer_len, _T("RL H=(IY+(%d))"), ofs); break;
3524         case 0x15: my_stprintf_s(buffer, buffer_len, _T("RL L=(IY+(%d))"), ofs); break;
3525         case 0x16: my_stprintf_s(buffer, buffer_len, _T("RL (IY+(%d))"), ofs); break;
3526         case 0x17: my_stprintf_s(buffer, buffer_len, _T("RL A=(IY+(%d))"), ofs); break;
3527         case 0x18: my_stprintf_s(buffer, buffer_len, _T("RR B=(IY+(%d))"), ofs); break;
3528         case 0x19: my_stprintf_s(buffer, buffer_len, _T("RR C=(IY+(%d))"), ofs); break;
3529         case 0x1a: my_stprintf_s(buffer, buffer_len, _T("RR D=(IY+(%d))"), ofs); break;
3530         case 0x1b: my_stprintf_s(buffer, buffer_len, _T("RR E=(IY+(%d))"), ofs); break;
3531         case 0x1c: my_stprintf_s(buffer, buffer_len, _T("RR H=(IY+(%d))"), ofs); break;
3532         case 0x1d: my_stprintf_s(buffer, buffer_len, _T("RR L=(IY+(%d))"), ofs); break;
3533         case 0x1e: my_stprintf_s(buffer, buffer_len, _T("RR (IY+(%d))"), ofs); break;
3534         case 0x1f: my_stprintf_s(buffer, buffer_len, _T("RR A=(IY+(%d))"), ofs); break;
3535         case 0x20: my_stprintf_s(buffer, buffer_len, _T("SLA B=(IY+(%d))"), ofs); break;
3536         case 0x21: my_stprintf_s(buffer, buffer_len, _T("SLA C=(IY+(%d))"), ofs); break;
3537         case 0x22: my_stprintf_s(buffer, buffer_len, _T("SLA D=(IY+(%d))"), ofs); break;
3538         case 0x23: my_stprintf_s(buffer, buffer_len, _T("SLA E=(IY+(%d))"), ofs); break;
3539         case 0x24: my_stprintf_s(buffer, buffer_len, _T("SLA H=(IY+(%d))"), ofs); break;
3540         case 0x25: my_stprintf_s(buffer, buffer_len, _T("SLA L=(IY+(%d))"), ofs); break;
3541         case 0x26: my_stprintf_s(buffer, buffer_len, _T("SLA (IY+(%d))"), ofs); break;
3542         case 0x27: my_stprintf_s(buffer, buffer_len, _T("SLA A=(IY+(%d))"), ofs); break;
3543         case 0x28: my_stprintf_s(buffer, buffer_len, _T("SRA B=(IY+(%d))"), ofs); break;
3544         case 0x29: my_stprintf_s(buffer, buffer_len, _T("SRA C=(IY+(%d))"), ofs); break;
3545         case 0x2a: my_stprintf_s(buffer, buffer_len, _T("SRA D=(IY+(%d))"), ofs); break;
3546         case 0x2b: my_stprintf_s(buffer, buffer_len, _T("SRA E=(IY+(%d))"), ofs); break;
3547         case 0x2c: my_stprintf_s(buffer, buffer_len, _T("SRA H=(IY+(%d))"), ofs); break;
3548         case 0x2d: my_stprintf_s(buffer, buffer_len, _T("SRA L=(IY+(%d))"), ofs); break;
3549         case 0x2e: my_stprintf_s(buffer, buffer_len, _T("SRA (IY+(%d))"), ofs); break;
3550         case 0x2f: my_stprintf_s(buffer, buffer_len, _T("SRA A=(IY+(%d))"), ofs); break;
3551         case 0x30: my_stprintf_s(buffer, buffer_len, _T("SLL B=(IY+(%d))"), ofs); break;
3552         case 0x31: my_stprintf_s(buffer, buffer_len, _T("SLL C=(IY+(%d))"), ofs); break;
3553         case 0x32: my_stprintf_s(buffer, buffer_len, _T("SLL D=(IY+(%d))"), ofs); break;
3554         case 0x33: my_stprintf_s(buffer, buffer_len, _T("SLL E=(IY+(%d))"), ofs); break;
3555         case 0x34: my_stprintf_s(buffer, buffer_len, _T("SLL H=(IY+(%d))"), ofs); break;
3556         case 0x35: my_stprintf_s(buffer, buffer_len, _T("SLL L=(IY+(%d))"), ofs); break;
3557         case 0x36: my_stprintf_s(buffer, buffer_len, _T("SLL (IY+(%d))"), ofs); break;
3558         case 0x37: my_stprintf_s(buffer, buffer_len, _T("SLL A=(IY+(%d))"), ofs); break;
3559         case 0x38: my_stprintf_s(buffer, buffer_len, _T("SRL B=(IY+(%d))"), ofs); break;
3560         case 0x39: my_stprintf_s(buffer, buffer_len, _T("SRL C=(IY+(%d))"), ofs); break;
3561         case 0x3a: my_stprintf_s(buffer, buffer_len, _T("SRL D=(IY+(%d))"), ofs); break;
3562         case 0x3b: my_stprintf_s(buffer, buffer_len, _T("SRL E=(IY+(%d))"), ofs); break;
3563         case 0x3c: my_stprintf_s(buffer, buffer_len, _T("SRL H=(IY+(%d))"), ofs); break;
3564         case 0x3d: my_stprintf_s(buffer, buffer_len, _T("SRL L=(IY+(%d))"), ofs); break;
3565         case 0x3e: my_stprintf_s(buffer, buffer_len, _T("SRL (IY+(%d))"), ofs); break;
3566         case 0x3f: my_stprintf_s(buffer, buffer_len, _T("SRL A=(IY+(%d))"), ofs); break;
3567         case 0x40: my_stprintf_s(buffer, buffer_len, _T("BIT 0, B=(IY+(%d))"), ofs); break;
3568         case 0x41: my_stprintf_s(buffer, buffer_len, _T("BIT 0, C=(IY+(%d))"), ofs); break;
3569         case 0x42: my_stprintf_s(buffer, buffer_len, _T("BIT 0, D=(IY+(%d))"), ofs); break;
3570         case 0x43: my_stprintf_s(buffer, buffer_len, _T("BIT 0, E=(IY+(%d))"), ofs); break;
3571         case 0x44: my_stprintf_s(buffer, buffer_len, _T("BIT 0, H=(IY+(%d))"), ofs); break;
3572         case 0x45: my_stprintf_s(buffer, buffer_len, _T("BIT 0, L=(IY+(%d))"), ofs); break;
3573         case 0x46: my_stprintf_s(buffer, buffer_len, _T("BIT 0, (IY+(%d))"), ofs); break;
3574         case 0x47: my_stprintf_s(buffer, buffer_len, _T("BIT 0, A=(IY+(%d))"), ofs); break;
3575         case 0x48: my_stprintf_s(buffer, buffer_len, _T("BIT 1, B=(IY+(%d))"), ofs); break;
3576         case 0x49: my_stprintf_s(buffer, buffer_len, _T("BIT 1, C=(IY+(%d))"), ofs); break;
3577         case 0x4a: my_stprintf_s(buffer, buffer_len, _T("BIT 1, D=(IY+(%d))"), ofs); break;
3578         case 0x4b: my_stprintf_s(buffer, buffer_len, _T("BIT 1, E=(IY+(%d))"), ofs); break;
3579         case 0x4c: my_stprintf_s(buffer, buffer_len, _T("BIT 1, H=(IY+(%d))"), ofs); break;
3580         case 0x4d: my_stprintf_s(buffer, buffer_len, _T("BIT 1, L=(IY+(%d))"), ofs); break;
3581         case 0x4e: my_stprintf_s(buffer, buffer_len, _T("BIT 1, (IY+(%d))"), ofs); break;
3582         case 0x4f: my_stprintf_s(buffer, buffer_len, _T("BIT 1, A=(IY+(%d))"), ofs); break;
3583         case 0x50: my_stprintf_s(buffer, buffer_len, _T("BIT 2, B=(IY+(%d))"), ofs); break;
3584         case 0x51: my_stprintf_s(buffer, buffer_len, _T("BIT 2, C=(IY+(%d))"), ofs); break;
3585         case 0x52: my_stprintf_s(buffer, buffer_len, _T("BIT 2, D=(IY+(%d))"), ofs); break;
3586         case 0x53: my_stprintf_s(buffer, buffer_len, _T("BIT 2, E=(IY+(%d))"), ofs); break;
3587         case 0x54: my_stprintf_s(buffer, buffer_len, _T("BIT 2, H=(IY+(%d))"), ofs); break;
3588         case 0x55: my_stprintf_s(buffer, buffer_len, _T("BIT 2, L=(IY+(%d))"), ofs); break;
3589         case 0x56: my_stprintf_s(buffer, buffer_len, _T("BIT 2, (IY+(%d))"), ofs); break;
3590         case 0x57: my_stprintf_s(buffer, buffer_len, _T("BIT 2, A=(IY+(%d))"), ofs); break;
3591         case 0x58: my_stprintf_s(buffer, buffer_len, _T("BIT 3, B=(IY+(%d))"), ofs); break;
3592         case 0x59: my_stprintf_s(buffer, buffer_len, _T("BIT 3, C=(IY+(%d))"), ofs); break;
3593         case 0x5a: my_stprintf_s(buffer, buffer_len, _T("BIT 3, D=(IY+(%d))"), ofs); break;
3594         case 0x5b: my_stprintf_s(buffer, buffer_len, _T("BIT 3, E=(IY+(%d))"), ofs); break;
3595         case 0x5c: my_stprintf_s(buffer, buffer_len, _T("BIT 3, H=(IY+(%d))"), ofs); break;
3596         case 0x5d: my_stprintf_s(buffer, buffer_len, _T("BIT 3, L=(IY+(%d))"), ofs); break;
3597         case 0x5e: my_stprintf_s(buffer, buffer_len, _T("BIT 3, (IY+(%d))"), ofs); break;
3598         case 0x5f: my_stprintf_s(buffer, buffer_len, _T("BIT 3, A=(IY+(%d))"), ofs); break;
3599         case 0x60: my_stprintf_s(buffer, buffer_len, _T("BIT 4, B=(IY+(%d))"), ofs); break;
3600         case 0x61: my_stprintf_s(buffer, buffer_len, _T("BIT 4, C=(IY+(%d))"), ofs); break;
3601         case 0x62: my_stprintf_s(buffer, buffer_len, _T("BIT 4, D=(IY+(%d))"), ofs); break;
3602         case 0x63: my_stprintf_s(buffer, buffer_len, _T("BIT 4, E=(IY+(%d))"), ofs); break;
3603         case 0x64: my_stprintf_s(buffer, buffer_len, _T("BIT 4, H=(IY+(%d))"), ofs); break;
3604         case 0x65: my_stprintf_s(buffer, buffer_len, _T("BIT 4, L=(IY+(%d))"), ofs); break;
3605         case 0x66: my_stprintf_s(buffer, buffer_len, _T("BIT 4, (IY+(%d))"), ofs); break;
3606         case 0x67: my_stprintf_s(buffer, buffer_len, _T("BIT 4, A=(IY+(%d))"), ofs); break;
3607         case 0x68: my_stprintf_s(buffer, buffer_len, _T("BIT 5, B=(IY+(%d))"), ofs); break;
3608         case 0x69: my_stprintf_s(buffer, buffer_len, _T("BIT 5, C=(IY+(%d))"), ofs); break;
3609         case 0x6a: my_stprintf_s(buffer, buffer_len, _T("BIT 5, D=(IY+(%d))"), ofs); break;
3610         case 0x6b: my_stprintf_s(buffer, buffer_len, _T("BIT 5, E=(IY+(%d))"), ofs); break;
3611         case 0x6c: my_stprintf_s(buffer, buffer_len, _T("BIT 5, H=(IY+(%d))"), ofs); break;
3612         case 0x6d: my_stprintf_s(buffer, buffer_len, _T("BIT 5, L=(IY+(%d))"), ofs); break;
3613         case 0x6e: my_stprintf_s(buffer, buffer_len, _T("BIT 5, (IY+(%d))"), ofs); break;
3614         case 0x6f: my_stprintf_s(buffer, buffer_len, _T("BIT 5, A=(IY+(%d))"), ofs); break;
3615         case 0x70: my_stprintf_s(buffer, buffer_len, _T("BIT 6, B=(IY+(%d))"), ofs); break;
3616         case 0x71: my_stprintf_s(buffer, buffer_len, _T("BIT 6, C=(IY+(%d))"), ofs); break;
3617         case 0x72: my_stprintf_s(buffer, buffer_len, _T("BIT 6, D=(IY+(%d))"), ofs); break;
3618         case 0x73: my_stprintf_s(buffer, buffer_len, _T("BIT 6, E=(IY+(%d))"), ofs); break;
3619         case 0x74: my_stprintf_s(buffer, buffer_len, _T("BIT 6, H=(IY+(%d))"), ofs); break;
3620         case 0x75: my_stprintf_s(buffer, buffer_len, _T("BIT 6, L=(IY+(%d))"), ofs); break;
3621         case 0x76: my_stprintf_s(buffer, buffer_len, _T("BIT 6, (IY+(%d))"), ofs); break;
3622         case 0x77: my_stprintf_s(buffer, buffer_len, _T("BIT 6, A=(IY+(%d))"), ofs); break;
3623         case 0x78: my_stprintf_s(buffer, buffer_len, _T("BIT 7, B=(IY+(%d))"), ofs); break;
3624         case 0x79: my_stprintf_s(buffer, buffer_len, _T("BIT 7, C=(IY+(%d))"), ofs); break;
3625         case 0x7a: my_stprintf_s(buffer, buffer_len, _T("BIT 7, D=(IY+(%d))"), ofs); break;
3626         case 0x7b: my_stprintf_s(buffer, buffer_len, _T("BIT 7, E=(IY+(%d))"), ofs); break;
3627         case 0x7c: my_stprintf_s(buffer, buffer_len, _T("BIT 7, H=(IY+(%d))"), ofs); break;
3628         case 0x7d: my_stprintf_s(buffer, buffer_len, _T("BIT 7, L=(IY+(%d))"), ofs); break;
3629         case 0x7e: my_stprintf_s(buffer, buffer_len, _T("BIT 7, (IY+(%d))"), ofs); break;
3630         case 0x7f: my_stprintf_s(buffer, buffer_len, _T("BIT 7, A=(IY+(%d))"), ofs); break;
3631         case 0x80: my_stprintf_s(buffer, buffer_len, _T("RES 0, B=(IY+(%d))"), ofs); break;
3632         case 0x81: my_stprintf_s(buffer, buffer_len, _T("RES 0, C=(IY+(%d))"), ofs); break;
3633         case 0x82: my_stprintf_s(buffer, buffer_len, _T("RES 0, D=(IY+(%d))"), ofs); break;
3634         case 0x83: my_stprintf_s(buffer, buffer_len, _T("RES 0, E=(IY+(%d))"), ofs); break;
3635         case 0x84: my_stprintf_s(buffer, buffer_len, _T("RES 0, H=(IY+(%d))"), ofs); break;
3636         case 0x85: my_stprintf_s(buffer, buffer_len, _T("RES 0, L=(IY+(%d))"), ofs); break;
3637         case 0x86: my_stprintf_s(buffer, buffer_len, _T("RES 0, (IY+(%d))"), ofs); break;
3638         case 0x87: my_stprintf_s(buffer, buffer_len, _T("RES 0, A=(IY+(%d))"), ofs); break;
3639         case 0x88: my_stprintf_s(buffer, buffer_len, _T("RES 1, B=(IY+(%d))"), ofs); break;
3640         case 0x89: my_stprintf_s(buffer, buffer_len, _T("RES 1, C=(IY+(%d))"), ofs); break;
3641         case 0x8a: my_stprintf_s(buffer, buffer_len, _T("RES 1, D=(IY+(%d))"), ofs); break;
3642         case 0x8b: my_stprintf_s(buffer, buffer_len, _T("RES 1, E=(IY+(%d))"), ofs); break;
3643         case 0x8c: my_stprintf_s(buffer, buffer_len, _T("RES 1, H=(IY+(%d))"), ofs); break;
3644         case 0x8d: my_stprintf_s(buffer, buffer_len, _T("RES 1, L=(IY+(%d))"), ofs); break;
3645         case 0x8e: my_stprintf_s(buffer, buffer_len, _T("RES 1, (IY+(%d))"), ofs); break;
3646         case 0x8f: my_stprintf_s(buffer, buffer_len, _T("RES 1, A=(IY+(%d))"), ofs); break;
3647         case 0x90: my_stprintf_s(buffer, buffer_len, _T("RES 2, B=(IY+(%d))"), ofs); break;
3648         case 0x91: my_stprintf_s(buffer, buffer_len, _T("RES 2, C=(IY+(%d))"), ofs); break;
3649         case 0x92: my_stprintf_s(buffer, buffer_len, _T("RES 2, D=(IY+(%d))"), ofs); break;
3650         case 0x93: my_stprintf_s(buffer, buffer_len, _T("RES 2, E=(IY+(%d))"), ofs); break;
3651         case 0x94: my_stprintf_s(buffer, buffer_len, _T("RES 2, H=(IY+(%d))"), ofs); break;
3652         case 0x95: my_stprintf_s(buffer, buffer_len, _T("RES 2, L=(IY+(%d))"), ofs); break;
3653         case 0x96: my_stprintf_s(buffer, buffer_len, _T("RES 2, (IY+(%d))"), ofs); break;
3654         case 0x97: my_stprintf_s(buffer, buffer_len, _T("RES 2, A=(IY+(%d))"), ofs); break;
3655         case 0x98: my_stprintf_s(buffer, buffer_len, _T("RES 3, B=(IY+(%d))"), ofs); break;
3656         case 0x99: my_stprintf_s(buffer, buffer_len, _T("RES 3, C=(IY+(%d))"), ofs); break;
3657         case 0x9a: my_stprintf_s(buffer, buffer_len, _T("RES 3, D=(IY+(%d))"), ofs); break;
3658         case 0x9b: my_stprintf_s(buffer, buffer_len, _T("RES 3, E=(IY+(%d))"), ofs); break;
3659         case 0x9c: my_stprintf_s(buffer, buffer_len, _T("RES 3, H=(IY+(%d))"), ofs); break;
3660         case 0x9d: my_stprintf_s(buffer, buffer_len, _T("RES 3, L=(IY+(%d))"), ofs); break;
3661         case 0x9e: my_stprintf_s(buffer, buffer_len, _T("RES 3, (IY+(%d))"), ofs); break;
3662         case 0x9f: my_stprintf_s(buffer, buffer_len, _T("RES 3, A=(IY+(%d))"), ofs); break;
3663         case 0xa0: my_stprintf_s(buffer, buffer_len, _T("RES 4, B=(IY+(%d))"), ofs); break;
3664         case 0xa1: my_stprintf_s(buffer, buffer_len, _T("RES 4, C=(IY+(%d))"), ofs); break;
3665         case 0xa2: my_stprintf_s(buffer, buffer_len, _T("RES 4, D=(IY+(%d))"), ofs); break;
3666         case 0xa3: my_stprintf_s(buffer, buffer_len, _T("RES 4, E=(IY+(%d))"), ofs); break;
3667         case 0xa4: my_stprintf_s(buffer, buffer_len, _T("RES 4, H=(IY+(%d))"), ofs); break;
3668         case 0xa5: my_stprintf_s(buffer, buffer_len, _T("RES 4, L=(IY+(%d))"), ofs); break;
3669         case 0xa6: my_stprintf_s(buffer, buffer_len, _T("RES 4, (IY+(%d))"), ofs); break;
3670         case 0xa7: my_stprintf_s(buffer, buffer_len, _T("RES 4, A=(IY+(%d))"), ofs); break;
3671         case 0xa8: my_stprintf_s(buffer, buffer_len, _T("RES 5, B=(IY+(%d))"), ofs); break;
3672         case 0xa9: my_stprintf_s(buffer, buffer_len, _T("RES 5, C=(IY+(%d))"), ofs); break;
3673         case 0xaa: my_stprintf_s(buffer, buffer_len, _T("RES 5, D=(IY+(%d))"), ofs); break;
3674         case 0xab: my_stprintf_s(buffer, buffer_len, _T("RES 5, E=(IY+(%d))"), ofs); break;
3675         case 0xac: my_stprintf_s(buffer, buffer_len, _T("RES 5, H=(IY+(%d))"), ofs); break;
3676         case 0xad: my_stprintf_s(buffer, buffer_len, _T("RES 5, L=(IY+(%d))"), ofs); break;
3677         case 0xae: my_stprintf_s(buffer, buffer_len, _T("RES 5, (IY+(%d))"), ofs); break;
3678         case 0xaf: my_stprintf_s(buffer, buffer_len, _T("RES 5, A=(IY+(%d))"), ofs); break;
3679         case 0xb0: my_stprintf_s(buffer, buffer_len, _T("RES 6, B=(IY+(%d))"), ofs); break;
3680         case 0xb1: my_stprintf_s(buffer, buffer_len, _T("RES 6, C=(IY+(%d))"), ofs); break;
3681         case 0xb2: my_stprintf_s(buffer, buffer_len, _T("RES 6, D=(IY+(%d))"), ofs); break;
3682         case 0xb3: my_stprintf_s(buffer, buffer_len, _T("RES 6, E=(IY+(%d))"), ofs); break;
3683         case 0xb4: my_stprintf_s(buffer, buffer_len, _T("RES 6, H=(IY+(%d))"), ofs); break;
3684         case 0xb5: my_stprintf_s(buffer, buffer_len, _T("RES 6, L=(IY+(%d))"), ofs); break;
3685         case 0xb6: my_stprintf_s(buffer, buffer_len, _T("RES 6, (IY+(%d))"), ofs); break;
3686         case 0xb7: my_stprintf_s(buffer, buffer_len, _T("RES 6, A=(IY+(%d))"), ofs); break;
3687         case 0xb8: my_stprintf_s(buffer, buffer_len, _T("RES 7, B=(IY+(%d))"), ofs); break;
3688         case 0xb9: my_stprintf_s(buffer, buffer_len, _T("RES 7, C=(IY+(%d))"), ofs); break;
3689         case 0xba: my_stprintf_s(buffer, buffer_len, _T("RES 7, D=(IY+(%d))"), ofs); break;
3690         case 0xbb: my_stprintf_s(buffer, buffer_len, _T("RES 7, E=(IY+(%d))"), ofs); break;
3691         case 0xbc: my_stprintf_s(buffer, buffer_len, _T("RES 7, H=(IY+(%d))"), ofs); break;
3692         case 0xbd: my_stprintf_s(buffer, buffer_len, _T("RES 7, L=(IY+(%d))"), ofs); break;
3693         case 0xbe: my_stprintf_s(buffer, buffer_len, _T("RES 7, (IY+(%d))"), ofs); break;
3694         case 0xbf: my_stprintf_s(buffer, buffer_len, _T("RES 7, A=(IY+(%d))"), ofs); break;
3695         case 0xc0: my_stprintf_s(buffer, buffer_len, _T("SET 0, B=(IY+(%d))"), ofs); break;
3696         case 0xc1: my_stprintf_s(buffer, buffer_len, _T("SET 0, C=(IY+(%d))"), ofs); break;
3697         case 0xc2: my_stprintf_s(buffer, buffer_len, _T("SET 0, D=(IY+(%d))"), ofs); break;
3698         case 0xc3: my_stprintf_s(buffer, buffer_len, _T("SET 0, E=(IY+(%d))"), ofs); break;
3699         case 0xc4: my_stprintf_s(buffer, buffer_len, _T("SET 0, H=(IY+(%d))"), ofs); break;
3700         case 0xc5: my_stprintf_s(buffer, buffer_len, _T("SET 0, L=(IY+(%d))"), ofs); break;
3701         case 0xc6: my_stprintf_s(buffer, buffer_len, _T("SET 0, (IY+(%d))"), ofs); break;
3702         case 0xc7: my_stprintf_s(buffer, buffer_len, _T("SET 0, A=(IY+(%d))"), ofs); break;
3703         case 0xc8: my_stprintf_s(buffer, buffer_len, _T("SET 1, B=(IY+(%d))"), ofs); break;
3704         case 0xc9: my_stprintf_s(buffer, buffer_len, _T("SET 1, C=(IY+(%d))"), ofs); break;
3705         case 0xca: my_stprintf_s(buffer, buffer_len, _T("SET 1, D=(IY+(%d))"), ofs); break;
3706         case 0xcb: my_stprintf_s(buffer, buffer_len, _T("SET 1, E=(IY+(%d))"), ofs); break;
3707         case 0xcc: my_stprintf_s(buffer, buffer_len, _T("SET 1, H=(IY+(%d))"), ofs); break;
3708         case 0xcd: my_stprintf_s(buffer, buffer_len, _T("SET 1, L=(IY+(%d))"), ofs); break;
3709         case 0xce: my_stprintf_s(buffer, buffer_len, _T("SET 1, (IY+(%d))"), ofs); break;
3710         case 0xcf: my_stprintf_s(buffer, buffer_len, _T("SET 1, A=(IY+(%d))"), ofs); break;
3711         case 0xd0: my_stprintf_s(buffer, buffer_len, _T("SET 2, B=(IY+(%d))"), ofs); break;
3712         case 0xd1: my_stprintf_s(buffer, buffer_len, _T("SET 2, C=(IY+(%d))"), ofs); break;
3713         case 0xd2: my_stprintf_s(buffer, buffer_len, _T("SET 2, D=(IY+(%d))"), ofs); break;
3714         case 0xd3: my_stprintf_s(buffer, buffer_len, _T("SET 2, E=(IY+(%d))"), ofs); break;
3715         case 0xd4: my_stprintf_s(buffer, buffer_len, _T("SET 2, H=(IY+(%d))"), ofs); break;
3716         case 0xd5: my_stprintf_s(buffer, buffer_len, _T("SET 2, L=(IY+(%d))"), ofs); break;
3717         case 0xd6: my_stprintf_s(buffer, buffer_len, _T("SET 2, (IY+(%d))"), ofs); break;
3718         case 0xd7: my_stprintf_s(buffer, buffer_len, _T("SET 2, A=(IY+(%d))"), ofs); break;
3719         case 0xd8: my_stprintf_s(buffer, buffer_len, _T("SET 3, B=(IY+(%d))"), ofs); break;
3720         case 0xd9: my_stprintf_s(buffer, buffer_len, _T("SET 3, C=(IY+(%d))"), ofs); break;
3721         case 0xda: my_stprintf_s(buffer, buffer_len, _T("SET 3, D=(IY+(%d))"), ofs); break;
3722         case 0xdb: my_stprintf_s(buffer, buffer_len, _T("SET 3, E=(IY+(%d))"), ofs); break;
3723         case 0xdc: my_stprintf_s(buffer, buffer_len, _T("SET 3, H=(IY+(%d))"), ofs); break;
3724         case 0xdd: my_stprintf_s(buffer, buffer_len, _T("SET 3, L=(IY+(%d))"), ofs); break;
3725         case 0xde: my_stprintf_s(buffer, buffer_len, _T("SET 3, (IY+(%d))"), ofs); break;
3726         case 0xdf: my_stprintf_s(buffer, buffer_len, _T("SET 3, A=(IY+(%d))"), ofs); break;
3727         case 0xe0: my_stprintf_s(buffer, buffer_len, _T("SET 4, B=(IY+(%d))"), ofs); break;
3728         case 0xe1: my_stprintf_s(buffer, buffer_len, _T("SET 4, C=(IY+(%d))"), ofs); break;
3729         case 0xe2: my_stprintf_s(buffer, buffer_len, _T("SET 4, D=(IY+(%d))"), ofs); break;
3730         case 0xe3: my_stprintf_s(buffer, buffer_len, _T("SET 4, E=(IY+(%d))"), ofs); break;
3731         case 0xe4: my_stprintf_s(buffer, buffer_len, _T("SET 4, H=(IY+(%d))"), ofs); break;
3732         case 0xe5: my_stprintf_s(buffer, buffer_len, _T("SET 4, L=(IY+(%d))"), ofs); break;
3733         case 0xe6: my_stprintf_s(buffer, buffer_len, _T("SET 4, (IY+(%d))"), ofs); break;
3734         case 0xe7: my_stprintf_s(buffer, buffer_len, _T("SET 4, A=(IY+(%d))"), ofs); break;
3735         case 0xe8: my_stprintf_s(buffer, buffer_len, _T("SET 5, B=(IY+(%d))"), ofs); break;
3736         case 0xe9: my_stprintf_s(buffer, buffer_len, _T("SET 5, C=(IY+(%d))"), ofs); break;
3737         case 0xea: my_stprintf_s(buffer, buffer_len, _T("SET 5, D=(IY+(%d))"), ofs); break;
3738         case 0xeb: my_stprintf_s(buffer, buffer_len, _T("SET 5, E=(IY+(%d))"), ofs); break;
3739         case 0xec: my_stprintf_s(buffer, buffer_len, _T("SET 5, H=(IY+(%d))"), ofs); break;
3740         case 0xed: my_stprintf_s(buffer, buffer_len, _T("SET 5, L=(IY+(%d))"), ofs); break;
3741         case 0xee: my_stprintf_s(buffer, buffer_len, _T("SET 5, (IY+(%d))"), ofs); break;
3742         case 0xef: my_stprintf_s(buffer, buffer_len, _T("SET 5, A=(IY+(%d))"), ofs); break;
3743         case 0xf0: my_stprintf_s(buffer, buffer_len, _T("SET 6, B=(IY+(%d))"), ofs); break;
3744         case 0xf1: my_stprintf_s(buffer, buffer_len, _T("SET 6, C=(IY+(%d))"), ofs); break;
3745         case 0xf2: my_stprintf_s(buffer, buffer_len, _T("SET 6, D=(IY+(%d))"), ofs); break;
3746         case 0xf3: my_stprintf_s(buffer, buffer_len, _T("SET 6, E=(IY+(%d))"), ofs); break;
3747         case 0xf4: my_stprintf_s(buffer, buffer_len, _T("SET 6, H=(IY+(%d))"), ofs); break;
3748         case 0xf5: my_stprintf_s(buffer, buffer_len, _T("SET 6, L=(IY+(%d))"), ofs); break;
3749         case 0xf6: my_stprintf_s(buffer, buffer_len, _T("SET 6, (IY+(%d))"), ofs); break;
3750         case 0xf7: my_stprintf_s(buffer, buffer_len, _T("SET 6, A=(IY+(%d))"), ofs); break;
3751         case 0xf8: my_stprintf_s(buffer, buffer_len, _T("SET 7, B=(IY+(%d))"), ofs); break;
3752         case 0xf9: my_stprintf_s(buffer, buffer_len, _T("SET 7, C=(IY+(%d))"), ofs); break;
3753         case 0xfa: my_stprintf_s(buffer, buffer_len, _T("SET 7, D=(IY+(%d))"), ofs); break;
3754         case 0xfb: my_stprintf_s(buffer, buffer_len, _T("SET 7, E=(IY+(%d))"), ofs); break;
3755         case 0xfc: my_stprintf_s(buffer, buffer_len, _T("SET 7, H=(IY+(%d))"), ofs); break;
3756         case 0xfd: my_stprintf_s(buffer, buffer_len, _T("SET 7, L=(IY+(%d))"), ofs); break;
3757         case 0xfe: my_stprintf_s(buffer, buffer_len, _T("SET 7, (IY+(%d))"), ofs); break;
3758         case 0xff: my_stprintf_s(buffer, buffer_len, _T("SET 7, A=(IY+(%d))"), ofs); break;
3759 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
3760         default: __assume(0);
3761 #endif
3762         }
3763 }
3764 //#endif
3765 }
3766 #define STATE_VERSION 4
3767
3768 bool Z80_BASE::process_state(FILEIO* state_fio, bool loading)
3769 {
3770         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
3771                 return false;
3772         }
3773
3774         if(!state_fio->StateCheckInt32(this_device_id)) {
3775                 return false;
3776         }
3777         state_fio->StateValue(total_icount);
3778         
3779         state_fio->StateValue(icount);
3780         state_fio->StateValue(extra_icount);
3781         state_fio->StateValue(busreq_icount);
3782         state_fio->StateValue(prevpc);
3783         state_fio->StateValue(pc.d);
3784         state_fio->StateValue(sp.d);
3785         state_fio->StateValue(af.d);
3786         state_fio->StateValue(bc.d);
3787         state_fio->StateValue(de.d);
3788         state_fio->StateValue(hl.d);
3789         state_fio->StateValue(ix.d);
3790         state_fio->StateValue(iy.d);
3791         state_fio->StateValue(wz.d);
3792         state_fio->StateValue(af2.d);
3793         state_fio->StateValue(bc2.d);
3794         state_fio->StateValue(de2.d);
3795         state_fio->StateValue(hl2.d);
3796         state_fio->StateValue(I);
3797         state_fio->StateValue(R);
3798         state_fio->StateValue(R2);
3799         state_fio->StateValue(ea);
3800         state_fio->StateValue(busreq);
3801         state_fio->StateValue(after_halt);
3802         state_fio->StateValue(im);
3803         state_fio->StateValue(iff1);
3804         state_fio->StateValue(iff2);
3805         state_fio->StateValue(icr);
3806         state_fio->StateValue(after_ei);
3807         state_fio->StateValue(after_ldair);
3808         state_fio->StateValue(intr_req_bit);
3809         state_fio->StateValue(intr_pend_bit);
3810         
3811         // post process
3812         if(loading) {
3813                 prev_total_icount = total_icount;
3814                 // Post process for collecting statistics.
3815                 cycles_tmp_count = total_icount;
3816                 extra_tmp_count = 0;
3817                 insns_count = 0;
3818                 frames_count = 0;
3819                 nmi_count = 0;
3820                 irq_count = 0;
3821                 nsc800_int_count = 0;
3822                 nsc800_rsta_count = 0;
3823                 nsc800_rsta_count = 0;
3824                 nsc800_rsta_count = 0;
3825         }
3826         return true;
3827 }
3828