⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 divide32.asm

📁 包含几个高效的矢量运算的数学函数
💻 ASM
字号:
;; Vectorized and modified by: Jeff Axelrod
;; Original Version:	Alex Tessarolo

;;===========================================================================
;;
;; Description:	32 Bit By 16 Bit Signed Integer Divide And Modulus.
;;
;;---------------------------------------------------------------------------
;;
;; Algorithm:	Quot = Num/Den
;;		Rem  = Num%Den
;;		
;;		NumH	= n3|n2		QuotH	 = q3|q2
;;		NumL	= n1|n0		QuotL	 = q1|q0
;;		Den	= d1|d0		Rem	 = r1|r0
;;
;;		Signed division	is similar to unsigned division	except
;;		that the sign of the Den and Numerator must be taken into
;;		account. First the sign	is determined then divion is 
;;		performed on the absolute values.
;;
;;		Phase1:		t1|t0|q3|q2 = ACC After	repeating SUBC 16
;;			       ____________   times.
;;			d1|d0 )	00|00|n3|n2 = ACC Before.
;;
;;
;;		Phase2:		r1|r0|q1|q0 = ACC After	repeating SUBC 16
;;			       ____________   times.
;;			d1|d0 )	t1|t0|n1|n0 = ACC Before.
;;
;;		NOTES:	Sign extension and overflow mode must be turned	off.
;;
;;===========================================================================

	.include "ccall.asm"
	.def	_ti_divide32

_ti_divide32:
	pre_ccall 5,AR_NUM,AR_DEN,AR_QUOT,AR_REM,AR_N

	clrc	SXM			; MUST turn sign extension mode off.
					; Note: Overflow mode is off in C.

	mar *,AR_QUOT
	mar *+,AR_NUM
	mar *+,AR_N
	banz LOOP3
	b DONE
LOOP3:
;	lt	div_NumH
	lt *,AR_DEN
	
;	mpy	div_Den			; P = sign of Num * Den	
	mpy *,AR_NUM

;	lacc	div_NumH,16		; Take absolute value of Num.
	lacc *-,16
	
;	adds	div_NumL
	adds *,AR_QUOT
	abs
	
;	sach	div_QuotH		
;	sacl	div_QuotL
	sach *-
	sacl *+,AR_DEN

;	lacc	div_Den,16		; Take absolute value of Den.
	lacc *+,16,AR_REM
	abs        
	
;	sach	div_Rem
	sach *,AR_QUOT

;	lacl	div_QuotH		; ACCH = 0   , ACCL = NumH
	lacl *,AR_REM

	rpt	#14			
;	subc	div_Rem			; ACCH = Rem', ACCL = QuotH
	subc *
	subc *,AR_QUOT
	
;	sacl	div_QuotH
;	xor	div_QuotH		; ACCH = Rem', ACCL = 0
;	or	div_QuotL   		; ACCH = Rem', ACCL = NumL
	sacl *
	xor *-
	or *,AR_REM

	rpt	#15
;	subc	div_Rem			; ACCH = Rem , ACCL = QuotL
	subc *
;	sach	div_Rem
	sach *+,AR_QUOT
	
;	sacl	div_QuotL		
	sacl *+
		
	pac				; ACC = sign of Num * Den
	bcnd	DivModI32Skip,GEQ			
;	lacc	div_QuotH,16		; If negative, negate Quot.
;	adds	div_QuotL
;	neg
;	sach	div_QuotH
;	sacl	div_QuotL
	lacc *-,16
	adds *+
	neg
	sach *-
	sacl *+
DivModI32Skip:
	mar *,AR_QUOT 
	adrk #2
	mar *,AR_NUM
	adrk #3
	mar *,AR_N
	banz LOOP3,AR_NUM

DONE:
	post_ccall 5


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -