www.pudn.com > g729Decoder.rar > 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