;
; nono
; Copyright (C) 2014 isaki@NetBSD.org
; Copyright (C) 2020 nono project
; Licensed under nono-license.txt
;

; ビットパターンはこの定義順に展開するので、前の行を後の行で上書きする。
; そのためより限定的なほうを後ろ(下)に記述すること。
; それ以外は概ねソートすること。
;
; ビットパターン
;	0, 1   … 0 または 1 固定のビット
;	n, c   … 0 および 1 の両方に展開される
;	SS     … サイズ (b/w/l)
;	s      … サイズ (w/l)
;	mmmrrr … EA
;	RRRMMM … MOVE 命令のデスティネーション用 EA
;	xxx,yyy… レジスタ番号(%000-%111)に展開。
;	qqq    … 即値(%000-%111)に展開。
;	CCC    … cpID(%011-%111)に展開。
;
; 関数名
;	ニーモニックのうち小文字の部分はそのまま使用される。
;	大文字は以下のとおり展開する。
;		S  … "SS"/"s" のサイズに応じて b/w/l に展開
;		EA … アドレッシングモード mmmrrr に応じて reg/mem に展開
;		DD … アドレッシングモード RRRMMM に応じて reg/mem に展開
;	なお、同一10(13)bit ブロック内に複数の命令が共存する場合、ここに書いた
;	すべての関数名が必ずしも出力されるわけではない。
;
; 表示名
;	ニーモニックのうち ".S" は適切なサイズに置き換えられる。
;	それ以外はそのまま。
;	同一10(13)bit ブロック内に複数の命令がある場合でも、ここに書いた表示名は
;	すべてコメントとして列挙される。
;
;
;ビットパターン		ADDRESSING	MPU	関数名			表示名
00000000SSmmmrrr	d.m+-rxw..	034	ori_S			ORI.S #<imm>,<ea>
0000000000111100	..........	034	ori_ccr			ORI.B #<imm>,CCR
0000000001111100	..........	034	ori_sr			ORI.W #<imm>,SR
00000010SSmmmrrr	d.m+-rxw..	034	andi_S			ANDI.S #<imm>,<ea>
0000001000111100	..........	034	andi_ccr		ANDI.B #<imm>,CCR
0000001001111100	..........	034	andi_sr			ANDI.W #<imm>,SR
00000100SSmmmrrr	d.m+-rxw..	034	subi_S			SUBI.S #<imm>,<ea>
00000110SSmmmrrr	d.m+-rxw..	034	addi_S			ADDI.S #<imm>,<ea>
00000SS011mmmrrr	..m..rxwp.	-34	cmp2chk2_S		CMP2/CHK2.S <ea>,Rn
0000011011mmmrrr	..m..rxwp.	2--	callm			CALLM #<imm>,<ea>
000001101100nnnn	..........	2--	rtm				RTM Rn
0000100000mmmrrr	..m+-rxwp.	034	btst_imm_ea		BTST.B #<imm>,<ea>
0000100000000yyy	..........	034	btst_imm_dn		BTST.L #<imm>,Dy
0000100001mmmrrr	..m+-rxw..	034	bchg_imm_ea		BCHG.B #<imm>,<ea>
0000100001000yyy	..........	034	bchg_imm_dn		BCHG.L #<imm>,Dy
0000100010mmmrrr	..m+-rxw..	034	bclr_imm_ea		BCLR.B #<imm>,<ea>
0000100010000yyy	..........	034	bclr_imm_dn		BCLR.L #<imm>,Dy
0000100011mmmrrr	..m+-rxw..	034	bset_imm_ea		BSET.B #<imm>,<ea>
0000100011000yyy	..........	034	bset_imm_dn		BSET.L #<imm>,Dy
00001010SSmmmrrr	d.m+-rxw..	034	eori_S			EORI.S #<imm>,<ea>
0000101000111100	..........	034	eori_ccr		EORI.B #<imm>,CCR
0000101001111100	..........	034	eori_sr			EORI.W #<imm>,SR
0000101011mmmrrr	..m+-rxw..	-34	cas_b			CAS.B Dc,Du,<ea>
00001100SSmmmrrr	d.m+-rxw..	0--	cmpi_S			CMPI.S #<imm>,<ea>
00001100SSmmmrrr	d.m+-rxwp.	-34	cmpi_S			CMPI.S #<imm>,<ea>
00001110SSmmmrrr	..m+-rxw..	-34	moves_S			MOVES.S <ea>,Rn
00001110SSmmmrrr	..m+-rxw..	-34	moves_S			MOVES.S Rn,<ea>
000011s011mmmrrr	..m+-rxw..	-34	cas_S			CAS.S Dc,Du,<ea>
000011s011111100	..........	-34	cas2_S			CAS2.S Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)
0000xxx100mmmrrr	..m+-rxwpi	034	btst_dn_ea		BTST.B Dx,<ea>
0000xxx100000yyy	..........	034	btst_dn_dn		BTST.L Dx,Dy
0000xxx101mmmrrr	..m+-rxw..	034	bchg_dn_ea		BCHG.B Dx,<ea>
0000xxx101000yyy	..........	034	bchg_dn_dn		BCHG.L Dx,Dy
0000xxx111mmmrrr	..m+-rxw..	034	bset_dn_ea		BSET.B Dx,<ea>
0000xxx111000yyy	..........	034	bset_dn_dn		BSET.L Dx,Dy
0000xxx110mmmrrr	..m+-rxw..	034	bclr_dn_ea		BCLR.B Dx,<ea>
0000xxx110000yyy	..........	034	bclr_dn_dn		BCLR.L Dx,Dy
0000xxx10s001yyy	..........	034	movep_S_mem_dn	MOVEP.S (d,Ay),Dx
0000xxx11s001yyy	..........	034	movep_S_dn_mem	MOVEP.S Dx,(d,Ay)
0001RRRMMMmmmrrr	d.m+-rxwpi	034	move_b_ea_DD	MOVE.B <ea>,DD
0010RRRMMMmmmrrr	dam+-rxwpi	034	move_l_ea_DD	MOVE.L <ea>,DD
0010xxx001mmmrrr	dam+-rxwpi	034	movea_l			MOVEA.L <ea>,Ax
0011RRRMMMmmmrrr	dam+-rxwpi	034	move_w_ea_DD	MOVE.W <ea>,DD
0011xxx001mmmrrr	dam+-rxwpi	034	movea_w			MOVEA.W <ea>,Ax
0100000011mmmrrr	d.m+-rxw..	0--	move_sr_ea		MOVE.W SR,<ea>
01000000SSmmmrrr	d.m+-rxw..	034	negx_S			NEGX.S <ea>
0100000011mmmrrr	d.m+-rxw..	-34	move_sr_ea		MOVE.W SR,<ea>
01000010SSmmmrrr	d.m+-rxw..	034	clr_S			CLR.S <ea>
0100001011mmmrrr	d.m+-rxw..	-34	move_ccr_ea		MOVE.W CCR,<ea>
01000100SSmmmrrr	d.m+-rxw..	034	neg_S			NEG.S <ea>
0100010011mmmrrr	d.m+-rxwpi	034	move_ea_ccr		MOVE.W <ea>,CCR
01000110SSmmmrrr	d.m+-rxw..	034	not_S			NOT.S <ea>
0100011011mmmrrr	d.m+-rxwpi	034	move_ea_sr		MOVE.W <ea>,SR
0100100000001yyy	..........	-34	link_l			LINK.L Ay,#<imm>
0100100000mmmrrr	d.m+-rxw..	034	nbcd			NBCD.B <ea>
0100100001000yyy	..........	034	swap			SWAP.W Dy
0100100001001nnn	..........	-34	bkpt			BKPT #<imm>
0100100001mmmrrr	..m..rxwp.	034	pea				PEA.L <ea>
010010001s000yyy	..........	034	ext_S			EXT.S Dy
010010001smmmrrr	..m.-rxw..	034	movem_S_mem		MOVEM.S <list>,<ea>
0100100111000yyy	..........	-34	extb			EXTB.L Dy
01001010SSmmmrrr	d.m+-rxw..	0--	tst_S			TST.S <ea>
01001010SSmmmrrr	dam+-rxwpi	-34	tst_S			TST.S <ea>
0100101011mmmrrr	d.m+-rxw..	034	tas				TAS.B <ea>
0100101011111100	..........	034	illegal			ILLEGAL
0100110000mmmrrr	d.m+-rxwpi	-34	mul				MULS.L <ea>,Dl
0100110000mmmrrr	d.m+-rxwpi	-34	mul				MULS.L <ea>,Dh:Dl
0100110000mmmrrr	d.m+-rxwpi	-34	mul				MULU.L <ea>,Dl
0100110000mmmrrr	d.m+-rxwpi	-34	mul				MULU.L <ea>,Dh:Dl
0100110001mmmrrr	d.m+-rxwpi	-34	div				DIVS.L <ea>,Dq
0100110001mmmrrr	d.m+-rxwpi	-34	div				DIVS.L <ea>,Dr:Dq
0100110001mmmrrr	d.m+-rxwpi	-34	div				DIVSL.L <ea>,Dr:Dq
0100110001mmmrrr	d.m+-rxwpi	-34	div				DIVU.L <ea>,Dq
0100110001mmmrrr	d.m+-rxwpi	-34	div				DIVU.L <ea>,Dr:Dq
0100110001mmmrrr	d.m+-rxwpi	-34	div				DIVUL.L <ea>,Dr:Dq
010011001smmmrrr	..m+.rxwp.	034	movem_S			MOVEM.S <ea>,<list>
010011100100nnnn	..........	034	trap			TRAP #<vector>
0100111001010yyy	..........	034	link_w			LINK.W Ay,#<imm>
0100111001011yyy	..........	034	unlk			UNLK Ay
0100111001100yyy	..........	034	move_an_usp		MOVE.L Ay,USP
0100111001101yyy	..........	034	move_usp_an		MOVE.L USP,Ay
0100111001110000	..........	034	reset			RESET
0100111001110001	..........	034	nop				NOP
0100111001110010	..........	034	stop			STOP #<imm>
0100111001110011	..........	034	rte				RTE
0100111001110100	..........	-34	rtd				RTD #<imm>
0100111001110101	..........	034	rts				RTS
0100111001110110	..........	034	trapv			TRAPV
0100111001110111	..........	034	rtr				RTR
0100111001111010	..........	-34	movec_from		MOVEC.L Rc,Rn
0100111001111011	..........	-34	movec_to		MOVEC.L Rn,Rc
0100111010mmmrrr	..m..rxwp.	034	jsr				JSR <ea>
0100111011mmmrrr	..m..rxwp.	034	jmp				JMP <ea>
0100xxx100mmmrrr	d.m+-rxwpi	-34	chk_l			CHK.L <ea>,Dx
0100xxx110mmmrrr	d.m+-rxwpi	034	chk_w			CHK.W <ea>,Dx
0100xxx111mmmrrr	..m..rxwp.	034	lea				LEA.L <ea>,Ax
0101cccc11mmmrrr	d.m+-rxw..	034	scc				Scc.B <ea>
0101cccc11001yyy	..........	034	dbcc			DBcc.W Dy,<label>
0101000111001yyy	..........	034	dbra			DBRA.W Dy,<label>
0101cccc11111010	..........	-34	trapcc			TRAPcc.W #<imm>
0101cccc11111011	..........	-34	trapcc			TRAPcc.L #<imm>
0101cccc11111100	..........	-34	trapcc			TRAPcc
0101qqq0SSmmmrrr	d.m+-rxw..	034	addq_S			ADDQ.S #qqq,<ea>
0101qqq001001yyy	.a........	034	addq_l_an		ADDQ.W #qqq,Ay (.Lと等価)
0101qqq010001yyy	.a........	034	addq_l_an		ADDQ.L #qqq,Ay
0101qqq1SSmmmrrr	d.m+-rxw..	034	subq_S			SUBQ.S #qqq,<ea>
0101qqq101001yyy	.a........	034	subq_l_an		SUBQ.W #qqq,Ay (.Lと等価)
0101qqq110001yyy	.a........	034	subq_l_an		SUBQ.L #qqq,Ay
0110ccccnnnnnnnn	..........	034	bcc				Bcc.B <label>
0110cccc00000000	..........	034	bcc				Bcc.W <label>
0110cccc11111111	..........	-34	bcc				Bcc.L <label>
01100000nnnnnnnn	..........	034	bra				BRA.B <label>
0110000000000000	..........	034	bra				BRA.W <label>
0110000011111111	..........	-34	bra				BRA.L <label>
01100001nnnnnnnn	..........	034	bsr				BSR.B <label>
0110000100000000	..........	034	bsr				BSR.W <label>
0110000111111111	..........	-34	bsr				BSR.L <label>
0111xxx0nnnnnnnn	..........	034	moveq			MOVEQ.L #<imm>,Dx
1000xxx011mmmrrr	d.m+-rxwpi	034	divu_w			DIVU.W <ea>,Dx
1000xxx0SSmmmrrr	d.m+-rxwpi	034	or_S_ea_dn		OR.S <ea>,Dx
1000xxx111mmmrrr	d.m+-rxwpi	034	divs_w			DIVS.W <ea>,Dx
1000xxx1SSmmmrrr	..m+-rxw..	034	or_S_dn_ea		OR.S Dx,<ea>
1000xxx100000yyy	..........	034	sbcd_reg		SBCD.B Dy,Dx
1000xxx100001yyy	..........	034	sbcd_mem		SBCD.B -(Ay),-(Ax)
1000xxx101000yyy	..........	-34	pack_reg		PACK Dy,Dx,#<imm>
1000xxx101001yyy	..........	-34	pack_mem		PACK -(Ay),-(Ax),#<imm>
1000xxx110000yyy	..........	-34	unpk_reg		UNPK Dy,Dx,#<imm>
1000xxx110001yyy	..........	-34	unpk_mem		UNPK -(Ay),-(Ax),#<imm>
1001xxx0SSmmmrrr	dam+-rxwpi	034	sub_S_ea_dn		SUB.S <ea>,Dx
1001xxx1SSmmmrrr	..m+-rxw..	034	sub_S_dn_ea		SUB.S Dx,<ea>
1001xxx1SS000yyy	..........	034	subx_S_reg		SUBX.S Dy,Dx
1001xxx1SS001yyy	..........	034	subx_S_mem		SUBX.S -(Ay),-(Ax)
1001xxxs11mmmrrr	dam+-rxwpi	034	suba_S			SUBA.S <ea>,Ax
1010nnnnnnnnnnnn	..........	034	aline			A-Line
1011xxx0SSmmmrrr	d.m+-rxwpi	034	cmp_S			CMP.S <ea>,Dx
1011xxx1SSmmmrrr	d.m+-rxw..	034	eor_S			EOR.S Dx,<ea>
1011xxx1SS001yyy	..........	034	cmpm_S			CMPM.S (Ay)+,(Ax)+
1011xxxs11mmmrrr	dam+-rxwpi	034	cmpa_S			CMPA.S <ea>,Ax
1100xxx0SSmmmrrr	d.m+-rxwpi	034	and_S_ea_dn		AND.S <ea>,Dx
1100xxx011mmmrrr	d.m+-rxwpi	034	mulu_w			MULU.W <ea>,Dx
1100xxx111mmmrrr	d.m+-rxwpi	034	muls_w			MULS.W <ea>,Dx
1100xxx1SSmmmrrr	..m+-rxw..	034	and_S_dn_ea		AND.S Dx,<ea>
1100xxx101000yyy	..........	034	exg_l_dn_dn		EXG.L Dx,Dy
1100xxx101001yyy	..........	034	exg_l_an_an		EXG.L Ax,Ay
1100xxx110001yyy	..........	034	exg_l_dn_an		EXG.L Dx,Ay
1100xxx100000yyy	..........	034	abcd_reg		ABCD.B Dy,Dx
1100xxx100001yyy	..........	034	abcd_mem		ABCD.B -(Ay),-(Ax)
1101xxx0SSmmmrrr	dam+-rxwpi	034	add_S_ea_dn		ADD.S <ea>,Dx
1101xxx1SSmmmrrr	..m+-rxw..	034	add_S_dn_ea		ADD.S Dx,<ea>
1101xxx1SS000yyy	..........	034	addx_S_reg		ADDX.S Dy,Dx
1101xxx1SS001yyy	..........	034	addx_S_mem		ADDX.S -(Ay),-(Ax)
1101xxxs11mmmrrr	dam+-rxwpi	034	adda_S			ADDA.S <ea>,Ax
1110qqq0SS000yyy	..........	034	asr_S_imm		ASR.S #qqq,Dy
1110qqq0SS001yyy	..........	034	lsr_S_imm		LSR.S #qqq,Dy
1110qqq0SS010yyy	..........	034	roxr_S_imm		ROXR.S #qqq,Dy
1110qqq0SS011yyy	..........	034	ror_S_imm		ROR.S #qqq,Dy
1110xxx0SS100yyy	..........	034	asr_S_dn		ASR.S Dx,Dy
1110xxx0SS101yyy	..........	034	lsr_S_dn		LSR.S Dx,Dy
1110xxx0SS110yyy	..........	034	roxr_S_dn		ROXR.S Dx,Dy
1110xxx0SS111yyy	..........	034	ror_S_dn		ROR.S Dx,Dy
1110qqq1SS000yyy	..........	034	asl_S_imm		ASL.S #qqq,Dy
1110qqq1SS001yyy	..........	034	lsl_S_imm		LSL.S #qqq,Dy
1110qqq1SS010yyy	..........	034	roxl_S_imm		ROXL.S #qqq,Dy
1110qqq1SS011yyy	..........	034	rol_S_imm		ROL.S #qqq,Dy
1110xxx1SS100yyy	..........	034	asl_S_dn		ASL.S Dx,Dy
1110xxx1SS101yyy	..........	034	lsl_S_dn		LSL.S Dx,Dy
1110xxx1SS110yyy	..........	034	roxl_S_dn		ROXL.S Dx,Dy
1110xxx1SS111yyy	..........	034	rol_S_dn		ROL.S Dx,Dy
1110000011mmmrrr	..m+-rxw..	034	asr_w			ASR.W <ea>
1110000111mmmrrr	..m+-rxw..	034	asl_w			ASL.W <ea>
1110001011mmmrrr	..m+-rxw..	034	lsr_w			LSR.W <ea>
1110001111mmmrrr	..m+-rxw..	034	lsl_w			LSL.W <ea>
1110010011mmmrrr	..m+-rxw..	034	roxr_w			ROXR.W <ea>
1110010111mmmrrr	..m+-rxw..	034	roxl_w			ROXL.W <ea>
1110011011mmmrrr	..m+-rxw..	034	ror_w			ROR.W <ea>
1110011111mmmrrr	..m+-rxw..	034	rol_w			ROL.W <ea>
1110100011mmmrrr	d.m..rxwp.	-34	bftst			BFTST <ea>{#o:#w}
1110100111mmmrrr	d.m..rxwp.	-34	bfextu			BFEXTU <ea>{#o:#w},Dn
1110101011mmmrrr	d.m..rxw..	-34	bfchg			BFCHG <ea>{#o:#w}
1110101111mmmrrr	d.m..rxwp.	-34	bfexts			BFEXTS <ea>{#o:#w},Dn
1110110011mmmrrr	d.m..rxw..	-34	bfclr			BFCLR <ea>{#o:#w}
1110110111mmmrrr	d.m..rxwp.	-34	bfffo			BFFFO <ea>{#o:#w},Dn
1110111011mmmrrr	d.m..rxw..	-34	bfset			BFSET <ea>{#o:#w}
1110111111mmmrrr	d.m..rxw..	-34	bfins			BFINS Dn,<ea>{#o:#w}

; F ラインは不当命令側で処理するのでこの表には不要。
;1111nnnnnnnnnnnn	..........	034	fline			F-Line

1111000nnnnnnnnn	..........	-3-	mmuop			MMU_OP
1111001000nnnnnn	..........	-34	fpgen			FPGEN
1111001001mmmrrr	d.m+-rxw..	-34	fxcc			FScc.B <ea>
1111001001001yyy	..........	-34	fxcc			FDBcc Dy,<label>
1111001001111010	..........	-34	fxcc			FTRAPcc.W #<imm>
1111001001111011	..........	-34	fxcc			FTRAPcc.L #<imm>
1111001001111100	..........	-34	fxcc			FTRAPcc
1111001010nnnnnn	..........	-34	fbcc_w			FBcc.W <label>
1111001011nnnnnn	..........	-34	fbcc_l			FBcc.L <label>
1111001100mmmrrr	..m.-rxw..	-34	fsave			FSAVE <ea>
1111001101mmmrrr	..m+.rxw..	-34	frestore		FRESTORE <ea>

; cpSAVE/RESTORE の CCC は cpID=3〜7 だけ展開してある。
; cpID==2 は 040 の pflush/ptest のブロックと重なるためそちらに混ぜる。
1111010100mmmrrr	..m.-rxw..	23-	pflush			cpSAVE
1111010101mmmrrr	..m+.rxwp.	23-	ptest			cpRESTORE
1111CCC100mmmrrr	..m.-rxw..	23-	cpsave			cpSAVE
1111CCC101mmmrrr	..m+.rxwp.	23-	cprestore		cpRESTORE

11110100nn001yyy	..........	--4	cinv			CINVL <caches>,(Ay)
11110100nn010yyy	..........	--4	cinv			CINVP <caches>,(Ay)
11110100nn011000	..........	--4	cinv			CINVA <caches>
11110100nn101yyy	..........	--4	cpush			CPUSHL <caches>,(Ay)
11110100nn110yyy	..........	--4	cpush			CPUSHP <caches>,(Ay)
11110100nn111000	..........	--4	cpush			CPUSHA <caches>
1111010100000yyy	..........	--4	pflush			PFLUSHN (Ay)
1111010100001yyy	..........	--4	pflush			PFLUSH (Ay)
1111010100010000	..........	--4	pflush			PFLUSHAN
1111010100011000	..........	--4	pflush			PFLUSHA
1111010101001yyy	..........	--4	ptest			PTESTW (Ay)
1111010101101yyy	..........	--4	ptest			PTESTR (Ay)
1111011000000yyy	..........	--4	move16			MOVE16 (Ay)+,xxx.L
1111011000001yyy	..........	--4	move16			MOVE16 xxx.L,(Ay)+
1111011000010yyy	..........	--4	move16			MOVE16 (Ay),xxx.L
1111011000011yyy	..........	--4	move16			MOVE16 xxx.L,(Ay)
1111011000100yyy	..........	--4	move16			MOVE16 (Ay)+,(An)+

1111100000000000	..........	--6	lpstop			LPSTOP
1111010110001nnn	..........	--6	plpa			PLPAW (An)
1111010111001nnn	..........	--6	plpa			PLPAR (An)
