1 /**********************************************************
2 * IY register related opcodes (FD prefix)
3 **********************************************************/
4 OP(fd,00) { illegal_1(); op_00(); } /* DB FD */
5 OP(fd,01) { illegal_1(); op_01(); } /* DB FD */
6 OP(fd,02) { illegal_1(); op_02(); } /* DB FD */
7 OP(fd,03) { illegal_1(); op_03(); } /* DB FD */
8 OP(fd,04) { illegal_1(); op_04(); } /* DB FD */
9 OP(fd,05) { illegal_1(); op_05(); } /* DB FD */
10 OP(fd,06) { illegal_1(); op_06(); } /* DB FD */
11 OP(fd,07) { illegal_1(); op_07(); } /* DB FD */
12
13 OP(fd,08) { illegal_1(); op_08(); } /* DB FD */
14 OP(fd,09) { _R++; ADD16(IY,BC); } /* ADD IY,BC */
15 OP(fd,0a) { illegal_1(); op_0a(); } /* DB FD */
16 OP(fd,0b) { illegal_1(); op_0b(); } /* DB FD */
17 OP(fd,0c) { illegal_1(); op_0c(); } /* DB FD */
18 OP(fd,0d) { illegal_1(); op_0d(); } /* DB FD */
19 OP(fd,0e) { illegal_1(); op_0e(); } /* DB FD */
20 OP(fd,0f) { illegal_1(); op_0f(); } /* DB FD */
21
22 OP(fd,10) { illegal_1(); op_10(); } /* DB FD */
23 OP(fd,11) { illegal_1(); op_11(); } /* DB FD */
24 OP(fd,12) { illegal_1(); op_12(); } /* DB FD */
25 OP(fd,13) { illegal_1(); op_13(); } /* DB FD */
26 OP(fd,14) { illegal_1(); op_14(); } /* DB FD */
27 OP(fd,15) { illegal_1(); op_15(); } /* DB FD */
28 OP(fd,16) { illegal_1(); op_16(); } /* DB FD */
29 OP(fd,17) { illegal_1(); op_17(); } /* DB FD */
30
31 OP(fd,18) { illegal_1(); op_18(); } /* DB FD */
32 OP(fd,19) { _R++; ADD16(IY,DE); } /* ADD IY,DE */
33 OP(fd,1a) { illegal_1(); op_1a(); } /* DB FD */
34 OP(fd,1b) { illegal_1(); op_1b(); } /* DB FD */
35 OP(fd,1c) { illegal_1(); op_1c(); } /* DB FD */
36 OP(fd,1d) { illegal_1(); op_1d(); } /* DB FD */
37 OP(fd,1e) { illegal_1(); op_1e(); } /* DB FD */
38 OP(fd,1f) { illegal_1(); op_1f(); } /* DB FD */
39
40 OP(fd,20) { illegal_1(); op_20(); } /* DB FD */
41 OP(fd,21) { _R++; _IY = ARG16(); } /* LD IY,w */
42 OP(fd,22) { _R++; EA = ARG16(); WM16( EA, &Z180.IY ); } /* LD (w),IY */
43 OP(fd,23) { _R++; _IY++; } /* INC IY */
44 OP(fd,24) { _R++; _HY = INC(_HY); } /* INC HY */
45 OP(fd,25) { _R++; _HY = DEC(_HY); } /* DEC HY */
46 OP(fd,26) { _R++; _HY = ARG(); } /* LD HY,n */
47 OP(fd,27) { illegal_1(); op_27(); } /* DB FD */
48
49 OP(fd,28) { illegal_1(); op_28(); } /* DB FD */
50 OP(fd,29) { _R++; ADD16(IY,IY); } /* ADD IY,IY */
51 OP(fd,2a) { _R++; EA = ARG16(); RM16( EA, &Z180.IY ); } /* LD IY,(w) */
52 OP(fd,2b) { _R++; _IY--; } /* DEC IY */
53 OP(fd,2c) { _R++; _LY = INC(_LY); } /* INC LY */
54 OP(fd,2d) { _R++; _LY = DEC(_LY); } /* DEC LY */
55 OP(fd,2e) { _R++; _LY = ARG(); } /* LD LY,n */
56 OP(fd,2f) { illegal_1(); op_2f(); } /* DB FD */
57
58 OP(fd,30) { illegal_1(); op_30(); } /* DB FD */
59 OP(fd,31) { illegal_1(); op_31(); } /* DB FD */
60 OP(fd,32) { illegal_1(); op_32(); } /* DB FD */
61 OP(fd,33) { illegal_1(); op_33(); } /* DB FD */
62 OP(fd,34) { _R++; EAY; WM( EA, INC(RM(EA)) ); } /* INC (IY+o) */
63 OP(fd,35) { _R++; EAY; WM( EA, DEC(RM(EA)) ); } /* DEC (IY+o) */
64 OP(fd,36) { _R++; EAY; WM( EA, ARG() ); } /* LD (IY+o),n */
65 OP(fd,37) { illegal_1(); op_37(); } /* DB FD */
66
67 OP(fd,38) { illegal_1(); op_38(); } /* DB FD */
68 OP(fd,39) { _R++; ADD16(IY,SP); } /* ADD IY,SP */
69 OP(fd,3a) { illegal_1(); op_3a(); } /* DB FD */
70 OP(fd,3b) { illegal_1(); op_3b(); } /* DB FD */
71 OP(fd,3c) { illegal_1(); op_3c(); } /* DB FD */
72 OP(fd,3d) { illegal_1(); op_3d(); } /* DB FD */
73 OP(fd,3e) { illegal_1(); op_3e(); } /* DB FD */
74 OP(fd,3f) { illegal_1(); op_3f(); } /* DB FD */
75
76 OP(fd,40) { illegal_1(); op_40(); } /* DB FD */
77 OP(fd,41) { illegal_1(); op_41(); } /* DB FD */
78 OP(fd,42) { illegal_1(); op_42(); } /* DB FD */
79 OP(fd,43) { illegal_1(); op_43(); } /* DB FD */
80 OP(fd,44) { _R++; _B = _HY; } /* LD B,HY */
81 OP(fd,45) { _R++; _B = _LY; } /* LD B,LY */
82 OP(fd,46) { _R++; EAY; _B = RM(EA); } /* LD B,(IY+o) */
83 OP(fd,47) { illegal_1(); op_47(); } /* DB FD */
84
85 OP(fd,48) { illegal_1(); op_48(); } /* DB FD */
86 OP(fd,49) { illegal_1(); op_49(); } /* DB FD */
87 OP(fd,4a) { illegal_1(); op_4a(); } /* DB FD */
88 OP(fd,4b) { illegal_1(); op_4b(); } /* DB FD */
89 OP(fd,4c) { _R++; _C = _HY; } /* LD C,HY */
90 OP(fd,4d) { _R++; _C = _LY; } /* LD C,LY */
91 OP(fd,4e) { _R++; EAY; _C = RM(EA); } /* LD C,(IY+o) */
92 OP(fd,4f) { illegal_1(); op_4f(); } /* DB FD */
93
94 OP(fd,50) { illegal_1(); op_50(); } /* DB FD */
95 OP(fd,51) { illegal_1(); op_51(); } /* DB FD */
96 OP(fd,52) { illegal_1(); op_52(); } /* DB FD */
97 OP(fd,53) { illegal_1(); op_53(); } /* DB FD */
98 OP(fd,54) { _R++; _D = _HY; } /* LD D,HY */
99 OP(fd,55) { _R++; _D = _LY; } /* LD D,LY */
100 OP(fd,56) { _R++; EAY; _D = RM(EA); } /* LD D,(IY+o) */
101 OP(fd,57) { illegal_1(); op_57(); } /* DB FD */
102
103 OP(fd,58) { illegal_1(); op_58(); } /* DB FD */
104 OP(fd,59) { illegal_1(); op_59(); } /* DB FD */
105 OP(fd,5a) { illegal_1(); op_5a(); } /* DB FD */
106 OP(fd,5b) { illegal_1(); op_5b(); } /* DB FD */
107 OP(fd,5c) { _R++; _E = _HY; } /* LD E,HY */
108 OP(fd,5d) { _R++; _E = _LY; } /* LD E,LY */
109 OP(fd,5e) { _R++; EAY; _E = RM(EA); } /* LD E,(IY+o) */
110 OP(fd,5f) { illegal_1(); op_5f(); } /* DB FD */
111
112 OP(fd,60) { _R++; _HY = _B; } /* LD HY,B */
113 OP(fd,61) { _R++; _HY = _C; } /* LD HY,C */
114 OP(fd,62) { _R++; _HY = _D; } /* LD HY,D */
115 OP(fd,63) { _R++; _HY = _E; } /* LD HY,E */
116 OP(fd,64) { _R++; } /* LD HY,HY */
117 OP(fd,65) { _R++; _HY = _LY; } /* LD HY,LY */
118 OP(fd,66) { _R++; EAY; _H = RM(EA); } /* LD H,(IY+o) */
119 OP(fd,67) { _R++; _HY = _A; } /* LD HY,A */
120
121 OP(fd,68) { _R++; _LY = _B; } /* LD LY,B */
122 OP(fd,69) { _R++; _LY = _C; } /* LD LY,C */
123 OP(fd,6a) { _R++; _LY = _D; } /* LD LY,D */
124 OP(fd,6b) { _R++; _LY = _E; } /* LD LY,E */
125 OP(fd,6c) { _R++; _LY = _HY; } /* LD LY,HY */
126 OP(fd,6d) { _R++; } /* LD LY,LY */
127 OP(fd,6e) { _R++; EAY; _L = RM(EA); } /* LD L,(IY+o) */
128 OP(fd,6f) { _R++; _LY = _A; } /* LD LY,A */
129
130 OP(fd,70) { _R++; EAY; WM( EA, _B ); } /* LD (IY+o),B */
131 OP(fd,71) { _R++; EAY; WM( EA, _C ); } /* LD (IY+o),C */
132 OP(fd,72) { _R++; EAY; WM( EA, _D ); } /* LD (IY+o),D */
133 OP(fd,73) { _R++; EAY; WM( EA, _E ); } /* LD (IY+o),E */
134 OP(fd,74) { _R++; EAY; WM( EA, _H ); } /* LD (IY+o),H */
135 OP(fd,75) { _R++; EAY; WM( EA, _L ); } /* LD (IY+o),L */
136 OP(fd,76) { illegal_1(); op_76(); } /* DB FD */
137 OP(fd,77) { _R++; EAY; WM( EA, _A ); } /* LD (IY+o),A */
138
139 OP(fd,78) { illegal_1(); op_78(); } /* DB FD */
140 OP(fd,79) { illegal_1(); op_79(); } /* DB FD */
141 OP(fd,7a) { illegal_1(); op_7a(); } /* DB FD */
142 OP(fd,7b) { illegal_1(); op_7b(); } /* DB FD */
143 OP(fd,7c) { _R++; _A = _HY; } /* LD A,HY */
144 OP(fd,7d) { _R++; _A = _LY; } /* LD A,LY */
145 OP(fd,7e) { _R++; EAY; _A = RM(EA); } /* LD A,(IY+o) */
146 OP(fd,7f) { illegal_1(); op_7f(); } /* DB FD */
147
148 OP(fd,80) { illegal_1(); op_80(); } /* DB FD */
149 OP(fd,81) { illegal_1(); op_81(); } /* DB FD */
150 OP(fd,82) { illegal_1(); op_82(); } /* DB FD */
151 OP(fd,83) { illegal_1(); op_83(); } /* DB FD */
152 OP(fd,84) { _R++; ADD(_HY); } /* ADD A,HY */
153 OP(fd,85) { _R++; ADD(_LY); } /* ADD A,LY */
154 OP(fd,86) { _R++; EAY; ADD(RM(EA)); } /* ADD A,(IY+o) */
155 OP(fd,87) { illegal_1(); op_87(); } /* DB FD */
156
157 OP(fd,88) { illegal_1(); op_88(); } /* DB FD */
158 OP(fd,89) { illegal_1(); op_89(); } /* DB FD */
159 OP(fd,8a) { illegal_1(); op_8a(); } /* DB FD */
160 OP(fd,8b) { illegal_1(); op_8b(); } /* DB FD */
161 OP(fd,8c) { _R++; ADC(_HY); } /* ADC A,HY */
162 OP(fd,8d) { _R++; ADC(_LY); } /* ADC A,LY */
163 OP(fd,8e) { _R++; EAY; ADC(RM(EA)); } /* ADC A,(IY+o) */
164 OP(fd,8f) { illegal_1(); op_8f(); } /* DB FD */
165
166 OP(fd,90) { illegal_1(); op_90(); } /* DB FD */
167 OP(fd,91) { illegal_1(); op_91(); } /* DB FD */
168 OP(fd,92) { illegal_1(); op_92(); } /* DB FD */
169 OP(fd,93) { illegal_1(); op_93(); } /* DB FD */
170 OP(fd,94) { _R++; SUB(_HY); } /* SUB HY */
171 OP(fd,95) { _R++; SUB(_LY); } /* SUB LY */
172 OP(fd,96) { _R++; EAY; SUB(RM(EA)); } /* SUB (IY+o) */
173 OP(fd,97) { illegal_1(); op_97(); } /* DB FD */
174
175 OP(fd,98) { illegal_1(); op_98(); } /* DB FD */
176 OP(fd,99) { illegal_1(); op_99(); } /* DB FD */
177 OP(fd,9a) { illegal_1(); op_9a(); } /* DB FD */
178 OP(fd,9b) { illegal_1(); op_9b(); } /* DB FD */
179 OP(fd,9c) { _R++; SBC(_HY); } /* SBC A,HY */
180 OP(fd,9d) { _R++; SBC(_LY); } /* SBC A,LY */
181 OP(fd,9e) { _R++; EAY; SBC(RM(EA)); } /* SBC A,(IY+o) */
182 OP(fd,9f) { illegal_1(); op_9f(); } /* DB FD */
183
OP(fd,a0)184 OP(fd,a0) { illegal_1(); op_a0(); } /* DB FD */
OP(fd,a1)185 OP(fd,a1) { illegal_1(); op_a1(); } /* DB FD */
OP(fd,a2)186 OP(fd,a2) { illegal_1(); op_a2(); } /* DB FD */
OP(fd,a3)187 OP(fd,a3) { illegal_1(); op_a3(); } /* DB FD */
OP(fd,a4)188 OP(fd,a4) { _R++; AND(_HY); } /* AND HY */
OP(fd,a5)189 OP(fd,a5) { _R++; AND(_LY); } /* AND LY */
OP(fd,a6)190 OP(fd,a6) { _R++; EAY; AND(RM(EA)); } /* AND (IY+o) */
OP(fd,a7)191 OP(fd,a7) { illegal_1(); op_a7(); } /* DB FD */
192
OP(fd,a8)193 OP(fd,a8) { illegal_1(); op_a8(); } /* DB FD */
OP(fd,a9)194 OP(fd,a9) { illegal_1(); op_a9(); } /* DB FD */
OP(fd,aa)195 OP(fd,aa) { illegal_1(); op_aa(); } /* DB FD */
OP(fd,ab)196 OP(fd,ab) { illegal_1(); op_ab(); } /* DB FD */
OP(fd,ac)197 OP(fd,ac) { _R++; XOR(_HY); } /* XOR HY */
OP(fd,ad)198 OP(fd,ad) { _R++; XOR(_LY); } /* XOR LY */
OP(fd,ae)199 OP(fd,ae) { _R++; EAY; XOR(RM(EA)); } /* XOR (IY+o) */
OP(fd,af)200 OP(fd,af) { illegal_1(); op_af(); } /* DB FD */
201
OP(fd,b0)202 OP(fd,b0) { illegal_1(); op_b0(); } /* DB FD */
OP(fd,b1)203 OP(fd,b1) { illegal_1(); op_b1(); } /* DB FD */
OP(fd,b2)204 OP(fd,b2) { illegal_1(); op_b2(); } /* DB FD */
OP(fd,b3)205 OP(fd,b3) { illegal_1(); op_b3(); } /* DB FD */
OP(fd,b4)206 OP(fd,b4) { _R++; OR(_HY); } /* OR HY */
OP(fd,b5)207 OP(fd,b5) { _R++; OR(_LY); } /* OR LY */
OP(fd,b6)208 OP(fd,b6) { _R++; EAY; OR(RM(EA)); } /* OR (IY+o) */
OP(fd,b7)209 OP(fd,b7) { illegal_1(); op_b7(); } /* DB FD */
210
OP(fd,b8)211 OP(fd,b8) { illegal_1(); op_b8(); } /* DB FD */
OP(fd,b9)212 OP(fd,b9) { illegal_1(); op_b9(); } /* DB FD */
OP(fd,ba)213 OP(fd,ba) { illegal_1(); op_ba(); } /* DB FD */
OP(fd,bb)214 OP(fd,bb) { illegal_1(); op_bb(); } /* DB FD */
OP(fd,bc)215 OP(fd,bc) { _R++; CP(_HY); } /* CP HY */
OP(fd,bd)216 OP(fd,bd) { _R++; CP(_LY); } /* CP LY */
OP(fd,be)217 OP(fd,be) { _R++; EAY; CP(RM(EA)); } /* CP (IY+o) */
OP(fd,bf)218 OP(fd,bf) { illegal_1(); op_bf(); } /* DB FD */
219
OP(fd,c0)220 OP(fd,c0) { illegal_1(); op_c0(); } /* DB FD */
OP(fd,c1)221 OP(fd,c1) { illegal_1(); op_c1(); } /* DB FD */
OP(fd,c2)222 OP(fd,c2) { illegal_1(); op_c2(); } /* DB FD */
OP(fd,c3)223 OP(fd,c3) { illegal_1(); op_c3(); } /* DB FD */
OP(fd,c4)224 OP(fd,c4) { illegal_1(); op_c4(); } /* DB FD */
OP(fd,c5)225 OP(fd,c5) { illegal_1(); op_c5(); } /* DB FD */
OP(fd,c6)226 OP(fd,c6) { illegal_1(); op_c6(); } /* DB FD */
OP(fd,c7)227 OP(fd,c7) { illegal_1(); op_c7(); } /* DB FD */
228
OP(fd,c8)229 OP(fd,c8) { illegal_1(); op_c8(); } /* DB FD */
OP(fd,c9)230 OP(fd,c9) { illegal_1(); op_c9(); } /* DB FD */
OP(fd,ca)231 OP(fd,ca) { illegal_1(); op_ca(); } /* DB FD */
OP(fd,cb)232 OP(fd,cb) { _R++; EAY; EXEC(xycb,ARG()); } /* ** FD CB xx */
OP(fd,cc)233 OP(fd,cc) { illegal_1(); op_cc(); } /* DB FD */
OP(fd,cd)234 OP(fd,cd) { illegal_1(); op_cd(); } /* DB FD */
OP(fd,ce)235 OP(fd,ce) { illegal_1(); op_ce(); } /* DB FD */
OP(fd,cf)236 OP(fd,cf) { illegal_1(); op_cf(); } /* DB FD */
237
OP(fd,d0)238 OP(fd,d0) { illegal_1(); op_d0(); } /* DB FD */
OP(fd,d1)239 OP(fd,d1) { illegal_1(); op_d1(); } /* DB FD */
OP(fd,d2)240 OP(fd,d2) { illegal_1(); op_d2(); } /* DB FD */
OP(fd,d3)241 OP(fd,d3) { illegal_1(); op_d3(); } /* DB FD */
OP(fd,d4)242 OP(fd,d4) { illegal_1(); op_d4(); } /* DB FD */
OP(fd,d5)243 OP(fd,d5) { illegal_1(); op_d5(); } /* DB FD */
OP(fd,d6)244 OP(fd,d6) { illegal_1(); op_d6(); } /* DB FD */
OP(fd,d7)245 OP(fd,d7) { illegal_1(); op_d7(); } /* DB FD */
246
OP(fd,d8)247 OP(fd,d8) { illegal_1(); op_d8(); } /* DB FD */
OP(fd,d9)248 OP(fd,d9) { illegal_1(); op_d9(); } /* DB FD */
OP(fd,da)249 OP(fd,da) { illegal_1(); op_da(); } /* DB FD */
OP(fd,db)250 OP(fd,db) { illegal_1(); op_db(); } /* DB FD */
OP(fd,dc)251 OP(fd,dc) { illegal_1(); op_dc(); } /* DB FD */
OP(fd,dd)252 OP(fd,dd) { illegal_1(); op_dd(); } /* DB FD */
OP(fd,de)253 OP(fd,de) { illegal_1(); op_de(); } /* DB FD */
OP(fd,df)254 OP(fd,df) { illegal_1(); op_df(); } /* DB FD */
255
OP(fd,e0)256 OP(fd,e0) { illegal_1(); op_e0(); } /* DB FD */
OP(fd,e1)257 OP(fd,e1) { _R++; POP(IY); } /* POP IY */
OP(fd,e2)258 OP(fd,e2) { illegal_1(); op_e2(); } /* DB FD */
OP(fd,e3)259 OP(fd,e3) { _R++; EXSP(IY); } /* EX (SP),IY */
OP(fd,e4)260 OP(fd,e4) { illegal_1(); op_e4(); } /* DB FD */
OP(fd,e5)261 OP(fd,e5) { _R++; PUSH( IY ); } /* PUSH IY */
OP(fd,e6)262 OP(fd,e6) { illegal_1(); op_e6(); } /* DB FD */
OP(fd,e7)263 OP(fd,e7) { illegal_1(); op_e7(); } /* DB FD */
264
OP(fd,e8)265 OP(fd,e8) { illegal_1(); op_e8(); } /* DB FD */
OP(fd,e9)266 OP(fd,e9) { _R++; _PC = _IY; } /* JP (IY) */
OP(fd,ea)267 OP(fd,ea) { illegal_1(); op_ea(); } /* DB FD */
OP(fd,eb)268 OP(fd,eb) { illegal_1(); op_eb(); } /* DB FD */
OP(fd,ec)269 OP(fd,ec) { illegal_1(); op_ec(); } /* DB FD */
OP(fd,ed)270 OP(fd,ed) { illegal_1(); op_ed(); } /* DB FD */
OP(fd,ee)271 OP(fd,ee) { illegal_1(); op_ee(); } /* DB FD */
OP(fd,ef)272 OP(fd,ef) { illegal_1(); op_ef(); } /* DB FD */
273
OP(fd,f0)274 OP(fd,f0) { illegal_1(); op_f0(); } /* DB FD */
OP(fd,f1)275 OP(fd,f1) { illegal_1(); op_f1(); } /* DB FD */
OP(fd,f2)276 OP(fd,f2) { illegal_1(); op_f2(); } /* DB FD */
OP(fd,f3)277 OP(fd,f3) { illegal_1(); op_f3(); } /* DB FD */
OP(fd,f4)278 OP(fd,f4) { illegal_1(); op_f4(); } /* DB FD */
OP(fd,f5)279 OP(fd,f5) { illegal_1(); op_f5(); } /* DB FD */
OP(fd,f6)280 OP(fd,f6) { illegal_1(); op_f6(); } /* DB FD */
OP(fd,f7)281 OP(fd,f7) { illegal_1(); op_f7(); } /* DB FD */
282
OP(fd,f8)283 OP(fd,f8) { illegal_1(); op_f8(); } /* DB FD */
OP(fd,f9)284 OP(fd,f9) { _R++; _SP = _IY; } /* LD SP,IY */
OP(fd,fa)285 OP(fd,fa) { illegal_1(); op_fa(); } /* DB FD */
OP(fd,fb)286 OP(fd,fb) { illegal_1(); op_fb(); } /* DB FD */
OP(fd,fc)287 OP(fd,fc) { illegal_1(); op_fc(); } /* DB FD */
OP(fd,fd)288 OP(fd,fd) { illegal_1(); op_fd(); } /* DB FD */
OP(fd,fe)289 OP(fd,fe) { illegal_1(); op_fe(); } /* DB FD */
OP(fd,ff)290 OP(fd,ff) { illegal_1(); op_ff(); } /* DB FD */
291
292