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

; ビットパターンはこの定義順に展開するので、前の行を後の行で上書きする。
; そのためより限定的なほうを後ろ(下)に記述すること。
; それ以外は概ねソートすること。
;
; ビットパターン
;	0, 1    … 0 または 1 固定のビット
;	n       … 0 および 1 の両方に展開される
;	rrr,sss … レジスタ (B,C,D,E,H,L,A) に展開 (%110=(HL) は除く)
;	            ixr,ixs なら B,C,D,E, IXH, IXL, A に展開
;	ww      … レジスタ BC,DE,HL,SP に展開
;	zz      … レジスタ BC,DE,HL,AF に展開
;	fff     … 条件に展開
;	bbb     … ビット番号 0-7 に展開
;
; CPU 欄
;	0..		… Z80 (not supported, reference only)
;	Z..		… Z80 非公式命令 (not supported, reference only, R800 は未調査)
;	.1.		… HD64*180
;	.N.		… nono による拡張
;	..R		… R800 (not supported, reference only)

; ここだけ紛らわしいので注意。
;    00100010 LD (nn),HL
; DD:00100010 LD (nn),IX/IY
; ED:01ww0011 LD (nn),ww (ww = BC,DE,HL,SP)
; と
;    00101010 LD HL,(nn)
; DD:00101010 LD IX/IY,(nn)
; ED:01ww1011 LD ww,(nn) (ww = BC,DE,HL,SP)

; パターン		CPU		関数名		表示名
00ww0001		01R		ld_ww_nn	LD ww,nn
00ww0010		01R		ld_wwin_a	LD (ww),A
00ww0011		01R		inc_ww		INC ww
00rrr100		01R		inc_r		INC r
00110100		01R		inc_hlin	INC (HL)
00rrr101		01R		dec_r		DEC r
00110101		01R		dec_hlin	DEC (HL)
00rrr110		01R		ld_r_n		LD r,n
00110110		01R		ld_hlin_n	LD (HL),n
00ww1001		01R		add_hl_ww	ADD HL,ww
00ww1010		01R		ld_a_wwin	LD A,(ww)
00ww1011		01R		dec_ww		DEC ww

00000000		01R		nop
00000111		01R		rlca
00001000		01R		ex_af_af	EX AF,AF'
00001111		01R		rrca

00010000		01R		djnz		DJNZ n
00010111		01R		rla
00011000		01R		jr			JR n
00011111		01R		rra

00100000		01R		jr_nz		JR NZ,n
00100010		01R		ld_nnin_hl	LD (nn),HL
00100111		01R		daa
00101000		01R		jr_z		JR Z,n
00101010		01R		ld_hl_nnin	LD HL,(nn)
00101111		01R		cpl

00110000		01R		jr_nc		JR NC,n
00110010		01R		ld_nnin_a	LD (nn),A
00110111		01R		scf
00111000		01R		jr_c		JR C,n
00111010		01R		ld_a_nnin	LD A,(nn)
00111111		01R		ccf

01rrrsss		01R		ld_r_s		LD r,s
01110sss		01R		ld_hlin_s	LD (HL),s
01rrr110		01R		ld_r_hlin	LD r,(HL)
01110110		01R		halt

10000rrr		01R		add_a_r		ADD A,r
10000110		01R		add_a_hlin	ADD A,(HL)
10001rrr		01R		adc_a_r		ADC A,r
10001110		01R		adc_a_hlin	ADC A,(HL)
10010rrr		01R		sub_r		SUB r
10010110		01R		sub_hlin	SUB (HL)
10011rrr		01R		sbc_a_r		SBC A,r
10011110		01R		sbc_a_hlin	SBC A,(HL)
10100rrr		01R		and_r		AND r
10100110		01R		and_hlin	AND (HL)
10101rrr		01R		xor_r		XOR r
10101110		01R		xor_hlin	XOR (HL)
10110rrr		01R		or_r		OR r
10110110		01R		or_hlin		OR (HL)
10111rrr		01R		cp_r		CP r
10111110		01R		cp_hlin		CP (HL)

11fff000		01R		ret_f		RET f
11zz0001		01R		pop_zz		POP zz
11110001		01R		pop_af		POP AF
11fff010		01R		jp_f_nn		JP f,nn
11fff100		01R		call_f_nn	CALL f,nn
11zz0101		01R		push_zz		PUSH zz
11110101		01R		push_af		PUSH AF
11vvv111		01R		rst			RST v

