|
|
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.9 root 7: #include "m680x0disasm.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" },
1.1.1.9 root 21: { { 0x00d0, 0x9000 }, "cmp2.b (a0),a1" },
1.1 root 22: { { 0x00f8, 0x9000, 0x89ab }, "cmp2.b $89ab,a1" },
1.1.1.9 root 23: { { 0x00d0, 0x9800 }, "chk2.b (a0),a1" },
1.1 root 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" },
1.1.1.9 root 42: { { 0x02d0, 0x9000 }, "cmp2.w (a0),a1" },
1.1 root 43: { { 0x02f8, 0x9000, 0x89ab }, "cmp2.w $89ab,a1" },
1.1.1.9 root 44: { { 0x02d0, 0x9800 }, "chk2.w (a0),a1" },
1.1 root 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" },
1.1.1.9 root 49: { { 0x04d0, 0x9000 }, "cmp2.l (a0),a1" },
1.1 root 50: { { 0x04f8, 0x9000, 0x89ab }, "cmp2.l $89ab,a1" },
1.1.1.9 root 51: { { 0x04d0, 0x9800 }, "chk2.l (a0),a1" },
1.1 root 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" },
1.1.1.9 root 69: { { 0x0ad0, 0x0081 }, "cas.b d1,d2,(a0)" },
1.1 root 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" },
1.1.1.9 root 74: { { 0x0cd0, 0x0081 }, "cas.w d1,d2,(a0)" },
1.1 root 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" },
1.1.1.9 root 83: { { 0x0ed0, 0x0081 }, "cas.l d1,d2,(a0)" },
1.1 root 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" },
1.1.1.9 root 116: { { 0x1f7c, 0x0012, 0x89ab }, "move.b #$12,-$7655(a7)" },
1.1 root 117:
118: { { 0x4000 }, "negx.b d0" },
119: { { 0x4040 }, "negx.w d0" },
120: { { 0x4080 }, "negx.l d0" },
121: { { 0x40c0 }, "move.w sr,d0" },
122: { { 0x4300 }, "chk.l d0,d1" },
123: { { 0x4380 }, "chk.w d0,d1" },
124: { { 0x43d0 }, "lea.l (a0),a1" },
125: { { 0x49c0 }, "extb.l d0" },
126: { { 0x4200 }, "clr.b d0" },
127: { { 0x4240 }, "clr.w d0" },
128: { { 0x4280 }, "clr.l d0" },
129: { { 0x42c0 }, "move.w ccr,d0" },
130: { { 0x4400 }, "neg.b d0" },
131: { { 0x4440 }, "neg.w d0" },
132: { { 0x4480 }, "neg.l d0" },
133: { { 0x44c0 }, "move.w d0,ccr" },
134: { { 0x4600 }, "not.b d0" },
135: { { 0x4640 }, "not.w d0" },
136: { { 0x4680 }, "not.l d0" },
137: { { 0x46c0 }, "move.w d0,sr" },
138: { { 0x4800 }, "nbcd.b d0" },
139: { { 0x4808, 0x89ab, 0xcdef }, "link.l a0,#-$76543211" },
140: { { 0x4840 }, "swap.w d0" },
141: { { 0x4849 }, "bkpt #1" },
142: { { 0x4850 }, "pea.l (a0)" },
143: { { 0x4880 }, "ext.w d0" },
144: { { 0x4890, 0x0101 }, "movem.w d0/a0,(a0)" },
145: { { 0x48b8, 0x0101, 0x89ab }, "movem.w d0/a0,$89ab" },
146: { { 0x48c0 }, "ext.l d0" },
147: { { 0x48d0, 0x0101 }, "movem.l d0/a0,(a0)" },
148: { { 0x48f8, 0x0101, 0x89ab }, "movem.l d0/a0,$89ab" },
149: { { 0x4a00 }, "tst.b d0" },
150: { { 0x4a40 }, "tst.w d0" },
151: { { 0x4a80 }, "tst.l d0" },
152: { { 0x4ac0 }, "tas.b d0" },
153: { { 0x4afc }, "illegal" },
154: // ※ mul[us].l <ea>,dh:dl (h==l) はニーモニックとしては正しい
155: { { 0x4c38, 0x1000, 0x89ab }, "mulu.l $89ab,d1" },
156: { { 0x4c38, 0x1401, 0x89ab }, "mulu.l $89ab,d1:d1" }, // ※
157: { { 0x4c38, 0x1402, 0x89ab }, "mulu.l $89ab,d2:d1" },
158: { { 0x4c38, 0x1800, 0x89ab }, "muls.l $89ab,d1" },
159: { { 0x4c38, 0x1c01, 0x89ab }, "muls.l $89ab,d1:d1" }, // ※
160: { { 0x4c38, 0x1c02, 0x89ab }, "muls.l $89ab,d2:d1" },
161: { { 0x4c78, 0x1001, 0x89ab }, "divu.l $89ab,d1" },
162: { { 0x4c78, 0x1002, 0x89ab }, "divu.l $89ab,d2:d1" },
163: { { 0x4c78, 0x1402, 0x89ab }, "divul.l $89ab,d2:d1" },
164: { { 0x4c78, 0x1801, 0x89ab }, "divs.l $89ab,d1" },
165: { { 0x4c78, 0x1802, 0x89ab }, "divs.l $89ab,d2:d1" },
166: { { 0x4c78, 0x1c02, 0x89ab }, "divsl.l $89ab,d2:d1" },
167: { { 0x4c90, 0x0101 }, "movem.w (a0),d0/a0" },
168: { { 0x4cb8, 0x0101, 0x89ab }, "movem.w $89ab,d0/a0" },
169: { { 0x4cd0, 0x0101 }, "movem.l (a0),d0/a0" },
170: { { 0x4cf8, 0x0101, 0x89ab }, "movem.l $89ab,d0/a0" },
171: { { 0x4e4f }, "trap #15" },
172: { { 0x4e50, 0x89ab }, "link.w a0,#-$7655" },
173: { { 0x4e58 }, "unlk a0" },
174: { { 0x4e60 }, "move.l a0,usp" },
175: { { 0x4e68 }, "move.l usp,a0" },
176: { { 0x4e70 }, "reset" },
177: { { 0x4e71 }, "nop" },
178: { { 0x4e72, 0x89ab }, "stop #$89ab" },
179: { { 0x4e73 }, "rte" },
180: { { 0x4e74, 0x89ab }, "rtd #$89ab" },
181: { { 0x4e75 }, "rts" },
182: { { 0x4e76 }, "trapv" },
183: { { 0x4e77 }, "rtr" },
184: { { 0x4e7a, 0x8801 }, "movec.l vbr,a0" },
185: { { 0x4e7b, 0x8801 }, "movec.l a0,vbr" },
186: { { 0x4e90 }, "jsr (a0)" },
187: { { 0x4ed0 }, "jmp (a0)" },
188:
189: { { 0x5000 }, "addq.b #8,d0" },
190: { { 0x5040 }, "addq.w #8,d0" },
191: { { 0x5048 }, "addq.w #8,a0" }, // .l にする?
192: { { 0x5080 }, "addq.l #8,d0" },
193: { { 0x5088 }, "addq.l #8,a0" },
194: { { 0x50c0 }, "st.b d0" },
195: { { 0x50c8, 0xfffe }, "dbt.w d0,$00000100" },
196: { { 0x51c8, 0xfffe }, "dbra.w d0,$00000100" },
197: { { 0x50fa, 0x89ab }, "trapt.w #$89ab" },
198: { { 0x50fb, 0x89ab, 0xcdef }, "trapt.l #$89abcdef" },
199: { { 0x50fc }, "trapt" },
200: { { 0x5100 }, "subq.b #8,d0" },
201: { { 0x5140 }, "subq.w #8,d0" },
202: { { 0x5148 }, "subq.w #8,a0" }, // .l にする?
203: { { 0x5180 }, "subq.l #8,d0" },
204: { { 0x5188 }, "subq.l #8,a0" },
205:
206: { { 0x6000, 0xfffe }, "bra.w $00000100" },
207: { { 0x60fe }, "bra.b $00000100" },
208: { { 0x60ff, 0xffff, 0xfffe }, "bra.l $00000100" },
209: { { 0x6100, 0xfffe }, "bsr.w $00000100" },
210: { { 0x61fe }, "bsr.b $00000100" },
211: { { 0x61ff, 0xffff, 0xfffe }, "bsr.l $00000100" },
212: { { 0x6200, 0xfffe }, "bhi.w $00000100" },
213: { { 0x62fe }, "bhi.b $00000100" },
214: { { 0x62ff, 0xffff, 0xfffe }, "bhi.l $00000100" },
215:
216: { { 0x727f }, "moveq.l #$7f,d1" },
217: { { 0x7280 }, "moveq.l #$ffffff80,d1" },
218:
219: { { 0x8200 }, "or.b d0,d1" },
220: { { 0x8240 }, "or.w d0,d1" },
221: { { 0x8280 }, "or.l d0,d1" },
222: { { 0x82c0 }, "divu.w d0,d1" },
223: { { 0x8300 }, "sbcd.b d0,d1" },
224: { { 0x8308 }, "sbcd.b -(a0),-(a1)" },
225: { { 0x8310 }, "or.b d1,(a0)" },
226: { { 0x8340, 0x89ab }, "pack d0,d1,#$89ab" },
227: { { 0x8348, 0x89ab }, "pack -(a0),-(a1),#$89ab" },
228: { { 0x8350 }, "or.w d1,(a0)" },
229: { { 0x8380, 0x89ab }, "unpk d0,d1,#$89ab" },
230: { { 0x8388, 0x89ab }, "unpk -(a0),-(a1),#$89ab" },
231: { { 0x8390 }, "or.l d1,(a0)" },
232: { { 0x83c0 }, "divs.w d0,d1" },
233:
234: { { 0x9200 }, "sub.b d0,d1" },
235: { { 0x9240 }, "sub.w d0,d1" },
236: { { 0x9280 }, "sub.l d0,d1" },
237: { { 0x92c0 }, "suba.w d0,a1" },
238: { { 0x9300 }, "subx.b d0,d1" },
239: { { 0x9308 }, "subx.b -(a0),-(a1)" },
240: { { 0x9310 }, "sub.b d1,(a0)" },
241: { { 0x9340 }, "subx.w d0,d1" },
242: { { 0x9348 }, "subx.w -(a0),-(a1)" },
243: { { 0x9350 }, "sub.w d1,(a0)" },
244: { { 0x9380 }, "subx.l d0,d1" },
245: { { 0x9388 }, "subx.l -(a0),-(a1)" },
246: { { 0x9390 }, "sub.l d1,(a0)" },
247: { { 0x93c0 }, "suba.l d0,a1" },
248:
249: // A-Line
250:
251: { { 0xb200 }, "cmp.b d0,d1" },
252: { { 0xb240 }, "cmp.w d0,d1" },
253: { { 0xb280 }, "cmp.l d0,d1" },
254: { { 0xb2c0 }, "cmpa.w d0,a1" },
255: { { 0xb300 }, "eor.b d1,d0" },
256: { { 0xb308 }, "cmpm.b (a0)+,(a1)+" },
257: { { 0xb340 }, "eor.w d1,d0" },
258: { { 0xb348 }, "cmpm.w (a0)+,(a1)+" },
259: { { 0xb380 }, "eor.l d1,d0" },
260: { { 0xb388 }, "cmpm.l (a0)+,(a1)+" },
261: { { 0xb3c0 }, "cmpa.l d0,a1" },
262:
263: { { 0xc200 }, "and.b d0,d1" },
264: { { 0xc240 }, "and.w d0,d1" },
265: { { 0xc280 }, "and.l d0,d1" },
266: { { 0xc2c0 }, "mulu.w d0,d1" },
267: { { 0xc300 }, "abcd.b d0,d1" },
268: { { 0xc308 }, "abcd.b -(a0),-(a1)" },
269: { { 0xc310 }, "and.b d1,(a0)" },
270: { { 0xc340 }, "exg.l d1,d0" },
271: { { 0xc348 }, "exg.l a1,a0" },
272: { { 0xc350 }, "and.w d1,(a0)" },
273: { { 0xc388 }, "exg.l d1,a0" },
274: { { 0xc390 }, "and.l d1,(a0)" },
275: { { 0xc3c0 }, "muls.w d0,d1" },
276:
277: { { 0xd200 }, "add.b d0,d1" },
278: { { 0xd240 }, "add.w d0,d1" },
279: { { 0xd280 }, "add.l d0,d1" },
280: { { 0xd2c0 }, "adda.w d0,a1" },
281: { { 0xd300 }, "addx.b d0,d1" },
282: { { 0xd308 }, "addx.b -(a0),-(a1)" },
283: { { 0xd310 }, "add.b d1,(a0)" },
284: { { 0xd340 }, "addx.w d0,d1" },
285: { { 0xd348 }, "addx.w -(a0),-(a1)" },
286: { { 0xd350 }, "add.w d1,(a0)" },
287: { { 0xd380 }, "addx.l d0,d1" },
288: { { 0xd388 }, "addx.l -(a0),-(a1)" },
289: { { 0xd390 }, "add.l d1,(a0)" },
290: { { 0xd3c0 }, "adda.l d0,a1" },
291:
292: { { 0xe000 }, "asr.b #8,d0" },
293: { { 0xe008 }, "lsr.b #8,d0" },
294: { { 0xe010 }, "roxr.b #8,d0" },
295: { { 0xe018 }, "ror.b #8,d0" },
296: { { 0xe220 }, "asr.b d1,d0" },
297: { { 0xe228 }, "lsr.b d1,d0" },
298: { { 0xe230 }, "roxr.b d1,d0" },
299: { { 0xe238 }, "ror.b d1,d0" },
300:
301: { { 0xe040 }, "asr.w #8,d0" },
302: { { 0xe048 }, "lsr.w #8,d0" },
303: { { 0xe050 }, "roxr.w #8,d0" },
304: { { 0xe058 }, "ror.w #8,d0" },
305: { { 0xe260 }, "asr.w d1,d0" },
306: { { 0xe268 }, "lsr.w d1,d0" },
307: { { 0xe270 }, "roxr.w d1,d0" },
308: { { 0xe278 }, "ror.w d1,d0" },
309:
310: { { 0xe080 }, "asr.l #8,d0" },
311: { { 0xe088 }, "lsr.l #8,d0" },
312: { { 0xe090 }, "roxr.l #8,d0" },
313: { { 0xe098 }, "ror.l #8,d0" },
314: { { 0xe2a0 }, "asr.l d1,d0" },
315: { { 0xe2a8 }, "lsr.l d1,d0" },
316: { { 0xe2b0 }, "roxr.l d1,d0" },
317: { { 0xe2b8 }, "ror.l d1,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:
1.1.1.9 root 346: { { 0xe0d0 }, "asr.w (a0)" },
347: { { 0xe1d0 }, "asl.w (a0)" },
348: { { 0xe2d0 }, "lsr.w (a0)" },
349: { { 0xe3d0 }, "lsl.w (a0)" },
350: { { 0xe4d0 }, "roxr.w (a0)" },
351: { { 0xe5d0 }, "roxl.w (a0)" },
352: { { 0xe6d0 }, "ror.w (a0)" },
353: { { 0xe7d0 }, "rol.w (a0)" },
1.1 root 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:
1.1.1.9 root 555: // EA のないところが illegal になるか。
556: { { 0x4207 }, "clr.b d7" }, // dn
557: { { 0x420f }, "" }, // an
558: { { 0x4217 }, "clr.b (a7)" }, // (an)
559: { { 0x421f }, "clr.b (a7)+" }, // (an)+
560: { { 0x4227 }, "clr.b -(a7)" }, // -(an)
561: { { 0x4238, 0x89ab }, "clr.b $89ab" }, // abs.w
562: { { 0x4239, 0x89ab, 0xcdef }, "clr.b $89abcdef" }, // abs.l
563: { { 0x423a }, "" }, // d16(pc)
564: { { 0x423b }, "" }, // d8(pc,ix)
565: { { 0x423c }, "" }, // #imm
566: { { 0x423d }, "" }, // invalid
567: { { 0x423e }, "" }, // invalid
568: { { 0x423f }, "" }, // invalid
569:
1.1 root 570: // movem (制御・ポストインクリメント)
571: { { 0x48d0, 0x0000 }, "movem.l noregs,(a0)" }, // リストなし
572: { { 0x48d0, 0x0001 }, "movem.l d0,(a0)" }, // 単体
573: { { 0x48d0, 0x0006 }, "movem.l d1-d2,(a0)" }, // dで連続
574: { { 0x48d0, 0x00f6 }, "movem.l d1-d2/d4-d7,(a0)" }, // 区間が複数
575: { { 0x48d0, 0x01ff }, "movem.l d0-d7/a0,(a0)" }, // d/a をまたぐ
576: { { 0x48d0, 0x03ff }, "movem.l d0-d7/a0-a1,(a0)" }, // d/a をまたいで連続
577: { { 0x48d0, 0xff00 }, "movem.l a0-a7,(a0)" }, // aで連続
578: { { 0x48d0, 0x6186 }, "movem.l d1-d2/d7/a0/a5-a6,(a0)" }, // 複雑なの
579: // movem (プリデクリメント)
580: { { 0x48e0, 0x0000 }, "movem.l noregs,-(a0)" }, // リストなし
581: { { 0x48e0, 0x8000 }, "movem.l d0,-(a0)" }, // 単体
582: { { 0x48e0, 0x6000 }, "movem.l d1-d2,-(a0)" }, // dで連続
583: { { 0x48e0, 0x6f00 }, "movem.l d1-d2/d4-d7,-(a0)" },// 区間が複数
584: { { 0x48e0, 0xff80 }, "movem.l d0-d7/a0,-(a0)" }, // d/a をまたぐ
585: { { 0x48e0, 0xffc0 }, "movem.l d0-d7/a0-a1,-(a0)" },// d/a をまたいで連続
586: { { 0x48e0, 0x00ff }, "movem.l a0-a7,-(a0)" }, // aで連続
587: { { 0x48e0, 0x6186 }, "movem.l d1-d2/d7/a0/a5-a6,-(a0)" }, // 複雑なの
588: // movec (制御レジスタだけ確認、向きはもういいだろう)
589: { { 0x4e7b, 0x0000 }, "movec.l d0,sfc" },
590: { { 0x4e7b, 0x0001 }, "movec.l d0,dfc" },
591: { { 0x4e7b, 0x0002 }, "movec.l d0,cacr" },
592: { { 0x4e7b, 0x8800 }, "movec.l a0,usp" },
593: { { 0x4e7b, 0x8801 }, "movec.l a0,vbr" },
594: { { 0x4e7b, 0x8802 }, "movec.l a0,caar" },
595: { { 0x4e7b, 0x8803 }, "movec.l a0,msp" },
596: { { 0x4e7b, 0x8804 }, "movec.l a0,isp" },
597: // condition
598: { { 0x50fc }, "trapt" },
599: { { 0x51fc }, "trapf" },
600: { { 0x52fc }, "traphi" },
601: { { 0x53fc }, "trapls" },
602: { { 0x54fc }, "trapcc" },
603: { { 0x55fc }, "trapcs" },
604: { { 0x56fc }, "trapne" },
605: { { 0x57fc }, "trapeq" },
606: { { 0x58fc }, "trapvc" },
607: { { 0x59fc }, "trapvs" },
608: { { 0x5afc }, "trappl" },
609: { { 0x5bfc }, "trapmi" },
610: { { 0x5cfc }, "trapge" },
611: { { 0x5dfc }, "traplt" },
612: { { 0x5efc }, "trapgt" },
613: { { 0x5ffc }, "traple" },
614:
615: // MMU
616: { { 0xf010, 0x0800 }, "pmove.l (a0),tt0" },
617: { { 0xf010, 0x0900 }, "pmovefd.l (a0),tt0" },
618: { { 0xf010, 0x0a00 }, "pmove.l tt0,(a0)" },
619: { { 0xf010, 0x0c00 }, "pmove.l (a0),tt1" },
620: { { 0xf010, 0x0d00 }, "pmovefd.l (a0),tt1" },
621: { { 0xf010, 0x0e00 }, "pmove.l tt1,(a0)" },
622: { { 0xf010, 0x2000 }, "ploadw sfc,(a0)" },
623: { { 0xf010, 0x2008 }, "ploadw d0,(a0)" },
624: { { 0xf010, 0x2017 }, "ploadw #7,(a0)" },
625: { { 0xf010, 0x2201 }, "ploadr dfc,(a0)" },
626: { { 0xf010, 0x2208 }, "ploadr d0,(a0)" },
627: { { 0xf010, 0x2210 }, "ploadr #0,(a0)" },
628: { { 0xf000, 0x2400 }, "pflusha" },
629: { { 0xf000, 0x30e0 }, "pflush sfc,#7" },
630: { { 0xf000, 0x3011 }, "pflush #1,#0" },
631: { { 0xf010, 0x38e0 }, "pflush sfc,#7,(a0)" },
632: { { 0xf010, 0x3811 }, "pflush #1,#0,(a0)" },
633: { { 0xf010, 0x4000 }, "pmove.l (a0),tc" },
634: { { 0xf010, 0x4100 }, "pmovefd.l (a0),tc" },
635: { { 0xf010, 0x4200 }, "pmove.l tc,(a0)" },
636: { { 0xf010, 0x4800 }, "pmove.q (a0),srp" },
637: { { 0xf010, 0x4900 }, "pmovefd.q (a0),srp" },
638: { { 0xf010, 0x4a00 }, "pmove.q srp,(a0)" },
639: { { 0xf010, 0x4c00 }, "pmove.q (a0),crp" },
640: { { 0xf010, 0x4d00 }, "pmovefd.q (a0),crp" },
641: { { 0xf010, 0x4e00 }, "pmove.q crp,(a0)" },
642: { { 0xf010, 0x6000 }, "pmove.w (a0),mmusr" },
643: { { 0xf010, 0x6200 }, "pmove.w mmusr,(a0)" },
644: { { 0xf010, 0x8000 }, "ptestw sfc,(a0),#0" },
645: { { 0xf010, 0x9d21 }, "ptestw dfc,(a0),#7,a1" },
646: { { 0xf010, 0x8208 }, "ptestr d0,(a0),#0" },
647: { { 0xf010, 0x9ff7 }, "ptestr #7,(a0),#7,a7" },
648:
649: // FPU
650: { { 0xf200, 0x0000 }, "fmove.x fp0,fp0" },
651: { { 0xf200, 0x0500 }, "fmove.x fp1,fp2" },
652: { { 0xf200, 0x0001 }, "fint.x fp0" },
653: { { 0xf200, 0x0501 }, "fint.x fp1,fp2" },
654: { { 0xf200, 0x0002 }, "fsinh.x fp0" },
655: { { 0xf200, 0x0502 }, "fsinh.x fp1,fp2" },
656: { { 0xf200, 0x0003 }, "fintrz.x fp0" },
657: { { 0xf200, 0x0503 }, "fintrz.x fp1,fp2" },
658: { { 0xf200, 0x0004 }, "fsqrt.x fp0" },
659: { { 0xf200, 0x0504 }, "fsqrt.x fp1,fp2" },
660: { { 0xf200, 0x0006 }, "flognp1.x fp0" },
661: { { 0xf200, 0x0506 }, "flognp1.x fp1,fp2" },
662: { { 0xf200, 0x0008 }, "fetoxm1.x fp0" },
663: { { 0xf200, 0x0508 }, "fetoxm1.x fp1,fp2" },
664: { { 0xf200, 0x0009 }, "ftanh.x fp0" },
665: { { 0xf200, 0x0509 }, "ftanh.x fp1,fp2" },
666: { { 0xf200, 0x000a }, "fatan.x fp0" },
667: { { 0xf200, 0x050a }, "fatan.x fp1,fp2" },
668: { { 0xf200, 0x000c }, "fasin.x fp0" },
669: { { 0xf200, 0x050c }, "fasin.x fp1,fp2" },
670: { { 0xf200, 0x000d }, "fatanh.x fp0" },
671: { { 0xf200, 0x050d }, "fatanh.x fp1,fp2" },
672: { { 0xf200, 0x000e }, "fsin.x fp0" },
673: { { 0xf200, 0x050e }, "fsin.x fp1,fp2" },
674: { { 0xf200, 0x000f }, "ftan.x fp0" },
675: { { 0xf200, 0x050f }, "ftan.x fp1,fp2" },
676: { { 0xf200, 0x0010 }, "fetox.x fp0" },
677: { { 0xf200, 0x0510 }, "fetox.x fp1,fp2" },
678: { { 0xf200, 0x0011 }, "ftwotox.x fp0" },
679: { { 0xf200, 0x0511 }, "ftwotox.x fp1,fp2" },
680: { { 0xf200, 0x0012 }, "ftentox.x fp0" },
681: { { 0xf200, 0x0512 }, "ftentox.x fp1,fp2" },
682: { { 0xf200, 0x0014 }, "flogn.x fp0" },
683: { { 0xf200, 0x0514 }, "flogn.x fp1,fp2" },
684: { { 0xf200, 0x0015 }, "flog10.x fp0" },
685: { { 0xf200, 0x0515 }, "flog10.x fp1,fp2" },
686: { { 0xf200, 0x0016 }, "flog2.x fp0" },
687: { { 0xf200, 0x0516 }, "flog2.x fp1,fp2" },
688: { { 0xf200, 0x0018 }, "fabs.x fp0" },
689: { { 0xf200, 0x0518 }, "fabs.x fp1,fp2" },
690: { { 0xf200, 0x0019 }, "fcosh.x fp0" },
691: { { 0xf200, 0x0519 }, "fcosh.x fp1,fp2" },
692: { { 0xf200, 0x001a }, "fneg.x fp0" },
693: { { 0xf200, 0x051a }, "fneg.x fp1,fp2" },
694: { { 0xf200, 0x001c }, "facos.x fp0" },
695: { { 0xf200, 0x051c }, "facos.x fp1,fp2" },
696: { { 0xf200, 0x001d }, "fcos.x fp0" },
697: { { 0xf200, 0x051d }, "fcos.x fp1,fp2" },
698: { { 0xf200, 0x001e }, "fgetexp.x fp0" },
699: { { 0xf200, 0x051e }, "fgetexp.x fp1,fp2" },
700: { { 0xf200, 0x001f }, "fgetman.x fp0" },
701: { { 0xf200, 0x051f }, "fgetman.x fp1,fp2" },
702: { { 0xf200, 0x0020 }, "fdiv.x fp0" },
703: { { 0xf200, 0x0520 }, "fdiv.x fp1,fp2" },
704: { { 0xf200, 0x0021 }, "fmod.x fp0" },
705: { { 0xf200, 0x0521 }, "fmod.x fp1,fp2" },
706: { { 0xf200, 0x0022 }, "fadd.x fp0" },
707: { { 0xf200, 0x0522 }, "fadd.x fp1,fp2" },
708: { { 0xf200, 0x0023 }, "fmul.x fp0" },
709: { { 0xf200, 0x0523 }, "fmul.x fp1,fp2" },
710: { { 0xf200, 0x0024 }, "fsgldiv.x fp0" },
711: { { 0xf200, 0x0524 }, "fsgldiv.x fp1,fp2" },
712: { { 0xf200, 0x0025 }, "frem.x fp0" },
713: { { 0xf200, 0x0525 }, "frem.x fp1,fp2" },
714: { { 0xf200, 0x0026 }, "fscale.x fp0" },
715: { { 0xf200, 0x0526 }, "fscale.x fp1,fp2" },
716: { { 0xf200, 0x0027 }, "fsglmul.x fp0" },
717: { { 0xf200, 0x0527 }, "fsglmul.x fp1,fp2" },
718: { { 0xf200, 0x0028 }, "fsub.x fp0" },
719: { { 0xf200, 0x0528 }, "fsub.x fp1,fp2" },
720: { { 0xf200, 0x05b2 }, "fsincos.x fp1,fp2:fp3" },
721: { { 0xf200, 0x04b1 }, "fsincos.x fp1,fp1:fp1" },
722: { { 0xf200, 0x0038 }, "fcmp.x fp0" },
723: { { 0xf200, 0x0538 }, "fcmp.x fp1,fp2" },
724: { { 0xf200, 0x003a }, "ftst.x fp0" },
725: { { 0xf200, 0x053a }, "ftst.x fp1,fp2" },
726:
727: { { 0xf210, 0x4080 }, "fmove.l (a0),fp1" },
728: { { 0xf210, 0x4480 }, "fmove.s (a0),fp1" },
729: { { 0xf210, 0x4880 }, "fmove.x (a0),fp1" },
730: { { 0xf210, 0x4c80 }, "fmove.p (a0),fp1" },
731: { { 0xf210, 0x5080 }, "fmove.w (a0),fp1" },
732: { { 0xf210, 0x5480 }, "fmove.d (a0),fp1" },
733: { { 0xf210, 0x5880 }, "fmove.b (a0),fp1" },
734: { { 0xf23c, 0x4080, 0x89ab,0xcdef}, "fmove.l #$89abcdef,fp1" },
735: { { 0xf23c, 0x4480, 0x89ab,0xcdef}, "fmove.s #$89abcdef,fp1" },
736: { { 0xf23c, 0x4880, 0x89ab,0xcdef, 0x1122,0x3344, 0x5566, 0x7788 },
737: "fmove.x #$89abcdef_11223344_55667788,fp1" },
738: { { 0xf23c, 0x4c80, 0x89ab,0xcdef, 0x1122,0x3344, 0x5566, 0x7788 },
739: "fmove.p #$89abcdef_11223344_55667788,fp1" },
740: { { 0xf23c, 0x5080, 0x89ab }, "fmove.w #$89ab,fp1" },
741: { { 0xf23c, 0x5480, 0x89ab,0xcdef, 0x1122,0x3344 },
742: "fmove.d #$89abcdef_11223344,fp1" },
743: { { 0xf23c, 0x5880, 0x89ab }, "fmove.b #$ab,fp1" },
744: // 代表で fmove 以外のを1つだけ
745: { { 0xf210, 0x4081 }, "fint.l (a0),fp1" },
746: { { 0xf210, 0x4481 }, "fint.s (a0),fp1" },
747: { { 0xf210, 0x4881 }, "fint.x (a0),fp1" },
748: { { 0xf210, 0x4c81 }, "fint.p (a0),fp1" },
749: { { 0xf210, 0x5081 }, "fint.w (a0),fp1" },
750: { { 0xf210, 0x5481 }, "fint.d (a0),fp1" },
751: { { 0xf210, 0x5881 }, "fint.b (a0),fp1" },
752:
753: { { 0xf200, 0x5c81 }, "fmovecr.x #$01,fp1" }, // 不正定数
754: { { 0xf200, 0x5cff }, "fmovecr.x #$7f,fp1" },
755: { { 0xf200, 0x5c80 }, "fmovecr.x #$00<pi>,fp1" },
756: { { 0xf200, 0x5c8b }, "fmovecr.x #$0b<log10(2)>,fp1" },
757: { { 0xf200, 0x5c8c }, "fmovecr.x #$0c<e>,fp1" },
758: { { 0xf200, 0x5c8d }, "fmovecr.x #$0d<log2(e)>,fp1" },
759: { { 0xf200, 0x5c8e }, "fmovecr.x #$0e<log10(e)>,fp1" },
760: { { 0xf200, 0x5c8f }, "fmovecr.x #$0f<0>,fp1" },
761: { { 0xf200, 0x5cb0 }, "fmovecr.x #$30<ln(2)>,fp1" },
762: { { 0xf200, 0x5cb1 }, "fmovecr.x #$31<ln(10)>,fp1" },
763: { { 0xf200, 0x5cb2 }, "fmovecr.x #$32<1>,fp1" },
764: { { 0xf200, 0x5cb3 }, "fmovecr.x #$33<10>,fp1" },
765: { { 0xf200, 0x5cb4 }, "fmovecr.x #$34<1e2>,fp1" },
766: { { 0xf200, 0x5cb5 }, "fmovecr.x #$35<1e4>,fp1" },
767: { { 0xf200, 0x5cb6 }, "fmovecr.x #$36<1e8>,fp1" },
768: { { 0xf200, 0x5cb7 }, "fmovecr.x #$37<1e16>,fp1" },
769: { { 0xf200, 0x5cb8 }, "fmovecr.x #$38<1e32>,fp1" },
770: { { 0xf200, 0x5cb9 }, "fmovecr.x #$39<1e64>,fp1" },
771: { { 0xf200, 0x5cba }, "fmovecr.x #$3a<1e128>,fp1" },
772: { { 0xf200, 0x5cbb }, "fmovecr.x #$3b<1e256>,fp1" },
773: { { 0xf200, 0x5cbc }, "fmovecr.x #$3c<1e512>,fp1" },
774: { { 0xf200, 0x5cbd }, "fmovecr.x #$3d<1e1024>,fp1" },
775: { { 0xf200, 0x5cbe }, "fmovecr.x #$3e<1e2048>,fp1" },
776: { { 0xf200, 0x5cbf }, "fmovecr.x #$3f<1e4096>,fp1" },
777:
778: { { 0xf210, 0x6080 }, "fmove.l fp1,(a0)" },
779: { { 0xf210, 0x6480 }, "fmove.s fp1,(a0)" },
780: { { 0xf210, 0x6880 }, "fmove.x fp1,(a0)" },
781: { { 0xf210, 0x6c80 }, "fmove.p fp1,(a0){#0}" },
782: { { 0xf210, 0x6cbf }, "fmove.p fp1,(a0){#63}" },
783: { { 0xf210, 0x6cc0 }, "fmove.p fp1,(a0){#-64}" },
784: { { 0xf210, 0x7080 }, "fmove.w fp1,(a0)" },
785: { { 0xf210, 0x7480 }, "fmove.d fp1,(a0)" },
786: { { 0xf210, 0x7880 }, "fmove.b fp1,(a0)" },
787: { { 0xf210, 0x7cf0 }, "fmove.p fp1,(a0){d7}" },
788:
789: { { 0xf210, 0x8400 }, "fmove.l (a0),fpiar" },
790: { { 0xf210, 0x8800 }, "fmove.l (a0),fpsr" },
791: { { 0xf210, 0x8c00 }, "fmovem.l (a0),fpsr/fpiar" },
792: { { 0xf210, 0x9000 }, "fmove.l (a0),fpcr" },
793: { { 0xf210, 0x9400 }, "fmovem.l (a0),fpcr/fpiar" },
794: { { 0xf210, 0x9800 }, "fmovem.l (a0),fpcr/fpsr" },
795: { { 0xf210, 0x9c00 }, "fmovem.l (a0),fpcr/fpsr/fpiar" },
796: { { 0xf23c, 0x8400, 0x89ab,0xcdef },"fmove.l #$89abcdef,fpiar" },
797: { { 0xf23c, 0x8800, 0x89ab,0xcdef },"fmove.l #$89abcdef,fpsr" },
798: { { 0xf23c, 0x8c00, 0x89ab,0xcdef, 0xabcd,0xef01 },
799: "fmovem.l #$89abcdef/#$abcdef01,fpsr/fpiar" },
800: { { 0xf23c, 0x9000, 0x89ab,0xcdef },"fmove.l #$89abcdef,fpcr" },
801: { { 0xf23c, 0x9400, 0x89ab,0xcdef, 0xabcd,0xef01 },
802: "fmovem.l #$89abcdef/#$abcdef01,fpcr/fpiar" },
803: { { 0xf23c, 0x9800, 0x89ab,0xcdef, 0xabcd,0xef01 },
804: "fmovem.l #$89abcdef/#$abcdef01,fpcr/fpsr" },
805: { { 0xf23c, 0x9c00, 0x89ab,0xcdef, 0xabcd,0xef01, 0xcdef,0x1234 },
806: "fmovem.l #$89abcdef/#$abcdef01/#$cdef1234,fpcr/fpsr/fpiar" },
807: { { 0xf210, 0xa400 }, "fmove.l fpiar,(a0)" },
808: { { 0xf210, 0xa800 }, "fmove.l fpsr,(a0)" },
809: { { 0xf210, 0xac00 }, "fmovem.l fpsr/fpiar,(a0)" },
810: { { 0xf210, 0xb000 }, "fmove.l fpcr,(a0)" },
811: { { 0xf210, 0xb400 }, "fmovem.l fpcr/fpiar,(a0)" },
812: { { 0xf210, 0xb800 }, "fmovem.l fpcr/fpsr,(a0)" },
813: { { 0xf210, 0xbc00 }, "fmovem.l fpcr/fpsr/fpiar,(a0)" },
814:
815: { { 0xf210, 0xd080 }, "fmovem.x (a0),fp0" },
816: { { 0xf210, 0xd810 }, "fmovem.x (a0),d1" },
817: { { 0xf220, 0xe801 }, "fmovem.x fp0,-(a0)" },
818: { { 0xf210, 0xf080 }, "fmovem.x fp0,(a0)" },
819: { { 0xf210, 0xf810 }, "fmovem.x d1,(a0)" },
820: // fmovem (制御・ポストインクリメント)
821: { { 0xf210, 0xf000 }, "fmovem.x nofpn,(a0)" }, // リストなし
822: { { 0xf210, 0xf0c0 }, "fmovem.x fp0-fp1,(a0)" }, // 連続
823: { { 0xf210, 0xf0ec }, "fmovem.x fp0-fp2/fp4-fp5,(a0)" },// 区間が複数
824: { { 0xf210, 0xf00f }, "fmovem.x fp4-fp7,(a0)" }, // fp7で終わる
825: // fmovem (プリデクリメント)
826: { { 0xf220, 0xe800 }, "fmovem.x nofpn,-(a0)" }, // リストなし
827: { { 0xf220, 0xe803 }, "fmovem.x fp0-fp1,-(a0)" }, // 連続
828: { { 0xf220, 0xe837 }, "fmovem.x fp0-fp2/fp4-fp5,-(a0)"},// 区間が複数
829: { { 0xf220, 0xe8f0 }, "fmovem.x fp4-fp7,-(a0)" }, // fp7で終わる
830:
831: { { 0xf240, 0x0001 }, "fseq.b d0" },
832: { { 0xf249, 0x0001, 0xfffe }, "fdbeq d1,$00000100" },
833: { { 0xf27a, 0x0001, 0x89ab }, "ftrapeq.w #$89ab" },
834: { { 0xf27b, 0x0001, 0x89ab, 0xcdef},"ftrapeq.l #$89abcdef" },
835: { { 0xf27c, 0x0001 }, "ftrapeq" },
836: { { 0xf281, 0xfffe }, "fbeq.w $00000100" },
837: { { 0xf2c1, 0xffff, 0xfffe }, "fbeq.l $00000100" },
838: { { 0xf280, 0x0000 }, "fnop" },
839: { { 0xf280, 0xfffe }, "fbf.w $00000100" },
840: { { 0xf310 }, "fsave (a0)" },
841: { { 0xf350 }, "frestore (a0)" },
1.1.1.9 root 842:
843: // 040
844: { { 0xf409 }, "cinvl nc,(a1)" },
845: { { 0xf449 }, "cinvl dc,(a1)" },
846: { { 0xf489 }, "cinvl ic,(a1)" },
847: { { 0xf4c9 }, "cinvl bc,(a1)" },
848: { { 0xf451 }, "cinvp dc,(a1)" },
849: { { 0xf458 }, "cinva dc" },
850: { { 0xf469 }, "cpushl dc,(a1)" },
851: { { 0xf471 }, "cpushp dc,(a1)" },
852: { { 0xf478 }, "cpusha dc" },
853: { { 0xf501 }, "pflushn (a1)" },
854: { { 0xf509 }, "pflush (a1)" },
855: { { 0xf510 }, "pflushan" },
856: { { 0xf518 }, "pflusha_040" },
857: { { 0xf549 }, "ptestw (a1)" },
858: { { 0xf569 }, "ptestr (a1)" },
859: { { 0xf601, 0x1234, 0x5678 }, "move16 (a1)+,$12345678" },
860: { { 0xf609, 0x1234, 0x5678 }, "move16 $12345678,(a1)+" },
861: { { 0xf611, 0x1234, 0x5678 }, "move16 (a1),$12345678" },
862: { { 0xf619, 0x1234, 0x5678 }, "move16 $12345678,(a1)" },
863: { { 0xf621, 0x2000 }, "move16 (a1)+,(a2)+" },
864:
865: // cp*
866: { { 0xf511 }, "cpsave (a1)" }, // cpid=2
867: { { 0xf551 }, "cprestore (a1)" },
868: { { 0xf711 }, "cpsave (a1)" }, // cpid=3
869: { { 0xf751 }, "cprestore (a1)" },
870: { { 0xf911 }, "cpsave (a1)" }, // cpid=4
871: { { 0xf951 }, "cprestore (a1)" },
872: { { 0xfb11 }, "cpsave (a1)" }, // cpid=5
873: { { 0xfb51 }, "cprestore (a1)" },
874: { { 0xfd11 }, "cpsave (a1)" }, // cpid=6
875: { { 0xfd51 }, "cprestore (a1)" },
876: // cpid=7 の cpSAVE/RESTORE だが無条件に DOS コールを優先している。
877: { { 0xff11 }, "DOS _PRNSNS" }, // cpid=7
878: { { 0xff51 }, "DOS _GETPDB(v2)" },
1.1 root 879: };
880:
1.1.1.5 root 881: static uint8 ram[1024];
1.1.1.3 root 882: static int failed;
1.1 root 883:
1.1.1.6 root 884: #include "test_debugger_memory.cpp"
1.1 root 885:
886: // リンカを通すためのダミー
1.1.1.6 root 887: DisasmLine::~DisasmLine() { }
1.1.1.5 root 888: DebuggerMD::~DebuggerMD() { }
1.1.1.10! root 889: uint32 DebuggerMD::GetNextPC() { return 0; }
! 890: void DebuggerMD::PrintExceptionFrame(FILE *, busaddr) { }
1.1 root 891:
892: int
893: main(int ac, char *av[])
894: {
1.1.1.7 root 895: busaddr saddr;
1.1 root 896:
1.1.1.5 root 897: // DebuggerMD (の継承クラス)を用意するのは芋づる式に大変なので、
898: // 中でアクセスする変数だけ強引に用意する。
1.1.1.8 root 899: DebuggerMD *md = (DebuggerMD *)calloc(1, sizeof(DebuggerMD));
1.1.1.5 root 900: md->inst_bytes = 2;
901:
1.1 root 902: for (int i = 0; i < countof(table); i++) {
903: std::string expected = table[i].expected;
904: std::vector<uint16> inst = table[i].inst;
905:
1.1.1.9 root 906: if (expected.empty()) {
907: expected = "<illegal instruction>";
908: }
909:
1.1 root 910: // エラー表示用
911: std::string inst_str;
912: for (const auto j : inst) {
913: inst_str += string_format(" %04x", j);
914: }
915:
916: // 全体を初期化
1.1.1.5 root 917: memset(ram, 0xdd, sizeof(ram));
1.1 root 918: // 100番地から命令列を書き込む
919: for (int j = 0; j < inst.size(); j++) {
1.1.1.5 root 920: *(uint16 *)(ram + 0x100 + j * 2) = inst[j];
1.1 root 921: }
922: // 検査
1.1.1.8 root 923: saddr = busaddr(0x100);
1.1.1.6 root 924: m680x0disasm dis;
925: DebuggerMemoryStream mem(NULL, saddr);
926: dis.Exec(&mem);
1.1 root 927: // 照合
1.1.1.2 root 928: if (dis.text != expected) {
1.1 root 929: printf(">%s expects \"%s\" but \"%s\"\n", inst_str.c_str(),
1.1.1.2 root 930: expected.c_str(), dis.text.c_str());
1.1 root 931: failed++;
932: continue;
933: }
1.1.1.2 root 934: uint32 expected_len = inst.size() * 2;
935: if (dis.bin.size() != expected_len) {
936: printf(">%s expects len=$%x but $%x\n", inst_str.c_str(),
937: expected_len, (uint)dis.bin.size());
1.1 root 938: failed++;
939: continue;
940: }
941: }
942:
943: int total = countof(table);
944: printf("%d tests, %d success", total, total - failed);
945: if (failed > 0) {
946: printf(", %d failed", failed);
947: }
948: printf("\n");
949: return 0;
950: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.