	;; opcodes tests
	.text
	.mmregs
	.global X, Y, Z
	.global _opcodes, _opcodes_end
	.label _opcodes_load
_opcodes:
	abdst	*ar3+, *ar4+
	abs	a
	abs	a,b
	add	*ar0+, a	; Smem, src
	add	*ar1+, ts, a	; Smem, TS, src
	add	*ar2+, 16, a	; Smem, 16, src [,dst]
	add	*ar3+, a, b	; Smem [,SHIFT], src [,dst] (-16<=SHIFT<=15)

	add	*ar4+, 1, a	; Xmem, SHFT, src (0<=SHFT<=15)
	add	*ar3+, *ar4+, a	; Xmem, Ymem, dst
	add	#-32768, a	; #lk [,SHFT], src [,dst] (-32768<=lk<=32767)

	add	#0,16,a,b	; #lk, 16, src, [,dst]

	add	a,-16,b		; src [,SHIFT][,dst]
	add	a,asm,b		; src, ASM [,dst]
	addc	*ar0+,a
	addm	#1,*ar1+

	adds	*ar2+,a
	and	*ar3+,a		; Smem,src
	and	#1,1,a,b	; #lk[,SHFT],src[,dst]

	and	#1,#16,a,b	; #lk,16,src[,dst]

	and	a		; src[,SHIFT][,dst]
	andm	#1,*ar0+

	b	_opcodes_end

	bd	#_opcodes_end
	nop
	nop

	bacc	a
	baccd	b
	nop
	nop

	banz	_opcodes_end,*ar1+

	banzd	_opcodes_end,*ar2+
	nop
	nop

	bc	_opcodes_end, AEQ,AOV

	bcd	_opcodes_end, BIO,C,TC
	nop
	nop

	bit	*ar3+,1
	bitf	*ar4+,#-1

	bitt	*ar5+
	cala	a
	calad	b
	nop
	nop

	call	_opcodes_end

	calld	_opcodes_end
	nop
	nop

	cc	_opcodes_end, tc

	ccd	_opcodes_end, aeq
	nop
	nop

	cmpl	b,a
	cmpm	*ar0+,#1

	cmpr	1,ar1
	cmps	a,*ar2+
	dadd	*ar3-, a, b
	dadst	*ar4-, a
	delay	*ar5+
	dld	*ar6-, a
	drsub	*ar7-, b
	dsadt	*ar0-, a
	dst	a, *ar1-
	dsub	*ar2-, b
	dsubt	*ar3-, a
	exp	a
	firs	*ar3+,*ar4+,_opcodes_end

	frame	-128
	idle	2
	intr	15
	ld	*ar0+,a			; Smem,dst
	ld	*ar1+,ts,a		; Smem,TS,dst
	ld	*ar2+,16,a		; Smem,16,dst
	ld	*ar3+,1,a		; Smem[,SHIFT],dst

	ld	*ar4+,1,a		; Xmem,SHFT,dst
	ld	#1,b			; #K,dst
	ld	#32767,1,a		; #lk,[,SHFT],dst

	ld	#32767,16,a		; #lk,16,dst

	ld	a,asm,b			; src,ASM[,dst]
	ld	a,1,b			; src[,SHIFT],dst
	ld	*ar0+,t
	ld	*ar1+,dp
	ld	#_opcodes_end,dp	; FIXME try to print label on disasm
					; note:	TI assembler doesn't shift
					; the address encoding.
	ld	#15,asm
	ld	#7,arp
	ld	*ar2+,asm
	ldm	ar3,a
	ld	*ar2+,a || mac	*ar3+,b	; single-line parallel
	ld	*ar4+,b	|| macr	*ar5+,a	; with optional DST_ specified
	ld	*ar2+,a			; double-line parallel
	|| mas	*ar3+
	ld	*ar4+,b			; parallel spans
					; inserted line
	|| masr	*ar5+
	ldr	*ar6+,a
	ldu	*ar7+,a
	lms	*ar3+,*ar4+
	ltd	*ar0+
	mac	*ar1+,a
	macr	*ar2+,a
	mac	*ar2+,*ar3+,a,b
	macr	*ar4+,*ar5+,a,b
	mac	#1,a,b

	mac	*ar0+,#1,a

	maca	*ar1+			; *ar6+,b (valid)
	maca	t,a,b
	macd	*ar2+,_opcodes_end,a

	macp	*ar3+,_opcodes_end,a

	macsu	*ar4+,*ar5+,a
	mar	*ar6+
	mas	*ar7+,a
	masr	*ar0+,a
	mas	*ar3+,*ar4+,a,b
	masr	*ar2+,*ar5+,a,b
	masa	*ar6+		; *ar6+,b (valid)
	masa	t,a,b
	masar	t,a
	max	a
	min	b
	mpy	*ar7+,a
	mpy	*ar3+,*ar4+,b
	mpy	*ar0,#1,a

	mpy	#1,a

	mpya	*ar0+
	mpya	b
	mpyu	*ar1+,b
	mvdd	*ar2+,*ar3+
	mvdk	*ar4+,X

	mvdm	X,ar5

	mvdp	*ar6+,_opcodes_end

	mvkd	X,*ar7+

	mvmd	ar0,X

	mvmm	ar1,ar2
	mvpd	_opcodes_end,*ar3+

	neg	a,b

	nop
	norm	a
	or	*ar0+,b
	or	#(3+4),b

	or	#1,16,b

	or	b
	orm	#1,*ar1+

	poly	*ar2+
	popd	*ar3+
	popm	ar4
	portr	0,*ar5+

	portw	*ar6+,0

	pshd	*ar7+
	pshm	ar0
	rc	ANEQ
	rcd	AGT
	reada	*ar1+
	reset
	ret
	retd
	nop
	nop
	rete
	reted
	nop
	nop
	retf
	retfd
	rol	a
	roltc	a
	ror	b
	rpt	*ar0+
	nop
	rpt	#32
	nop
	rpt	#65535
	nop
	rptb	_opcodes_end-1
	nop
	rptbd	_opcodes_end-1
	nop
	nop
	rptz	a,#32767
	nop
	rsbx	1,15
	saccd	a,*ar3+,ALT
	sat	a
	sfta	a,15,b
	sftc	a
	sftl	a,15
	sqdst	*ar2+,*ar3+
	squr	*ar4+,b
	squr	a,a
	squra	*ar5+,a
	squrs	*ar6+,a
	srccd	*ar2+,ALEQ
	ssbx	1,15
	st	t,*ar0+
	st	trn,*ar1+
	st	#32767,*ar2+

	sth	a,*ar3+
	sth	a,asm,*ar4+
	sth	a,15,*ar5+
	sth	a,-16,*ar6+

	stl	a,*ar7+
	stl	a,asm,*ar0+
	stl	a,15,*ar1+
	stl	a,15,*ar2+

	stlm	a,ar3
	stm	#32767,ar4

	st	a,*ar5+
	|| add	*ar4+,b
	st	a,*ar3+
	|| ld	*ar2+,b
	st	a,*ar3+
	|| ld	*ar4+,t
	st	a,*ar5+
	|| mac	*ar2+,b
	st	a,*ar3+
	|| masr	*ar4+,b
	st	a,*ar3+
	|| mpy	*ar4+,b
	st	a,*ar3+
	|| sub	*ar4+,b
	strcd	*ar5+,BEQ
	sub	*ar0+,a
	sub	*ar1+,ts,a
	sub	*ar2+,16,a,b
	sub	*ar3+,a,b

	sub	*ar4+,15,a
	sub	*ar5+,*ar4+,b
	sub	#1,15,a,b

	sub	#1,16,a,b

	sub	a,-16,b
	sub	a,asm,b
	subb	*ar0+,a
	subc	*ar1+,a
	subs	*ar2+,a
	trap	15
	writa	*ar3+
	xc	1,AOV
	xor	*ar4+,a
	xor	#1,a

	xor	#1,16,a

	xor	a,1,b
	xorm	#1,*ar5+
_opcodes_end:
	.data
X:	.word	0
Y:	.word	1
*	.word	Z
	.end
