;
; nono
; Copyright (C) 2025 nono project
; Licensed under nono-license.txt
;

; サイクル表
;
;	'.' は該当命令がない。
;	'=' は左と同じ値。
;	'?' は不明なところ。とりあえず左と同じにしておく。
;
; 040 はかなり適当。

; symbol			30CC NCC 040

; 11.6.2 FEA
fea_anin			3	=	1
fea_anpi			3	=	1
fea_anpd			4	=	1
fea_andi			4	=	1
fea_absw			2	=	1
fea_absl			4	5	1
fea_immw			2	=	1
fea_imml			4	=	1

; 11.6.3 CEA
cea_anin			2	=	1
cea_anpi			2	=	1
cea_anpd			2	=	1
cea_andi			2	=	1
cea_absw			2	=	1
cea_absl			4	=	1

cea_anix_brief		4	=	6	; 簡易フォーマット
cea_anix_direct		6	=	7	; 非メモリ間接
cea_anix_indir		10	=	9	; メモリ間接 (アウターディスプレースメントなし)
cea_anix_indir_od	12	13	10	; メモリ間接 (アウターディスプレースメントあり)
cea_anix_bd2		2	3	0	; ベースディスプレースメントが word
cea_anix_bd4		6	=	0	; ベースディスプレースメントが long

; 11.6.6 MOVE Instruction
; 040 は表からざっくり逆算。
move_ea_dn			2	=	0
movea_w				2	=	1	; 040 は実際は Dn/#imm を除く
movea_l				2	=	0
move_ea_anin		4	5	1	; 030 は実際は ea が Rn なら (3, 4)
move_ea_anpi		4	5	1	; 030 は実際は ea が Rn なら (3, 4)
move_ea_anpd		4	5	1	; 030 は実際は ea が Rn なら (4, 4)
move_ea_andi		4	5	1
move_ea_anix		2	3	1	; 030 は表から逆算した基礎分。
move_ea_absw		4	5	1
move_ea_absl		6	7	1

; 11.6.7 Special Purpose MOVE Instruction
; MOVEM はコード中で加算している。
; 040 の MOVEP はケースごとに細分出来るがレア命令なので放置。
exg					4	=	1
movec_rc_rn			6	=	11
movec_rn_rca		6	=	7
movec_rn_rcb		12	=	7
move_ccr_dn			4	=	2
move_ccr_ea			4	5	2
move_dn_ccr			4	=	2
move_ea_ccr			4	=	2
move_sr_dn			4	=	3
move_sr_ea			4	5	3
move_ea_sr			8	10	9
movem_ea_list		8	8	3
movem_ea_list_n		4	4	1
movem_list_ea		4	4	2
movem_list_ea_n		2	2	1
movep				14	=	13
moves_ea_dn			7	=	23
moves_ea_an			7	=	28
moves_rn_ea			5	6	13
move_usp_an			4	=	3
move_an_usp			4	=	7
swap				4	=	2

; 11.6.8 Arithmetical/Logical Instructions
add_ea_dn			2	=	1
adda_w				4	=	2
adda_l				2	=	2
add_dn_ea			3	4	1
and_ea_dn			2	=	1
and_dn_ea			3	4	1
eor_dn_dn			2	=	1
eor_dn_ea			3	4	1
or_ea_dn			2	=	1
or_dn_ea			3	4	1
sub_ea_dn			2	=	1
sub_dn_ea			3	4	1
suba_w				4	=	2
suba_l				2	=	2
cmp					2	=	1
cmpa				4	=	1
cmp2_max			20	=	13
muls_w_max			28	=	16
muls_l_max			44	=	20
mulu_w_max			28	=	14
mulu_l_max			44	=	20
divs_w_max			56	=	27
divs_l_max			90	=	44
divu_w_max			44	=	27
divu_l_max			78	=	44

