Mercurial > repos > blastem
comparison z80inst.c @ 199:69585e7d474f
Add initial stab at Z80 decoder and disassembler
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 20 Jan 2013 19:11:24 -0800 |
parents | |
children | d3066ceb29d1 |
comparison
equal
deleted
inserted
replaced
198:209a37eed3e7 | 199:69585e7d474f |
---|---|
1 #include "z80inst.h" | |
2 #include <string.h> | |
3 #include <stdio.h> | |
4 | |
5 z80inst z80_tbl_a[256] = { | |
6 //0 | |
7 {Z80_NOP, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, | |
8 {Z80_LD, Z80_BC, Z80_IMMED, Z80_UNUSED, 0}, | |
9 {Z80_LD, Z80_A, Z80_REG_INDIRECT | Z80_DIR, Z80_BC, 0}, | |
10 {Z80_INC, Z80_BC, Z80_UNUSED, Z80_UNUSED, 0}, | |
11 {Z80_INC, Z80_B, Z80_UNUSED, Z80_UNUSED, 0}, | |
12 {Z80_DEC, Z80_B, Z80_UNUSED, Z80_UNUSED, 0}, | |
13 {Z80_LD, Z80_B, Z80_IMMED, Z80_UNUSED, 0}, | |
14 {Z80_RLC, Z80_A, Z80_UNUSED, Z80_UNUSED, 0}, | |
15 {Z80_EX, Z80_AF, Z80_REG, Z80_AF, 0}, | |
16 {Z80_ADD, Z80_HL, Z80_REG, Z80_BC, 0}, | |
17 {Z80_LD, Z80_A, Z80_REG_INDIRECT, Z80_BC, 0}, | |
18 {Z80_DEC, Z80_BC, Z80_UNUSED, Z80_UNUSED, 0}, | |
19 {Z80_INC, Z80_C, Z80_UNUSED, Z80_UNUSED, 0}, | |
20 {Z80_DEC, Z80_C, Z80_UNUSED, Z80_UNUSED, 0}, | |
21 {Z80_LD, Z80_C, Z80_IMMED, Z80_UNUSED, 0}, | |
22 {Z80_RRC, Z80_A, Z80_UNUSED, Z80_UNUSED, 0}, | |
23 //1 | |
24 {Z80_DJNZ, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0}, | |
25 {Z80_LD, Z80_DE, Z80_IMMED, Z80_UNUSED, 0}, | |
26 {Z80_LD, Z80_A, Z80_REG_INDIRECT | Z80_DIR, Z80_DE, 0}, | |
27 {Z80_INC, Z80_DE, Z80_UNUSED, Z80_UNUSED, 0}, | |
28 {Z80_INC, Z80_D, Z80_UNUSED, Z80_UNUSED, 0}, | |
29 {Z80_DEC, Z80_D, Z80_UNUSED, Z80_UNUSED, 0}, | |
30 {Z80_LD, Z80_D, Z80_IMMED, Z80_UNUSED, 0}, | |
31 {Z80_RL, Z80_A, Z80_UNUSED, Z80_UNUSED, 0}, | |
32 {Z80_JR, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0}, | |
33 {Z80_ADD, Z80_HL, Z80_REG, Z80_DE, 0}, | |
34 {Z80_LD, Z80_A, Z80_REG_INDIRECT, Z80_DE, 0}, | |
35 {Z80_DEC, Z80_DE, Z80_UNUSED, Z80_UNUSED, 0}, | |
36 {Z80_INC, Z80_E, Z80_UNUSED, Z80_UNUSED, 0}, | |
37 {Z80_DEC, Z80_E, Z80_UNUSED, Z80_UNUSED, 0}, | |
38 {Z80_LD, Z80_E, Z80_IMMED, Z80_UNUSED, 0}, | |
39 {Z80_RR, Z80_A, Z80_UNUSED, Z80_UNUSED, 0}, | |
40 //2 | |
41 {Z80_JRCC, Z80_CC_NZ, Z80_IMMED, Z80_UNUSED, 0}, | |
42 {Z80_LD, Z80_HL, Z80_IMMED, Z80_UNUSED, 0}, | |
43 {Z80_LD, Z80_HL, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0}, | |
44 {Z80_INC, Z80_HL, Z80_UNUSED, Z80_UNUSED, 0}, | |
45 {Z80_INC, Z80_H, Z80_UNUSED, Z80_UNUSED, 0}, | |
46 {Z80_DEC, Z80_H, Z80_UNUSED, Z80_UNUSED, 0}, | |
47 {Z80_LD, Z80_H, Z80_IMMED, Z80_UNUSED, 0}, | |
48 {Z80_DAA, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, | |
49 {Z80_JRCC, Z80_CC_Z, Z80_IMMED, Z80_UNUSED, 0}, | |
50 {Z80_ADD, Z80_HL, Z80_REG, Z80_HL, 0}, | |
51 {Z80_LD, Z80_HL, Z80_IMMED_INDIRECT, Z80_IMMED, 0}, | |
52 {Z80_DEC, Z80_HL, Z80_UNUSED, Z80_UNUSED, 0}, | |
53 {Z80_INC, Z80_L, Z80_UNUSED, Z80_UNUSED, 0}, | |
54 {Z80_DEC, Z80_L, Z80_UNUSED, Z80_UNUSED, 0}, | |
55 {Z80_LD, Z80_L, Z80_IMMED, Z80_UNUSED, 0}, | |
56 {Z80_CPL, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, | |
57 //3 | |
58 {Z80_JRCC, Z80_CC_NC, Z80_IMMED, Z80_UNUSED, 0}, | |
59 {Z80_LD, Z80_SP, Z80_IMMED, Z80_UNUSED, 0}, | |
60 {Z80_LD, Z80_A, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0}, | |
61 {Z80_INC, Z80_SP, Z80_UNUSED, Z80_UNUSED, 0}, | |
62 {Z80_INC, Z80_UNUSED, Z80_REG_INDIRECT, Z80_HL, 0}, | |
63 {Z80_DEC, Z80_UNUSED, Z80_REG_INDIRECT, Z80_HL, 0}, | |
64 {Z80_LD, Z80_USE_IMMED, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0}, | |
65 {Z80_SCF, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, | |
66 {Z80_JRCC, Z80_CC_C, Z80_IMMED, Z80_UNUSED, 0}, | |
67 {Z80_ADD, Z80_HL, Z80_REG, Z80_SP, 0}, | |
68 {Z80_LD, Z80_A, Z80_IMMED_INDIRECT, Z80_IMMED, 0}, | |
69 {Z80_DEC, Z80_SP, Z80_UNUSED, Z80_UNUSED, 0}, | |
70 {Z80_INC, Z80_A, Z80_UNUSED, Z80_UNUSED, 0}, | |
71 {Z80_DEC, Z80_A, Z80_UNUSED, Z80_UNUSED, 0}, | |
72 {Z80_LD, Z80_A, Z80_IMMED, Z80_UNUSED, 0}, | |
73 {Z80_CCF, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, | |
74 //4 | |
75 {Z80_LD, Z80_B, Z80_REG, Z80_B, 0}, | |
76 {Z80_LD, Z80_B, Z80_REG, Z80_C, 0}, | |
77 {Z80_LD, Z80_B, Z80_REG, Z80_D, 0}, | |
78 {Z80_LD, Z80_B, Z80_REG, Z80_E, 0}, | |
79 {Z80_LD, Z80_B, Z80_REG, Z80_H, 0}, | |
80 {Z80_LD, Z80_B, Z80_REG, Z80_L, 0}, | |
81 {Z80_LD, Z80_B, Z80_REG_INDIRECT, Z80_HL, 0}, | |
82 {Z80_LD, Z80_B, Z80_REG, Z80_A, 0}, | |
83 {Z80_LD, Z80_C, Z80_REG, Z80_B, 0}, | |
84 {Z80_LD, Z80_C, Z80_REG, Z80_C, 0}, | |
85 {Z80_LD, Z80_C, Z80_REG, Z80_D, 0}, | |
86 {Z80_LD, Z80_C, Z80_REG, Z80_E, 0}, | |
87 {Z80_LD, Z80_C, Z80_REG, Z80_H, 0}, | |
88 {Z80_LD, Z80_C, Z80_REG, Z80_L, 0}, | |
89 {Z80_LD, Z80_C, Z80_REG_INDIRECT, Z80_HL, 0}, | |
90 {Z80_LD, Z80_C, Z80_REG, Z80_A, 0}, | |
91 //5 | |
92 {Z80_LD, Z80_D, Z80_REG, Z80_B, 0}, | |
93 {Z80_LD, Z80_D, Z80_REG, Z80_C, 0}, | |
94 {Z80_LD, Z80_D, Z80_REG, Z80_D, 0}, | |
95 {Z80_LD, Z80_D, Z80_REG, Z80_E, 0}, | |
96 {Z80_LD, Z80_D, Z80_REG, Z80_H, 0}, | |
97 {Z80_LD, Z80_D, Z80_REG, Z80_L, 0}, | |
98 {Z80_LD, Z80_D, Z80_REG_INDIRECT, Z80_HL, 0}, | |
99 {Z80_LD, Z80_D, Z80_REG, Z80_A, 0}, | |
100 {Z80_LD, Z80_E, Z80_REG, Z80_B, 0}, | |
101 {Z80_LD, Z80_E, Z80_REG, Z80_C, 0}, | |
102 {Z80_LD, Z80_E, Z80_REG, Z80_D, 0}, | |
103 {Z80_LD, Z80_E, Z80_REG, Z80_E, 0}, | |
104 {Z80_LD, Z80_E, Z80_REG, Z80_H, 0}, | |
105 {Z80_LD, Z80_E, Z80_REG, Z80_L, 0}, | |
106 {Z80_LD, Z80_E, Z80_REG_INDIRECT, Z80_HL, 0}, | |
107 {Z80_LD, Z80_E, Z80_REG, Z80_A, 0}, | |
108 //6 | |
109 {Z80_LD, Z80_H, Z80_REG, Z80_B, 0}, | |
110 {Z80_LD, Z80_H, Z80_REG, Z80_C, 0}, | |
111 {Z80_LD, Z80_H, Z80_REG, Z80_D, 0}, | |
112 {Z80_LD, Z80_H, Z80_REG, Z80_E, 0}, | |
113 {Z80_LD, Z80_H, Z80_REG, Z80_H, 0}, | |
114 {Z80_LD, Z80_H, Z80_REG, Z80_L, 0}, | |
115 {Z80_LD, Z80_H, Z80_REG_INDIRECT, Z80_HL, 0}, | |
116 {Z80_LD, Z80_H, Z80_REG, Z80_A, 0}, | |
117 {Z80_LD, Z80_L, Z80_REG, Z80_B, 0}, | |
118 {Z80_LD, Z80_L, Z80_REG, Z80_C, 0}, | |
119 {Z80_LD, Z80_L, Z80_REG, Z80_D, 0}, | |
120 {Z80_LD, Z80_L, Z80_REG, Z80_E, 0}, | |
121 {Z80_LD, Z80_L, Z80_REG, Z80_H, 0}, | |
122 {Z80_LD, Z80_L, Z80_REG, Z80_L, 0}, | |
123 {Z80_LD, Z80_L, Z80_REG_INDIRECT, Z80_HL, 0}, | |
124 {Z80_LD, Z80_L, Z80_REG, Z80_A, 0}, | |
125 //7 | |
126 {Z80_LD, Z80_B, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0}, | |
127 {Z80_LD, Z80_C, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0}, | |
128 {Z80_LD, Z80_D, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0}, | |
129 {Z80_LD, Z80_E, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0}, | |
130 {Z80_LD, Z80_H, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0}, | |
131 {Z80_LD, Z80_L, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0}, | |
132 {Z80_HALT, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, | |
133 {Z80_LD, Z80_A, Z80_REG_INDIRECT | Z80_DIR, Z80_HL, 0}, | |
134 {Z80_LD, Z80_A, Z80_REG, Z80_B, 0}, | |
135 {Z80_LD, Z80_A, Z80_REG, Z80_C, 0}, | |
136 {Z80_LD, Z80_A, Z80_REG, Z80_D, 0}, | |
137 {Z80_LD, Z80_A, Z80_REG, Z80_E, 0}, | |
138 {Z80_LD, Z80_A, Z80_REG, Z80_H, 0}, | |
139 {Z80_LD, Z80_A, Z80_REG, Z80_L, 0}, | |
140 {Z80_LD, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0}, | |
141 {Z80_LD, Z80_A, Z80_REG, Z80_A, 0}, | |
142 //8 | |
143 {Z80_ADD, Z80_A, Z80_REG, Z80_B, 0}, | |
144 {Z80_ADD, Z80_A, Z80_REG, Z80_C, 0}, | |
145 {Z80_ADD, Z80_A, Z80_REG, Z80_D, 0}, | |
146 {Z80_ADD, Z80_A, Z80_REG, Z80_E, 0}, | |
147 {Z80_ADD, Z80_A, Z80_REG, Z80_H, 0}, | |
148 {Z80_ADD, Z80_A, Z80_REG, Z80_L, 0}, | |
149 {Z80_ADD, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0}, | |
150 {Z80_ADD, Z80_A, Z80_REG, Z80_A, 0}, | |
151 {Z80_ADC, Z80_A, Z80_REG, Z80_B, 0}, | |
152 {Z80_ADC, Z80_A, Z80_REG, Z80_C, 0}, | |
153 {Z80_ADC, Z80_A, Z80_REG, Z80_D, 0}, | |
154 {Z80_ADC, Z80_A, Z80_REG, Z80_E, 0}, | |
155 {Z80_ADC, Z80_A, Z80_REG, Z80_H, 0}, | |
156 {Z80_ADC, Z80_A, Z80_REG, Z80_L, 0}, | |
157 {Z80_ADC, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0}, | |
158 {Z80_ADC, Z80_A, Z80_REG, Z80_A, 0}, | |
159 //9 | |
160 {Z80_SUB, Z80_A, Z80_REG, Z80_B, 0}, | |
161 {Z80_SUB, Z80_A, Z80_REG, Z80_C, 0}, | |
162 {Z80_SUB, Z80_A, Z80_REG, Z80_D, 0}, | |
163 {Z80_SUB, Z80_A, Z80_REG, Z80_E, 0}, | |
164 {Z80_SUB, Z80_A, Z80_REG, Z80_H, 0}, | |
165 {Z80_SUB, Z80_A, Z80_REG, Z80_L, 0}, | |
166 {Z80_SUB, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0}, | |
167 {Z80_SUB, Z80_A, Z80_REG, Z80_A, 0}, | |
168 {Z80_SBC, Z80_A, Z80_REG, Z80_B, 0}, | |
169 {Z80_SBC, Z80_A, Z80_REG, Z80_C, 0}, | |
170 {Z80_SBC, Z80_A, Z80_REG, Z80_D, 0}, | |
171 {Z80_SBC, Z80_A, Z80_REG, Z80_E, 0}, | |
172 {Z80_SBC, Z80_A, Z80_REG, Z80_H, 0}, | |
173 {Z80_SBC, Z80_A, Z80_REG, Z80_L, 0}, | |
174 {Z80_SBC, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0}, | |
175 {Z80_SBC, Z80_A, Z80_REG, Z80_A, 0}, | |
176 //A | |
177 {Z80_AND, Z80_A, Z80_REG, Z80_B, 0}, | |
178 {Z80_AND, Z80_A, Z80_REG, Z80_C, 0}, | |
179 {Z80_AND, Z80_A, Z80_REG, Z80_D, 0}, | |
180 {Z80_AND, Z80_A, Z80_REG, Z80_E, 0}, | |
181 {Z80_AND, Z80_A, Z80_REG, Z80_H, 0}, | |
182 {Z80_AND, Z80_A, Z80_REG, Z80_L, 0}, | |
183 {Z80_AND, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0}, | |
184 {Z80_AND, Z80_A, Z80_REG, Z80_A, 0}, | |
185 {Z80_XOR, Z80_A, Z80_REG, Z80_B, 0}, | |
186 {Z80_XOR, Z80_A, Z80_REG, Z80_C, 0}, | |
187 {Z80_XOR, Z80_A, Z80_REG, Z80_D, 0}, | |
188 {Z80_XOR, Z80_A, Z80_REG, Z80_E, 0}, | |
189 {Z80_XOR, Z80_A, Z80_REG, Z80_H, 0}, | |
190 {Z80_XOR, Z80_A, Z80_REG, Z80_L, 0}, | |
191 {Z80_XOR, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0}, | |
192 {Z80_XOR, Z80_A, Z80_REG, Z80_A, 0}, | |
193 //B | |
194 {Z80_OR, Z80_A, Z80_REG, Z80_B, 0}, | |
195 {Z80_OR, Z80_A, Z80_REG, Z80_C, 0}, | |
196 {Z80_OR, Z80_A, Z80_REG, Z80_D, 0}, | |
197 {Z80_OR, Z80_A, Z80_REG, Z80_E, 0}, | |
198 {Z80_OR, Z80_A, Z80_REG, Z80_H, 0}, | |
199 {Z80_OR, Z80_A, Z80_REG, Z80_L, 0}, | |
200 {Z80_OR, Z80_A, Z80_REG_INDIRECT, Z80_HL, 0}, | |
201 {Z80_OR, Z80_A, Z80_REG, Z80_A, 0}, | |
202 {Z80_OR, Z80_CP, Z80_REG, Z80_B, 0}, | |
203 {Z80_OR, Z80_CP, Z80_REG, Z80_C, 0}, | |
204 {Z80_OR, Z80_CP, Z80_REG, Z80_D, 0}, | |
205 {Z80_OR, Z80_CP, Z80_REG, Z80_E, 0}, | |
206 {Z80_OR, Z80_CP, Z80_REG, Z80_H, 0}, | |
207 {Z80_OR, Z80_CP, Z80_REG, Z80_L, 0}, | |
208 {Z80_OR, Z80_CP, Z80_REG_INDIRECT, Z80_HL, 0}, | |
209 {Z80_OR, Z80_CP, Z80_REG, Z80_A, 0}, | |
210 //C | |
211 {Z80_RETCC, Z80_CC_NZ, Z80_UNUSED, Z80_UNUSED, 0}, | |
212 {Z80_POP, Z80_BC, Z80_UNUSED, Z80_UNUSED, 0}, | |
213 {Z80_JPCC, Z80_CC_NZ, Z80_IMMED, Z80_UNUSED, 0}, | |
214 {Z80_JP, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0}, | |
215 {Z80_CALLCC, Z80_CC_NZ, Z80_IMMED, Z80_UNUSED, 0}, | |
216 {Z80_PUSH, Z80_BC, Z80_UNUSED, Z80_UNUSED, 0}, | |
217 {Z80_ADD, Z80_A, Z80_IMMED, Z80_UNUSED, 0}, | |
218 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x0}, | |
219 {Z80_RETCC, Z80_CC_Z, Z80_UNUSED, Z80_UNUSED, 0}, | |
220 {Z80_RET, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, | |
221 {Z80_JPCC, Z80_CC_Z, Z80_IMMED, Z80_UNUSED, 0}, | |
222 {0, 0, 0, 0, 0},//BITS Prefix | |
223 {Z80_CALLCC, Z80_CC_Z, Z80_IMMED, Z80_UNUSED, 0}, | |
224 {Z80_CALL, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0}, | |
225 {Z80_ADC, Z80_A, Z80_IMMED, Z80_UNUSED, 0}, | |
226 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x8}, | |
227 //D | |
228 {Z80_RETCC, Z80_CC_NC, Z80_UNUSED, Z80_UNUSED, 0}, | |
229 {Z80_POP, Z80_DE, Z80_UNUSED, Z80_UNUSED, 0}, | |
230 {Z80_JPCC, Z80_CC_NC, Z80_IMMED, Z80_UNUSED, 0}, | |
231 {Z80_OUT, Z80_A, Z80_IMMED_INDIRECT, Z80_UNUSED, 0}, | |
232 {Z80_CALLCC, Z80_CC_NC, Z80_IMMED, Z80_UNUSED, 0}, | |
233 {Z80_PUSH, Z80_DE, Z80_UNUSED, Z80_UNUSED, 0}, | |
234 {Z80_SUB, Z80_A, Z80_IMMED, Z80_UNUSED, 0}, | |
235 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x10}, | |
236 {Z80_RETCC, Z80_CC_C, Z80_UNUSED, Z80_UNUSED, 0}, | |
237 {Z80_EXX, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, | |
238 {Z80_JPCC, Z80_CC_C, Z80_IMMED, Z80_UNUSED, 0}, | |
239 {Z80_IN, Z80_A, Z80_IMMED_INDIRECT, Z80_UNUSED, 0}, | |
240 {Z80_CALLCC, Z80_CC_C, Z80_IMMED, Z80_UNUSED, 0}, | |
241 {0, 0, 0, 0, 0},//IX Prefix | |
242 {Z80_SBC, Z80_A, Z80_IMMED, Z80_UNUSED, 0}, | |
243 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x18}, | |
244 //E | |
245 {Z80_RETCC, Z80_CC_PO, Z80_UNUSED, Z80_UNUSED, 0}, | |
246 {Z80_POP, Z80_HL, Z80_UNUSED, Z80_UNUSED, 0}, | |
247 {Z80_JPCC, Z80_CC_PO, Z80_IMMED, Z80_UNUSED, 0}, | |
248 {Z80_EX, Z80_HL, Z80_REG_INDIRECT | Z80_DIR, Z80_SP, 0}, | |
249 {Z80_CALLCC, Z80_CC_PO, Z80_IMMED, Z80_UNUSED, 0}, | |
250 {Z80_PUSH, Z80_HL, Z80_UNUSED, Z80_UNUSED, 0}, | |
251 {Z80_AND, Z80_A, Z80_IMMED, Z80_UNUSED, 0}, | |
252 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x20}, | |
253 {Z80_RETCC, Z80_CC_PE, Z80_UNUSED, Z80_UNUSED, 0}, | |
254 {Z80_JP, Z80_UNUSED, Z80_REG_INDIRECT, Z80_HL, 0}, | |
255 {Z80_JPCC, Z80_CC_PE, Z80_IMMED, Z80_UNUSED, 0}, | |
256 {Z80_EX, Z80_DE, Z80_REG, Z80_HL, 0}, | |
257 {Z80_CALLCC, Z80_CC_PE, Z80_IMMED, Z80_UNUSED, 0}, | |
258 {0, 0, 0, 0, 0},//EXTD Prefix | |
259 {Z80_XOR, Z80_A, Z80_IMMED, Z80_UNUSED, 0}, | |
260 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x28}, | |
261 //F | |
262 {Z80_RETCC, Z80_CC_P, Z80_UNUSED, Z80_UNUSED, 0}, | |
263 {Z80_POP, Z80_AF, Z80_UNUSED, Z80_UNUSED, 0}, | |
264 {Z80_JPCC, Z80_CC_P, Z80_IMMED, Z80_UNUSED, 0}, | |
265 {Z80_DI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, | |
266 {Z80_CALLCC, Z80_CC_P, Z80_IMMED, Z80_UNUSED, 0}, | |
267 {Z80_PUSH, Z80_AF, Z80_UNUSED, Z80_UNUSED, 0}, | |
268 {Z80_OR, Z80_A, Z80_IMMED, Z80_UNUSED, 0}, | |
269 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x30}, | |
270 {Z80_RETCC, Z80_CC_M, Z80_UNUSED, Z80_UNUSED, 0}, | |
271 {Z80_LD, Z80_SP, Z80_REG, Z80_HL, 0}, | |
272 {Z80_JPCC, Z80_CC_M, Z80_IMMED, Z80_UNUSED, 0}, | |
273 {Z80_EI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, | |
274 {Z80_CALLCC, Z80_CC_M, Z80_IMMED, Z80_UNUSED, 0}, | |
275 {0, 0, 0, 0, 0},//IY Prefix | |
276 {Z80_CP, Z80_A, Z80_IMMED, Z80_UNUSED, 0}, | |
277 {Z80_RST, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 0x38} | |
278 }; | |
279 | |
280 uint8_t * z80_decode(uint8_t * istream, z80inst * decoded) | |
281 { | |
282 if (*istream == 0xCB) { | |
283 } else if (*istream == 0xDD) { | |
284 } else if (*istream == 0xED) { | |
285 } else if (*istream == 0xFD) { | |
286 } else { | |
287 memcpy(decoded, z80_tbl_a + *istream, sizeof(z80inst)); | |
288 if (decoded->addr_mode == Z80_IMMED && decoded->op != Z80_RST) { | |
289 decoded->immed = *(++istream); | |
290 if (decoded->reg >= Z80_BC) { | |
291 decoded->immed |= *(++istream) << 8; | |
292 } else if (decoded->immed & 0x80) { | |
293 decoded->immed |= 0xFF00; | |
294 } | |
295 } else if (decoded->addr_mode == Z80_IMMED_INDIRECT) { | |
296 decoded->immed = *(++istream); | |
297 if (decoded->op != Z80_OUT && decoded->op != Z80_IN) { | |
298 decoded->immed |= *(++istream) << 8; | |
299 } | |
300 } else if (decoded->reg == Z80_USE_IMMED) { | |
301 decoded->immed = *(++istream); | |
302 } | |
303 } | |
304 return istream+1; | |
305 } | |
306 | |
307 char *z80_mnemonics[Z80_OTDR+1] = { | |
308 "ld", | |
309 "push", | |
310 "pop", | |
311 "ex", | |
312 "exx", | |
313 "ldi", | |
314 "ldir", | |
315 "ldd", | |
316 "lddr", | |
317 "cpi", | |
318 "cpir", | |
319 "cpd", | |
320 "cpdr", | |
321 "add", | |
322 "adc", | |
323 "sub", | |
324 "sbc", | |
325 "and", | |
326 "or", | |
327 "xor", | |
328 "cp", | |
329 "inc", | |
330 "dec", | |
331 "daa", | |
332 "cpl", | |
333 "neg", | |
334 "ccf", | |
335 "scf", | |
336 "nop", | |
337 "halt", | |
338 "di", | |
339 "ei", | |
340 "im", | |
341 "rlc", | |
342 "rl", | |
343 "rrc", | |
344 "rr", | |
345 "sl", | |
346 "rld", | |
347 "rrd", | |
348 "bit", | |
349 "set", | |
350 "res", | |
351 "jp", | |
352 "jp", | |
353 "jr", | |
354 "jr", | |
355 "djnz", | |
356 "call", | |
357 "call", | |
358 "ret", | |
359 "ret", | |
360 "reti", | |
361 "retn", | |
362 "rst", | |
363 "in", | |
364 "ini", | |
365 "inir", | |
366 "indr", | |
367 "out", | |
368 "outi", | |
369 "otir", | |
370 "outd", | |
371 "otdr" | |
372 }; | |
373 | |
374 char * z80_regs[Z80_USE_IMMED] = { | |
375 "b", | |
376 "c", | |
377 "d", | |
378 "e", | |
379 "h", | |
380 "l", | |
381 "", | |
382 "a", | |
383 "bc", | |
384 "de", | |
385 "hl", | |
386 "sp", | |
387 "af", | |
388 }; | |
389 | |
390 char * z80_conditions[Z80_CC_M+1] = { | |
391 "nz", | |
392 "z", | |
393 "nc", | |
394 "c", | |
395 "po", | |
396 "pe", | |
397 "p", | |
398 "m" | |
399 }; | |
400 | |
401 int z80_disasm(z80inst * decoded, char * dst) | |
402 { | |
403 int len = sprintf(dst, "%s", z80_mnemonics[decoded->op]); | |
404 if (decoded->addr_mode & Z80_DIR) { | |
405 switch (decoded->addr_mode) | |
406 { | |
407 case Z80_REG: | |
408 len += sprintf(dst+len, " %s", z80_regs[decoded->ea_reg]); | |
409 break; | |
410 case Z80_REG_INDIRECT: | |
411 len += sprintf(dst+len, " (%s)", z80_regs[decoded->ea_reg]); | |
412 break; | |
413 case Z80_IMMED: | |
414 len += sprintf(dst+len, " %d", decoded->immed); | |
415 break; | |
416 case Z80_IMMED_INDIRECT: | |
417 len += sprintf(dst+len, " (%d)", decoded->immed); | |
418 break; | |
419 } | |
420 if (decoded->reg != Z80_UNUSED) { | |
421 if (decoded->op == Z80_JRCC || decoded->op == Z80_JPCC || decoded->op == Z80_CALLCC || decoded->op == Z80_RETCC) { | |
422 len += sprintf(dst+len, "%s %s", decoded->reg == Z80_UNUSED ? "" : "," , z80_conditions[decoded->reg]); | |
423 } else { | |
424 len += sprintf(dst+len, "%s %s", decoded->reg == Z80_UNUSED ? "" : "," , z80_regs[decoded->reg]); | |
425 } | |
426 } | |
427 } else { | |
428 if (decoded->reg != Z80_UNUSED) { | |
429 if (decoded->op == Z80_JRCC || decoded->op == Z80_JPCC || decoded->op == Z80_CALLCC || decoded->op == Z80_RETCC) { | |
430 len += sprintf(dst+len, " %s", z80_conditions[decoded->reg]); | |
431 } else { | |
432 len += sprintf(dst+len, " %s", z80_regs[decoded->reg]); | |
433 } | |
434 } | |
435 switch (decoded->addr_mode) | |
436 { | |
437 case Z80_REG: | |
438 len += sprintf(dst+len, "%s %s", decoded->reg == Z80_UNUSED ? "" : "," , z80_regs[decoded->ea_reg]); | |
439 break; | |
440 case Z80_REG_INDIRECT: | |
441 len += sprintf(dst+len, "%s (%s)", decoded->reg == Z80_UNUSED ? "" : "," , z80_regs[decoded->ea_reg]); | |
442 break; | |
443 case Z80_IMMED: | |
444 len += sprintf(dst+len, "%s %d", decoded->reg == Z80_UNUSED ? "" : "," , decoded->immed); | |
445 break; | |
446 case Z80_IMMED_INDIRECT: | |
447 len += sprintf(dst+len, "%s (%d)", decoded->reg == Z80_UNUSED ? "" : "," , decoded->immed); | |
448 break; | |
449 } | |
450 } | |
451 return len; | |
452 } | |
453 |