www.pudn.com > g729Decoder.rar > LSP_SEL.asm


;========================================================================== 
;  File Name 
;  ---------- 
;  LSP_SEL.ASM 
; 
;  Brief Description of the Code: 
;  ------------------------------ 
;  Select LSP codebooks (L0, L1, L2, L3). 
; 
;  Ref 
;  ------ 
;  QUA_LSP.C 
;========================================================================== 
        .mmregs 
 
        .include  ..\include\const.h 
        .include  ..\include\ld8amem.h 
        .include  ..\include\tab_ld8a.h 
 
        .text 
        .def    Lsp_select_L1 
        .def    Lsp_select_L2L3 
 
;----------------------------------------------------------------------- 
;  Lsp_select_L1 
;----------------------------------------------------------------------- 
;  void Lsp_select_L1( 
;    Word16 rbuf[],              /* (i) Q13 : target vetor             */ 
;    Word16 lspcb1[][M],         /* (i) Q13 : first stage LSP codebook */ 
;    Word16 *cand                /* (o)     : selected code            */ 
;  ) 
;----------------------------------------------------------------------- 
;  Constants : Addr_lsp_vecQ13 -> rbuf 
;              (xxxx xxxx xxxx 0000) for use of circular buffer 
; 
;  Tables    : LspCb1Q13 -> lspcb1[][M] 
; 
;  Pointers  : ptr_L1 -> &cand 
; 
;----------------------------------------------------------------------- 
;  Input : DP = ptr_L1 
;               Lmin1 
;          BK = M 
; 
;  Output & returning  : *ptr_L1++ = L1 
;                        *ptr_L1++ = *ptr_sel_lspcb1 = LspCb1Q13[L1] 
;----------------------------------------------------------------------- 
 
        .asg    "AR2", pLspVecQ13 
        .asg    "AR3", pLspCb1Q13 
        .asg    "AR4", pL1 
 
Lsp_select_L1: 
        STM     #NC0 - 1, BRC 
        STM     #Addr_lsp_vecQ13, pLspVecQ13 
        STM     #LspCb1Q13, pLspCb1Q13 
        MVDM    ptr_L1, pL1 
        STM     #1, AR0 
 
        RPTBD   EndFindL1 - 1 
        ST      #07fffh, Lmin1 
 
                SUB     *pLspVecQ13+0%, *pLspCb1Q13+, A 
                RPTZ    B, #M - 2 
                        SQDST   *pLspVecQ13+0%, *pLspCb1Q13+ 
 
                        ; A(32 -- 16) * A(32 -- 16) + B -> B 
                        ; (*pLspVecQ13+ - *pLspCb1Q13+) << 16 -> A 
 
                SQDST   *pLspVecQ13, *pLspCb1Q13 
 
                LD      B, A 
                DSUB    Lmin1, B 
                MVMD    BRC, T 
                XC      2, BLT 
                        DST     A, Lmin1 
                        ST      T, *pL1 
EndFindL1: 
 
        LD      #NC0 - 1, A 
        SUB     *pL1, A 
        STL     A, *pL1                 ; store L1 
 
        LD      #LspCb1Q13, A 
        MAC     *pL1+, #M >> 1, A 
        STL     A, ptr_sel_lspcb1       ; store LspCb1[L1] 
        STL     A, *pL1+                ; store LspCb1[L1] 
 
        RETD 
        MVMD    pL1, ptr_L1 
 
 
