main
z80inst.c
1/*
2 Copyright 2013 Michael Pavone
3 This file is part of BlastEm.
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
5*/
6#include "z80inst.h"
7#include <string.h>
8#include <stdio.h>
9#include <stddef.h>
10
11#define NOP {Z80_NOP, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}
12#define USE_MAIN {Z80_USE_MAIN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}
13
14z80inst z80_tbl_a[256] = {
15 //0
16 NOP,
17 {Z80_LD, Z80_BC, Z80_IMMED, Z80_UNUSED, 0},
18 {Z80_LD, Z80_A, Z80_REG_INDIRECT | Z80_DIR, Z80_BC, 0},
19 {Z80_INC, Z80_BC, Z80_UNUSED, Z80_UNUSED, 0},
20 {Z80_INC, Z80_B, Z80_UNUSED, Z80_UNUSED, 0},
21 {Z80_DEC, Z80_B, Z80_UNUSED, Z80_UNUSED, 0},
22 {Z80_LD, Z80_B, Z80_IMMED, Z80_UNUSED, 0},
23 {Z80_RLC, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
24 {Z80_EX, Z80_AF, Z80_REG, Z80_AF, 0},
25 {Z80_ADD, Z80_HL, Z80_REG, Z80_BC, 0},
26 {Z80_LD, Z80_A, Z80_REG_INDIRECT, Z80_BC, 0},
27 {Z80_DEC, Z80_BC, Z80_UNUSED, Z80_UNUSED, 0},
28 {Z80_INC, Z80_C, Z80_UNUSED, Z80_UNUSED, 0},
29 {Z80_DEC, Z80_C, Z80_UNUSED, Z80_UNUSED, 0},
30 {Z80_LD, Z80_C, Z80_IMMED, Z80_UNUSED, 0},
31 {Z80_RRC, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
32 //1
33 {Z80_DJNZ, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0},
34 {Z80_LD, Z80_DE, Z80_IMMED, Z80_UNUSED, 0},
35 {Z80_LD, Z80_A, Z80_REG_INDIRECT | Z80_DIR, Z80_DE, 0},
36 {Z80_INC, Z80_DE, Z80_UNUSED, Z80_UNUSED, 0},
37 {Z80_INC, Z80_D, Z80_UNUSED, Z80_UNUSED, 0},
38 {Z80_DEC, Z80_D, Z80_UNUSED, Z80_UNUSED, 0},
39 {Z80_LD, Z80_D, Z80_IMMED, Z80_UNUSED, 0},
40 {Z80_RL, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
41 {Z80_JR, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0},
42 {Z80_ADD, Z80_HL, Z80_REG, Z80_DE, 0},
43 {Z80_LD, Z80_A, Z80_REG_INDIRECT, Z80_DE, 0},
44 {Z80_DEC, Z80_DE, Z80_UNUSED, Z80_UNUSED, 0},
45 {Z80_INC, Z80_E, Z80_UNUSED, Z80_UNUSED, 0},
46 {Z80_DEC, Z80_E, Z80_UNUSED, Z80_UNUSED, 0},
47 {Z80_LD, Z80_E, Z80_IMMED, Z80_UNUSED, 0},
48 {Z80_RR, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
49 //2
50 {Z80_JRCC, Z80_CC_NZ, Z80_IMMED, Z80_UNUSED, 0},
51 {Z80_LD, Z80_HL, Z80_IMMED, Z80_UNUSED, 0},
52 {Z80_LD, Z80_HL, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
53 {Z80_INC, Z80_HL, Z80_UNUSED, Z80_UNUSED, 0},
54 {Z80_INC, Z80_H, Z80_UNUSED, Z80_UNUSED, 0},
55 {Z80_DEC, Z80_H, Z80_UNUSED, Z80_UNUSED, 0},
56 {Z80_LD, Z80_H, Z80_IMMED, Z80_UNUSED, 0},
57 {Z80_DAA, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
58 {Z80_JRCC, Z80_CC_Z, Z80_IMMED, Z80_UNUSED, 0},
59 {Z80_ADD, Z80_HL, Z80_REG, Z80_HL, 0},
60 {Z80_LD, Z80_HL, Z80_IMMED_INDIRECT, Z80_IMMED, 0},
61 {Z80_DEC, Z80_HL, Z80_UNUSED, Z80_UNUSED, 0},
62 {Z80_INC, Z80_L, Z80_UNUSED, Z80_UNUSED, 0},
63 {Z80_DEC, Z80_L, Z80_UNUSED, Z80_UNUSED, 0},
64 {Z80_LD, Z80_L, Z80_IMMED, Z80_UNUSED, 0},
65 {Z80_CPL, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
66 //3
67 {Z80_JRCC, Z80_CC_NC, Z80_IMMED, Z80_UNUSED, 0},
68 {Z80_LD, Z80_SP, Z80_IMMED, Z80_UNUSED, 0},
69 {Z80_LD, Z80_A, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
70 {Z80_INC, Z80_SP, Z80_UNUSED, Z80_UNUSED, 0},
71 {Z80_INC, Z80_UNUSED, Z80_REG_INDIRECT, Z80_HL, 0},
72 {Z80_DEC, Z80_UNUSED, Z80_REG_INDIRECT, Z80_HL, 0},
73 {Z80_LD, Z80_USE_IMMED, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0},
74 {Z80_SCF, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
75 {Z80_JRCC, Z80_CC_C, Z80_IMMED, Z80_UNUSED, 0},
76 {Z80_ADD, Z80_HL, Z80_REG, Z80_SP, 0},
77 {Z80_LD, Z80_A, Z80_IMMED_INDIRECT, Z80_IMMED, 0},
78 {Z80_DEC, Z80_SP, Z80_UNUSED, Z80_UNUSED, 0},
79 {Z80_INC, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
80 {Z80_DEC, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
81 {Z80_LD, Z80_A, Z80_IMMED, Z80_UNUSED, 0},
82 {Z80_CCF, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
83 //4
84 {Z80_LD, Z80_B, Z80_REG, Z80_B, 0},
85 {Z80_LD, Z80_B, Z80_REG, Z80_C, 0},
86 {Z80_LD, Z80_B, Z80_REG, Z80_D, 0},
87 {Z80_LD, Z80_B, Z80_REG, Z80_E, 0},
88 {Z80_LD, Z80_B, Z80_REG, Z80_H, 0},
89 {Z80_LD, Z80_B, Z80_REG, Z80_L, 0},
90 {Z80_LD, Z80_B, Z80_REG_INDIRECT, Z80_HL, 0},
91 {Z80_LD, Z80_B, Z80_REG, Z80_A, 0},
92 {Z80_LD, Z80_C, Z80_REG, Z80_B, 0},
93 {Z80_LD, Z80_C, Z80_REG, Z80_C, 0},
94 {Z80_LD, Z80_C, Z80_REG, Z80_D, 0},
95 {Z80_LD, Z80_C, Z80_REG, Z80_E, 0},
96 {Z80_LD, Z80_C, Z80_REG, Z80_H, 0},
97 {Z80_LD, Z80_C, Z80_REG, Z80_L, 0},
98 {Z80_LD, Z80_C, Z80_REG_INDIRECT, Z80_HL, 0},
99 {Z80_LD, Z80_C, Z80_REG, Z80_A, 0},
100 //5
101 {Z80_LD, Z80_D, Z80_REG, Z80_B, 0},
102 {Z80_LD, Z80_D, Z80_REG, Z80_C, 0},
103 {Z80_LD, Z80_D, Z80_REG, Z80_D, 0},
104 {Z80_LD, Z80_D, Z80_REG, Z80_E, 0},
105 {Z80_LD, Z80_D, Z80_REG, Z80_H, 0},
106 {Z80_LD, Z80_D, Z80_REG, Z80_L, 0},
107 {Z80_LD, Z80_D, Z80_REG_INDIRECT, Z80_HL, 0},
108 {Z80_LD, Z80_D, Z80_REG, Z80_A, 0},
109 {Z80_LD, Z80_E, Z80_REG, Z80_B, 0},
110 {Z80_LD, Z80_E, Z80_REG, Z80_C, 0},
111 {Z80_LD, Z80_E, Z80_REG, Z80_D, 0},
112 {Z80_LD, Z80_E, Z80_REG, Z80_E, 0},
113 {Z80_LD, Z80_E, Z80_REG, Z80_H, 0},
114 {Z80_LD, Z80_E, Z80_REG, Z80_L, 0},
115 {Z80_LD, Z80_E, Z80_REG_INDIRECT, Z80_HL, 0},
116 {Z80_LD, Z80_E, Z80_REG, Z80_A, 0},
117 //6
118 {Z80_LD, Z80_H, Z80_REG, Z80_B, 0},
119 {Z80_LD, Z80_H, Z80_REG, Z80_C, 0},
120 {Z80_LD, Z80_H, Z80_REG, Z80_D, 0},
121 {Z80_LD, Z80_H, Z80_REG, Z80_E, 0},
122 {Z80_LD, Z80_H, Z80_REG, Z80_H, 0},
123 {Z80_LD, Z80_H, Z80_REG, Z80_L, 0},
124 {Z80_LD, Z80_H, Z80_REG_INDIRECT, Z80_HL, 0},
125 {Z80_LD, Z80_H, Z80_REG, Z80_A, 0},
126 {Z80_LD, Z80_L, Z80_REG, Z80_B, 0},
127 {Z80_LD, Z80_L, Z80_REG, Z80_C, 0},
128 {Z80_LD, Z80_L, Z80_REG, Z80_D, 0},
129 {Z80_LD, Z80_L, Z80_REG, Z80_E, 0},
130 {Z80_LD, Z80_L, Z80_REG, Z80_H, 0},
131 {Z80_LD, Z80_L, Z80_REG, Z80_L, 0},
132 {Z80_LD, Z80_L, Z80_REG_INDIRECT, Z80_HL, 0},
133 {Z80_LD, Z80_L, Z80_REG, Z80_A, 0},
134 //7
135 {Z80_LD, Z80_B, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0},
136 {Z80_LD, Z80_C, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0},
137 {Z80_LD, Z80_D, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0},
138 {Z80_LD, Z80_E, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0},
139 {Z80_LD, Z80_H, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0},
140 {Z80_LD, Z80_L, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0},
141 {Z80_HALT, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
142 {Z80_LD, Z80_A, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0},
143 {Z80_LD, Z80_A, Z80_REG, Z80_B, 0},
144 {Z80_LD, Z80_A, Z80_REG, Z80_C, 0},
145 {Z80_LD, Z80_A, Z80_REG, Z80_D, 0},
146 {Z80_LD, Z80_A, Z80_REG, Z80_E, 0},
147 {Z80_LD, Z80_A, Z80_REG, Z80_H, 0},
148 {Z80_LD, Z80_A, Z80_REG, Z80_L, 0},
149 {Z80_LD, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0},
150 {Z80_LD, Z80_A, Z80_REG, Z80_A, 0},
151 //8
152 {Z80_ADD, Z80_A, Z80_REG, Z80_B, 0},
153 {Z80_ADD, Z80_A, Z80_REG, Z80_C, 0},
154 {Z80_ADD, Z80_A, Z80_REG, Z80_D, 0},
155 {Z80_ADD, Z80_A, Z80_REG, Z80_E, 0},
156 {Z80_ADD, Z80_A, Z80_REG, Z80_H, 0},
157 {Z80_ADD, Z80_A, Z80_REG, Z80_L, 0},
158 {Z80_ADD, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0},
159 {Z80_ADD, Z80_A, Z80_REG, Z80_A, 0},
160 {Z80_ADC, Z80_A, Z80_REG, Z80_B, 0},
161 {Z80_ADC, Z80_A, Z80_REG, Z80_C, 0},
162 {Z80_ADC, Z80_A, Z80_REG, Z80_D, 0},
163 {Z80_ADC, Z80_A, Z80_REG, Z80_E, 0},
164 {Z80_ADC, Z80_A, Z80_REG, Z80_H, 0},
165 {Z80_ADC, Z80_A, Z80_REG, Z80_L, 0},
166 {Z80_ADC, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0},
167 {Z80_ADC, Z80_A, Z80_REG, Z80_A, 0},
168 //9
169 {Z80_SUB, Z80_A, Z80_REG, Z80_B, 0},
170 {Z80_SUB, Z80_A, Z80_REG, Z80_C, 0},
171 {Z80_SUB, Z80_A, Z80_REG, Z80_D, 0},
172 {Z80_SUB, Z80_A, Z80_REG, Z80_E, 0},
173 {Z80_SUB, Z80_A, Z80_REG, Z80_H, 0},
174 {Z80_SUB, Z80_A, Z80_REG, Z80_L, 0},
175 {Z80_SUB, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0},
176 {Z80_SUB, Z80_A, Z80_REG, Z80_A, 0},
177 {Z80_SBC, Z80_A, Z80_REG, Z80_B, 0},
178 {Z80_SBC, Z80_A, Z80_REG, Z80_C, 0},
179 {Z80_SBC, Z80_A, Z80_REG, Z80_D, 0},
180 {Z80_SBC, Z80_A, Z80_REG, Z80_E, 0},
181 {Z80_SBC, Z80_A, Z80_REG, Z80_H, 0},
182 {Z80_SBC, Z80_A, Z80_REG, Z80_L, 0},
183 {Z80_SBC, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0},
184 {Z80_SBC, Z80_A, Z80_REG, Z80_A, 0},
185 //A
186 {Z80_AND, Z80_A, Z80_REG, Z80_B, 0},
187 {Z80_AND, Z80_A, Z80_REG, Z80_C, 0},
188 {Z80_AND, Z80_A, Z80_REG, Z80_D, 0},
189 {Z80_AND, Z80_A, Z80_REG, Z80_E, 0},
190 {Z80_AND, Z80_A, Z80_REG, Z80_H, 0},
191 {Z80_AND, Z80_A, Z80_REG, Z80_L, 0},
192 {Z80_AND, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0},
193 {Z80_AND, Z80_A, Z80_REG, Z80_A, 0},
194 {Z80_XOR, Z80_A, Z80_REG, Z80_B, 0},
195 {Z80_XOR, Z80_A, Z80_REG, Z80_C, 0},
196 {Z80_XOR, Z80_A, Z80_REG, Z80_D, 0},
197 {Z80_XOR, Z80_A, Z80_REG, Z80_E, 0},
198 {Z80_XOR, Z80_A, Z80_REG, Z80_H, 0},
199 {Z80_XOR, Z80_A, Z80_REG, Z80_L, 0},
200 {Z80_XOR, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0},
201 {Z80_XOR, Z80_A, Z80_REG, Z80_A, 0},
202 //B
203 {Z80_OR, Z80_A, Z80_REG, Z80_B, 0},
204 {Z80_OR, Z80_A, Z80_REG, Z80_C, 0},
205 {Z80_OR, Z80_A, Z80_REG, Z80_D, 0},
206 {Z80_OR, Z80_A, Z80_REG, Z80_E, 0},
207 {Z80_OR, Z80_A, Z80_REG, Z80_H, 0},
208 {Z80_OR, Z80_A, Z80_REG, Z80_L, 0},
209 {Z80_OR, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0},
210 {Z80_OR, Z80_A, Z80_REG, Z80_A, 0},
211 {Z80_CP, Z80_A, Z80_REG, Z80_B, 0},
212 {Z80_CP, Z80_A, Z80_REG, Z80_C, 0},
213 {Z80_CP, Z80_A, Z80_REG, Z80_D, 0},
214 {Z80_CP, Z80_A, Z80_REG, Z80_E, 0},
215 {Z80_CP, Z80_A, Z80_REG, Z80_H, 0},
216 {Z80_CP, Z80_A, Z80_REG, Z80_L, 0},
217 {Z80_CP, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0},
218 {Z80_CP, Z80_A, Z80_REG, Z80_A, 0},
219 //C
220 {Z80_RETCC, Z80_CC_NZ, Z80_UNUSED, Z80_UNUSED, 0},
221 {Z80_POP, Z80_BC, Z80_UNUSED, Z80_UNUSED, 0},
222 {Z80_JPCC, Z80_CC_NZ, Z80_IMMED, Z80_UNUSED, 0},
223 {Z80_JP, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0},
224 {Z80_CALLCC, Z80_CC_NZ, Z80_IMMED, Z80_UNUSED, 0},
225 {Z80_PUSH, Z80_BC, Z80_UNUSED, Z80_UNUSED, 0},
226 {Z80_ADD, Z80_A, Z80_IMMED, Z80_UNUSED, 0},
227 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x0},
228 {Z80_RETCC, Z80_CC_Z, Z80_UNUSED, Z80_UNUSED, 0},
229 {Z80_RET, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
230 {Z80_JPCC, Z80_CC_Z, Z80_IMMED, Z80_UNUSED, 0},
231 {0, 0, 0, 0, 0},//BITS Prefix
232 {Z80_CALLCC, Z80_CC_Z, Z80_IMMED, Z80_UNUSED, 0},
233 {Z80_CALL, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0},
234 {Z80_ADC, Z80_A, Z80_IMMED, Z80_UNUSED, 0},
235 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x8},
236 //D
237 {Z80_RETCC, Z80_CC_NC, Z80_UNUSED, Z80_UNUSED, 0},
238 {Z80_POP, Z80_DE, Z80_UNUSED, Z80_UNUSED, 0},
239 {Z80_JPCC, Z80_CC_NC, Z80_IMMED, Z80_UNUSED, 0},
240 {Z80_OUT, Z80_A, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
241 {Z80_CALLCC, Z80_CC_NC, Z80_IMMED, Z80_UNUSED, 0},
242 {Z80_PUSH, Z80_DE, Z80_UNUSED, Z80_UNUSED, 0},
243 {Z80_SUB, Z80_A, Z80_IMMED, Z80_UNUSED, 0},
244 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x10},
245 {Z80_RETCC, Z80_CC_C, Z80_UNUSED, Z80_UNUSED, 0},
246 {Z80_EXX, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
247 {Z80_JPCC, Z80_CC_C, Z80_IMMED, Z80_UNUSED, 0},
248 {Z80_IN, Z80_A, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
249 {Z80_CALLCC, Z80_CC_C, Z80_IMMED, Z80_UNUSED, 0},
250 {0, 0, 0, 0, 0},//IX Prefix
251 {Z80_SBC, Z80_A, Z80_IMMED, Z80_UNUSED, 0},
252 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x18},
253 //E
254 {Z80_RETCC, Z80_CC_PO, Z80_UNUSED, Z80_UNUSED, 0},
255 {Z80_POP, Z80_HL, Z80_UNUSED, Z80_UNUSED, 0},
256 {Z80_JPCC, Z80_CC_PO, Z80_IMMED, Z80_UNUSED, 0},
257 {Z80_EX, Z80_HL, Z80_REG_INDIRECT | Z80_DIR, Z80_SP, 0},
258 {Z80_CALLCC, Z80_CC_PO, Z80_IMMED, Z80_UNUSED, 0},
259 {Z80_PUSH, Z80_HL, Z80_UNUSED, Z80_UNUSED, 0},
260 {Z80_AND, Z80_A, Z80_IMMED, Z80_UNUSED, 0},
261 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x20},
262 {Z80_RETCC, Z80_CC_PE, Z80_UNUSED, Z80_UNUSED, 0},
263 {Z80_JP, Z80_UNUSED, Z80_REG_INDIRECT, Z80_HL, 0},
264 {Z80_JPCC, Z80_CC_PE, Z80_IMMED, Z80_UNUSED, 0},
265 {Z80_EX, Z80_DE, Z80_REG, Z80_HL, 0},
266 {Z80_CALLCC, Z80_CC_PE, Z80_IMMED, Z80_UNUSED, 0},
267 {0, 0, 0, 0, 0},//EXTD Prefix
268 {Z80_XOR, Z80_A, Z80_IMMED, Z80_UNUSED, 0},
269 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x28},
270 //F
271 {Z80_RETCC, Z80_CC_P, Z80_UNUSED, Z80_UNUSED, 0},
272 {Z80_POP, Z80_AF, Z80_UNUSED, Z80_UNUSED, 0},
273 {Z80_JPCC, Z80_CC_P, Z80_IMMED, Z80_UNUSED, 0},
274 {Z80_DI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
275 {Z80_CALLCC, Z80_CC_P, Z80_IMMED, Z80_UNUSED, 0},
276 {Z80_PUSH, Z80_AF, Z80_UNUSED, Z80_UNUSED, 0},
277 {Z80_OR, Z80_A, Z80_IMMED, Z80_UNUSED, 0},
278 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x30},
279 {Z80_RETCC, Z80_CC_M, Z80_UNUSED, Z80_UNUSED, 0},
280 {Z80_LD, Z80_SP, Z80_REG, Z80_HL, 0},
281 {Z80_JPCC, Z80_CC_M, Z80_IMMED, Z80_UNUSED, 0},
282 {Z80_EI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
283 {Z80_CALLCC, Z80_CC_M, Z80_IMMED, Z80_UNUSED, 0},
284 {0, 0, 0, 0, 0},//IY Prefix
285 {Z80_CP, Z80_A, Z80_IMMED, Z80_UNUSED, 0},
286 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x38}
287};
288
289z80inst z80_tbl_extd[0xC0-0x40] = {
290 //4
291 {Z80_IN, Z80_B, Z80_REG_INDIRECT, Z80_C, 0},
292 {Z80_OUT, Z80_B, Z80_REG_INDIRECT | Z80_DIR, Z80_C, 0},
293 {Z80_SBC, Z80_HL, Z80_REG, Z80_BC, 0},
294 {Z80_LD, Z80_BC, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
295 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
296 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
297 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0},
298 {Z80_LD, Z80_I, Z80_REG, Z80_A, 0},
299 {Z80_IN, Z80_C, Z80_REG_INDIRECT, Z80_C, 0},
300 {Z80_OUT, Z80_C, Z80_REG_INDIRECT | Z80_DIR, Z80_C, 0},
301 {Z80_ADC, Z80_HL, Z80_REG, Z80_BC, 0},
302 {Z80_LD, Z80_BC, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
303 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
304 {Z80_RETI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
305 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 3},//Set undocumented mode 0/1
306 {Z80_LD, Z80_R, Z80_REG, Z80_A, 0},
307 //5
308 {Z80_IN, Z80_D, Z80_REG_INDIRECT, Z80_C, 0},
309 {Z80_OUT, Z80_D, Z80_REG_INDIRECT | Z80_DIR, Z80_C, 0},
310 {Z80_SBC, Z80_HL, Z80_REG, Z80_DE, 0},
311 {Z80_LD, Z80_DE, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
312 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
313 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
314 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 1},
315 {Z80_LD, Z80_A, Z80_REG, Z80_I, 0},
316 {Z80_IN, Z80_E, Z80_REG_INDIRECT, Z80_C, 0},
317 {Z80_OUT, Z80_E, Z80_REG_INDIRECT | Z80_DIR, Z80_C, 0},
318 {Z80_ADC, Z80_HL, Z80_REG, Z80_DE, 0},
319 {Z80_LD, Z80_DE, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
320 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
321 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
322 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 2},
323 {Z80_LD, Z80_A, Z80_REG, Z80_R, 0},
324 //6
325 {Z80_IN, Z80_H, Z80_REG_INDIRECT, Z80_C, 0},
326 {Z80_OUT, Z80_H, Z80_REG_INDIRECT | Z80_DIR, Z80_C, 0},
327 {Z80_SBC, Z80_HL, Z80_REG, Z80_HL, 0},
328 {Z80_LD, Z80_HL, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
329 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
330 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
331 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0},
332 {Z80_RRD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
333 {Z80_IN, Z80_L, Z80_REG_INDIRECT, Z80_C, 0},
334 {Z80_OUT, Z80_L, Z80_REG_INDIRECT | Z80_DIR, Z80_C, 0},
335 {Z80_ADC, Z80_HL, Z80_REG, Z80_HL, 0},
336 {Z80_LD, Z80_HL, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
337 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
338 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
339 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 3},//Set undocumented mode 0/1
340 {Z80_RLD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
341 //7
342 {Z80_IN, Z80_UNUSED, Z80_REG_INDIRECT, Z80_C, 0},
343 {Z80_OUT, Z80_USE_IMMED, Z80_REG_INDIRECT | Z80_DIR, Z80_C, 0},
344 {Z80_SBC, Z80_HL, Z80_REG, Z80_SP, 0},
345 {Z80_LD, Z80_SP, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
346 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
347 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
348 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 1},
349 NOP,
350 {Z80_IN, Z80_A, Z80_REG_INDIRECT, Z80_C, 0},
351 {Z80_OUT, Z80_A, Z80_REG_INDIRECT | Z80_DIR, Z80_C, 0},
352 {Z80_ADC, Z80_HL, Z80_REG, Z80_SP, 0},
353 {Z80_LD, Z80_SP, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
354 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
355 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
356 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 2},
357 NOP,
358 //8
359 NOP,
360 NOP,
361 NOP,
362 NOP,
363 NOP,
364 NOP,
365 NOP,
366 NOP,
367 NOP,
368 NOP,
369 NOP,
370 NOP,
371 NOP,
372 NOP,
373 NOP,
374 NOP,
375 //9
376 NOP,
377 NOP,
378 NOP,
379 NOP,
380 NOP,
381 NOP,
382 NOP,
383 NOP,
384 NOP,
385 NOP,
386 NOP,
387 NOP,
388 NOP,
389 NOP,
390 NOP,
391 NOP,
392 //A
393 {Z80_LDI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
394 {Z80_CPI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
395 {Z80_INI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
396 {Z80_OUTI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
397 NOP,
398 NOP,
399 NOP,
400 NOP,
401 {Z80_LDD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
402 {Z80_CPD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
403 {Z80_IND, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
404 {Z80_OUTD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
405 NOP,
406 NOP,
407 NOP,
408 NOP,
409 //B
410 {Z80_LDIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
411 {Z80_CPIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
412 {Z80_INIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
413 {Z80_OTIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
414 NOP,
415 NOP,
416 NOP,
417 NOP,
418 {Z80_LDDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
419 {Z80_CPDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
420 {Z80_INDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
421 {Z80_OTDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
422 NOP,
423 NOP,
424 NOP,
425 NOP
426};
427
428#define SHIFT_BLOCK(op) \
429 {op, Z80_B, Z80_UNUSED, Z80_UNUSED, 1},\
430 {op, Z80_C, Z80_UNUSED, Z80_UNUSED, 1},\
431 {op, Z80_D, Z80_UNUSED, Z80_UNUSED, 1},\
432 {op, Z80_E, Z80_UNUSED, Z80_UNUSED, 1},\
433 {op, Z80_H, Z80_UNUSED, Z80_UNUSED, 1},\
434 {op, Z80_L, Z80_UNUSED, Z80_UNUSED, 1},\
435 {op, Z80_UNUSED, Z80_REG_INDIRECT, Z80_HL, 1},\
436 {op, Z80_A, Z80_UNUSED, Z80_UNUSED, 1}
437
438#define BIT_BLOCK(op, bit) \
439 {op, Z80_USE_IMMED, Z80_REG, Z80_B, bit},\
440 {op, Z80_USE_IMMED, Z80_REG, Z80_C, bit},\
441 {op, Z80_USE_IMMED, Z80_REG, Z80_D, bit},\
442 {op, Z80_USE_IMMED, Z80_REG, Z80_E, bit},\
443 {op, Z80_USE_IMMED, Z80_REG, Z80_H, bit},\
444 {op, Z80_USE_IMMED, Z80_REG, Z80_L, bit},\
445 {op, Z80_USE_IMMED, Z80_REG_INDIRECT, Z80_HL, bit},\
446 {op, Z80_USE_IMMED, Z80_REG, Z80_A, bit}
447
448z80inst z80_tbl_bit[256] = {
449 //0
450 SHIFT_BLOCK(Z80_RLC),
451 SHIFT_BLOCK(Z80_RRC),
452 //1
453 SHIFT_BLOCK(Z80_RL),
454 SHIFT_BLOCK(Z80_RR),
455 //2
456 SHIFT_BLOCK(Z80_SLA),
457 SHIFT_BLOCK(Z80_SRA),
458 //3
459 SHIFT_BLOCK(Z80_SLL),
460 SHIFT_BLOCK(Z80_SRL),
461 //4
462 BIT_BLOCK(Z80_BIT, 0),
463 BIT_BLOCK(Z80_BIT, 1),
464 //5
465 BIT_BLOCK(Z80_BIT, 2),
466 BIT_BLOCK(Z80_BIT, 3),
467 //6
468 BIT_BLOCK(Z80_BIT, 4),
469 BIT_BLOCK(Z80_BIT, 5),
470 //7
471 BIT_BLOCK(Z80_BIT, 6),
472 BIT_BLOCK(Z80_BIT, 7),
473 //8
474 BIT_BLOCK(Z80_RES, 0),
475 BIT_BLOCK(Z80_RES, 1),
476 //9
477 BIT_BLOCK(Z80_RES, 2),
478 BIT_BLOCK(Z80_RES, 3),
479 //A
480 BIT_BLOCK(Z80_RES, 4),
481 BIT_BLOCK(Z80_RES, 5),
482 //B
483 BIT_BLOCK(Z80_RES, 6),
484 BIT_BLOCK(Z80_RES, 7),
485 //C
486 BIT_BLOCK(Z80_SET, 0),
487 BIT_BLOCK(Z80_SET, 1),
488 //D
489 BIT_BLOCK(Z80_SET, 2),
490 BIT_BLOCK(Z80_SET, 3),
491 //E
492 BIT_BLOCK(Z80_SET, 4),
493 BIT_BLOCK(Z80_SET, 5),
494 //F
495 BIT_BLOCK(Z80_SET, 6),
496 BIT_BLOCK(Z80_SET, 7)
497};
498
499z80inst z80_tbl_ix[256] = {
500 //0
501 USE_MAIN,
502 USE_MAIN,
503 USE_MAIN,
504 USE_MAIN,
505 USE_MAIN,
506 USE_MAIN,
507 USE_MAIN,
508 USE_MAIN,
509 USE_MAIN,
510 {Z80_ADD, Z80_IX, Z80_REG, Z80_BC, 0},
511 USE_MAIN,
512 USE_MAIN,
513 USE_MAIN,
514 USE_MAIN,
515 USE_MAIN,
516 USE_MAIN,
517 //1
518 USE_MAIN,
519 USE_MAIN,
520 USE_MAIN,
521 USE_MAIN,
522 USE_MAIN,
523 USE_MAIN,
524 USE_MAIN,
525 USE_MAIN,
526 USE_MAIN,
527 {Z80_ADD, Z80_IX, Z80_REG, Z80_DE, 0},
528 USE_MAIN,
529 USE_MAIN,
530 USE_MAIN,
531 USE_MAIN,
532 USE_MAIN,
533 USE_MAIN,
534 //2
535 USE_MAIN,
536 {Z80_LD, Z80_IX, Z80_IMMED, Z80_UNUSED, 0},
537 {Z80_LD, Z80_IX, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
538 {Z80_INC, Z80_IX, Z80_UNUSED, Z80_UNUSED, 0},
539 {Z80_INC, Z80_IXH, Z80_UNUSED, Z80_UNUSED, 0},
540 {Z80_DEC, Z80_IXH, Z80_UNUSED, Z80_UNUSED, 0},
541 {Z80_LD, Z80_IXH, Z80_IMMED, Z80_UNUSED, 0},
542 USE_MAIN,
543 USE_MAIN,
544 {Z80_ADD, Z80_IX, Z80_REG, Z80_IX, 0},
545 {Z80_LD, Z80_IX, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
546 {Z80_DEC, Z80_IX, Z80_UNUSED, Z80_UNUSED, 0},
547 {Z80_INC, Z80_IXL, Z80_UNUSED, Z80_UNUSED, 0},
548 {Z80_DEC, Z80_IXL, Z80_UNUSED, Z80_UNUSED, 0},
549 {Z80_LD, Z80_IXL, Z80_IMMED, Z80_UNUSED, 0},
550 USE_MAIN,
551 //3
552 USE_MAIN,
553 USE_MAIN,
554 USE_MAIN,
555 USE_MAIN,
556 {Z80_INC, Z80_UNUSED, Z80_IX_DISPLACE, 0, 0},
557 {Z80_DEC, Z80_UNUSED, Z80_IX_DISPLACE, 0, 0},
558 {Z80_LD, Z80_USE_IMMED, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
559 USE_MAIN,
560 USE_MAIN,
561 {Z80_ADD, Z80_IX, Z80_REG, Z80_SP, 0},
562 USE_MAIN,
563 USE_MAIN,
564 USE_MAIN,
565 USE_MAIN,
566 USE_MAIN,
567 USE_MAIN,
568 //4
569 USE_MAIN,
570 USE_MAIN,
571 USE_MAIN,
572 USE_MAIN,
573 {Z80_LD, Z80_B, Z80_REG, Z80_IXH, 0},
574 {Z80_LD, Z80_B, Z80_REG, Z80_IXL, 0},
575 {Z80_LD, Z80_B, Z80_IX_DISPLACE, 0, 0},
576 USE_MAIN,
577 USE_MAIN,
578 USE_MAIN,
579 USE_MAIN,
580 USE_MAIN,
581 {Z80_LD, Z80_C, Z80_REG, Z80_IXH, 0},
582 {Z80_LD, Z80_C, Z80_REG, Z80_IXL, 0},
583 {Z80_LD, Z80_C, Z80_IX_DISPLACE, 0, 0},
584 USE_MAIN,
585 //5
586 USE_MAIN,
587 USE_MAIN,
588 USE_MAIN,
589 USE_MAIN,
590 {Z80_LD, Z80_D, Z80_REG, Z80_IXH, 0},
591 {Z80_LD, Z80_D, Z80_REG, Z80_IXL, 0},
592 {Z80_LD, Z80_D, Z80_IX_DISPLACE, 0, 0},
593 USE_MAIN,
594 USE_MAIN,
595 USE_MAIN,
596 USE_MAIN,
597 USE_MAIN,
598 {Z80_LD, Z80_E, Z80_REG, Z80_IXH, 0},
599 {Z80_LD, Z80_E, Z80_REG, Z80_IXL, 0},
600 {Z80_LD, Z80_E, Z80_IX_DISPLACE, 0, 0},
601 USE_MAIN,
602 //6
603 {Z80_LD, Z80_IXH, Z80_REG, Z80_B, 0},
604 {Z80_LD, Z80_IXH, Z80_REG, Z80_C, 0},
605 {Z80_LD, Z80_IXH, Z80_REG, Z80_D, 0},
606 {Z80_LD, Z80_IXH, Z80_REG, Z80_E, 0},
607 {Z80_LD, Z80_IXH, Z80_REG, Z80_IXH, 0},
608 {Z80_LD, Z80_IXH, Z80_REG, Z80_IXL, 0},
609 {Z80_LD, Z80_H, Z80_IX_DISPLACE, 0, 0},
610 {Z80_LD, Z80_IXH, Z80_REG, Z80_A, 0},
611 {Z80_LD, Z80_IXL, Z80_REG, Z80_B, 0},
612 {Z80_LD, Z80_IXL, Z80_REG, Z80_C, 0},
613 {Z80_LD, Z80_IXL, Z80_REG, Z80_D, 0},
614 {Z80_LD, Z80_IXL, Z80_REG, Z80_E, 0},
615 {Z80_LD, Z80_IXL, Z80_REG, Z80_IXH, 0},
616 {Z80_LD, Z80_IXL, Z80_REG, Z80_IXL, 0},
617 {Z80_LD, Z80_L, Z80_IX_DISPLACE, 0, 0},
618 {Z80_LD, Z80_IXL, Z80_REG, Z80_A, 0},
619 //7
620 {Z80_LD, Z80_B, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
621 {Z80_LD, Z80_C, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
622 {Z80_LD, Z80_D, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
623 {Z80_LD, Z80_E, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
624 {Z80_LD, Z80_H, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
625 {Z80_LD, Z80_L, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
626 USE_MAIN,
627 {Z80_LD, Z80_A, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
628 USE_MAIN,
629 USE_MAIN,
630 USE_MAIN,
631 USE_MAIN,
632 {Z80_LD, Z80_A, Z80_REG, Z80_IXH, 0},
633 {Z80_LD, Z80_A, Z80_REG, Z80_IXL, 0},
634 {Z80_LD, Z80_A, Z80_IX_DISPLACE, 0, 0},
635 USE_MAIN,
636 //8
637 USE_MAIN,
638 USE_MAIN,
639 USE_MAIN,
640 USE_MAIN,
641 {Z80_ADD, Z80_A, Z80_REG, Z80_IXH, 0},
642 {Z80_ADD, Z80_A, Z80_REG, Z80_IXL, 0},
643 {Z80_ADD, Z80_A, Z80_IX_DISPLACE, 0, 0},
644 USE_MAIN,
645 USE_MAIN,
646 USE_MAIN,
647 USE_MAIN,
648 USE_MAIN,
649 {Z80_ADC, Z80_A, Z80_REG, Z80_IXH, 0},
650 {Z80_ADC, Z80_A, Z80_REG, Z80_IXL, 0},
651 {Z80_ADC, Z80_A, Z80_IX_DISPLACE, 0, 0},
652 USE_MAIN,
653 //9
654 USE_MAIN,
655 USE_MAIN,
656 USE_MAIN,
657 USE_MAIN,
658 {Z80_SUB, Z80_A, Z80_REG, Z80_IXH, 0},
659 {Z80_SUB, Z80_A, Z80_REG, Z80_IXL, 0},
660 {Z80_SUB, Z80_A, Z80_IX_DISPLACE, 0, 0},
661 USE_MAIN,
662 USE_MAIN,
663 USE_MAIN,
664 USE_MAIN,
665 USE_MAIN,
666 {Z80_SBC, Z80_A, Z80_REG, Z80_IXH, 0},
667 {Z80_SBC, Z80_A, Z80_REG, Z80_IXL, 0},
668 {Z80_SBC, Z80_A, Z80_IX_DISPLACE, 0, 0},
669 USE_MAIN,
670 //A
671 USE_MAIN,
672 USE_MAIN,
673 USE_MAIN,
674 USE_MAIN,
675 {Z80_AND, Z80_A, Z80_REG, Z80_IXH, 0},
676 {Z80_AND, Z80_A, Z80_REG, Z80_IXL, 0},
677 {Z80_AND, Z80_A, Z80_IX_DISPLACE, 0, 0},
678 USE_MAIN,
679 USE_MAIN,
680 USE_MAIN,
681 USE_MAIN,
682 USE_MAIN,
683 {Z80_XOR, Z80_A, Z80_REG, Z80_IXH, 0},
684 {Z80_XOR, Z80_A, Z80_REG, Z80_IXL, 0},
685 {Z80_XOR, Z80_A, Z80_IX_DISPLACE, 0, 0},
686 USE_MAIN,
687 //B
688 USE_MAIN,
689 USE_MAIN,
690 USE_MAIN,
691 USE_MAIN,
692 {Z80_OR, Z80_A, Z80_REG, Z80_IXH, 0},
693 {Z80_OR, Z80_A, Z80_REG, Z80_IXL, 0},
694 {Z80_OR, Z80_A, Z80_IX_DISPLACE, 0, 0},
695 USE_MAIN,
696 USE_MAIN,
697 USE_MAIN,
698 USE_MAIN,
699 USE_MAIN,
700 {Z80_CP, Z80_A, Z80_REG, Z80_IXH, 0},
701 {Z80_CP, Z80_A, Z80_REG, Z80_IXL, 0},
702 {Z80_CP, Z80_A, Z80_IX_DISPLACE, 0, 0},
703 USE_MAIN,
704 //C
705 USE_MAIN,
706 USE_MAIN,
707 USE_MAIN,
708 USE_MAIN,
709 USE_MAIN,
710 USE_MAIN,
711 USE_MAIN,
712 USE_MAIN,
713 USE_MAIN,
714 USE_MAIN,
715 USE_MAIN,
716 USE_MAIN,
717 USE_MAIN,
718 USE_MAIN,
719 USE_MAIN,
720 USE_MAIN,
721 //D
722 USE_MAIN,
723 USE_MAIN,
724 USE_MAIN,
725 USE_MAIN,
726 USE_MAIN,
727 USE_MAIN,
728 USE_MAIN,
729 USE_MAIN,
730 USE_MAIN,
731 USE_MAIN,
732 USE_MAIN,
733 USE_MAIN,
734 USE_MAIN,
735 USE_MAIN,
736 USE_MAIN,
737 USE_MAIN,
738 //E
739 USE_MAIN,
740 {Z80_POP, Z80_IX, Z80_UNUSED, Z80_UNUSED, 0},
741 USE_MAIN,
742 {Z80_EX, Z80_IX, Z80_REG_INDIRECT | Z80_DIR, Z80_SP, 0},
743 USE_MAIN,
744 {Z80_PUSH, Z80_IX, Z80_UNUSED, Z80_UNUSED, 0},
745 USE_MAIN,
746 USE_MAIN,
747 USE_MAIN,
748 {Z80_JP, Z80_UNUSED, Z80_REG_INDIRECT, Z80_IX, 0},
749 USE_MAIN,
750 USE_MAIN,
751 USE_MAIN,
752 USE_MAIN,
753 USE_MAIN,
754 USE_MAIN,
755 //F
756 USE_MAIN,
757 USE_MAIN,
758 USE_MAIN,
759 USE_MAIN,
760 USE_MAIN,
761 USE_MAIN,
762 USE_MAIN,
763 USE_MAIN,
764 USE_MAIN,
765 {Z80_LD, Z80_SP, Z80_REG, Z80_IX, 0},
766 USE_MAIN,
767 USE_MAIN,
768 USE_MAIN,
769 USE_MAIN,
770 USE_MAIN,
771 USE_MAIN
772};
773
774#define SHIFT_BLOCK_IX(op) \
775 {op, Z80_B, Z80_IX_DISPLACE | Z80_DIR, 0, 1},\
776 {op, Z80_C, Z80_IX_DISPLACE | Z80_DIR, 0, 1},\
777 {op, Z80_D, Z80_IX_DISPLACE | Z80_DIR, 0, 1},\
778 {op, Z80_E, Z80_IX_DISPLACE | Z80_DIR, 0, 1},\
779 {op, Z80_H, Z80_IX_DISPLACE | Z80_DIR, 0, 1},\
780 {op, Z80_L, Z80_IX_DISPLACE | Z80_DIR, 0, 1},\
781 {op, Z80_UNUSED, Z80_IX_DISPLACE | Z80_DIR, 0, 1},\
782 {op, Z80_A, Z80_IX_DISPLACE | Z80_DIR, 0, 1}
783
784#define BIT_BLOCK_IX(bit) \
785 {Z80_BIT, Z80_USE_IMMED, Z80_IX_DISPLACE, 0, bit},\
786 {Z80_BIT, Z80_USE_IMMED, Z80_IX_DISPLACE, 0, bit},\
787 {Z80_BIT, Z80_USE_IMMED, Z80_IX_DISPLACE, 0, bit},\
788 {Z80_BIT, Z80_USE_IMMED, Z80_IX_DISPLACE, 0, bit},\
789 {Z80_BIT, Z80_USE_IMMED, Z80_IX_DISPLACE, 0, bit},\
790 {Z80_BIT, Z80_USE_IMMED, Z80_IX_DISPLACE, 0, bit},\
791 {Z80_BIT, Z80_USE_IMMED, Z80_IX_DISPLACE, 0, bit},\
792 {Z80_BIT, Z80_USE_IMMED, Z80_IX_DISPLACE, 0, bit}
793
794#define BIT_BLOCK_IX_REG(op, bit) \
795 {op, Z80_B, Z80_IX_DISPLACE | Z80_DIR, 0, bit},\
796 {op, Z80_C, Z80_IX_DISPLACE | Z80_DIR, 0, bit},\
797 {op, Z80_D, Z80_IX_DISPLACE | Z80_DIR, 0, bit},\
798 {op, Z80_E, Z80_IX_DISPLACE | Z80_DIR, 0, bit},\
799 {op, Z80_H, Z80_IX_DISPLACE | Z80_DIR, 0, bit},\
800 {op, Z80_L, Z80_IX_DISPLACE | Z80_DIR, 0, bit},\
801 {op, Z80_USE_IMMED, Z80_IX_DISPLACE, 0, bit},\
802 {op, Z80_A, Z80_IX_DISPLACE | Z80_DIR, 0, bit}
803
804z80inst z80_tbl_ix_bit[256] = {
805 //0
806 SHIFT_BLOCK_IX(Z80_RLC),
807 SHIFT_BLOCK_IX(Z80_RRC),
808 //1
809 SHIFT_BLOCK_IX(Z80_RL),
810 SHIFT_BLOCK_IX(Z80_RR),
811 //2
812 SHIFT_BLOCK_IX(Z80_SLA),
813 SHIFT_BLOCK_IX(Z80_SRA),
814 //3
815 SHIFT_BLOCK_IX(Z80_SLL),
816 SHIFT_BLOCK_IX(Z80_SRL),
817 //4
818 BIT_BLOCK_IX(0),
819 BIT_BLOCK_IX(1),
820 //5
821 BIT_BLOCK_IX(2),
822 BIT_BLOCK_IX(3),
823 //6
824 BIT_BLOCK_IX(4),
825 BIT_BLOCK_IX(5),
826 //7
827 BIT_BLOCK_IX(6),
828 BIT_BLOCK_IX(7),
829 //8
830 BIT_BLOCK_IX_REG(Z80_RES, 0),
831 BIT_BLOCK_IX_REG(Z80_RES, 1),
832 //9
833 BIT_BLOCK_IX_REG(Z80_RES, 2),
834 BIT_BLOCK_IX_REG(Z80_RES, 3),
835 //A
836 BIT_BLOCK_IX_REG(Z80_RES, 4),
837 BIT_BLOCK_IX_REG(Z80_RES, 5),
838 //B
839 BIT_BLOCK_IX_REG(Z80_RES, 6),
840 BIT_BLOCK_IX_REG(Z80_RES, 7),
841 //C
842 BIT_BLOCK_IX_REG(Z80_SET, 0),
843 BIT_BLOCK_IX_REG(Z80_SET, 1),
844 //D
845 BIT_BLOCK_IX_REG(Z80_SET, 2),
846 BIT_BLOCK_IX_REG(Z80_SET, 3),
847 //E
848 BIT_BLOCK_IX_REG(Z80_SET, 4),
849 BIT_BLOCK_IX_REG(Z80_SET, 5),
850 //F
851 BIT_BLOCK_IX_REG(Z80_SET, 6),
852 BIT_BLOCK_IX_REG(Z80_SET, 7),
853};
854
855z80inst z80_tbl_iy[256] = {
856 //0
857 USE_MAIN,
858 USE_MAIN,
859 USE_MAIN,
860 USE_MAIN,
861 USE_MAIN,
862 USE_MAIN,
863 USE_MAIN,
864 USE_MAIN,
865 USE_MAIN,
866 {Z80_ADD, Z80_IY, Z80_REG, Z80_BC, 0},
867 USE_MAIN,
868 USE_MAIN,
869 USE_MAIN,
870 USE_MAIN,
871 USE_MAIN,
872 USE_MAIN,
873 //1
874 USE_MAIN,
875 USE_MAIN,
876 USE_MAIN,
877 USE_MAIN,
878 USE_MAIN,
879 USE_MAIN,
880 USE_MAIN,
881 USE_MAIN,
882 USE_MAIN,
883 {Z80_ADD, Z80_IY, Z80_REG, Z80_DE, 0},
884 USE_MAIN,
885 USE_MAIN,
886 USE_MAIN,
887 USE_MAIN,
888 USE_MAIN,
889 USE_MAIN,
890 //2
891 USE_MAIN,
892 {Z80_LD, Z80_IY, Z80_IMMED, Z80_UNUSED, 0},
893 {Z80_LD, Z80_IY, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
894 {Z80_INC, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0},
895 {Z80_INC, Z80_IYH, Z80_UNUSED, Z80_UNUSED, 0},
896 {Z80_DEC, Z80_IYH, Z80_UNUSED, Z80_UNUSED, 0},
897 {Z80_LD, Z80_IYH, Z80_IMMED, Z80_UNUSED, 0},
898 USE_MAIN,
899 USE_MAIN,
900 {Z80_ADD, Z80_IY, Z80_REG, Z80_IY, 0},
901 {Z80_LD, Z80_IY, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
902 {Z80_DEC, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0},
903 {Z80_INC, Z80_IYL, Z80_UNUSED, Z80_UNUSED, 0},
904 {Z80_DEC, Z80_IYL, Z80_UNUSED, Z80_UNUSED, 0},
905 {Z80_LD, Z80_IYL, Z80_IMMED, Z80_UNUSED, 0},
906 USE_MAIN,
907 //3
908 USE_MAIN,
909 USE_MAIN,
910 USE_MAIN,
911 USE_MAIN,
912 {Z80_INC, Z80_UNUSED, Z80_IY_DISPLACE, 0, 0},
913 {Z80_DEC, Z80_UNUSED, Z80_IY_DISPLACE, 0, 0},
914 {Z80_LD, Z80_USE_IMMED, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
915 USE_MAIN,
916 USE_MAIN,
917 {Z80_ADD, Z80_IY, Z80_REG, Z80_SP, 0},
918 USE_MAIN,
919 USE_MAIN,
920 USE_MAIN,
921 USE_MAIN,
922 USE_MAIN,
923 USE_MAIN,
924 //4
925 USE_MAIN,
926 USE_MAIN,
927 USE_MAIN,
928 USE_MAIN,
929 {Z80_LD, Z80_B, Z80_REG, Z80_IYH, 0},
930 {Z80_LD, Z80_B, Z80_REG, Z80_IYL, 0},
931 {Z80_LD, Z80_B, Z80_IY_DISPLACE, 0, 0},
932 USE_MAIN,
933 USE_MAIN,
934 USE_MAIN,
935 USE_MAIN,
936 USE_MAIN,
937 {Z80_LD, Z80_C, Z80_REG, Z80_IYH, 0},
938 {Z80_LD, Z80_C, Z80_REG, Z80_IYL, 0},
939 {Z80_LD, Z80_C, Z80_IY_DISPLACE, 0, 0},
940 USE_MAIN,
941 //5
942 USE_MAIN,
943 USE_MAIN,
944 USE_MAIN,
945 USE_MAIN,
946 {Z80_LD, Z80_D, Z80_REG, Z80_IYH, 0},
947 {Z80_LD, Z80_D, Z80_REG, Z80_IYL, 0},
948 {Z80_LD, Z80_D, Z80_IY_DISPLACE, 0, 0},
949 USE_MAIN,
950 USE_MAIN,
951 USE_MAIN,
952 USE_MAIN,
953 USE_MAIN,
954 {Z80_LD, Z80_E, Z80_REG, Z80_IYH, 0},
955 {Z80_LD, Z80_E, Z80_REG, Z80_IYL, 0},
956 {Z80_LD, Z80_E, Z80_IY_DISPLACE, 0, 0},
957 USE_MAIN,
958 //6
959 {Z80_LD, Z80_IYH, Z80_REG, Z80_B, 0},
960 {Z80_LD, Z80_IYH, Z80_REG, Z80_C, 0},
961 {Z80_LD, Z80_IYH, Z80_REG, Z80_D, 0},
962 {Z80_LD, Z80_IYH, Z80_REG, Z80_E, 0},
963 {Z80_LD, Z80_IYH, Z80_REG, Z80_IYH, 0},
964 {Z80_LD, Z80_IYH, Z80_REG, Z80_IYL, 0},
965 {Z80_LD, Z80_H, Z80_IY_DISPLACE, 0, 0},
966 {Z80_LD, Z80_IYH, Z80_REG, Z80_A, 0},
967 {Z80_LD, Z80_IYL, Z80_REG, Z80_B, 0},
968 {Z80_LD, Z80_IYL, Z80_REG, Z80_C, 0},
969 {Z80_LD, Z80_IYL, Z80_REG, Z80_D, 0},
970 {Z80_LD, Z80_IYL, Z80_REG, Z80_E, 0},
971 {Z80_LD, Z80_IYL, Z80_REG, Z80_IYH, 0},
972 {Z80_LD, Z80_IYL, Z80_REG, Z80_IYL, 0},
973 {Z80_LD, Z80_L, Z80_IY_DISPLACE, 0, 0},
974 {Z80_LD, Z80_IYL, Z80_REG, Z80_A, 0},
975 //7
976 {Z80_LD, Z80_B, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
977 {Z80_LD, Z80_C, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
978 {Z80_LD, Z80_D, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
979 {Z80_LD, Z80_E, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
980 {Z80_LD, Z80_H, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
981 {Z80_LD, Z80_L, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
982 USE_MAIN,
983 {Z80_LD, Z80_A, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
984 USE_MAIN,
985 USE_MAIN,
986 USE_MAIN,
987 USE_MAIN,
988 {Z80_LD, Z80_A, Z80_REG, Z80_IYH, 0},
989 {Z80_LD, Z80_A, Z80_REG, Z80_IYL, 0},
990 {Z80_LD, Z80_A, Z80_IY_DISPLACE, 0, 0},
991 USE_MAIN,
992 //8
993 USE_MAIN,
994 USE_MAIN,
995 USE_MAIN,
996 USE_MAIN,
997 {Z80_ADD, Z80_A, Z80_REG, Z80_IYH, 0},
998 {Z80_ADD, Z80_A, Z80_REG, Z80_IYL, 0},
999 {Z80_ADD, Z80_A, Z80_IY_DISPLACE, 0, 0},
1000 USE_MAIN,
1001 USE_MAIN,
1002 USE_MAIN,
1003 USE_MAIN,
1004 USE_MAIN,
1005 {Z80_ADC, Z80_A, Z80_REG, Z80_IYH, 0},
1006 {Z80_ADC, Z80_A, Z80_REG, Z80_IYL, 0},
1007 {Z80_ADC, Z80_A, Z80_IY_DISPLACE, 0, 0},
1008 USE_MAIN,
1009 //9
1010 USE_MAIN,
1011 USE_MAIN,
1012 USE_MAIN,
1013 USE_MAIN,
1014 {Z80_SUB, Z80_A, Z80_REG, Z80_IYH, 0},
1015 {Z80_SUB, Z80_A, Z80_REG, Z80_IYL, 0},
1016 {Z80_SUB, Z80_A, Z80_IY_DISPLACE, 0, 0},
1017 USE_MAIN,
1018 USE_MAIN,
1019 USE_MAIN,
1020 USE_MAIN,
1021 USE_MAIN,
1022 {Z80_SBC, Z80_A, Z80_REG, Z80_IYH, 0},
1023 {Z80_SBC, Z80_A, Z80_REG, Z80_IYL, 0},
1024 {Z80_SBC, Z80_A, Z80_IY_DISPLACE, 0, 0},
1025 USE_MAIN,
1026 //A
1027 USE_MAIN,
1028 USE_MAIN,
1029 USE_MAIN,
1030 USE_MAIN,
1031 {Z80_AND, Z80_A, Z80_REG, Z80_IYH, 0},
1032 {Z80_AND, Z80_A, Z80_REG, Z80_IYL, 0},
1033 {Z80_AND, Z80_A, Z80_IY_DISPLACE, 0, 0},
1034 USE_MAIN,
1035 USE_MAIN,
1036 USE_MAIN,
1037 USE_MAIN,
1038 USE_MAIN,
1039 {Z80_XOR, Z80_A, Z80_REG, Z80_IYH, 0},
1040 {Z80_XOR, Z80_A, Z80_REG, Z80_IYL, 0},
1041 {Z80_XOR, Z80_A, Z80_IY_DISPLACE, 0, 0},
1042 USE_MAIN,
1043 //B
1044 USE_MAIN,
1045 USE_MAIN,
1046 USE_MAIN,
1047 USE_MAIN,
1048 {Z80_OR, Z80_A, Z80_REG, Z80_IYH, 0},
1049 {Z80_OR, Z80_A, Z80_REG, Z80_IYL, 0},
1050 {Z80_OR, Z80_A, Z80_IY_DISPLACE, 0, 0},
1051 USE_MAIN,
1052 USE_MAIN,
1053 USE_MAIN,
1054 USE_MAIN,
1055 USE_MAIN,
1056 {Z80_CP, Z80_A, Z80_REG, Z80_IYH, 0},
1057 {Z80_CP, Z80_A, Z80_REG, Z80_IYL, 0},
1058 {Z80_CP, Z80_A, Z80_IY_DISPLACE, 0, 0},
1059 USE_MAIN,
1060 //C
1061 USE_MAIN,
1062 USE_MAIN,
1063 USE_MAIN,
1064 USE_MAIN,
1065 USE_MAIN,
1066 USE_MAIN,
1067 USE_MAIN,
1068 USE_MAIN,
1069 USE_MAIN,
1070 USE_MAIN,
1071 USE_MAIN,
1072 USE_MAIN,
1073 USE_MAIN,
1074 USE_MAIN,
1075 USE_MAIN,
1076 USE_MAIN,
1077 //D
1078 USE_MAIN,
1079 USE_MAIN,
1080 USE_MAIN,
1081 USE_MAIN,
1082 USE_MAIN,
1083 USE_MAIN,
1084 USE_MAIN,
1085 USE_MAIN,
1086 USE_MAIN,
1087 USE_MAIN,
1088 USE_MAIN,
1089 USE_MAIN,
1090 USE_MAIN,
1091 USE_MAIN,
1092 USE_MAIN,
1093 USE_MAIN,
1094 //E
1095 USE_MAIN,
1096 {Z80_POP, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0},
1097 USE_MAIN,
1098 {Z80_EX, Z80_IY, Z80_REG_INDIRECT | Z80_DIR, Z80_SP, 0},
1099 USE_MAIN,
1100 {Z80_PUSH, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0},
1101 USE_MAIN,
1102 USE_MAIN,
1103 USE_MAIN,
1104 {Z80_JP, Z80_UNUSED, Z80_REG_INDIRECT, Z80_IY, 0},
1105 USE_MAIN,
1106 USE_MAIN,
1107 USE_MAIN,
1108 USE_MAIN,
1109 USE_MAIN,
1110 USE_MAIN,
1111 //F
1112 USE_MAIN,
1113 USE_MAIN,
1114 USE_MAIN,
1115 USE_MAIN,
1116 USE_MAIN,
1117 USE_MAIN,
1118 USE_MAIN,
1119 USE_MAIN,
1120 USE_MAIN,
1121 {Z80_LD, Z80_SP, Z80_REG, Z80_IY, 0},
1122 USE_MAIN,
1123 USE_MAIN,
1124 USE_MAIN,
1125 USE_MAIN,
1126 USE_MAIN,
1127 USE_MAIN
1128};
1129
1130#define SHIFT_BLOCK_IY(op) \
1131 {op, Z80_B, Z80_IY_DISPLACE | Z80_DIR, 0, 1},\
1132 {op, Z80_C, Z80_IY_DISPLACE | Z80_DIR, 0, 1},\
1133 {op, Z80_D, Z80_IY_DISPLACE | Z80_DIR, 0, 1},\
1134 {op, Z80_E, Z80_IY_DISPLACE | Z80_DIR, 0, 1},\
1135 {op, Z80_H, Z80_IY_DISPLACE | Z80_DIR, 0, 1},\
1136 {op, Z80_L, Z80_IY_DISPLACE | Z80_DIR, 0, 1},\
1137 {op, Z80_UNUSED, Z80_IY_DISPLACE | Z80_DIR, 0, 1},\
1138 {op, Z80_A, Z80_IY_DISPLACE | Z80_DIR, 0, 1}
1139
1140#define BIT_BLOCK_IY(bit) \
1141 {Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
1142 {Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
1143 {Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
1144 {Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
1145 {Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
1146 {Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
1147 {Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
1148 {Z80_BIT, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit}
1149
1150#define BIT_BLOCK_IY_REG(op, bit) \
1151 {op, Z80_B, Z80_IY_DISPLACE | Z80_DIR, 0, bit},\
1152 {op, Z80_C, Z80_IY_DISPLACE | Z80_DIR, 0, bit},\
1153 {op, Z80_D, Z80_IY_DISPLACE | Z80_DIR, 0, bit},\
1154 {op, Z80_E, Z80_IY_DISPLACE | Z80_DIR, 0, bit},\
1155 {op, Z80_H, Z80_IY_DISPLACE | Z80_DIR, 0, bit},\
1156 {op, Z80_L, Z80_IY_DISPLACE | Z80_DIR, 0, bit},\
1157 {op, Z80_USE_IMMED, Z80_IY_DISPLACE, 0, bit},\
1158 {op, Z80_A, Z80_IY_DISPLACE | Z80_DIR, 0, bit}
1159
1160z80inst z80_tbl_iy_bit[256] = {
1161 //0
1162 SHIFT_BLOCK_IY(Z80_RLC),
1163 SHIFT_BLOCK_IY(Z80_RRC),
1164 //1
1165 SHIFT_BLOCK_IY(Z80_RL),
1166 SHIFT_BLOCK_IY(Z80_RR),
1167 //2
1168 SHIFT_BLOCK_IY(Z80_SLA),
1169 SHIFT_BLOCK_IY(Z80_SRA),
1170 //3
1171 SHIFT_BLOCK_IY(Z80_SLL),
1172 SHIFT_BLOCK_IY(Z80_SRL),
1173 //4
1174 BIT_BLOCK_IY(0),
1175 BIT_BLOCK_IY(1),
1176 //5
1177 BIT_BLOCK_IY(2),
1178 BIT_BLOCK_IY(3),
1179 //6
1180 BIT_BLOCK_IY(4),
1181 BIT_BLOCK_IY(5),
1182 //7
1183 BIT_BLOCK_IY(6),
1184 BIT_BLOCK_IY(7),
1185 //8
1186 BIT_BLOCK_IY_REG(Z80_RES, 0),
1187 BIT_BLOCK_IY_REG(Z80_RES, 1),
1188 //9
1189 BIT_BLOCK_IY_REG(Z80_RES, 2),
1190 BIT_BLOCK_IY_REG(Z80_RES, 3),
1191 //A
1192 BIT_BLOCK_IY_REG(Z80_RES, 4),
1193 BIT_BLOCK_IY_REG(Z80_RES, 5),
1194 //B
1195 BIT_BLOCK_IY_REG(Z80_RES, 6),
1196 BIT_BLOCK_IY_REG(Z80_RES, 7),
1197 //C
1198 BIT_BLOCK_IY_REG(Z80_SET, 0),
1199 BIT_BLOCK_IY_REG(Z80_SET, 1),
1200 //D
1201 BIT_BLOCK_IY_REG(Z80_SET, 2),
1202 BIT_BLOCK_IY_REG(Z80_SET, 3),
1203 //E
1204 BIT_BLOCK_IY_REG(Z80_SET, 4),
1205 BIT_BLOCK_IY_REG(Z80_SET, 5),
1206 //F
1207 BIT_BLOCK_IY_REG(Z80_SET, 6),
1208 BIT_BLOCK_IY_REG(Z80_SET, 7),
1209};
1210
1211enum {
1212 NORMAL,
1213 USE_IX,
1214 USE_IY
1215};
1216
1217uint8_t * z80_decode(uint8_t * istream, z80inst * decoded)
1218{
1219 uint8_t tmp;
1220 uint8_t *start = istream;
1221 uint8_t ixiy = NORMAL;
1222 uint16_t ixiy_disp = 0x100;
1223 z80inst *base = NULL;
1224 while(!base)
1225 {
1226 switch (*istream)
1227 {
1228 case 0xCB:
1229 istream++;
1230 if (ixiy == NORMAL) {
1231 base = z80_tbl_bit + *istream;
1232 } else if (ixiy == USE_IX) {
1233 ixiy_disp = *(istream++);
1234 base = z80_tbl_ix_bit + *istream;
1235 } else {
1236 ixiy_disp = *(istream++);
1237 base = z80_tbl_iy_bit + *istream;
1238 }
1239 break;
1240 case 0xED:
1241 istream++;
1242 ixiy = NORMAL;
1243 if (*istream < 0x40 || *istream >= 0xC0) {
1244 base = z80_tbl_extd + 0xBF;
1245 } else {
1246 base = z80_tbl_extd + *istream - 0x40;
1247 }
1248 break;
1249 case 0xDD:
1250 istream++;
1251 ixiy = USE_IX;
1252 break;
1253 case 0xFD:
1254 istream++;
1255 ixiy = USE_IY;
1256 break;
1257 default:
1258 if (ixiy == NORMAL) {
1259 base = z80_tbl_a + *istream;
1260 } else if (ixiy == USE_IX) {
1261 base = z80_tbl_ix + *istream;
1262 } else {
1263 base = z80_tbl_iy + *istream;
1264 }
1265 }
1266 }
1267 if (base->op == Z80_USE_MAIN) {
1268 base = z80_tbl_a + *istream;
1269 ixiy = NORMAL;
1270 }
1271 memcpy(decoded, base, offsetof(z80inst, opcode_bytes));
1272 decoded->opcode_bytes = istream - start + 1;
1273 if (ixiy != NORMAL) {
1274 if (ixiy_disp < 0x100) {
1275 decoded->ea_reg = ixiy_disp;
1276 //don't count displacement byte as an opcode byte
1277 decoded->opcode_bytes--;
1278 } else if ((decoded->addr_mode & 0x1F) == Z80_IX_DISPLACE || (decoded->addr_mode & 0x1F) == Z80_IY_DISPLACE) {
1279 decoded->ea_reg = *(++istream);
1280 }
1281 }
1282
1283 if ((decoded->addr_mode & 0x1F) == Z80_IMMED && decoded->op != Z80_RST && decoded->op != Z80_IM) {
1284 decoded->immed = *(++istream);
1285 if ((decoded->reg >= Z80_BC && decoded->reg < Z80_UNUSED) || decoded->op == Z80_CALL || decoded->op == Z80_CALLCC || decoded->op == Z80_JP || decoded->op == Z80_JPCC) {
1286 decoded->immed |= *(++istream) << 8;
1287 } else if (decoded->immed & 0x80) {
1288 decoded->immed |= 0xFF00;
1289 }
1290 } else if ((decoded->addr_mode & 0x1F) == Z80_IMMED_INDIRECT) {
1291 decoded->immed = *(++istream);
1292 if (decoded->op != Z80_OUT && decoded->op != Z80_IN) {
1293 decoded->immed |= *(++istream) << 8;
1294 }
1295 }
1296 if (decoded->reg == Z80_USE_IMMED && decoded->op != Z80_BIT && decoded->op != Z80_RES && decoded->op != Z80_SET && decoded->op != Z80_OUT) {
1297 decoded->immed = *(++istream);
1298 }
1299 return istream+1;
1300}
1301
1302char *z80_mnemonics[Z80_OTDR+1] = {
1303 "ld",
1304 "push",
1305 "pop",
1306 "ex",
1307 "exx",
1308 "ldi",
1309 "ldir",
1310 "ldd",
1311 "lddr",
1312 "cpi",
1313 "cpir",
1314 "cpd",
1315 "cpdr",
1316 "add",
1317 "adc",
1318 "sub",
1319 "sbc",
1320 "and",
1321 "or",
1322 "xor",
1323 "cp",
1324 "inc",
1325 "dec",
1326 "daa",
1327 "cpl",
1328 "neg",
1329 "ccf",
1330 "scf",
1331 "nop",
1332 "halt",
1333 "di",
1334 "ei",
1335 "im",
1336 "rlc",
1337 "rl",
1338 "rrc",
1339 "rr",
1340 "sla",
1341 "sra",
1342 "sll",
1343 "srl",
1344 "rld",
1345 "rrd",
1346 "bit",
1347 "set",
1348 "res",
1349 "jp",
1350 "jp",
1351 "jr",
1352 "jr",
1353 "djnz",
1354 "call",
1355 "call",
1356 "ret",
1357 "ret",
1358 "reti",
1359 "retn",
1360 "rst",
1361 "in",
1362 "ini",
1363 "inir",
1364 "ind",
1365 "indr",
1366 "out",
1367 "outi",
1368 "otir",
1369 "outd",
1370 "otdr"
1371};
1372
1373char * z80_regs[Z80_USE_IMMED] = {
1374 "c",
1375 "b",
1376 "e",
1377 "d",
1378 "l",
1379 "h",
1380 "ixl",
1381 "ixh",
1382 "iyl",
1383 "iyh",
1384 "i",
1385 "r",
1386 "a",
1387 "bc",
1388 "de",
1389 "hl",
1390 "sp",
1391 "af",
1392 "ix",
1393 "iy",
1394};
1395
1396char * z80_conditions[Z80_CC_M+1] = {
1397 "nz",
1398 "z",
1399 "nc",
1400 "c",
1401 "po",
1402 "pe",
1403 "p",
1404 "m"
1405};
1406
1407int z80_disasm(z80inst * decoded, char * dst, uint16_t address)
1408{
1409 int len = sprintf(dst, "%s", z80_mnemonics[decoded->op]);
1410 uint8_t needcomma;
1411 if (decoded->addr_mode & Z80_DIR) {
1412 needcomma = 1;
1413 switch (decoded->addr_mode & 0x1F)
1414 {
1415 case Z80_REG:
1416 len += sprintf(dst+len, " %s", z80_regs[decoded->ea_reg]);
1417 break;
1418 case Z80_REG_INDIRECT:
1419 len += sprintf(dst+len, " (%s)", z80_regs[decoded->ea_reg]);
1420 break;
1421 case Z80_IMMED:
1422 if (decoded->immed >= 63 || decoded->op == Z80_JP || decoded->op == Z80_JPCC || decoded->op == Z80_CALL || decoded->op == Z80_CALLCC || decoded->op == Z80_RST)
1423 {
1424 len += sprintf(dst+len, " $%X", decoded->immed);
1425 } else {
1426 len += sprintf(dst+len, " %d", decoded->immed);
1427 }
1428 break;
1429 case Z80_IMMED_INDIRECT:
1430 len += sprintf(dst+len, " ($%X)", decoded->immed);
1431 break;
1432 case Z80_IX_DISPLACE:
1433 len += sprintf(dst+len, " (ix+%d)", decoded->ea_reg & 0x80 ? decoded->ea_reg - 256 : decoded->ea_reg);
1434 break;
1435 case Z80_IY_DISPLACE:
1436 len += sprintf(dst+len, " (iy+%d)", decoded->ea_reg & 0x80 ? decoded->ea_reg - 256 : decoded->ea_reg);
1437 break;
1438 default:
1439 needcomma = 0;
1440 }
1441 if (decoded->reg & Z80_IMMED_FLAG) {
1442 len += sprintf(dst+len, "%s %d", needcomma ? "," : "", decoded->immed);
1443 }
1444 if ((decoded->reg & 0x1F) != Z80_UNUSED) {
1445 if (decoded->op == Z80_JRCC || decoded->op == Z80_JPCC || decoded->op == Z80_CALLCC || decoded->op == Z80_RETCC) {
1446 len += sprintf(dst+len, "%s %s", needcomma ? "," : "", z80_conditions[decoded->reg & 0x1F]);
1447 } else {
1448 len += sprintf(dst+len, "%s %s", needcomma ? "," : "", z80_regs[decoded->reg & 0x1F]);
1449 }
1450 }
1451 } else {
1452 needcomma = 0;
1453 if (decoded->reg & Z80_IMMED_FLAG) {
1454 len += sprintf(dst+len, " %d", decoded->immed);
1455 needcomma = 1;
1456 }
1457 if ((decoded->reg & 0x1F) != Z80_UNUSED) {
1458 if (decoded->op == Z80_JRCC || decoded->op == Z80_JPCC || decoded->op == Z80_CALLCC || decoded->op == Z80_RETCC) {
1459 len += sprintf(dst+len, " %s", z80_conditions[decoded->reg & 0x1F]);
1460 } else {
1461 len += sprintf(dst+len, " %s", z80_regs[decoded->reg & 0x1F]);
1462 }
1463 needcomma = 1;
1464 }
1465 switch (decoded->addr_mode)
1466 {
1467 case Z80_REG:
1468 len += sprintf(dst+len, "%s %s", needcomma ? "," : "" , z80_regs[decoded->ea_reg]);
1469 break;
1470 case Z80_REG_INDIRECT:
1471 len += sprintf(dst+len, "%s (%s)", needcomma ? "," : "" , z80_regs[decoded->ea_reg]);
1472 break;
1473 case Z80_IMMED:
1474 if (decoded->op == Z80_JR || decoded->op == Z80_JRCC || decoded->op == Z80_DJNZ) {
1475 address += 2 + decoded->immed;
1476 len += sprintf(dst+len, "%s %X", needcomma ? "," : "" , address);
1477 } else if (decoded->immed >= 63 || decoded->op == Z80_JP || decoded->op == Z80_JPCC || decoded->op == Z80_CALL || decoded->op == Z80_CALLCC || decoded->op == Z80_RST)
1478 {
1479 len += sprintf(dst+len, "%s $%X", needcomma ? "," : "" , decoded->immed);
1480 } else {
1481 len += sprintf(dst+len, "%s %d", needcomma ? "," : "" , decoded->immed);
1482 }
1483 break;
1484 case Z80_IMMED_INDIRECT:
1485 len += sprintf(dst+len, "%s ($%X)", needcomma ? "," : "" , decoded->immed);
1486 break;
1487 case Z80_IX_DISPLACE:
1488 len += sprintf(dst+len, "%s (ix+%d)", needcomma ? "," : "" , decoded->ea_reg & 0x80 ? decoded->ea_reg - 256 : decoded->ea_reg);
1489 break;
1490 case Z80_IY_DISPLACE:
1491 len += sprintf(dst+len, "%s (iy+%d)", needcomma ? "," : "" , decoded->ea_reg & 0x80 ? decoded->ea_reg - 256 : decoded->ea_reg);
1492 break;
1493 }
1494 }
1495 return len;
1496}
1497
1498uint8_t z80_high_reg(uint8_t reg)
1499{
1500 switch(reg)
1501 {
1502 case Z80_C:
1503 case Z80_BC:
1504 return Z80_B;
1505 case Z80_E:
1506 case Z80_DE:
1507 return Z80_D;
1508 case Z80_L:
1509 case Z80_HL:
1510 return Z80_H;
1511 case Z80_IXL:
1512 case Z80_IX:
1513 return Z80_IXH;
1514 case Z80_IYL:
1515 case Z80_IY:
1516 return Z80_IYH;
1517 default:
1518 return Z80_UNUSED;
1519 }
1520}
1521
1522uint8_t z80_low_reg(uint8_t reg)
1523{
1524 switch(reg)
1525 {
1526 case Z80_B:
1527 case Z80_BC:
1528 return Z80_C;
1529 case Z80_D:
1530 case Z80_DE:
1531 return Z80_E;
1532 case Z80_H:
1533 case Z80_HL:
1534 return Z80_L;
1535 case Z80_IXH:
1536 case Z80_IX:
1537 return Z80_IXL;
1538 case Z80_IYH:
1539 case Z80_IY:
1540 return Z80_IYL;
1541 default:
1542 return Z80_UNUSED;
1543 }
1544}
1545
1546uint8_t z80_word_reg(uint8_t reg)
1547{
1548 switch(reg)
1549 {
1550 case Z80_B:
1551 case Z80_C:
1552 return Z80_BC;
1553 case Z80_D:
1554 case Z80_E:
1555 return Z80_DE;
1556 case Z80_H:
1557 case Z80_L:
1558 return Z80_HL;
1559 case Z80_IXH:
1560 case Z80_IXL:
1561 return Z80_IX;
1562 case Z80_IYH:
1563 case Z80_IYL:
1564 return Z80_IY;
1565 default:
1566 return Z80_UNUSED;
1567 }
1568}
1569
1570uint8_t z80_is_terminal(z80inst * inst)
1571{
1572 return inst->op == Z80_RET || inst->op == Z80_RETI || inst->op == Z80_RETN || inst->op == Z80_JP
1573 || inst->op == Z80_JR || inst->op == Z80_HALT || (inst->op == Z80_NOP && inst->immed == 42);
1574}
1575
1576
1577