|
|
1.1 root 1: //
2: // nono
1.1.1.3 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
1.1.1.2 root 7: #include "m68030disasm.h"
1.1.1.6 root 8: #include "debugger_memory.h"
1.1 root 9: #include "mystring.h"
10: #include <vector>
11:
12: struct {
13: std::vector<uint16> inst;
14: std::string expected;
15: } table[] = {
16: { { 0x0000, 0x89ab }, "ori.b #$ab,d0" },
17: { { 0x003c, 0x89ab }, "ori.b #$ab,ccr" },
18: { { 0x0040, 0x89ab }, "ori.w #$89ab,d0" },
19: { { 0x007c, 0x89ab }, "ori.w #$89ab,sr" },
20: { { 0x0080, 0x89ab, 0xcdef }, "ori.l #$89abcdef,d0" },
21: { { 0x00c0, 0x9000 }, "cmp2.b d0,a1" },
22: { { 0x00f8, 0x9000, 0x89ab }, "cmp2.b $89ab,a1" },
23: { { 0x00c0, 0x9800 }, "chk2.b d0,a1" },
24: { { 0x00f8, 0x9800, 0x89ab }, "chk2.b $89ab,a1" },
25: { { 0x0300 }, "btst.l d1,d0" },
26: { { 0x0310 }, "btst.b d1,(a0)" },
27: { { 0x030a, 0x89ab }, "movep.w ($89ab,a2),d1" },
28: { { 0x0340 }, "bchg.l d1,d0" },
29: { { 0x0350 }, "bchg.b d1,(a0)" },
30: { { 0x034a, 0x89ab }, "movep.l ($89ab,a2),d1" },
31: { { 0x0380 }, "bclr.l d1,d0" },
32: { { 0x0390 }, "bclr.b d1,(a0)" },
33: { { 0x038a, 0x89ab }, "movep.w d1,($89ab,a2)" },
34: { { 0x03c0 }, "bset.l d1,d0" },
35: { { 0x03d0 }, "bset.b d1,(a0)" },
36: { { 0x03ca, 0x89ab }, "movep.l d1,($89ab,a2)" },
37: { { 0x0200, 0x89ab }, "andi.b #$ab,d0" },
38: { { 0x023c, 0x89ab }, "andi.b #$ab,ccr" },
39: { { 0x0240, 0x89ab }, "andi.w #$89ab,d0" },
40: { { 0x027c, 0x89ab }, "andi.w #$89ab,sr" },
41: { { 0x0280, 0x89ab, 0xcdef }, "andi.l #$89abcdef,d0" },
42: { { 0x02c0, 0x9000 }, "cmp2.w d0,a1" },
43: { { 0x02f8, 0x9000, 0x89ab }, "cmp2.w $89ab,a1" },
44: { { 0x02c0, 0x9800 }, "chk2.w d0,a1" },
45: { { 0x02f8, 0x9800, 0x89ab }, "chk2.w $89ab,a1" },
46: { { 0x0400, 0x89ab }, "subi.b #$ab,d0" },
47: { { 0x0440, 0x89ab }, "subi.w #$89ab,d0" },
48: { { 0x0480, 0x89ab, 0xcdef }, "subi.l #$89abcdef,d0" },
49: { { 0x04c0, 0x9000 }, "cmp2.l d0,a1" },
50: { { 0x04f8, 0x9000, 0x89ab }, "cmp2.l $89ab,a1" },
51: { { 0x04c0, 0x9800 }, "chk2.l d0,a1" },
52: { { 0x04f8, 0x9800, 0x89ab }, "chk2.l $89ab,a1" },
53: { { 0x0600, 0x89ab }, "addi.b #$ab,d0" },
54: { { 0x0640, 0x89ab }, "addi.w #$89ab,d0" },
55: { { 0x0680, 0x89ab, 0xcdef }, "addi.l #$89abcdef,d0" },
56: { { 0x0800, 0x00ff }, "btst.l #31,d0" },
57: { { 0x0838, 0x00ff, 0x89ab }, "btst.b #7,$89ab" },
58: { { 0x0840, 0x00ff }, "bchg.l #31,d0" },
59: { { 0x0878, 0x00ff, 0x89ab }, "bchg.b #7,$89ab" },
60: { { 0x0880, 0x00ff }, "bclr.l #31,d0" },
61: { { 0x08b8, 0x00ff, 0x89ab }, "bclr.b #7,$89ab" },
62: { { 0x08c0, 0x00ff }, "bset.l #31,d0" },
63: { { 0x08f8, 0x00ff, 0x89ab }, "bset.b #7,$89ab" },
64: { { 0x0a00, 0x89ab }, "eori.b #$ab,d0" },
65: { { 0x0a3c, 0x89ab }, "eori.b #$ab,ccr" },
66: { { 0x0a40, 0x89ab }, "eori.w #$89ab,d0" },
67: { { 0x0a7c, 0x89ab }, "eori.w #$89ab,sr" },
68: { { 0x0a80, 0x89ab, 0xcdef }, "eori.l #$89abcdef,d0" },
69: { { 0x0ac0, 0x0081 }, "cas.b d1,d2,d0" },
70: { { 0x0af8, 0x0081, 0x89ab }, "cas.b d1,d2,$89ab" },
71: { { 0x0c00, 0x89ab }, "cmpi.b #$ab,d0" },
72: { { 0x0c40, 0x89ab }, "cmpi.w #$89ab,d0" },
73: { { 0x0c80, 0x89ab, 0xcdef }, "cmpi.l #$89abcdef,d0" },
74: { { 0x0cc0, 0x0081 }, "cas.w d1,d2,d0" },
75: { { 0x0cf8, 0x0081, 0x89ab }, "cas.w d1,d2,$89ab" },
76: { { 0x0cfc, 0xb081, 0xe144 }, "cas2.w d1:d4,d2:d5,(a3):(a6)" },
77: { { 0x0e38, 0x9000, 0x89ab }, "moves.b $89ab,a1" },
78: { { 0x0e38, 0x9800, 0x89ab }, "moves.b a1,$89ab" },
79: { { 0x0e78, 0x9000, 0x89ab }, "moves.w $89ab,a1" },
80: { { 0x0e78, 0x9800, 0x89ab }, "moves.w a1,$89ab" },
81: { { 0x0eb8, 0x9000, 0x89ab }, "moves.l $89ab,a1" },
82: { { 0x0eb8, 0x9800, 0x89ab }, "moves.l a1,$89ab" },
83: { { 0x0ec0, 0x0081 }, "cas.l d1,d2,d0" },
84: { { 0x0ef8, 0x0081, 0x89ab }, "cas.l d1,d2,$89ab" },
85: { { 0x0efc, 0xb081, 0xe144 }, "cas2.l d1:d4,d2:d5,(a3):(a6)" },
86:
87: { { 0x1200 }, "move.b d0,d1" },
88: { { 0x1280 }, "move.b d0,(a1)" },
89: { { 0x12c0 }, "move.b d0,(a1)+" },
90: { { 0x1300 }, "move.b d0,-(a1)" },
91: { { 0x1340, 0x89ab }, "move.b d0,-$7655(a1)" },
92: { { 0x1380, 0x20fe }, "move.b d0,-$02(a1,d2.w)" },
93: { { 0x11c0, 0x89ab }, "move.b d0,$89ab" },
94: { { 0x13c0, 0x89ab, 0xcdef }, "move.b d0,$89abcdef" },
95: { { 0x2200 }, "move.l d0,d1" },
96: { { 0x2240 }, "movea.l d0,a1" },
97: { { 0x2280 }, "move.l d0,(a1)" },
98: { { 0x22c0 }, "move.l d0,(a1)+" },
99: { { 0x2300 }, "move.l d0,-(a1)" },
100: { { 0x2340, 0x89ab }, "move.l d0,-$7655(a1)" },
101: { { 0x2380, 0x20fe }, "move.l d0,-$02(a1,d2.w)" },
102: { { 0x21c0, 0x89ab }, "move.l d0,$89ab" },
103: { { 0x23c0, 0x89ab, 0xcdef }, "move.l d0,$89abcdef" },
104: { { 0x3200 }, "move.w d0,d1" },
105: { { 0x3240 }, "movea.w d0,a1" },
106: // movea.w $ffff89ab,a1 のように表示したい気もするけど、今の所
107: // 構造上面倒なのでちょっとおいておく。
108: { { 0x327c, 0x89ab }, "movea.w #$89ab,a1" },
109: { { 0x3280 }, "move.w d0,(a1)" },
110: { { 0x32c0 }, "move.w d0,(a1)+" },
111: { { 0x3300 }, "move.w d0,-(a1)" },
112: { { 0x3340, 0x89ab }, "move.w d0,-$7655(a1)" },
113: { { 0x3380, 0x20fe }, "move.w d0,-$02(a1,d2.w)" },
114: { { 0x31c0, 0x89ab }, "move.w d0,$89ab" },
115: { { 0x33c0, 0x89ab, 0xcdef }, "move.w d0,$89abcdef" },
116:
117: { { 0x4000 }, "negx.b d0" },
118: { { 0x4040 }, "negx.w d0" },
119: { { 0x4080 }, "negx.l d0" },
120: { { 0x40c0 }, "move.w sr,d0" },
121: { { 0x4300 }, "chk.l d0,d1" },
122: { { 0x4380 }, "chk.w d0,d1" },
123: { { 0x43d0 }, "lea.l (a0),a1" },
124: { { 0x49c0 }, "extb.l d0" },
125: { { 0x4200 }, "clr.b d0" },
126: { { 0x4240 }, "clr.w d0" },
127: { { 0x4280 }, "clr.l d0" },
128: { { 0x42c0 }, "move.w ccr,d0" },
129: { { 0x4400 }, "neg.b d0" },
130: { { 0x4440 }, "neg.w d0" },
131: { { 0x4480 }, "neg.l d0" },
132: { { 0x44c0 }, "move.w d0,ccr" },
133: { { 0x4600 }, "not.b d0" },
134: { { 0x4640 }, "not.w d0" },
135: { { 0x4680 }, "not.l d0" },
136: { { 0x46c0 }, "move.w d0,sr" },
137: { { 0x4800 }, "nbcd.b d0" },
138: { { 0x4808, 0x89ab, 0xcdef }, "link.l a0,#-$76543211" },
139: { { 0x4840 }, "swap.w d0" },
140: { { 0x4849 }, "bkpt #1" },
141: { { 0x4850 }, "pea.l (a0)" },
142: { { 0x4880 }, "ext.w d0" },
143: { { 0x4890, 0x0101 }, "movem.w d0/a0,(a0)" },
144: { { 0x48b8, 0x0101, 0x89ab }, "movem.w d0/a0,$89ab" },
145: { { 0x48c0 }, "ext.l d0" },
146: { { 0x48d0, 0x0101 }, "movem.l d0/a0,(a0)" },
147: { { 0x48f8, 0x0101, 0x89ab }, "movem.l d0/a0,$89ab" },
148: { { 0x4a00 }, "tst.b d0" },
149: { { 0x4a40 }, "tst.w d0" },
150: { { 0x4a80 }, "tst.l d0" },
151: { { 0x4ac0 }, "tas.b d0" },
152: { { 0x4afc }, "illegal" },
153: // ※ mul[us].l <ea>,dh:dl (h==l) はニーモニックとしては正しい
154: { { 0x4c38, 0x1000, 0x89ab }, "mulu.l $89ab,d1" },
155: { { 0x4c38, 0x1401, 0x89ab }, "mulu.l $89ab,d1:d1" }, // ※
156: { { 0x4c38, 0x1402, 0x89ab }, "mulu.l $89ab,d2:d1" },
157: { { 0x4c38, 0x1800, 0x89ab }, "muls.l $89ab,d1" },
158: { { 0x4c38, 0x1c01, 0x89ab }, "muls.l $89ab,d1:d1" }, // ※
159: { { 0x4c38, 0x1c02, 0x89ab }, "muls.l $89ab,d2:d1" },
160: { { 0x4c78, 0x1001, 0x89ab }, "divu.l $89ab,d1" },
161: { { 0x4c78, 0x1002, 0x89ab }, "divu.l $89ab,d2:d1" },
162: { { 0x4c78, 0x1402, 0x89ab }, "divul.l $89ab,d2:d1" },
163: { { 0x4c78, 0x1801, 0x89ab }, "divs.l $89ab,d1" },
164: { { 0x4c78, 0x1802, 0x89ab }, "divs.l $89ab,d2:d1" },
165: { { 0x4c78, 0x1c02, 0x89ab }, "divsl.l $89ab,d2:d1" },
166: { { 0x4c90, 0x0101 }, "movem.w (a0),d0/a0" },
167: { { 0x4cb8, 0x0101, 0x89ab }, "movem.w $89ab,d0/a0" },
168: { { 0x4cd0, 0x0101 }, "movem.l (a0),d0/a0" },
169: { { 0x4cf8, 0x0101, 0x89ab }, "movem.l $89ab,d0/a0" },
170: { { 0x4e4f }, "trap #15" },
171: { { 0x4e50, 0x89ab }, "link.w a0,#-$7655" },
172: { { 0x4e58 }, "unlk a0" },
173: { { 0x4e60 }, "move.l a0,usp" },
174: { { 0x4e68 }, "move.l usp,a0" },
175: { { 0x4e70 }, "reset" },
176: { { 0x4e71 }, "nop" },
177: { { 0x4e72, 0x89ab }, "stop #$89ab" },
178: { { 0x4e73 }, "rte" },
179: { { 0x4e74, 0x89ab }, "rtd #$89ab" },
180: { { 0x4e75 }, "rts" },
181: { { 0x4e76 }, "trapv" },
182: { { 0x4e77 }, "rtr" },
183: { { 0x4e7a, 0x8801 }, "movec.l vbr,a0" },
184: { { 0x4e7b, 0x8801 }, "movec.l a0,vbr" },
185: { { 0x4e90 }, "jsr (a0)" },
186: { { 0x4ed0 }, "jmp (a0)" },
187:
188: { { 0x5000 }, "addq.b #8,d0" },
189: { { 0x5040 }, "addq.w #8,d0" },
190: { { 0x5048 }, "addq.w #8,a0" }, // .l にする?
191: { { 0x5080 }, "addq.l #8,d0" },
192: { { 0x5088 }, "addq.l #8,a0" },
193: { { 0x50c0 }, "st.b d0" },
194: { { 0x50c8, 0xfffe }, "dbt.w d0,$00000100" },
195: { { 0x51c8, 0xfffe }, "dbra.w d0,$00000100" },
196: { { 0x50fa, 0x89ab }, "trapt.w #$89ab" },
197: { { 0x50fb, 0x89ab, 0xcdef }, "trapt.l #$89abcdef" },
198: { { 0x50fc }, "trapt" },
199: { { 0x5100 }, "subq.b #8,d0" },
200: { { 0x5140 }, "subq.w #8,d0" },
201: { { 0x5148 }, "subq.w #8,a0" }, // .l にする?
202: { { 0x5180 }, "subq.l #8,d0" },
203: { { 0x5188 }, "subq.l #8,a0" },
204:
205: { { 0x6000, 0xfffe }, "bra.w $00000100" },
206: { { 0x60fe }, "bra.b $00000100" },
207: { { 0x60ff, 0xffff, 0xfffe }, "bra.l $00000100" },
208: { { 0x6100, 0xfffe }, "bsr.w $00000100" },
209: { { 0x61fe }, "bsr.b $00000100" },
210: { { 0x61ff, 0xffff, 0xfffe }, "bsr.l $00000100" },
211: { { 0x6200, 0xfffe }, "bhi.w $00000100" },
212: { { 0x62fe }, "bhi.b $00000100" },
213: { { 0x62ff, 0xffff, 0xfffe }, "bhi.l $00000100" },
214:
215: { { 0x727f }, "moveq.l #$7f,d1" },
216: { { 0x7280 }, "moveq.l #$ffffff80,d1" },
217:
218: { { 0x8200 }, "or.b d0,d1" },
219: { { 0x8240 }, "or.w d0,d1" },
220: { { 0x8280 }, "or.l d0,d1" },
221: { { 0x82c0 }, "divu.w d0,d1" },
222: { { 0x8300 }, "sbcd.b d0,d1" },
223: { { 0x8308 }, "sbcd.b -(a0),-(a1)" },
224: { { 0x8310 }, "or.b d1,(a0)" },
225: { { 0x8340, 0x89ab }, "pack d0,d1,#$89ab" },
226: { { 0x8348, 0x89ab }, "pack -(a0),-(a1),#$89ab" },
227: { { 0x8350 }, "or.w d1,(a0)" },
228: { { 0x8380, 0x89ab }, "unpk d0,d1,#$89ab" },
229: { { 0x8388, 0x89ab }, "unpk -(a0),-(a1),#$89ab" },
230: { { 0x8390 }, "or.l d1,(a0)" },
231: { { 0x83c0 }, "divs.w d0,d1" },
232:
233: { { 0x9200 }, "sub.b d0,d1" },
234: { { 0x9240 }, "sub.w d0,d1" },
235: { { 0x9280 }, "sub.l d0,d1" },
236: { { 0x92c0 }, "suba.w d0,a1" },
237: { { 0x9300 }, "subx.b d0,d1" },
238: { { 0x9308 }, "subx.b -(a0),-(a1)" },
239: { { 0x9310 }, "sub.b d1,(a0)" },
240: { { 0x9340 }, "subx.w d0,d1" },
241: { { 0x9348 }, "subx.w -(a0),-(a1)" },
242: { { 0x9350 }, "sub.w d1,(a0)" },
243: { { 0x9380 }, "subx.l d0,d1" },
244: { { 0x9388 }, "subx.l -(a0),-(a1)" },
245: { { 0x9390 }, "sub.l d1,(a0)" },
246: { { 0x93c0 }, "suba.l d0,a1" },
247:
248: // A-Line
249:
250: { { 0xb200 }, "cmp.b d0,d1" },
251: { { 0xb240 }, "cmp.w d0,d1" },
252: { { 0xb280 }, "cmp.l d0,d1" },
253: { { 0xb2c0 }, "cmpa.w d0,a1" },
254: { { 0xb300 }, "eor.b d1,d0" },
255: { { 0xb308 }, "cmpm.b (a0)+,(a1)+" },
256: { { 0xb340 }, "eor.w d1,d0" },
257: { { 0xb348 }, "cmpm.w (a0)+,(a1)+" },
258: { { 0xb380 }, "eor.l d1,d0" },
259: { { 0xb388 }, "cmpm.l (a0)+,(a1)+" },
260: { { 0xb3c0 }, "cmpa.l d0,a1" },
261:
262: { { 0xc200 }, "and.b d0,d1" },
263: { { 0xc240 }, "and.w d0,d1" },
264: { { 0xc280 }, "and.l d0,d1" },
265: { { 0xc2c0 }, "mulu.w d0,d1" },
266: { { 0xc300 }, "abcd.b d0,d1" },
267: { { 0xc308 }, "abcd.b -(a0),-(a1)" },
268: { { 0xc310 }, "and.b d1,(a0)" },
269: { { 0xc340 }, "exg.l d1,d0" },
270: { { 0xc348 }, "exg.l a1,a0" },
271: { { 0xc350 }, "and.w d1,(a0)" },
272: { { 0xc388 }, "exg.l d1,a0" },
273: { { 0xc390 }, "and.l d1,(a0)" },
274: { { 0xc3c0 }, "muls.w d0,d1" },
275:
276: { { 0xd200 }, "add.b d0,d1" },
277: { { 0xd240 }, "add.w d0,d1" },
278: { { 0xd280 }, "add.l d0,d1" },
279: { { 0xd2c0 }, "adda.w d0,a1" },
280: { { 0xd300 }, "addx.b d0,d1" },
281: { { 0xd308 }, "addx.b -(a0),-(a1)" },
282: { { 0xd310 }, "add.b d1,(a0)" },
283: { { 0xd340 }, "addx.w d0,d1" },
284: { { 0xd348 }, "addx.w -(a0),-(a1)" },
285: { { 0xd350 }, "add.w d1,(a0)" },
286: { { 0xd380 }, "addx.l d0,d1" },
287: { { 0xd388 }, "addx.l -(a0),-(a1)" },
288: { { 0xd390 }, "add.l d1,(a0)" },
289: { { 0xd3c0 }, "adda.l d0,a1" },
290:
291: { { 0xe000 }, "asr.b #8,d0" },
292: { { 0xe008 }, "lsr.b #8,d0" },
293: { { 0xe010 }, "roxr.b #8,d0" },
294: { { 0xe018 }, "ror.b #8,d0" },
295: { { 0xe220 }, "asr.b d1,d0" },
296: { { 0xe228 }, "lsr.b d1,d0" },
297: { { 0xe230 }, "roxr.b d1,d0" },
298: { { 0xe238 }, "ror.b d1,d0" },
299:
300: { { 0xe040 }, "asr.w #8,d0" },
301: { { 0xe048 }, "lsr.w #8,d0" },
302: { { 0xe050 }, "roxr.w #8,d0" },
303: { { 0xe058 }, "ror.w #8,d0" },
304: { { 0xe260 }, "asr.w d1,d0" },
305: { { 0xe268 }, "lsr.w d1,d0" },
306: { { 0xe270 }, "roxr.w d1,d0" },
307: { { 0xe278 }, "ror.w d1,d0" },
308:
309: { { 0xe080 }, "asr.l #8,d0" },
310: { { 0xe088 }, "lsr.l #8,d0" },
311: { { 0xe090 }, "roxr.l #8,d0" },
312: { { 0xe098 }, "ror.l #8,d0" },
313: { { 0xe2a0 }, "asr.l d1,d0" },
314: { { 0xe2a8 }, "lsr.l d1,d0" },
315: { { 0xe2b0 }, "roxr.l d1,d0" },
316: { { 0xe2b8 }, "ror.l d1,d0" },
317:
318: { { 0xe0c0 }, "asr.w d0" },
319:
320: { { 0xe100 }, "asl.b #8,d0" },
321: { { 0xe108 }, "lsl.b #8,d0" },
322: { { 0xe110 }, "roxl.b #8,d0" },
323: { { 0xe118 }, "rol.b #8,d0" },
324: { { 0xe320 }, "asl.b d1,d0" },
325: { { 0xe328 }, "lsl.b d1,d0" },
326: { { 0xe330 }, "roxl.b d1,d0" },
327: { { 0xe338 }, "rol.b d1,d0" },
328:
329: { { 0xe140 }, "asl.w #8,d0" },
330: { { 0xe148 }, "lsl.w #8,d0" },
331: { { 0xe150 }, "roxl.w #8,d0" },
332: { { 0xe158 }, "rol.w #8,d0" },
333: { { 0xe360 }, "asl.w d1,d0" },
334: { { 0xe368 }, "lsl.w d1,d0" },
335: { { 0xe370 }, "roxl.w d1,d0" },
336: { { 0xe378 }, "rol.w d1,d0" },
337:
338: { { 0xe180 }, "asl.l #8,d0" },
339: { { 0xe188 }, "lsl.l #8,d0" },
340: { { 0xe190 }, "roxl.l #8,d0" },
341: { { 0xe198 }, "rol.l #8,d0" },
342: { { 0xe3a0 }, "asl.l d1,d0" },
343: { { 0xe3a8 }, "lsl.l d1,d0" },
344: { { 0xe3b0 }, "roxl.l d1,d0" },
345: { { 0xe3b8 }, "rol.l d1,d0" },
346:
347: { { 0xe1c0 }, "asl.w d0" },
348:
349: { { 0xe2c0 }, "lsr.w d0" },
350: { { 0xe3c0 }, "lsl.w d0" },
351: { { 0xe4c0 }, "roxr.w d0" },
352: { { 0xe5c0 }, "roxl.w d0" },
353: { { 0xe6c0 }, "ror.w d0" },
354: { { 0xe7c0 }, "rol.w d0" },
355:
356: { { 0xe8c0, 0x0862 }, "bftst d0{d1:d2}" },
357: { { 0xe9c0, 0x3862 }, "bfextu d0{d1:d2},d3" },
358: { { 0xeac0, 0x0862 }, "bfchg d0{d1:d2}" },
359: { { 0xebc0, 0x3862 }, "bfexts d0{d1:d2},d3" },
360: { { 0xecc0, 0x0862 }, "bfclr d0{d1:d2}" },
361: { { 0xedc0, 0x3862 }, "bfffo d0{d1:d2},d3" },
362: { { 0xeec0, 0x0862 }, "bfset d0{d1:d2}" },
363: { { 0xefc0, 0x3862 }, "bfins d3,d0{d1:d2}" },
364: { { 0xe8f8, 0x0862, 0x89ab }, "bftst $89ab{d1:d2}" },
365: { { 0xe9f8, 0x3862, 0x89ab }, "bfextu $89ab{d1:d2},d3" },
366: { { 0xeaf8, 0x0862, 0x89ab }, "bfchg $89ab{d1:d2}" },
367: { { 0xebf8, 0x3862, 0x89ab }, "bfexts $89ab{d1:d2},d3" },
368: { { 0xecf8, 0x0862, 0x89ab }, "bfclr $89ab{d1:d2}" },
369: { { 0xedf8, 0x3862, 0x89ab }, "bfffo $89ab{d1:d2},d3" },
370: { { 0xeef8, 0x0862, 0x89ab }, "bfset $89ab{d1:d2}" },
371: { { 0xeff8, 0x3862, 0x89ab }, "bfins d3,$89ab{d1:d2}" },
372: { { 0xe8c0, 0x0022 }, "bftst d0{#0:d2}" }, // offset 0
373: { { 0xe8c0, 0x07e2 }, "bftst d0{#31:d2}" }, // offset 31
374: { { 0xe8c0, 0x0841 }, "bftst d0{d1:#1}" }, // width 1
375: { { 0xe8c0, 0x0840 }, "bftst d0{d1:#32}" }, // width 32
376: { { 0xe8c0, 0x0000 }, "bftst d0{#0:#32}" }, // oもwも即値
377:
378: // EA
379: { { 0x4a07 }, "tst.b d7" }, // dn
380: { { 0x4a0f }, "tst.b a7" }, // an
381: { { 0x4a17 }, "tst.b (a7)" }, // (an)
382: { { 0x4a1f }, "tst.b (a7)+" }, // (an)+
383: { { 0x4a27 }, "tst.b -(a7)" }, // -(an)
384: { { 0x4a2f, 0x89ab }, "tst.b -$7655(a7)" }, // d16(an)
385: { { 0x4a38, 0x89ab }, "tst.b $89ab" }, // abs.w
386: { { 0x4a39, 0x89ab, 0xcdef }, "tst.b $89abcdef" }, // abs.l
387: { { 0x4a3a, 0xfffe }, "tst.b $00000100(pc)" }, // d16(pc)
388: { { 0x4a3c, 0x89ab }, "tst.b #$ab" }, // #imm
389: // (an,ix) 短縮フォーマット
390: { { 0x4a37, 0x9000 }, "tst.b (a7,a1.w)" },
391: { { 0x4a37, 0x9201 }, "tst.b $01(a7,a1.w*2)" },
392: { { 0x4a37, 0x947f }, "tst.b $7f(a7,a1.w*4)" },
393: { { 0x4a37, 0x9680 }, "tst.b -$80(a7,a1.w*8)" },
394: { { 0x4a37, 0x98ff }, "tst.b -$01(a7,a1.l)" },
395: { { 0x4a37, 0x9a00 }, "tst.b (a7,a1.l*2)" },
396: { { 0x4a37, 0x9c00 }, "tst.b (a7,a1.l*4)" },
397: { { 0x4a37, 0x9e00 }, "tst.b (a7,a1.l*8)" },
398: // (an,ix) フルフォーマット
399: #define BW 0x89ab
400: #define BL 0x89ab, 0xcdef
401: #define OW 0xcdef
402: #define OL 0xcdef, 0x0123
403: #define MA(x, ...) { 0x4a37, x, __VA_ARGS__ }
404: #define T "tst.b "
405: // an,bs=0, bdsize=1
406: { MA(0x1110), T "(a7,d1.w)" },
407: { MA(0x1111), T "([a7,d1.w])" },
408: { MA(0x1112, OW), T "([a7,d1.w],-$3211)" },
409: { MA(0x1113, OL), T "([a7,d1.w],-$3210fedd)" },
410: { MA(0x1115), T "([a7],d1.w)" },
411: { MA(0x1116, OW), T "([a7],d1.w,-$3211)" },
412: { MA(0x1117, OL), T "([a7],d1.w,-$3210fedd)" },
413: { MA(0x1150), T "(a7)" },
414: { MA(0x1151), T "([a7])" },
415: { MA(0x1152, OW), T "([a7],-$3211)" },
416: { MA(0x1153, OL), T "([a7],-$3210fedd)" },
417: // an,bs=0, bdsize=2
418: { MA(0x1120, BW), T "(-$7655,a7,d1.w)" },
419: { MA(0x1121, BW), T "([-$7655,a7,d1.w])" },
420: { MA(0x1122, BW, OW), T "([-$7655,a7,d1.w],-$3211)" },
421: { MA(0x1123, BW, OL), T "([-$7655,a7,d1.w],-$3210fedd)" },
422: { MA(0x1125, BW), T "([-$7655,a7],d1.w)" },
423: { MA(0x1126, BW, OW), T "([-$7655,a7],d1.w,-$3211)" },
424: { MA(0x1127, BW, OL), T "([-$7655,a7],d1.w,-$3210fedd)" },
425: { MA(0x1160, BW), T "(-$7655,a7)" },
426: { MA(0x1161, BW), T "([-$7655,a7])" },
427: { MA(0x1162, BW, OW), T "([-$7655,a7],-$3211)" },
428: { MA(0x1163, BW, OL), T "([-$7655,a7],-$3210fedd)" },
429: // an,bs=0, bdsize=3
430: { MA(0x1130, BL), T "(-$76543211,a7,d1.w)" },
431: { MA(0x1131, BL), T "([-$76543211,a7,d1.w])" },
432: { MA(0x1132, BL, OW), T "([-$76543211,a7,d1.w],-$3211)" },
433: { MA(0x1133, BL, OL), T "([-$76543211,a7,d1.w],-$3210fedd)" },
434: { MA(0x1135, BL), T "([-$76543211,a7],d1.w)" },
435: { MA(0x1136, BL, OW), T "([-$76543211,a7],d1.w,-$3211)" },
436: { MA(0x1137, BL, OL), T "([-$76543211,a7],d1.w,-$3210fedd)" },
437: { MA(0x1170, BL), T "(-$76543211,a7)" },
438: { MA(0x1171, BL), T "([-$76543211,a7])" },
439: { MA(0x1172, BL, OW), T "([-$76543211,a7],-$3211)" },
440: { MA(0x1173, BL, OL), T "([-$76543211,a7],-$3210fedd)" },
441: // an,bs=1, bdsize=1
442: { MA(0x1190), T "(za7,d1.w)" },
443: { MA(0x1191), T "([za7,d1.w])" },
444: { MA(0x1192, OW), T "([za7,d1.w],-$3211)" },
445: { MA(0x1193, OL), T "([za7,d1.w],-$3210fedd)" },
446: { MA(0x1195), T "([za7],d1.w)" },
447: { MA(0x1196, OW), T "([za7],d1.w,-$3211)" },
448: { MA(0x1197, OL), T "([za7],d1.w,-$3210fedd)" },
449: { MA(0x11d0), T "(za7)" },
450: { MA(0x11d1), T "([za7])" },
451: { MA(0x11d2, OW), T "([za7],-$3211)" },
452: { MA(0x11d3, OL), T "([za7],-$3210fedd)" },
453: // an,bs=1, bdsize=2
454: { MA(0x11a0, BW), T "(-$7655,za7,d1.w)" },
455: { MA(0x11a1, BW), T "([-$7655,za7,d1.w])" },
456: { MA(0x11a2, BW, OW), T "([-$7655,za7,d1.w],-$3211)" },
457: { MA(0x11a3, BW, OL), T "([-$7655,za7,d1.w],-$3210fedd)" },
458: { MA(0x11a5, BW), T "([-$7655,za7],d1.w)" },
459: { MA(0x11a6, BW, OW), T "([-$7655,za7],d1.w,-$3211)" },
460: { MA(0x11a7, BW, OL), T "([-$7655,za7],d1.w,-$3210fedd)" },
461: { MA(0x11e0, BW), T "(-$7655,za7)" },
462: { MA(0x11e1, BW), T "([-$7655,za7])" },
463: { MA(0x11e2, BW, OW), T "([-$7655,za7],-$3211)" },
464: { MA(0x11e3, BW, OL), T "([-$7655,za7],-$3210fedd)" },
465: // an,bs=1, bdsize=3
466: { MA(0x11b0, BL), T "(-$76543211,za7,d1.w)" },
467: { MA(0x11b1, BL), T "([-$76543211,za7,d1.w])" },
468: { MA(0x11b2, BL, OW), T "([-$76543211,za7,d1.w],-$3211)" },
469: { MA(0x11b3, BL, OL), T "([-$76543211,za7,d1.w],-$3210fedd)" },
470: { MA(0x11b5, BL), T "([-$76543211,za7],d1.w)" },
471: { MA(0x11b6, BL, OW), T "([-$76543211,za7],d1.w,-$3211)" },
472: { MA(0x11b7, BL, OL), T "([-$76543211,za7],d1.w,-$3210fedd)" },
473: { MA(0x11f0, BL), T "(-$76543211,za7)" },
474: { MA(0x11f1, BL), T "([-$76543211,za7])" },
475: { MA(0x11f2, BL, OW), T "([-$76543211,za7],-$3211)" },
476: { MA(0x11f3, BL, OL), T "([-$76543211,za7],-$3210fedd)" },
477: #undef MA
478: #undef T
479: #define MA(x, ...) { 0x4a3b, x, __VA_ARGS__ }
480: #define T "tst.b "
481: // pc,bs=0, bdsize=1
482: { MA(0x1110), T "(pc,d1.w)" },
483: { MA(0x1111), T "([pc,d1.w])" },
484: { MA(0x1112, OW), T "([pc,d1.w],-$3211)" },
485: { MA(0x1113, OL), T "([pc,d1.w],-$3210fedd)" },
486: { MA(0x1115), T "([pc],d1.w)" },
487: { MA(0x1116, OW), T "([pc],d1.w,-$3211)" },
488: { MA(0x1117, OL), T "([pc],d1.w,-$3210fedd)" },
489: { MA(0x1150), T "(pc)" },
490: { MA(0x1151), T "([pc])" },
491: { MA(0x1152, OW), T "([pc],-$3211)" },
492: { MA(0x1153, OL), T "([pc],-$3210fedd)" },
493: // pc,bs=0, bdsize=2
494: { MA(0x1120, BW), T "(-$7655,pc,d1.w)" },
495: { MA(0x1121, BW), T "([-$7655,pc,d1.w])" },
496: { MA(0x1122, BW, OW), T "([-$7655,pc,d1.w],-$3211)" },
497: { MA(0x1123, BW, OL), T "([-$7655,pc,d1.w],-$3210fedd)" },
498: { MA(0x1125, BW), T "([-$7655,pc],d1.w)" },
499: { MA(0x1126, BW, OW), T "([-$7655,pc],d1.w,-$3211)" },
500: { MA(0x1127, BW, OL), T "([-$7655,pc],d1.w,-$3210fedd)" },
501: { MA(0x1160, BW), T "(-$7655,pc)" },
502: { MA(0x1161, BW), T "([-$7655,pc])" },
503: { MA(0x1162, BW, OW), T "([-$7655,pc],-$3211)" },
504: { MA(0x1163, BW, OL), T "([-$7655,pc],-$3210fedd)" },
505: // an,bs=0, bdsize=3
506: { MA(0x1130, BL), T "(-$76543211,pc,d1.w)" },
507: { MA(0x1131, BL), T "([-$76543211,pc,d1.w])" },
508: { MA(0x1132, BL, OW), T "([-$76543211,pc,d1.w],-$3211)" },
509: { MA(0x1133, BL, OL), T "([-$76543211,pc,d1.w],-$3210fedd)" },
510: { MA(0x1135, BL), T "([-$76543211,pc],d1.w)" },
511: { MA(0x1136, BL, OW), T "([-$76543211,pc],d1.w,-$3211)" },
512: { MA(0x1137, BL, OL), T "([-$76543211,pc],d1.w,-$3210fedd)" },
513: { MA(0x1170, BL), T "(-$76543211,pc)" },
514: { MA(0x1171, BL), T "([-$76543211,pc])" },
515: { MA(0x1172, BL, OW), T "([-$76543211,pc],-$3211)" },
516: { MA(0x1173, BL, OL), T "([-$76543211,pc],-$3210fedd)" },
517: // an,bs=1, bdsize=1
518: { MA(0x1190), T "(zpc,d1.w)" },
519: { MA(0x1191), T "([zpc,d1.w])" },
520: { MA(0x1192, OW), T "([zpc,d1.w],-$3211)" },
521: { MA(0x1193, OL), T "([zpc,d1.w],-$3210fedd)" },
522: { MA(0x1195), T "([zpc],d1.w)" },
523: { MA(0x1196, OW), T "([zpc],d1.w,-$3211)" },
524: { MA(0x1197, OL), T "([zpc],d1.w,-$3210fedd)" },
525: { MA(0x11d0), T "(zpc)" },
526: { MA(0x11d1), T "([zpc])" },
527: { MA(0x11d2, OW), T "([zpc],-$3211)" },
528: { MA(0x11d3, OL), T "([zpc],-$3210fedd)" },
529: // an,bs=1, bdsize=2
530: { MA(0x11a0, BW), T "(-$7655,zpc,d1.w)" },
531: { MA(0x11a1, BW), T "([-$7655,zpc,d1.w])" },
532: { MA(0x11a2, BW, OW), T "([-$7655,zpc,d1.w],-$3211)" },
533: { MA(0x11a3, BW, OL), T "([-$7655,zpc,d1.w],-$3210fedd)" },
534: { MA(0x11a5, BW), T "([-$7655,zpc],d1.w)" },
535: { MA(0x11a6, BW, OW), T "([-$7655,zpc],d1.w,-$3211)" },
536: { MA(0x11a7, BW, OL), T "([-$7655,zpc],d1.w,-$3210fedd)" },
537: { MA(0x11e0, BW), T "(-$7655,zpc)" },
538: { MA(0x11e1, BW), T "([-$7655,zpc])" },
539: { MA(0x11e2, BW, OW), T "([-$7655,zpc],-$3211)" },
540: { MA(0x11e3, BW, OL), T "([-$7655,zpc],-$3210fedd)" },
541: // an,bs=1, bdsize=3
542: { MA(0x11b0, BL), T "(-$76543211,zpc,d1.w)" },
543: { MA(0x11b1, BL), T "([-$76543211,zpc,d1.w])" },
544: { MA(0x11b2, BL, OW), T "([-$76543211,zpc,d1.w],-$3211)" },
545: { MA(0x11b3, BL, OL), T "([-$76543211,zpc,d1.w],-$3210fedd)" },
546: { MA(0x11b5, BL), T "([-$76543211,zpc],d1.w)" },
547: { MA(0x11b6, BL, OW), T "([-$76543211,zpc],d1.w,-$3211)" },
548: { MA(0x11b7, BL, OL), T "([-$76543211,zpc],d1.w,-$3210fedd)" },
549: { MA(0x11f0, BL), T "(-$76543211,zpc)" },
550: { MA(0x11f1, BL), T "([-$76543211,zpc])" },
551: { MA(0x11f2, BL, OW), T "([-$76543211,zpc],-$3211)" },
552: { MA(0x11f3, BL, OL), T "([-$76543211,zpc],-$3210fedd)" },
553: #undef MA
554: #undef T
555:
556: // movem (制御・ポストインクリメント)
557: { { 0x48d0, 0x0000 }, "movem.l noregs,(a0)" }, // リストなし
558: { { 0x48d0, 0x0001 }, "movem.l d0,(a0)" }, // 単体
559: { { 0x48d0, 0x0006 }, "movem.l d1-d2,(a0)" }, // dで連続
560: { { 0x48d0, 0x00f6 }, "movem.l d1-d2/d4-d7,(a0)" }, // 区間が複数
561: { { 0x48d0, 0x01ff }, "movem.l d0-d7/a0,(a0)" }, // d/a をまたぐ
562: { { 0x48d0, 0x03ff }, "movem.l d0-d7/a0-a1,(a0)" }, // d/a をまたいで連続
563: { { 0x48d0, 0xff00 }, "movem.l a0-a7,(a0)" }, // aで連続
564: { { 0x48d0, 0x6186 }, "movem.l d1-d2/d7/a0/a5-a6,(a0)" }, // 複雑なの
565: // movem (プリデクリメント)
566: { { 0x48e0, 0x0000 }, "movem.l noregs,-(a0)" }, // リストなし
567: { { 0x48e0, 0x8000 }, "movem.l d0,-(a0)" }, // 単体
568: { { 0x48e0, 0x6000 }, "movem.l d1-d2,-(a0)" }, // dで連続
569: { { 0x48e0, 0x6f00 }, "movem.l d1-d2/d4-d7,-(a0)" },// 区間が複数
570: { { 0x48e0, 0xff80 }, "movem.l d0-d7/a0,-(a0)" }, // d/a をまたぐ
571: { { 0x48e0, 0xffc0 }, "movem.l d0-d7/a0-a1,-(a0)" },// d/a をまたいで連続
572: { { 0x48e0, 0x00ff }, "movem.l a0-a7,-(a0)" }, // aで連続
573: { { 0x48e0, 0x6186 }, "movem.l d1-d2/d7/a0/a5-a6,-(a0)" }, // 複雑なの
574: // movec (制御レジスタだけ確認、向きはもういいだろう)
575: { { 0x4e7b, 0x0000 }, "movec.l d0,sfc" },
576: { { 0x4e7b, 0x0001 }, "movec.l d0,dfc" },
577: { { 0x4e7b, 0x0002 }, "movec.l d0,cacr" },
578: { { 0x4e7b, 0x8800 }, "movec.l a0,usp" },
579: { { 0x4e7b, 0x8801 }, "movec.l a0,vbr" },
580: { { 0x4e7b, 0x8802 }, "movec.l a0,caar" },
581: { { 0x4e7b, 0x8803 }, "movec.l a0,msp" },
582: { { 0x4e7b, 0x8804 }, "movec.l a0,isp" },
583: // condition
584: { { 0x50fc }, "trapt" },
585: { { 0x51fc }, "trapf" },
586: { { 0x52fc }, "traphi" },
587: { { 0x53fc }, "trapls" },
588: { { 0x54fc }, "trapcc" },
589: { { 0x55fc }, "trapcs" },
590: { { 0x56fc }, "trapne" },
591: { { 0x57fc }, "trapeq" },
592: { { 0x58fc }, "trapvc" },
593: { { 0x59fc }, "trapvs" },
594: { { 0x5afc }, "trappl" },
595: { { 0x5bfc }, "trapmi" },
596: { { 0x5cfc }, "trapge" },
597: { { 0x5dfc }, "traplt" },
598: { { 0x5efc }, "trapgt" },
599: { { 0x5ffc }, "traple" },
600:
601: // MMU
602: { { 0xf010, 0x0800 }, "pmove.l (a0),tt0" },
603: { { 0xf010, 0x0900 }, "pmovefd.l (a0),tt0" },
604: { { 0xf010, 0x0a00 }, "pmove.l tt0,(a0)" },
605: { { 0xf010, 0x0c00 }, "pmove.l (a0),tt1" },
606: { { 0xf010, 0x0d00 }, "pmovefd.l (a0),tt1" },
607: { { 0xf010, 0x0e00 }, "pmove.l tt1,(a0)" },
608: { { 0xf010, 0x2000 }, "ploadw sfc,(a0)" },
609: { { 0xf010, 0x2008 }, "ploadw d0,(a0)" },
610: { { 0xf010, 0x2017 }, "ploadw #7,(a0)" },
611: { { 0xf010, 0x2201 }, "ploadr dfc,(a0)" },
612: { { 0xf010, 0x2208 }, "ploadr d0,(a0)" },
613: { { 0xf010, 0x2210 }, "ploadr #0,(a0)" },
614: { { 0xf000, 0x2400 }, "pflusha" },
615: { { 0xf000, 0x30e0 }, "pflush sfc,#7" },
616: { { 0xf000, 0x3011 }, "pflush #1,#0" },
617: { { 0xf010, 0x38e0 }, "pflush sfc,#7,(a0)" },
618: { { 0xf010, 0x3811 }, "pflush #1,#0,(a0)" },
619: { { 0xf010, 0x4000 }, "pmove.l (a0),tc" },
620: { { 0xf010, 0x4100 }, "pmovefd.l (a0),tc" },
621: { { 0xf010, 0x4200 }, "pmove.l tc,(a0)" },
622: { { 0xf010, 0x4800 }, "pmove.q (a0),srp" },
623: { { 0xf010, 0x4900 }, "pmovefd.q (a0),srp" },
624: { { 0xf010, 0x4a00 }, "pmove.q srp,(a0)" },
625: { { 0xf010, 0x4c00 }, "pmove.q (a0),crp" },
626: { { 0xf010, 0x4d00 }, "pmovefd.q (a0),crp" },
627: { { 0xf010, 0x4e00 }, "pmove.q crp,(a0)" },
628: { { 0xf010, 0x6000 }, "pmove.w (a0),mmusr" },
629: { { 0xf010, 0x6200 }, "pmove.w mmusr,(a0)" },
630: { { 0xf010, 0x8000 }, "ptestw sfc,(a0),#0" },
631: { { 0xf010, 0x9d21 }, "ptestw dfc,(a0),#7,a1" },
632: { { 0xf010, 0x8208 }, "ptestr d0,(a0),#0" },
633: { { 0xf010, 0x9ff7 }, "ptestr #7,(a0),#7,a7" },
634:
635: // FPU
636: { { 0xf200, 0x0000 }, "fmove.x fp0,fp0" },
637: { { 0xf200, 0x0500 }, "fmove.x fp1,fp2" },
638: { { 0xf200, 0x0001 }, "fint.x fp0" },
639: { { 0xf200, 0x0501 }, "fint.x fp1,fp2" },
640: { { 0xf200, 0x0002 }, "fsinh.x fp0" },
641: { { 0xf200, 0x0502 }, "fsinh.x fp1,fp2" },
642: { { 0xf200, 0x0003 }, "fintrz.x fp0" },
643: { { 0xf200, 0x0503 }, "fintrz.x fp1,fp2" },
644: { { 0xf200, 0x0004 }, "fsqrt.x fp0" },
645: { { 0xf200, 0x0504 }, "fsqrt.x fp1,fp2" },
646: { { 0xf200, 0x0006 }, "flognp1.x fp0" },
647: { { 0xf200, 0x0506 }, "flognp1.x fp1,fp2" },
648: { { 0xf200, 0x0008 }, "fetoxm1.x fp0" },
649: { { 0xf200, 0x0508 }, "fetoxm1.x fp1,fp2" },
650: { { 0xf200, 0x0009 }, "ftanh.x fp0" },
651: { { 0xf200, 0x0509 }, "ftanh.x fp1,fp2" },
652: { { 0xf200, 0x000a }, "fatan.x fp0" },
653: { { 0xf200, 0x050a }, "fatan.x fp1,fp2" },
654: { { 0xf200, 0x000c }, "fasin.x fp0" },
655: { { 0xf200, 0x050c }, "fasin.x fp1,fp2" },
656: { { 0xf200, 0x000d }, "fatanh.x fp0" },
657: { { 0xf200, 0x050d }, "fatanh.x fp1,fp2" },
658: { { 0xf200, 0x000e }, "fsin.x fp0" },
659: { { 0xf200, 0x050e }, "fsin.x fp1,fp2" },
660: { { 0xf200, 0x000f }, "ftan.x fp0" },
661: { { 0xf200, 0x050f }, "ftan.x fp1,fp2" },
662: { { 0xf200, 0x0010 }, "fetox.x fp0" },
663: { { 0xf200, 0x0510 }, "fetox.x fp1,fp2" },
664: { { 0xf200, 0x0011 }, "ftwotox.x fp0" },
665: { { 0xf200, 0x0511 }, "ftwotox.x fp1,fp2" },
666: { { 0xf200, 0x0012 }, "ftentox.x fp0" },
667: { { 0xf200, 0x0512 }, "ftentox.x fp1,fp2" },
668: { { 0xf200, 0x0014 }, "flogn.x fp0" },
669: { { 0xf200, 0x0514 }, "flogn.x fp1,fp2" },
670: { { 0xf200, 0x0015 }, "flog10.x fp0" },
671: { { 0xf200, 0x0515 }, "flog10.x fp1,fp2" },
672: { { 0xf200, 0x0016 }, "flog2.x fp0" },
673: { { 0xf200, 0x0516 }, "flog2.x fp1,fp2" },
674: { { 0xf200, 0x0018 }, "fabs.x fp0" },
675: { { 0xf200, 0x0518 }, "fabs.x fp1,fp2" },
676: { { 0xf200, 0x0019 }, "fcosh.x fp0" },
677: { { 0xf200, 0x0519 }, "fcosh.x fp1,fp2" },
678: { { 0xf200, 0x001a }, "fneg.x fp0" },
679: { { 0xf200, 0x051a }, "fneg.x fp1,fp2" },
680: { { 0xf200, 0x001c }, "facos.x fp0" },
681: { { 0xf200, 0x051c }, "facos.x fp1,fp2" },
682: { { 0xf200, 0x001d }, "fcos.x fp0" },
683: { { 0xf200, 0x051d }, "fcos.x fp1,fp2" },
684: { { 0xf200, 0x001e }, "fgetexp.x fp0" },
685: { { 0xf200, 0x051e }, "fgetexp.x fp1,fp2" },
686: { { 0xf200, 0x001f }, "fgetman.x fp0" },
687: { { 0xf200, 0x051f }, "fgetman.x fp1,fp2" },
688: { { 0xf200, 0x0020 }, "fdiv.x fp0" },
689: { { 0xf200, 0x0520 }, "fdiv.x fp1,fp2" },
690: { { 0xf200, 0x0021 }, "fmod.x fp0" },
691: { { 0xf200, 0x0521 }, "fmod.x fp1,fp2" },
692: { { 0xf200, 0x0022 }, "fadd.x fp0" },
693: { { 0xf200, 0x0522 }, "fadd.x fp1,fp2" },
694: { { 0xf200, 0x0023 }, "fmul.x fp0" },
695: { { 0xf200, 0x0523 }, "fmul.x fp1,fp2" },
696: { { 0xf200, 0x0024 }, "fsgldiv.x fp0" },
697: { { 0xf200, 0x0524 }, "fsgldiv.x fp1,fp2" },
698: { { 0xf200, 0x0025 }, "frem.x fp0" },
699: { { 0xf200, 0x0525 }, "frem.x fp1,fp2" },
700: { { 0xf200, 0x0026 }, "fscale.x fp0" },
701: { { 0xf200, 0x0526 }, "fscale.x fp1,fp2" },
702: { { 0xf200, 0x0027 }, "fsglmul.x fp0" },
703: { { 0xf200, 0x0527 }, "fsglmul.x fp1,fp2" },
704: { { 0xf200, 0x0028 }, "fsub.x fp0" },
705: { { 0xf200, 0x0528 }, "fsub.x fp1,fp2" },
706: { { 0xf200, 0x05b2 }, "fsincos.x fp1,fp2:fp3" },
707: { { 0xf200, 0x04b1 }, "fsincos.x fp1,fp1:fp1" },
708: { { 0xf200, 0x0038 }, "fcmp.x fp0" },
709: { { 0xf200, 0x0538 }, "fcmp.x fp1,fp2" },
710: { { 0xf200, 0x003a }, "ftst.x fp0" },
711: { { 0xf200, 0x053a }, "ftst.x fp1,fp2" },
712:
713: { { 0xf210, 0x4080 }, "fmove.l (a0),fp1" },
714: { { 0xf210, 0x4480 }, "fmove.s (a0),fp1" },
715: { { 0xf210, 0x4880 }, "fmove.x (a0),fp1" },
716: { { 0xf210, 0x4c80 }, "fmove.p (a0),fp1" },
717: { { 0xf210, 0x5080 }, "fmove.w (a0),fp1" },
718: { { 0xf210, 0x5480 }, "fmove.d (a0),fp1" },
719: { { 0xf210, 0x5880 }, "fmove.b (a0),fp1" },
720: { { 0xf23c, 0x4080, 0x89ab,0xcdef}, "fmove.l #$89abcdef,fp1" },
721: { { 0xf23c, 0x4480, 0x89ab,0xcdef}, "fmove.s #$89abcdef,fp1" },
722: { { 0xf23c, 0x4880, 0x89ab,0xcdef, 0x1122,0x3344, 0x5566, 0x7788 },
723: "fmove.x #$89abcdef_11223344_55667788,fp1" },
724: { { 0xf23c, 0x4c80, 0x89ab,0xcdef, 0x1122,0x3344, 0x5566, 0x7788 },
725: "fmove.p #$89abcdef_11223344_55667788,fp1" },
726: { { 0xf23c, 0x5080, 0x89ab }, "fmove.w #$89ab,fp1" },
727: { { 0xf23c, 0x5480, 0x89ab,0xcdef, 0x1122,0x3344 },
728: "fmove.d #$89abcdef_11223344,fp1" },
729: { { 0xf23c, 0x5880, 0x89ab }, "fmove.b #$ab,fp1" },
730: // 代表で fmove 以外のを1つだけ
731: { { 0xf210, 0x4081 }, "fint.l (a0),fp1" },
732: { { 0xf210, 0x4481 }, "fint.s (a0),fp1" },
733: { { 0xf210, 0x4881 }, "fint.x (a0),fp1" },
734: { { 0xf210, 0x4c81 }, "fint.p (a0),fp1" },
735: { { 0xf210, 0x5081 }, "fint.w (a0),fp1" },
736: { { 0xf210, 0x5481 }, "fint.d (a0),fp1" },
737: { { 0xf210, 0x5881 }, "fint.b (a0),fp1" },
738:
739: { { 0xf200, 0x5c81 }, "fmovecr.x #$01,fp1" }, // 不正定数
740: { { 0xf200, 0x5cff }, "fmovecr.x #$7f,fp1" },
741: { { 0xf200, 0x5c80 }, "fmovecr.x #$00<pi>,fp1" },
742: { { 0xf200, 0x5c8b }, "fmovecr.x #$0b<log10(2)>,fp1" },
743: { { 0xf200, 0x5c8c }, "fmovecr.x #$0c<e>,fp1" },
744: { { 0xf200, 0x5c8d }, "fmovecr.x #$0d<log2(e)>,fp1" },
745: { { 0xf200, 0x5c8e }, "fmovecr.x #$0e<log10(e)>,fp1" },
746: { { 0xf200, 0x5c8f }, "fmovecr.x #$0f<0>,fp1" },
747: { { 0xf200, 0x5cb0 }, "fmovecr.x #$30<ln(2)>,fp1" },
748: { { 0xf200, 0x5cb1 }, "fmovecr.x #$31<ln(10)>,fp1" },
749: { { 0xf200, 0x5cb2 }, "fmovecr.x #$32<1>,fp1" },
750: { { 0xf200, 0x5cb3 }, "fmovecr.x #$33<10>,fp1" },
751: { { 0xf200, 0x5cb4 }, "fmovecr.x #$34<1e2>,fp1" },
752: { { 0xf200, 0x5cb5 }, "fmovecr.x #$35<1e4>,fp1" },
753: { { 0xf200, 0x5cb6 }, "fmovecr.x #$36<1e8>,fp1" },
754: { { 0xf200, 0x5cb7 }, "fmovecr.x #$37<1e16>,fp1" },
755: { { 0xf200, 0x5cb8 }, "fmovecr.x #$38<1e32>,fp1" },
756: { { 0xf200, 0x5cb9 }, "fmovecr.x #$39<1e64>,fp1" },
757: { { 0xf200, 0x5cba }, "fmovecr.x #$3a<1e128>,fp1" },
758: { { 0xf200, 0x5cbb }, "fmovecr.x #$3b<1e256>,fp1" },
759: { { 0xf200, 0x5cbc }, "fmovecr.x #$3c<1e512>,fp1" },
760: { { 0xf200, 0x5cbd }, "fmovecr.x #$3d<1e1024>,fp1" },
761: { { 0xf200, 0x5cbe }, "fmovecr.x #$3e<1e2048>,fp1" },
762: { { 0xf200, 0x5cbf }, "fmovecr.x #$3f<1e4096>,fp1" },
763:
764: { { 0xf210, 0x6080 }, "fmove.l fp1,(a0)" },
765: { { 0xf210, 0x6480 }, "fmove.s fp1,(a0)" },
766: { { 0xf210, 0x6880 }, "fmove.x fp1,(a0)" },
767: { { 0xf210, 0x6c80 }, "fmove.p fp1,(a0){#0}" },
768: { { 0xf210, 0x6cbf }, "fmove.p fp1,(a0){#63}" },
769: { { 0xf210, 0x6cc0 }, "fmove.p fp1,(a0){#-64}" },
770: { { 0xf210, 0x7080 }, "fmove.w fp1,(a0)" },
771: { { 0xf210, 0x7480 }, "fmove.d fp1,(a0)" },
772: { { 0xf210, 0x7880 }, "fmove.b fp1,(a0)" },
773: { { 0xf210, 0x7cf0 }, "fmove.p fp1,(a0){d7}" },
774:
775: { { 0xf210, 0x8400 }, "fmove.l (a0),fpiar" },
776: { { 0xf210, 0x8800 }, "fmove.l (a0),fpsr" },
777: { { 0xf210, 0x8c00 }, "fmovem.l (a0),fpsr/fpiar" },
778: { { 0xf210, 0x9000 }, "fmove.l (a0),fpcr" },
779: { { 0xf210, 0x9400 }, "fmovem.l (a0),fpcr/fpiar" },
780: { { 0xf210, 0x9800 }, "fmovem.l (a0),fpcr/fpsr" },
781: { { 0xf210, 0x9c00 }, "fmovem.l (a0),fpcr/fpsr/fpiar" },
782: { { 0xf23c, 0x8400, 0x89ab,0xcdef },"fmove.l #$89abcdef,fpiar" },
783: { { 0xf23c, 0x8800, 0x89ab,0xcdef },"fmove.l #$89abcdef,fpsr" },
784: { { 0xf23c, 0x8c00, 0x89ab,0xcdef, 0xabcd,0xef01 },
785: "fmovem.l #$89abcdef/#$abcdef01,fpsr/fpiar" },
786: { { 0xf23c, 0x9000, 0x89ab,0xcdef },"fmove.l #$89abcdef,fpcr" },
787: { { 0xf23c, 0x9400, 0x89ab,0xcdef, 0xabcd,0xef01 },
788: "fmovem.l #$89abcdef/#$abcdef01,fpcr/fpiar" },
789: { { 0xf23c, 0x9800, 0x89ab,0xcdef, 0xabcd,0xef01 },
790: "fmovem.l #$89abcdef/#$abcdef01,fpcr/fpsr" },
791: { { 0xf23c, 0x9c00, 0x89ab,0xcdef, 0xabcd,0xef01, 0xcdef,0x1234 },
792: "fmovem.l #$89abcdef/#$abcdef01/#$cdef1234,fpcr/fpsr/fpiar" },
793: { { 0xf210, 0xa400 }, "fmove.l fpiar,(a0)" },
794: { { 0xf210, 0xa800 }, "fmove.l fpsr,(a0)" },
795: { { 0xf210, 0xac00 }, "fmovem.l fpsr/fpiar,(a0)" },
796: { { 0xf210, 0xb000 }, "fmove.l fpcr,(a0)" },
797: { { 0xf210, 0xb400 }, "fmovem.l fpcr/fpiar,(a0)" },
798: { { 0xf210, 0xb800 }, "fmovem.l fpcr/fpsr,(a0)" },
799: { { 0xf210, 0xbc00 }, "fmovem.l fpcr/fpsr/fpiar,(a0)" },
800:
801: { { 0xf210, 0xd080 }, "fmovem.x (a0),fp0" },
802: { { 0xf210, 0xd810 }, "fmovem.x (a0),d1" },
803: { { 0xf220, 0xe801 }, "fmovem.x fp0,-(a0)" },
804: { { 0xf210, 0xf080 }, "fmovem.x fp0,(a0)" },
805: { { 0xf210, 0xf810 }, "fmovem.x d1,(a0)" },
806: // fmovem (制御・ポストインクリメント)
807: { { 0xf210, 0xf000 }, "fmovem.x nofpn,(a0)" }, // リストなし
808: { { 0xf210, 0xf0c0 }, "fmovem.x fp0-fp1,(a0)" }, // 連続
809: { { 0xf210, 0xf0ec }, "fmovem.x fp0-fp2/fp4-fp5,(a0)" },// 区間が複数
810: { { 0xf210, 0xf00f }, "fmovem.x fp4-fp7,(a0)" }, // fp7で終わる
811: // fmovem (プリデクリメント)
812: { { 0xf220, 0xe800 }, "fmovem.x nofpn,-(a0)" }, // リストなし
813: { { 0xf220, 0xe803 }, "fmovem.x fp0-fp1,-(a0)" }, // 連続
814: { { 0xf220, 0xe837 }, "fmovem.x fp0-fp2/fp4-fp5,-(a0)"},// 区間が複数
815: { { 0xf220, 0xe8f0 }, "fmovem.x fp4-fp7,-(a0)" }, // fp7で終わる
816:
817: { { 0xf240, 0x0001 }, "fseq.b d0" },
818: { { 0xf249, 0x0001, 0xfffe }, "fdbeq d1,$00000100" },
819: { { 0xf27a, 0x0001, 0x89ab }, "ftrapeq.w #$89ab" },
820: { { 0xf27b, 0x0001, 0x89ab, 0xcdef},"ftrapeq.l #$89abcdef" },
821: { { 0xf27c, 0x0001 }, "ftrapeq" },
822: { { 0xf281, 0xfffe }, "fbeq.w $00000100" },
823: { { 0xf2c1, 0xffff, 0xfffe }, "fbeq.l $00000100" },
824: { { 0xf280, 0x0000 }, "fnop" },
825: { { 0xf280, 0xfffe }, "fbf.w $00000100" },
826: { { 0xf310 }, "fsave (a0)" },
827: { { 0xf350 }, "frestore (a0)" },
828: };
829:
1.1.1.5 root 830: static uint8 ram[1024];
1.1.1.3 root 831: static int failed;
1.1 root 832:
1.1.1.6 root 833: #include "test_debugger_memory.cpp"
1.1 root 834:
835: // リンカを通すためのダミー
1.1.1.6 root 836: DisasmLine::~DisasmLine() { }
1.1.1.5 root 837: DebuggerMD::~DebuggerMD() { }
1.1 root 838:
839: int
840: main(int ac, char *av[])
841: {
1.1.1.7 ! root 842: busaddr saddr;
1.1 root 843:
1.1.1.5 root 844: // DebuggerMD (の継承クラス)を用意するのは芋づる式に大変なので、
845: // 中でアクセスする変数だけ強引に用意する。
846: DebuggerMD *md = (DebuggerMD *)malloc(sizeof(DebuggerMD));
847: md->inst_bytes = 2;
848:
1.1 root 849: for (int i = 0; i < countof(table); i++) {
850: std::string expected = table[i].expected;
851: std::vector<uint16> inst = table[i].inst;
852:
853: // エラー表示用
854: std::string inst_str;
855: for (const auto j : inst) {
856: inst_str += string_format(" %04x", j);
857: }
858:
859: // 全体を初期化
1.1.1.5 root 860: memset(ram, 0xdd, sizeof(ram));
1.1 root 861: // 100番地から命令列を書き込む
862: for (int j = 0; j < inst.size(); j++) {
1.1.1.5 root 863: *(uint16 *)(ram + 0x100 + j * 2) = inst[j];
1.1 root 864: }
865: // 検査
1.1.1.5 root 866: saddr = 0x100;
1.1.1.6 root 867: m680x0disasm dis;
868: DebuggerMemoryStream mem(NULL, saddr);
869: dis.Exec(&mem);
1.1 root 870: // 照合
1.1.1.2 root 871: if (dis.text != expected) {
1.1 root 872: printf(">%s expects \"%s\" but \"%s\"\n", inst_str.c_str(),
1.1.1.2 root 873: expected.c_str(), dis.text.c_str());
1.1 root 874: failed++;
875: continue;
876: }
1.1.1.2 root 877: uint32 expected_len = inst.size() * 2;
878: if (dis.bin.size() != expected_len) {
879: printf(">%s expects len=$%x but $%x\n", inst_str.c_str(),
880: expected_len, (uint)dis.bin.size());
1.1 root 881: failed++;
882: continue;
883: }
884: }
885:
886: int total = countof(table);
887: printf("%d tests, %d success", total, total - failed);
888: if (failed > 0) {
889: printf(", %d failed", failed);
890: }
891: printf("\n");
892: return 0;
893: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.