1const OPCODE_MNEMONICS: [&str; 256] = [
2    "NOP",
3    "LD BC, nn",
4    "LD (BC), A",
5    "INC BC",
6    "INC B",
7    "DEC B",
8    "LD B, n",
9    "RLCA",
10    "EX AF, AF'",
11    "ADD HL, BC",
12    "LD A, (BC)",
13    "DEC BC",
14    "INC C",
15    "DEC C",
16    "LD C, n",
17    "RRCA",
18    "DJNZ d",
19    "LD DE, nn",
20    "LD (DE), A",
21    "INC DE",
22    "INC D",
23    "DEC D",
24    "LD D, n",
25    "RLA",
26    "JR d",
27    "ADD HL, DE",
28    "LD A, (DE)",
29    "DEC DE",
30    "INC E",
31    "DEC E",
32    "LD E, n",
33    "RRA",
34    "JR NZ, d",
35    "LD HL, nn",
36    "LD (nn), HL",
37    "INC HL",
38    "INC H",
39    "DEC H",
40    "LD H, n",
41    "DAA",
42    "JR Z, d",
43    "ADD HL, HL",
44    "LD HL, (nn)",
45    "DEC HL",
46    "INC L",
47    "DEC L",
48    "LD L, n",
49    "CPL",
50    "JR NC, d",
51    "LD SP, nn",
52    "LD (nn), A",
53    "INC SP",
54    "INC (HL)",
55    "DEC (HL)",
56    "LD (HL), n",
57    "SCF",
58    "JR C, d",
59    "ADD HL, SP",
60    "LD A, (nn)",
61    "DEC SP",
62    "INC A",
63    "DEC A",
64    "LD A, n",
65    "CCF",
66    "LD B, B",
67    "LD B, C",
68    "LD B, D",
69    "LD B, E",
70    "LD B, H",
71    "LD B, L",
72    "LD B, (HL)",
73    "LD B, A",
74    "LD C, B",
75    "LD C, C",
76    "LD C, D",
77    "LD C, E",
78    "LD C, H",
79    "LD C, L",
80    "LD C, (HL)",
81    "LD C, A",
82    "LD D, B",
83    "LD D, C",
84    "LD D, D",
85    "LD D, E",
86    "LD D, H",
87    "LD D, L",
88    "LD D, (HL)",
89    "LD D, A",
90    "LD E, B",
91    "LD E, C",
92    "LD E, D",
93    "LD E, E",
94    "LD E, H",
95    "LD E, L",
96    "LD E, (HL)",
97    "LD E, A",
98    "LD H, B",
99    "LD H, C",
100    "LD H, D",
101    "LD H, E",
102    "LD H, H",
103    "LD H, L",
104    "LD H, (HL)",
105    "LD H, A",
106    "LD L, B",
107    "LD L, C",
108    "LD L, D",
109    "LD L, E",
110    "LD L, H",
111    "LD L, L",
112    "LD L, (HL)",
113    "LD L, A",
114    "LD (HL), B",
115    "LD (HL), C",
116    "LD (HL), D",
117    "LD (HL), E",
118    "LD (HL), H",
119    "LD (HL), L",
120    "HALT",
121    "LD (HL), A",
122    "LD A, B",
123    "LD A, C",
124    "LD A, D",
125    "LD A, E",
126    "LD A, H",
127    "LD A, L",
128    "LD A, (HL)",
129    "LD A, A",
130    "ADD A, B",
131    "ADD A, C",
132    "ADD A, D",
133    "ADD A, E",
134    "ADD A, H",
135    "ADD A, L",
136    "ADD A, (HL)",
137    "ADD A, A",
138    "ADC A, B",
139    "ADC A, C",
140    "ADC A, D",
141    "ADC A, E",
142    "ADC A, H",
143    "ADC A, L",
144    "ADC A, (HL)",
145    "ADC A, A",
146    "SUB B",
147    "SUB C",
148    "SUB D",
149    "SUB E",
150    "SUB H",
151    "SUB L",
152    "SUB (HL)",
153    "SUB A",
154    "SBC A, B",
155    "SBC A, C",
156    "SBC A, D",
157    "SBC A, E",
158    "SBC A, H",
159    "SBC A, L",
160    "SBC A, (HL)",
161    "SBC A, A",
162    "AND B",
163    "AND C",
164    "AND D",
165    "AND E",
166    "AND H",
167    "AND L",
168    "AND (HL)",
169    "AND A",
170    "XOR B",
171    "XOR C",
172    "XOR D",
173    "XOR E",
174    "XOR H",
175    "XOR L",
176    "XOR (HL)",
177    "XOR A",
178    "OR B",
179    "OR C",
180    "OR D",
181    "OR E",
182    "OR H",
183    "OR L",
184    "OR (HL)",
185    "OR A",
186    "CP B",
187    "CP C",
188    "CP D",
189    "CP E",
190    "CP H",
191    "CP L",
192    "CP (HL)",
193    "CP A",
194    "RET NZ",
195    "POP BC",
196    "JP NZ, nn",
197    "JP nn",
198    "CALL NZ, nn",
199    "PUSH BC",
200    "ADD A, n",
201    "RST $00",
202    "RET Z",
203    "RET",
204    "JP Z, nn",
205    "(bit prefix)",
206    "CALL Z, nn",
207    "CALL nn",
208    "ADC A, n",
209    "RST $08",
210    "RET NC",
211    "POP DE",
212    "JP NC, nn",
213    "OUT (n), A",
214    "CALL NC, nn",
215    "PUSH DE",
216    "SUB n",
217    "RST $10",
218    "RET C",
219    "EXX",
220    "JP C, nn",
221    "IN A, (n)",
222    "CALL C, nn",
223    "(IX prefix)",
224    "SBC A, n",
225    "RST $18",
226    "RET PO",
227    "POP HL",
228    "JP PO, nn",
229    "EX (SP), HL",
230    "CALL PO, nn",
231    "PUSH HL",
232    "AND n",
233    "RST $20",
234    "RET PE",
235    "JP (HL)",
236    "JP PE, nn",
237    "EX DE, HL",
238    "CALL PE, nn",
239    "(ED prefix)",
240    "XOR n",
241    "RST $28",
242    "RET P",
243    "POP AF",
244    "JP P, nn",
245    "DI",
246    "CALL P, nn",
247    "PUSH AF",
248    "OR n",
249    "RST $30",
250    "RET M",
251    "LD SP, HL",
252    "JP M, nn",
253    "EI",
254    "CALL M, nn",
255    "(IY prefix)",
256    "CP n",
257    "RST $38",
258];
259
260pub fn for_opcode(opcode: u8, next: u8) -> &'static str {
261    match opcode {
262        0xED => match next {
263            0x40 => "IN B, (C)",
264            0x41 => "OUT (C), B",
265            0x42 => "SBC HL, BC",
266            0x43 => "LD (nn), BC",
267            0x44 => "NEG",
268            0x45 => "RETN",
269            0x46 => "IM 0",
270            0x47 => "LD I, A",
271            0x48 => "IN C, (C)",
272            0x49 => "OUT (C), C",
273            0x4A => "ADC HL, BC",
274            0x4B => "LD BC, (nn)",
275            0x4D => "RETI",
276            0x4F => "LD R, A",
277            0x50 => "IN D, (C)",
278            0x51 => "OUT (C), D",
279            0x52 => "SBC HL, DE",
280            0x53 => "LD (nn), DE",
281            0x56 => "IM 1",
282            0x57 => "LD A, I",
283            0x58 => "IN E, (C)",
284            0x59 => "OUT (C), E",
285            0x5A => "ADC HL, DE",
286            0x5B => "LD DE, (nn)",
287            0x5E => "IM 2",
288            0x5F => "LD A, R",
289            0x60 => "IN H, (C)",
290            0x61 => "OUT (C), H",
291            0x62 => "SBC HL, HL",
292            0x67 => "RRD",
293            0x68 => "IN L, (C)",
294            0x69 => "OUT (C), L",
295            0x6A => "ADC HL, HL",
296            0x6F => "RLD",
297            0x72 => "SBC HL, SP",
298            0x73 => "LD (nn), SP",
299            0x78 => "IN A, (C)",
300            0x79 => "OUT (C), A",
301            0x7A => "ADC HL, SP",
302            0x7B => "LD SP, (nn)",
303            0xA0 => "LDI",
304            0xA1 => "CPI",
305            0xA2 => "INI",
306            0xA3 => "OUTI",
307            0xA8 => "LDD",
308            0xA9 => "CPD",
309            0xAA => "IND",
310            0xAB => "OUTD",
311            0xB0 => "LDIR",
312            0xB1 => "CPIR",
313            0xB2 => "INIR",
314            0xB3 => "OTIR",
315            0xB8 => "LDDR",
316            0xB9 => "CPDR",
317            0xBA => "INDR",
318            0xBB => "OTDR",
319            _ => "unknown ED-prefixed opcode",
320        },
321        _ => OPCODE_MNEMONICS[opcode as usize],
322    }
323}