; 11.6.9 Immediate Arithmetical/Logical Instructions
moveq				2	=	1
addq_rn				2	=	1
addq_ea				3	4	1
subq_rn				2	=	1
subq_ea				3	4	1
addi_dn				2	=	1
addi_ea				3	4	1
andi_dn				2	=	1
andi_ea				3	4	1
eori_dn				2	=	1
eori_ea				3	4	1
ori_dn				2	=	1
ori_ea				3	4	1
subi_dn				2	=	1
subi_ea				3	4	1
cmpi				2	=	1

; 11.6.10 BCD and Extended Instructions
abcd_dn				4	=	3
abcd_an				13	14	4
sbcd_dn				4	=	3
sbcd_an				13	14	4
addx_dn				2	=	1
addx_an				9	10	3
subx_dn				2	=	1
subx_an				9	10	3
cmpm				8	=	3
pack_dn				6	=	3
pack_an				11	=	5
unpk_dn				8	=	4
unpk_an				11	=	6

; 11.6.11 Single Operand Instructions
clr_dn				2	=	1
clr_ea				3	4	1
neg_dn				2	=	1
neg_ea				3	4	1
negx_dn				2	=	1
negx_ea				3	4	1
not_dn				2	=	1
not_ea				3	4	1
ext					4	=	2
extb				4	=	1
nbcd				6	=	3
scc_dn				4	=	2
scc_ea				5	=	2
tas_dn				4	=	2
tas_ea				12	=	26
tst					2	=	1

; 11.6.12 Shift/Rotate Instructions
lsd_imm_dn			4	=	2
lsd_dn_dn_less		6	=	3
lsd_dn_dn_over		8	=	3
lsd_w				4	=	2
asl_imm_dn			6	=	3
asl_dn_dn			8	=	4
asl_w				6	=	3
asr_imm_dn			4	=	2
asr_dn_dn_less		6	=	3
asr_dn_dn_over		10	=	3
asr_w				4	=	2
rod_imm_dn			6	=	3
rod_dn_dn			8	=	4
rod_w				6	=	3
roxd_dn				12	=	5
roxd_w				4	=	2

; 11.6.13 Bit Manipulation Instructions
btst_imm			4	=	1
btst_dn				4	=	2
bchg_imm			6	=	3
bchg_dn				6	=	4
bclr_imm			6	=	3
bclr_dn				6	=	4
bset_imm			6	=	3
bset_dn				6	=	4

; 11.6.14 Bit Field Manipulation Instructions
bftst_dn			8	=	4
bftst_ea_less		10	=	9
bftst_ea_over		14	=	19
bfchg_dn			14	=	7
bfchg_ea_less		14	=	10
bfchg_ea_over		22	=	20
bfclr_dn			14	=	7
bfclr_ea_less		14	=	10
bfclr_ea_over		22	=	20
bfset_dn			14	=	7
bfset_ea_less		14	=	10
bfset_ea_over		22	=	20
bfext_dn			10	=	5
bfext_ea_less		12	=	9
bfext_ea_over		18	=	19
bfins_dn			12	=	6
bfins_ea_less		12	=	9
bfins_ea_over		18	=	19
bfffo_dn			20	=	7
bfffo_ea_less		22	=	11
bfffo_ea_over		28	=	21

; 11.6.15 Conditional Branch Instructions
; Bcc (Taken) は bra を使っている。表に BRA がなさげ。
bra					6	8	2
bcc_b_not			4	=	3
bcc_w_not			6	=	3
bcc_l_not			8	=	3
dbcc_jmp			6	8	3
dbcc_done			10	13	4
dbcc_nop			6	8	4

; 11.6.16 Control Instructions
andi_sr				12	14	9
eori_sr				12	14	9
ori_sr				12	14	9
andi_ccr			12	14	4
eori_ccr			12	14	4
ori_ccr				12	14	4
bsr					6	9	2
cas_eq				13	=	37
cas_ne				11	=	37
cas2_max			24	=	50
cas2_true_inc		0	2	5
chk					8	=	8
chk_excep_max		28	30	8
chk2				18	=	11
chk2_excep_max		40	42	11
jmp					4	6	3
jsr					4	7	3
lea					2	=	1
link_w				4	5	3
link_l				6	7	3
nop					2	=	8
pea					4	=	2
rtd					10	12	6
rtr					12	14	7
rts					9	11	5
unlk				5	=	2