;----------------------------------------------------------------------- 
;  Lsp_select_L2L3 
;----------------------------------------------------------------------- 
;  void Lsp_select_L2L3( 
;    Word16 rbuf[],              /* (i) Q13 : target vector             */ 
;    Word16 lspcb1[],            /* (i) Q13 : first stage lsp codebook  */ 
;    Word16 wegt[],              /* (i) norm: weighting coefficients    */ 
;    Word16 lspcb2[][M],         /* (i) Q13 : second stage lsp codebook */ 
;    Word16 *pL2                 /* (o)     : selected codebook index L2  */ 
;    Word16 *pL3                 /* (o)     : selected codebook index L3  */ 
;  ) 
;----------------------------------------------------------------------- 
;  Constants : Addr_lsp_vecQ13 -> rbuf 
;              Addr_wegtQ11 -> wegt       ; use circular buffer size of 10 
; 
;  Tables    : LspCb2Q13 -> lspcb2[][M] 
; 
;  Pointers  : ptr_L2 -> pL2 
;              ptr_L3 -> pL3 
;              ptr_sel_lspcb1 -> lspcb1[] 
; 
;              ptr_lsp_vec -> tempbuf      ; use circular buffer size of 10 
;              (xxxx xxxx xxxx 0000) for use of circular buffer 
;----------------------------------------------------------------------- 
;  Input : DP = ptr_L2 
;               Lmin1 
; 
;  Output & returning  : *ptr_L2++ = L2 
;                        *ptr_L2++ = LspCb2Q13[L2] 
;                        *ptr_L3++ = L3 
;                        *ptr_L3++ = LspCb2Q13[L3] 
;----------------------------------------------------------------------- 
 
 
        .asg    "AR1", AR_Counter 
 
        .asg    "AR2", pWegtQ11 
 
        .asg    "AR2", pL2 
        .asg    "AR3", pL3 
 
        .asg    "AR4", pLspCb2Q13 
        .asg    "AR5", pDifQ13 
 
        .asg    "Lmin1", Lmin3 
 
Lsp_select_L2L3: 
        STM     #Addr_lsp_vecQ13, pLspVecQ13 
        MVDM    ptr_sel_lspcb1, pLspCb1Q13 
 
        STM     #M - 1, BRC 
        STM     #1, AR0 
 
        RPTBD   EndGetDif - 1 
        MVDM    ptr_lsp_vec, pDifQ13 
 
                SUB     *pLspVecQ13+, *pLspCb1Q13+, A 
                STL     A, -16, *pDifQ13+% 
EndGetDif: 
        STM     #LspCb2Q13, pLspCb2Q13 
        STM     #Addr_wegtQ11, pWegtQ11 
 
        ST      #07fffh, Lmin2 
        ST      #07fffh, Lmin3 
 
        STM     #NC1 - 1, AR_Counter 
GetL2: 
                STM     #NC - 1, BRC 
                LD      #0, B 
                RPTB    EndGetDist2 - 1 
                        SUB     *pDifQ13+0%, *pLspCb2Q13+, A 
                        LD       A,-16,A 
                        STLM     A,T 
                        MPY    *pWegtQ11+%,A 
                        MACA    T,B 
 
EndGetDist2: 
                LD      B, A 
                DSUB    Lmin2, B 
                MVMD    AR_Counter, T 
                XC      2, BLT 
                        DST     A, Lmin2 
                        ST      T, L2 
GetL3: 
                STM     #NC - 1, BRC 
                LD      #0, B 
                RPTB    EndGetDist3 - 1 
                        SUB     *pDifQ13+0%, *pLspCb2Q13+, A 
                        LD       A,-16,A 
                        STLM     A,T 
                        MPY    *pWegtQ11+%,A 
                        MACA    T,B 
 
EndGetDist3: 
                LD      B, A 
                DSUB    Lmin3, B 
                MVMD    AR_Counter, T 
                XC      2, BLT 
                        DST     A, Lmin3 
                        ST      T, L3 
 
        BANZ    GetL2, *AR_Counter- 
 
        LD      #NC1 - 1, A 
 
        MVDM    ptr_L2, pL2 
        MVDM    ptr_L3, pL3 
 
        SUB     L2, A, B 
        SUB     L3, A 
 
        STL     B, *pL2               ; store L2 
        STL     A, *pL3               ; store L3 
 
        LD      #LspCb2Q13, A 
        MAC     *pL2+, #M >> 1, A, B 
        ADD     #M >> 1, A 
        MAC     *pL3+, #M >> 1, A 
 
        STL     B, *pL2+               ; store LspCb2[L2] 
        STL     A, *pL3+               ; store LspCb2[L3] 
        STL     B, ptr_sel_lspcb2_L2 
        STL     A, ptr_sel_lspcb2_L3 
 
        MVMD    pL2, ptr_L2 
        RETD 
        MVMD    pL3, ptr_L3