|
|
1.1 root 1: ;
2: ; nono
3: ; Copyright (C) 2025 nono project
4: ; Licensed under nono-license.txt
5: ;
6:
7: ; サイクル表
8: ;
9: ; '.' は該当命令がない。
10: ; '=' は左と同じ値。
11: ; '?' は不明なところ。とりあえず左と同じにしておく。
12: ;
13: ; 040 はかなり適当。
14:
15: ; symbol 30CC NCC 040
16:
17: ; 11.6.2 FEA
18: fea_anin 3 = 1
19: fea_anpi 3 = 1
20: fea_anpd 4 = 1
21: fea_andi 4 = 1
22: fea_absw 2 = 1
23: fea_absl 4 5 1
24: fea_immw 2 = 1
25: fea_imml 4 = 1
26:
27: ; 11.6.3 CEA
28: cea_anin 2 = 1
29: cea_anpi 2 = 1
30: cea_anpd 2 = 1
31: cea_andi 2 = 1
32: cea_absw 2 = 1
33: cea_absl 4 = 1
34:
35: cea_anix_brief 4 = 6 ; 簡易フォーマット
36: cea_anix_direct 6 = 7 ; 非メモリ間接
37: cea_anix_indir 10 = 9 ; メモリ間接 (アウターディスプレースメントなし)
38: cea_anix_indir_od 12 13 10 ; メモリ間接 (アウターディスプレースメントあり)
39: cea_anix_bd2 2 3 0 ; ベースディスプレースメントが word
40: cea_anix_bd4 6 = 0 ; ベースディスプレースメントが long
41:
42: ; 11.6.6 MOVE Instruction
43: ; 040 は表からざっくり逆算。
44: move_ea_dn 2 = 0
45: movea_w 2 = 1 ; 040 は実際は Dn/#imm を除く
46: movea_l 2 = 0
47: move_ea_anin 4 5 1 ; 030 は実際は ea が Rn なら (3, 4)
48: move_ea_anpi 4 5 1 ; 030 は実際は ea が Rn なら (3, 4)
49: move_ea_anpd 4 5 1 ; 030 は実際は ea が Rn なら (4, 4)
50: move_ea_andi 4 5 1
51: move_ea_anix 2 3 1 ; 030 は表から逆算した基礎分。
52: move_ea_absw 4 5 1
53: move_ea_absl 6 7 1
54:
55: ; 11.6.7 Special Purpose MOVE Instruction
56: ; MOVEM はコード中で加算している。
57: ; 040 の MOVEP はケースごとに細分出来るがレア命令なので放置。
58: exg 4 = 1
59: movec_rc_rn 6 = 11
60: movec_rn_rca 6 = 7
61: movec_rn_rcb 12 = 7
62: move_ccr_dn 4 = 2
63: move_ccr_ea 4 5 2
64: move_dn_ccr 4 = 2
65: move_ea_ccr 4 = 2
66: move_sr_dn 4 = 3
67: move_sr_ea 4 5 3
68: move_ea_sr 8 10 9
69: movem_ea_list 8 8 3
70: movem_ea_list_n 4 4 1
71: movem_list_ea 4 4 2
72: movem_list_ea_n 2 2 1
73: movep 14 = 13
74: moves_ea_dn 7 = 23
75: moves_ea_an 7 = 28
76: moves_rn_ea 5 6 13
77: move_usp_an 4 = 3
78: move_an_usp 4 = 7
79: swap 4 = 2
80:
81: ; 11.6.8 Arithmetical/Logical Instructions
82: add_ea_dn 2 = 1
83: adda_w 4 = 2
84: adda_l 2 = 2
85: add_dn_ea 3 4 1
86: and_ea_dn 2 = 1
87: and_dn_ea 3 4 1
88: eor_dn_dn 2 = 1
89: eor_dn_ea 3 4 1
90: or_ea_dn 2 = 1
91: or_dn_ea 3 4 1
92: sub_ea_dn 2 = 1
93: sub_dn_ea 3 4 1
94: suba_w 4 = 2
95: suba_l 2 = 2
96: cmp 2 = 1
97: cmpa 4 = 1
98: cmp2_max 20 = 13
99: muls_w_max 28 = 16
100: muls_l_max 44 = 20
101: mulu_w_max 28 = 14
102: mulu_l_max 44 = 20
103: divs_w_max 56 = 27
104: divs_l_max 90 = 44
105: divu_w_max 44 = 27
106: divu_l_max 78 = 44
107:
108: ; 11.6.9 Immediate Arithmetical/Logical Instructions
109: moveq 2 = 1
110: addq_rn 2 = 1
111: addq_ea 3 4 1
112: subq_rn 2 = 1
113: subq_ea 3 4 1
114: addi_dn 2 = 1
115: addi_ea 3 4 1
116: andi_dn 2 = 1
117: andi_ea 3 4 1
118: eori_dn 2 = 1
119: eori_ea 3 4 1
120: ori_dn 2 = 1
121: ori_ea 3 4 1
122: subi_dn 2 = 1
123: subi_ea 3 4 1
124: cmpi 2 = 1
125:
126: ; 11.6.10 BCD and Extended Instructions
127: abcd_dn 4 = 3
128: abcd_an 13 14 4
129: sbcd_dn 4 = 3
130: sbcd_an 13 14 4
131: addx_dn 2 = 1
132: addx_an 9 10 3
133: subx_dn 2 = 1
134: subx_an 9 10 3
135: cmpm 8 = 3
136: pack_dn 6 = 3
137: pack_an 11 = 5
138: unpk_dn 8 = 4
139: unpk_an 11 = 6
140:
141: ; 11.6.11 Single Operand Instructions
142: clr_dn 2 = 1
143: clr_ea 3 4 1
144: neg_dn 2 = 1
145: neg_ea 3 4 1
146: negx_dn 2 = 1
147: negx_ea 3 4 1
148: not_dn 2 = 1
149: not_ea 3 4 1
150: ext 4 = 2
151: extb 4 = 1
152: nbcd 6 = 3
153: scc_dn 4 = 2
154: scc_ea 5 = 2
155: tas_dn 4 = 2
156: tas_ea 12 = 26
157: tst 2 = 1
158:
159: ; 11.6.12 Shift/Rotate Instructions
160: lsd_imm_dn 4 = 2
161: lsd_dn_dn_less 6 = 3
162: lsd_dn_dn_over 8 = 3
163: lsd_w 4 = 2
164: asl_imm_dn 6 = 3
165: asl_dn_dn 8 = 4
166: asl_w 6 = 3
167: asr_imm_dn 4 = 2
168: asr_dn_dn_less 6 = 3
169: asr_dn_dn_over 10 = 3
170: asr_w 4 = 2
171: rod_imm_dn 6 = 3
172: rod_dn_dn 8 = 4
173: rod_w 6 = 3
174: roxd_dn 12 = 5
175: roxd_w 4 = 2
176:
177: ; 11.6.13 Bit Manipulation Instructions
178: btst_imm 4 = 1
179: btst_dn 4 = 2
180: bchg_imm 6 = 3
181: bchg_dn 6 = 4
182: bclr_imm 6 = 3
183: bclr_dn 6 = 4
184: bset_imm 6 = 3
185: bset_dn 6 = 4
186:
187: ; 11.6.14 Bit Field Manipulation Instructions
188: bftst_dn 8 = 4
189: bftst_ea_less 10 = 9
190: bftst_ea_over 14 = 19
191: bfchg_dn 14 = 7
192: bfchg_ea_less 14 = 10
193: bfchg_ea_over 22 = 20
194: bfclr_dn 14 = 7
195: bfclr_ea_less 14 = 10
196: bfclr_ea_over 22 = 20
197: bfset_dn 14 = 7
198: bfset_ea_less 14 = 10
199: bfset_ea_over 22 = 20
200: bfext_dn 10 = 5
201: bfext_ea_less 12 = 9
202: bfext_ea_over 18 = 19
203: bfins_dn 12 = 6
204: bfins_ea_less 12 = 9
205: bfins_ea_over 18 = 19
206: bfffo_dn 20 = 7
207: bfffo_ea_less 22 = 11
208: bfffo_ea_over 28 = 21
209:
210: ; 11.6.15 Conditional Branch Instructions
211: ; Bcc (Taken) は bra を使っている。表に BRA がなさげ。
212: bra 6 8 2
213: bcc_b_not 4 = 3
214: bcc_w_not 6 = 3
215: bcc_l_not 8 = 3
216: dbcc_jmp 6 8 3
217: dbcc_done 10 13 4
218: dbcc_nop 6 8 4
219:
220: ; 11.6.16 Control Instructions
221: andi_sr 12 14 9
222: eori_sr 12 14 9
223: ori_sr 12 14 9
224: andi_ccr 12 14 4
225: eori_ccr 12 14 4
226: ori_ccr 12 14 4
227: bsr 6 9 2
228: cas_eq 13 = 37
229: cas_ne 11 = 37
230: cas2_max 24 = 50
231: cas2_true_inc 0 2 5
232: chk 8 = 8
233: chk_excep_max 28 30 8
234: chk2 18 = 11
235: chk2_excep_max 40 42 11
236: jmp 4 6 3
237: jsr 4 7 3
238: lea 2 = 1
239: link_w 4 5 3
240: link_l 6 7 3
241: nop 2 = 8
242: pea 4 = 2
243: rtd 10 12 6
244: rtr 12 14 7
245: rts 9 11 5
246: unlk 5 = 2
247:
248: ; 11.6.17 Exception-Related Instructions and Operations
249: ; Reset は長すぎて表現できないのでコードで実装。
250: bkpt 9 = ?
251: ;Interrupt
252: ;RESET instruction
253: stop 8 = ?
254: ;TRACE
255: trap 18 20 16
256: illegal 18 20 16
257: aline 18 20 16
258: fline 18 20 16
259: excep_priv 18 20 16
260: trapcc_excep 22 24 19
261: trapcc 4 = 5
262: trapcc_w_inc 2 = 19
263: trapcc_l_inc 4 = 5
264: trapv_excep 22 24 19
265: trapv 4 = 5
266:
267: ; 11.6.18 Save and Restore Operations
268: busfault 62 64 ?
269: rte_frame0 18 20 13
270: rte_frame2 18 20 14
271:
272: ; 11.7 MMU Instruction Timing
273: pmove_ea_tt 12 14 .
274: pmove_tt_ea 8 = .
275: pflusha 12 14 11
276: ; PLOAD[RW] は実際には Dy と #imm なら (8, 10)、SFC と DFC なら (12, 14)。
277: ; さらにテーブルサーチの時間も必要。
278: pload 12 14 .
279: ; PFLUSH は実際には Dy と #imm なら (16, 18)、SFC と DFC なら (20, 22)。
280: ; さらにテーブルサーチの時間も必要。
281: pflush 20 22 .
282: ; 実際には、無効→有効が (38, 40)、有効→無効が (56, 58)、無効→無効が
283: ; (14, 16) だと思うが、今は場合分けしてない。
284: pmove_ea_tc 38 40 .
285: pmove_tc_ea 4 5 .
286: ; 実際には、たぶん有効になる場合 (12, 14)、それ以外が (28, 30)。
287: pmove_ea_xrp 28 30 .
288: pmove_xrp_ea 4 5 .
289: pmove_ea_mmusr 6 = .
290: pmove_mmusr_ea 4 5 .
291: ; ptest はコードで実装してある。
292:
293: ; FPU
294: cea_fpu_anpi 6 = 1
295: cea_fpu_anpd 6 = 1
296: fpu_src_dn -5 = 0
297: fmove 33 = 14
298: fsqrt 107 = 105
299: fabs 35 = 2
300: fneg 35 = 2
301: fdiv 103 = 39
302: fadd 51 = 5
303: fmul 71 = 7
304: fsgldiv 69 = 39 ; 040UM に未記載
305: fsglmul 59 = 7 ; 040UM に未記載
306: fsub 51 = 5
307: fcmp 33 = 5
308: ftst 33 = 5
309: fmove_i_fp_dn 98 98 12 ; .B/.W/.L
310: fmove_i_fp_mem 100 100 11
311: fmove_s_fp_dn 78 78 4
312: fmove_s_fp_mem 80 80 3
313: fmove_d_fp_ea 86 86 3
314: fmove_x_fp_ea 72 72 4
315: fmovem_rn_ctl 28 31 3
316: fmovem_mem_ctl 28 30 4
317: fmovem_imm_ctl 25 29 4
318: fmovem_ctl_rn 31 34 3
319: fmovem_ctl_mem 27 30 4
320: fmovem_ea2reg_dyn 49 52 15
321: fmovem_ea2reg_sta 35 38 14
322: fmovem_ea2reg_n 23 23 3
323: fmovem_reg2ea_dyn 51 54 15
324: fmovem_reg2ea_sta 37 40 14
325: fmovem_reg2ea_anpd 6 6 0
326: fmovem_reg2ea_n 25 25 3
327: fscc_dn 18 21 6
328: fscc_anp_z 21 24 6
329: fscc_anp_nz 22 25 6
330: fscc_mem 20 23 6
331: fdbcc_true 20 24 8
332: fdbcc_done 24 32 10
333: fdbcc_jump 20 26 10
334: ftrapcc_excep 39 47 ?
335: ftrapcc_nop 18 22 6
336: ftrapccw_excep 41 45 ?
337: ftrapccw_nop 20 23 6
338: ftrapccl_excep 43 52 ?
339: ftrapccl_nop 22 27 6
340: fbcc_jump 20 23 7
341: fbccw_nop 18 19 6
342: fbccl_nop 18 21 6
343: fsave_null 16 18 12
344: fsave_idle 52 54 12
345: frestore_null 21 22 13
346: frestore_idle 57 58 13
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.