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