Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/yabause/src/m68kd.c
2 views
1
/* Copyright 2005 Theo Berkau
2
3
This file is part of Yabause.
4
5
Yabause is free software; you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation; either version 2 of the License, or
8
(at your option) any later version.
9
10
Yabause is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
14
15
You should have received a copy of the GNU General Public License
16
along with Yabause; if not, write to the Free Software
17
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
*/
19
20
#include "core.h"
21
#include "m68kd.h"
22
#include "scsp.h" // for c68k_word_read()
23
24
typedef struct
25
{
26
u16 mask;
27
u16 inst;
28
const char *name;
29
int (*disasm)(u32, u16, char *);
30
} m68kdis_struct;
31
32
//////////////////////////////////////////////////////////////////////////////
33
34
static int setsizestr(u16 size, char *outstring)
35
{
36
switch (size & 0x3)
37
{
38
case 0x1:
39
return sprintf(outstring, ".b ");
40
case 0x3:
41
return sprintf(outstring, ".w ");
42
case 0x2:
43
return sprintf(outstring, ".l ");
44
default:
45
return sprintf(outstring, " ");
46
}
47
}
48
49
//////////////////////////////////////////////////////////////////////////////
50
51
static int setsizestr2(u16 size, char *outstring)
52
{
53
switch (size & 0x3)
54
{
55
case 0x0:
56
return sprintf(outstring, ".b ");
57
case 0x1:
58
return sprintf(outstring, ".w ");
59
case 0x2:
60
return sprintf(outstring, ".l ");
61
default:
62
return sprintf(outstring, " ");
63
}
64
}
65
66
//////////////////////////////////////////////////////////////////////////////
67
68
static int setimmstr(u32 addr, u16 size, int *addsize, char *outstring)
69
{
70
switch (size & 0x3)
71
{
72
case 0x0:
73
*addsize+=2;
74
return sprintf(outstring, "#0x%X", (unsigned int)(c68k_word_read(addr) & 0xFF));
75
case 0x1:
76
*addsize+=2;
77
return sprintf(outstring, "#0x%X", (unsigned int)c68k_word_read(addr));
78
case 0x2:
79
*addsize+=4;
80
return sprintf(outstring, "#0x%X", (unsigned int)((c68k_word_read(addr) << 16) | c68k_word_read(addr+2)));
81
default:
82
return 0;
83
}
84
}
85
86
//////////////////////////////////////////////////////////////////////////////
87
88
static int seteafieldstr(u32 addr, u16 modereg, int *addsize, char *outstring)
89
{
90
switch ((modereg >> 3) & 0x7)
91
{
92
case 0x0:
93
// Dn
94
return sprintf(outstring, "d%d", modereg & 0x7);
95
case 0x1:
96
// An
97
return sprintf(outstring, "a%d", modereg & 0x7);
98
case 0x2:
99
// (An)
100
return sprintf(outstring, "(a%d)", modereg & 0x7);
101
case 0x3:
102
// (An)+
103
return sprintf(outstring, "(a%d)+", modereg & 0x7);
104
case 0x4:
105
// -(An)
106
return sprintf(outstring, "-(a%d)", modereg & 0x7);
107
case 0x5:
108
// (d16, An)
109
*addsize += 2;
110
return sprintf(outstring, "0x%X(a%d)", (unsigned int)c68k_word_read(addr), modereg & 0x7);
111
case 0x6:
112
// (d8,An,Xn)
113
// fix me
114
*addsize += 2;
115
return sprintf(outstring, "0x%X(a%d, Xn)", (unsigned int)(c68k_word_read(addr) & 0xFF), modereg & 0x7);
116
case 0x7:
117
switch (modereg & 0x7)
118
{
119
case 0x0:
120
// (xxx).W
121
*addsize += 2; // fix me?
122
return sprintf(outstring, "(0x%X).w", (unsigned int)c68k_word_read(addr));
123
case 0x1:
124
// (xxx).L
125
*addsize += 4; // fix me?
126
return sprintf(outstring, "(0x%X).l", (unsigned int)((c68k_word_read(addr) << 16) | c68k_word_read(addr+2)));
127
case 0x4:
128
// #<data>
129
*addsize += 2; // fix me?
130
return sprintf(outstring, "#0x%X", (unsigned int)c68k_word_read(addr));
131
case 0x2:
132
// (d16,PC)
133
*addsize += 2;
134
return sprintf(outstring, "0x%X(PC)", (unsigned int)c68k_word_read(addr));
135
case 0x3:
136
// (d8,PC,Xn)
137
// fix me
138
return 0;
139
default: break;
140
}
141
default: break;
142
}
143
144
return 0;
145
}
146
147
//////////////////////////////////////////////////////////////////////////////
148
149
static int setcondstr(u16 cond, char *outstring)
150
{
151
switch (cond & 0xF)
152
{
153
case 0x0:
154
// True
155
return sprintf(outstring, "t ");
156
case 0x1:
157
// False
158
return sprintf(outstring, "f ");
159
case 0x2:
160
// High
161
return sprintf(outstring, "hi");
162
case 0x3:
163
// Low or Same
164
return sprintf(outstring, "ls");
165
case 0x4:
166
// Carry Clear
167
return sprintf(outstring, "cc");
168
case 0x5:
169
// Carry Set
170
return sprintf(outstring, "cs");
171
case 0x6:
172
// Not Equal
173
return sprintf(outstring, "ne");
174
case 0x7:
175
// Equal
176
return sprintf(outstring, "eq");
177
case 0x8:
178
// Overflow Clear
179
return sprintf(outstring, "vc");
180
case 0x9:
181
// Overflow Set
182
return sprintf(outstring, "vs");
183
case 0xA:
184
// Plus
185
return sprintf(outstring, "pl");
186
case 0xB:
187
// Minus
188
return sprintf(outstring, "mi");
189
case 0xC:
190
// Greater or Equal
191
return sprintf(outstring, "ge");
192
case 0xD:
193
// Less Than
194
return sprintf(outstring, "lt");
195
case 0xE:
196
// Greater Than
197
return sprintf(outstring, "gt");
198
case 0xF:
199
// Less or Equal
200
return sprintf(outstring, "le");
201
default: break;
202
}
203
204
return 0;
205
}
206
207
//////////////////////////////////////////////////////////////////////////////
208
209
static int setbranchdispstr(u32 addr, u16 op, int *addsize, char *outstring)
210
{
211
if ((op & 0xFF) == 0xFF)
212
{
213
// 32-bit displacement
214
*addsize += 4;
215
return sprintf(outstring, ".l %X", (unsigned int)(addr + ((c68k_word_read(addr) << 16) | c68k_word_read(addr+2))));
216
}
217
else if ((op & 0xFF) == 0x00)
218
{
219
// 16-bit displacement
220
*addsize += 2;
221
return sprintf(outstring, ".w %X", (unsigned int)((s32)addr + (s32)(s16)c68k_word_read(addr)));
222
}
223
224
// 8-bit displacement
225
return sprintf(outstring, ".s %X", (unsigned int)((s32)addr + (s32)(s8)(op & 0xFF)));
226
}
227
228
//////////////////////////////////////////////////////////////////////////////
229
230
static int disabcd(UNUSED u32 addr, UNUSED u16 op, char *outstring)
231
{
232
int size=2;
233
234
outstring += sprintf(outstring, "abcd");
235
// fix me
236
return size;
237
}
238
239
//////////////////////////////////////////////////////////////////////////////
240
241
static int disadd(u32 addr, u16 op, char *outstring)
242
{
243
int size=2;
244
245
outstring += sprintf(outstring, "add");
246
outstring += setsizestr2(op >> 6, outstring);
247
outstring += sprintf(outstring, " ");
248
249
if (op & 0x100)
250
{
251
// Dn, <ea>
252
outstring += sprintf(outstring, "d%d, ", (op >> 9) & 7);
253
seteafieldstr(addr+size, op, &size, outstring);
254
}
255
else
256
{
257
// <ea>, Dn
258
outstring += seteafieldstr(addr+size, op, &size, outstring);
259
sprintf(outstring, ", d%d", (op >> 9) & 7);
260
}
261
262
return size;
263
}
264
265
//////////////////////////////////////////////////////////////////////////////
266
267
static int disadda(u32 addr, u16 op, char *outstring)
268
{
269
int size=2;
270
271
outstring += sprintf(outstring, "adda");
272
if ((op & 0x1C0) == 0xC0)
273
outstring += sprintf(outstring, ".w ");
274
else
275
outstring += sprintf(outstring, ".l ");
276
outstring += seteafieldstr(addr+size, op, &size, outstring);
277
outstring += sprintf(outstring, ", a%d", (op >> 9) & 0x7);
278
return size;
279
}
280
281
//////////////////////////////////////////////////////////////////////////////
282
283
static int disaddi(u32 addr, u16 op, char *outstring)
284
{
285
int size=2;
286
287
outstring += sprintf(outstring, "addi");
288
outstring += setsizestr2(op >> 6, outstring);
289
outstring += setimmstr(addr+size, op >> 6, &size, outstring);
290
outstring += sprintf(outstring, ", ");
291
seteafieldstr(addr+size, op, &size, outstring);
292
return size;
293
}
294
295
//////////////////////////////////////////////////////////////////////////////
296
297
static int disaddq(u32 addr, u16 op, char *outstring)
298
{
299
int size=2;
300
301
outstring += sprintf(outstring, "addq");
302
outstring += setsizestr2(op >> 6, outstring);
303
outstring += sprintf(outstring, " ");
304
outstring += sprintf(outstring, "#%d, ", (op >> 9) & 7); // fix me
305
seteafieldstr(addr+size, op, &size, outstring);
306
return size;
307
}
308
309
//////////////////////////////////////////////////////////////////////////////
310
311
static int disaddx(UNUSED u32 addr, UNUSED u16 op, char *outstring)
312
{
313
int size=2;
314
315
outstring += sprintf(outstring, "addx");
316
// fix me
317
return size;
318
}
319
320
//////////////////////////////////////////////////////////////////////////////
321
322
static int disand(UNUSED u32 addr, UNUSED u16 op, char *outstring)
323
{
324
int size=2;
325
326
outstring += sprintf(outstring, "and");
327
// fix me
328
return size;
329
}
330
331
//////////////////////////////////////////////////////////////////////////////
332
333
static int disandi(u32 addr, u16 op, char *outstring)
334
{
335
int size=2;
336
337
outstring += sprintf(outstring, "andi");
338
outstring += setsizestr2(op >> 6, outstring);
339
outstring += sprintf(outstring, " ");
340
outstring += setimmstr(addr+size, op >> 6, &size, outstring);
341
outstring += sprintf(outstring, ", ");
342
seteafieldstr(addr+size, op, &size, outstring);
343
return size;
344
}
345
346
//////////////////////////////////////////////////////////////////////////////
347
348
static int disanditoccr(UNUSED u32 addr, UNUSED u16 op, char *outstring)
349
{
350
int size=2;
351
352
outstring += sprintf(outstring, "andi to CCR");
353
// fix me
354
return size;
355
}
356
357
//////////////////////////////////////////////////////////////////////////////
358
359
static int disasl(UNUSED u32 addr, UNUSED u16 op, char *outstring)
360
{
361
int size=2;
362
363
outstring += sprintf(outstring, "asl");
364
// fix me
365
return size;
366
}
367
368
//////////////////////////////////////////////////////////////////////////////
369
370
static int disasr(UNUSED u32 addr, UNUSED u16 op, char *outstring)
371
{
372
int size=2;
373
374
outstring += sprintf(outstring, "asr");
375
// fix me
376
return size;
377
}
378
379
//////////////////////////////////////////////////////////////////////////////
380
381
static int disbcc(u32 addr, u16 op, char *outstring)
382
{
383
int size=2;
384
385
outstring += sprintf(outstring, "b");
386
outstring += setcondstr(op >> 8, outstring);
387
setbranchdispstr(addr+size, op, &size, outstring);
388
return size;
389
}
390
391
//////////////////////////////////////////////////////////////////////////////
392
393
static int disbkpt(UNUSED u32 addr, UNUSED u16 op, char *outstring)
394
{
395
int size=2;
396
397
outstring += sprintf(outstring, "bkpt");
398
// fix me
399
return size;
400
}
401
402
//////////////////////////////////////////////////////////////////////////////
403
404
static int disbra(u32 addr, u16 op, char *outstring)
405
{
406
int size=2;
407
408
outstring += sprintf(outstring, "bra");
409
setbranchdispstr(addr+size, op, &size, outstring);
410
return size;
411
}
412
413
//////////////////////////////////////////////////////////////////////////////
414
415
static int disbchg(UNUSED u32 addr, UNUSED u16 op, char *outstring)
416
{
417
int size=2;
418
419
outstring += sprintf(outstring, "bchg");
420
// fix me
421
return size;
422
}
423
424
//////////////////////////////////////////////////////////////////////////////
425
426
static int disbclrd(UNUSED u32 addr, UNUSED u16 op, char *outstring)
427
{
428
int size=2;
429
430
outstring += sprintf(outstring, "bclr");
431
// fix me
432
return size;
433
}
434
435
//////////////////////////////////////////////////////////////////////////////
436
437
static int disbclrs(u32 addr, u16 op, char *outstring)
438
{
439
int size=2;
440
441
outstring += sprintf(outstring, "bclr ");
442
outstring += setimmstr(addr+size, 0, &size, outstring);
443
outstring += sprintf(outstring, ", ");
444
seteafieldstr(addr+size, op, &size, outstring);
445
return size;
446
}
447
448
//////////////////////////////////////////////////////////////////////////////
449
450
static int disbsetd(UNUSED u32 addr, UNUSED u16 op, char *outstring)
451
{
452
int size=2;
453
454
outstring += sprintf(outstring, "bset");
455
// fix me
456
return size;
457
}
458
459
//////////////////////////////////////////////////////////////////////////////
460
461
static int disbsets(u32 addr, u16 op, char *outstring)
462
{
463
int size=2;
464
465
outstring += sprintf(outstring, "bset ");
466
outstring += setimmstr(addr+size, 0, &size, outstring);
467
outstring += sprintf(outstring, ", ");
468
seteafieldstr(addr+size, op, &size, outstring);
469
return size;
470
}
471
472
//////////////////////////////////////////////////////////////////////////////
473
474
static int disbtstd(UNUSED u32 addr, UNUSED u16 op, char *outstring)
475
{
476
int size=2;
477
478
outstring += sprintf(outstring, "btst");
479
// fix me
480
return size;
481
}
482
483
//////////////////////////////////////////////////////////////////////////////
484
485
static int disbtsts(u32 addr, u16 op, char *outstring)
486
{
487
int size=2;
488
489
outstring += sprintf(outstring, "btst ");
490
outstring += setimmstr(addr+size, 0, &size, outstring);
491
outstring += sprintf(outstring, ", ");
492
seteafieldstr(addr+size, op, &size, outstring);
493
return size;
494
}
495
496
//////////////////////////////////////////////////////////////////////////////
497
498
static int disbsr(u32 addr, u16 op, char *outstring)
499
{
500
int size=2;
501
502
outstring += sprintf(outstring, "bsr");
503
setbranchdispstr(addr+size, op, &size, outstring);
504
return size;
505
}
506
507
//////////////////////////////////////////////////////////////////////////////
508
509
static int dischk(UNUSED u32 addr, UNUSED u16 op, char *outstring)
510
{
511
int size=2;
512
513
outstring += sprintf(outstring, "chk");
514
// fix me
515
return size;
516
}
517
518
//////////////////////////////////////////////////////////////////////////////
519
520
static int disclr(u32 addr, u16 op, char *outstring)
521
{
522
int size=2;
523
524
outstring += sprintf(outstring, "clr");
525
outstring += setsizestr2((op >> 6), outstring);
526
outstring += sprintf(outstring, " ");
527
seteafieldstr(addr+size, op, &size, outstring);
528
return size;
529
}
530
531
//////////////////////////////////////////////////////////////////////////////
532
533
static int disdbcc(u32 addr, u16 op, char *outstring)
534
{
535
outstring += sprintf(outstring, "db");
536
outstring += setcondstr(op >> 8, outstring);
537
outstring += sprintf(outstring, " ");
538
sprintf(outstring, " d%d, %X", op & 0x7, (unsigned int)((s32)addr+2+(s32)(s16)c68k_word_read(addr+2)));
539
return 4;
540
}
541
542
//////////////////////////////////////////////////////////////////////////////
543
544
static int discmpb(u32 addr, u16 op, char *outstring)
545
{
546
int size=2;
547
outstring += sprintf(outstring, "cmp.b ");
548
outstring += seteafieldstr(addr+size, op, &size, outstring);
549
outstring += sprintf(outstring, ", d%d", (op >> 9) & 0x7);
550
return size;
551
}
552
553
//////////////////////////////////////////////////////////////////////////////
554
555
static int discmpw(u32 addr, u16 op, char *outstring)
556
{
557
int size=2;
558
outstring += sprintf(outstring, "cmp.w ");
559
outstring += seteafieldstr(addr+size, op, &size, outstring);
560
outstring += sprintf(outstring, ", d%d", (op >> 9) & 0x7);
561
return size;
562
}
563
564
//////////////////////////////////////////////////////////////////////////////
565
566
static int discmpl(u32 addr, u16 op, char *outstring)
567
{
568
int size=2;
569
outstring += sprintf(outstring, "cmp.l ");
570
outstring += seteafieldstr(addr+size, op, &size, outstring);
571
outstring += sprintf(outstring, ", d%d", (op >> 9) & 0x7);
572
return size;
573
}
574
575
//////////////////////////////////////////////////////////////////////////////
576
577
static int discmpaw(UNUSED u32 addr, UNUSED u16 op, char *outstring)
578
{
579
int size=2;
580
581
outstring += sprintf(outstring, "cmpa.w");
582
// fix me
583
return size;
584
}
585
586
//////////////////////////////////////////////////////////////////////////////
587
588
static int discmpal(UNUSED u32 addr, UNUSED u16 op, char *outstring)
589
{
590
int size=2;
591
592
outstring += sprintf(outstring, "cmpa.l");
593
// fix me
594
return size;
595
}
596
597
//////////////////////////////////////////////////////////////////////////////
598
599
static int discmpi(u32 addr, u16 op, char *outstring)
600
{
601
int size=2;
602
603
outstring += sprintf(outstring, "cmpi");
604
outstring += setsizestr2((op >> 6), outstring);
605
outstring += sprintf(outstring, " ");
606
outstring += setimmstr(addr+size, op >> 6, &size, outstring);
607
outstring += sprintf(outstring, ", ");
608
seteafieldstr(addr+size, op, &size, outstring);
609
return size;
610
}
611
612
//////////////////////////////////////////////////////////////////////////////
613
614
static int disdivs(UNUSED u32 addr, UNUSED u16 op, char *outstring)
615
{
616
int size=2;
617
618
outstring += sprintf(outstring, "divs.w");
619
// fix me
620
return size;
621
}
622
623
//////////////////////////////////////////////////////////////////////////////
624
625
static int disdivu(UNUSED u32 addr, UNUSED u16 op, char *outstring)
626
{
627
int size=2;
628
629
outstring += sprintf(outstring, "divu.w");
630
// fix me
631
return size;
632
}
633
634
//////////////////////////////////////////////////////////////////////////////
635
636
static int discmpm(UNUSED u32 addr, UNUSED u16 op, char *outstring)
637
{
638
int size=2;
639
640
outstring += sprintf(outstring, "cmpm");
641
// fix me
642
return size;
643
}
644
645
//////////////////////////////////////////////////////////////////////////////
646
647
static int diseorb(UNUSED u32 addr, UNUSED u16 op, char *outstring)
648
{
649
int size=2;
650
651
outstring += sprintf(outstring, "eor.b");
652
// fix me
653
return size;
654
}
655
656
//////////////////////////////////////////////////////////////////////////////
657
658
static int diseorw(UNUSED u32 addr, UNUSED u16 op, char *outstring)
659
{
660
int size=2;
661
662
outstring += sprintf(outstring, "eor.w");
663
// fix me
664
return size;
665
}
666
667
//////////////////////////////////////////////////////////////////////////////
668
669
static int diseorl(UNUSED u32 addr, UNUSED u16 op, char *outstring)
670
{
671
int size=2;
672
673
outstring += sprintf(outstring, "eor.l");
674
// fix me
675
return size;
676
}
677
678
//////////////////////////////////////////////////////////////////////////////
679
680
static int diseori(UNUSED u32 addr, UNUSED u16 op, char *outstring)
681
{
682
int size=2;
683
684
outstring += sprintf(outstring, "eori");
685
// fix me
686
return size;
687
}
688
689
//////////////////////////////////////////////////////////////////////////////
690
691
static int diseoritoccr(UNUSED u32 addr, UNUSED u16 op, char *outstring)
692
{
693
int size=2;
694
outstring += sprintf(outstring, "eori to ccr");
695
// fix me
696
return size;
697
}
698
699
//////////////////////////////////////////////////////////////////////////////
700
701
static int disexg(UNUSED u32 addr, UNUSED u16 op, char *outstring)
702
{
703
int size=2;
704
705
outstring += sprintf(outstring, "exg");
706
// fix me
707
return size;
708
}
709
710
//////////////////////////////////////////////////////////////////////////////
711
712
static int disext(UNUSED u32 addr, UNUSED u16 op, char *outstring)
713
{
714
int size=2;
715
716
outstring += sprintf(outstring, "ext");
717
// fix me
718
return size;
719
}
720
721
//////////////////////////////////////////////////////////////////////////////
722
723
static int disillegal(UNUSED u32 addr, UNUSED u16 op, char *outstring)
724
{
725
sprintf(outstring, "illegal");
726
return 2;
727
}
728
729
//////////////////////////////////////////////////////////////////////////////
730
731
static int disjmp(u32 addr, u16 op, char *outstring)
732
{
733
int size=2;
734
outstring += sprintf(outstring, "jmp ");
735
seteafieldstr(addr+size, op, &size, outstring);
736
return size;
737
}
738
739
//////////////////////////////////////////////////////////////////////////////
740
741
static int disjsr(u32 addr, u16 op, char *outstring)
742
{
743
int size=2;
744
outstring += sprintf(outstring, "jsr ");
745
seteafieldstr(addr+size, op, &size, outstring);
746
return size;
747
}
748
749
//////////////////////////////////////////////////////////////////////////////
750
751
static int dislea(u32 addr, u16 op, char *outstring)
752
{
753
int size=2;
754
755
outstring += sprintf(outstring, "lea ");
756
outstring += seteafieldstr(addr+size, op, &size, outstring);
757
outstring += sprintf(outstring, ", a%d", (op >> 9) & 0x7);
758
return size;
759
}
760
761
//////////////////////////////////////////////////////////////////////////////
762
763
static int dislink(UNUSED u32 addr, UNUSED u16 op, char *outstring)
764
{
765
int size=2;
766
outstring += sprintf(outstring, "link");
767
// fix me
768
return size;
769
}
770
771
//////////////////////////////////////////////////////////////////////////////
772
773
static int dislsl(UNUSED u32 addr, u16 op, char *outstring)
774
{
775
int size=2;
776
outstring += sprintf(outstring, "lsl");
777
outstring += setsizestr2(op >> 6, outstring);
778
// fix me
779
return size;
780
}
781
782
//////////////////////////////////////////////////////////////////////////////
783
784
static int dislsr(UNUSED u32 addr, u16 op, char *outstring)
785
{
786
int size=2;
787
outstring += sprintf(outstring, "lsr");
788
outstring += setsizestr2(op >> 6, outstring);
789
// fix me
790
return size;
791
}
792
793
//////////////////////////////////////////////////////////////////////////////
794
795
static int dismove(u32 addr, u16 op, char *outstring)
796
{
797
int size=2;
798
799
outstring += sprintf(outstring, "move");
800
outstring += setsizestr((op >> 12), outstring);
801
outstring += sprintf(outstring, " ");
802
outstring += seteafieldstr(addr+size, op, &size, outstring);
803
outstring += sprintf(outstring, ", ");
804
seteafieldstr(addr+size, ((op >> 3) & 0x38) | ((op >> 9) & 0x7), &size, outstring);
805
return size;
806
}
807
808
//////////////////////////////////////////////////////////////////////////////
809
810
static int dismovea(u32 addr, u16 op, char *outstring)
811
{
812
int size=2;
813
814
outstring += sprintf(outstring, "movea");
815
outstring += setsizestr((op >> 12), outstring);
816
outstring += seteafieldstr(addr+size, op, &size, outstring);
817
outstring += sprintf(outstring, ", a%d", (op >> 9) & 0x7);
818
return size;
819
}
820
821
//////////////////////////////////////////////////////////////////////////////
822
823
static int dismovetoccr(UNUSED u32 addr, UNUSED u16 op, char *outstring)
824
{
825
int size=2;
826
827
outstring += sprintf(outstring, "move to ccr");
828
// fix me
829
return size;
830
}
831
832
//////////////////////////////////////////////////////////////////////////////
833
834
static int dismovefromsr(UNUSED u32 addr, UNUSED u16 op, char *outstring)
835
{
836
int size=2;
837
838
outstring += sprintf(outstring, "move from sr");
839
// fix me
840
return size;
841
}
842
843
//////////////////////////////////////////////////////////////////////////////
844
845
static int dismovetosr(u32 addr, u16 op, char *outstring)
846
{
847
int size=2;
848
849
outstring += sprintf(outstring, "move ");
850
outstring += seteafieldstr(addr+size, op, &size, outstring);
851
sprintf(outstring, ", sr");
852
return size;
853
}
854
855
//////////////////////////////////////////////////////////////////////////////
856
857
static int dismovem(UNUSED u32 addr, UNUSED u16 op, char *outstring)
858
{
859
outstring += sprintf(outstring, "movem");
860
// fix me
861
return 4;
862
}
863
864
//////////////////////////////////////////////////////////////////////////////
865
866
static int dismovep(UNUSED u32 addr, UNUSED u16 op, char *outstring)
867
{
868
int size=2;
869
870
outstring += sprintf(outstring, "movep");
871
// fix me
872
return size;
873
}
874
875
//////////////////////////////////////////////////////////////////////////////
876
877
static int dismoveq(UNUSED u32 addr, u16 op, char *outstring)
878
{
879
int size=2;
880
881
outstring += sprintf(outstring, "moveq #0x%X, d%d", op & 0xFF, (op >> 9) & 0x7);
882
return size;
883
}
884
885
//////////////////////////////////////////////////////////////////////////////
886
887
static int dismuls(UNUSED u32 addr, UNUSED u16 op, char *outstring)
888
{
889
int size=2;
890
891
outstring += sprintf(outstring, "muls");
892
// fix me
893
return size;
894
}
895
896
//////////////////////////////////////////////////////////////////////////////
897
898
static int dismulu(UNUSED u32 addr, UNUSED u16 op, char *outstring)
899
{
900
int size=2;
901
902
outstring += sprintf(outstring, "mulu");
903
// fix me
904
return size;
905
}
906
907
//////////////////////////////////////////////////////////////////////////////
908
909
static int disnbcd(UNUSED u32 addr, UNUSED u16 op, char *outstring)
910
{
911
int size=2;
912
913
outstring += sprintf(outstring, "nbcd");
914
// fix me
915
return size;
916
}
917
918
//////////////////////////////////////////////////////////////////////////////
919
920
static int disneg(u32 addr, u16 op, char *outstring)
921
{
922
int size=2;
923
924
outstring += sprintf(outstring, "neg");
925
outstring += setsizestr2((op >> 6), outstring);
926
outstring += sprintf(outstring, " ");
927
seteafieldstr(addr+size, op, &size, outstring);
928
return size;
929
}
930
931
//////////////////////////////////////////////////////////////////////////////
932
933
static int disnegx(UNUSED u32 addr, UNUSED u16 op, char *outstring)
934
{
935
int size=2;
936
937
outstring += sprintf(outstring, "negx");
938
// fix me
939
return size;
940
}
941
942
//////////////////////////////////////////////////////////////////////////////
943
944
static int disnop(UNUSED u32 addr, UNUSED u16 op, char *outstring)
945
{
946
sprintf(outstring, "nop");
947
return 2;
948
}
949
950
//////////////////////////////////////////////////////////////////////////////
951
952
static int disnot(UNUSED u32 addr, UNUSED u16 op, char *outstring)
953
{
954
int size=2;
955
956
outstring += sprintf(outstring, "not");
957
// fix me
958
return size;
959
}
960
961
//////////////////////////////////////////////////////////////////////////////
962
963
static int disor(UNUSED u32 addr, UNUSED u16 op, char *outstring)
964
{
965
int size=2;
966
967
outstring += sprintf(outstring, "ori to CCR");
968
// fix me
969
return size;
970
}
971
972
//////////////////////////////////////////////////////////////////////////////
973
974
static int disori(UNUSED u32 addr, UNUSED u16 op, char *outstring)
975
{
976
int size=2;
977
978
outstring += sprintf(outstring, "ori");
979
// fix me
980
return size;
981
}
982
983
//////////////////////////////////////////////////////////////////////////////
984
985
static int disoritoccr(UNUSED u32 addr, UNUSED u16 op, char *outstring)
986
{
987
int size=2;
988
989
outstring += sprintf(outstring, "ori to CCR");
990
// fix me
991
return size;
992
}
993
994
//////////////////////////////////////////////////////////////////////////////
995
996
static int dispea(UNUSED u32 addr, UNUSED u16 op, char *outstring)
997
{
998
int size=2;
999
1000
outstring += sprintf(outstring, "pea");
1001
// fix me
1002
return size;
1003
}
1004
1005
//////////////////////////////////////////////////////////////////////////////
1006
1007
static int disrol(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1008
{
1009
int size=2;
1010
1011
outstring += sprintf(outstring, "rol");
1012
// fix me
1013
return size;
1014
}
1015
1016
//////////////////////////////////////////////////////////////////////////////
1017
1018
static int disror(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1019
{
1020
int size=2;
1021
1022
outstring += sprintf(outstring, "ror");
1023
// fix me
1024
return size;
1025
}
1026
1027
//////////////////////////////////////////////////////////////////////////////
1028
1029
static int disroxl(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1030
{
1031
int size=2;
1032
1033
outstring += sprintf(outstring, "roxl");
1034
// fix me
1035
return size;
1036
}
1037
1038
//////////////////////////////////////////////////////////////////////////////
1039
1040
static int disroxr(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1041
{
1042
int size=2;
1043
1044
outstring += sprintf(outstring, "roxr");
1045
// fix me
1046
return size;
1047
}
1048
1049
//////////////////////////////////////////////////////////////////////////////
1050
1051
static int disrtr(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1052
{
1053
sprintf(outstring, "rtr");
1054
return 2;
1055
}
1056
1057
//////////////////////////////////////////////////////////////////////////////
1058
1059
static int disrts(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1060
{
1061
sprintf(outstring, "rts");
1062
return 2;
1063
}
1064
1065
//////////////////////////////////////////////////////////////////////////////
1066
1067
static int dissbcd(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1068
{
1069
int size=2;
1070
1071
outstring += sprintf(outstring, "sbcd");
1072
// fix me
1073
return size;
1074
}
1075
1076
//////////////////////////////////////////////////////////////////////////////
1077
1078
static int disscc(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1079
{
1080
int size=2;
1081
1082
outstring += sprintf(outstring, "scc");
1083
// fix me
1084
return size;
1085
}
1086
1087
//////////////////////////////////////////////////////////////////////////////
1088
1089
static int dissub(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1090
{
1091
int size=2;
1092
1093
outstring += sprintf(outstring, "sub");
1094
// fix me
1095
return size;
1096
}
1097
1098
//////////////////////////////////////////////////////////////////////////////
1099
1100
static int dissuba(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1101
{
1102
int size=2;
1103
1104
outstring += sprintf(outstring, "suba");
1105
// fix me
1106
return size;
1107
}
1108
1109
//////////////////////////////////////////////////////////////////////////////
1110
1111
static int dissubi(u32 addr, u16 op, char *outstring)
1112
{
1113
int size=2;
1114
1115
outstring += sprintf(outstring, "subi");
1116
outstring += setsizestr2(op >> 6, outstring);
1117
outstring += sprintf(outstring, " ");
1118
outstring += setimmstr(addr+size, op >> 6, &size, outstring);
1119
outstring += sprintf(outstring, ", ");
1120
seteafieldstr(addr+size, op, &size, outstring);
1121
return size;
1122
}
1123
1124
//////////////////////////////////////////////////////////////////////////////
1125
1126
static int dissubq(u32 addr, u16 op, char *outstring)
1127
{
1128
int size=2;
1129
1130
outstring += sprintf(outstring, "subq");
1131
outstring += setsizestr2(op >> 6, outstring);
1132
outstring += sprintf(outstring, " #%d, ", (op >> 9) & 7); // fix me
1133
seteafieldstr(addr+size, op, &size, outstring);
1134
return size;
1135
}
1136
1137
//////////////////////////////////////////////////////////////////////////////
1138
1139
static int dissubx(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1140
{
1141
int size=2;
1142
1143
outstring += sprintf(outstring, "subx");
1144
// fix me
1145
return size;
1146
}
1147
1148
//////////////////////////////////////////////////////////////////////////////
1149
1150
static int disswap(UNUSED u32 addr, u16 op, char *outstring)
1151
{
1152
sprintf(outstring, "swap d%d", op & 0x7);
1153
return 2;
1154
}
1155
1156
//////////////////////////////////////////////////////////////////////////////
1157
1158
static int distas(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1159
{
1160
int size=2;
1161
1162
outstring += sprintf(outstring, "tas");
1163
// fix me
1164
return size;
1165
}
1166
1167
//////////////////////////////////////////////////////////////////////////////
1168
1169
static int distrap(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1170
{
1171
int size=2;
1172
1173
outstring += sprintf(outstring, "trap");
1174
// fix me
1175
return size;
1176
}
1177
1178
//////////////////////////////////////////////////////////////////////////////
1179
1180
static int distrapv(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1181
{
1182
sprintf(outstring, "trapv");
1183
return 2;
1184
}
1185
1186
//////////////////////////////////////////////////////////////////////////////
1187
1188
static int distst(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1189
{
1190
int size=2;
1191
1192
outstring += sprintf(outstring, "tst");
1193
// fix me
1194
return size;
1195
}
1196
1197
//////////////////////////////////////////////////////////////////////////////
1198
1199
static int disunlk(UNUSED u32 addr, UNUSED u16 op, char *outstring)
1200
{
1201
int size=2;
1202
outstring += sprintf(outstring, "unlk");
1203
// fix me
1204
return size;
1205
}
1206
1207
//////////////////////////////////////////////////////////////////////////////
1208
1209
static m68kdis_struct instruction[] = {
1210
{ 0xFFFF, 0x023C, "andi #??, CCR", disanditoccr },
1211
{ 0xFFFF, 0x0A3C, "eori #??, CCR", diseoritoccr },
1212
{ 0xFFFF, 0x4AFC, "illegal", disillegal },
1213
{ 0xFFFF, 0x4E71, "nop", disnop },
1214
{ 0xFFFF, 0x003C, "ori #??, CCR", disoritoccr },
1215
{ 0xFFFF, 0x4E77, "rtr", disrtr },
1216
{ 0xFFFF, 0x4E75, "rts", disrts },
1217
{ 0xFFFF, 0x4E76, "trapv", distrapv },
1218
{ 0xFFF8, 0x4848, "bkpt", disbkpt },
1219
{ 0xFFF8, 0x4E50, "link", dislink },
1220
{ 0xFFF8, 0x4840, "swap", disswap },
1221
{ 0xFFF8, 0x4E58, "unlk", disunlk },
1222
{ 0xFFF0, 0x4E40, "trap", distrap },
1223
{ 0xF1F8, 0xD100, "addx.b", disaddx },
1224
{ 0xF1F8, 0xD140, "addx.w", disaddx },
1225
{ 0xF1F8, 0xD180, "addx.l", disaddx },
1226
{ 0xF1F8, 0xB108, "cmpm.b", discmpm },
1227
{ 0xF1F8, 0xB148, "cmpm.w", discmpm },
1228
{ 0xF1F8, 0xB188, "cmpm.l", discmpm },
1229
{ 0xFFC0, 0xE1C0, "asl", disasl },
1230
{ 0xFFC0, 0xE0C0, "asr", disasr },
1231
{ 0xFFC0, 0x0880, "bclr", disbclrs },
1232
{ 0xFFC0, 0x08C0, "bset", disbsets },
1233
{ 0xFFC0, 0x0800, "btst", disbtsts },
1234
{ 0xFFC0, 0x4EC0, "jmp", disjmp },
1235
{ 0xFFC0, 0x4E80, "jsr", disjsr },
1236
{ 0xFFC0, 0x44C0, "move ??, CCR", dismovetoccr },
1237
{ 0xFFC0, 0x40C0, "move SR, ??", dismovefromsr },
1238
{ 0xFFC0, 0x46C0, "move ??, SR", dismovetosr },
1239
{ 0xFFC0, 0x4800, "nbcd", disnbcd },
1240
{ 0xFFC0, 0x4840, "pea", dispea },
1241
{ 0xFFC0, 0x4AC0, "tas", distas },
1242
{ 0xFE38, 0x4800, "ext", disext },
1243
{ 0xF1F0, 0xC100, "abcd", disabcd },
1244
{ 0xF1F0, 0x8100, "sbcd", dissbcd },
1245
{ 0xF0F8, 0x50C8, "dbcc", disdbcc },
1246
{ 0xFB80, 0x4880, "movem", dismovem },
1247
{ 0xFF00, 0x0600, "addi", disaddi },
1248
{ 0xFF00, 0x0200, "andi", disandi },
1249
{ 0xFF00, 0x6000, "bra", disbra },
1250
{ 0xFF00, 0x6100, "bsr", disbsr },
1251
{ 0xFF00, 0x4200, "clr", disclr },
1252
{ 0xFF00, 0x0C00, "cmpi", discmpi },
1253
{ 0xFF00, 0x0A00, "eori", diseori },
1254
{ 0xFF00, 0x4400, "neg", disneg },
1255
{ 0xFF00, 0x4000, "negx", disnegx },
1256
{ 0xFF00, 0x4600, "not", disnot },
1257
{ 0xFF00, 0x0000, "ori", disori },
1258
{ 0xFF00, 0x0400, "subi", dissubi },
1259
{ 0xFF00, 0x4A00, "tst", distst },
1260
{ 0xF118, 0xE108, "lsl", dislsl },
1261
{ 0xF118, 0xE008, "lsr", dislsr },
1262
{ 0xF118, 0xE118, "rol", disrol },
1263
{ 0xF118, 0xE018, "ror", disror },
1264
{ 0xF118, 0xE110, "roxl", disroxl },
1265
{ 0xF118, 0xE010, "roxr", disroxr },
1266
{ 0xF1C0, 0xD0C0, "adda.w", disadda },
1267
{ 0xF1C0, 0xD1C0, "adda.l", disadda },
1268
{ 0xF1C0, 0x0140, "bchg", disbchg },
1269
{ 0xF1C0, 0x0180, "bclr", disbclrd },
1270
{ 0xF1C0, 0x01C0, "bset", disbsetd },
1271
{ 0xF1C0, 0x0100, "btst", disbtstd },
1272
{ 0xF1C0, 0xB000, "cmp.b", discmpb },
1273
{ 0xF1C0, 0xB040, "cmp.w", discmpw },
1274
{ 0xF1C0, 0xB080, "cmp.l", discmpl },
1275
{ 0xF1C0, 0xB0C0, "cmpa.w", discmpaw },
1276
{ 0xF1C0, 0xB1C0, "cmpa.l", discmpal },
1277
{ 0xF1C0, 0x81C0, "divs.w", disdivs },
1278
{ 0xF1C0, 0x80C0, "divu.w", disdivu },
1279
{ 0xF1C0, 0xB100, "eor.b", diseorb },
1280
{ 0xF1C0, 0xB140, "eor.w", diseorw },
1281
{ 0xF1C0, 0xB180, "eor.l", diseorl },
1282
{ 0xF1C0, 0x41C0, "lea", dislea },
1283
{ 0xF1C0, 0xC1C0, "muls", dismuls },
1284
{ 0xF1C0, 0xC0C0, "mulu", dismulu },
1285
{ 0xF130, 0x9100, "subx", dissubx },
1286
{ 0xF038, 0x0008, "movep", dismovep },
1287
{ 0xF0C0, 0x50C0, "scc", disscc },
1288
{ 0xC1C0, 0x0040, "movea", dismovea },
1289
{ 0xF040, 0x4000, "chk", dischk },
1290
{ 0xF100, 0x5000, "addq", disaddq },
1291
{ 0xF100, 0xC100, "exg", disexg },
1292
{ 0xF100, 0x7000, "moveq", dismoveq },
1293
{ 0xF100, 0x5100, "subq", dissubq },
1294
{ 0xF000, 0xD000, "add", disadd }, // fix me
1295
{ 0xF000, 0xC000, "and", disand },
1296
{ 0xF000, 0x6000, "bcc", disbcc },
1297
{ 0xF000, 0x8000, "or", disor },
1298
{ 0xF000, 0x9000, "sub", dissub }, // fix me
1299
{ 0xF000, 0x9000, "suba", dissuba }, // fix me
1300
{ 0xC000, 0x0000, "move", dismove },
1301
{ 0x0000, 0x0000, NULL, NULL }
1302
};
1303
1304
//////////////////////////////////////////////////////////////////////////////
1305
1306
u32 M68KDisasm(u32 addr, char *outstring)
1307
{
1308
int i;
1309
1310
outstring += sprintf(outstring, "%05X: ", (unsigned int)addr);
1311
1312
for (i = 0; instruction[i].name != NULL; i++)
1313
{
1314
u16 op = (u16)c68k_word_read(addr);
1315
1316
if ((op & instruction[i].mask) == instruction[i].inst)
1317
{
1318
addr += instruction[i].disasm(addr, op, outstring);
1319
return addr;
1320
}
1321
}
1322
1323
sprintf(outstring, "unknown");
1324
return (addr+2);
1325
}
1326
1327
//////////////////////////////////////////////////////////////////////////////
1328
1329