; 11.6.17 Exception-Related Instructions and Operations
; Reset は長すぎて表現できないのでコードで実装。
bkpt				9	=	?
;Interrupt
;RESET instruction
stop				8	=	?
;TRACE
trap				18	20	16
illegal				18	20	16
aline				18	20	16
fline				18	20	16
excep_priv			18	20	16
trapcc_excep		22	24	19
trapcc				4	=	5
trapcc_w_inc		2	=	19
trapcc_l_inc		4	=	5
trapv_excep			22	24	19
trapv				4	=	5

; 11.6.18 Save and Restore Operations
busfault			62	64	?
rte_frame0			18	20	13
rte_frame2			18	20	14

; 11.7 MMU Instruction Timing
pmove_ea_tt			12	14	.
pmove_tt_ea			8	=	.
pflusha				12	14	11
; PLOAD[RW] は実際には Dy と #imm なら (8, 10)、SFC と DFC なら (12, 14)。
; さらにテーブルサーチの時間も必要。
pload				12	14	.
; PFLUSH は実際には Dy と #imm なら (16, 18)、SFC と DFC なら (20, 22)。
; さらにテーブルサーチの時間も必要。
pflush				20	22	.
; 実際には、無効→有効が (38, 40)、有効→無効が (56, 58)、無効→無効が
; (14, 16) だと思うが、今は場合分けしてない。
pmove_ea_tc			38	40	.
pmove_tc_ea			4	5	.
; 実際には、たぶん有効になる場合 (12, 14)、それ以外が (28, 30)。
pmove_ea_xrp		28	30	.
pmove_xrp_ea		4	5	.
pmove_ea_mmusr		6	=	.
pmove_mmusr_ea		4	5	.
; ptest はコードで実装してある。

; FPU
cea_fpu_anpi		6	=	1
cea_fpu_anpd		6	=	1
fpu_src_dn			-5	=	0
fmove				33	=	14
fsqrt				107	=	105
fabs				35	=	2
fneg				35	=	2
fdiv				103	=	39
fadd				51	=	5
fmul				71	=	7
fsgldiv				69	=	39	; 040UM に未記載
fsglmul				59	=	7	; 040UM に未記載
fsub				51	=	5
fcmp				33	=	5
ftst				33	=	5
fmove_i_fp_dn		98	98	12	; .B/.W/.L
fmove_i_fp_mem		100	100	11
fmove_s_fp_dn		78	78	4
fmove_s_fp_mem		80	80	3
fmove_d_fp_ea		86	86	3
fmove_x_fp_ea		72	72	4
fmovem_rn_ctl		28	31	3
fmovem_mem_ctl		28	30	4
fmovem_imm_ctl		25	29	4
fmovem_ctl_rn		31	34	3
fmovem_ctl_mem		27	30	4
fmovem_ea2reg_dyn	49	52	15
fmovem_ea2reg_sta	35	38	14
fmovem_ea2reg_n		23	23	3
fmovem_reg2ea_dyn	51	54	15
fmovem_reg2ea_sta	37	40	14
fmovem_reg2ea_anpd	6	6	0
fmovem_reg2ea_n		25	25	3
fscc_dn				18	21	6
fscc_anp_z			21	24	6
fscc_anp_nz			22	25	6
fscc_mem			20	23	6
fdbcc_true			20	24	8
fdbcc_done			24	32	10
fdbcc_jump			20	26	10
ftrapcc_excep		39	47	?
ftrapcc_nop			18	22	6
ftrapccw_excep		41	45	?
ftrapccw_nop		20	23	6
ftrapccl_excep		43	52	?
ftrapccl_nop		22	27	6
fbcc_jump			20	23	7
fbccw_nop			18	19	6
fbccl_nop			18	21	6
fsave_null			16	18	12
fsave_idle			52	54	12
frestore_null		21	22	13
frestore_idle		57	58	13
