📄 divide32.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 + -