cpclib_asm/
disass.rs

1use crate::preamble::*;
2
3// Tables stolen from https://github.com/jeromelesaux/dsk/blob/master/desassembly.go
4// Note that these table do not all contain 256 values; I have added missing ones without checking if they are at the right place
5// replace eeee by nnnn
6
7/// TODO replace JR nn by JR $+nn in order to assemble even with current address is unknown
8
9pub const TABINSTRFDCB: [&str; 256] = [
10    "RLC (IY+nn), B",
11    "RLC (IY+nn), C",
12    "RLC (IY+nn), D",
13    "RLC (IY+nn), E",
14    "RLC (IY+nn), H",
15    "RLC (IY+nn), L",
16    "RLC (IY+nn)",
17    "RLC (IY+nn), A",
18    "RRC (IY+nn), B",
19    "RRC (IY+nn), C",
20    "RRC (IY+nn), D",
21    "RRC (IY+nn), E",
22    "RRC (IY+nn), H",
23    "RRC (IY+nn), L",
24    "RRC (IY+nn)",
25    "RRC (IY+nn), A",
26    "RL (IY+nn), B",
27    "RL (IY+nn), C",
28    "RL (IY+nn), D",
29    "RL (IY+nn), E",
30    "RL (IY+nn), H",
31    "RL (IY+nn), L",
32    "RL (IY+nn)",
33    "RL (IY+nn), A",
34    "RR (IY+nn), B",
35    "RR (IY+nn), C",
36    "RR (IY+nn), D",
37    "RR (IY+nn), E",
38    "RR (IY+nn), H",
39    "RR (IY+nn), L",
40    "RR (IY+nn)",
41    "RR (IY+nn), A",
42    "SLA (IY+nn),B",
43    "SLA (IY+nn),C",
44    "SLA (IY+nn),D",
45    "SLA (IY+nn),E",
46    "SLA (IY+nn),H",
47    "SLA (IY+nn),L",
48    "SLA (IY+nn)",
49    "SLA (IY+nn),A",
50    "SRA (IY+nn), B",
51    "SRA (IY+nn), C",
52    "SRA (IY+nn), D",
53    "SRA (IY+nn), E",
54    "SRA (IY+nn), H",
55    "SRA (IY+nn), L",
56    "SRA (IY+nn)",
57    "SRA (IY+nn), A",
58    "SL1 (IY+nn), B",
59    "SL1 (IY+nn), C",
60    "SL1 (IY+nn), D",
61    "SL1 (IY+nn), E",
62    "SL1 (IY+nn), H",
63    "SL1 (IY+nn), L",
64    "SL1 (IY+nn)",
65    "SL1 (IY+nn), A",
66    "SRL (IY+nn), B",
67    "SRL (IY+nn), C",
68    "SRL (IY+nn), D",
69    "SRL (IY+nn), E",
70    "SRL (IY+nn), H",
71    "SRL (IY+nn), L",
72    "SRL (IY+nn)",
73    "SRL (IY+nn), A",
74    "BIT 0,(IY+nn)",
75    "BIT 0,(IY+nn)",
76    "BIT 0,(IY+nn)",
77    "BIT 0,(IY+nn)",
78    "BIT 0,(IY+nn)",
79    "BIT 0,(IY+nn)",
80    "BIT 0,(IY+nn)",
81    "BIT 0,(IY+nn)",
82    "BIT 1,(IY+nn)",
83    "BIT 1,(IY+nn)",
84    "BIT 1,(IY+nn)",
85    "BIT 1,(IY+nn)",
86    "BIT 1,(IY+nn)",
87    "BIT 1,(IY+nn)",
88    "BIT 1,(IY+nn)",
89    "BIT 1,(IY+nn)",
90    "BIT 2,(IY+nn)",
91    "BIT 2,(IY+nn)",
92    "BIT 2,(IY+nn)",
93    "BIT 2,(IY+nn)",
94    "BIT 2,(IY+nn)",
95    "BIT 2,(IY+nn)",
96    "BIT 2,(IY+nn)",
97    "BIT 2,(IY+nn)",
98    "BIT 3,(IY+nn)",
99    "BIT 3,(IY+nn)",
100    "BIT 3,(IY+nn)",
101    "BIT 3,(IY+nn)",
102    "BIT 3,(IY+nn)",
103    "BIT 3,(IY+nn)",
104    "BIT 3,(IY+nn)",
105    "BIT 3,(IY+nn)",
106    "BIT 4,(IY+nn)",
107    "BIT 4,(IY+nn)",
108    "BIT 4,(IY+nn)",
109    "BIT 4,(IY+nn)",
110    "BIT 4,(IY+nn)",
111    "BIT 4,(IY+nn)",
112    "BIT 4,(IY+nn)",
113    "BIT 4,(IY+nn)",
114    "BIT 5,(IY+nn)",
115    "BIT 5,(IY+nn)",
116    "BIT 5,(IY+nn)",
117    "BIT 5,(IY+nn)",
118    "BIT 5,(IY+nn)",
119    "BIT 5,(IY+nn)",
120    "BIT 5,(IY+nn)",
121    "BIT 5,(IY+nn)",
122    "BIT 6,(IY+nn)",
123    "BIT 6,(IY+nn)",
124    "BIT 6,(IY+nn)",
125    "BIT 6,(IY+nn)",
126    "BIT 6,(IY+nn)",
127    "BIT 6,(IY+nn)",
128    "BIT 6,(IY+nn)",
129    "BIT 6,(IY+nn)",
130    "BIT 7,(IY+nn)",
131    "BIT 7,(IY+nn)",
132    "BIT 7,(IY+nn)",
133    "BIT 7,(IY+nn)",
134    "BIT 7,(IY+nn)",
135    "BIT 7,(IY+nn)",
136    "BIT 7,(IY+nn)",
137    "BIT 7,(IY+nn)",
138    "RES 0,(IY+nn), B",
139    "RES 0,(IY+nn), C",
140    "RES 0,(IY+nn), D",
141    "RES 0,(IY+nn), E",
142    "RES 0,(IY+nn), H",
143    "RES 0,(IY+nn), L",
144    "RES 0,(IY+nn)",
145    "RES 0,(IY+nn), A",
146    "RES 1,(IY+nn), B",
147    "RES 1,(IY+nn), C",
148    "RES 1,(IY+nn), D",
149    "RES 1,(IY+nn), E",
150    "RES 1,(IY+nn), H",
151    "RES 1,(IY+nn), L",
152    "RES 1,(IY+nn)",
153    "RES 1,(IY+nn), A",
154    "RES 2,(IY+nn), B",
155    "RES 2,(IY+nn), C",
156    "RES 2,(IY+nn), D",
157    "RES 2,(IY+nn), E",
158    "RES 2,(IY+nn), H",
159    "RES 2,(IY+nn), L",
160    "RES 2,(IY+nn)",
161    "RES 2,(IY+nn), A",
162    "RES 3,(IY+nn), B",
163    "RES 3,(IY+nn), C",
164    "RES 3,(IY+nn), D",
165    "RES 3,(IY+nn), E",
166    "RES 3,(IY+nn), H",
167    "RES 3,(IY+nn), L",
168    "RES 3,(IY+nn)",
169    "RES 3,(IY+nn), A",
170    "RES 4,(IY+nn), B",
171    "RES 4,(IY+nn), C",
172    "RES 4,(IY+nn), D",
173    "RES 4,(IY+nn), E",
174    "RES 4,(IY+nn), H",
175    "RES 4,(IY+nn), L",
176    "RES 4,(IY+nn)",
177    "RES 4,(IY+nn), A",
178    "RES 5,(IY+nn), B",
179    "RES 5,(IY+nn), C",
180    "RES 5,(IY+nn), D",
181    "RES 5,(IY+nn), E",
182    "RES 5,(IY+nn), H",
183    "RES 5,(IY+nn), L",
184    "RES 5,(IY+nn)",
185    "RES 5,(IY+nn), A",
186    "RES 6,(IY+nn), B",
187    "RES 6,(IY+nn), C",
188    "RES 6,(IY+nn), D",
189    "RES 6,(IY+nn), E",
190    "RES 6,(IY+nn), H",
191    "RES 6,(IY+nn), L",
192    "RES 6,(IY+nn)",
193    "RES 6,(IY+nn), A",
194    "RES 7,(IY+nn), B",
195    "RES 7,(IY+nn), C",
196    "RES 7,(IY+nn), D",
197    "RES 7,(IY+nn), E",
198    "RES 7,(IY+nn), H",
199    "RES 7,(IY+nn), L",
200    "RES 7,(IY+nn)",
201    "RES 7,(IY+nn), A",
202    "SET 0,(IY+nn), B",
203    "SET 0,(IY+nn), C",
204    "SET 0,(IY+nn), D",
205    "SET 0,(IY+nn), E",
206    "SET 0,(IY+nn), H",
207    "SET 0,(IY+nn), L",
208    "SET 0,(IY+nn)",
209    "SET 0,(IY+nn), A",
210    "SET 1,(IY+nn), B",
211    "SET 1,(IY+nn), C",
212    "SET 1,(IY+nn), D",
213    "SET 1,(IY+nn), E",
214    "SET 1,(IY+nn), H",
215    "SET 1,(IY+nn), L",
216    "SET 1,(IY+nn)",
217    "SET 1,(IY+nn), A",
218    "SET 2,(IY+nn), B",
219    "SET 2,(IY+nn), C",
220    "SET 2,(IY+nn), D",
221    "SET 2,(IY+nn), E",
222    "SET 2,(IY+nn), H",
223    "SET 2,(IY+nn), L",
224    "SET 2,(IY+nn)",
225    "SET 2,(IY+nn), A",
226    "SET 3,(IY+nn), B",
227    "SET 3,(IY+nn), C",
228    "SET 3,(IY+nn), D",
229    "SET 3,(IY+nn), E",
230    "SET 3,(IY+nn), H",
231    "SET 3,(IY+nn), L",
232    "SET 3,(IY+nn)",
233    "SET 3,(IY+nn), A",
234    "SET 4,(IY+nn), B",
235    "SET 4,(IY+nn), C",
236    "SET 4,(IY+nn), D",
237    "SET 4,(IY+nn), E",
238    "SET 4,(IY+nn), H",
239    "SET 4,(IY+nn), L",
240    "SET 4,(IY+nn)",
241    "SET 4,(IY+nn), A",
242    "SET 5,(IY+nn), B",
243    "SET 5,(IY+nn), C",
244    "SET 5,(IY+nn), D",
245    "SET 5,(IY+nn), E",
246    "SET 5,(IY+nn), H",
247    "SET 5,(IY+nn), L",
248    "SET 5,(IY+nn)",
249    "SET 5,(IY+nn), A",
250    "SET 6,(IY+nn), B",
251    "SET 6,(IY+nn), C",
252    "SET 6,(IY+nn), D",
253    "SET 6,(IY+nn), E",
254    "SET 6,(IY+nn), H",
255    "SET 6,(IY+nn), L",
256    "SET 6,(IY+nn)",
257    "SET 6,(IY+nn), A",
258    "SET 7,(IY+nn), B",
259    "SET 7,(IY+nn), C",
260    "SET 7,(IY+nn), D",
261    "SET 7,(IY+nn), E",
262    "SET 7,(IY+nn), H",
263    "SET 7,(IY+nn), L",
264    "SET 7,(IY+nn)",
265    "SET 7,(IY+nn), A"
266];
267
268pub const TABINSTRDDCB: [&str; 256] = [
269    "RLC (IX+nn), B",
270    "RLC (IX+nn), C",
271    "RLC (IX+nn), D",
272    "RLC (IX+nn), E",
273    "RLC (IX+nn), H",
274    "RLC (IX+nn), L",
275    "RLC (IX+nn)",
276    "RLC (IX+nn), A",
277    "RRC (IX+nn), B",
278    "RRC (IX+nn), C",
279    "RRC (IX+nn), D",
280    "RRC (IX+nn), E",
281    "RRC (IX+nn), H",
282    "RRC (IX+nn), L",
283    "RRC (IX+nn)",
284    "RRC (IX+nn), A",
285    "RL (IX+nn), B",
286    "RL (IX+nn), C",
287    "RL (IX+nn), D",
288    "RL (IX+nn), E",
289    "RL (IX+nn), H",
290    "RL (IX+nn), L",
291    "RL (IX+nn)",
292    "RL (IX+nn), A",
293    "RR (IX+nn), B",
294    "RR (IX+nn), C",
295    "RR (IX+nn), D",
296    "RR (IX+nn), E",
297    "RR (IX+nn), H",
298    "RR (IX+nn), L",
299    "RR (IX+nn)",
300    "RR (IX+nn), A",
301    "SLA (IX+nn),B",
302    "SLA (IX+nn),C",
303    "SLA (IX+nn),D",
304    "SLA (IX+nn),E",
305    "SLA (IX+nn),H",
306    "SLA (IX+nn),L",
307    "SLA (IX+nn)",
308    "SLA (IX+nn),A",
309    "SRA (IX+nn), B",
310    "SRA (IX+nn), C",
311    "SRA (IX+nn), D",
312    "SRA (IX+nn), E",
313    "SRA (IX+nn), H",
314    "SRA (IX+nn), L",
315    "SRA (IX+nn)",
316    "SRA (IX+nn), A",
317    "SL1 (IX+nn), B",
318    "SL1 (IX+nn), C",
319    "SL1 (IX+nn), D",
320    "SL1 (IX+nn), E",
321    "SL1 (IX+nn), H",
322    "SL1 (IX+nn), L",
323    "SL1 (IX+nn)",
324    "SL1 (IX+nn), A",
325    "SRL (IX+nn), B",
326    "SRL (IX+nn), C",
327    "SRL (IX+nn), D",
328    "SRL (IX+nn), E",
329    "SRL (IX+nn), H",
330    "SRL (IX+nn), L",
331    "SRL (IX+nn)",
332    "SRL (IX+nn), A",
333    "BIT 0,(IX+nn)",
334    "BIT 0,(IX+nn)",
335    "BIT 0,(IX+nn)",
336    "BIT 0,(IX+nn)",
337    "BIT 0,(IX+nn)",
338    "BIT 0,(IX+nn)",
339    "BIT 0,(IX+nn)",
340    "BIT 0,(IX+nn)",
341    "BIT 1,(IX+nn)",
342    "BIT 1,(IX+nn)",
343    "BIT 1,(IX+nn)",
344    "BIT 1,(IX+nn)",
345    "BIT 1,(IX+nn)",
346    "BIT 1,(IX+nn)",
347    "BIT 1,(IX+nn)",
348    "BIT 1,(IX+nn)",
349    "BIT 2,(IX+nn)",
350    "BIT 2,(IX+nn)",
351    "BIT 2,(IX+nn)",
352    "BIT 2,(IX+nn)",
353    "BIT 2,(IX+nn)",
354    "BIT 2,(IX+nn)",
355    "BIT 2,(IX+nn)",
356    "BIT 2,(IX+nn)",
357    "BIT 3,(IX+nn)",
358    "BIT 3,(IX+nn)",
359    "BIT 3,(IX+nn)",
360    "BIT 3,(IX+nn)",
361    "BIT 3,(IX+nn)",
362    "BIT 3,(IX+nn)",
363    "BIT 3,(IX+nn)",
364    "BIT 3,(IX+nn)",
365    "BIT 4,(IX+nn)",
366    "BIT 4,(IX+nn)",
367    "BIT 4,(IX+nn)",
368    "BIT 4,(IX+nn)",
369    "BIT 4,(IX+nn)",
370    "BIT 4,(IX+nn)",
371    "BIT 4,(IX+nn)",
372    "BIT 4,(IX+nn)",
373    "BIT 5,(IX+nn)",
374    "BIT 5,(IX+nn)",
375    "BIT 5,(IX+nn)",
376    "BIT 5,(IX+nn)",
377    "BIT 5,(IX+nn)",
378    "BIT 5,(IX+nn)",
379    "BIT 5,(IX+nn)",
380    "BIT 5,(IX+nn)",
381    "BIT 6,(IX+nn)",
382    "BIT 6,(IX+nn)",
383    "BIT 6,(IX+nn)",
384    "BIT 6,(IX+nn)",
385    "BIT 6,(IX+nn)",
386    "BIT 6,(IX+nn)",
387    "BIT 6,(IX+nn)",
388    "BIT 6,(IX+nn)",
389    "BIT 7,(IX+nn)",
390    "BIT 7,(IX+nn)",
391    "BIT 7,(IX+nn)",
392    "BIT 7,(IX+nn)",
393    "BIT 7,(IX+nn)",
394    "BIT 7,(IX+nn)",
395    "BIT 7,(IX+nn)",
396    "BIT 7,(IX+nn)",
397    "RES 0,(IX+nn), B",
398    "RES 0,(IX+nn), C",
399    "RES 0,(IX+nn), D",
400    "RES 0,(IX+nn), E",
401    "RES 0,(IX+nn), H",
402    "RES 0,(IX+nn), L",
403    "RES 0,(IX+nn)",
404    "RES 0,(IX+nn), A",
405    "RES 1,(IX+nn), B",
406    "RES 1,(IX+nn), C",
407    "RES 1,(IX+nn), D",
408    "RES 1,(IX+nn), E",
409    "RES 1,(IX+nn), H",
410    "RES 1,(IX+nn), L",
411    "RES 1,(IX+nn)",
412    "RES 1,(IX+nn), A",
413    "RES 2,(IX+nn), B",
414    "RES 2,(IX+nn), C",
415    "RES 2,(IX+nn), D",
416    "RES 2,(IX+nn), E",
417    "RES 2,(IX+nn), H",
418    "RES 2,(IX+nn), L",
419    "RES 2,(IX+nn)",
420    "RES 2,(IX+nn), A",
421    "RES 3,(IX+nn), B",
422    "RES 3,(IX+nn), C",
423    "RES 3,(IX+nn), D",
424    "RES 3,(IX+nn), E",
425    "RES 3,(IX+nn), H",
426    "RES 3,(IX+nn), L",
427    "RES 3,(IX+nn)",
428    "RES 3,(IX+nn), A",
429    "RES 4,(IX+nn), B",
430    "RES 4,(IX+nn), C",
431    "RES 4,(IX+nn), D",
432    "RES 4,(IX+nn), E",
433    "RES 4,(IX+nn), H",
434    "RES 4,(IX+nn), L",
435    "RES 4,(IX+nn)",
436    "RES 4,(IX+nn), A",
437    "RES 5,(IX+nn), B",
438    "RES 5,(IX+nn), C",
439    "RES 5,(IX+nn), D",
440    "RES 5,(IX+nn), E",
441    "RES 5,(IX+nn), H",
442    "RES 5,(IX+nn), L",
443    "RES 5,(IX+nn)",
444    "RES 5,(IX+nn), A",
445    "RES 6,(IX+nn), B",
446    "RES 6,(IX+nn), C",
447    "RES 6,(IX+nn), D",
448    "RES 6,(IX+nn), E",
449    "RES 6,(IX+nn), H",
450    "RES 6,(IX+nn), L",
451    "RES 6,(IX+nn)",
452    "RES 6,(IX+nn), A",
453    "RES 7,(IX+nn), B",
454    "RES 7,(IX+nn), C",
455    "RES 7,(IX+nn), D",
456    "RES 7,(IX+nn), E",
457    "RES 7,(IX+nn), H",
458    "RES 7,(IX+nn), L",
459    "RES 7,(IX+nn)",
460    "RES 7,(IX+nn), A",
461    "SET 0,(IX+nn), B",
462    "SET 0,(IX+nn), C",
463    "SET 0,(IX+nn), D",
464    "SET 0,(IX+nn), E",
465    "SET 0,(IX+nn), H",
466    "SET 0,(IX+nn), L",
467    "SET 0,(IX+nn)",
468    "SET 0,(IX+nn), A",
469    "SET 1,(IX+nn), B",
470    "SET 1,(IX+nn), C",
471    "SET 1,(IX+nn), D",
472    "SET 1,(IX+nn), E",
473    "SET 1,(IX+nn), H",
474    "SET 1,(IX+nn), L",
475    "SET 1,(IX+nn)",
476    "SET 1,(IX+nn), A",
477    "SET 2,(IX+nn), B",
478    "SET 2,(IX+nn), C",
479    "SET 2,(IX+nn), D",
480    "SET 2,(IX+nn), E",
481    "SET 2,(IX+nn), H",
482    "SET 2,(IX+nn), L",
483    "SET 2,(IX+nn)",
484    "SET 2,(IX+nn), A",
485    "SET 3,(IX+nn), B",
486    "SET 3,(IX+nn), C",
487    "SET 3,(IX+nn), D",
488    "SET 3,(IX+nn), E",
489    "SET 3,(IX+nn), H",
490    "SET 3,(IX+nn), L",
491    "SET 3,(IX+nn)",
492    "SET 3,(IX+nn), A",
493    "SET 4,(IX+nn), B",
494    "SET 4,(IX+nn), C",
495    "SET 4,(IX+nn), D",
496    "SET 4,(IX+nn), E",
497    "SET 4,(IX+nn), H",
498    "SET 4,(IX+nn), L",
499    "SET 4,(IX+nn)",
500    "SET 4,(IX+nn), A",
501    "SET 5,(IX+nn), B",
502    "SET 5,(IX+nn), C",
503    "SET 5,(IX+nn), D",
504    "SET 5,(IX+nn), E",
505    "SET 5,(IX+nn), H",
506    "SET 5,(IX+nn), L",
507    "SET 5,(IX+nn)",
508    "SET 5,(IX+nn), A",
509    "SET 6,(IX+nn), B",
510    "SET 6,(IX+nn), C",
511    "SET 6,(IX+nn), D",
512    "SET 6,(IX+nn), E",
513    "SET 6,(IX+nn), H",
514    "SET 6,(IX+nn), L",
515    "SET 6,(IX+nn)",
516    "SET 6,(IX+nn), A",
517    "SET 7,(IX+nn), B",
518    "SET 7,(IX+nn), C",
519    "SET 7,(IX+nn), D",
520    "SET 7,(IX+nn), E",
521    "SET 7,(IX+nn), H",
522    "SET 7,(IX+nn), L",
523    "SET 7,(IX+nn)",
524    "SET 7,(IX+nn), A"
525];
526
527pub const TABINSTRCB: [&str; 256] = [
528    "RLC B",
529    "RLC C",
530    "RLC D",
531    "RLC E",
532    "RLC H",
533    "RLC L",
534    "RLC (HL)",
535    "RLC A",
536    "RRC B",
537    "RRC C",
538    "RRC D",
539    "RRC E",
540    "RRC H",
541    "RRC L",
542    "RRC (HL)",
543    "RRC A",
544    "RL B",
545    "RL C",
546    "RL D",
547    "RL E",
548    "RL H",
549    "RL L",
550    "RL (HL)",
551    "RL A",
552    "RR B",
553    "RR C",
554    "RR D",
555    "RR E",
556    "RR H",
557    "RR L",
558    "RR (HL)",
559    "RR A",
560    "SLA B",
561    "SLA C",
562    "SLA D",
563    "SLA E",
564    "SLA H",
565    "SLA L",
566    "SLA (HL)",
567    "SLA A",
568    "SRA B",
569    "SRA C",
570    "SRA D",
571    "SRA E",
572    "SRA H",
573    "SRA L",
574    "SRA (HL)",
575    "SRA A",
576    "SL1 B",
577    "SL1 C",
578    "SL1 D",
579    "SL1 E",
580    "SL1 H",
581    "SL1 L",
582    "SL1 (HL)",
583    "SL1 A",
584    "SRL B",
585    "SRL C",
586    "SRL D",
587    "SRL E",
588    "SRL H",
589    "SRL L",
590    "SRL (HL)",
591    "SRL A",
592    "BIT 0,B",
593    "BIT 0,C",
594    "BIT 0,D",
595    "BIT 0,E",
596    "BIT 0,H",
597    "BIT 0,L",
598    "BIT 0,(HL)",
599    "BIT 0,A",
600    "BIT 1,B",
601    "BIT 1,C",
602    "BIT 1,D",
603    "BIT 1,E",
604    "BIT 1,H",
605    "BIT 1,L",
606    "BIT 1,(HL)",
607    "BIT 1,A",
608    "BIT 2,B",
609    "BIT 2,C",
610    "BIT 2,D",
611    "BIT 2,E",
612    "BIT 2,H",
613    "BIT 2,L",
614    "BIT 2,(HL)",
615    "BIT 2,A",
616    "BIT 3,B",
617    "BIT 3,C",
618    "BIT 3,D",
619    "BIT 3,E",
620    "BIT 3,H",
621    "BIT 3,L",
622    "BIT 3,(HL)",
623    "BIT 3,A",
624    "BIT 4,B",
625    "BIT 4,C",
626    "BIT 4,D",
627    "BIT 4,E",
628    "BIT 4,H",
629    "BIT 4,L",
630    "BIT 4,(HL)",
631    "BIT 4,A",
632    "BIT 5,B",
633    "BIT 5,C",
634    "BIT 5,D",
635    "BIT 5,E",
636    "BIT 5,H",
637    "BIT 5,L",
638    "BIT 5,(HL)",
639    "BIT 5,A",
640    "BIT 6,B",
641    "BIT 6,C",
642    "BIT 6,D",
643    "BIT 6,E",
644    "BIT 6,H",
645    "BIT 6,L",
646    "BIT 6,(HL)",
647    "BIT 6,A",
648    "BIT 7,B",
649    "BIT 7,C",
650    "BIT 7,D",
651    "BIT 7,E",
652    "BIT 7,H",
653    "BIT 7,L",
654    "BIT 7,(HL)",
655    "BIT 7,A",
656    "RES 0,B",
657    "RES 0,C",
658    "RES 0,D",
659    "RES 0,E",
660    "RES 0,H",
661    "RES 0,L",
662    "RES 0,(HL)",
663    "RES 0,A",
664    "RES 1,B",
665    "RES 1,C",
666    "RES 1,D",
667    "RES 1,E",
668    "RES 1,H",
669    "RES 1,L",
670    "RES 1,(HL)",
671    "RES 1,A",
672    "RES 2,B",
673    "RES 2,C",
674    "RES 2,D",
675    "RES 2,E",
676    "RES 2,H",
677    "RES 2,L",
678    "RES 2,(HL)",
679    "RES 2,A",
680    "RES 3,B",
681    "RES 3,C",
682    "RES 3,D",
683    "RES 3,E",
684    "RES 3,H",
685    "RES 3,L",
686    "RES 3,(HL)",
687    "RES 3,A",
688    "RES 4,B",
689    "RES 4,C",
690    "RES 4,D",
691    "RES 4,E",
692    "RES 4,H",
693    "RES 4,L",
694    "RES 4,(HL)",
695    "RES 4,A",
696    "RES 5,B",
697    "RES 5,C",
698    "RES 5,D",
699    "RES 5,E",
700    "RES 5,H",
701    "RES 5,L",
702    "RES 5,(HL)",
703    "RES 5,A",
704    "RES 6,B",
705    "RES 6,C",
706    "RES 6,D",
707    "RES 6,E",
708    "RES 6,H",
709    "RES 6,L",
710    "RES 6,(HL)",
711    "RES 6,A",
712    "RES 7,B",
713    "RES 7,C",
714    "RES 7,D",
715    "RES 7,E",
716    "RES 7,H",
717    "RES 7,L",
718    "RES 7,(HL)",
719    "RES 7,A",
720    "SET 0,B",
721    "SET 0,C",
722    "SET 0,D",
723    "SET 0,E",
724    "SET 0,H",
725    "SET 0,L",
726    "SET 0,(HL)",
727    "SET 0,A",
728    "SET 1,B",
729    "SET 1,C",
730    "SET 1,D",
731    "SET 1,E",
732    "SET 1,H",
733    "SET 1,L",
734    "SET 1,(HL)",
735    "SET 1,A",
736    "SET 2,B",
737    "SET 2,C",
738    "SET 2,D",
739    "SET 2,E",
740    "SET 2,H",
741    "SET 2,L",
742    "SET 2,(HL)",
743    "SET 2,A",
744    "SET 3,B",
745    "SET 3,C",
746    "SET 3,D",
747    "SET 3,E",
748    "SET 3,H",
749    "SET 3,L",
750    "SET 3,(HL)",
751    "SET 3,A",
752    "SET 4,B",
753    "SET 4,C",
754    "SET 4,D",
755    "SET 4,E",
756    "SET 4,H",
757    "SET 4,L",
758    "SET 4,(HL)",
759    "SET 4,A",
760    "SET 5,B",
761    "SET 5,C",
762    "SET 5,D",
763    "SET 5,E",
764    "SET 5,H",
765    "SET 5,L",
766    "SET 5,(HL)",
767    "SET 5,A",
768    "SET 6,B",
769    "SET 6,C",
770    "SET 6,D",
771    "SET 6,E",
772    "SET 6,H",
773    "SET 6,L",
774    "SET 6,(HL)",
775    "SET 6,A",
776    "SET 7,B",
777    "SET 7,C",
778    "SET 7,D",
779    "SET 7,E",
780    "SET 7,H",
781    "SET 7,L",
782    "SET 7,(HL)",
783    "SET 7,A"
784];
785
786pub const TABINSTRED: [&str; 256] = [
787    "",
788    "",
789    "",
790    "",
791    "",
792    "",
793    "",
794    "",
795    "",
796    "",
797    "",
798    "",
799    "",
800    "",
801    "",
802    "",
803    "",
804    "",
805    "",
806    "",
807    "",
808    "",
809    "",
810    "",
811    "",
812    "",
813    "",
814    "",
815    "",
816    "",
817    "",
818    "",
819    "",
820    "",
821    "",
822    "",
823    "",
824    "",
825    "",
826    "",
827    "",
828    "",
829    "",
830    "",
831    "",
832    "",
833    "",
834    "",
835    "",
836    "",
837    "",
838    "",
839    "",
840    "",
841    "",
842    "",
843    "",
844    "",
845    "",
846    "",
847    "",
848    "",
849    "",
850    "",
851    "IN B,(C)",
852    "OUT (C),B",
853    "SBC HL,BC",
854    "LD (nnnn),BC",
855    "NEG",
856    "RETN",
857    "IM 0",
858    "LD I,A",
859    "IN C,(C)",
860    "OUT (C),C",
861    "ADC HL,BC",
862    "LD BC,(nnnn)",
863    "NEG",
864    "RETI",
865    "IM 0",
866    "LD R,A",
867    "IN D,(C)",
868    "OUT (C),D",
869    "SBC HL,DE",
870    "LD (nnnn),DE",
871    "NEG",
872    "RETN",
873    "IM 1",
874    "LD A,I",
875    "IN E,(C)",
876    "OUT (C),E",
877    "ADC HL,DE",
878    "LD DE,(nnnn)",
879    "NEG",
880    "RETN",
881    "IM 2",
882    "LD A,R",
883    "IN H,(C)",
884    "OUT (C),H",
885    "SBC HL,HL",
886    "LD (nnnn), hl",
887    "NEG",
888    "RETN",
889    "IM 0",
890    "RRD",
891    "IN L,(C)",
892    "OUT (C),L",
893    "ADC HL,HL",
894    "LD HL, (nnnn)",
895    "NEG",
896    "RETN",
897    "IM 0",
898    "RLD",
899    "IN 0,(C)",
900    "OUT (C),0",
901    "SBC HL,SP",
902    "LD (nnnn),SP",
903    "NEG",
904    "RETN",
905    "IM 1",
906    "",
907    "IN A,(C)",
908    "OUT (C),A",
909    "ADC HL,SP",
910    "LD SP,(nnnn)",
911    "NEG",
912    "RET N",
913    "IM 2",
914    "",
915    "",
916    "",
917    "",
918    "",
919    "",
920    "",
921    "",
922    "",
923    "",
924    "",
925    "",
926    "",
927    "",
928    "",
929    "",
930    "",
931    "",
932    "",
933    "",
934    "",
935    "",
936    "",
937    "",
938    "",
939    "",
940    "",
941    "",
942    "",
943    "",
944    "",
945    "",
946    "",
947    "LDI",
948    "CPI",
949    "INI",
950    "OUTI",
951    "",
952    "",
953    "",
954    "",
955    "LDD",
956    "CPD",
957    "IND",
958    "OUTD",
959    "",
960    "",
961    "",
962    "",
963    "LDIR",
964    "CPIR",
965    "INIR",
966    "OTIR",
967    "",
968    "",
969    "",
970    "",
971    "LDDR",
972    "CPDR",
973    "INDR",
974    "OTDR",
975    "",
976    "",
977    "",
978    "",
979    "",
980    "",
981    "",
982    "",
983    "",
984    "",
985    "",
986    "",
987    "",
988    "",
989    "",
990    "",
991    "",
992    "",
993    "",
994    "",
995    "",
996    "",
997    "",
998    "",
999    "",
1000    "",
1001    "",
1002    "",
1003    "",
1004    "",
1005    "",
1006    "",
1007    "",
1008    "",
1009    "",
1010    "",
1011    "",
1012    "",
1013    "",
1014    "",
1015    "",
1016    "",
1017    "",
1018    "",
1019    "",
1020    "",
1021    "",
1022    "",
1023    "",
1024    "",
1025    "",
1026    "",
1027    "",
1028    "",
1029    "",
1030    "",
1031    "",
1032    "",
1033    "",
1034    "",
1035    "",
1036    "",
1037    "",
1038    "",
1039    "",
1040    "",
1041    "",
1042    ""
1043];
1044
1045pub const TABINSTRDD: [&str; 256] = [
1046    "",
1047    "",
1048    "",
1049    "",
1050    "",
1051    "",
1052    "",
1053    "",
1054    "",
1055    "ADD IX,BC",
1056    "",
1057    "",
1058    "",
1059    "",
1060    "",
1061    "",
1062    "",
1063    "",
1064    "",
1065    "",
1066    "",
1067    "",
1068    "",
1069    "",
1070    "",
1071    "ADD IX,DE",
1072    "",
1073    "",
1074    "",
1075    "",
1076    "",
1077    "",
1078    "",
1079    "LD IX,nnnn",
1080    "LD (nnnn),IX",
1081    "INC IX",
1082    "INC IXh",
1083    "DEC IXh",
1084    "LD IXh,nn",
1085    "",
1086    "",
1087    "ADD IX,IX",
1088    "LD IX,(nnnn)",
1089    "DEC IX", // ATTENTION ADD IX, HL does not exist and has been removed
1090    "INC IXl",
1091    "DEC IXl",
1092    "LD IXl,nn",
1093    "",
1094    "",
1095    "",
1096    "",
1097    "",
1098    "INC (IX+nn)",
1099    "DEC (IX+nn)",
1100    "LD (IX+nn),nn",
1101    "",
1102    "",
1103    "ADD IX,SP",
1104    "",
1105    "",
1106    "",
1107    "",
1108    "",
1109    "",
1110    "",
1111    "",
1112    "",
1113    "",
1114    "LD B,IXh",
1115    "LD B,IXl",
1116    "LD B,(IX+nn)",
1117    "",
1118    "",
1119    "",
1120    "",
1121    "",
1122    "LD C,IXh",
1123    "LD C,IXl",
1124    "LD C,(IX+nn)",
1125    "",
1126    "",
1127    "",
1128    "",
1129    "",
1130    "LD D,IXh",
1131    "LD D,IXl",
1132    "LD D,(IX+nn)",
1133    "",
1134    "",
1135    "",
1136    "",
1137    "",
1138    "LD E,IXh",
1139    "LD E,IXl",
1140    "LD E,(IX+nn)",
1141    "",
1142    "LD IXh,B",
1143    "LD IXh,C",
1144    "LD IXh,D",
1145    "LD IXh,E",
1146    "LD IXh,IXh",
1147    "LD IXh,IXl",
1148    "LD H,(IX+nn)",
1149    "LD IXh,A",
1150    "LD IXl,B",
1151    "LD IXl,C",
1152    "LD IXl,D",
1153    "LD IXl,E",
1154    "LD IXl,IXh",
1155    "LD IXl,IXl",
1156    "LD L,(IX+nn)",
1157    "LD IXl,A",
1158    "LD (IX+nn),B",
1159    "LD (IX+nn),C",
1160    "LD (IX+nn),D",
1161    "LD (IX+nn),E",
1162    "LD (IX+nn),H",
1163    "LD (IX+nn),L",
1164    "",
1165    "LD (IX+nn),A",
1166    "",
1167    "",
1168    "",
1169    "",
1170    "LD A,IXh",
1171    "LD A,IXl",
1172    "LD A,(IX+nn)",
1173    "",
1174    "",
1175    "",
1176    "",
1177    "",
1178    "ADD A,IXh",
1179    "ADD A,IXl",
1180    "ADD A,(IX+nn)",
1181    "",
1182    "",
1183    "",
1184    "",
1185    "",
1186    "ADC A,IXh",
1187    "ADC A,IXl",
1188    "ADC A,(IX+nn)",
1189    "",
1190    "",
1191    "",
1192    "",
1193    "",
1194    "SUB IXh",
1195    "SUB IXl",
1196    "SUB (IX+nn)",
1197    "",
1198    "",
1199    "",
1200    "",
1201    "",
1202    "SBC A,IXh",
1203    "SBC A,IXl",
1204    "SBC A,(IX+nn)",
1205    "",
1206    "",
1207    "",
1208    "",
1209    "",
1210    "AND IXh",
1211    "AND IXl",
1212    "AND (IX+nn)",
1213    "",
1214    "",
1215    "",
1216    "",
1217    "",
1218    "XOR IXh",
1219    "XOR IXl",
1220    "XOR (IX+nn)",
1221    "",
1222    "",
1223    "",
1224    "",
1225    "",
1226    "OR IXh",
1227    "OR IXl",
1228    "OR (IX+nn)",
1229    "",
1230    "",
1231    "",
1232    "",
1233    "",
1234    "CP IXh",
1235    "CP IXl",
1236    "CP (IX+nn)",
1237    "",
1238    "",
1239    "",
1240    "",
1241    "",
1242    "",
1243    "",
1244    "",
1245    "",
1246    "",
1247    "",
1248    "",
1249    "",
1250    "",
1251    "",
1252    "",
1253    "",
1254    "",
1255    "",
1256    "",
1257    "",
1258    "",
1259    "",
1260    "",
1261    "",
1262    "",
1263    "",
1264    "",
1265    "",
1266    "",
1267    "",
1268    "",
1269    "",
1270    "",
1271    "POP IX",
1272    "",
1273    "EX (SP),IX",
1274    "",
1275    "PUSH IX",
1276    "",
1277    "",
1278    "",
1279    "JP (IX)",
1280    "",
1281    "",
1282    "",
1283    "",
1284    "",
1285    "",
1286    "",
1287    "",
1288    "",
1289    "",
1290    "",
1291    "",
1292    "",
1293    "",
1294    "",
1295    "LD SP,IX",
1296    "",
1297    "",
1298    "",
1299    "",
1300    "",
1301    ""
1302];
1303
1304pub const TABINSTRFD: [&str; 256] = [
1305    "",
1306    "",
1307    "",
1308    "",
1309    "",
1310    "",
1311    "",
1312    "",
1313    "",
1314    "ADD IY,BC",
1315    "",
1316    "",
1317    "",
1318    "",
1319    "",
1320    "",
1321    "",
1322    "",
1323    "",
1324    "",
1325    "",
1326    "",
1327    "",
1328    "",
1329    "",
1330    "ADD IY,DE",
1331    "",
1332    "",
1333    "",
1334    "",
1335    "",
1336    "",
1337    "",
1338    "LD IY,nnnn",
1339    "LD (nnnn),IY",
1340    "INC IY",
1341    "INC IYh",
1342    "DEC IYh",
1343    "LD IYh,nn",
1344    "",
1345    "",
1346    "ADD IY,IY",
1347    "LD IY,(nnnn)",
1348    "DEC IY",
1349    "INC IYl",
1350    "DEC IYl",
1351    "LD IYl,nn",
1352    "", // Attention ADD IY, HL has been removed
1353    "",
1354    "",
1355    "",
1356    "",
1357    "INC (IY+nn)",
1358    "DEC (IY+nn)",
1359    "LD (IY+nn),nn",
1360    "",
1361    "",
1362    "ADD IY,SP",
1363    "",
1364    "",
1365    "",
1366    "",
1367    "",
1368    "",
1369    "",
1370    "",
1371    "",
1372    "",
1373    "LD B,IYh",
1374    "LD B,IYl",
1375    "LD B,(IY+nn)",
1376    "",
1377    "",
1378    "",
1379    "",
1380    "",
1381    "LD C,IYh",
1382    "LD C,IYl",
1383    "LD C,(IY+nn)",
1384    "",
1385    "",
1386    "",
1387    "",
1388    "",
1389    "LD D,IYh",
1390    "LD D,IYl",
1391    "LD D,(IY+nn)",
1392    "",
1393    "",
1394    "",
1395    "",
1396    "",
1397    "LD E,IYh",
1398    "LD E,IYl",
1399    "LD E,(IY+nn)",
1400    "",
1401    "LD IYh,B",
1402    "LD IYh,C",
1403    "LD IYh,D",
1404    "LD IYh,E",
1405    "LD IYh,IYh",
1406    "LD IYh,IYl",
1407    "LD H,(IY+nn)",
1408    "LD IYh,A",
1409    "LD IYl,B",
1410    "LD IYl,C",
1411    "LD IYl,D",
1412    "LD IYl,E",
1413    "LD IYl,IYh",
1414    "LD IYl,IYl",
1415    "LD L,(IY+nn)",
1416    "LD IYl,A",
1417    "LD (IY+nn),B",
1418    "LD (IY+nn),C",
1419    "LD (IY+nn),D",
1420    "LD (IY+nn),E",
1421    "LD (IY+nn),H",
1422    "LD (IY+nn),L",
1423    "",
1424    "LD (IY+nn),A",
1425    "",
1426    "",
1427    "",
1428    "",
1429    "LD A,IYh",
1430    "LD A,IYl",
1431    "LD A,(IY+nn)",
1432    "",
1433    "",
1434    "",
1435    "",
1436    "",
1437    "ADD A,IYh",
1438    "ADD A,IYl",
1439    "ADD A,(IY+nn)",
1440    "",
1441    "",
1442    "",
1443    "",
1444    "",
1445    "ADC A,IYh",
1446    "ADC A,IYl",
1447    "ADC A,(IY+nn)",
1448    "",
1449    "",
1450    "",
1451    "",
1452    "",
1453    "SUB IYh",
1454    "SUB IYl",
1455    "SUB (IY+nn)",
1456    "",
1457    "",
1458    "",
1459    "",
1460    "",
1461    "SBC A,IYh",
1462    "SBC A,IYl",
1463    "SBC A,(IY+nn)",
1464    "",
1465    "",
1466    "",
1467    "",
1468    "",
1469    "AND IYh",
1470    "AND IYl",
1471    "AND (IY+nn)",
1472    "",
1473    "",
1474    "",
1475    "",
1476    "",
1477    "XOR IYh",
1478    "XOR IYl",
1479    "XOR (IY+nn)",
1480    "",
1481    "",
1482    "",
1483    "",
1484    "",
1485    "OR IYh",
1486    "OR IYl",
1487    "OR (IY+nn)",
1488    "",
1489    "",
1490    "",
1491    "",
1492    "",
1493    "CP IYh",
1494    "CP IYl",
1495    "CP (IY+nn)",
1496    "",
1497    "",
1498    "",
1499    "",
1500    "",
1501    "",
1502    "",
1503    "",
1504    "",
1505    "",
1506    "",
1507    "",
1508    "",
1509    "",
1510    "",
1511    "",
1512    "",
1513    "",
1514    "",
1515    "",
1516    "",
1517    "",
1518    "",
1519    "",
1520    "",
1521    "",
1522    "",
1523    "",
1524    "",
1525    "",
1526    "",
1527    "",
1528    "",
1529    "",
1530    "POP IY",
1531    "",
1532    "EX (SP),IY",
1533    "",
1534    "PUSH IY",
1535    "",
1536    "",
1537    "",
1538    "JP (IY)",
1539    "",
1540    "",
1541    "",
1542    "",
1543    "",
1544    "",
1545    "",
1546    "",
1547    "",
1548    "",
1549    "",
1550    "",
1551    "",
1552    "",
1553    "",
1554    "LD SP,IY",
1555    "",
1556    "",
1557    "",
1558    "",
1559    "",
1560    ""
1561];
1562
1563pub const TABINSTR: [&str; 256] = [
1564    "NOP",
1565    "LD BC,nnnn",
1566    "LD (BC),A",
1567    "INC BC",
1568    "INC B",
1569    "DEC B",
1570    "LD B,nn",
1571    "RLCA",
1572    "EX AF,AF'",
1573    "ADD HL,BC",
1574    "LD A,(BC)",
1575    "DEC BC",
1576    "INC C",
1577    "DEC C",
1578    "LD C,nn",
1579    "RRCA",
1580    "DJNZ nn",
1581    "LD DE,nnnn",
1582    "LD (DE),A",
1583    "INC DE",
1584    "INC D",
1585    "DEC D",
1586    "LD D,nn",
1587    "RLA",
1588    "JR nn",
1589    "ADD HL,DE",
1590    "LD A,(DE)",
1591    "DEC DE",
1592    "INC E",
1593    "DEC E",
1594    "LD E,nn",
1595    "RRA",
1596    "JR NZ,nn",
1597    "LD HL,nnnn",
1598    "LD (nnnn),HL",
1599    "INC HL",
1600    "INC H",
1601    "DEC H",
1602    "LD H,nn",
1603    "DAA",
1604    "JR Z,nn",
1605    "ADD HL,HL",
1606    "LD HL,(nnnn)",
1607    "DEC HL",
1608    "INC L",
1609    "DEC L",
1610    "LD L,nn",
1611    "CPL",
1612    "JR NC,nn",
1613    "LD SP,nnnn",
1614    "LD (nnnn),A",
1615    "INC SP",
1616    "INC (HL)",
1617    "DEC (HL)",
1618    "LD (HL),nn",
1619    "SCF",
1620    "JR C,nn",
1621    "ADD HL,SP",
1622    "LD A,(nnnn)",
1623    "DEC SP",
1624    "INC A",
1625    "DEC A",
1626    "LD A,nn",
1627    "CCF",
1628    "LD B,B",
1629    "LD B,C",
1630    "LD B,D",
1631    "LD B,E",
1632    "LD B,H",
1633    "LD B,L",
1634    "LD B,(HL)",
1635    "LD B,A",
1636    "LD C,B",
1637    "LD C,C",
1638    "LD C,D",
1639    "LD C,E",
1640    "LD C,H",
1641    "LD C,L",
1642    "LD C,(HL)",
1643    "LD C,A",
1644    "LD D,B",
1645    "LD D,C",
1646    "LD D,D",
1647    "LD D,E",
1648    "LD D,H",
1649    "LD D,L",
1650    "LD D,(HL)",
1651    "LD D,A",
1652    "LD E,B",
1653    "LD E,C",
1654    "LD E,D",
1655    "LD E,E",
1656    "LD E,H",
1657    "LD E,L",
1658    "LD E,(HL)",
1659    "LD E,A",
1660    "LD H,B",
1661    "LD H,C",
1662    "LD H,D",
1663    "LD H,E",
1664    "LD H,H",
1665    "LD H,L",
1666    "LD H,(HL)",
1667    "LD H,A",
1668    "LD L,B",
1669    "LD L,C",
1670    "LD L,D",
1671    "LD L,E",
1672    "LD L,H",
1673    "LD L,L",
1674    "LD L,(HL)",
1675    "LD L,A",
1676    "LD (HL),B",
1677    "LD (HL),C",
1678    "LD (HL),D",
1679    "LD (HL),E",
1680    "LD (HL),H",
1681    "LD (HL),L",
1682    "HALT",
1683    "LD (HL),A",
1684    "LD A,B",
1685    "LD A,C",
1686    "LD A,D",
1687    "LD A,E",
1688    "LD A,H",
1689    "LD A,L",
1690    "LD A,(HL)",
1691    "LD A,A",
1692    "ADD A,B",
1693    "ADD A,C",
1694    "ADD A,D",
1695    "ADD A,E",
1696    "ADD A,H",
1697    "ADD A,L",
1698    "ADD A,(HL)",
1699    "ADD A,A",
1700    "ADC A,B",
1701    "ADC A,C",
1702    "ADC A,D",
1703    "ADC A,E",
1704    "ADC A,H",
1705    "ADC A,L",
1706    "ADC A,(HL)",
1707    "ADC A,A",
1708    "SUB B",
1709    "SUB C",
1710    "SUB D",
1711    "SUB E",
1712    "SUB H",
1713    "SUB L",
1714    "SUB (HL)",
1715    "SUB A",
1716    "SBC A,B",
1717    "SBC A,C",
1718    "SBC A,D",
1719    "SBC A,E",
1720    "SBC A,H",
1721    "SBC A,L",
1722    "SBC A,(HL)",
1723    "SBC A,A",
1724    "AND B",
1725    "AND C",
1726    "AND D",
1727    "AND E",
1728    "AND H",
1729    "AND L",
1730    "AND (HL)",
1731    "AND A",
1732    "XOR B",
1733    "XOR C",
1734    "XOR D",
1735    "XOR E",
1736    "XOR H",
1737    "XOR L",
1738    "XOR (HL)",
1739    "XOR A",
1740    "OR B",
1741    "OR C",
1742    "OR D",
1743    "OR E",
1744    "OR H",
1745    "OR L",
1746    "OR (HL)",
1747    "OR A",
1748    "CP B",
1749    "CP C",
1750    "CP D",
1751    "CP E",
1752    "CP H",
1753    "CP L",
1754    "CP (HL)",
1755    "CP A",
1756    "RET NZ",
1757    "POP BC",
1758    "JP NZ,nnnn",
1759    "JP nnnn",
1760    "CALL NZ,nnnn",
1761    "PUSH BC",
1762    "ADD A,nn",
1763    "RST 00",
1764    "RET Z",
1765    "RET",
1766    "JP Z,nnnn",
1767    "",
1768    "CALL Z,nnnn",
1769    "CALL nnnn",
1770    "ADC A,nn",
1771    "RST 08",
1772    "RET NC",
1773    "POP DE",
1774    "JP NC,nnnn",
1775    "OUT (nn),A",
1776    "CALL NC,nnnn",
1777    "PUSH DE",
1778    "SUB nn",
1779    "RST 10",
1780    "RET C",
1781    "EXX",
1782    "JP C,nnnn",
1783    "IN A,(nn)",
1784    "CALL C,nnnn",
1785    "",
1786    "SBC A,nn",
1787    "RST 18",
1788    "RET PO",
1789    "POP HL",
1790    "JP PO,nnnn",
1791    "EX (SP),HL", // PO and PE have been exchanged acoarding to Zack book and this page
1792    "CALL PO,nnnn",
1793    "PUSH HL",
1794    "AND nn",
1795    "RST 20",
1796    "RET PE",
1797    "JP (HL)",
1798    "JP PE,nnnn",
1799    "EX DE,HL",
1800    "CALL PE,nnnn",
1801    "",
1802    "XOR nn",
1803    "RST 28",
1804    "RET P",
1805    "POP AF",
1806    "JP P,nnnn",
1807    "DI",
1808    "CALL P,nnnn",
1809    "PUSH AF",
1810    "OR nn",
1811    "RST 30",
1812    "RET M",
1813    "LD SP,HL",
1814    "JP M,nnnn",
1815    "EI",
1816    "CALL M,nnnn",
1817    "",
1818    "CP nn",
1819    "RST 38"
1820];
1821
1822/// Generate a listing from the list of bytes. An error is generated if it is impossible to disassemble the flux
1823/// TODO really implement it
1824pub fn disassemble<'a>(mut bytes: &'a [u8]) -> Listing {
1825    let mut reverse_tokens = Vec::new();
1826
1827    // Generate a listing that contains the current token followed by tokens obtained from remaining bytes
1828    let mut continue_disassembling = |token: Token, bytes: &'a [u8]| {
1829        reverse_tokens.push(token);
1830        bytes
1831    };
1832
1833    while !bytes.is_empty() {
1834        bytes = match bytes {
1835            [] => unreachable!(),
1836
1837            // Current mnemonic is nop
1838            [0, rest @ ..] => continue_disassembling(nop(), rest),
1839
1840            [prefix, 0xCB, param, opcode, rest @ ..] if *prefix == 0xFD || *prefix == 0xDD => {
1841                let token = disassemble_with_one_argument(
1842                    *opcode,
1843                    *param,
1844                    if *prefix == 0xFD {
1845                        &TABINSTRFDCB
1846                    }
1847                    else {
1848                        &TABINSTRDDCB
1849                    }
1850                )
1851                .unwrap_or_else(|_| defb_elements(&[*prefix, 0xCB, *param, *opcode]));
1852                continue_disassembling(token, rest)
1853            },
1854
1855            [prefix, opcode, rest @ ..]
1856                if *prefix == 0xCB || *prefix == 0xED || *prefix == 0xDD || *prefix == 0xFD =>
1857            {
1858                let (token, rest) = disassemble_with_potential_argument(
1859                    *opcode,
1860                    match prefix {
1861                        0xCB => &TABINSTRCB,
1862                        0xED => &TABINSTRED,
1863                        0xDD => &TABINSTRDD,
1864                        0xFD => &TABINSTRFD,
1865                        _ => unreachable!()
1866                    },
1867                    rest
1868                )
1869                .unwrap_or_else(|_| (defb_elements(&[*prefix, *opcode]), rest));
1870                continue_disassembling(token, rest)
1871            },
1872
1873            [opcode, rest @ ..] => {
1874                let (token, rest) = disassemble_with_potential_argument(*opcode, &TABINSTR, rest)
1875                    .unwrap_or_else(|_| (defb(*opcode), rest));
1876                continue_disassembling(token, rest)
1877            }
1878        }
1879    }
1880
1881    // reverse_tokens.reverse();
1882    reverse_tokens.into()
1883}
1884
1885/// Manage the disassembling of the current instraction. However this instruction may need an argument.
1886/// For this reason the byte stream is provided to collect this argument if needed
1887pub fn disassemble_with_potential_argument<'stream>(
1888    opcode: u8,
1889    lut: &[&'static str; 256],
1890    bytes: &'stream [u8]
1891) -> Result<(Token, &'stream [u8]), String> {
1892    let representation: &'static str = lut[opcode as usize];
1893
1894    // get the first argument if any
1895    let (representation, bytes) = if representation.contains("nnnn") {
1896        let word = bytes[0] as u16 + 256 * (bytes[1] as u16);
1897        let representation = representation.replacen("nnnn", &format!("{:#03x}", word), 1);
1898        (representation, &bytes[2..])
1899    }
1900    else if representation.contains("nn") {
1901        let byte = bytes[0] as i8;
1902        let representation =
1903            if representation.starts_with("DJNZ") || representation.starts_with("JR") {
1904                let byte = byte as i16 + 2;
1905                if byte == 0 {
1906                    representation.replacen("nn", "$", 1)
1907                }
1908                else if byte < 0 {
1909                    representation.replacen("nn", &format!("-{}", byte.abs()), 1)
1910                }
1911                else {
1912                    representation.replacen("nn", &format!("+{}", byte.abs()), 1)
1913                }
1914            }
1915            else {
1916                representation.replacen("nn", &format!("{:#01x}", byte), 1)
1917            };
1918
1919        (representation.to_owned(), &bytes[1..])
1920    }
1921    else {
1922        (representation.to_owned(), bytes)
1923    };
1924
1925    // get the second argument if any
1926    let (representation, bytes) = if representation.contains("nn") {
1927        let byte = bytes[0];
1928        let representation = representation.replacen("nn", &format!("{:#01x}", byte), 1);
1929        (representation, &bytes[1..])
1930    }
1931    else {
1932        (representation, bytes)
1933    };
1934
1935    Ok((string_to_token(&representation)?, bytes))
1936}
1937
1938/// The 8bits argument has already been read
1939pub fn disassemble_with_one_argument(
1940    opcode: u8,
1941    argument: u8,
1942    lut: &[&'static str; 256]
1943) -> Result<Token, String> {
1944    let representation: &'static str = lut[opcode as usize];
1945    let representation = representation.replacen("nn", &format!("{:#01x}", argument), 1);
1946    string_to_token(&representation)
1947}
1948
1949/// No argument is expected
1950pub fn disassemble_without_argument(
1951    opcode: u8,
1952    lut: &[&'static str; 256]
1953) -> Result<Token, String> {
1954    let representation: &'static str = lut[opcode as usize];
1955    string_to_token(representation)
1956}
1957
1958/// Thje method never fails now => it generate a db opcode
1959pub fn string_to_token(representation: &str) -> Result<Token, String> {
1960    if representation.is_empty() {
1961        Err("Empty opcode".to_string())
1962    }
1963    else {
1964        Token::parse_token(representation)
1965    }
1966}
1967
1968#[cfg(test)]
1969mod test {
1970    use super::*;
1971
1972    #[test]
1973    fn disass_from_bytes() {
1974        assert_eq!("PUSH HL", disassemble(&[0xE5]).to_string().trim());
1975        assert_eq!("RES 0x3, E", disassemble(&[0xCB, 0x9B]).to_string().trim());
1976        assert_eq!(
1977            "SBC HL, DE",
1978            disassemble(&[0xED, 0b01010010]).to_string().trim()
1979        );
1980
1981        assert_eq!(
1982            "RLC (IX + 0x1)",
1983            disassemble(&[0xDD, 0xCB, 01, 06]).to_string().trim()
1984        );
1985        assert_eq!(
1986            "RLC (IX + 0x1), B",
1987            disassemble(&[0xDD, 0xCB, 01, 00]).to_string().trim()
1988        );
1989        assert_eq!(
1990            "RLC (IY + 0x2), C",
1991            disassemble(&[0xFD, 0xCB, 02, 01]).to_string().trim()
1992        );
1993    }
1994
1995    #[test]
1996    fn disass_instruction_with_arg() {
1997        assert_eq!(
1998            "CALL NZ, 0x123",
1999            disassemble(&[0xC4, 0x23, 0x01]).to_string().trim()
2000        );
2001        assert_eq!(
2002            "LD IX, (0x4321)",
2003            disassemble(&[0xDD, 0x2A, 0x21, 0x43]).to_string().trim()
2004        );
2005        assert_eq!(
2006            "LD (IX + 0x21), 0x43",
2007            disassemble(&[0xDD, 0x36, 0x21, 0x43]).to_string().trim()
2008        );
2009        assert_eq!(
2010            "BIT 0x6, (IX + 0x1)",
2011            disassemble(&[0xDD, 0xCB, 0x01, 0x76]).to_string().trim()
2012        );
2013    }
2014    // #[test]
2015    // fn disass_unknwon_opcode(){
2016    // assert!(disassemble(&[0xfd, 0x00]).is_err());
2017    // }
2018    //   #[test] // disable because incorrect test due to the several possible views of instructions
2019    fn disass_check_representation_equality() {
2020        disass_for_table_and_prefix(&TABINSTR, &[]);
2021        disass_for_table_and_prefix(&TABINSTRCB, &[0xCB]);
2022        disass_for_table_and_prefix(&TABINSTRDD, &[0xDD]);
2023        disass_for_table_and_prefix(&TABINSTRED, &[0xED]);
2024        disass_for_table_and_prefix(&TABINSTRFD, &[0xFD]);
2025
2026        disass_for_double_prefix(&TABINSTRFDCB, 0xFD, 0xCB);
2027        disass_for_double_prefix(&TABINSTRDDCB, 0xDD, 0xCB);
2028    }
2029
2030    fn disass_for_double_prefix(tab: &[&'static str; 256], first: u8, second: u8) {
2031        for code in 0..=255 {
2032            let repr = tab[code as usize];
2033
2034            if repr.is_empty() {
2035                continue;
2036            }
2037
2038            let repr = repr.replacen("nn", "0x12", 1);
2039            let expected_bytes = [first, second, 0x12, code];
2040
2041            let obtained = disassemble(&expected_bytes);
2042
2043            println!("{:?},{:?}, {:?}", repr, expected_bytes, obtained);
2044            assert_eq!(
2045                repr.replace(" ", "")
2046                    .replace("0x", "")
2047                    .replace("00", "0")
2048                    .replace("08", "8")
2049                    .to_uppercase(),
2050                obtained
2051                    .to_string()
2052                    .trim()
2053                    .replace(" ", "")
2054                    .replace("0x", "")
2055                    .to_uppercase()
2056            );
2057
2058            let mut env = Env::default();
2059            if let Token::OpCode(mnemonic, arg1, arg2, arg3) = &obtained.listing()[0] {
2060                let obtained_bytes =
2061                    assemble_opcode(*mnemonic, arg1, arg2, arg3, &mut env).unwrap();
2062                assert_eq!(&expected_bytes[..], &obtained_bytes[..]);
2063            }
2064            else {
2065                println!("ERROR, this is not a Token {:?}", obtained);
2066                assert!(false);
2067            }
2068        }
2069    }
2070    fn disass_for_table_and_prefix(tab: &[&'static str; 256], prefix: &[u8]) {
2071        // Concatenate list of list of bytes
2072        let merge = |list: &[&[u8]]| -> Vec<u8> {
2073            list.iter()
2074                .flat_map(|&bytes| bytes.iter())
2075                .copied()
2076                .collect()
2077        };
2078
2079        for code in 0..=255 {
2080            let repr = tab[code as usize];
2081
2082            if repr.is_empty() {
2083                continue;
2084            }
2085
2086            println!("0x{:x} : {}", code, repr);
2087
2088            // TODO add test for opcodes with operandes
2089            let (expected, bytes) = if repr.contains("nnnn") {
2090                (
2091                    repr.replace("nnnn", "0x3412"),
2092                    merge(&[prefix, &[code], &[0x12, 0x34]])
2093                )
2094            }
2095            else if repr.contains("nn") {
2096                let repr = repr.replacen("nn", "0x12", 1);
2097                let (repr, bytes) = if repr.contains("nn") {
2098                    (repr.replace("nn", "0x34"), [0x12, 0x34].to_vec())
2099                }
2100                else {
2101                    (repr, [0x12].to_vec())
2102                };
2103                (repr, merge(&[prefix, &[code], &bytes]))
2104            }
2105            else {
2106                (repr.to_owned(), merge(&[prefix, &[code]]))
2107            };
2108
2109            let obtained = disassemble(&bytes);
2110
2111            // check if disassembling provides the right value
2112            // alter strings in order to be able to compare them
2113            if !expected.contains("RST") && !expected.contains("DJNZ") && !expected.contains("JR") {
2114                assert_eq!(
2115                    expected
2116                        .replace(" ", "")
2117                        .replace("0x", "")
2118                        .replace("00", "0")
2119                        .replace("08", "8")
2120                        .to_uppercase(),
2121                    obtained
2122                        .to_string()
2123                        .trim()
2124                        .replace(" ", "")
2125                        .replace("0x", "")
2126                        .to_uppercase()
2127                );
2128            }
2129
2130            return; // the following code is deactivated as several instructions can be assembled with several bytecodes
2131                    // check if it is possible to assemble it
2132        /*            
2133            let mut env = Env::default();
2134            if let Token::OpCode(mnemonic, arg1, arg2, arg3) = &obtained.listing()[0] {
2135                // relative addresses are not properly managed
2136                if !(mnemonic.is_djnz() || mnemonic.is_jr()) {
2137                    let obtained_bytes =
2138                        assemble_opcode(*mnemonic, arg1, arg2, arg3, &mut env).unwrap();
2139                    assert_eq!(
2140                        &bytes[..],
2141                        &obtained_bytes[..],
2142                        "{:?}",
2143                        &obtained.listing()[0]
2144                    );
2145                }
2146            }
2147            else {
2148                println!("ERROR, this is not a Token {:?}", obtained);
2149                assert!(false);
2150            }
2151            */
2152        }
2153    }
2154}