📄 mult32.asm
字号:
.include "ccall.asm"
;; Vectorized and modified by: Jeff Axelrod
;; Original Version: Alex Tessarolo
.def _ti_mult32
_ti_mult32:
; Begin C Preprocessing
pre_ccall 7,AR_X,AR_XEXP,AR_Y,AR_YEXP,AR_Z,AR_ZEXP,AR_N
; Modify any registers needed
SETC SXM ; Sign extension mode ON
; Note: Overflow mode is off in C.
sar AR_XEXP,*
lacc *
sar AR_YEXP,*
add *,AR_ZEXP
sacl *,AR_N
; End C Preprocessing
banz LOOP,AR_X
b DONE
LOOP:
spm #3
; LT XL
lt *+,AR_Y
; MPYU YL
mpyu *+,AR_STACK
; SPH TEMP
sph *
; LACL TEMP ; ACC = XL*YL >> 16
lacl *,AR_Y
; MPY YH
mpy *-,AR_X
; LTP XH ; Was LTA
ltp *,AR_Y
; MPY YL
mpy *
apac ; ACC += XL*YH + XH*YL
; BIT YL,0
bit *+,0,AR_X
bcnd SKIP1,NTC
; ADD XH,16 ; If bit 15 of YL=1, ACC += XH<<16
add *,16-6
SKIP1:
; BIT XL,0
mar *-
bit *,0
adrk #2
bcnd SKIP2,NTC
; ADD YH,16 ; If bit 15 of XL=1, ACC += YH<<16
mar *,AR_Y
add *,16-6
SKIP2:
; ADD #04000h ; Round ACC
; ACC >>= 15
;;; SFL
mar *,AR_STACK
; SACH TEMP
; rpt #15-7
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
sfr
; sach *
; LACL #0
; ADDC TEMP
;;; addc *,AR_Y
; lacc *,1,AR_Y
mar *,AR_Y
SPM #1 ; Set product shift mode to << 1 to
; recover redundant sign bit.
; T == XH
; MPY YH
mpy *+,AR_Z
APAC ; ACC += XH*YH
; SACH WH
; SACL WL
sacl *+
sach *+,AR_N
banz LOOP,AR_X
; Begin C Post Processing
DONE:
; Restore any other registers modified
; Note: Overflow mode is off in C.
spm 0
post_ccall 7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -