summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/z8000/8000dasm.cpp
blob: a258a25ed92b8e062c37bda9e377c7982ae688df (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
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
// license:BSD-3-Clause
// copyright-holders:Juergen Buchmueller,Ernesto Corvi
/*****************************************************************************
 *
 *   8000dasm.c
 *   Portable Z8000(2) emulator
 *   Z8000 disassembler; requires the z8000_exec table to be initialized
 *
 *****************************************************************************/

#include "emu.h"
#include "8000dasm.h"

const z8000_disassembler::opcode z8000_disassembler::table[] = {
	{ 0x0000, 0xffff,  1, 1, ".word   %#w0",                    0 },

	{ 0x0000, 0x000f,  1, 2, "addb    %rb3,%#b3",               0 },
	{ 0x0010, 0x00ff,  1, 1, "addb    %rb3,@%rw2",              0 },
	{ 0x0100, 0x010f,  1, 2, "add     %rw3,%#w1",               0 },
	{ 0x0110, 0x01ff,  1, 1, "add     %rw3,@%rw2",              0 },
	{ 0x0200, 0x020f,  1, 2, "subb    %rb3,%#b3",               0 },
	{ 0x0210, 0x02ff,  1, 1, "subb    %rb3,@%rw2",              0 },
	{ 0x0300, 0x030f,  1, 2, "sub     %rw3,%#w1",               0 },
	{ 0x0310, 0x03ff,  1, 1, "sub     %rw3,@%rw2",              0 },
	{ 0x0400, 0x040f,  1, 2, "orb     %rb3,%#b3",               0 },
	{ 0x0410, 0x04ff,  1, 1, "orb     %rb3,@%rw2",              0 },
	{ 0x0500, 0x050f,  1, 2, "or      %rw3,%#w1",               0 },
	{ 0x0510, 0x05ff,  1, 1, "or      %rw3,@%rw2",              0 },
	{ 0x0600, 0x060f,  1, 2, "andb    %rb3,%#b3",               0 },
	{ 0x0610, 0x06ff,  1, 1, "andb    %rb3,@%rw2",              0 },
	{ 0x0700, 0x070f,  1, 2, "and     %rw3,%#w1",               0 },
	{ 0x0710, 0x07ff,  1, 1, "and     %rw3,@%rw2",              0 },
	{ 0x0800, 0x080f,  1, 2, "xorb    %rb3,%#b3",               0 },
	{ 0x0810, 0x08ff,  1, 1, "xorb    %rb3,@%rw2",              0 },
	{ 0x0900, 0x090f,  1, 2, "xor     %rw3,%#w1",               0 },
	{ 0x0910, 0x09ff,  1, 1, "xor     %rw3,@%rw2",              0 },
	{ 0x0a00, 0x0a0f,  1, 2, "cpb     %rb3,%#b3",               0 },
	{ 0x0a10, 0x0aff,  1, 1, "cpb     %rb3,@%rw2",              0 },
	{ 0x0b00, 0x0b0f,  1, 2, "cp      %rw3,%#w1",               0 },
	{ 0x0b10, 0x0bff,  1, 1, "cp      %rw3,@%rw2",              0 },
	{ 0x0c10, 0x0cf0, 16, 1, "comb    @%rw2",                   0 },
	{ 0x0c11, 0x0cf1, 16, 2, "cpb     @%rw2,%#b3",              0 },
	{ 0x0c12, 0x0cf2, 16, 1, "negb    @%rw2",                   0 },
	{ 0x0c14, 0x0cf4, 16, 1, "testb   @%rw2",                   0 },
	{ 0x0c15, 0x0cf5, 16, 2, "ldb     @%rw2,%#b3",              0 },
	{ 0x0c16, 0x0cf6, 16, 1, "tsetb   @%rw2",                   0 },
	{ 0x0c18, 0x0cf8, 16, 1, "clrb    @%rw2",                   0 },
	{ 0x0d10, 0x0df0, 16, 1, "com     @%rw2",                   0 },
	{ 0x0d11, 0x0df1, 16, 2, "cp      @%rw2,%#w1",              0 },
	{ 0x0d12, 0x0df2, 16, 1, "neg     @%rw2",                   0 },
	{ 0x0d14, 0x0df4, 16, 1, "test    @%rw2",                   0 },
	{ 0x0d15, 0x0df5, 16, 2, "ld      @%rw2,%#w1",              0 },
	{ 0x0d16, 0x0df6, 16, 1, "tset    @%rw2",                   0 },
	{ 0x0d18, 0x0df8, 16, 1, "clr     @%rw2",                   0 },
	{ 0x0d19, 0x0df9, 16, 2, "push    @%rw2,%#w1",              0 },
	{ 0x0e00, 0x0eff,  1, 1, "ext0e   %#b1",                    0 },
	{ 0x0f00, 0x0fff,  1, 1, "ext0f   %#b1",                    0 },
	{ 0x1000, 0x100f,  1, 3, "cpl     %rl3,%#l1",               0 },
	{ 0x1010, 0x10ff,  1, 1, "cpl     %rl3,@%rw2",              0 },
	{ 0x1111, 0x11ff,  1, 1, "pushl   @%rw2,@%rw3",             0 },
	{ 0x1200, 0x120f,  1, 3, "subl    %rl3,%#l1",               0 },
	{ 0x1210, 0x12ff,  1, 1, "subl    %rl3,@%rw2",              0 },
	{ 0x1311, 0x13ff,  1, 1, "push    @%rw2,@%rw3",             0 },
	{ 0x1400, 0x140f,  1, 3, "ldl     %rl3,%#l1",               0 },
	{ 0x1410, 0x14ff,  1, 1, "ldl     %rl3,@%rw2",              0 },
	{ 0x1511, 0x15ff,  1, 1, "popl    @%rw3,@%rw2",             0 },
	{ 0x1600, 0x160f,  1, 3, "addl    %rl3,%#l1",               0 },
	{ 0x1610, 0x16ff,  1, 1, "addl    %rl3,@%rw2",              0 },
	{ 0x1711, 0x17ff,  1, 1, "pop     @%rw3,@%rw2",             0 },
	{ 0x1800, 0x180f,  1, 1, "multl   %rq3,@%l#1",              0 },
	{ 0x1810, 0x18ff,  1, 1, "multl   %rq3,@%rw2",              0 },
	{ 0x1900, 0x190f,  1, 2, "mult    %rl3,%#w1",               0 },
	{ 0x1910, 0x19ff,  1, 1, "mult    %rl3,@%rw2",              0 },
	{ 0x1a00, 0x1a0f,  1, 3, "divl    %rq3,%#l1",               0 },
	{ 0x1a10, 0x1aff,  1, 1, "divl    %rq3,@%rw2",              0 },
	{ 0x1b00, 0x1b0f,  1, 2, "div     %rl3,%#w1",               0 },
	{ 0x1b10, 0x1bff,  1, 1, "div     %rl3,@%rw2",              0 },
	{ 0x1c11, 0x1cf1, 16, 2, "ldm     %rw5,@%rw2,#%n",          0 },
	{ 0x1c18, 0x1cf8, 16, 1, "testl   @%rw2",                   0 },
	{ 0x1c19, 0x1cf9, 16, 2, "ldm     @%rw2,%rw5,#%n",          0 },
	{ 0x1d10, 0x1dff,  1, 1, "ldl     @%rw2,%rl3",              0 },
	{ 0x1e10, 0x1eff,  1, 1, "jp      %c3,@%rl2",               0 },
	{ 0x1f10, 0x1ff0, 16, 1, "call    %rw2",                    STEP_OVER },
	{ 0x2000, 0x200f,  1, 2, "ldb     %rb3,%#b3",               0 },
	{ 0x2010, 0x20ff,  1, 1, "ldb     %rb3,@%rw2",              0 },
	{ 0x2100, 0x210f,  1, 2, "ld      %rw3,%#w1",               0 },
	{ 0x2110, 0x21ff,  1, 1, "ld      %rw3,@%rw2",              0 },
	{ 0x2200, 0x220f,  1, 2, "resb    %rb5,%rw3",               0 },
	{ 0x2210, 0x22ff,  1, 1, "resb    @%rw2,%3",                0 },
	{ 0x2300, 0x230f,  1, 2, "res     %rw5,%rw3",               0 },
	{ 0x2310, 0x23ff,  1, 1, "res     @%rw2,%3",                0 },
	{ 0x2400, 0x240f,  1, 2, "setb    %rb5,%rw3",               0 },
	{ 0x2410, 0x24ff,  1, 1, "setb    @%rw2,%3",                0 },
	{ 0x2500, 0x250f,  1, 2, "set     %rw5,%rw3",               0 },
	{ 0x2510, 0x25ff,  1, 1, "set     @%rw2,%3",                0 },
	{ 0x2600, 0x260f,  1, 2, "bitb    %rb5,%rw3",               0 },
	{ 0x2610, 0x26ff,  1, 1, "bitb    @%rw2,%3",                0 },
	{ 0x2700, 0x270f,  1, 2, "bit     %rw5,%rw3",               0 },
	{ 0x2710, 0x27ff,  1, 1, "bit     @%rw2,%3",                0 },
	{ 0x2810, 0x28ff,  1, 1, "incb    @%rw2,%+3",               0 },
	{ 0x2910, 0x29ff,  1, 1, "inc     @%rw2,%+3",               0 },
	{ 0x2a10, 0x2aff,  1, 1, "decb    @%rw2,%+3",               0 },
	{ 0x2b10, 0x2bff,  1, 1, "dec     @%rw2,%+3",               0 },
	{ 0x2c10, 0x2cff,  1, 1, "exb     %rb3,@%rw2",              0 },
	{ 0x2d10, 0x2dff,  1, 1, "ex      %rw3,@%rw2",              0 },
	{ 0x2e10, 0x2eff,  1, 1, "ldb     @%rw2,%rb3",              0 },
	{ 0x2f10, 0x2fff,  1, 1, "ld      @%rw2,%rw3",              0 },
	{ 0x3000, 0x300f,  1, 2, "ldrb    %rb3,%p1",                0 },
	{ 0x3010, 0x30ff,  1, 2, "ldb     %rb3,%rw2(%#w1)",         0 },
	{ 0x3100, 0x310f,  1, 2, "ldr     %rw3,%p1",                0 },
	{ 0x3110, 0x31ff,  1, 2, "ld      %rw3,%rw2(%#w1)",         0 },
	{ 0x3200, 0x320f,  1, 2, "ldrb    %p1,%rb3",                0 },
	{ 0x3210, 0x32ff,  1, 2, "ldb     %rw2(%#w1),%rb3",         0 },
	{ 0x3300, 0x330f,  1, 2, "ldr     %p1,%rw3",                0 },
	{ 0x3310, 0x33ff,  1, 2, "ld      %rw2(%#w1),%rw3",         0 },
	{ 0x3400, 0x340f,  1, 2, "ldar    p%rw3,%p1",               0 },
	{ 0x3410, 0x34ff,  1, 2, "lda     p%rw3,%rw2(%#w1)",        0 },
	{ 0x3500, 0x350f,  1, 2, "ldrl    %rl3,%p1",                0 },
	{ 0x3510, 0x35ff,  1, 2, "ldl     %rl3,%rw2(%#w1)",         0 },
	{ 0x3600, 0x3600,  1, 1, "bpt",                             0 },
	{ 0x3601, 0x36ff,  1, 1, "rsvd36",                          0 },
	{ 0x3700, 0x370f,  1, 2, "ldrl    %p1,%rl3",                0 },
	{ 0x3710, 0x37ff,  1, 2, "ldl     %rw2(%#w1),%rl3",         0 },
	{ 0x3800, 0x38ff,  1, 1, "rsvd38",                          0 },
	{ 0x3910, 0x39f0, 16, 1, "ldps    @%rw2",                   0 },
	{ 0x3a00, 0x3af0, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3a01, 0x3af1, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3a02, 0x3af2, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3a03, 0x3af3, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3a04, 0x3af4, 16, 2, "%R %rb2,%#w1",                    0 },
	{ 0x3a05, 0x3af5, 16, 2, "%R %rb2,%#w1",                    0 },
	{ 0x3a06, 0x3af6, 16, 2, "%R %#w1,%rb2",                    0 },
	{ 0x3a07, 0x3af7, 16, 2, "%R %#w1,%rb2",                    0 },
	{ 0x3a08, 0x3af8, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3a09, 0x3af9, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3a0a, 0x3afa, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3a0b, 0x3afb, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3b00, 0x3bf0, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3b01, 0x3bf1, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3b02, 0x3bf2, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3b03, 0x3bf3, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3b04, 0x3bf4, 16, 2, "%R %rw2,%#w1",                    0 },
	{ 0x3b05, 0x3bf5, 16, 2, "%R %rw2,%#w1",                    0 },
	{ 0x3b06, 0x3bf6, 16, 2, "%R %#w1,%rw2",                    0 },
	{ 0x3b07, 0x3bf7, 16, 2, "%R %#w1,%rw2",                    0 },
	{ 0x3b08, 0x3bf8, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3b09, 0x3bf9, 16, 2, "%R @%rw6,@%rw2,%rw5",             0 },
	{ 0x3b0a, 0x3bfa, 16, 2, "%R @%rw6,@%rw2,%rb5",             0 },
	{ 0x3b0b, 0x3bfb, 16, 2, "%R @%rw6,@%rw2,%rb5",             0 },
	{ 0x3c00, 0x3cff,  1, 1, "inb     %rb3,@%rw2",              0 },
	{ 0x3d00, 0x3dff,  1, 1, "in      %rw3,@%rw2",              0 },
	{ 0x3e00, 0x3eff,  1, 1, "outb    @%rw2,%rb3",              0 },
	{ 0x3f00, 0x3fff,  1, 1, "out     @%rw2,%rw3",              0 },
	{ 0x4000, 0x400f,  1, 2, "addb    %rb3,%a1",                0 },
	{ 0x4010, 0x40ff,  1, 2, "addb    %rb3,%a1(%rw2)",          0 },
	{ 0x4100, 0x410f,  1, 2, "add     %rw3,%a1",                0 },
	{ 0x4110, 0x41ff,  1, 2, "add     %rw3,%a1(%rw2)",          0 },
	{ 0x4200, 0x420f,  1, 2, "subb    %rb3,%a1",                0 },
	{ 0x4210, 0x42ff,  1, 2, "subb    %rb3,%a1(%rw2)",          0 },
	{ 0x4300, 0x430f,  1, 2, "sub     %rw3,%a1",                0 },
	{ 0x4310, 0x43ff,  1, 2, "sub     %rw3,%a1(%rw2)",          0 },
	{ 0x4400, 0x440f,  1, 2, "orb     %rb3,%a1",                0 },
	{ 0x4410, 0x44ff,  1, 2, "orb     %rb3,%a1(%rw2)",          0 },
	{ 0x4500, 0x450f,  1, 2, "or      %rw3,%a1",                0 },
	{ 0x4510, 0x45ff,  1, 2, "or      %rw3,%a1(%rw2)",          0 },
	{ 0x4600, 0x460f,  1, 2, "andb    %rb3,%a1",                0 },
	{ 0x4610, 0x46ff,  1, 2, "andb    %rb3,%a1(%rw2)",          0 },
	{ 0x4700, 0x470f,  1, 2, "and     %rw3,%a1",                0 },
	{ 0x4710, 0x47ff,  1, 2, "and     %rw3,%a1(%rw2)",          0 },
	{ 0x4800, 0x480f,  1, 2, "xorb    %rb3,%a1",                0 },
	{ 0x4810, 0x48ff,  1, 2, "xorb    %rb3,%a1(%rw2)",          0 },
	{ 0x4900, 0x490f,  1, 2, "xor     %rw3,%a1",                0 },
	{ 0x4910, 0x49ff,  1, 2, "xor     %rw3,%a1(%rw2)",          0 },
	{ 0x4a00, 0x4a0f,  1, 2, "cpb     %rb3,%a1",                0 },
	{ 0x4a10, 0x4aff,  1, 2, "cpb     %rb3,%a1(%rw2)",          0 },
	{ 0x4b00, 0x4b0f,  1, 2, "cp      %rw3,%a1",                0 },
	{ 0x4b10, 0x4bff,  1, 2, "cp      %rw3,%a1(%rw2)",          0 },
	{ 0x4c00, 0x4c00,  1, 2, "comb    %a1",                     0 },
	{ 0x4c01, 0x4c01,  1, 3, "cpb     %a1,%#b3",                0 },
	{ 0x4c02, 0x4c02,  1, 2, "negb    %a1",                     0 },
	{ 0x4c04, 0x4c04,  1, 2, "testb   %a1",                     0 },
	{ 0x4c05, 0x4c05,  1, 3, "ldb     %a1,%#b3",                0 },
	{ 0x4c06, 0x4c06,  1, 2, "tsetb   %a1",                     0 },
	{ 0x4c08, 0x4c08,  1, 2, "clrb    %a1",                     0 },
	{ 0x4c10, 0x4cf0, 16, 2, "comb    %a1(%rw2)",               0 },
	{ 0x4c11, 0x4cf1, 16, 3, "cpb     %a1(%rw2),%#b3",          0 },
	{ 0x4c12, 0x4cf2, 16, 2, "negb    %a1(%rw2)",               0 },
	{ 0x4c14, 0x4cf4, 16, 2, "testb   %a1(%rw2)",               0 },
	{ 0x4c15, 0x4cf5, 16, 3, "ldb     %a1(%rw2),%#b3",          0 },
	{ 0x4c16, 0x4cf6, 16, 2, "tsetb   %a1(%rw2)",               0 },
	{ 0x4c18, 0x4cf8, 16, 2, "clrb    %a1(%rw2)",               0 },
	{ 0x4d00, 0x4d00,  1, 2, "com     %a1",                     0 },
	{ 0x4d01, 0x4d01,  1, 3, "cp      %a1,%#w2",                0 },
	{ 0x4d02, 0x4d02,  1, 2, "neg     %a1",                     0 },
	{ 0x4d04, 0x4d04,  1, 2, "test    %a1",                     0 },
	{ 0x4d05, 0x4d05,  1, 3, "ld      %a1,%#w2",                0 },
	{ 0x4d06, 0x4d06,  1, 2, "tset    %a1",                     0 },
	{ 0x4d08, 0x4d08,  1, 2, "clr     %a1",                     0 },
	{ 0x4d10, 0x4df0, 16, 2, "com     %a1(%rw2)",               0 },
	{ 0x4d11, 0x4df1, 16, 3, "cp      %a1(%rw2),%#w2",          0 },
	{ 0x4d12, 0x4df2, 16, 2, "neg     %a1(%rw2)",               0 },
	{ 0x4d14, 0x4df4, 16, 2, "test    %a1(%rw2)",               0 },
	{ 0x4d15, 0x4df5, 16, 3, "ld      %a1(%rw2),%#w2",          0 },
	{ 0x4d16, 0x4df6, 16, 2, "tset    %a1(%rw2)",               0 },
	{ 0x4d18, 0x4df8, 16, 2, "clr     %a1(%rw2)",               0 },
	{ 0x4e11, 0x4ef0, 16, 2, "ldb     %a1(%rw2),%rb3",          0 },
	{ 0x5000, 0x500f,  1, 2, "cpl     %rl3,%a1",                0 },
	{ 0x5010, 0x50ff,  1, 2, "cpl     %rl3,%a1(%rw2)",          0 },
	{ 0x5110, 0x51f0, 16, 2, "pushl   @%rw2,%a1",               0 },
	{ 0x5111, 0x51f1, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x5112, 0x51f2, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x5113, 0x51f3, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x5114, 0x51f4, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x5115, 0x51f5, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x5116, 0x51f6, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x5117, 0x51f7, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x5118, 0x51f8, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x5119, 0x51f9, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x511a, 0x51fa, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x511b, 0x51fb, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x511c, 0x51fc, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x511d, 0x51fd, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x511e, 0x51fe, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x511f, 0x51ff, 16, 2, "pushl   @%rw2,%a1(%rw3)",         0 },
	{ 0x5200, 0x520f,  1, 2, "subl    %rl3,%a1",                0 },
	{ 0x5210, 0x52ff,  1, 2, "subl    %rl3,%a1(%rw2)",          0 },
	{ 0x5310, 0x53f0, 16, 2, "push    @%rw2,%a1",               0 },
	{ 0x5311, 0x53f1, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x5312, 0x53f2, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x5313, 0x53f3, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x5314, 0x53f4, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x5315, 0x53f5, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x5316, 0x53f6, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x5317, 0x53f7, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x5318, 0x53f8, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x5319, 0x53f9, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x531a, 0x53fa, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x531b, 0x53fb, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x531c, 0x53fc, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x531d, 0x53fd, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x531e, 0x53fe, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x531f, 0x53ff, 16, 2, "push    @%rw2,%a1(%rw3)",         0 },
	{ 0x5400, 0x540f,  1, 2, "ldl     %rl3,%a1",                0 },
	{ 0x5410, 0x54ff,  1, 2, "ldl     %rl3,%a1(%rw2)",          0 },
	{ 0x5510, 0x55f0, 16, 2, "popl    %a1,@%rw2",               0 },
	{ 0x5511, 0x55f1, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x5512, 0x55f2, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x5513, 0x55f3, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x5514, 0x55f4, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x5515, 0x55f5, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x5516, 0x55f6, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x5517, 0x55f7, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x5518, 0x55f8, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x5519, 0x55f9, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x551a, 0x55fa, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x551b, 0x55fb, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x551c, 0x55fc, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x551d, 0x55fd, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x551e, 0x55fe, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x551f, 0x55ff, 16, 2, "popl    %a1(%rw3),@%rw2",         0 },
	{ 0x5600, 0x560f,  1, 2, "addl    %rl3,%a1",                0 },
	{ 0x5610, 0x56ff,  1, 2, "addl    %rl3,%a1(%rw2)",          0 },
	{ 0x5710, 0x57f0, 16, 2, "pop     %a1,@%rw2",               0 },
	{ 0x5711, 0x57f1, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x5712, 0x57f2, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x5713, 0x57f3, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x5714, 0x57f4, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x5715, 0x57f5, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x5716, 0x57f6, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x5717, 0x57f7, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x5718, 0x57f8, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x5719, 0x57f9, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x571a, 0x57fa, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x571b, 0x57fb, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x571c, 0x57fc, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x571d, 0x57fd, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x571e, 0x57fe, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x571f, 0x57ff, 16, 2, "pop     %a1(%rw3),@%rw2",         0 },
	{ 0x5800, 0x580f,  1, 2, "multl   %rq3,%a1",                0 },
	{ 0x5810, 0x58ff,  1, 2, "multl   %rq3,%a1(%rw2)",          0 },
	{ 0x5900, 0x590f,  1, 2, "mult    %rl3,%a1",                0 },
	{ 0x5910, 0x59ff,  1, 2, "mult    %rl3,%a1(%rw2)",          0 },
	{ 0x5a00, 0x5a0f,  1, 2, "divl    %rq3,%a1",                0 },
	{ 0x5a10, 0x5aff,  1, 2, "divl    %rq3,%a1(%rw2)",          0 },
	{ 0x5b00, 0x5b0f,  1, 2, "div     %rl3,%a1",                0 },
	{ 0x5b10, 0x5bff,  1, 2, "div     %rl3,%a1(%rw2)",          0 },
	{ 0x5c01, 0x5c01,  1, 3, "ldm     %rw5,%a2,#%n",            0 },
	{ 0x5c08, 0x5c08,  1, 2, "testl   %a1",                     0 },
	{ 0x5c09, 0x5c09,  1, 3, "ldm     %a2,%rw5,#%n",            0 },
	{ 0x5c11, 0x5cf1, 16, 3, "ldm     %rw5,%a2(%rw2),#%n",      0 },
	{ 0x5c18, 0x5cf8, 16, 2, "testl   %a1(%rw2)",               0 },
	{ 0x5c19, 0x5cf9, 16, 3, "ldm     %a2(%rw2),%rw5,#%n",      0 },
	{ 0x5d00, 0x5d0f,  1, 2, "ldl     %a1,%rl3",                0 },
	{ 0x5d10, 0x5dff,  1, 2, "ldl     %a1(%rw2),%rl3",          0 },
	{ 0x5e00, 0x5e0f,  1, 2, "jp      %c3,%a1",                 0 },
	{ 0x5e10, 0x5eff,  1, 2, "jp      %c3,%a1(%rw2)",           0 },
	{ 0x5f00, 0x5f00,  1, 2, "call    %a1",                     STEP_OVER },
	{ 0x5f10, 0x5ff0, 16, 2, "call    %a1(%rw2)",               STEP_OVER },
	{ 0x6000, 0x600f,  1, 2, "ldb     %rb3,%a1",                0 },
	{ 0x6010, 0x60ff,  1, 2, "ldb     %rb3,%a1(%rw2)",          0 },
	{ 0x6100, 0x610f,  1, 2, "ld      %rw3,%a1",                0 },
	{ 0x6110, 0x61ff,  1, 2, "ld      %rw3,%a1(%rw2)",          0 },
	{ 0x6200, 0x620f,  1, 2, "resb    %a1,%3",                  0 },
	{ 0x6210, 0x62ff,  1, 2, "resb    %a1(%rw2),%3",            0 },
	{ 0x6300, 0x630f,  1, 2, "res     %a1,%3",                  0 },
	{ 0x6310, 0x63ff,  1, 2, "res     %a1(%rw2),%3",            0 },
	{ 0x6400, 0x640f,  1, 2, "setb    %a1,%3",                  0 },
	{ 0x6410, 0x64ff,  1, 2, "setb    %a1(%rw2),%3",            0 },
	{ 0x6500, 0x650f,  1, 2, "set     %a1,%3",                  0 },
	{ 0x6510, 0x65ff,  1, 2, "set     %a1(%rw2),%3",            0 },
	{ 0x6600, 0x660f,  1, 2, "bitb    %a1,%3",                  0 },
	{ 0x6610, 0x66ff,  1, 2, "bitb    %a1(%rw2),%3",            0 },
	{ 0x6700, 0x670f,  1, 2, "bit     %a1,%3",                  0 },
	{ 0x6710, 0x67ff,  1, 2, "bit     %a1(%rw2),%3",            0 },
	{ 0x6800, 0x680f,  1, 2, "incb    %a1,%+3",                 0 },
	{ 0x6810, 0x68ff,  1, 2, "incb    %a1(%rw2),%+3",           0 },
	{ 0x6900, 0x690f,  1, 2, "inc     %a1,%+3",                 0 },
	{ 0x6910, 0x69ff,  1, 2, "inc     %a1(%rw2),%+3",           0 },
	{ 0x6a00, 0x6a0f,  1, 2, "decb    %a1,%+3",                 0 },
	{ 0x6a10, 0x6aff,  1, 2, "decb    %a1(%rw2),%+3",           0 },
	{ 0x6b00, 0x6b0f,  1, 2, "dec     %a1,%+3",                 0 },
	{ 0x6b10, 0x6bff,  1, 2, "dec     %a1(%rw2),%+3",           0 },
	{ 0x6c00, 0x6c0f,  1, 2, "exb     %rb3,%a1",                0 },
	{ 0x6c10, 0x6cff,  1, 2, "exb     %rb3,%a1(%rw2)",          0 },
	{ 0x6d00, 0x6d0f,  1, 2, "ex      %rw3,%a1",                0 },
	{ 0x6d10, 0x6dff,  1, 2, "ex      %rw3,%a1(%rw2)",          0 },
	{ 0x6e00, 0x6e0f,  1, 2, "ldb     %a1,%rb3",                0 },
	{ 0x6e10, 0x6eff,  1, 2, "ldb     %a1(%rw2),%rb3",          0 },
	{ 0x6f00, 0x6f0f,  1, 2, "ld      %a1,%rw3",                0 },
	{ 0x6f10, 0x6fff,  1, 2, "ld      %a1(%rw2),%rw3",          0 },
	{ 0x7010, 0x70ff,  1, 2, "ldb     %rb3,%rw2(%rw5)",         0 },
	{ 0x7110, 0x71ff,  1, 2, "ld      %rw3,%rw2(%rw5)",         0 },
	{ 0x7210, 0x72ff,  1, 2, "ldb     %rw2(%rw5),%rb3",         0 },
	{ 0x7310, 0x73ff,  1, 2, "ld      %rw2(%rw5),%rw3",         0 },
	{ 0x7410, 0x74ff,  1, 2, "lda     p%rw3,%rw2(%rw5)",        0 },
	{ 0x7510, 0x75ff,  1, 2, "ldl     %rl3,%rw2(%rw5)",         0 },
	{ 0x7600, 0x760f,  1, 2, "lda     p%rw3,%a1",               0 },
	{ 0x7610, 0x76ff,  1, 2, "lda     p%rw3,%a1(%rw2)",         0 },
	{ 0x7710, 0x77ff,  1, 2, "ldl     %rw2(%rw5),%rl3",         0 },
	{ 0x7800, 0x78ff,  1, 1, "rsvd78",                          0 },
	{ 0x7900, 0x7900,  1, 2, "ldps    %a1",                     0 },
	{ 0x7910, 0x79f0, 16, 2, "ldps    %a1(%rw2)",               0 },
	{ 0x7a00, 0x7a00,  1, 1, "halt",                            STEP_OVER },
	{ 0x7b00, 0x7b00,  1, 1, "iret",                            STEP_OUT },
	{ 0x7b08, 0x7b08,  1, 1, "mset",                            0 },
	{ 0x7b09, 0x7b09,  1, 1, "mres",                            0 },
	{ 0x7b0a, 0x7b0a,  1, 1, "mbit",                            0 },
	{ 0x7b0d, 0x7bfd, 16, 1, "mreq    %rw2",                    0 },
	{ 0x7c00, 0x7c03,  1, 1, "di      %i3",                     0 },
	{ 0x7c04, 0x7c07,  1, 1, "ei      %i3",                     0 },
	{ 0x7d00, 0x7df0, 16, 1, "ldctl   %rw2,ctrl0",              0 },
	{ 0x7d01, 0x7df1, 16, 1, "ldctl   %rw2,ctrl1",              0 },
	{ 0x7d02, 0x7df2, 16, 1, "ldctl   %rw2,fcw",                0 },
	{ 0x7d03, 0x7df3, 16, 1, "ldctl   %rw2,refresh",            0 },
	{ 0x7d04, 0x7df4, 16, 1, "ldctl   %rw2,psapseg",            0 },
	{ 0x7d05, 0x7df5, 16, 1, "ldctl   %rw2,psapoff",            0 },
	{ 0x7d06, 0x7df6, 16, 1, "ldctl   %rw2,nspseg",             0 },
	{ 0x7d07, 0x7df7, 16, 1, "ldctl   %rw2,nspoff",             0 },
	{ 0x7d08, 0x7df8, 16, 1, "ldctl   ctrl0,%rw2",              0 },
	{ 0x7d09, 0x7df9, 16, 1, "ldctl   ctrl1,%rw2",              0 },
	{ 0x7d0a, 0x7dfa, 16, 1, "ldctl   fcw,%rw2",                0 },
	{ 0x7d0b, 0x7dfb, 16, 1, "ldctl   refresh,%rw2",            0 },
	{ 0x7d0c, 0x7dfc, 16, 1, "ldctl   psapseg,%rw2",            0 },
	{ 0x7d0d, 0x7dfd, 16, 1, "ldctl   psapoff,%rw2",            0 },
	{ 0x7d0e, 0x7dfe, 16, 1, "ldctl   nspseg,%rw2",             0 },
	{ 0x7d0f, 0x7dff, 16, 1, "ldctl   nspoff,%rw2",             0 },
	{ 0x7e00, 0x7eff,  1, 1, "rsvd7e  %#b1",                    0 },
	{ 0x7f00, 0x7fff,  1, 1, "sc      %#b1",                    STEP_OVER },
	{ 0x8000, 0x80ff,  1, 1, "addb    %rb3,%rb2",               0 },
	{ 0x8100, 0x81ff,  1, 1, "add     %rw3,%rw2",               0 },
	{ 0x8200, 0x82ff,  1, 1, "subb    %rb3,%rb2",               0 },
	{ 0x8300, 0x83ff,  1, 1, "sub     %rw3,%rw2",               0 },
	{ 0x8400, 0x84ff,  1, 1, "orb     %rb3,%rb2",               0 },
	{ 0x8500, 0x85ff,  1, 1, "or      %rw3,%rw2",               0 },
	{ 0x8600, 0x86ff,  1, 1, "andb    %rb3,%rb2",               0 },
	{ 0x8700, 0x87ff,  1, 1, "and     %rw3,%rw2",               0 },
	{ 0x8800, 0x88ff,  1, 1, "xorb    %rb3,%rb2",               0 },
	{ 0x8900, 0x89ff,  1, 1, "xor     %rw3,%rw2",               0 },
	{ 0x8a00, 0x8aff,  1, 1, "cpb     %rb3,%rb2",               0 },
	{ 0x8b00, 0x8bff,  1, 1, "cp      %rw3,%rw2",               0 },
	{ 0x8c00, 0x8cf0, 16, 1, "comb    %rb2",                    0 },
	{ 0x8c02, 0x8cf2, 16, 1, "negb    %rb2",                    0 },
	{ 0x8c04, 0x8cf4, 16, 1, "testb   %rb2",                    0 },
	{ 0x8c06, 0x8cf6, 16, 1, "tsetb   %rb2",                    0 },
	{ 0x8c01, 0x8cf1, 16, 1, "ldctlb  %rb2,flags",              0 },
	{ 0x8c08, 0x8cf8, 16, 1, "clrb    %rb2",                    0 },
	{ 0x8c09, 0x8cf9, 16, 1, "ldctlb  flags,%rb2",              0 },
	{ 0x8d00, 0x8df0, 16, 1, "com     %rw2",                    0 },
	{ 0x8d01, 0x8df1, 16, 1, "setflg  %f2",                     0 },
	{ 0x8d02, 0x8df2, 16, 1, "neg     %rw2",                    0 },
	{ 0x8d03, 0x8df3, 16, 1, "resflg  %f2",                     0 },
	{ 0x8d04, 0x8df4, 16, 1, "test    %rw2",                    0 },
	{ 0x8d05, 0x8df5, 16, 1, "comflg  %f2",                     0 },
	{ 0x8d06, 0x8df6, 16, 1, "tset    %rw2",                    0 },
	{ 0x8d07, 0x8d07,  1, 1, "nop",                             0 },
	{ 0x8d08, 0x8df8, 16, 1, "clr     %rw2",                    0 },
	{ 0x8e00, 0x8eff,  1, 1, "ext8e   %#b1",                    0 },
	{ 0x8f00, 0x8fff,  1, 1, "ext8f   %#b1",                    0 },
	{ 0x9000, 0x90ff,  1, 1, "cpl     %rl3,%rl2",               0 },
	{ 0x9110, 0x91ff,  1, 1, "pushl   @%rw2,%rl3",              0 },
	{ 0x9200, 0x92ff,  1, 1, "subl    %rl3,%rl2",               0 },
	{ 0x9310, 0x93ff,  1, 1, "push    @%rw2,%rw3",              0 },
	{ 0x9400, 0x94ff,  1, 1, "ldl     %rl3,%rl2",               0 },
	{ 0x9510, 0x95ff,  1, 1, "popl    %rl3,@%rw2",              0 },
	{ 0x9600, 0x96ff,  1, 1, "addl    %rl3,%rl2",               0 },
	{ 0x9710, 0x97ff,  1, 1, "pop     %rw3,@%rw2",              0 },
	{ 0x9800, 0x98ff,  1, 1, "multl   %rq3,%rl2",               0 },
	{ 0x9900, 0x99ff,  1, 1, "mult    %rl3,%rw2",               0 },
	{ 0x9a00, 0x9aff,  1, 1, "divl    %rq3,%rl2",               0 },
	{ 0x9b00, 0x9bff,  1, 1, "div     %rl3,%rw2",               0 },
	{ 0x9c00, 0x9cf8,  8, 1, "testl   %rl2",                    0 },
	{ 0x9d00, 0x9dff,  1, 1, "rsvd9d",                          0 },
	{ 0x9e00, 0x9e0f,  1, 1, "ret     %c3",                     STEP_OUT },
	{ 0x9f00, 0x9fff,  1, 1, "rsvd9f",                          0 },
	{ 0xa000, 0xa0ff,  1, 1, "ldb     %rb3,%rb2",               0 },
	{ 0xa100, 0xa1ff,  1, 1, "ld      %rw3,%rw2",               0 },
	{ 0xa200, 0xa2ff,  1, 1, "resb    %rb2,%3",                 0 },
	{ 0xa300, 0xa3ff,  1, 1, "res     %rw2,%3",                 0 },
	{ 0xa400, 0xa4ff,  1, 1, "setb    %rb2,%3",                 0 },
	{ 0xa500, 0xa5ff,  1, 1, "set     %rw2,%3",                 0 },
	{ 0xa600, 0xa6ff,  1, 1, "bitb    %rb2,%3",                 0 },
	{ 0xa700, 0xa7ff,  1, 1, "bit     %rw2,%3",                 0 },
	{ 0xa800, 0xa8ff,  1, 1, "incb    %rb2,%+3",                0 },
	{ 0xa900, 0xa9ff,  1, 1, "inc     %rw2,%+3",                0 },
	{ 0xaa00, 0xaaff,  1, 1, "decb    %rb2,%+3",                0 },
	{ 0xab00, 0xabff,  1, 1, "dec     %rw2,%+3",                0 },
	{ 0xac00, 0xacff,  1, 1, "exb     %rb3,%rb2",               0 },
	{ 0xad00, 0xadff,  1, 1, "ex      %rw3,%rw2",               0 },
	{ 0xae00, 0xaeff,  1, 1, "tccb    %c3,%rb2",                0 },
	{ 0xaf00, 0xafff,  1, 1, "tcc     %c3,%rw2",                0 },
	{ 0xb000, 0xb0f0, 16, 1, "dab     %rb2",                    0 },
	{ 0xb100, 0xb1f0, 16, 1, "extsb   %rw2",                    0 },
	{ 0xb107, 0xb1f7, 16, 1, "extsl   %rq2",                    0 },
	{ 0xb10a, 0xb1fa, 16, 1, "exts    %rl2",                    0 },
	{ 0xb200, 0xb2f0, 16, 1, "rlb     %rb2,%?3",                0 },
	{ 0xb201, 0xb2f1, 16, 2, "s%*lb    %rb2,%$3",               0 },
	{ 0xb202, 0xb2f2, 16, 1, "rlb     %rb2,%?3",                0 },
	{ 0xb203, 0xb2f3, 16, 2, "sdlb    %rb2,%rw5",               0 },
	{ 0xb204, 0xb2f4, 16, 1, "rrb     %rb2,%?3",                0 },
	{ 0xb206, 0xb2f6, 16, 1, "rrb     %rb2,%?3",                0 },
	{ 0xb208, 0xb2f8, 16, 1, "rlcb    %rb2,%?3",                0 },
	{ 0xb209, 0xb2f9, 16, 2, "s%*ab    %rb2,%$3",               0 },
	{ 0xb20a, 0xb2fa, 16, 1, "rlcb    %rb2,%?3",                0 },
	{ 0xb20b, 0xb2fb, 16, 2, "sdab    %rb2,%rw5",               0 },
	{ 0xb20c, 0xb2fc, 16, 1, "rrcb    %rb2,%?3",                0 },
	{ 0xb20e, 0xb2fe, 16, 1, "rrcb    %rb2,%?3",                0 },
	{ 0xb300, 0xb3f0, 16, 1, "rl      %rw2,%?3",                0 },
	{ 0xb301, 0xb3f1, 16, 2, "s%*l     %rw2,%$3",               0 },
	{ 0xb302, 0xb3f2, 16, 1, "rl      %rw2,%?3",                0 },
	{ 0xb303, 0xb3f3, 16, 2, "sdl     %rw2,%rw5",               0 },
	{ 0xb304, 0xb3f4, 16, 1, "rr      %rw2,%?3",                0 },
	{ 0xb305, 0xb3f5, 16, 2, "s%*ll    %rl2,%$3",               0 },
	{ 0xb306, 0xb3f6, 16, 1, "rr      %rw2,%?3",                0 },
	{ 0xb307, 0xb3f7, 16, 2, "sdll    %rl2,%rw5",               0 },
	{ 0xb308, 0xb3f8, 16, 1, "rlc     %rw2,%?3",                0 },
	{ 0xb309, 0xb3f9, 16, 2, "s%*a     %rw2,%$3",               0 },
	{ 0xb30a, 0xb3fa, 16, 1, "rlc     %rw2,%?3",                0 },
	{ 0xb30b, 0xb3fb, 16, 2, "sda     %rw2,%rw5",               0 },
	{ 0xb30c, 0xb3fc, 16, 1, "rrc     %rw2,%?3",                0 },
	{ 0xb30d, 0xb3fd, 16, 2, "s%*al    %rl2,%$3",               0 },
	{ 0xb30e, 0xb3fe, 16, 1, "rrc     %rw2,%?3",                0 },
	{ 0xb30f, 0xb3ff, 16, 2, "sdal    %rl2,%rw5",               0 },
	{ 0xb400, 0xb4ff,  1, 1, "adcb    %rb3,%rb2",               0 },
	{ 0xb500, 0xb5ff,  1, 1, "adc     %rw3,%rw2",               0 },
	{ 0xb600, 0xb6ff,  1, 1, "sbcb    %rb3,%rb2",               0 },
	{ 0xb700, 0xb7ff,  1, 1, "sbc     %rw3,%rw2",               0 },
	{ 0xb810, 0xb8f0, 16, 2, "trib    @%rw2,@%rw6,%rb5",        0 },
	{ 0xb812, 0xb8f2, 16, 2, "trtib   @%rw2,@%rw6,%rb5",        0 },
	{ 0xb814, 0xb8f4, 16, 2, "trirb   @%rw2,@%rw6,%rb5",        0 },
	{ 0xb816, 0xb8f6, 16, 2, "trtirb  @%rw2,@%rw6,%rb5",        0 },
	{ 0xb818, 0xb8f8, 16, 2, "trdb    @%rw2,@%rw6,%rb5",        0 },
	{ 0xb81a, 0xb8fa, 16, 2, "trtrb   @%rw2,@%rw6,%rb5",        0 },
	{ 0xb81c, 0xb8fc, 16, 2, "trdrb   @%rw2,@%rw6,%rb5",        0 },
	{ 0xb81e, 0xb8fe, 16, 2, "trtdrb  @%rw2,@%rw6,%rb5",        0 },
	{ 0xb900, 0xb9ff, 16, 1, "rsvdb9",                          0 },
	{ 0xba10, 0xbaf0, 16, 2, "cpib    %rb6,@%rw2,%rw5,%c7",     0 },
	{ 0xba11, 0xbaf1, 16, 2, "ldirb   @%rw6,@%rw2,%rw5",        STEP_OVER },
	{ 0xba12, 0xbaf2, 16, 2, "cpsib   @%rw6,@%rw2,%rw5,%c7",    0 },
	{ 0xba14, 0xbaf4, 16, 2, "cpirb   %rb6,@%rw2,%rw5,%c7",     STEP_OVER },
	{ 0xba16, 0xbaf6, 16, 2, "cpsirb  @%rw6,@%rw2,%rw5,%c7",    STEP_OVER },
	{ 0xba18, 0xbaf8, 16, 2, "cpdb    %rb6,@%rw2,%rw5,%c7",     0 },
	{ 0xba19, 0xbaf9, 16, 2, "lddrb   @%rw2,@%rw6,%rw5",        STEP_OVER },
	{ 0xba1a, 0xbafa, 16, 2, "cpsdb   @%rw6,@%rw2,%rw5,%c7",    0 },
	{ 0xba1c, 0xbafc, 16, 2, "cpdrb   %rb6,@%rw2,%rw5,%c7",     STEP_OVER },
	{ 0xba1e, 0xbafe, 16, 2, "cpsdrb  @%rw6,@%rw2,%rw5,%c7",    STEP_OVER },
	{ 0xbb10, 0xbbf0, 16, 2, "cpi     %rw6,@%rw2,%rw5,%c7",     0 },
	{ 0xbb11, 0xbbf1, 16, 2, "ldir    @%rw6,@%rw2,%rw5",        STEP_OVER },
	{ 0xbb12, 0xbbf2, 16, 2, "cpsi    @%rw6,@%rw2,%rw5,%c7",    0 },
	{ 0xbb14, 0xbbf4, 16, 2, "cpir    %rw6,@%rw2,%rw5,%c7",     STEP_OVER },
	{ 0xbb16, 0xbbf6, 16, 2, "cpsir   @%rw6,@%rw2,%rw5,%c7",    STEP_OVER },
	{ 0xbb18, 0xbbf8, 16, 2, "cpd     %rw6,@%rw2,%rw5,%c7",     0 },
	{ 0xbb19, 0xbbf9, 16, 2, "lddr    @%rw2,@%rw6,%rw5",        STEP_OVER },
	{ 0xbb1a, 0xbbfa, 16, 2, "cpsd    @%rw6,@%rw2,%rw5,%c7",    0 },
	{ 0xbb1c, 0xbbfc, 16, 2, "cpdr    %rw6,@%rw2,%rw5,%c7",     STEP_OVER },
	{ 0xbb1e, 0xbbfe, 16, 2, "cpsdr   @%rw6,@%rw2,%rw5,%c7",    STEP_OVER },
	{ 0xbc00, 0xbcff,  1, 1, "rrdb    %rb3,%rb2",               0 },
	{ 0xbd00, 0xbdff,  1, 1, "ldk     %rw2,%3",                 0 },
	{ 0xbe00, 0xbeff,  1, 1, "rldb    %rb3,%rb2",               0 },
	{ 0xbf00, 0xbfff,  1, 1, "rsvdbf",                          0 },
	{ 0xc000, 0xcfff,  1, 1, "ldb     %rb1,%#b1",               0 },
	{ 0xd000, 0xdfff,  1, 1, "calr    %d2",                     STEP_OVER },
	{ 0xe000, 0xefff,  1, 1, "jr      %c1,%d1",                 0 },
	{ 0xf000, 0xf07f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xf100, 0xf17f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xf200, 0xf27f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xf300, 0xf37f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xf400, 0xf47f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xf500, 0xf57f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xf600, 0xf67f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xf700, 0xf77f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xf800, 0xf87f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xf900, 0xf97f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xfa00, 0xfa7f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xfb00, 0xfb7f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xfc00, 0xfc7f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xfd00, 0xfd7f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xfe00, 0xfe7f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xff00, 0xff7f,  1, 1, "dbjnz   %rb1,%d0",                STEP_OVER },
	{ 0xf080, 0xf0ff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xf180, 0xf1ff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xf280, 0xf2ff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xf380, 0xf3ff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xf480, 0xf4ff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xf580, 0xf5ff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xf680, 0xf6ff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xf780, 0xf7ff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xf880, 0xf8ff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xf980, 0xf9ff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xfa80, 0xfaff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xfb80, 0xfbff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xfc80, 0xfcff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xfd80, 0xfdff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xfe80, 0xfeff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0xff80, 0xffff,  1, 1, "djnz    %rw1,%d0",                STEP_OVER },
	{ 0,      0,       0, 0, nullptr,                            0}
};

z8000_disassembler::z8000_disassembler(config *conf) : m_config(conf)
{
	for (const opcode *opc = table; opc->size; opc++)
		for (u32 val = opc->beg; val <= opc->end; val += opc->step)
			oplist[val] = opc - table;
}


void z8000_disassembler::get_op(const data_buffer &opcodes, int i, offs_t &new_pc, u16 *w, u8 *b, u8 *n)
{
	uint16_t opcode = opcodes.r16(new_pc);
	w[i] = opcode;
	b[i*2+0] = opcode >> 8;
	b[i*2+1] = opcode & 0xff;
	n[i*4+0] = (opcode >> 12) & 0x0f;
	n[i*4+1] = (opcode >> 8) & 0x0f;
	n[i*4+2] = (opcode >> 4) & 0x0f;
	n[i*4+3] = opcode & 0x0f;
	new_pc += 2;
}

const char *const z8000_disassembler::cc[16] = {
	"n",   "lt",  "le",  "ule",  "pe/ov",   "mi",  "eq/z",   "c/ult",
	"a",   "ge",  "gt",  "ugt",  "po/nov",  "pl",  "ne/nz",  "nc/uge"
};

const char *const z8000_disassembler::flg[16] = {
	"",    "p/v",  "s",   "p/v,s",   "z",   "p/v,z",  "s,z",  "p/v,s,z",
	"c",   "p/v,c","s,c", "p/v,s,c", "z,c", "p/v,z,c","s,z,c","p/v,s,z,c"
};

const char *const z8000_disassembler::ints[4] = {
	"",    "vi",  "nvi",   "vi,nvi"
};

u32 z8000_disassembler::opcode_alignment() const
{
	return 2;
}

offs_t z8000_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
{
	u8 n[16];   /* opcode nibbles */
	u8 b[8];    /* opcode bytes */
	u16 w[4];    /* opcode words */

	offs_t new_pc = pc, i, j, tmp;
	const char *src;
	uint32_t flags = 0;
	uint32_t old_w;

	get_op(opcodes, 0, new_pc, w, b, n);
	switch (pc)
	{
		case 0x0000:
			util::stream_format(stream, ".word   #%%%04x ;RST", w[0]);
			break;
		case 0x0002:
			util::stream_format(stream, ".word   #%%%04x ;RST FCW", w[0]);
			break;
		case 0x0004:
			util::stream_format(stream, ".word   #%%%04x ;RST PC", w[0]);
			break;
		default:
		{
			const opcode &o = table[oplist[w[0]]];
			if (o.size > 1)
				get_op(opcodes, 1, new_pc, w, b, n);
			if (o.size > 2)
				get_op(opcodes, 2, new_pc, w, b, n);
			src = o.dasm;
			flags = o.dasmflags;

			while (*src)
			{
				if (*src == '%')
				{
					src++;
					switch (*src) {
					case '0': case '1': case '2': case '3':
					case '4': case '5': case '6': case '7':
						/* nibble number */
						i = *src++ - '0';
						util::stream_format(stream, "%d", n[i]);
						break;
					case '#':
						/* immediate */
						src++;
						switch (*src++) {
							case 'b': /* imm8 (byte) */
								i = *src++ - '0';
								util::stream_format(stream, "#%%%02x", b[i]);
								break;
							case 'w': /* imm16 (word) */
								i = *src++ - '0';
								util::stream_format(stream, "#%%%04x", w[i]);
								break;
							case 'l': /* imm32 (long) */
								i = *src++ - '0';
								util::stream_format(stream, "#%%%04x%04x", w[i], w[i+1]);
								break;
						}
						break;
					case '$':
						/* absolute immediate 8bit (rl/rr) */
						src++;
						i = *src++ - '0';
						util::stream_format(stream, "#%d", ((int8_t)b[i]<0) ? -(int8_t)b[i] : b[i]);
						break;
					case '+':
						/* imm4m1 (inc/dec value) */
						src++;
						i = *src++ - '0';
						util::stream_format(stream, "%i", n[i] + 1);
						break;
					case '*':
						/* left/right (rotate/shift) */
						src++;
						util::stream_format(stream, "%c", b[2] ? 'r' : 'l');
						break;
					case '?':
						/* imm1or2 (shift/rotate once or twice) */
						src++;
						i = *src++ - '0';
						util::stream_format(stream, "%c", (n[i] & 2) ? '2' : '1');
						break;
					case 'R':
						src++;
						//tmp = ((n[1] & 0x01) << 16) + (n[3] << 8) + (n[7] & 0x08);
						tmp = ((n[1] & 0x01) << 8) + (n[3] << 4) + (n[7] & 0x08);
						switch (tmp)
						{
							case 0x000: util::stream_format(stream, "inirb "); flags = STEP_OVER; break;
							case 0x008: util::stream_format(stream, "inib  "); break;
							case 0x010: util::stream_format(stream, "sinirb"); flags = STEP_OVER; break;
							case 0x018: util::stream_format(stream, "sinib "); break;
							case 0x020: util::stream_format(stream, "otirb "); flags = STEP_OVER; break;
							case 0x028: util::stream_format(stream, "outib "); break;
							case 0x030: util::stream_format(stream, "soutib"); break;
							case 0x038: util::stream_format(stream, "sotirb"); flags = STEP_OVER; break;
							case 0x040: util::stream_format(stream, "inb   "); break;
							case 0x048: util::stream_format(stream, "inb   "); break;
							case 0x050: util::stream_format(stream, "sinb  "); break;
							case 0x058: util::stream_format(stream, "sinb  "); break;
							case 0x060: util::stream_format(stream, "outb  "); break;
							case 0x068: util::stream_format(stream, "outb  "); break;
							case 0x070: util::stream_format(stream, "soutb "); break;
							case 0x078: util::stream_format(stream, "soutb "); break;
							case 0x080: util::stream_format(stream, "indrb "); flags = STEP_OVER; break;
							case 0x088: util::stream_format(stream, "indb  "); break;
							case 0x090: util::stream_format(stream, "sindrb"); flags = STEP_OVER; break;
							case 0x098: util::stream_format(stream, "sindb "); break;
							case 0x0a0: util::stream_format(stream, "otdrb "); flags = STEP_OVER; break;
							case 0x0a8: util::stream_format(stream, "outdb "); break;
							case 0x0b0: util::stream_format(stream, "soutdb"); break;
							case 0x0b8: util::stream_format(stream, "sotdrb"); flags = STEP_OVER; break;
							case 0x100: util::stream_format(stream, "inir  "); flags = STEP_OVER; break;
							case 0x108: util::stream_format(stream, "ini   "); break;
							case 0x110: util::stream_format(stream, "sinir "); flags = STEP_OVER; break;
							case 0x118: util::stream_format(stream, "sini  "); break;
							case 0x120: util::stream_format(stream, "otir  "); flags = STEP_OVER; break;
							case 0x128: util::stream_format(stream, "outi  "); break;
							case 0x130: util::stream_format(stream, "souti "); break;
							case 0x138: util::stream_format(stream, "sotir "); flags = STEP_OVER; break;
							case 0x140: util::stream_format(stream, "in    "); break;
							case 0x148: util::stream_format(stream, "in    "); break;
							case 0x150: util::stream_format(stream, "sin   "); break;
							case 0x158: util::stream_format(stream, "sin   "); break;
							case 0x160: util::stream_format(stream, "out   "); break;
							case 0x168: util::stream_format(stream, "out   "); break;
							case 0x170: util::stream_format(stream, "sout  "); break;
							case 0x178: util::stream_format(stream, "sout  "); break;
							case 0x180: util::stream_format(stream, "indr  "); flags = STEP_OVER; break;
							case 0x188: util::stream_format(stream, "ind   "); break;
							case 0x190: util::stream_format(stream, "sindr "); flags = STEP_OVER; break;
							case 0x198: util::stream_format(stream, "sind  "); break;
							case 0x1a0: util::stream_format(stream, "otdr  "); flags = STEP_OVER; break;
							case 0x1a8: util::stream_format(stream, "outd  "); break;
							case 0x1b0: util::stream_format(stream, "soutd "); break;
							case 0x1b8: util::stream_format(stream, "sotdr "); flags = STEP_OVER; break;
							default:
								util::stream_format(stream, "unk(0x%x)", tmp);
						}
						break;
					case 'a':
						/* address */
						src++;
						i = *src++ - '0';
						if (m_config->get_segmented_mode()) {
							if (w[i] & 0x8000) {
								old_w = w[i];
								for (j = i; j < o.size; j++)
									w[j] = w[j + 1];
								get_op(opcodes, o.size - 1, new_pc, w, b, n);
								w[i] = ((old_w & 0x7f00) << 16) | (w[i] & 0xffff);
							}
							else {
								w[i] = ((w[i] & 0x7f00) << 16) | (w[i] & 0xff);
							}
							util::stream_format(stream, "<%%%02X>%%%04X", (w[i] >> 24) & 0xff, w[i] & 0xffff);
						}
						else util::stream_format(stream, "%%%04x", w[i]);
						break;
					case 'c':
						/* condition code */
						src++;
						i = *src++ - '0';
						if (n[i] == 8) {    /* always? */
							/* skip following comma */
							if (*src == ',')
								src++;
						}
						else util::stream_format(stream, "%s", cc[n[i]]);
						break;
					case 'd':
						/* displacement */
						src++;
						i = *src++ - '0';
						switch (i) {
							case 0: /* disp7 */
								tmp = new_pc - 2 * (w[0] & 0x7f);
								break;
							case 1: /* disp8 */
								tmp = new_pc + 2 * (int8_t)(w[0] & 0xff);
								break;
							case 2: /* disp12 */
								tmp = w[0] & 0x7ff;
								if (w[0] & 0x800)
									tmp = new_pc + 0x1000 -2 * tmp;
								else
									tmp = new_pc + -2 * tmp;
								break;
							default:
								tmp = 0;
								abort();
						}
						if (m_config->get_segmented_mode())
							util::stream_format(stream, "<%%%02X>%%%04X", (tmp >> 16) & 0xff, tmp & 0xffff);
						else
							util::stream_format(stream, "%%%04x", tmp);
						break;
					case 'f':
						/* flag (setflg/resflg/comflg) */
						src++;
						i = *src++ - '0';
						util::stream_format(stream, "%s", flg[n[i]]);
						break;
					case 'i':
						/* interrupts */
						src++;
						i = *src++ - '0';
						util::stream_format(stream, "%s", ints[n[i] & 3]);
						break;
					case 'n':
						/* register count for ldm */
						src++;
						util::stream_format(stream, "%d", n[7] + 1);
						break;
					case 'p':
						/* disp16 (pc relative) */
						src++;
						i = *src++ - '0';
						util::stream_format(stream, "%%%04x", new_pc + w[i]);
						break;
					case 'r':
						/* register */
						src++;
						switch (*src++) {
							case 'b':
								/* byte */
								i = *src++ - '0';
								if (n[i] & 8)
									util::stream_format(stream, "rl%d", n[i] & 7);
								else
									util::stream_format(stream, "rh%d", n[i]);
								break;
							case 'w':
								/* word */
								i = *src++ - '0';
								util::stream_format(stream, "r%d", n[i]);
								break;
							case 'l':
								/* long */
								i = *src++ - '0';
								util::stream_format(stream, "rr%d", n[i]);
								break;
							case 'q':
								/* quad word (long long) */
								i = *src++ - '0';
								util::stream_format(stream, "rq%d", n[i]);
								break;
						}
						break;
					default:
						stream << '%' << *src++;
						break;
					}
				} else stream << *src++;
			}
		}
		break;
	}
	return (new_pc - pc) | flags | SUPPORTED;
}