1 /*** Z80Em: Portable Z80 emulator *******************************************/
2 /***                                                                      ***/
3 /***                                 Z80.c                                ***/
4 /***                                                                      ***/
5 /*** This file contains the emulation code                                ***/
6 /***                                                                      ***/
7 /*** Copyright (C) Marcel de Kogel 1996,1997,1998                         ***/
8 /***     You are not allowed to distribute this software commercially     ***/
9 /***     Please, notify me, if you make any changes to this file          ***/
10 /****************************************************************************/
11 
12 #include <stdio.h>
13 #include <string.h>
14 #include <stdlib.h>
15 
16 #include "Z80.h"
17 
18 #define M_RDMEM(A)      Z80_RDMEM(A)
19 #define M_WRMEM(A,V)    Z80_WRMEM(A,V)
20 #define M_RDOP(A)       Z80_RDOP(A)
21 #define M_RDOP_ARG(A)   Z80_RDOP_ARG(A)
22 #define M_RDSTACK(A)    Z80_RDSTACK(A)
23 #define M_WRSTACK(A,V)  Z80_WRSTACK(A,V)
24 
25 #define DoIn(lo,hi)     Z80_In((lo)+(((unsigned)(hi))<<8))
26 #define DoOut(lo,hi,v)  Z80_Out((lo)+(((unsigned)(hi))<<8),v)
27 
28 static void Interrupt(int j);
29 static void ei(void);
30 
31 #define S_FLAG          0x80
32 #define Z_FLAG          0x40
33 #define H_FLAG          0x10
34 #define V_FLAG          0x04
35 #define N_FLAG          0x02
36 #define C_FLAG          0x01
37 
38 #define M_SKIP_CALL     R.PC.W.l+=2
39 #define M_SKIP_JP       R.PC.W.l+=2
40 #define M_SKIP_JR       R.PC.W.l+=1
41 #define M_SKIP_RET
42 
43 static Z80_Regs R;
44 int Z80_Running=1;
45 int Z80_IPeriod=50000;
46 int Z80_ICount=50000;
47 #ifdef DEBUG
48 int Z80_Trace=0;
49 int Z80_Trap=-1;
50 #endif
51 #ifdef TRACE
52 static unsigned pc_trace[256];
53 static unsigned pc_count=0;
54 #endif
55 
56 static byte PTable[512];
57 static byte ZSTable[512];
58 static byte ZSPTable[512];
59 #include "Z80DAA.h"
60 
61 typedef void (*opcode_fn) (void);
62 
63 #define M_C     (R.AF.B.l&C_FLAG)
64 #define M_NC    (!M_C)
65 #define M_Z     (R.AF.B.l&Z_FLAG)
66 #define M_NZ    (!M_Z)
67 #define M_M     (R.AF.B.l&S_FLAG)
68 #define M_P     (!M_M)
69 #define M_PE    (R.AF.B.l&V_FLAG)
70 #define M_PO    (!M_PE)
71 
72 /* Get next opcode argument and increment program counter */
M_RDMEM_OPCODE(void)73 INLINE unsigned M_RDMEM_OPCODE (void)
74 {
75  unsigned retval;
76  retval=M_RDOP_ARG(R.PC.D);
77  R.PC.W.l++;
78  return retval;
79 }
80 
M_RDMEM_WORD(dword A)81 INLINE unsigned M_RDMEM_WORD (dword A)
82 {
83  int i;
84  i=M_RDMEM(A);
85  i+=M_RDMEM(((A)+1)&0xFFFF)<<8;
86  return i;
87 }
88 
M_WRMEM_WORD(dword A,word V)89 INLINE void M_WRMEM_WORD (dword A,word V)
90 {
91  M_WRMEM (A,V&255);
92  M_WRMEM (((A)+1)&0xFFFF,V>>8);
93 }
94 
M_RDMEM_OPCODE_WORD(void)95 INLINE unsigned M_RDMEM_OPCODE_WORD (void)
96 {
97  int i;
98  i=M_RDMEM_OPCODE();
99  i+=M_RDMEM_OPCODE()<<8;
100  return i;
101 }
102 
103 #define M_XIX       ((R.IX.D+(offset)M_RDMEM_OPCODE())&0xFFFF)
104 #define M_XIY       ((R.IY.D+(offset)M_RDMEM_OPCODE())&0xFFFF)
105 #define M_RD_XHL    M_RDMEM(R.HL.D)
M_RD_XIX(void)106 INLINE unsigned M_RD_XIX(void)
107 {
108  int i;
109  i=M_XIX;
110  return M_RDMEM(i);
111 }
M_RD_XIY(void)112 INLINE unsigned M_RD_XIY(void)
113 {
114  int i;
115  i=M_XIY;
116  return M_RDMEM(i);
117 }
M_WR_XIX(byte a)118 INLINE void M_WR_XIX(byte a)
119 {
120  int i;
121  i=M_XIX;
122  M_WRMEM(i,a);
123 }
M_WR_XIY(byte a)124 INLINE void M_WR_XIY(byte a)
125 {
126  int i;
127  i=M_XIY;
128  M_WRMEM(i,a);
129 }
130 
131 #ifdef X86_ASM
132 #include "Z80CDx86.h"
133 #else
134 #include "Z80Codes.h"
135 #endif
136 
adc_a_xhl(void)137 static void adc_a_xhl(void) { byte i=M_RD_XHL; M_ADC(i); }
adc_a_xix(void)138 static void adc_a_xix(void) { byte i=M_RD_XIX(); M_ADC(i); }
adc_a_xiy(void)139 static void adc_a_xiy(void) { byte i=M_RD_XIY(); M_ADC(i); }
adc_a_a(void)140 static void adc_a_a(void) { M_ADC(R.AF.B.h); }
adc_a_b(void)141 static void adc_a_b(void) { M_ADC(R.BC.B.h); }
adc_a_c(void)142 static void adc_a_c(void) { M_ADC(R.BC.B.l); }
adc_a_d(void)143 static void adc_a_d(void) { M_ADC(R.DE.B.h); }
adc_a_e(void)144 static void adc_a_e(void) { M_ADC(R.DE.B.l); }
adc_a_h(void)145 static void adc_a_h(void) { M_ADC(R.HL.B.h); }
adc_a_l(void)146 static void adc_a_l(void) { M_ADC(R.HL.B.l); }
adc_a_ixl(void)147 static void adc_a_ixl(void) { M_ADC(R.IX.B.l); }
adc_a_ixh(void)148 static void adc_a_ixh(void) { M_ADC(R.IX.B.h); }
adc_a_iyl(void)149 static void adc_a_iyl(void) { M_ADC(R.IY.B.l); }
adc_a_iyh(void)150 static void adc_a_iyh(void) { M_ADC(R.IY.B.h); }
adc_a_byte(void)151 static void adc_a_byte(void) { byte i=M_RDMEM_OPCODE(); M_ADC(i); }
152 
adc_hl_bc(void)153 static void adc_hl_bc(void) { M_ADCW(BC); }
adc_hl_de(void)154 static void adc_hl_de(void) { M_ADCW(DE); }
adc_hl_hl(void)155 static void adc_hl_hl(void) { M_ADCW(HL); }
adc_hl_sp(void)156 static void adc_hl_sp(void) { M_ADCW(SP); }
157 
add_a_xhl(void)158 static void add_a_xhl(void) { byte i=M_RD_XHL; M_ADD(i); }
add_a_xix(void)159 static void add_a_xix(void) { byte i=M_RD_XIX(); M_ADD(i); }
add_a_xiy(void)160 static void add_a_xiy(void) { byte i=M_RD_XIY(); M_ADD(i); }
add_a_a(void)161 static void add_a_a(void) { M_ADD(R.AF.B.h); }
add_a_b(void)162 static void add_a_b(void) { M_ADD(R.BC.B.h); }
add_a_c(void)163 static void add_a_c(void) { M_ADD(R.BC.B.l); }
add_a_d(void)164 static void add_a_d(void) { M_ADD(R.DE.B.h); }
add_a_e(void)165 static void add_a_e(void) { M_ADD(R.DE.B.l); }
add_a_h(void)166 static void add_a_h(void) { M_ADD(R.HL.B.h); }
add_a_l(void)167 static void add_a_l(void) { M_ADD(R.HL.B.l); }
add_a_ixl(void)168 static void add_a_ixl(void) { M_ADD(R.IX.B.l); }
add_a_ixh(void)169 static void add_a_ixh(void) { M_ADD(R.IX.B.h); }
add_a_iyl(void)170 static void add_a_iyl(void) { M_ADD(R.IY.B.l); }
add_a_iyh(void)171 static void add_a_iyh(void) { M_ADD(R.IY.B.h); }
add_a_byte(void)172 static void add_a_byte(void) { byte i=M_RDMEM_OPCODE(); M_ADD(i); }
173 
add_hl_bc(void)174 static void add_hl_bc(void) { M_ADDW(HL,BC); }
add_hl_de(void)175 static void add_hl_de(void) { M_ADDW(HL,DE); }
add_hl_hl(void)176 static void add_hl_hl(void) { M_ADDW(HL,HL); }
add_hl_sp(void)177 static void add_hl_sp(void) { M_ADDW(HL,SP); }
add_ix_bc(void)178 static void add_ix_bc(void) { M_ADDW(IX,BC); }
add_ix_de(void)179 static void add_ix_de(void) { M_ADDW(IX,DE); }
add_ix_ix(void)180 static void add_ix_ix(void) { M_ADDW(IX,IX); }
add_ix_sp(void)181 static void add_ix_sp(void) { M_ADDW(IX,SP); }
add_iy_bc(void)182 static void add_iy_bc(void) { M_ADDW(IY,BC); }
add_iy_de(void)183 static void add_iy_de(void) { M_ADDW(IY,DE); }
add_iy_iy(void)184 static void add_iy_iy(void) { M_ADDW(IY,IY); }
add_iy_sp(void)185 static void add_iy_sp(void) { M_ADDW(IY,SP); }
186 
and_xhl(void)187 static void and_xhl(void) { byte i=M_RD_XHL; M_AND(i); }
and_xix(void)188 static void and_xix(void) { byte i=M_RD_XIX(); M_AND(i); }
and_xiy(void)189 static void and_xiy(void) { byte i=M_RD_XIY(); M_AND(i); }
and_a(void)190 static void and_a(void) { R.AF.B.l=ZSPTable[R.AF.B.h]|H_FLAG; }
and_b(void)191 static void and_b(void) { M_AND(R.BC.B.h); }
and_c(void)192 static void and_c(void) { M_AND(R.BC.B.l); }
and_d(void)193 static void and_d(void) { M_AND(R.DE.B.h); }
and_e(void)194 static void and_e(void) { M_AND(R.DE.B.l); }
and_h(void)195 static void and_h(void) { M_AND(R.HL.B.h); }
and_l(void)196 static void and_l(void) { M_AND(R.HL.B.l); }
and_ixh(void)197 static void and_ixh(void) { M_AND(R.IX.B.h); }
and_ixl(void)198 static void and_ixl(void) { M_AND(R.IX.B.l); }
and_iyh(void)199 static void and_iyh(void) { M_AND(R.IY.B.h); }
and_iyl(void)200 static void and_iyl(void) { M_AND(R.IY.B.l); }
and_byte(void)201 static void and_byte(void) { byte i=M_RDMEM_OPCODE(); M_AND(i); }
202 
bit_0_xhl(void)203 static void bit_0_xhl(void) { byte i=M_RD_XHL; M_BIT(0,i); }
bit_0_xix(void)204 static void bit_0_xix(void) { byte i=M_RD_XIX(); M_BIT(0,i); }
bit_0_xiy(void)205 static void bit_0_xiy(void) { byte i=M_RD_XIY(); M_BIT(0,i); }
bit_0_a(void)206 static void bit_0_a(void) { M_BIT(0,R.AF.B.h); }
bit_0_b(void)207 static void bit_0_b(void) { M_BIT(0,R.BC.B.h); }
bit_0_c(void)208 static void bit_0_c(void) { M_BIT(0,R.BC.B.l); }
bit_0_d(void)209 static void bit_0_d(void) { M_BIT(0,R.DE.B.h); }
bit_0_e(void)210 static void bit_0_e(void) { M_BIT(0,R.DE.B.l); }
bit_0_h(void)211 static void bit_0_h(void) { M_BIT(0,R.HL.B.h); }
bit_0_l(void)212 static void bit_0_l(void) { M_BIT(0,R.HL.B.l); }
213 
bit_1_xhl(void)214 static void bit_1_xhl(void) { byte i=M_RD_XHL; M_BIT(1,i); }
bit_1_xix(void)215 static void bit_1_xix(void) { byte i=M_RD_XIX(); M_BIT(1,i); }
bit_1_xiy(void)216 static void bit_1_xiy(void) { byte i=M_RD_XIY(); M_BIT(1,i); }
bit_1_a(void)217 static void bit_1_a(void) { M_BIT(1,R.AF.B.h); }
bit_1_b(void)218 static void bit_1_b(void) { M_BIT(1,R.BC.B.h); }
bit_1_c(void)219 static void bit_1_c(void) { M_BIT(1,R.BC.B.l); }
bit_1_d(void)220 static void bit_1_d(void) { M_BIT(1,R.DE.B.h); }
bit_1_e(void)221 static void bit_1_e(void) { M_BIT(1,R.DE.B.l); }
bit_1_h(void)222 static void bit_1_h(void) { M_BIT(1,R.HL.B.h); }
bit_1_l(void)223 static void bit_1_l(void) { M_BIT(1,R.HL.B.l); }
224 
bit_2_xhl(void)225 static void bit_2_xhl(void) { byte i=M_RD_XHL; M_BIT(2,i); }
bit_2_xix(void)226 static void bit_2_xix(void) { byte i=M_RD_XIX(); M_BIT(2,i); }
bit_2_xiy(void)227 static void bit_2_xiy(void) { byte i=M_RD_XIY(); M_BIT(2,i); }
bit_2_a(void)228 static void bit_2_a(void) { M_BIT(2,R.AF.B.h); }
bit_2_b(void)229 static void bit_2_b(void) { M_BIT(2,R.BC.B.h); }
bit_2_c(void)230 static void bit_2_c(void) { M_BIT(2,R.BC.B.l); }
bit_2_d(void)231 static void bit_2_d(void) { M_BIT(2,R.DE.B.h); }
bit_2_e(void)232 static void bit_2_e(void) { M_BIT(2,R.DE.B.l); }
bit_2_h(void)233 static void bit_2_h(void) { M_BIT(2,R.HL.B.h); }
bit_2_l(void)234 static void bit_2_l(void) { M_BIT(2,R.HL.B.l); }
235 
bit_3_xhl(void)236 static void bit_3_xhl(void) { byte i=M_RD_XHL; M_BIT(3,i); }
bit_3_xix(void)237 static void bit_3_xix(void) { byte i=M_RD_XIX(); M_BIT(3,i); }
bit_3_xiy(void)238 static void bit_3_xiy(void) { byte i=M_RD_XIY(); M_BIT(3,i); }
bit_3_a(void)239 static void bit_3_a(void) { M_BIT(3,R.AF.B.h); }
bit_3_b(void)240 static void bit_3_b(void) { M_BIT(3,R.BC.B.h); }
bit_3_c(void)241 static void bit_3_c(void) { M_BIT(3,R.BC.B.l); }
bit_3_d(void)242 static void bit_3_d(void) { M_BIT(3,R.DE.B.h); }
bit_3_e(void)243 static void bit_3_e(void) { M_BIT(3,R.DE.B.l); }
bit_3_h(void)244 static void bit_3_h(void) { M_BIT(3,R.HL.B.h); }
bit_3_l(void)245 static void bit_3_l(void) { M_BIT(3,R.HL.B.l); }
246 
bit_4_xhl(void)247 static void bit_4_xhl(void) { byte i=M_RD_XHL; M_BIT(4,i); }
bit_4_xix(void)248 static void bit_4_xix(void) { byte i=M_RD_XIX(); M_BIT(4,i); }
bit_4_xiy(void)249 static void bit_4_xiy(void) { byte i=M_RD_XIY(); M_BIT(4,i); }
bit_4_a(void)250 static void bit_4_a(void) { M_BIT(4,R.AF.B.h); }
bit_4_b(void)251 static void bit_4_b(void) { M_BIT(4,R.BC.B.h); }
bit_4_c(void)252 static void bit_4_c(void) { M_BIT(4,R.BC.B.l); }
bit_4_d(void)253 static void bit_4_d(void) { M_BIT(4,R.DE.B.h); }
bit_4_e(void)254 static void bit_4_e(void) { M_BIT(4,R.DE.B.l); }
bit_4_h(void)255 static void bit_4_h(void) { M_BIT(4,R.HL.B.h); }
bit_4_l(void)256 static void bit_4_l(void) { M_BIT(4,R.HL.B.l); }
257 
bit_5_xhl(void)258 static void bit_5_xhl(void) { byte i=M_RD_XHL; M_BIT(5,i); }
bit_5_xix(void)259 static void bit_5_xix(void) { byte i=M_RD_XIX(); M_BIT(5,i); }
bit_5_xiy(void)260 static void bit_5_xiy(void) { byte i=M_RD_XIY(); M_BIT(5,i); }
bit_5_a(void)261 static void bit_5_a(void) { M_BIT(5,R.AF.B.h); }
bit_5_b(void)262 static void bit_5_b(void) { M_BIT(5,R.BC.B.h); }
bit_5_c(void)263 static void bit_5_c(void) { M_BIT(5,R.BC.B.l); }
bit_5_d(void)264 static void bit_5_d(void) { M_BIT(5,R.DE.B.h); }
bit_5_e(void)265 static void bit_5_e(void) { M_BIT(5,R.DE.B.l); }
bit_5_h(void)266 static void bit_5_h(void) { M_BIT(5,R.HL.B.h); }
bit_5_l(void)267 static void bit_5_l(void) { M_BIT(5,R.HL.B.l); }
268 
bit_6_xhl(void)269 static void bit_6_xhl(void) { byte i=M_RD_XHL; M_BIT(6,i); }
bit_6_xix(void)270 static void bit_6_xix(void) { byte i=M_RD_XIX(); M_BIT(6,i); }
bit_6_xiy(void)271 static void bit_6_xiy(void) { byte i=M_RD_XIY(); M_BIT(6,i); }
bit_6_a(void)272 static void bit_6_a(void) { M_BIT(6,R.AF.B.h); }
bit_6_b(void)273 static void bit_6_b(void) { M_BIT(6,R.BC.B.h); }
bit_6_c(void)274 static void bit_6_c(void) { M_BIT(6,R.BC.B.l); }
bit_6_d(void)275 static void bit_6_d(void) { M_BIT(6,R.DE.B.h); }
bit_6_e(void)276 static void bit_6_e(void) { M_BIT(6,R.DE.B.l); }
bit_6_h(void)277 static void bit_6_h(void) { M_BIT(6,R.HL.B.h); }
bit_6_l(void)278 static void bit_6_l(void) { M_BIT(6,R.HL.B.l); }
279 
bit_7_xhl(void)280 static void bit_7_xhl(void) { byte i=M_RD_XHL; M_BIT(7,i); }
bit_7_xix(void)281 static void bit_7_xix(void) { byte i=M_RD_XIX(); M_BIT(7,i); }
bit_7_xiy(void)282 static void bit_7_xiy(void) { byte i=M_RD_XIY(); M_BIT(7,i); }
bit_7_a(void)283 static void bit_7_a(void) { M_BIT(7,R.AF.B.h); }
bit_7_b(void)284 static void bit_7_b(void) { M_BIT(7,R.BC.B.h); }
bit_7_c(void)285 static void bit_7_c(void) { M_BIT(7,R.BC.B.l); }
bit_7_d(void)286 static void bit_7_d(void) { M_BIT(7,R.DE.B.h); }
bit_7_e(void)287 static void bit_7_e(void) { M_BIT(7,R.DE.B.l); }
bit_7_h(void)288 static void bit_7_h(void) { M_BIT(7,R.HL.B.h); }
bit_7_l(void)289 static void bit_7_l(void) { M_BIT(7,R.HL.B.l); }
290 
call_c(void)291 static void call_c(void) { if (M_C) { M_CALL; } else { M_SKIP_CALL; } }
call_m(void)292 static void call_m(void) { if (M_M) { M_CALL; } else { M_SKIP_CALL; } }
call_nc(void)293 static void call_nc(void) { if (M_NC) { M_CALL; } else { M_SKIP_CALL; } }
call_nz(void)294 static void call_nz(void) { if (M_NZ) { M_CALL; } else { M_SKIP_CALL; } }
call_p(void)295 static void call_p(void) { if (M_P) { M_CALL; } else { M_SKIP_CALL; } }
call_pe(void)296 static void call_pe(void) { if (M_PE) { M_CALL; } else { M_SKIP_CALL; } }
call_po(void)297 static void call_po(void) { if (M_PO) { M_CALL; } else { M_SKIP_CALL; } }
call_z(void)298 static void call_z(void) { if (M_Z) { M_CALL; } else { M_SKIP_CALL; } }
call(void)299 static void call(void) { M_CALL; }
300 
ccf(void)301 static void ccf(void) { R.AF.B.l=((R.AF.B.l&0xED)|((R.AF.B.l&1)<<4))^1; }
302 
cp_xhl(void)303 static void cp_xhl(void) { byte i=M_RD_XHL; M_CP(i); }
cp_xix(void)304 static void cp_xix(void) { byte i=M_RD_XIX(); M_CP(i); }
cp_xiy(void)305 static void cp_xiy(void) { byte i=M_RD_XIY(); M_CP(i); }
cp_a(void)306 static void cp_a(void) { M_CP(R.AF.B.h); }
cp_b(void)307 static void cp_b(void) { M_CP(R.BC.B.h); }
cp_c(void)308 static void cp_c(void) { M_CP(R.BC.B.l); }
cp_d(void)309 static void cp_d(void) { M_CP(R.DE.B.h); }
cp_e(void)310 static void cp_e(void) { M_CP(R.DE.B.l); }
cp_h(void)311 static void cp_h(void) { M_CP(R.HL.B.h); }
cp_l(void)312 static void cp_l(void) { M_CP(R.HL.B.l); }
cp_ixh(void)313 static void cp_ixh(void) { M_CP(R.IX.B.h); }
cp_ixl(void)314 static void cp_ixl(void) { M_CP(R.IX.B.l); }
cp_iyh(void)315 static void cp_iyh(void) { M_CP(R.IY.B.h); }
cp_iyl(void)316 static void cp_iyl(void) { M_CP(R.IY.B.l); }
cp_byte(void)317 static void cp_byte(void) { byte i=M_RDMEM_OPCODE(); M_CP(i); }
318 
cpd(void)319 static void cpd(void)
320 {
321  byte i,j;
322  i=M_RDMEM(R.HL.D);
323  j=R.AF.B.h-i;
324  --R.HL.W.l;
325  --R.BC.W.l;
326  R.AF.B.l=(R.AF.B.l&C_FLAG)|ZSTable[j]|
327           ((R.AF.B.h^i^j)&H_FLAG)|(R.BC.D? V_FLAG:0)|N_FLAG;
328 }
329 
cpdr(void)330 static void cpdr(void)
331 {
332  cpd ();
333  if (R.BC.D && !(R.AF.B.l&Z_FLAG)) { Z80_ICount-=5; R.PC.W.l-=2; }
334 }
335 
cpi(void)336 static void cpi(void)
337 {
338  byte i,j;
339  i=M_RDMEM(R.HL.D);
340  j=R.AF.B.h-i;
341  ++R.HL.W.l;
342  --R.BC.W.l;
343  R.AF.B.l=(R.AF.B.l&C_FLAG)|ZSTable[j]|
344           ((R.AF.B.h^i^j)&H_FLAG)|(R.BC.D? V_FLAG:0)|N_FLAG;
345 }
346 
cpir(void)347 static void cpir(void)
348 {
349  cpi ();
350  if (R.BC.D && !(R.AF.B.l&Z_FLAG)) { Z80_ICount-=5; R.PC.W.l-=2; }
351 }
352 
cpl(void)353 static void cpl(void) { R.AF.B.h^=0xFF; R.AF.B.l|=(H_FLAG|N_FLAG); }
354 
daa(void)355 static void daa(void)
356 {
357  int i;
358  i=R.AF.B.h;
359  if (R.AF.B.l&C_FLAG) i|=256;
360  if (R.AF.B.l&H_FLAG) i|=512;
361  if (R.AF.B.l&N_FLAG) i|=1024;
362  R.AF.W.l=DAATable[i];
363 }
364 
dec_xhl(void)365 static void dec_xhl(void)
366 {
367  byte i;
368  i=M_RDMEM(R.HL.D);
369  M_DEC(i);
370  M_WRMEM(R.HL.D,i);
371 }
dec_xix(void)372 static void dec_xix(void)
373 {
374  byte i;
375  int j;
376  j=M_XIX;
377  i=M_RDMEM(j);
378  M_DEC(i);
379  M_WRMEM(j,i);
380 }
dec_xiy(void)381 static void dec_xiy(void)
382 {
383  byte i;
384  int j;
385  j=M_XIY;
386  i=M_RDMEM(j);
387  M_DEC(i);
388  M_WRMEM(j,i);
389 }
dec_a(void)390 static void dec_a(void) { M_DEC(R.AF.B.h); }
dec_b(void)391 static void dec_b(void) { M_DEC(R.BC.B.h); }
dec_c(void)392 static void dec_c(void) { M_DEC(R.BC.B.l); }
dec_d(void)393 static void dec_d(void) { M_DEC(R.DE.B.h); }
dec_e(void)394 static void dec_e(void) { M_DEC(R.DE.B.l); }
dec_h(void)395 static void dec_h(void) { M_DEC(R.HL.B.h); }
dec_l(void)396 static void dec_l(void) { M_DEC(R.HL.B.l); }
dec_ixh(void)397 static void dec_ixh(void) { M_DEC(R.IX.B.h); }
dec_ixl(void)398 static void dec_ixl(void) { M_DEC(R.IX.B.l); }
dec_iyh(void)399 static void dec_iyh(void) { M_DEC(R.IY.B.h); }
dec_iyl(void)400 static void dec_iyl(void) { M_DEC(R.IY.B.l); }
401 
dec_bc(void)402 static void dec_bc(void) { --R.BC.W.l; }
dec_de(void)403 static void dec_de(void) { --R.DE.W.l; }
dec_hl(void)404 static void dec_hl(void) { --R.HL.W.l; }
dec_ix(void)405 static void dec_ix(void) { --R.IX.W.l; }
dec_iy(void)406 static void dec_iy(void) { --R.IY.W.l; }
dec_sp(void)407 static void dec_sp(void) { --R.SP.W.l; }
408 
di(void)409 static void di(void) { R.IFF1=R.IFF2=0; }
410 
djnz(void)411 static void djnz(void) { if (--R.BC.B.h) { M_JR; } else { M_SKIP_JR; } }
412 
ex_xsp_hl(void)413 static void ex_xsp_hl(void)
414 {
415  int i;
416  i=M_RDMEM_WORD(R.SP.D);
417  M_WRMEM_WORD(R.SP.D,R.HL.D);
418  R.HL.D=i;
419 }
420 
ex_xsp_ix(void)421 static void ex_xsp_ix(void)
422 {
423  int i;
424  i=M_RDMEM_WORD(R.SP.D);
425  M_WRMEM_WORD(R.SP.D,R.IX.D);
426  R.IX.D=i;
427 }
428 
ex_xsp_iy(void)429 static void ex_xsp_iy(void)
430 {
431  int i;
432  i=M_RDMEM_WORD(R.SP.D);
433  M_WRMEM_WORD(R.SP.D,R.IY.D);
434  R.IY.D=i;
435 }
436 
ex_af_af(void)437 static void ex_af_af(void)
438 {
439  int i;
440  i=R.AF.D;
441  R.AF.D=R.AF2.D;
442  R.AF2.D=i;
443 }
444 
ex_de_hl(void)445 static void ex_de_hl(void)
446 {
447  int i;
448  i=R.DE.D;
449  R.DE.D=R.HL.D;
450  R.HL.D=i;
451 }
452 
exx(void)453 static void exx(void)
454 {
455  int i;
456  i=R.BC.D;
457  R.BC.D=R.BC2.D;
458  R.BC2.D=i;
459  i=R.DE.D;
460  R.DE.D=R.DE2.D;
461  R.DE2.D=i;
462  i=R.HL.D;
463  R.HL.D=R.HL2.D;
464  R.HL2.D=i;
465 }
466 
halt(void)467 static void halt(void)
468 {
469  --R.PC.W.l;
470  R.HALT=1;
471  if (Z80_ICount>0) Z80_ICount=0;
472 }
473 
im_0(void)474 static void im_0(void) { R.IM=0; }
im_1(void)475 static void im_1(void) { R.IM=1; }
im_2(void)476 static void im_2(void) { R.IM=2; }
477 
in_a_c(void)478 static void in_a_c(void) { M_IN(R.AF.B.h); }
in_b_c(void)479 static void in_b_c(void) { M_IN(R.BC.B.h); }
in_c_c(void)480 static void in_c_c(void) { M_IN(R.BC.B.l); }
in_d_c(void)481 static void in_d_c(void) { M_IN(R.DE.B.h); }
in_e_c(void)482 static void in_e_c(void) { M_IN(R.DE.B.l); }
in_h_c(void)483 static void in_h_c(void) { M_IN(R.HL.B.h); }
in_l_c(void)484 static void in_l_c(void) { M_IN(R.HL.B.l); }
in_0_c(void)485 static void in_0_c(void) { byte i; M_IN(i); }
486 
in_a_byte(void)487 static void in_a_byte(void)
488 {
489  byte i=M_RDMEM_OPCODE();
490  R.AF.B.h=DoIn(i,R.AF.B.h);
491 }
492 
inc_xhl(void)493 static void inc_xhl(void)
494 {
495  byte i;
496  i=M_RDMEM(R.HL.D);
497  M_INC(i);
498  M_WRMEM(R.HL.D,i);
499 }
inc_xix(void)500 static void inc_xix(void)
501 {
502  byte i;
503  int j;
504  j=M_XIX;
505  i=M_RDMEM(j);
506  M_INC(i);
507  M_WRMEM(j,i);
508 }
inc_xiy(void)509 static void inc_xiy(void)
510 {
511  byte i;
512  int j;
513  j=M_XIY;
514  i=M_RDMEM(j);
515  M_INC(i);
516  M_WRMEM(j,i);
517 }
inc_a(void)518 static void inc_a(void) { M_INC(R.AF.B.h); }
inc_b(void)519 static void inc_b(void) { M_INC(R.BC.B.h); }
inc_c(void)520 static void inc_c(void) { M_INC(R.BC.B.l); }
inc_d(void)521 static void inc_d(void) { M_INC(R.DE.B.h); }
inc_e(void)522 static void inc_e(void) { M_INC(R.DE.B.l); }
inc_h(void)523 static void inc_h(void) { M_INC(R.HL.B.h); }
inc_l(void)524 static void inc_l(void) { M_INC(R.HL.B.l); }
inc_ixh(void)525 static void inc_ixh(void) { M_INC(R.IX.B.h); }
inc_ixl(void)526 static void inc_ixl(void) { M_INC(R.IX.B.l); }
inc_iyh(void)527 static void inc_iyh(void) { M_INC(R.IY.B.h); }
inc_iyl(void)528 static void inc_iyl(void) { M_INC(R.IY.B.l); }
529 
inc_bc(void)530 static void inc_bc(void) { ++R.BC.W.l; }
inc_de(void)531 static void inc_de(void) { ++R.DE.W.l; }
inc_hl(void)532 static void inc_hl(void) { ++R.HL.W.l; }
inc_ix(void)533 static void inc_ix(void) { ++R.IX.W.l; }
inc_iy(void)534 static void inc_iy(void) { ++R.IY.W.l; }
inc_sp(void)535 static void inc_sp(void) { ++R.SP.W.l; }
536 
ind(void)537 static void ind(void)
538 {
539  --R.BC.B.h;
540  M_WRMEM(R.HL.D,DoIn(R.BC.B.l,R.BC.B.h));
541  --R.HL.W.l;
542  R.AF.B.l=(R.BC.B.h)? N_FLAG:(N_FLAG|Z_FLAG);
543 }
544 
indr(void)545 static void indr(void)
546 {
547  ind ();
548  if (R.BC.B.h) { Z80_ICount-=5; R.PC.W.l-=2; }
549 }
550 
ini(void)551 static void ini(void)
552 {
553  --R.BC.B.h;
554  M_WRMEM(R.HL.D,DoIn(R.BC.B.l,R.BC.B.h));
555  ++R.HL.W.l;
556  R.AF.B.l=(R.BC.B.h)? N_FLAG:(N_FLAG|Z_FLAG);
557 }
558 
inir(void)559 static void inir(void)
560 {
561  ini ();
562  if (R.BC.B.h) { Z80_ICount-=5; R.PC.W.l-=2; }
563 }
564 
jp(void)565 static void jp(void) { M_JP; }
jp_hl(void)566 static void jp_hl(void) { R.PC.D=R.HL.D; }
jp_ix(void)567 static void jp_ix(void) { R.PC.D=R.IX.D; }
jp_iy(void)568 static void jp_iy(void) { R.PC.D=R.IY.D; }
jp_c(void)569 static void jp_c(void) { if (M_C) { M_JP; } else { M_SKIP_JP; } }
jp_m(void)570 static void jp_m(void) { if (M_M) { M_JP; } else { M_SKIP_JP; } }
jp_nc(void)571 static void jp_nc(void) { if (M_NC) { M_JP; } else { M_SKIP_JP; } }
jp_nz(void)572 static void jp_nz(void) { if (M_NZ) { M_JP; } else { M_SKIP_JP; } }
jp_p(void)573 static void jp_p(void) { if (M_P) { M_JP; } else { M_SKIP_JP; } }
jp_pe(void)574 static void jp_pe(void) { if (M_PE) { M_JP; } else { M_SKIP_JP; } }
jp_po(void)575 static void jp_po(void) { if (M_PO) { M_JP; } else { M_SKIP_JP; } }
jp_z(void)576 static void jp_z(void) { if (M_Z) { M_JP; } else { M_SKIP_JP; } }
577 
jr(void)578 static void jr(void) { M_JR; }
jr_c(void)579 static void jr_c(void) { if (M_C) { M_JR; } else { M_SKIP_JR; } }
jr_nc(void)580 static void jr_nc(void) { if (M_NC) { M_JR; } else { M_SKIP_JR; } }
jr_nz(void)581 static void jr_nz(void) { if (M_NZ) { M_JR; } else { M_SKIP_JR; } }
jr_z(void)582 static void jr_z(void) { if (M_Z) { M_JR; } else { M_SKIP_JR; } }
583 
ld_xbc_a(void)584 static void ld_xbc_a(void) { M_WRMEM(R.BC.D,R.AF.B.h); }
ld_xde_a(void)585 static void ld_xde_a(void) { M_WRMEM(R.DE.D,R.AF.B.h); }
ld_xhl_a(void)586 static void ld_xhl_a(void) { M_WRMEM(R.HL.D,R.AF.B.h); }
ld_xhl_b(void)587 static void ld_xhl_b(void) { M_WRMEM(R.HL.D,R.BC.B.h); }
ld_xhl_c(void)588 static void ld_xhl_c(void) { M_WRMEM(R.HL.D,R.BC.B.l); }
ld_xhl_d(void)589 static void ld_xhl_d(void) { M_WRMEM(R.HL.D,R.DE.B.h); }
ld_xhl_e(void)590 static void ld_xhl_e(void) { M_WRMEM(R.HL.D,R.DE.B.l); }
ld_xhl_h(void)591 static void ld_xhl_h(void) { M_WRMEM(R.HL.D,R.HL.B.h); }
ld_xhl_l(void)592 static void ld_xhl_l(void) { M_WRMEM(R.HL.D,R.HL.B.l); }
ld_xhl_byte(void)593 static void ld_xhl_byte(void) { byte i=M_RDMEM_OPCODE(); M_WRMEM(R.HL.D,i); }
ld_xix_a(void)594 static void ld_xix_a(void) { M_WR_XIX(R.AF.B.h); }
ld_xix_b(void)595 static void ld_xix_b(void) { M_WR_XIX(R.BC.B.h); }
ld_xix_c(void)596 static void ld_xix_c(void) { M_WR_XIX(R.BC.B.l); }
ld_xix_d(void)597 static void ld_xix_d(void) { M_WR_XIX(R.DE.B.h); }
ld_xix_e(void)598 static void ld_xix_e(void) { M_WR_XIX(R.DE.B.l); }
ld_xix_h(void)599 static void ld_xix_h(void) { M_WR_XIX(R.HL.B.h); }
ld_xix_l(void)600 static void ld_xix_l(void) { M_WR_XIX(R.HL.B.l); }
ld_xix_byte(void)601 static void ld_xix_byte(void)
602 {
603  int i,j;
604  i=M_XIX;
605  j=M_RDMEM_OPCODE();
606  M_WRMEM(i,j);
607 }
ld_xiy_a(void)608 static void ld_xiy_a(void) { M_WR_XIY(R.AF.B.h); }
ld_xiy_b(void)609 static void ld_xiy_b(void) { M_WR_XIY(R.BC.B.h); }
ld_xiy_c(void)610 static void ld_xiy_c(void) { M_WR_XIY(R.BC.B.l); }
ld_xiy_d(void)611 static void ld_xiy_d(void) { M_WR_XIY(R.DE.B.h); }
ld_xiy_e(void)612 static void ld_xiy_e(void) { M_WR_XIY(R.DE.B.l); }
ld_xiy_h(void)613 static void ld_xiy_h(void) { M_WR_XIY(R.HL.B.h); }
ld_xiy_l(void)614 static void ld_xiy_l(void) { M_WR_XIY(R.HL.B.l); }
ld_xiy_byte(void)615 static void ld_xiy_byte(void)
616 {
617  int i,j;
618  i=M_XIY;
619  j=M_RDMEM_OPCODE();
620  M_WRMEM(i,j);
621 }
ld_xbyte_a(void)622 static void ld_xbyte_a(void)
623 { int i=M_RDMEM_OPCODE_WORD(); M_WRMEM(i,R.AF.B.h); }
ld_xword_bc(void)624 static void ld_xword_bc(void) { M_WRMEM_WORD(M_RDMEM_OPCODE_WORD(),R.BC.D); }
ld_xword_de(void)625 static void ld_xword_de(void) { M_WRMEM_WORD(M_RDMEM_OPCODE_WORD(),R.DE.D); }
ld_xword_hl(void)626 static void ld_xword_hl(void) { M_WRMEM_WORD(M_RDMEM_OPCODE_WORD(),R.HL.D); }
ld_xword_ix(void)627 static void ld_xword_ix(void) { M_WRMEM_WORD(M_RDMEM_OPCODE_WORD(),R.IX.D); }
ld_xword_iy(void)628 static void ld_xword_iy(void) { M_WRMEM_WORD(M_RDMEM_OPCODE_WORD(),R.IY.D); }
ld_xword_sp(void)629 static void ld_xword_sp(void) { M_WRMEM_WORD(M_RDMEM_OPCODE_WORD(),R.SP.D); }
ld_a_xbc(void)630 static void ld_a_xbc(void) { R.AF.B.h=M_RDMEM(R.BC.D); }
ld_a_xde(void)631 static void ld_a_xde(void) { R.AF.B.h=M_RDMEM(R.DE.D); }
ld_a_xhl(void)632 static void ld_a_xhl(void) { R.AF.B.h=M_RD_XHL; }
ld_a_xix(void)633 static void ld_a_xix(void) { R.AF.B.h=M_RD_XIX(); }
ld_a_xiy(void)634 static void ld_a_xiy(void) { R.AF.B.h=M_RD_XIY(); }
ld_a_xbyte(void)635 static void ld_a_xbyte(void)
636 { int i=M_RDMEM_OPCODE_WORD(); R.AF.B.h=M_RDMEM(i); }
637 
ld_a_byte(void)638 static void ld_a_byte(void) { R.AF.B.h=M_RDMEM_OPCODE(); }
ld_b_byte(void)639 static void ld_b_byte(void) { R.BC.B.h=M_RDMEM_OPCODE(); }
ld_c_byte(void)640 static void ld_c_byte(void) { R.BC.B.l=M_RDMEM_OPCODE(); }
ld_d_byte(void)641 static void ld_d_byte(void) { R.DE.B.h=M_RDMEM_OPCODE(); }
ld_e_byte(void)642 static void ld_e_byte(void) { R.DE.B.l=M_RDMEM_OPCODE(); }
ld_h_byte(void)643 static void ld_h_byte(void) { R.HL.B.h=M_RDMEM_OPCODE(); }
ld_l_byte(void)644 static void ld_l_byte(void) { R.HL.B.l=M_RDMEM_OPCODE(); }
ld_ixh_byte(void)645 static void ld_ixh_byte(void) { R.IX.B.h=M_RDMEM_OPCODE(); }
ld_ixl_byte(void)646 static void ld_ixl_byte(void) { R.IX.B.l=M_RDMEM_OPCODE(); }
ld_iyh_byte(void)647 static void ld_iyh_byte(void) { R.IY.B.h=M_RDMEM_OPCODE(); }
ld_iyl_byte(void)648 static void ld_iyl_byte(void) { R.IY.B.l=M_RDMEM_OPCODE(); }
649 
ld_b_xhl(void)650 static void ld_b_xhl(void) { R.BC.B.h=M_RD_XHL; }
ld_c_xhl(void)651 static void ld_c_xhl(void) { R.BC.B.l=M_RD_XHL; }
ld_d_xhl(void)652 static void ld_d_xhl(void) { R.DE.B.h=M_RD_XHL; }
ld_e_xhl(void)653 static void ld_e_xhl(void) { R.DE.B.l=M_RD_XHL; }
ld_h_xhl(void)654 static void ld_h_xhl(void) { R.HL.B.h=M_RD_XHL; }
ld_l_xhl(void)655 static void ld_l_xhl(void) { R.HL.B.l=M_RD_XHL; }
ld_b_xix(void)656 static void ld_b_xix(void) { R.BC.B.h=M_RD_XIX(); }
ld_c_xix(void)657 static void ld_c_xix(void) { R.BC.B.l=M_RD_XIX(); }
ld_d_xix(void)658 static void ld_d_xix(void) { R.DE.B.h=M_RD_XIX(); }
ld_e_xix(void)659 static void ld_e_xix(void) { R.DE.B.l=M_RD_XIX(); }
ld_h_xix(void)660 static void ld_h_xix(void) { R.HL.B.h=M_RD_XIX(); }
ld_l_xix(void)661 static void ld_l_xix(void) { R.HL.B.l=M_RD_XIX(); }
ld_b_xiy(void)662 static void ld_b_xiy(void) { R.BC.B.h=M_RD_XIY(); }
ld_c_xiy(void)663 static void ld_c_xiy(void) { R.BC.B.l=M_RD_XIY(); }
ld_d_xiy(void)664 static void ld_d_xiy(void) { R.DE.B.h=M_RD_XIY(); }
ld_e_xiy(void)665 static void ld_e_xiy(void) { R.DE.B.l=M_RD_XIY(); }
ld_h_xiy(void)666 static void ld_h_xiy(void) { R.HL.B.h=M_RD_XIY(); }
ld_l_xiy(void)667 static void ld_l_xiy(void) { R.HL.B.l=M_RD_XIY(); }
ld_a_a(void)668 static void ld_a_a(void) { }
ld_a_b(void)669 static void ld_a_b(void) { R.AF.B.h=R.BC.B.h; }
ld_a_c(void)670 static void ld_a_c(void) { R.AF.B.h=R.BC.B.l; }
ld_a_d(void)671 static void ld_a_d(void) { R.AF.B.h=R.DE.B.h; }
ld_a_e(void)672 static void ld_a_e(void) { R.AF.B.h=R.DE.B.l; }
ld_a_h(void)673 static void ld_a_h(void) { R.AF.B.h=R.HL.B.h; }
ld_a_l(void)674 static void ld_a_l(void) { R.AF.B.h=R.HL.B.l; }
ld_a_ixh(void)675 static void ld_a_ixh(void) { R.AF.B.h=R.IX.B.h; }
ld_a_ixl(void)676 static void ld_a_ixl(void) { R.AF.B.h=R.IX.B.l; }
ld_a_iyh(void)677 static void ld_a_iyh(void) { R.AF.B.h=R.IY.B.h; }
ld_a_iyl(void)678 static void ld_a_iyl(void) { R.AF.B.h=R.IY.B.l; }
ld_b_b(void)679 static void ld_b_b(void) { }
ld_b_a(void)680 static void ld_b_a(void) { R.BC.B.h=R.AF.B.h; }
ld_b_c(void)681 static void ld_b_c(void) { R.BC.B.h=R.BC.B.l; }
ld_b_d(void)682 static void ld_b_d(void) { R.BC.B.h=R.DE.B.h; }
ld_b_e(void)683 static void ld_b_e(void) { R.BC.B.h=R.DE.B.l; }
ld_b_h(void)684 static void ld_b_h(void) { R.BC.B.h=R.HL.B.h; }
ld_b_l(void)685 static void ld_b_l(void) { R.BC.B.h=R.HL.B.l; }
ld_b_ixh(void)686 static void ld_b_ixh(void) { R.BC.B.h=R.IX.B.h; }
ld_b_ixl(void)687 static void ld_b_ixl(void) { R.BC.B.h=R.IX.B.l; }
ld_b_iyh(void)688 static void ld_b_iyh(void) { R.BC.B.h=R.IY.B.h; }
ld_b_iyl(void)689 static void ld_b_iyl(void) { R.BC.B.h=R.IY.B.l; }
ld_c_c(void)690 static void ld_c_c(void) { }
ld_c_a(void)691 static void ld_c_a(void) { R.BC.B.l=R.AF.B.h; }
ld_c_b(void)692 static void ld_c_b(void) { R.BC.B.l=R.BC.B.h; }
ld_c_d(void)693 static void ld_c_d(void) { R.BC.B.l=R.DE.B.h; }
ld_c_e(void)694 static void ld_c_e(void) { R.BC.B.l=R.DE.B.l; }
ld_c_h(void)695 static void ld_c_h(void) { R.BC.B.l=R.HL.B.h; }
ld_c_l(void)696 static void ld_c_l(void) { R.BC.B.l=R.HL.B.l; }
ld_c_ixh(void)697 static void ld_c_ixh(void) { R.BC.B.l=R.IX.B.h; }
ld_c_ixl(void)698 static void ld_c_ixl(void) { R.BC.B.l=R.IX.B.l; }
ld_c_iyh(void)699 static void ld_c_iyh(void) { R.BC.B.l=R.IY.B.h; }
ld_c_iyl(void)700 static void ld_c_iyl(void) { R.BC.B.l=R.IY.B.l; }
ld_d_d(void)701 static void ld_d_d(void) { }
ld_d_a(void)702 static void ld_d_a(void) { R.DE.B.h=R.AF.B.h; }
ld_d_c(void)703 static void ld_d_c(void) { R.DE.B.h=R.BC.B.l; }
ld_d_b(void)704 static void ld_d_b(void) { R.DE.B.h=R.BC.B.h; }
ld_d_e(void)705 static void ld_d_e(void) { R.DE.B.h=R.DE.B.l; }
ld_d_h(void)706 static void ld_d_h(void) { R.DE.B.h=R.HL.B.h; }
ld_d_l(void)707 static void ld_d_l(void) { R.DE.B.h=R.HL.B.l; }
ld_d_ixh(void)708 static void ld_d_ixh(void) { R.DE.B.h=R.IX.B.h; }
ld_d_ixl(void)709 static void ld_d_ixl(void) { R.DE.B.h=R.IX.B.l; }
ld_d_iyh(void)710 static void ld_d_iyh(void) { R.DE.B.h=R.IY.B.h; }
ld_d_iyl(void)711 static void ld_d_iyl(void) { R.DE.B.h=R.IY.B.l; }
ld_e_e(void)712 static void ld_e_e(void) { }
ld_e_a(void)713 static void ld_e_a(void) { R.DE.B.l=R.AF.B.h; }
ld_e_c(void)714 static void ld_e_c(void) { R.DE.B.l=R.BC.B.l; }
ld_e_b(void)715 static void ld_e_b(void) { R.DE.B.l=R.BC.B.h; }
ld_e_d(void)716 static void ld_e_d(void) { R.DE.B.l=R.DE.B.h; }
ld_e_h(void)717 static void ld_e_h(void) { R.DE.B.l=R.HL.B.h; }
ld_e_l(void)718 static void ld_e_l(void) { R.DE.B.l=R.HL.B.l; }
ld_e_ixh(void)719 static void ld_e_ixh(void) { R.DE.B.l=R.IX.B.h; }
ld_e_ixl(void)720 static void ld_e_ixl(void) { R.DE.B.l=R.IX.B.l; }
ld_e_iyh(void)721 static void ld_e_iyh(void) { R.DE.B.l=R.IY.B.h; }
ld_e_iyl(void)722 static void ld_e_iyl(void) { R.DE.B.l=R.IY.B.l; }
ld_h_h(void)723 static void ld_h_h(void) { }
ld_h_a(void)724 static void ld_h_a(void) { R.HL.B.h=R.AF.B.h; }
ld_h_c(void)725 static void ld_h_c(void) { R.HL.B.h=R.BC.B.l; }
ld_h_b(void)726 static void ld_h_b(void) { R.HL.B.h=R.BC.B.h; }
ld_h_e(void)727 static void ld_h_e(void) { R.HL.B.h=R.DE.B.l; }
ld_h_d(void)728 static void ld_h_d(void) { R.HL.B.h=R.DE.B.h; }
ld_h_l(void)729 static void ld_h_l(void) { R.HL.B.h=R.HL.B.l; }
ld_l_l(void)730 static void ld_l_l(void) { }
ld_l_a(void)731 static void ld_l_a(void) { R.HL.B.l=R.AF.B.h; }
ld_l_c(void)732 static void ld_l_c(void) { R.HL.B.l=R.BC.B.l; }
ld_l_b(void)733 static void ld_l_b(void) { R.HL.B.l=R.BC.B.h; }
ld_l_e(void)734 static void ld_l_e(void) { R.HL.B.l=R.DE.B.l; }
ld_l_d(void)735 static void ld_l_d(void) { R.HL.B.l=R.DE.B.h; }
ld_l_h(void)736 static void ld_l_h(void) { R.HL.B.l=R.HL.B.h; }
ld_ixh_a(void)737 static void ld_ixh_a(void) { R.IX.B.h=R.AF.B.h; }
ld_ixh_b(void)738 static void ld_ixh_b(void) { R.IX.B.h=R.BC.B.h; }
ld_ixh_c(void)739 static void ld_ixh_c(void) { R.IX.B.h=R.BC.B.l; }
ld_ixh_d(void)740 static void ld_ixh_d(void) { R.IX.B.h=R.DE.B.h; }
ld_ixh_e(void)741 static void ld_ixh_e(void) { R.IX.B.h=R.DE.B.l; }
ld_ixh_ixh(void)742 static void ld_ixh_ixh(void) { }
ld_ixh_ixl(void)743 static void ld_ixh_ixl(void) { R.IX.B.h=R.IX.B.l; }
ld_ixl_a(void)744 static void ld_ixl_a(void) { R.IX.B.l=R.AF.B.h; }
ld_ixl_b(void)745 static void ld_ixl_b(void) { R.IX.B.l=R.BC.B.h; }
ld_ixl_c(void)746 static void ld_ixl_c(void) { R.IX.B.l=R.BC.B.l; }
ld_ixl_d(void)747 static void ld_ixl_d(void) { R.IX.B.l=R.DE.B.h; }
ld_ixl_e(void)748 static void ld_ixl_e(void) { R.IX.B.l=R.DE.B.l; }
ld_ixl_ixh(void)749 static void ld_ixl_ixh(void) { R.IX.B.l=R.IX.B.h; }
ld_ixl_ixl(void)750 static void ld_ixl_ixl(void) { }
ld_iyh_a(void)751 static void ld_iyh_a(void) { R.IY.B.h=R.AF.B.h; }
ld_iyh_b(void)752 static void ld_iyh_b(void) { R.IY.B.h=R.BC.B.h; }
ld_iyh_c(void)753 static void ld_iyh_c(void) { R.IY.B.h=R.BC.B.l; }
ld_iyh_d(void)754 static void ld_iyh_d(void) { R.IY.B.h=R.DE.B.h; }
ld_iyh_e(void)755 static void ld_iyh_e(void) { R.IY.B.h=R.DE.B.l; }
ld_iyh_iyh(void)756 static void ld_iyh_iyh(void) { }
ld_iyh_iyl(void)757 static void ld_iyh_iyl(void) { R.IY.B.h=R.IY.B.l; }
ld_iyl_a(void)758 static void ld_iyl_a(void) { R.IY.B.l=R.AF.B.h; }
ld_iyl_b(void)759 static void ld_iyl_b(void) { R.IY.B.l=R.BC.B.h; }
ld_iyl_c(void)760 static void ld_iyl_c(void) { R.IY.B.l=R.BC.B.l; }
ld_iyl_d(void)761 static void ld_iyl_d(void) { R.IY.B.l=R.DE.B.h; }
ld_iyl_e(void)762 static void ld_iyl_e(void) { R.IY.B.l=R.DE.B.l; }
ld_iyl_iyh(void)763 static void ld_iyl_iyh(void) { R.IY.B.l=R.IY.B.h; }
ld_iyl_iyl(void)764 static void ld_iyl_iyl(void) { }
ld_bc_xword(void)765 static void ld_bc_xword(void) { R.BC.D=M_RDMEM_WORD(M_RDMEM_OPCODE_WORD()); }
ld_bc_word(void)766 static void ld_bc_word(void) { R.BC.D=M_RDMEM_OPCODE_WORD(); }
ld_de_xword(void)767 static void ld_de_xword(void) { R.DE.D=M_RDMEM_WORD(M_RDMEM_OPCODE_WORD()); }
ld_de_word(void)768 static void ld_de_word(void) { R.DE.D=M_RDMEM_OPCODE_WORD(); }
ld_hl_xword(void)769 static void ld_hl_xword(void) { R.HL.D=M_RDMEM_WORD(M_RDMEM_OPCODE_WORD()); }
ld_hl_word(void)770 static void ld_hl_word(void) { R.HL.D=M_RDMEM_OPCODE_WORD(); }
ld_ix_xword(void)771 static void ld_ix_xword(void) { R.IX.D=M_RDMEM_WORD(M_RDMEM_OPCODE_WORD()); }
ld_ix_word(void)772 static void ld_ix_word(void) { R.IX.D=M_RDMEM_OPCODE_WORD(); }
ld_iy_xword(void)773 static void ld_iy_xword(void) { R.IY.D=M_RDMEM_WORD(M_RDMEM_OPCODE_WORD()); }
ld_iy_word(void)774 static void ld_iy_word(void) { R.IY.D=M_RDMEM_OPCODE_WORD(); }
ld_sp_xword(void)775 static void ld_sp_xword(void) { R.SP.D=M_RDMEM_WORD(M_RDMEM_OPCODE_WORD()); }
ld_sp_word(void)776 static void ld_sp_word(void) { R.SP.D=M_RDMEM_OPCODE_WORD(); }
ld_sp_hl(void)777 static void ld_sp_hl(void) { R.SP.D=R.HL.D; }
ld_sp_ix(void)778 static void ld_sp_ix(void) { R.SP.D=R.IX.D; }
ld_sp_iy(void)779 static void ld_sp_iy(void) { R.SP.D=R.IY.D; }
ld_a_i(void)780 static void ld_a_i(void)
781 {
782  R.AF.B.h=R.I;
783  R.AF.B.l=(R.AF.B.l&C_FLAG)|ZSTable[R.I]|(R.IFF2<<2);
784 }
ld_i_a(void)785 static void ld_i_a(void) { R.I=R.AF.B.h; }
ld_a_r(void)786 static void ld_a_r(void)
787 {
788  R.AF.B.h=(R.R&127)|(R.R2&128);
789  R.AF.B.l=(R.AF.B.l&C_FLAG)|ZSTable[R.AF.B.h]|(R.IFF2<<2);
790 }
ld_r_a(void)791 static void ld_r_a(void) { R.R=R.R2=R.AF.B.h; }
792 
ldd(void)793 static void ldd(void)
794 {
795  M_WRMEM(R.DE.D,M_RDMEM(R.HL.D));
796  --R.DE.W.l;
797  --R.HL.W.l;
798  --R.BC.W.l;
799  R.AF.B.l=(R.AF.B.l&0xE9)|(R.BC.D? V_FLAG:0);
800 }
lddr(void)801 static void lddr(void)
802 {
803  ldd ();
804  if (R.BC.D) { Z80_ICount-=5; R.PC.W.l-=2; }
805 }
ldi(void)806 static void ldi(void)
807 {
808  M_WRMEM(R.DE.D,M_RDMEM(R.HL.D));
809  ++R.DE.W.l;
810  ++R.HL.W.l;
811  --R.BC.W.l;
812  R.AF.B.l=(R.AF.B.l&0xE9)|(R.BC.D? V_FLAG:0);
813 }
ldir(void)814 static void ldir(void)
815 {
816  ldi ();
817  if (R.BC.D) { Z80_ICount-=5; R.PC.W.l-=2; }
818 }
819 
neg(void)820 static void neg(void)
821 {
822  byte i;
823  i=R.AF.B.h;
824  R.AF.B.h=0;
825  M_SUB(i);
826 }
827 
nop(void)828 static void nop(void) { }
829 
or_xhl(void)830 static void or_xhl(void) { byte i=M_RD_XHL; M_OR(i); }
or_xix(void)831 static void or_xix(void) { byte i=M_RD_XIX(); M_OR(i); }
or_xiy(void)832 static void or_xiy(void) { byte i=M_RD_XIY(); M_OR(i); }
or_a(void)833 static void or_a(void) { R.AF.B.l=ZSPTable[R.AF.B.h]; }
or_b(void)834 static void or_b(void) { M_OR(R.BC.B.h); }
or_c(void)835 static void or_c(void) { M_OR(R.BC.B.l); }
or_d(void)836 static void or_d(void) { M_OR(R.DE.B.h); }
or_e(void)837 static void or_e(void) { M_OR(R.DE.B.l); }
or_h(void)838 static void or_h(void) { M_OR(R.HL.B.h); }
or_l(void)839 static void or_l(void) { M_OR(R.HL.B.l); }
or_ixh(void)840 static void or_ixh(void) { M_OR(R.IX.B.h); }
or_ixl(void)841 static void or_ixl(void) { M_OR(R.IX.B.l); }
or_iyh(void)842 static void or_iyh(void) { M_OR(R.IY.B.h); }
or_iyl(void)843 static void or_iyl(void) { M_OR(R.IY.B.l); }
or_byte(void)844 static void or_byte(void) { byte i=M_RDMEM_OPCODE(); M_OR(i); }
845 
outd(void)846 static void outd(void)
847 {
848  --R.BC.B.h;
849  DoOut (R.BC.B.l,R.BC.B.h,M_RDMEM(R.HL.D));
850  --R.HL.W.l;
851  R.AF.B.l=(R.BC.B.h)? N_FLAG:(Z_FLAG|N_FLAG);
852 }
otdr(void)853 static void otdr(void)
854 {
855  outd ();
856  if (R.BC.B.h) { Z80_ICount-=5; R.PC.W.l-=2; }
857 }
outi(void)858 static void outi(void)
859 {
860  --R.BC.B.h;
861  DoOut (R.BC.B.l,R.BC.B.h,M_RDMEM(R.HL.D));
862  ++R.HL.W.l;
863  R.AF.B.l=(R.BC.B.h)? N_FLAG:(Z_FLAG|N_FLAG);
864 }
otir(void)865 static void otir(void)
866 {
867  outi ();
868  if (R.BC.B.h) { Z80_ICount-=5; R.PC.W.l-=2; }
869 }
870 
out_c_a(void)871 static void out_c_a(void) { DoOut(R.BC.B.l,R.BC.B.h,R.AF.B.h); }
out_c_b(void)872 static void out_c_b(void) { DoOut(R.BC.B.l,R.BC.B.h,R.BC.B.h); }
out_c_c(void)873 static void out_c_c(void) { DoOut(R.BC.B.l,R.BC.B.h,R.BC.B.l); }
out_c_d(void)874 static void out_c_d(void) { DoOut(R.BC.B.l,R.BC.B.h,R.DE.B.h); }
out_c_e(void)875 static void out_c_e(void) { DoOut(R.BC.B.l,R.BC.B.h,R.DE.B.l); }
out_c_h(void)876 static void out_c_h(void) { DoOut(R.BC.B.l,R.BC.B.h,R.HL.B.h); }
out_c_l(void)877 static void out_c_l(void) { DoOut(R.BC.B.l,R.BC.B.h,R.HL.B.l); }
out_c_0(void)878 static void out_c_0(void) { DoOut(R.BC.B.l,R.BC.B.h,0); }
out_byte_a(void)879 static void out_byte_a(void)
880 {
881  byte i=M_RDMEM_OPCODE();
882  DoOut(i,R.AF.B.h,R.AF.B.h);
883 }
884 
pop_af(void)885 static void pop_af(void) { M_POP(AF); }
pop_bc(void)886 static void pop_bc(void) { M_POP(BC); }
pop_de(void)887 static void pop_de(void) { M_POP(DE); }
pop_hl(void)888 static void pop_hl(void) { M_POP(HL); }
pop_ix(void)889 static void pop_ix(void) { M_POP(IX); }
pop_iy(void)890 static void pop_iy(void) { M_POP(IY); }
891 
push_af(void)892 static void push_af(void) { M_PUSH(AF); }
push_bc(void)893 static void push_bc(void) { M_PUSH(BC); }
push_de(void)894 static void push_de(void) { M_PUSH(DE); }
push_hl(void)895 static void push_hl(void) { M_PUSH(HL); }
push_ix(void)896 static void push_ix(void) { M_PUSH(IX); }
push_iy(void)897 static void push_iy(void) { M_PUSH(IY); }
898 
res_0_xhl(void)899 static void res_0_xhl(void)
900 {
901  byte i;
902  i=M_RDMEM(R.HL.D);
903  M_RES(0,i);
904  M_WRMEM(R.HL.D,i);
905 }
res_0_xix(void)906 static void res_0_xix(void)
907 {
908  byte i;
909  int j;
910  j=M_XIX;
911  i=M_RDMEM(j);
912  M_RES(0,i);
913  M_WRMEM(j,i);
914 }
res_0_xiy(void)915 static void res_0_xiy(void)
916 {
917  byte i;
918  int j;
919  j=M_XIY;
920  i=M_RDMEM(j);
921  M_RES(0,i);
922  M_WRMEM(j,i);
923 }
res_0_a(void)924 static void res_0_a(void) { M_RES(0,R.AF.B.h); }
res_0_b(void)925 static void res_0_b(void) { M_RES(0,R.BC.B.h); }
res_0_c(void)926 static void res_0_c(void) { M_RES(0,R.BC.B.l); }
res_0_d(void)927 static void res_0_d(void) { M_RES(0,R.DE.B.h); }
res_0_e(void)928 static void res_0_e(void) { M_RES(0,R.DE.B.l); }
res_0_h(void)929 static void res_0_h(void) { M_RES(0,R.HL.B.h); }
res_0_l(void)930 static void res_0_l(void) { M_RES(0,R.HL.B.l); }
931 
res_1_xhl(void)932 static void res_1_xhl(void)
933 {
934  byte i;
935  i=M_RDMEM(R.HL.D);
936  M_RES(1,i);
937  M_WRMEM(R.HL.D,i);
938 }
res_1_xix(void)939 static void res_1_xix(void)
940 {
941  byte i;
942  int j;
943  j=M_XIX;
944  i=M_RDMEM(j);
945  M_RES(1,i);
946  M_WRMEM(j,i);
947 }
res_1_xiy(void)948 static void res_1_xiy(void)
949 {
950  byte i;
951  int j;
952  j=M_XIY;
953  i=M_RDMEM(j);
954  M_RES(1,i);
955  M_WRMEM(j,i);
956 }
res_1_a(void)957 static void res_1_a(void) { M_RES(1,R.AF.B.h); }
res_1_b(void)958 static void res_1_b(void) { M_RES(1,R.BC.B.h); }
res_1_c(void)959 static void res_1_c(void) { M_RES(1,R.BC.B.l); }
res_1_d(void)960 static void res_1_d(void) { M_RES(1,R.DE.B.h); }
res_1_e(void)961 static void res_1_e(void) { M_RES(1,R.DE.B.l); }
res_1_h(void)962 static void res_1_h(void) { M_RES(1,R.HL.B.h); }
res_1_l(void)963 static void res_1_l(void) { M_RES(1,R.HL.B.l); }
964 
res_2_xhl(void)965 static void res_2_xhl(void)
966 {
967  byte i;
968  i=M_RDMEM(R.HL.D);
969  M_RES(2,i);
970  M_WRMEM(R.HL.D,i);
971 }
res_2_xix(void)972 static void res_2_xix(void)
973 {
974  byte i;
975  int j;
976  j=M_XIX;
977  i=M_RDMEM(j);
978  M_RES(2,i);
979  M_WRMEM(j,i);
980 }
res_2_xiy(void)981 static void res_2_xiy(void)
982 {
983  byte i;
984  int j;
985  j=M_XIY;
986  i=M_RDMEM(j);
987  M_RES(2,i);
988  M_WRMEM(j,i);
989 }
res_2_a(void)990 static void res_2_a(void) { M_RES(2,R.AF.B.h); }
res_2_b(void)991 static void res_2_b(void) { M_RES(2,R.BC.B.h); }
res_2_c(void)992 static void res_2_c(void) { M_RES(2,R.BC.B.l); }
res_2_d(void)993 static void res_2_d(void) { M_RES(2,R.DE.B.h); }
res_2_e(void)994 static void res_2_e(void) { M_RES(2,R.DE.B.l); }
res_2_h(void)995 static void res_2_h(void) { M_RES(2,R.HL.B.h); }
res_2_l(void)996 static void res_2_l(void) { M_RES(2,R.HL.B.l); }
997 
res_3_xhl(void)998 static void res_3_xhl(void)
999 {
1000  byte i;
1001  i=M_RDMEM(R.HL.D);
1002  M_RES(3,i);
1003  M_WRMEM(R.HL.D,i);
1004 }
res_3_xix(void)1005 static void res_3_xix(void)
1006 {
1007  byte i;
1008  int j;
1009  j=M_XIX;
1010  i=M_RDMEM(j);
1011  M_RES(3,i);
1012  M_WRMEM(j,i);
1013 }
res_3_xiy(void)1014 static void res_3_xiy(void)
1015 {
1016  byte i;
1017  int j;
1018  j=M_XIY;
1019  i=M_RDMEM(j);
1020  M_RES(3,i);
1021  M_WRMEM(j,i);
1022 }
res_3_a(void)1023 static void res_3_a(void) { M_RES(3,R.AF.B.h); }
res_3_b(void)1024 static void res_3_b(void) { M_RES(3,R.BC.B.h); }
res_3_c(void)1025 static void res_3_c(void) { M_RES(3,R.BC.B.l); }
res_3_d(void)1026 static void res_3_d(void) { M_RES(3,R.DE.B.h); }
res_3_e(void)1027 static void res_3_e(void) { M_RES(3,R.DE.B.l); }
res_3_h(void)1028 static void res_3_h(void) { M_RES(3,R.HL.B.h); }
res_3_l(void)1029 static void res_3_l(void) { M_RES(3,R.HL.B.l); }
1030 
res_4_xhl(void)1031 static void res_4_xhl(void)
1032 {
1033  byte i;
1034  i=M_RDMEM(R.HL.D);
1035  M_RES(4,i);
1036  M_WRMEM(R.HL.D,i);
1037 }
res_4_xix(void)1038 static void res_4_xix(void)
1039 {
1040  byte i;
1041  int j;
1042  j=M_XIX;
1043  i=M_RDMEM(j);
1044  M_RES(4,i);
1045  M_WRMEM(j,i);
1046 }
res_4_xiy(void)1047 static void res_4_xiy(void)
1048 {
1049  byte i;
1050  int j;
1051  j=M_XIY;
1052  i=M_RDMEM(j);
1053  M_RES(4,i);
1054  M_WRMEM(j,i);
1055 }
res_4_a(void)1056 static void res_4_a(void) { M_RES(4,R.AF.B.h); }
res_4_b(void)1057 static void res_4_b(void) { M_RES(4,R.BC.B.h); }
res_4_c(void)1058 static void res_4_c(void) { M_RES(4,R.BC.B.l); }
res_4_d(void)1059 static void res_4_d(void) { M_RES(4,R.DE.B.h); }
res_4_e(void)1060 static void res_4_e(void) { M_RES(4,R.DE.B.l); }
res_4_h(void)1061 static void res_4_h(void) { M_RES(4,R.HL.B.h); }
res_4_l(void)1062 static void res_4_l(void) { M_RES(4,R.HL.B.l); }
1063 
res_5_xhl(void)1064 static void res_5_xhl(void)
1065 {
1066  byte i;
1067  i=M_RDMEM(R.HL.D);
1068  M_RES(5,i);
1069  M_WRMEM(R.HL.D,i);
1070 }
res_5_xix(void)1071 static void res_5_xix(void)
1072 {
1073  byte i;
1074  int j;
1075  j=M_XIX;
1076  i=M_RDMEM(j);
1077  M_RES(5,i);
1078  M_WRMEM(j,i);
1079 }
res_5_xiy(void)1080 static void res_5_xiy(void)
1081 {
1082  byte i;
1083  int j;
1084  j=M_XIY;
1085  i=M_RDMEM(j);
1086  M_RES(5,i);
1087  M_WRMEM(j,i);
1088 }
res_5_a(void)1089 static void res_5_a(void) { M_RES(5,R.AF.B.h); }
res_5_b(void)1090 static void res_5_b(void) { M_RES(5,R.BC.B.h); }
res_5_c(void)1091 static void res_5_c(void) { M_RES(5,R.BC.B.l); }
res_5_d(void)1092 static void res_5_d(void) { M_RES(5,R.DE.B.h); }
res_5_e(void)1093 static void res_5_e(void) { M_RES(5,R.DE.B.l); }
res_5_h(void)1094 static void res_5_h(void) { M_RES(5,R.HL.B.h); }
res_5_l(void)1095 static void res_5_l(void) { M_RES(5,R.HL.B.l); }
1096 
res_6_xhl(void)1097 static void res_6_xhl(void)
1098 {
1099  byte i;
1100  i=M_RDMEM(R.HL.D);
1101  M_RES(6,i);
1102  M_WRMEM(R.HL.D,i);
1103 }
res_6_xix(void)1104 static void res_6_xix(void)
1105 {
1106  byte i;
1107  int j;
1108  j=M_XIX;
1109  i=M_RDMEM(j);
1110  M_RES(6,i);
1111  M_WRMEM(j,i);
1112 }
res_6_xiy(void)1113 static void res_6_xiy(void)
1114 {
1115  byte i;
1116  int j;
1117  j=M_XIY;
1118  i=M_RDMEM(j);
1119  M_RES(6,i);
1120  M_WRMEM(j,i);
1121 }
res_6_a(void)1122 static void res_6_a(void) { M_RES(6,R.AF.B.h); }
res_6_b(void)1123 static void res_6_b(void) { M_RES(6,R.BC.B.h); }
res_6_c(void)1124 static void res_6_c(void) { M_RES(6,R.BC.B.l); }
res_6_d(void)1125 static void res_6_d(void) { M_RES(6,R.DE.B.h); }
res_6_e(void)1126 static void res_6_e(void) { M_RES(6,R.DE.B.l); }
res_6_h(void)1127 static void res_6_h(void) { M_RES(6,R.HL.B.h); }
res_6_l(void)1128 static void res_6_l(void) { M_RES(6,R.HL.B.l); }
1129 
res_7_xhl(void)1130 static void res_7_xhl(void)
1131 {
1132  byte i;
1133  i=M_RDMEM(R.HL.D);
1134  M_RES(7,i);
1135  M_WRMEM(R.HL.D,i);
1136 }
res_7_xix(void)1137 static void res_7_xix(void)
1138 {
1139  byte i;
1140  int j;
1141  j=M_XIX;
1142  i=M_RDMEM(j);
1143  M_RES(7,i);
1144  M_WRMEM(j,i);
1145 }
res_7_xiy(void)1146 static void res_7_xiy(void)
1147 {
1148  byte i;
1149  int j;
1150  j=M_XIY;
1151  i=M_RDMEM(j);
1152  M_RES(7,i);
1153  M_WRMEM(j,i);
1154 }
res_7_a(void)1155 static void res_7_a(void) { M_RES(7,R.AF.B.h); }
res_7_b(void)1156 static void res_7_b(void) { M_RES(7,R.BC.B.h); }
res_7_c(void)1157 static void res_7_c(void) { M_RES(7,R.BC.B.l); }
res_7_d(void)1158 static void res_7_d(void) { M_RES(7,R.DE.B.h); }
res_7_e(void)1159 static void res_7_e(void) { M_RES(7,R.DE.B.l); }
res_7_h(void)1160 static void res_7_h(void) { M_RES(7,R.HL.B.h); }
res_7_l(void)1161 static void res_7_l(void) { M_RES(7,R.HL.B.l); }
1162 
ret(void)1163 static void ret(void) { M_RET; }
ret_c(void)1164 static void ret_c(void) { if (M_C) { M_RET; } else { M_SKIP_RET; } }
ret_m(void)1165 static void ret_m(void) { if (M_M) { M_RET; } else { M_SKIP_RET; } }
ret_nc(void)1166 static void ret_nc(void) { if (M_NC) { M_RET; } else { M_SKIP_RET; } }
ret_nz(void)1167 static void ret_nz(void) { if (M_NZ) { M_RET; } else { M_SKIP_RET; } }
ret_p(void)1168 static void ret_p(void) { if (M_P) { M_RET; } else { M_SKIP_RET; } }
ret_pe(void)1169 static void ret_pe(void) { if (M_PE) { M_RET; } else { M_SKIP_RET; } }
ret_po(void)1170 static void ret_po(void) { if (M_PO) { M_RET; } else { M_SKIP_RET; } }
ret_z(void)1171 static void ret_z(void) { if (M_Z) { M_RET; } else { M_SKIP_RET; } }
1172 
reti(void)1173 static void reti(void) { Z80_Reti(); M_RET; }
retn(void)1174 static void retn(void) { R.IFF1=R.IFF2; Z80_Retn(); M_RET; }
1175 
rl_xhl(void)1176 static void rl_xhl(void)
1177 {
1178  byte i;
1179  i=M_RDMEM(R.HL.D);
1180  M_RL(i);
1181  M_WRMEM(R.HL.D,i);
1182 }
rl_xix(void)1183 static void rl_xix(void)
1184 {
1185  byte i;
1186  int j;
1187  j=M_XIX;
1188  i=M_RDMEM(j);
1189  M_RL(i);
1190  M_WRMEM(j,i);
1191 }
rl_xiy(void)1192 static void rl_xiy(void)
1193 {
1194  byte i;
1195  int j;
1196  j=M_XIY;
1197  i=M_RDMEM(j);
1198  M_RL(i);
1199  M_WRMEM(j,i);
1200 }
rl_a(void)1201 static void rl_a(void) { M_RL(R.AF.B.h); }
rl_b(void)1202 static void rl_b(void) { M_RL(R.BC.B.h); }
rl_c(void)1203 static void rl_c(void) { M_RL(R.BC.B.l); }
rl_d(void)1204 static void rl_d(void) { M_RL(R.DE.B.h); }
rl_e(void)1205 static void rl_e(void) { M_RL(R.DE.B.l); }
rl_h(void)1206 static void rl_h(void) { M_RL(R.HL.B.h); }
rl_l(void)1207 static void rl_l(void) { M_RL(R.HL.B.l); }
rla(void)1208 static void rla(void)  { M_RLA; }
1209 
rlc_xhl(void)1210 static void rlc_xhl(void)
1211 {
1212  byte i;
1213  i=M_RDMEM(R.HL.D);
1214  M_RLC(i);
1215  M_WRMEM(R.HL.D,i);
1216 }
rlc_xix(void)1217 static void rlc_xix(void)
1218 {
1219  byte i;
1220  int j;
1221  j=M_XIX;
1222  i=M_RDMEM(j);
1223  M_RLC(i);
1224  M_WRMEM(j,i);
1225 }
rlc_xiy(void)1226 static void rlc_xiy(void)
1227 {
1228  byte i;
1229  int j;
1230  j=M_XIY;
1231  i=M_RDMEM(j);
1232  M_RLC(i);
1233  M_WRMEM(j,i);
1234 }
rlc_a(void)1235 static void rlc_a(void) { M_RLC(R.AF.B.h); }
rlc_b(void)1236 static void rlc_b(void) { M_RLC(R.BC.B.h); }
rlc_c(void)1237 static void rlc_c(void) { M_RLC(R.BC.B.l); }
rlc_d(void)1238 static void rlc_d(void) { M_RLC(R.DE.B.h); }
rlc_e(void)1239 static void rlc_e(void) { M_RLC(R.DE.B.l); }
rlc_h(void)1240 static void rlc_h(void) { M_RLC(R.HL.B.h); }
rlc_l(void)1241 static void rlc_l(void) { M_RLC(R.HL.B.l); }
rlca(void)1242 static void rlca(void)  { M_RLCA; }
1243 
rld(void)1244 static void rld(void)
1245 {
1246  byte i;
1247  i=M_RDMEM(R.HL.D);
1248  M_WRMEM(R.HL.D,(i<<4)|(R.AF.B.h&0x0F));
1249  R.AF.B.h=(R.AF.B.h&0xF0)|(i>>4);
1250  R.AF.B.l=(R.AF.B.l&C_FLAG)|ZSPTable[R.AF.B.h];
1251 }
1252 
rr_xhl(void)1253 static void rr_xhl(void)
1254 {
1255  byte i;
1256  i=M_RDMEM(R.HL.D);
1257  M_RR(i);
1258  M_WRMEM(R.HL.D,i);
1259 }
rr_xix(void)1260 static void rr_xix(void)
1261 {
1262  byte i;
1263  int j;
1264  j=M_XIX;
1265  i=M_RDMEM(j);
1266  M_RR(i);
1267  M_WRMEM(j,i);
1268 }
rr_xiy(void)1269 static void rr_xiy(void)
1270 {
1271  byte i;
1272  int j;
1273  j=M_XIY;
1274  i=M_RDMEM(j);
1275  M_RR(i);
1276  M_WRMEM(j,i);
1277 }
rr_a(void)1278 static void rr_a(void) { M_RR(R.AF.B.h); }
rr_b(void)1279 static void rr_b(void) { M_RR(R.BC.B.h); }
rr_c(void)1280 static void rr_c(void) { M_RR(R.BC.B.l); }
rr_d(void)1281 static void rr_d(void) { M_RR(R.DE.B.h); }
rr_e(void)1282 static void rr_e(void) { M_RR(R.DE.B.l); }
rr_h(void)1283 static void rr_h(void) { M_RR(R.HL.B.h); }
rr_l(void)1284 static void rr_l(void) { M_RR(R.HL.B.l); }
rra(void)1285 static void rra(void)  { M_RRA; }
1286 
rrc_xhl(void)1287 static void rrc_xhl(void)
1288 {
1289  byte i;
1290  i=M_RDMEM(R.HL.D);
1291  M_RRC(i);
1292  M_WRMEM(R.HL.D,i);
1293 }
rrc_xix(void)1294 static void rrc_xix(void)
1295 {
1296  byte i;
1297  int j;
1298  j=M_XIX;
1299  i=M_RDMEM(j);
1300  M_RRC(i);
1301  M_WRMEM(j,i);
1302 }
rrc_xiy(void)1303 static void rrc_xiy(void)
1304 {
1305  byte i;
1306  int j;
1307  j=M_XIY;
1308  i=M_RDMEM(j);
1309  M_RRC(i);
1310  M_WRMEM(j,i);
1311 }
rrc_a(void)1312 static void rrc_a(void) { M_RRC(R.AF.B.h); }
rrc_b(void)1313 static void rrc_b(void) { M_RRC(R.BC.B.h); }
rrc_c(void)1314 static void rrc_c(void) { M_RRC(R.BC.B.l); }
rrc_d(void)1315 static void rrc_d(void) { M_RRC(R.DE.B.h); }
rrc_e(void)1316 static void rrc_e(void) { M_RRC(R.DE.B.l); }
rrc_h(void)1317 static void rrc_h(void) { M_RRC(R.HL.B.h); }
rrc_l(void)1318 static void rrc_l(void) { M_RRC(R.HL.B.l); }
rrca(void)1319 static void rrca(void)  { M_RRCA; }
1320 
rrd(void)1321 static void rrd(void)
1322 {
1323  byte i;
1324  i=M_RDMEM(R.HL.D);
1325  M_WRMEM(R.HL.D,(i>>4)|(R.AF.B.h<<4));
1326  R.AF.B.h=(R.AF.B.h&0xF0)|(i&0x0F);
1327  R.AF.B.l=(R.AF.B.l&C_FLAG)|ZSPTable[R.AF.B.h];
1328 }
1329 
rst_00(void)1330 static void rst_00(void) { M_RST(0x00); }
rst_08(void)1331 static void rst_08(void) { M_RST(0x08); }
rst_10(void)1332 static void rst_10(void) { M_RST(0x10); }
rst_18(void)1333 static void rst_18(void) { M_RST(0x18); }
rst_20(void)1334 static void rst_20(void) { M_RST(0x20); }
rst_28(void)1335 static void rst_28(void) { M_RST(0x28); }
rst_30(void)1336 static void rst_30(void) { M_RST(0x30); }
rst_38(void)1337 static void rst_38(void) { M_RST(0x38); }
1338 
sbc_a_byte(void)1339 static void sbc_a_byte(void) { byte i=M_RDMEM_OPCODE(); M_SBC(i); }
sbc_a_xhl(void)1340 static void sbc_a_xhl(void) { byte i=M_RD_XHL; M_SBC(i); }
sbc_a_xix(void)1341 static void sbc_a_xix(void) { byte i=M_RD_XIX(); M_SBC(i); }
sbc_a_xiy(void)1342 static void sbc_a_xiy(void) { byte i=M_RD_XIY(); M_SBC(i); }
sbc_a_a(void)1343 static void sbc_a_a(void) { M_SBC(R.AF.B.h); }
sbc_a_b(void)1344 static void sbc_a_b(void) { M_SBC(R.BC.B.h); }
sbc_a_c(void)1345 static void sbc_a_c(void) { M_SBC(R.BC.B.l); }
sbc_a_d(void)1346 static void sbc_a_d(void) { M_SBC(R.DE.B.h); }
sbc_a_e(void)1347 static void sbc_a_e(void) { M_SBC(R.DE.B.l); }
sbc_a_h(void)1348 static void sbc_a_h(void) { M_SBC(R.HL.B.h); }
sbc_a_l(void)1349 static void sbc_a_l(void) { M_SBC(R.HL.B.l); }
sbc_a_ixh(void)1350 static void sbc_a_ixh(void) { M_SBC(R.IX.B.h); }
sbc_a_ixl(void)1351 static void sbc_a_ixl(void) { M_SBC(R.IX.B.l); }
sbc_a_iyh(void)1352 static void sbc_a_iyh(void) { M_SBC(R.IY.B.h); }
sbc_a_iyl(void)1353 static void sbc_a_iyl(void) { M_SBC(R.IY.B.l); }
1354 
sbc_hl_bc(void)1355 static void sbc_hl_bc(void) { M_SBCW(BC); }
sbc_hl_de(void)1356 static void sbc_hl_de(void) { M_SBCW(DE); }
sbc_hl_hl(void)1357 static void sbc_hl_hl(void) { M_SBCW(HL); }
sbc_hl_sp(void)1358 static void sbc_hl_sp(void) { M_SBCW(SP); }
1359 
scf(void)1360 static void scf(void) { R.AF.B.l=(R.AF.B.l&0xEC)|C_FLAG; }
1361 
set_0_xhl(void)1362 static void set_0_xhl(void)
1363 {
1364  byte i;
1365  i=M_RDMEM(R.HL.D);
1366  M_SET(0,i);
1367  M_WRMEM(R.HL.D,i);
1368 }
set_0_xix(void)1369 static void set_0_xix(void)
1370 {
1371  byte i;
1372  int j;
1373  j=M_XIX;
1374  i=M_RDMEM(j);
1375  M_SET(0,i);
1376  M_WRMEM(j,i);
1377 }
set_0_xiy(void)1378 static void set_0_xiy(void)
1379 {
1380  byte i;
1381  int j;
1382  j=M_XIY;
1383  i=M_RDMEM(j);
1384  M_SET(0,i);
1385  M_WRMEM(j,i);
1386 }
set_0_a(void)1387 static void set_0_a(void) { M_SET(0,R.AF.B.h); }
set_0_b(void)1388 static void set_0_b(void) { M_SET(0,R.BC.B.h); }
set_0_c(void)1389 static void set_0_c(void) { M_SET(0,R.BC.B.l); }
set_0_d(void)1390 static void set_0_d(void) { M_SET(0,R.DE.B.h); }
set_0_e(void)1391 static void set_0_e(void) { M_SET(0,R.DE.B.l); }
set_0_h(void)1392 static void set_0_h(void) { M_SET(0,R.HL.B.h); }
set_0_l(void)1393 static void set_0_l(void) { M_SET(0,R.HL.B.l); }
1394 
set_1_xhl(void)1395 static void set_1_xhl(void)
1396 {
1397  byte i;
1398  i=M_RDMEM(R.HL.D);
1399  M_SET(1,i);
1400  M_WRMEM(R.HL.D,i);
1401 }
set_1_xix(void)1402 static void set_1_xix(void)
1403 {
1404  byte i;
1405  int j;
1406  j=M_XIX;
1407  i=M_RDMEM(j);
1408  M_SET(1,i);
1409  M_WRMEM(j,i);
1410 }
set_1_xiy(void)1411 static void set_1_xiy(void)
1412 {
1413  byte i;
1414  int j;
1415  j=M_XIY;
1416  i=M_RDMEM(j);
1417  M_SET(1,i);
1418  M_WRMEM(j,i);
1419 }
set_1_a(void)1420 static void set_1_a(void) { M_SET(1,R.AF.B.h); }
set_1_b(void)1421 static void set_1_b(void) { M_SET(1,R.BC.B.h); }
set_1_c(void)1422 static void set_1_c(void) { M_SET(1,R.BC.B.l); }
set_1_d(void)1423 static void set_1_d(void) { M_SET(1,R.DE.B.h); }
set_1_e(void)1424 static void set_1_e(void) { M_SET(1,R.DE.B.l); }
set_1_h(void)1425 static void set_1_h(void) { M_SET(1,R.HL.B.h); }
set_1_l(void)1426 static void set_1_l(void) { M_SET(1,R.HL.B.l); }
1427 
set_2_xhl(void)1428 static void set_2_xhl(void)
1429 {
1430  byte i;
1431  i=M_RDMEM(R.HL.D);
1432  M_SET(2,i);
1433  M_WRMEM(R.HL.D,i);
1434 }
set_2_xix(void)1435 static void set_2_xix(void)
1436 {
1437  byte i;
1438  int j;
1439  j=M_XIX;
1440  i=M_RDMEM(j);
1441  M_SET(2,i);
1442  M_WRMEM(j,i);
1443 }
set_2_xiy(void)1444 static void set_2_xiy(void)
1445 {
1446  byte i;
1447  int j;
1448  j=M_XIY;
1449  i=M_RDMEM(j);
1450  M_SET(2,i);
1451  M_WRMEM(j,i);
1452 }
set_2_a(void)1453 static void set_2_a(void) { M_SET(2,R.AF.B.h); }
set_2_b(void)1454 static void set_2_b(void) { M_SET(2,R.BC.B.h); }
set_2_c(void)1455 static void set_2_c(void) { M_SET(2,R.BC.B.l); }
set_2_d(void)1456 static void set_2_d(void) { M_SET(2,R.DE.B.h); }
set_2_e(void)1457 static void set_2_e(void) { M_SET(2,R.DE.B.l); }
set_2_h(void)1458 static void set_2_h(void) { M_SET(2,R.HL.B.h); }
set_2_l(void)1459 static void set_2_l(void) { M_SET(2,R.HL.B.l); }
1460 
set_3_xhl(void)1461 static void set_3_xhl(void)
1462 {
1463  byte i;
1464  i=M_RDMEM(R.HL.D);
1465  M_SET(3,i);
1466  M_WRMEM(R.HL.D,i);
1467 }
set_3_xix(void)1468 static void set_3_xix(void)
1469 {
1470  byte i;
1471  int j;
1472  j=M_XIX;
1473  i=M_RDMEM(j);
1474  M_SET(3,i);
1475  M_WRMEM(j,i);
1476 }
set_3_xiy(void)1477 static void set_3_xiy(void)
1478 {
1479  byte i;
1480  int j;
1481  j=M_XIY;
1482  i=M_RDMEM(j);
1483  M_SET(3,i);
1484  M_WRMEM(j,i);
1485 }
set_3_a(void)1486 static void set_3_a(void) { M_SET(3,R.AF.B.h); }
set_3_b(void)1487 static void set_3_b(void) { M_SET(3,R.BC.B.h); }
set_3_c(void)1488 static void set_3_c(void) { M_SET(3,R.BC.B.l); }
set_3_d(void)1489 static void set_3_d(void) { M_SET(3,R.DE.B.h); }
set_3_e(void)1490 static void set_3_e(void) { M_SET(3,R.DE.B.l); }
set_3_h(void)1491 static void set_3_h(void) { M_SET(3,R.HL.B.h); }
set_3_l(void)1492 static void set_3_l(void) { M_SET(3,R.HL.B.l); }
1493 
set_4_xhl(void)1494 static void set_4_xhl(void)
1495 {
1496  byte i;
1497  i=M_RDMEM(R.HL.D);
1498  M_SET(4,i);
1499  M_WRMEM(R.HL.D,i);
1500 }
set_4_xix(void)1501 static void set_4_xix(void)
1502 {
1503  byte i;
1504  int j;
1505  j=M_XIX;
1506  i=M_RDMEM(j);
1507  M_SET(4,i);
1508  M_WRMEM(j,i);
1509 }
set_4_xiy(void)1510 static void set_4_xiy(void)
1511 {
1512  byte i;
1513  int j;
1514  j=M_XIY;
1515  i=M_RDMEM(j);
1516  M_SET(4,i);
1517  M_WRMEM(j,i);
1518 }
set_4_a(void)1519 static void set_4_a(void) { M_SET(4,R.AF.B.h); }
set_4_b(void)1520 static void set_4_b(void) { M_SET(4,R.BC.B.h); }
set_4_c(void)1521 static void set_4_c(void) { M_SET(4,R.BC.B.l); }
set_4_d(void)1522 static void set_4_d(void) { M_SET(4,R.DE.B.h); }
set_4_e(void)1523 static void set_4_e(void) { M_SET(4,R.DE.B.l); }
set_4_h(void)1524 static void set_4_h(void) { M_SET(4,R.HL.B.h); }
set_4_l(void)1525 static void set_4_l(void) { M_SET(4,R.HL.B.l); }
1526 
set_5_xhl(void)1527 static void set_5_xhl(void)
1528 {
1529  byte i;
1530  i=M_RDMEM(R.HL.D);
1531  M_SET(5,i);
1532  M_WRMEM(R.HL.D,i);
1533 }
set_5_xix(void)1534 static void set_5_xix(void)
1535 {
1536  byte i;
1537  int j;
1538  j=M_XIX;
1539  i=M_RDMEM(j);
1540  M_SET(5,i);
1541  M_WRMEM(j,i);
1542 }
set_5_xiy(void)1543 static void set_5_xiy(void)
1544 {
1545  byte i;
1546  int j;
1547  j=M_XIY;
1548  i=M_RDMEM(j);
1549  M_SET(5,i);
1550  M_WRMEM(j,i);
1551 }
set_5_a(void)1552 static void set_5_a(void) { M_SET(5,R.AF.B.h); }
set_5_b(void)1553 static void set_5_b(void) { M_SET(5,R.BC.B.h); }
set_5_c(void)1554 static void set_5_c(void) { M_SET(5,R.BC.B.l); }
set_5_d(void)1555 static void set_5_d(void) { M_SET(5,R.DE.B.h); }
set_5_e(void)1556 static void set_5_e(void) { M_SET(5,R.DE.B.l); }
set_5_h(void)1557 static void set_5_h(void) { M_SET(5,R.HL.B.h); }
set_5_l(void)1558 static void set_5_l(void) { M_SET(5,R.HL.B.l); }
1559 
set_6_xhl(void)1560 static void set_6_xhl(void)
1561 {
1562  byte i;
1563  i=M_RDMEM(R.HL.D);
1564  M_SET(6,i);
1565  M_WRMEM(R.HL.D,i);
1566 }
set_6_xix(void)1567 static void set_6_xix(void)
1568 {
1569  byte i;
1570  int j;
1571  j=M_XIX;
1572  i=M_RDMEM(j);
1573  M_SET(6,i);
1574  M_WRMEM(j,i);
1575 }
set_6_xiy(void)1576 static void set_6_xiy(void)
1577 {
1578  byte i;
1579  int j;
1580  j=M_XIY;
1581  i=M_RDMEM(j);
1582  M_SET(6,i);
1583  M_WRMEM(j,i);
1584 }
set_6_a(void)1585 static void set_6_a(void) { M_SET(6,R.AF.B.h); }
set_6_b(void)1586 static void set_6_b(void) { M_SET(6,R.BC.B.h); }
set_6_c(void)1587 static void set_6_c(void) { M_SET(6,R.BC.B.l); }
set_6_d(void)1588 static void set_6_d(void) { M_SET(6,R.DE.B.h); }
set_6_e(void)1589 static void set_6_e(void) { M_SET(6,R.DE.B.l); }
set_6_h(void)1590 static void set_6_h(void) { M_SET(6,R.HL.B.h); }
set_6_l(void)1591 static void set_6_l(void) { M_SET(6,R.HL.B.l); }
1592 
set_7_xhl(void)1593 static void set_7_xhl(void)
1594 {
1595  byte i;
1596  i=M_RDMEM(R.HL.D);
1597  M_SET(7,i);
1598  M_WRMEM(R.HL.D,i);
1599 }
set_7_xix(void)1600 static void set_7_xix(void)
1601 {
1602  byte i;
1603  int j;
1604  j=M_XIX;
1605  i=M_RDMEM(j);
1606  M_SET(7,i);
1607  M_WRMEM(j,i);
1608 }
set_7_xiy(void)1609 static void set_7_xiy(void)
1610 {
1611  byte i;
1612  int j;
1613  j=M_XIY;
1614  i=M_RDMEM(j);
1615  M_SET(7,i);
1616  M_WRMEM(j,i);
1617 }
set_7_a(void)1618 static void set_7_a(void) { M_SET(7,R.AF.B.h); }
set_7_b(void)1619 static void set_7_b(void) { M_SET(7,R.BC.B.h); }
set_7_c(void)1620 static void set_7_c(void) { M_SET(7,R.BC.B.l); }
set_7_d(void)1621 static void set_7_d(void) { M_SET(7,R.DE.B.h); }
set_7_e(void)1622 static void set_7_e(void) { M_SET(7,R.DE.B.l); }
set_7_h(void)1623 static void set_7_h(void) { M_SET(7,R.HL.B.h); }
set_7_l(void)1624 static void set_7_l(void) { M_SET(7,R.HL.B.l); }
1625 
sla_xhl(void)1626 static void sla_xhl(void)
1627 {
1628  byte i;
1629  i=M_RDMEM(R.HL.D);
1630  M_SLA(i);
1631  M_WRMEM(R.HL.D,i);
1632 }
sla_xix(void)1633 static void sla_xix(void)
1634 {
1635  byte i;
1636  int j;
1637  j=M_XIX;
1638  i=M_RDMEM(j);
1639  M_SLA(i);
1640  M_WRMEM(j,i);
1641 }
sla_xiy(void)1642 static void sla_xiy(void)
1643 {
1644  byte i;
1645  int j;
1646  j=M_XIY;
1647  i=M_RDMEM(j);
1648  M_SLA(i);
1649  M_WRMEM(j,i);
1650 }
sla_a(void)1651 static void sla_a(void) { M_SLA(R.AF.B.h); }
sla_b(void)1652 static void sla_b(void) { M_SLA(R.BC.B.h); }
sla_c(void)1653 static void sla_c(void) { M_SLA(R.BC.B.l); }
sla_d(void)1654 static void sla_d(void) { M_SLA(R.DE.B.h); }
sla_e(void)1655 static void sla_e(void) { M_SLA(R.DE.B.l); }
sla_h(void)1656 static void sla_h(void) { M_SLA(R.HL.B.h); }
sla_l(void)1657 static void sla_l(void) { M_SLA(R.HL.B.l); }
1658 
sll_xhl(void)1659 static void sll_xhl(void)
1660 {
1661  byte i;
1662  i=M_RDMEM(R.HL.D);
1663  M_SLL(i);
1664  M_WRMEM(R.HL.D,i);
1665 }
sll_xix(void)1666 static void sll_xix(void)
1667 {
1668  byte i;
1669  int j;
1670  j=M_XIX;
1671  i=M_RDMEM(j);
1672  M_SLL(i);
1673  M_WRMEM(j,i);
1674 }
sll_xiy(void)1675 static void sll_xiy(void)
1676 {
1677  byte i;
1678  int j;
1679  j=M_XIY;
1680  i=M_RDMEM(j);
1681  M_SLL(i);
1682  M_WRMEM(j,i);
1683 }
sll_a(void)1684 static void sll_a(void) { M_SLL(R.AF.B.h); }
sll_b(void)1685 static void sll_b(void) { M_SLL(R.BC.B.h); }
sll_c(void)1686 static void sll_c(void) { M_SLL(R.BC.B.l); }
sll_d(void)1687 static void sll_d(void) { M_SLL(R.DE.B.h); }
sll_e(void)1688 static void sll_e(void) { M_SLL(R.DE.B.l); }
sll_h(void)1689 static void sll_h(void) { M_SLL(R.HL.B.h); }
sll_l(void)1690 static void sll_l(void) { M_SLL(R.HL.B.l); }
1691 
sra_xhl(void)1692 static void sra_xhl(void)
1693 {
1694  byte i;
1695  i=M_RDMEM(R.HL.D);
1696  M_SRA(i);
1697  M_WRMEM(R.HL.D,i);
1698 }
sra_xix(void)1699 static void sra_xix(void)
1700 {
1701  byte i;
1702  int j;
1703  j=M_XIX;
1704  i=M_RDMEM(j);
1705  M_SRA(i);
1706  M_WRMEM(j,i);
1707 }
sra_xiy(void)1708 static void sra_xiy(void)
1709 {
1710  byte i;
1711  int j;
1712  j=M_XIY;
1713  i=M_RDMEM(j);
1714  M_SRA(i);
1715  M_WRMEM(j,i);
1716 }
sra_a(void)1717 static void sra_a(void) { M_SRA(R.AF.B.h); }
sra_b(void)1718 static void sra_b(void) { M_SRA(R.BC.B.h); }
sra_c(void)1719 static void sra_c(void) { M_SRA(R.BC.B.l); }
sra_d(void)1720 static void sra_d(void) { M_SRA(R.DE.B.h); }
sra_e(void)1721 static void sra_e(void) { M_SRA(R.DE.B.l); }
sra_h(void)1722 static void sra_h(void) { M_SRA(R.HL.B.h); }
sra_l(void)1723 static void sra_l(void) { M_SRA(R.HL.B.l); }
1724 
srl_xhl(void)1725 static void srl_xhl(void)
1726 {
1727  byte i;
1728  i=M_RDMEM(R.HL.D);
1729  M_SRL(i);
1730  M_WRMEM(R.HL.D,i);
1731 }
srl_xix(void)1732 static void srl_xix(void)
1733 {
1734  byte i;
1735  int j;
1736  j=M_XIX;
1737  i=M_RDMEM(j);
1738  M_SRL(i);
1739  M_WRMEM(j,i);
1740 }
srl_xiy(void)1741 static void srl_xiy(void)
1742 {
1743  byte i;
1744  int j;
1745  j=M_XIY;
1746  i=M_RDMEM(j);
1747  M_SRL(i);
1748  M_WRMEM(j,i);
1749 }
srl_a(void)1750 static void srl_a(void) { M_SRL(R.AF.B.h); }
srl_b(void)1751 static void srl_b(void) { M_SRL(R.BC.B.h); }
srl_c(void)1752 static void srl_c(void) { M_SRL(R.BC.B.l); }
srl_d(void)1753 static void srl_d(void) { M_SRL(R.DE.B.h); }
srl_e(void)1754 static void srl_e(void) { M_SRL(R.DE.B.l); }
srl_h(void)1755 static void srl_h(void) { M_SRL(R.HL.B.h); }
srl_l(void)1756 static void srl_l(void) { M_SRL(R.HL.B.l); }
1757 
sub_xhl(void)1758 static void sub_xhl(void) { byte i=M_RD_XHL; M_SUB(i); }
sub_xix(void)1759 static void sub_xix(void) { byte i=M_RD_XIX(); M_SUB(i); }
sub_xiy(void)1760 static void sub_xiy(void) { byte i=M_RD_XIY(); M_SUB(i); }
sub_a(void)1761 static void sub_a(void) { R.AF.D=Z_FLAG|N_FLAG; }
sub_b(void)1762 static void sub_b(void) { M_SUB(R.BC.B.h); }
sub_c(void)1763 static void sub_c(void) { M_SUB(R.BC.B.l); }
sub_d(void)1764 static void sub_d(void) { M_SUB(R.DE.B.h); }
sub_e(void)1765 static void sub_e(void) { M_SUB(R.DE.B.l); }
sub_h(void)1766 static void sub_h(void) { M_SUB(R.HL.B.h); }
sub_l(void)1767 static void sub_l(void) { M_SUB(R.HL.B.l); }
sub_ixh(void)1768 static void sub_ixh(void) { M_SUB(R.IX.B.h); }
sub_ixl(void)1769 static void sub_ixl(void) { M_SUB(R.IX.B.l); }
sub_iyh(void)1770 static void sub_iyh(void) { M_SUB(R.IY.B.h); }
sub_iyl(void)1771 static void sub_iyl(void) { M_SUB(R.IY.B.l); }
sub_byte(void)1772 static void sub_byte(void) { byte i=M_RDMEM_OPCODE(); M_SUB(i); }
1773 
xor_xhl(void)1774 static void xor_xhl(void) { byte i=M_RD_XHL; M_XOR(i); }
xor_xix(void)1775 static void xor_xix(void) { byte i=M_RD_XIX(); M_XOR(i); }
xor_xiy(void)1776 static void xor_xiy(void) { byte i=M_RD_XIY(); M_XOR(i); }
xor_a(void)1777 static void xor_a(void) { R.AF.D=Z_FLAG|V_FLAG; }
xor_b(void)1778 static void xor_b(void) { M_XOR(R.BC.B.h); }
xor_c(void)1779 static void xor_c(void) { M_XOR(R.BC.B.l); }
xor_d(void)1780 static void xor_d(void) { M_XOR(R.DE.B.h); }
xor_e(void)1781 static void xor_e(void) { M_XOR(R.DE.B.l); }
xor_h(void)1782 static void xor_h(void) { M_XOR(R.HL.B.h); }
xor_l(void)1783 static void xor_l(void) { M_XOR(R.HL.B.l); }
xor_ixh(void)1784 static void xor_ixh(void) { M_XOR(R.IX.B.h); }
xor_ixl(void)1785 static void xor_ixl(void) { M_XOR(R.IX.B.l); }
xor_iyh(void)1786 static void xor_iyh(void) { M_XOR(R.IY.B.h); }
xor_iyl(void)1787 static void xor_iyl(void) { M_XOR(R.IY.B.l); }
xor_byte(void)1788 static void xor_byte(void) { byte i=M_RDMEM_OPCODE(); M_XOR(i); }
1789 
no_op(void)1790 static void no_op(void)
1791 {
1792  --R.PC.W.l;
1793 }
1794 
patch(void)1795 static void patch(void) { Z80_Patch(&R); }
1796 
1797 static unsigned cycles_main[256]=
1798 {
1799   4,10,7,6,4,4,7,4,
1800   4,11,7,6,4,4,7,4,
1801   8,10,7,6,4,4,7,4,
1802   7,11,7,6,4,4,7,4,
1803   7,10,16,6,4,4,7,4,
1804   7,11,16,6,4,4,7,4,
1805   7,10,13,6,11,11,10,4,
1806   7,11,13,6,4,4,7,4,
1807   4,4,4,4,4,4,7,4,
1808   4,4,4,4,4,4,7,4,
1809   4,4,4,4,4,4,7,4,
1810   4,4,4,4,4,4,7,4,
1811   4,4,4,4,4,4,7,4,
1812   4,4,4,4,4,4,7,4,
1813   7,7,7,7,7,7,4,7,
1814   4,4,4,4,4,4,7,4,
1815   4,4,4,4,4,4,7,4,
1816   4,4,4,4,4,4,7,4,
1817   4,4,4,4,4,4,7,4,
1818   4,4,4,4,4,4,7,4,
1819   4,4,4,4,4,4,7,4,
1820   4,4,4,4,4,4,7,4,
1821   4,4,4,4,4,4,7,4,
1822   4,4,4,4,4,4,7,4,
1823   5,10,10,10,10,11,7,11,
1824   5,4,10,0,10,10,7,11,
1825   5,10,10,11,10,11,7,11,
1826   5,4,10,11,10,0,7,11,
1827   5,10,10,19,10,11,7,11,
1828   5,4,10,4,10,0,7,11,
1829   5,10,10,4,10,11,7,11,
1830   5,6,10,4,10,0,7,11
1831 };
1832 static unsigned cycles_cb[256]=
1833 {
1834   8,8,8,8,8,8,15,8,
1835   8,8,8,8,8,8,15,8,
1836   8,8,8,8,8,8,15,8,
1837   8,8,8,8,8,8,15,8,
1838   8,8,8,8,8,8,15,8,
1839   8,8,8,8,8,8,15,8,
1840   8,8,8,8,8,8,15,8,
1841   8,8,8,8,8,8,15,8,
1842   8,8,8,8,8,8,12,8,
1843   8,8,8,8,8,8,12,8,
1844   8,8,8,8,8,8,12,8,
1845   8,8,8,8,8,8,12,8,
1846   8,8,8,8,8,8,12,8,
1847   8,8,8,8,8,8,12,8,
1848   8,8,8,8,8,8,12,8,
1849   8,8,8,8,8,8,12,8,
1850   8,8,8,8,8,8,15,8,
1851   8,8,8,8,8,8,15,8,
1852   8,8,8,8,8,8,15,8,
1853   8,8,8,8,8,8,15,8,
1854   8,8,8,8,8,8,15,8,
1855   8,8,8,8,8,8,15,8,
1856   8,8,8,8,8,8,15,8,
1857   8,8,8,8,8,8,15,8,
1858   8,8,8,8,8,8,15,8,
1859   8,8,8,8,8,8,15,8,
1860   8,8,8,8,8,8,15,8,
1861   8,8,8,8,8,8,15,8,
1862   8,8,8,8,8,8,15,8,
1863   8,8,8,8,8,8,15,8,
1864   8,8,8,8,8,8,15,8,
1865   8,8,8,8,8,8,15,8
1866 };
1867 static unsigned cycles_xx_cb[]=
1868 {
1869   0,0,0,0,0,0,23,0,
1870   0,0,0,0,0,0,23,0,
1871   0,0,0,0,0,0,23,0,
1872   0,0,0,0,0,0,23,0,
1873   0,0,0,0,0,0,23,0,
1874   0,0,0,0,0,0,23,0,
1875   0,0,0,0,0,0,23,0,
1876   0,0,0,0,0,0,23,0,
1877   20,20,20,20,20,20,20,20,
1878   20,20,20,20,20,20,20,20,
1879   20,20,20,20,20,20,20,20,
1880   20,20,20,20,20,20,20,20,
1881   20,20,20,20,20,20,20,20,
1882   20,20,20,20,20,20,20,20,
1883   20,20,20,20,20,20,20,20,
1884   20,20,20,20,20,20,20,20,
1885   0,0,0,0,0,0,23,0,
1886   0,0,0,0,0,0,23,0,
1887   0,0,0,0,0,0,23,0,
1888   0,0,0,0,0,0,23,0,
1889   0,0,0,0,0,0,23,0,
1890   0,0,0,0,0,0,23,0,
1891   0,0,0,0,0,0,23,0,
1892   0,0,0,0,0,0,23,0,
1893   0,0,0,0,0,0,23,0,
1894   0,0,0,0,0,0,23,0,
1895   0,0,0,0,0,0,23,0,
1896   0,0,0,0,0,0,23,0,
1897   0,0,0,0,0,0,23,0,
1898   0,0,0,0,0,0,23,0,
1899   0,0,0,0,0,0,23,0,
1900   0,0,0,0,0,0,23,0
1901 };
1902 static unsigned cycles_xx[256]=
1903 {
1904   0,0,0,0,0,0,0,0,
1905   0,15,0,0,0,0,0,0,
1906   0,0,0,0,0,0,0,0,
1907   0,15,0,0,0,0,0,0,
1908   0,14,20,10,9,9,9,0,
1909   0,15,20,10,9,9,9,0,
1910   0,0,0,0,23,23,19,0,
1911   0,15,0,0,0,0,0,0,
1912   0,0,0,0,9,9,19,0,
1913   0,0,0,0,9,9,19,0,
1914   0,0,0,0,9,9,19,0,
1915   0,0,0,0,9,9,19,0,
1916   9,9,9,9,9,9,9,9,
1917   9,9,9,9,9,9,9,9,
1918   19,19,19,19,19,19,19,19,
1919   0,0,0,0,9,9,19,0,
1920   0,0,0,0,9,9,19,0,
1921   0,0,0,0,9,9,19,0,
1922   0,0,0,0,9,9,19,0,
1923   0,0,0,0,9,9,19,0,
1924   0,0,0,0,9,9,19,0,
1925   0,0,0,0,9,9,19,0,
1926   0,0,0,0,9,9,19,0,
1927   0,0,0,0,9,9,19,0,
1928   0,0,0,0,0,0,0,0,
1929   0,0,0,0,0,0,0,0,
1930   0,0,0,0,0,0,0,0,
1931   0,0,0,0,0,0,0,0,
1932   0,14,0,23,0,15,0,0,
1933   0,8,0,0,0,0,0,0,
1934   0,0,0,0,0,0,0,0,
1935   0,10,0,0,0,0,0,0
1936 };
1937 static unsigned cycles_ed[256]=
1938 {
1939   0,0,0,0,0,0,0,0,
1940   0,0,0,0,0,0,0,0,
1941   0,0,0,0,0,0,0,0,
1942   0,0,0,0,0,0,0,0,
1943   0,0,0,0,0,0,0,0,
1944   0,0,0,0,0,0,0,0,
1945   0,0,0,0,0,0,0,0,
1946   0,0,0,0,0,0,0,0,
1947   12,12,15,20,8,8,8,9,
1948   12,12,15,20,8,8,8,9,
1949   12,12,15,20,8,8,8,9,
1950   12,12,15,20,8,8,8,9,
1951   12,12,15,20,8,8,8,18,
1952   12,12,15,20,8,8,8,18,
1953   12,12,15,20,8,8,8,0,
1954   12,12,15,20,8,8,8,0,
1955   0,0,0,0,0,0,0,0,
1956   0,0,0,0,0,0,0,0,
1957   0,0,0,0,0,0,0,0,
1958   0,0,0,0,0,0,0,0,
1959   16,16,16,16,0,0,0,0,
1960   16,16,16,16,0,0,0,0,
1961   0,0,0,0,0,0,0,0,
1962   0,0,0,0,0,0,0,0,
1963   0,0,0,0,0,0,0,0,
1964   0,0,0,0,0,0,0,0,
1965   0,0,0,0,0,0,0,0,
1966   0,0,0,0,0,0,0,0,
1967   0,0,0,0,0,0,0,0,
1968   0,0,0,0,0,0,0,0,
1969   0,0,0,0,0,0,0,0,
1970   0,0,0,0,0,0,0,0
1971 };
1972 
no_op_xx(void)1973 static void no_op_xx(void) { ++R.PC.W.l; }
1974 
1975 static opcode_fn opcode_dd_cb[256]=
1976 {
1977  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,rlc_xix  ,no_op_xx ,
1978  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,rrc_xix  ,no_op_xx ,
1979  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,rl_xix   ,no_op_xx ,
1980  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,rr_xix   ,no_op_xx ,
1981  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,sla_xix  ,no_op_xx ,
1982  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,sra_xix  ,no_op_xx ,
1983  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,sll_xix  ,no_op_xx ,
1984  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,srl_xix  ,no_op_xx ,
1985  bit_0_xix,bit_0_xix,bit_0_xix,bit_0_xix,bit_0_xix,bit_0_xix,bit_0_xix,bit_0_xix,
1986  bit_1_xix,bit_1_xix,bit_1_xix,bit_1_xix,bit_1_xix,bit_1_xix,bit_1_xix,bit_1_xix,
1987  bit_2_xix,bit_2_xix,bit_2_xix,bit_2_xix,bit_2_xix,bit_2_xix,bit_2_xix,bit_2_xix,
1988  bit_3_xix,bit_3_xix,bit_3_xix,bit_3_xix,bit_3_xix,bit_3_xix,bit_3_xix,bit_3_xix,
1989  bit_4_xix,bit_4_xix,bit_4_xix,bit_4_xix,bit_4_xix,bit_4_xix,bit_4_xix,bit_4_xix,
1990  bit_5_xix,bit_5_xix,bit_5_xix,bit_5_xix,bit_5_xix,bit_5_xix,bit_5_xix,bit_5_xix,
1991  bit_6_xix,bit_6_xix,bit_6_xix,bit_6_xix,bit_6_xix,bit_6_xix,bit_6_xix,bit_6_xix,
1992  bit_7_xix,bit_7_xix,bit_7_xix,bit_7_xix,bit_7_xix,bit_7_xix,bit_7_xix,bit_7_xix,
1993  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_0_xix,no_op_xx ,
1994  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_1_xix,no_op_xx ,
1995  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_2_xix,no_op_xx ,
1996  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_3_xix,no_op_xx ,
1997  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_4_xix,no_op_xx ,
1998  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_5_xix,no_op_xx ,
1999  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_6_xix,no_op_xx ,
2000  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_7_xix,no_op_xx ,
2001  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_0_xix,no_op_xx ,
2002  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_1_xix,no_op_xx ,
2003  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_2_xix,no_op_xx ,
2004  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_3_xix,no_op_xx ,
2005  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_4_xix,no_op_xx ,
2006  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_5_xix,no_op_xx ,
2007  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_6_xix,no_op_xx ,
2008  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_7_xix,no_op_xx
2009 };
2010 
2011 static opcode_fn opcode_fd_cb[256]=
2012 {
2013  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,rlc_xiy  ,no_op_xx ,
2014  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,rrc_xiy  ,no_op_xx ,
2015  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,rl_xiy   ,no_op_xx ,
2016  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,rr_xiy   ,no_op_xx ,
2017  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,sla_xiy  ,no_op_xx ,
2018  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,sra_xiy  ,no_op_xx ,
2019  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,sll_xiy  ,no_op_xx ,
2020  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,srl_xiy  ,no_op_xx ,
2021  bit_0_xiy,bit_0_xiy,bit_0_xiy,bit_0_xiy,bit_0_xiy,bit_0_xiy,bit_0_xiy,bit_0_xiy,
2022  bit_1_xiy,bit_1_xiy,bit_1_xiy,bit_1_xiy,bit_1_xiy,bit_1_xiy,bit_1_xiy,bit_1_xiy,
2023  bit_2_xiy,bit_2_xiy,bit_2_xiy,bit_2_xiy,bit_2_xiy,bit_2_xiy,bit_2_xiy,bit_2_xiy,
2024  bit_3_xiy,bit_3_xiy,bit_3_xiy,bit_3_xiy,bit_3_xiy,bit_3_xiy,bit_3_xiy,bit_3_xiy,
2025  bit_4_xiy,bit_4_xiy,bit_4_xiy,bit_4_xiy,bit_4_xiy,bit_4_xiy,bit_4_xiy,bit_4_xiy,
2026  bit_5_xiy,bit_5_xiy,bit_5_xiy,bit_5_xiy,bit_5_xiy,bit_5_xiy,bit_5_xiy,bit_5_xiy,
2027  bit_6_xiy,bit_6_xiy,bit_6_xiy,bit_6_xiy,bit_6_xiy,bit_6_xiy,bit_6_xiy,bit_6_xiy,
2028  bit_7_xiy,bit_7_xiy,bit_7_xiy,bit_7_xiy,bit_7_xiy,bit_7_xiy,bit_7_xiy,bit_7_xiy,
2029  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_0_xiy,no_op_xx ,
2030  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_1_xiy,no_op_xx ,
2031  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_2_xiy,no_op_xx ,
2032  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_3_xiy,no_op_xx ,
2033  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_4_xiy,no_op_xx ,
2034  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_5_xiy,no_op_xx ,
2035  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_6_xiy,no_op_xx ,
2036  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,res_7_xiy,no_op_xx ,
2037  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_0_xiy,no_op_xx ,
2038  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_1_xiy,no_op_xx ,
2039  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_2_xiy,no_op_xx ,
2040  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_3_xiy,no_op_xx ,
2041  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_4_xiy,no_op_xx ,
2042  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_5_xiy,no_op_xx ,
2043  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_6_xiy,no_op_xx ,
2044  no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,no_op_xx ,set_7_xiy,no_op_xx
2045 };
2046 
dd_cb(void)2047 static void dd_cb(void)
2048 {
2049  unsigned opcode;
2050  opcode=M_RDOP_ARG((R.PC.D+1)&0xFFFF);
2051  Z80_ICount-=cycles_xx_cb[opcode];
2052  (*(opcode_dd_cb[opcode]))();
2053  ++R.PC.W.l;
2054 }
fd_cb(void)2055 static void fd_cb(void)
2056 {
2057  unsigned opcode;
2058  opcode=M_RDOP_ARG((R.PC.D+1)&0xFFFF);
2059  Z80_ICount-=cycles_xx_cb[opcode];
2060  (*(opcode_fd_cb[opcode]))();
2061  ++R.PC.W.l;
2062 }
2063 
2064 static opcode_fn opcode_cb[256]=
2065 {
2066  rlc_b  ,rlc_c  ,rlc_d  ,rlc_e  ,rlc_h  ,rlc_l  ,rlc_xhl  ,rlc_a  ,
2067  rrc_b  ,rrc_c  ,rrc_d  ,rrc_e  ,rrc_h  ,rrc_l  ,rrc_xhl  ,rrc_a  ,
2068  rl_b   ,rl_c   ,rl_d   ,rl_e   ,rl_h   ,rl_l   ,rl_xhl   ,rl_a   ,
2069  rr_b   ,rr_c   ,rr_d   ,rr_e   ,rr_h   ,rr_l   ,rr_xhl   ,rr_a   ,
2070  sla_b  ,sla_c  ,sla_d  ,sla_e  ,sla_h  ,sla_l  ,sla_xhl  ,sla_a  ,
2071  sra_b  ,sra_c  ,sra_d  ,sra_e  ,sra_h  ,sra_l  ,sra_xhl  ,sra_a  ,
2072  sll_b  ,sll_c  ,sll_d  ,sll_e  ,sll_h  ,sll_l  ,sll_xhl  ,sll_a  ,
2073  srl_b  ,srl_c  ,srl_d  ,srl_e  ,srl_h  ,srl_l  ,srl_xhl  ,srl_a  ,
2074  bit_0_b,bit_0_c,bit_0_d,bit_0_e,bit_0_h,bit_0_l,bit_0_xhl,bit_0_a,
2075  bit_1_b,bit_1_c,bit_1_d,bit_1_e,bit_1_h,bit_1_l,bit_1_xhl,bit_1_a,
2076  bit_2_b,bit_2_c,bit_2_d,bit_2_e,bit_2_h,bit_2_l,bit_2_xhl,bit_2_a,
2077  bit_3_b,bit_3_c,bit_3_d,bit_3_e,bit_3_h,bit_3_l,bit_3_xhl,bit_3_a,
2078  bit_4_b,bit_4_c,bit_4_d,bit_4_e,bit_4_h,bit_4_l,bit_4_xhl,bit_4_a,
2079  bit_5_b,bit_5_c,bit_5_d,bit_5_e,bit_5_h,bit_5_l,bit_5_xhl,bit_5_a,
2080  bit_6_b,bit_6_c,bit_6_d,bit_6_e,bit_6_h,bit_6_l,bit_6_xhl,bit_6_a,
2081  bit_7_b,bit_7_c,bit_7_d,bit_7_e,bit_7_h,bit_7_l,bit_7_xhl,bit_7_a,
2082  res_0_b,res_0_c,res_0_d,res_0_e,res_0_h,res_0_l,res_0_xhl,res_0_a,
2083  res_1_b,res_1_c,res_1_d,res_1_e,res_1_h,res_1_l,res_1_xhl,res_1_a,
2084  res_2_b,res_2_c,res_2_d,res_2_e,res_2_h,res_2_l,res_2_xhl,res_2_a,
2085  res_3_b,res_3_c,res_3_d,res_3_e,res_3_h,res_3_l,res_3_xhl,res_3_a,
2086  res_4_b,res_4_c,res_4_d,res_4_e,res_4_h,res_4_l,res_4_xhl,res_4_a,
2087  res_5_b,res_5_c,res_5_d,res_5_e,res_5_h,res_5_l,res_5_xhl,res_5_a,
2088  res_6_b,res_6_c,res_6_d,res_6_e,res_6_h,res_6_l,res_6_xhl,res_6_a,
2089  res_7_b,res_7_c,res_7_d,res_7_e,res_7_h,res_7_l,res_7_xhl,res_7_a,
2090  set_0_b,set_0_c,set_0_d,set_0_e,set_0_h,set_0_l,set_0_xhl,set_0_a,
2091  set_1_b,set_1_c,set_1_d,set_1_e,set_1_h,set_1_l,set_1_xhl,set_1_a,
2092  set_2_b,set_2_c,set_2_d,set_2_e,set_2_h,set_2_l,set_2_xhl,set_2_a,
2093  set_3_b,set_3_c,set_3_d,set_3_e,set_3_h,set_3_l,set_3_xhl,set_3_a,
2094  set_4_b,set_4_c,set_4_d,set_4_e,set_4_h,set_4_l,set_4_xhl,set_4_a,
2095  set_5_b,set_5_c,set_5_d,set_5_e,set_5_h,set_5_l,set_5_xhl,set_5_a,
2096  set_6_b,set_6_c,set_6_d,set_6_e,set_6_h,set_6_l,set_6_xhl,set_6_a,
2097  set_7_b,set_7_c,set_7_d,set_7_e,set_7_h,set_7_l,set_7_xhl,set_7_a
2098 };
2099 
2100 static opcode_fn opcode_dd[256]=
2101 {
2102   no_op   ,no_op     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2103   no_op   ,add_ix_bc ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2104   no_op   ,no_op     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2105   no_op   ,add_ix_de ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2106   no_op   ,ld_ix_word,ld_xword_ix,inc_ix   ,inc_ixh    ,dec_ixh    ,ld_ixh_byte,no_op   ,
2107   no_op   ,add_ix_ix ,ld_ix_xword,dec_ix   ,inc_ixl    ,dec_ixl    ,ld_ixl_byte,no_op   ,
2108   no_op   ,no_op     ,no_op      ,no_op    ,inc_xix    ,dec_xix    ,ld_xix_byte,no_op   ,
2109   no_op   ,add_ix_sp ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2110   no_op   ,no_op     ,no_op      ,no_op    ,ld_b_ixh   ,ld_b_ixl   ,ld_b_xix   ,no_op   ,
2111   no_op   ,no_op     ,no_op      ,no_op    ,ld_c_ixh   ,ld_c_ixl   ,ld_c_xix   ,no_op   ,
2112   no_op   ,no_op     ,no_op      ,no_op    ,ld_d_ixh   ,ld_d_ixl   ,ld_d_xix   ,no_op   ,
2113   no_op   ,no_op     ,no_op      ,no_op    ,ld_e_ixh   ,ld_e_ixl   ,ld_e_xix   ,no_op   ,
2114   ld_ixh_b,ld_ixh_c  ,ld_ixh_d   ,ld_ixh_e ,ld_ixh_ixh ,ld_ixh_ixl ,ld_h_xix   ,ld_ixh_a,
2115   ld_ixl_b,ld_ixl_c  ,ld_ixl_d   ,ld_ixl_e ,ld_ixl_ixh ,ld_ixl_ixl ,ld_l_xix   ,ld_ixl_a,
2116   ld_xix_b,ld_xix_c  ,ld_xix_d   ,ld_xix_e ,ld_xix_h   ,ld_xix_l   ,no_op      ,ld_xix_a,
2117   no_op   ,no_op     ,no_op      ,no_op    ,ld_a_ixh   ,ld_a_ixl   ,ld_a_xix   ,no_op   ,
2118   no_op   ,no_op     ,no_op      ,no_op    ,add_a_ixh  ,add_a_ixl  ,add_a_xix  ,no_op   ,
2119   no_op   ,no_op     ,no_op      ,no_op    ,adc_a_ixh  ,adc_a_ixl  ,adc_a_xix  ,no_op   ,
2120   no_op   ,no_op     ,no_op      ,no_op    ,sub_ixh    ,sub_ixl    ,sub_xix    ,no_op   ,
2121   no_op   ,no_op     ,no_op      ,no_op    ,sbc_a_ixh  ,sbc_a_ixl  ,sbc_a_xix  ,no_op   ,
2122   no_op   ,no_op     ,no_op      ,no_op    ,and_ixh    ,and_ixl    ,and_xix    ,no_op   ,
2123   no_op   ,no_op     ,no_op      ,no_op    ,xor_ixh    ,xor_ixl    ,xor_xix    ,no_op   ,
2124   no_op   ,no_op     ,no_op      ,no_op    ,or_ixh     ,or_ixl     ,or_xix     ,no_op   ,
2125   no_op   ,no_op     ,no_op      ,no_op    ,cp_ixh     ,cp_ixl     ,cp_xix     ,no_op   ,
2126   no_op   ,no_op     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2127   no_op   ,no_op     ,no_op      ,dd_cb    ,no_op      ,no_op      ,no_op      ,no_op   ,
2128   no_op   ,no_op     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2129   no_op   ,no_op     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2130   no_op   ,pop_ix    ,no_op      ,ex_xsp_ix,no_op      ,push_ix    ,no_op      ,no_op   ,
2131   no_op   ,jp_ix     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2132   no_op   ,no_op     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2133   no_op   ,ld_sp_ix  ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op
2134 };
2135 
2136 static opcode_fn opcode_ed[256]=
2137 {
2138  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2139  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2140  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2141  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2142  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2143  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2144  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2145  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2146  in_b_c,out_c_b,sbc_hl_bc,ld_xword_bc,neg,retn,im_0 ,ld_i_a,
2147  in_c_c,out_c_c,adc_hl_bc,ld_bc_xword,neg,reti,im_0 ,ld_r_a,
2148  in_d_c,out_c_d,sbc_hl_de,ld_xword_de,neg,retn,im_1 ,ld_a_i,
2149  in_e_c,out_c_e,adc_hl_de,ld_de_xword,neg,reti,im_2 ,ld_a_r,
2150  in_h_c,out_c_h,sbc_hl_hl,ld_xword_hl,neg,retn,im_0 ,rrd   ,
2151  in_l_c,out_c_l,adc_hl_hl,ld_hl_xword,neg,reti,im_0 ,rld   ,
2152  in_0_c,out_c_0,sbc_hl_sp,ld_xword_sp,neg,retn,im_1 ,nop   ,
2153  in_a_c,out_c_a,adc_hl_sp,ld_sp_xword,neg,reti,im_2 ,nop   ,
2154  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2155  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2156  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2157  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2158  ldi   ,cpi    ,ini      ,outi       ,nop,nop ,nop  ,nop   ,
2159  ldd   ,cpd    ,ind      ,outd       ,nop,nop ,nop  ,nop   ,
2160  ldir  ,cpir   ,inir     ,otir       ,nop,nop ,nop  ,nop   ,
2161  lddr  ,cpdr   ,indr     ,otdr       ,nop,nop ,nop  ,nop   ,
2162  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2163  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2164  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2165  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2166  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2167  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2168  nop   ,nop    ,nop      ,nop        ,nop,nop ,nop  ,nop   ,
2169  nop   ,nop    ,nop      ,nop        ,nop,nop ,patch,nop
2170 };
2171 
2172 static opcode_fn opcode_fd[256]=
2173 {
2174   no_op   ,no_op     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2175   no_op   ,add_iy_bc ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2176   no_op   ,no_op     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2177   no_op   ,add_iy_de ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2178   no_op   ,ld_iy_word,ld_xword_iy,inc_iy   ,inc_iyh    ,dec_iyh    ,ld_iyh_byte,no_op   ,
2179   no_op   ,add_iy_iy ,ld_iy_xword,dec_iy   ,inc_iyl    ,dec_iyl    ,ld_iyl_byte,no_op   ,
2180   no_op   ,no_op     ,no_op      ,no_op    ,inc_xiy    ,dec_xiy    ,ld_xiy_byte,no_op   ,
2181   no_op   ,add_iy_sp ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2182   no_op   ,no_op     ,no_op      ,no_op    ,ld_b_iyh   ,ld_b_iyl   ,ld_b_xiy   ,no_op   ,
2183   no_op   ,no_op     ,no_op      ,no_op    ,ld_c_iyh   ,ld_c_iyl   ,ld_c_xiy   ,no_op   ,
2184   no_op   ,no_op     ,no_op      ,no_op    ,ld_d_iyh   ,ld_d_iyl   ,ld_d_xiy   ,no_op   ,
2185   no_op   ,no_op     ,no_op      ,no_op    ,ld_e_iyh   ,ld_e_iyl   ,ld_e_xiy   ,no_op   ,
2186   ld_iyh_b,ld_iyh_c  ,ld_iyh_d   ,ld_iyh_e ,ld_iyh_iyh ,ld_iyh_iyl ,ld_h_xiy   ,ld_iyh_a,
2187   ld_iyl_b,ld_iyl_c  ,ld_iyl_d   ,ld_iyl_e ,ld_iyl_iyh ,ld_iyl_iyl ,ld_l_xiy   ,ld_iyl_a,
2188   ld_xiy_b,ld_xiy_c  ,ld_xiy_d   ,ld_xiy_e ,ld_xiy_h   ,ld_xiy_l   ,no_op      ,ld_xiy_a,
2189   no_op   ,no_op     ,no_op      ,no_op    ,ld_a_iyh   ,ld_a_iyl   ,ld_a_xiy   ,no_op   ,
2190   no_op   ,no_op     ,no_op      ,no_op    ,add_a_iyh  ,add_a_iyl  ,add_a_xiy  ,no_op   ,
2191   no_op   ,no_op     ,no_op      ,no_op    ,adc_a_iyh  ,adc_a_iyl  ,adc_a_xiy  ,no_op   ,
2192   no_op   ,no_op     ,no_op      ,no_op    ,sub_iyh    ,sub_iyl    ,sub_xiy    ,no_op   ,
2193   no_op   ,no_op     ,no_op      ,no_op    ,sbc_a_iyh  ,sbc_a_iyl  ,sbc_a_xiy  ,no_op   ,
2194   no_op   ,no_op     ,no_op      ,no_op    ,and_iyh    ,and_iyl    ,and_xiy    ,no_op   ,
2195   no_op   ,no_op     ,no_op      ,no_op    ,xor_iyh    ,xor_iyl    ,xor_xiy    ,no_op   ,
2196   no_op   ,no_op     ,no_op      ,no_op    ,or_iyh     ,or_iyl     ,or_xiy     ,no_op   ,
2197   no_op   ,no_op     ,no_op      ,no_op    ,cp_iyh     ,cp_iyl     ,cp_xiy     ,no_op   ,
2198   no_op   ,no_op     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2199   no_op   ,no_op     ,no_op      ,fd_cb    ,no_op      ,no_op      ,no_op      ,no_op   ,
2200   no_op   ,no_op     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2201   no_op   ,no_op     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2202   no_op   ,pop_iy    ,no_op      ,ex_xsp_iy,no_op      ,push_iy    ,no_op      ,no_op   ,
2203   no_op   ,jp_iy     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2204   no_op   ,no_op     ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op   ,
2205   no_op   ,ld_sp_iy  ,no_op      ,no_op    ,no_op      ,no_op      ,no_op      ,no_op
2206 };
2207 
cb(void)2208 static void cb(void)
2209 {
2210  unsigned opcode;
2211  ++R.R;
2212  opcode=M_RDOP(R.PC.D);
2213  R.PC.W.l++;
2214  Z80_ICount-=cycles_cb[opcode];
2215  (*(opcode_cb[opcode]))();
2216 }
dd(void)2217 static void dd(void)
2218 {
2219  unsigned opcode;
2220  ++R.R;
2221  opcode=M_RDOP(R.PC.D);
2222  R.PC.W.l++;
2223  Z80_ICount-=cycles_xx[opcode];
2224  (*(opcode_dd[opcode]))();
2225 }
ed(void)2226 static void ed(void)
2227 {
2228  unsigned opcode;
2229  ++R.R;
2230  opcode=M_RDOP(R.PC.D);
2231  R.PC.W.l++;
2232  Z80_ICount-=cycles_ed[opcode];
2233  (*(opcode_ed[opcode]))();
2234 }
fd(void)2235 static void fd (void)
2236 {
2237  unsigned opcode;
2238  ++R.R;
2239  opcode=M_RDOP(R.PC.D);
2240  R.PC.W.l++;
2241  Z80_ICount-=cycles_xx[opcode];
2242  (*(opcode_fd[opcode]))();
2243 }
2244 
2245 static opcode_fn opcode_main[256]=
2246 {
2247  nop     ,ld_bc_word,ld_xbc_a   ,inc_bc    ,inc_b   ,dec_b   ,ld_b_byte  ,rlca    ,
2248  ex_af_af,add_hl_bc ,ld_a_xbc   ,dec_bc    ,inc_c   ,dec_c   ,ld_c_byte  ,rrca    ,
2249  djnz    ,ld_de_word,ld_xde_a   ,inc_de    ,inc_d   ,dec_d   ,ld_d_byte  ,rla     ,
2250  jr      ,add_hl_de ,ld_a_xde   ,dec_de    ,inc_e   ,dec_e   ,ld_e_byte  ,rra     ,
2251  jr_nz   ,ld_hl_word,ld_xword_hl,inc_hl    ,inc_h   ,dec_h   ,ld_h_byte  ,daa     ,
2252  jr_z    ,add_hl_hl ,ld_hl_xword,dec_hl    ,inc_l   ,dec_l   ,ld_l_byte  ,cpl     ,
2253  jr_nc   ,ld_sp_word,ld_xbyte_a ,inc_sp    ,inc_xhl ,dec_xhl ,ld_xhl_byte,scf     ,
2254  jr_c    ,add_hl_sp ,ld_a_xbyte ,dec_sp    ,inc_a   ,dec_a   ,ld_a_byte  ,ccf     ,
2255  ld_b_b  ,ld_b_c    ,ld_b_d     ,ld_b_e    ,ld_b_h  ,ld_b_l  ,ld_b_xhl   ,ld_b_a  ,
2256  ld_c_b  ,ld_c_c    ,ld_c_d     ,ld_c_e    ,ld_c_h  ,ld_c_l  ,ld_c_xhl   ,ld_c_a  ,
2257  ld_d_b  ,ld_d_c    ,ld_d_d     ,ld_d_e    ,ld_d_h  ,ld_d_l  ,ld_d_xhl   ,ld_d_a  ,
2258  ld_e_b  ,ld_e_c    ,ld_e_d     ,ld_e_e    ,ld_e_h  ,ld_e_l  ,ld_e_xhl   ,ld_e_a  ,
2259  ld_h_b  ,ld_h_c    ,ld_h_d     ,ld_h_e    ,ld_h_h  ,ld_h_l  ,ld_h_xhl   ,ld_h_a  ,
2260  ld_l_b  ,ld_l_c    ,ld_l_d     ,ld_l_e    ,ld_l_h  ,ld_l_l  ,ld_l_xhl   ,ld_l_a  ,
2261  ld_xhl_b,ld_xhl_c  ,ld_xhl_d   ,ld_xhl_e  ,ld_xhl_h,ld_xhl_l,halt       ,ld_xhl_a,
2262  ld_a_b  ,ld_a_c    ,ld_a_d     ,ld_a_e    ,ld_a_h  ,ld_a_l  ,ld_a_xhl   ,ld_a_a  ,
2263  add_a_b ,add_a_c   ,add_a_d    ,add_a_e   ,add_a_h ,add_a_l ,add_a_xhl  ,add_a_a ,
2264  adc_a_b ,adc_a_c   ,adc_a_d    ,adc_a_e   ,adc_a_h ,adc_a_l ,adc_a_xhl  ,adc_a_a ,
2265  sub_b   ,sub_c     ,sub_d      ,sub_e     ,sub_h   ,sub_l   ,sub_xhl    ,sub_a   ,
2266  sbc_a_b ,sbc_a_c   ,sbc_a_d    ,sbc_a_e   ,sbc_a_h ,sbc_a_l ,sbc_a_xhl  ,sbc_a_a ,
2267  and_b   ,and_c     ,and_d      ,and_e     ,and_h   ,and_l   ,and_xhl    ,and_a   ,
2268  xor_b   ,xor_c     ,xor_d      ,xor_e     ,xor_h   ,xor_l   ,xor_xhl    ,xor_a   ,
2269  or_b    ,or_c      ,or_d       ,or_e      ,or_h    ,or_l    ,or_xhl     ,or_a    ,
2270  cp_b    ,cp_c      ,cp_d       ,cp_e      ,cp_h    ,cp_l    ,cp_xhl     ,cp_a    ,
2271  ret_nz  ,pop_bc    ,jp_nz      ,jp        ,call_nz ,push_bc ,add_a_byte ,rst_00  ,
2272  ret_z   ,ret       ,jp_z       ,cb        ,call_z  ,call    ,adc_a_byte ,rst_08  ,
2273  ret_nc  ,pop_de    ,jp_nc      ,out_byte_a,call_nc ,push_de ,sub_byte   ,rst_10  ,
2274  ret_c   ,exx       ,jp_c       ,in_a_byte ,call_c  ,dd      ,sbc_a_byte ,rst_18  ,
2275  ret_po  ,pop_hl    ,jp_po      ,ex_xsp_hl ,call_po ,push_hl ,and_byte   ,rst_20  ,
2276  ret_pe  ,jp_hl     ,jp_pe      ,ex_de_hl  ,call_pe ,ed      ,xor_byte   ,rst_28  ,
2277  ret_p   ,pop_af    ,jp_p       ,di        ,call_p  ,push_af ,or_byte    ,rst_30  ,
2278  ret_m   ,ld_sp_hl  ,jp_m       ,ei        ,call_m  ,fd      ,cp_byte    ,rst_38
2279 };
2280 
ei(void)2281 static void ei(void)
2282 {
2283  unsigned opcode;
2284  /* If interrupts were disabled, execute one more instruction and check the */
2285  /* IRQ line. If not, simply set interrupt flip-flop 2                      */
2286  if (!R.IFF1)
2287  {
2288 #ifdef DEBUG
2289   if (R.PC.D==Z80_Trap) Z80_Trace=1;
2290   if (Z80_Trace) Z80_Debug(&R);
2291 #endif
2292   R.IFF1=R.IFF2=1;
2293   ++R.R;
2294   opcode=M_RDOP(R.PC.D);
2295   R.PC.W.l++;
2296   Z80_ICount-=cycles_main[opcode];
2297   (*(opcode_main[opcode]))();
2298   Interrupt(Z80_IRQ);
2299  }
2300  else
2301   R.IFF2=1;
2302 }
2303 
2304 /****************************************************************************/
2305 /* Reset registers to their initial values                                  */
2306 /****************************************************************************/
Z80_Reset(void)2307 void Z80_Reset (void)
2308 {
2309  memset (&R,0,sizeof(Z80_Regs));
2310  R.SP.D=0xF000;
2311  R.R=rand();
2312  Z80_ICount=Z80_IPeriod;
2313 }
2314 
2315 /****************************************************************************/
2316 /* Initialise the various lookup tables used by the emulation code          */
2317 /****************************************************************************/
InitTables(void)2318 static void InitTables (void)
2319 {
2320  static int InitTables_virgin=1;
2321  byte zs;
2322  int i,p;
2323  if (!InitTables_virgin) return;
2324  InitTables_virgin=0;
2325  for (i=0;i<256;++i)
2326  {
2327   zs=0;
2328   if (i==0)
2329    zs|=Z_FLAG;
2330   if (i&0x80)
2331    zs|=S_FLAG;
2332   p=0;
2333   if (i&1) ++p;
2334   if (i&2) ++p;
2335   if (i&4) ++p;
2336   if (i&8) ++p;
2337   if (i&16) ++p;
2338   if (i&32) ++p;
2339   if (i&64) ++p;
2340   if (i&128) ++p;
2341   PTable[i]=(p&1)? 0:V_FLAG;
2342   ZSTable[i]=zs;
2343   ZSPTable[i]=zs|PTable[i];
2344  }
2345  for (i=0;i<256;++i)
2346  {
2347   ZSTable[i+256]=ZSTable[i]|C_FLAG;
2348   ZSPTable[i+256]=ZSPTable[i]|C_FLAG;
2349   PTable[i+256]=PTable[i]|C_FLAG;
2350  }
2351 }
2352 
2353 /****************************************************************************/
2354 /* Issue an interrupt if necessary                                          */
2355 /****************************************************************************/
Interrupt(int j)2356 static void Interrupt (int j)
2357 {
2358  if (j==Z80_IGNORE_INT) return;
2359  if (j==Z80_NMI_INT || R.IFF1)
2360  {
2361   /* Clear interrupt flip-flop 1 */
2362   R.IFF1=0;
2363   /* Check if processor was halted */
2364   if (R.HALT)
2365   {
2366    ++R.PC.W.l;
2367    R.HALT=0;
2368   }
2369   if (j==Z80_NMI_INT)
2370   {
2371    M_PUSH (PC);
2372    R.PC.D=0x0066;
2373   }
2374   else
2375   {
2376    /* Interrupt mode 2. Call [R.I:databyte] */
2377    if (R.IM==2)
2378    {
2379     M_PUSH (PC);
2380     R.PC.D=M_RDMEM_WORD((j&255)|(R.I<<8));
2381    }
2382    else
2383     /* Interrupt mode 1. RST 38h */
2384     if (R.IM==1)
2385     {
2386      Z80_ICount-=cycles_main[0xFF];
2387      (*(opcode_main[0xFF]))();
2388     }
2389     else
2390     /* Interrupt mode 0. We check for CALL and JP instructions, if neither  */
2391     /* of these were found we assume a 1 byte opcode was placed on the      */
2392     /* databus                                                              */
2393     {
2394      switch (j&0xFF0000)
2395      {
2396       case 0xCD0000:
2397        M_PUSH(PC);
2398       case 0xC30000:
2399        R.PC.D=j&0xFFFF;
2400        break;
2401       default:
2402        j&=255;
2403        Z80_ICount-=cycles_main[j];
2404        (*(opcode_main[j]))();
2405        break;
2406      }
2407     }
2408   }
2409  }
2410 }
2411 
2412 /****************************************************************************/
2413 /* Set all registers to given values                                        */
2414 /****************************************************************************/
Z80_SetRegs(Z80_Regs * Regs)2415 void Z80_SetRegs (Z80_Regs *Regs)
2416 {
2417  R=*Regs;
2418 }
2419 
2420 /****************************************************************************/
2421 /* Get all registers in given buffer                                        */
2422 /****************************************************************************/
Z80_GetRegs(Z80_Regs * Regs)2423 void Z80_GetRegs (Z80_Regs *Regs)
2424 {
2425  *Regs=R;
2426 }
2427 
2428 /****************************************************************************/
2429 /* Return program counter                                                   */
2430 /****************************************************************************/
Z80_GetPC(void)2431 unsigned Z80_GetPC (void)
2432 {
2433  return R.PC.D;
2434 }
2435 
2436 /****************************************************************************/
2437 /* Execute IPeriod T-States. Return 0 if emulation should be stopped        */
2438 /****************************************************************************/
Z80_Execute(void)2439 int Z80_Execute (void)
2440 {
2441  unsigned opcode;
2442  Z80_Running=1;
2443  InitTables ();
2444  do
2445  {
2446 #ifdef TRACE
2447   pc_trace[pc_count]=R.PC.D;
2448   pc_count=(pc_count+1)&255;
2449 #endif
2450 #ifdef DEBUG
2451   if (R.PC.D==Z80_Trap) Z80_Trace=1;
2452   if (Z80_Trace) Z80_Debug(&R);
2453   if (!Z80_Running) break;
2454 #endif
2455   ++R.R;
2456   opcode=M_RDOP(R.PC.D);
2457   R.PC.W.l++;
2458   Z80_ICount-=cycles_main[opcode];
2459   (*(opcode_main[opcode]))();
2460  }
2461  while (Z80_ICount>0);
2462  Z80_ICount+=Z80_IPeriod;
2463  Interrupt (Z80_Interrupt());
2464  return Z80_Running;
2465 }
2466 
2467 /****************************************************************************/
2468 /* Interpret Z80 code                                                       */
2469 /****************************************************************************/
Z80(void)2470 word Z80 (void)
2471 {
2472  while (Z80_Execute());
2473  return(R.PC.W.l);
2474 }
2475 
2476 /****************************************************************************/
2477 /* Dump register contents and (optionally) a PC trace to stdout             */
2478 /****************************************************************************/
Z80_RegisterDump(void)2479 void Z80_RegisterDump (void)
2480 {
2481  int i;
2482  printf
2483  (
2484    "AF:%04X HL:%04X DE:%04X BC:%04X PC:%04X SP:%04X IX:%04X IY:%04X\n",
2485    R.AF.W.l,R.HL.W.l,R.DE.W.l,R.BC.W.l,R.PC.W.l,R.SP.W.l,R.IX.W.l,R.IY.W.l
2486  );
2487  printf ("STACK: ");
2488  for (i=0;i<10;++i) printf ("%04X ",M_RDMEM_WORD((R.SP.D+i*2)&0xFFFF));
2489  puts ("");
2490 #ifdef TRACE
2491  puts ("PC TRACE:");
2492  for (i=1;i<=256;++i) printf ("%04X\n",pc_trace[(pc_count-i)&255]);
2493 #endif
2494 }
2495 
2496 /****************************************************************************/
2497 /* Set number of memory refresh wait states (i.e. extra cycles inserted     */
2498 /* when the refresh register is being incremented)                          */
2499 /****************************************************************************/
Z80_SetWaitStates(int n)2500 void Z80_SetWaitStates (int n)
2501 {
2502  int i;
2503  for (i=0;i<256;++i)
2504  {
2505   cycles_main[i]+=n;
2506   cycles_cb[i]+=n;
2507   cycles_ed[i]+=n;
2508   cycles_xx[i]+=n;
2509  }
2510 }
2511