📄 math.asm
字号:
;==========================================================================
; File Name
; ----------
; MATH.ASM
;
; Brief Description of the Code:
; ------------------------------
; This file contains MATH functions use in G.729A.
;
; Ref
; ------
; BASIC_OP.C and OPER_32B.C
;==========================================================================
.mmregs
.include ..\include\ld8amem.h
.text
.def MPY32
.def MPY32_16
.def DIV16
.def DIV32
;----------------------------------------------------
; MPY32 :
;
; input :
; X(32) = | Xhi(16) | Xlo(16) |
; Y(32) = | Yhi(16) | Ylo(16) |
;
; AR4 -> Xlo
; AR5 -> Ylo
;
; output : A = X(32) * Y(32)
;
; AR4 -> Xhi
; AR5 -> Yhi
;----------------------------------------------------
MPY32:
LD *AR4 , T
MPYU *AR5-, A
LD A, -16, A
MACSU *AR4-, *AR5+, A
MACSU *AR5-, *AR4 , A
RETD
LD A, -16, A
MAC *AR4, *AR5, A
;----------------------------------------------------
; MPY32_16 :
;
; input :
; X(16)
; Y(32) = | Yhi(16) | Ylo(16) |
;
; AR4 -> X
; AR5 -> Ylo
;
; output : A = X(16) * Y(32)
;
; AR4 -> X
; AR5 -> Yhi
;----------------------------------------------------
MPY32_16:
LD #0, A
MACSU *AR5-, *AR4, A
RETD
LD A, -16, A
MAC *AR4, *AR5, A
;----------------------------------------------------
; DIV16 :
;
; input :
; NUMER(16)
; DENOM(16)
;
; AR4 -> NUMER
; AR5 -> DENOM
;
; output : A = REM(16) / QUOT(16)
;----------------------------------------------------
DIV16:
LD *AR5, 16, A
BC EXIT_DIV16, ALEQ
LD *AR4, 16, A
BC EXIT_DIV16, ALT
RPT #15-1
SUBC *AR5, A
RET
EXIT_DIV16:
RETD
LD #0, A
NOP
;----------------------------------------------------
; DIV32 : 32 bit fractional division
; abs(NUMER)<=abs(DENOM), DENOM>0, NUMER>=0
;
; input :
; NUMER(32) = | Nhi(16) | Nlo(16) |
; DENOM(32) = | Dhi(16) | Dlo(16) |
;
; AR4 -> Nhi
; AR5 -> Dhi
;
; output :
; if ((DENOM>0) && (NUMER>0))
; A = QUOT(32)
; else A = 0
;
; Modified Registers : AR3, AR5
;----------------------------------------------------
.asg "Addr_local_buf1 + 128", L_32
.asg "AR3", pB
.asg "AR3", pL_32
.asg "AR4", pNum
.asg "AR5", pDen
DIV32:
DLD *pDen, B
LD #0, A
RC BLEQ
;DIV16
LD #03fffh, 16, B ; approx = div_s( (Word16)0x3fff, denom_hi);
RPT #15-1
SUBC *pDen, B ; BL = approx
STLM B, T ; T = approx >= 0 since Den > 0
;MPY32_16
MAR *pDen+ ; L_32 = Mpy_32_16(denom, approx)
MPYU *pDen-, A
LD A, -16, A
MAC *pDen, A
LD #4000h, 16, B ; L_32 = L_sub( (Word32)0x7fffffffL, L_32);
LD B, 1, B
SUB A, B ; B = L_32
STM #BL, pB
;MPY32_16
MPYU *pB+, A
LD A, -16, A
MAC *pB-, A ; A = L_32
STM #L_32, pL_32
DST A, *pL_32
MAR *pL_32+
;MPY32
LD #0, A
MACSU *pL_32-, *pNum+, A
MACSU *pNum-, *pL_32 , A
LD A, -16, A
RETD
MAC *pB, *pNum, A
LD A, 2, A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -