369 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			369 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
	.define mlu4
 | 
						|
	.define	dvu4
 | 
						|
.sect .text
 | 
						|
.sect .rom
 | 
						|
.sect .data
 | 
						|
.sect .bss
 | 
						|
.sect .text
 | 
						|
!----------------------------------------------------------------------------
 | 
						|
!		SIGNED INTEGER ARITHMETIC
 | 
						|
!------------------------------------------------------------------------------
 | 
						|
 | 
						|
adi_l:		adroff		;	move.w	(a5),d0	;	bra 1f
 | 
						|
adi_z:		mov	(sp)+,d0
 | 
						|
1:		sub.w	wrd,d0	;	beq	adi_1W
 | 
						|
		sub.w	wrd,d0	;	beq	adi_2W
 | 
						|
		bra	e_oddz
 | 
						|
adi_1W:
 | 
						|
#if test
 | 
						|
		comp	und,(sp) ;	beq	6f
 | 
						|
		comp	und,word(sp);	bne	7f
 | 
						|
6:		bsr	e_iund
 | 
						|
#endif
 | 
						|
7:		mov	(sp)+,d0 ;	ad	d0,(sp)
 | 
						|
#if test
 | 
						|
		bvs	9f
 | 
						|
#endif
 | 
						|
		jmp	(a4)
 | 
						|
adi_2W:
 | 
						|
#ifdef lword
 | 
						|
		bsr	no8bar	;	add.l	#8,sp
 | 
						|
		jmp	(a4)
 | 
						|
#else
 | 
						|
		move.l	(sp)+,d0 ;	add.l	d0,(sp)
 | 
						|
#endif
 | 
						|
#if test
 | 
						|
		bvs	9f
 | 
						|
#endif
 | 
						|
		jmp	(a4)
 | 
						|
 | 
						|
!--------------------------------------------------------------------------
 | 
						|
 | 
						|
sbi_z:		mov	(sp)+,d0 ;	bra	1f
 | 
						|
sbi_l:		adroff		;	move.w	(a5),d0
 | 
						|
1:		sub.w	wrd,d0	;	beq	sbi_1W
 | 
						|
		sub.w	wrd,d0	;	beq	sbi_2W
 | 
						|
		bra	e_oddz
 | 
						|
sbi_1W:
 | 
						|
#if test 
 | 
						|
		comp	und,(sp) ;	beq	6f
 | 
						|
		comp	und,word(sp) ; bne	7f
 | 
						|
6:		bsr	e_iund
 | 
						|
#endif
 | 
						|
7:		mov	(sp)+,d0 ;	subt	d0,(sp)
 | 
						|
#if test
 | 
						|
		bvs	9f
 | 
						|
#endif
 | 
						|
		jmp	(a4)
 | 
						|
sbi_2W:
 | 
						|
#ifdef lword
 | 
						|
		add.l	#8,sp	;	bsr	no8bar
 | 
						|
		jmp	(a4)
 | 
						|
#else
 | 
						|
		move.l	(sp)+,d0 ;	sub.l	d0,(sp)
 | 
						|
#endif
 | 
						|
#if test
 | 
						|
		bvs	9f
 | 
						|
#endif
 | 
						|
		jmp	(a4)
 | 
						|
9:		bsr	e_iovfl ;	jmp	(a4)
 | 
						|
 | 
						|
!----------------------------------------------------------------------------
 | 
						|
 | 
						|
mli_z:		mov	(sp)+,d0 ;	bra	0f
 | 
						|
mli_l:		adroff		;	move.w	(a5),d0
 | 
						|
0:		sub.w	wrd,d0	;	beq	mli_1W
 | 
						|
		sub.w	wrd,d0	;	beq	mli_2W
 | 
						|
		bra	e_oddz
 | 
						|
mli_1W:		mov	(sp)+,d0
 | 
						|
#if test
 | 
						|
		comp	und,d0 ;	beq	1f
 | 
						|
		comp	und,(sp) ;	bne	2f
 | 
						|
1:		bsr	e_iund
 | 
						|
#endif
 | 
						|
2:
 | 
						|
#ifdef lword
 | 
						|
		move.l	(sp)+,d1 ;	bra	4f
 | 
						|
#else
 | 
						|
		muls	(sp),d0 ;	move.w	d0,(sp)
 | 
						|
#if test
 | 
						|
		bpl	3f	;	not.l	d0
 | 
						|
3:		swap	d0	;	tst.w	d0	;	bne 9b
 | 
						|
#endif
 | 
						|
		jmp	(a4)
 | 
						|
#endif
 | 
						|
mli_2W:
 | 
						|
#ifdef lword
 | 
						|
		bsr	no8bar	;	add.l	#4,sp
 | 
						|
		move.l	(sp)+,d0 ;	add.l	#4,sp
 | 
						|
		move.l	(sp)+,d1
 | 
						|
#else
 | 
						|
		move.l	(sp)+,d0 ;	move.l	(sp)+,d1
 | 
						|
#endif
 | 
						|
4:		move.l	#0,d5	;	tst.l	d0	;	bpl 5f
 | 
						|
		neg.l	d0	;	not.w	d5
 | 
						|
5:		tst.l	d1	;	bpl	6f
 | 
						|
		neg.l	d1	;	not.w	d5
 | 
						|
6:		bsr	mlu4
 | 
						|
#if test 
 | 
						|
		tst.l	d4	;	bne	7f
 | 
						|
		tst.l	d0	;	bpl	8f
 | 
						|
7:		bsr	e_iovfl
 | 
						|
#endif
 | 
						|
8:		tst.w	d5	;	beq	0f
 | 
						|
		neg.l	d0
 | 
						|
0:		move.l	d0,-(sp) 
 | 
						|
!next 4 lines only in case 8 byte arithmetic
 | 
						|
!#ifdef lword
 | 
						|
!		bmi	1f	;	clr.l	-(sp)	;	bra 2f
 | 
						|
!1:		move.l	#-1,-(sp)
 | 
						|
!#endif
 | 
						|
2:		jmp	(a4)
 | 
						|
 | 
						|
!subroutine for unsigned 4byte multiplication . Expects multiplier in d0 and
 | 
						|
! multiplicant in d1 . Returns 4 byte result in d0 . If d4=0 overflow did 
 | 
						|
! not occur on the multiplication , else it did .
 | 
						|
 | 
						|
	.sect .text
 | 
						|
 | 
						|
mlu4:		move.l	d1,d3	;	move.l	d0,d2
 | 
						|
		swap	d2	;	swap	d3
 | 
						|
#if test
 | 
						|
		move.l	d3,d4	;	mulu	d2,d4
 | 
						|
#endif
 | 
						|
		mulu	d0,d3	;	swap	d3
 | 
						|
		mulu	d1,d2	;	swap	d2
 | 
						|
#if test
 | 
						|
		or.w	d3,d4	;	or.w	d2,d4
 | 
						|
#endif
 | 
						|
		clr.w	d3	;	clr.w	d2
 | 
						|
		mulu	d1,d0	;	add.l	d3,d0
 | 
						|
#if test
 | 
						|
		bvc	1f	;	bset	#0,d4
 | 
						|
#endif
 | 
						|
1:		add.l	d2,d0
 | 
						|
#if test
 | 
						|
		bvc	2f	;	bset	#0,d4
 | 
						|
#endif
 | 
						|
2:		rts
 | 
						|
 | 
						|
!---------------------------------------------------------------------------
 | 
						|
 | 
						|
dvi_z:		mov	(sp)+,d0 ;	bra	0f
 | 
						|
dvi_l:		adroff		;	move.w	(a5),d0
 | 
						|
0:		sub.w	wrd,d0	;	beq	dvi_1W
 | 
						|
		sub.w	wrd,d0	;	beq	dvi_2W
 | 
						|
		bra	e_oddz
 | 
						|
dvi_1W:
 | 
						|
#ifdef lword
 | 
						|
		bsr	dvi4	;	move.l	d1,-(sp)
 | 
						|
#else
 | 
						|
		bsr	dvi2	;	move.w	d1,-(sp)
 | 
						|
#endif
 | 
						|
		jmp	(a4)
 | 
						|
dvi_2W:
 | 
						|
#ifdef lword
 | 
						|
		bsr	no8bar	;	tst.l	(sp)+
 | 
						|
		move.l	(sp)+,(sp) ;	bsr	dvi4
 | 
						|
		move.l	d1,-(sp) ;	clr.l	-(sp)
 | 
						|
#else
 | 
						|
		bsr	dvi4	;	move.l	d1,-(sp)
 | 
						|
#endif
 | 
						|
		jmp	(a4)
 | 
						|
 | 
						|
rmi_z:		mov	(sp)+,d0 ;	bra	1f
 | 
						|
rmi_l:		adroff		;	move.w	(a5),d0
 | 
						|
1:		sub.l	wrd,d0	;	beq	rmi_1W
 | 
						|
		sub.l	wrd,d0	;	beq	rmi_2W
 | 
						|
		bra	e_oddz
 | 
						|
rmi_1W:
 | 
						|
#ifdef lword
 | 
						|
		bsr	dvi4	;	move.l	d3,-(sp)
 | 
						|
#else
 | 
						|
		bsr	dvi2	;	swap	d1
 | 
						|
		move.w	d1,-(sp)
 | 
						|
#endif
 | 
						|
		jmp	(a4)
 | 
						|
rmi_2W:
 | 
						|
#ifdef lword
 | 
						|
		bsr	no8bar	;	tst.l	(sp)+
 | 
						|
		move.l	(sp)+,(sp) ;	bsr	dvi4
 | 
						|
		move.l	d3,-(sp) ;	clr.l	-(sp)
 | 
						|
#else
 | 
						|
		bsr	dvi4	;	move.l	d3,-(sp)
 | 
						|
#endif
 | 
						|
		jmp	(a4)
 | 
						|
 | 
						|
! 2byte division . In d1: quotient=low word ; remainder=high word
 | 
						|
#ifndef lword
 | 
						|
dvi2:		move.l	(sp)+,d2
 | 
						|
		move.w	(sp)+,d0				!divisor
 | 
						|
		move.w	(sp)+,d1 ;	ext.l	d1		!dividend
 | 
						|
#if test
 | 
						|
		cmp.w	und,d1	;	bne	1f
 | 
						|
		bsr	e_iund
 | 
						|
1:		cmp.w	und,d0	;	bne	2f
 | 
						|
		bsr	e_iund
 | 
						|
2:		tst.w	d0	;	bne	3f
 | 
						|
		bsr	e_idivz	;	move.l	und,d1	;	bra 4f
 | 
						|
3:
 | 
						|
#endif
 | 
						|
		divs	d0,d1
 | 
						|
4:		move.l	d2,-(sp) ;	rts
 | 
						|
#endif
 | 
						|
 | 
						|
! long signed division . quotient in d1 , remainder in d3
 | 
						|
dvi4:		move.l	(sp)+,d5
 | 
						|
		move.l	(sp)+,d0		!divisor
 | 
						|
		move.l	(sp)+,d1		!dividend
 | 
						|
#ifdef lword
 | 
						|
		cmp.l	und,d0	;	beq	0f
 | 
						|
		cmp.l	und,d1	;	bne	1f
 | 
						|
0:		bsr	e_iund
 | 
						|
1:
 | 
						|
#endif
 | 
						|
		move.l	#0,d4			!sign in d4
 | 
						|
		tst.l	d0	;	bpl	1f
 | 
						|
		neg.l	d0	;	not.w	d4
 | 
						|
1:		tst.l	d1	;	bpl	2f
 | 
						|
		neg.l	d1
 | 
						|
		not.w	d4	;	swap	d4
 | 
						|
		not.w	d4	;	swap	d4
 | 
						|
2:		bsr	dvu4
 | 
						|
		tst.w	d4	;	beq	3f
 | 
						|
		neg.l	d1			!quotient
 | 
						|
3:		tst.l	d4	;	bpl	4f
 | 
						|
		neg.l	d3				!remainder
 | 
						|
4:		move.l	d5,-(sp) ;	rts
 | 
						|
 | 
						|
!Expects d0 divisor , d1 dividend. Gives d1 quotient ,d3 remainder
 | 
						|
 | 
						|
	.sect .text
 | 
						|
dvu4:
 | 
						|
#if test
 | 
						|
		tst.l	d0	;	bne	1f
 | 
						|
		bsr	e_idivz
 | 
						|
1:
 | 
						|
#endif
 | 
						|
		move.l	#0,d3	;	move.l	#32,d2
 | 
						|
3:		lsl.l	#1,d1	;	roxl.l	#1,d3
 | 
						|
		cmp.l	d0,d3	;	blt	4f
 | 
						|
		sub.l	d0,d3	;	add.l	#1,d1
 | 
						|
4:		sub.w	#1,d2	;	bgt	3b
 | 
						|
		rts
 | 
						|
 | 
						|
!----------------------------------------------------------------------------
 | 
						|
 | 
						|
ngi_z:		mov	(sp)+,d0 ;	bra	0f
 | 
						|
ngi_l:		adroff		;	move.w	(a5),d0
 | 
						|
0:		sub.l	wrd,d0	;	bne	2f
 | 
						|
#if test
 | 
						|
		comp	und,(sp) ;	bne	1f
 | 
						|
		bsr	e_iund
 | 
						|
1:
 | 
						|
#endif
 | 
						|
		nega	(sp)	;	jmp	(a4)
 | 
						|
2:		cmp.l	wrd,d0	;	beq	3f
 | 
						|
		bra	e_oddz
 | 
						|
3:
 | 
						|
#ifdef lword
 | 
						|
		bsr	no8bar	;	not.l	(sp)
 | 
						|
		neg.l	4(sp)
 | 
						|
#else
 | 
						|
		neg.l	(sp)
 | 
						|
#endif
 | 
						|
#if test
 | 
						|
		bvc	4f	;	bsr	e_iovfl
 | 
						|
4:
 | 
						|
#endif
 | 
						|
		jmp	(a4)
 | 
						|
 | 
						|
!--------------------------------------------------------------------------
 | 
						|
 | 
						|
sli_z:		mov	(sp)+,d0 ;	bra	0f
 | 
						|
sli_l:		adroff		;	move.w	(a5),d0
 | 
						|
0:		sub.w	wrd,d0	;	beq	sli_1W
 | 
						|
		sub.w	wrd,d0	;	beq	sli2
 | 
						|
		bra	e_oddz
 | 
						|
sli_1W:		mov	(sp)+,d0 	!d0 contains the shift count
 | 
						|
		bmi	5f
 | 
						|
9:		mov	(sp)+,d1		!integer to shift 
 | 
						|
#if test
 | 
						|
		comp	und,d0	;	bne	1f
 | 
						|
		bsr	e_iund
 | 
						|
1:
 | 
						|
#endif
 | 
						|
		asle	d0,d1			! ASLE
 | 
						|
#if test
 | 
						|
		bvc	2f	;	bsr	e_iovfl
 | 
						|
2:
 | 
						|
#endif
 | 
						|
		mov	d1,-(sp) ;	jmp	(a4)
 | 
						|
sli2:
 | 
						|
#ifdef lword
 | 
						|
		bsr	no8bar	;	move.l	(sp)+,d1
 | 
						|
		move.l	(sp)+,d2 ;	move.l	(sp)+,d0
 | 
						|
3:		asl.l	#1,d0	;	roxl.l	#1,d2
 | 
						|
		sub.l	#1,d1	;	bgt	3b
 | 
						|
		move.l	d0,-(sp) ;	move.l	d2,-(sp)
 | 
						|
#else
 | 
						|
		move.w	(sp)+,d0 
 | 
						|
		bmi	6f
 | 
						|
8:		move.l	(sp),d1
 | 
						|
		asl.l	d0,d1
 | 
						|
#if test
 | 
						|
		bvc	4f	;	bsr	e_iovfl
 | 
						|
4:
 | 
						|
#endif
 | 
						|
		move.l	d1,(sp)
 | 
						|
#endif
 | 
						|
		jmp	(a4)
 | 
						|
5:		nega	d0	;	bra	8f
 | 
						|
#ifndef	lword
 | 
						|
6:		neg.w	d0	;	bra	9f
 | 
						|
#endif
 | 
						|
 | 
						|
!------------------------------------------------------------------------------
 | 
						|
7:		nega	d0	;	bra	9b
 | 
						|
#ifndef	lword
 | 
						|
6:		neg.w	d0	;	bra	8b
 | 
						|
#endif
 | 
						|
 | 
						|
sri_z:		mov	(sp)+,d0 ;	bra	0f
 | 
						|
sri_l:		adroff		;	move.w	(a5),d0
 | 
						|
0:		sub.w	wrd,d0	;	bne	sri2
 | 
						|
		mov	(sp)+,d0 
 | 
						|
		bmi	7b
 | 
						|
8:		mov	(sp)+,d1
 | 
						|
#if test
 | 
						|
		comp	und,d0	;	bne	1f
 | 
						|
		bsr	e_iund
 | 
						|
1:
 | 
						|
#endif
 | 
						|
		asri	d0,d1
 | 
						|
#if test
 | 
						|
		bvc	2f	;	bsr	e_iovfl
 | 
						|
2:
 | 
						|
#endif
 | 
						|
		mov	d1,-(sp) ;	jmp	(a4)
 | 
						|
sri2:		sub.w	wrd,d0	;	beq	3f
 | 
						|
		bra	e_oddz
 | 
						|
3:
 | 
						|
#ifdef lword
 | 
						|
		bsr	no8bar	;	move.l	(sp)+,d1
 | 
						|
		move.l	(sp)+,d2 ;	move.l	(sp),d0
 | 
						|
		sub.l	#1,d1
 | 
						|
4:		asr.l	#1,d2	;	roxr.l	#1,d0	;	dbra d1,4b
 | 
						|
		move.l	d0,(sp) ;	move.l	d2,-(sp)
 | 
						|
#else
 | 
						|
		move.w	(sp)+,d0 
 | 
						|
		bmi	6b
 | 
						|
9:		move.l	(sp),d1
 | 
						|
		asr.l	d0,d1
 | 
						|
#if test
 | 
						|
		bvc	5f	;	bsr	e_iovfl
 | 
						|
5:
 | 
						|
#endif
 | 
						|
		move.l	d1,(sp)
 | 
						|
#endif
 | 
						|
		jmp	(a4)
 |