11000011		01R		jp_nn		JP nn
11000110		01R		add_a_n		ADD A,n
11001001		01R		ret
11001011		01R		cb			op_CB
11001101		01R		call		CALL nn
11001110		01R		adc_a_n		ADC A,n

11010011		01R		out_n_a		OUT (n),A
11010110		01R		sub_n		SUB n
11011001		01R		exx
11011011		01R		in_a_n		IN A,(n)
11011101		01R		dd			op_DD
11011110		01R		sbc_a_n		SBC A,n

11100011		01R		ex_sp_hl	EX (SP),HL
11100110		01R		and_n		AND n
11101001		01R		jp_hl		JP (HL)
11101011		01R		ex_de_hl	EX DE,HL
11101101		01R		ed			op_ED
11101110		01R		xor_n		XOR n

11110011		01R		di
11110110		01R		or_n		OR n
11111001		01R		ld_sp_hl	LD SP,HL
11111011		01R		ei
11111101		01R		fd			op_FD
11111110		01R		cp_n		CP n


CB:00000rrr		01R		rlc_r		RLC r
CB:00000110		01R		rlc_hlin	RLC (HL)
CB:00001rrr		01R		rrc_r		RRC r
CB:00001110		01R		rrc_hlin	RRC (HL)
CB:00010rrr		01R		rl_r		RL r
CB:00010110		01R		rl_hlin		RL (HL)
CB:00011rrr		01R		rr_r		RR r
CB:00011110		01R		rr_hlin		RR (HL)
CB:00100rrr		01R		sla_r		SLA r
CB:00100110		01R		sla_hlin	SLA (HL)
CB:00101rrr		01R		sra_r		SRA r
CB:00101110		01R		sra_hlin	SRA (HL)
CB:00110rrr		Z--		sll_r		SLL	r
CB:00110110		Z--		sll_hlin	SLL (HL)
CB:00111rrr		01R		srl_r		SRL r
CB:00111110		01R		srl_hlin	SRL (HL)
CB:01bbbrrr		01R		bit_r		BIT b,r
CB:01bbb110		01R		bit_hlin	BIT b,(HL)
CB:10bbbrrr		01R		res_r		RES b,r
CB:10bbb110		01R		res_hlin	RES b,(HL)
CB:11bbbrrr		01R		set_r		SET b,r
CB:11bbb110		01R		set_hlin	SET b,(HL)


ED:00rrr000		-1-		in0_r_n		IN0 r,(n)
ED:00110000		-1-		in0_f_n		IN0 F,(n)
ED:00rrr001		-1-		out0_n_r	OUT0 (n),r
ED:00rrr100		-1-		tst_r		TST r
ED:00110100		-1-		tst_hlin	TST (HL)

ED:01rrr000		01R		in_r_c		IN r,(C)
ED:01110000		01R		in_f_c		IN F,(C)
ED:01rrr001		01R		out_c_r		OUT (C),r
ED:01ww0010		01R		sbc_hl_ww	SBC HL,ww
ED:01ww0011		01R		ld_nnin_ww	LD (nn),ww
ED:01ww1010		01R		adc_hl_ww	ADC HL,ww
ED:01ww1011		01R		ld_ww_nnin	LD ww,(nn)
ED:01ww1100		-1-		mlt			MLT ww

ED:01000100		01R		neg
ED:01000101		01R		retn
ED:01000110		01R		im_0		IM 0
ED:01000111		01R		ld_i_a		LD I,A
ED:01001101		01R		reti
ED:01001111		01R		ld_r_a		LD R,A

ED:01010110		01R		im_1		IM 1
ED:01010111		01R		ld_a_i		LD A,I
ED:01011110		01R		im_2		IM 2
ED:01011111		01R		ld_a_r		LD A,R

ED:01100100		-1-		tst_n		TST n
ED:01100111		01R		rrd
ED:01101111		01R		rld

ED:01110100		-1-		tstio_n		TSTIO n
ED:01110110		-1-		slp

ED:10000011		-1-		otim
ED:10001011		-1-		otdm
ED:10010011		-1-		otimr
ED:10011011		-1-		otdmr

ED:10100000		01R		ldi
ED:10100001		01R		cpi
ED:10100010		01R		ini
ED:10100011		01R		outi
ED:10101000		01R		ldd
ED:10101001		01R		cpd
ED:10101010		01R		ind
ED:10101011		01R		outd

ED:10110000		01R		ldir
ED:10110001		01R		cpir
ED:10110010		01R		inir
ED:10110011		01R		otir
ED:10111000		01R		lddr
ED:10111001		01R		cpdr
ED:10111010		01R		indr
ED:10111011		01R		otdr

ED:11rrr001		--R		mulub_a_r	MULUB A,r
ED:11000011		--R		mulub_hl_bc	MULUB HL,BC
ED:11110011		--R		mulub_hl_sp	MULUB HL,SP

ED:11111111		-N-		syscall		SYSCALL		; MSXDOS エミュレーション


DD:00ww1001		01R		add_hl_ww	ADD IX,ww
DD:00100001		01R		ld_ww_nn	LD IX,nn
DD:00100010		01R		ld_nnin_hl	LD (nn),IX
DD:00100011		01R		inc_ww		INC IX
DD:00101010		01R		ld_hl_nnin	LD IX,(nn)
DD:00101011		01R		dec_ww		DEC IX
DD:00rrr100		Z-Z		inc_ixr		INC ixr
DD:00110100		01R		inc_hlin	INC (IX+d)
DD:00rrr101		Z-Z		dec_ixr		DEC ixr
DD:00110101		01R		dec_hlin	DEC (IX+d)
DD:00rrr110		Z-Z		ld_ixr_n	LD ixr,n
DD:00110110		01R		ld_hlin_n	LD (IX+d),n
DD:01rrr110		01R		ld_r_hlin	LD r,(IX+d)
DD:01110sss		01R		ld_hlin_s	LD (IX+d),s
DD:01rrrsss		Z-Z		ld_r_ixs	LD r,ixs
DD:10000rrr		Z-Z		add_a_ixr	ADD A,ixr
DD:10000110		01R		add_a_hlin	ADD A,(IX+d)
DD:10001rrr		Z-Z		adc_a_ixr	ADC A,ixr
DD:10001110		01R		adc_a_hlin	ADC A,(IX+d)
DD:10010rrr		Z-Z		sub_ixr		SUB ixr
DD:10010110		01R		sub_hlin	SUB (IX+d)
DD:10011rrr		Z-Z		sbc_a_ixr	SBC A,ixr
DD:10011110		01R		sbc_a_hlin	SBC A,(IX+d)
DD:10100rrr		Z-Z		and_ixr		AND ixr
DD:10100110		01R		and_hlin	AND (IX+d)
DD:10101rrr		Z-Z		xor_ixr		XOR ixr
DD:10101110		01R		xor_hlin	XOR (IX+d)
DD:10110rrr		Z-Z		or_ixr		OR ixr
DD:10110110		01R		or_hlin		OR (IX+d)
DD:10111rrr		Z-Z		cp_ixr		CP ixr
DD:10111110		01R		cp_hlin		CP (IX+d)
DD:11001011		01R		dd_cb		op_DD_CB
DD:11100001		01R		pop_zz		POP IX
DD:11100011		01R		ex_sp_hl	EX (SP),IX
DD:11100101		01R		push_zz		PUSH IX
DD:11101001		01R		jp_hl		JP (IX)
DD:11111001		01R		ld_sp_hl	LD SP,IX
DD_CB:00000110	01R		rlc_hlin	RLC (IX+d)
DD_CB:00001110	01R		rrc_hlin	RRC (IX+d)
DD_CB:00010110	01R		rl_hlin		RL (IX+d)
DD_CB:00011110	01R		rr_hlin		RR (IX+d)
DD_CB:00100110	01R		sla_hlin	SLA (IX+d)
DD_CB:00101110	01R		sra_hlin	SRA (IX+d)
DD_CB:00110110	Z--		sll_hlin	SLL (IX+d)
DD_CB:00111110	01R		srl_hlin	SRL (IX+d)
DD_CB:01bbb110	01R		bit_hlin	BIT b,(IX+d)
DD_CB:10bbb110	01R		res_hlin	RES b,(IX+d)
DD_CB:11bbb110	01R		set_hlin	SET b,(IX+d)
