📄 divide16.asm
字号:
;; Vectorized and modified by: Jeff Axelrod
;; Original Version: Alex Tessarolo
;;===========================================================================
;;
;; Description: 16 Bit By 16 Bit Signed Integer Divide And Modulus.
;;
;;---------------------------------------------------------------------------
;; Input: div_Num
;; div_Den
;;
;; Modifies: P
;; T
;; SXM
;; OVM
;; DP
;; ACC
;;
;; Output: div_Quot
;; div_Rem
;;
;;---------------------------------------------------------------------------
;;
;; Algorithm: Quot = Num/Den
;; Rem = Num%Den
;;
;; Num = n1|n0 Quot = 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.
;;
;; r1|r0|q1|q0 = ACC After repeating SUBC 16
;; ____________ times.
;; d1|d0 ) 00|00|n1|n0 = ACC Before.
;;
;; NOTES: Sign extension and overflow mode must be turned off.
;;
;;===========================================================================
.include "ccall.asm"
.def _ti_divide16
_ti_divide16:
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_N
banz LOOP4
b DONE
LOOP4:
; lt div_Num
lt *,AR_DEN
; mpy div_Den ; P = sign of Num * Den
mpy *,AR_NUM
; lacc div_Num,16 ; Take absolute value of Num.
lacc *+,16,AR_QUOT
abs
; sach div_Quot
sach *,AR_DEN
; lacc div_Den,16 ; Take absolute value of Den.
lacc *+,16,AR_REM
abs
; sach div_Rem
sach *,AR_QUOT
; lacl div_Quot ; ACCH = 0 , ACCL = Num
lacl *,AR_REM
rpt #15
; subc div_Rem ; ACCH = Rem , ACCL = Quot
subc *
; sach div_Rem
sach *+,AR_QUOT
; sacl div_Quot
sacl *+,AR_N
pac ; ACC = sign of Num * Den
bcnd DivModI16Skip,GEQ
mar *,AR_QUOT
mar *-
; lacc div_Quot,16 ; If negative, negate Quot.
lacc *,16
neg
; sach div_Quot
sach *+,AR_N
DivModI16Skip:
banz LOOP4,AR_NUM
DONE:
post_ccall 5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -