⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cor_h.asm

📁 TI C54写的G729代码,视线8kbps高质量语音解码,汇编优化
💻 ASM
字号:
;==========================================================================
;  File Name
;  ----------
;  COR_H.ASM
;
;  Brief Description of the Code:
;  ------------------------------
;  Compute correlations of h[]  needed for the codebook search.
;
;  Ref
;  ------
;  ACELP_CO.C (Cor_h)
;==========================================================================

        .mmregs

        .include  ..\include\const.h
        .include  ..\include\tab_ld8a.h
        .include  ..\include\ld8amem.h

        .def      Cor_h


;----------------------------------------------------------------------
;  Cor_h
;----------------------------------------------------------------------
;  void Cor_h(
;       Word16 *H,         /* (i) Q12 :Impulse response of filters */
;       Word16 *rr         /* (o)     :Correlations of H[]         */
;  )
;----------------------------------------------------------------------
;  Contstants : Addr_h1 -> H
;               Addr_rr -> rr
;----------------------------------------------------------------------

ldec      .set    9
i1i4_i0i3 .set    256           ; rri1i4 - rri0i3
i1i3_i0i2 .set    256           ; rri1i3 - rri0i2

        .asg    "AR0", p0
        .asg    "AR0", pTREG

        .asg    "AR1", p1p0
        .asg    "AR1", p1

        .asg    "AR2", p2
        .asg    "AR3", p3

        .asg    "AR4", pH1
        .asg    "AR5", pH2

        .asg    "AR6", p4

        .asg    "Addr_rr",    rri0i0
        .asg    "Addr_rr+8",  rri1i1
        .asg    "Addr_rr+16", rri2i2
        .asg    "Addr_rr+24", rri3i3
        .asg    "Addr_rr+32", rri4i4
        .asg    "Addr_rr+40",  rri0i1
        .asg    "Addr_rr+104", rri0i2
        .asg    "Addr_rr+168", rri0i3
        .asg    "Addr_rr+232", rri0i4
        .asg    "Addr_rr+296", rri1i2
        .asg    "Addr_rr+360", rri1i3
        .asg    "Addr_rr+424", rri1i4
        .asg    "Addr_rr+488", rri2i3
        .asg    "Addr_rr+552", rri2i4

        .asg    "Addr_local_buf2", xCounter
        .asg    "Addr_local_buf2+1", xDeltaP
        .asg    "Addr_local_buf2+2", xptr_hf


Cor_h:
   ; Find scaling factor of h[] for maximum precision

        STM     #Addr_h1, pH1
        MVMM    pH1, pH2
        RPTZ    A, #L_SUBFR - 1
                SQURA   *pH2+, A
        LD     A,-16,B
        SUB    #32000,B
		NOP
		BC     Tar,BLT
		LD      #-2,ASM  
		B       End
Tar:
         EXP      A
         STM      #T, pTREG              ; if scale factor = odd number
         LD       *pTREG, ASM            ; then output of c54x = output of c code << 1
         LD       *pTREG, A
		 AND      #1,A,B
		 BC       End,BEQ       
		 SUB      #1,A
		 STL      A,*pTREG
		 LD       *pTREG,ASM   
   ; Compute rri0i0[], rri1i1[], rri2i2[], rri3i3 and rri4i4[]
End:
        STM     #NB_POS - 1, BRC

        STM     #rri0i0 + NB_POS - 1, p0
        STM     #rri1i1 + NB_POS - 1, p1
        STM     #rri2i2 + NB_POS - 1, p2
        STM     #rri3i3 + NB_POS - 1, p3
        STM     #rri4i4 + NB_POS - 1, p4

        RPTBD   EndLoopG0 - 1
        LD      #0, A
        MVMM    pH1, pH2

                SQURA   *pH2+, A
                LD	A, ASM,B
                STL     B, -16, *p4-

                SQURA   *pH2+, A
                LD	A, ASM, B
                STL     B, -16, *p3-

                SQURA   *pH2+, A
                LD	A, ASM, B
                STL     B, -16, *p2-

                SQURA   *pH2+, A
                LD	A, ASM, B
                STL     B, -16, *p1-

                SQURA   *pH2+, A
                LD	A, ASM, B
                STL     B, -16, *p0-
EndLoopG0:

   ; Compute elements of: rri2i3[], rri1i2[], rri0i1[] and rri0i4[]

        LD      #xCounter, DP
        ST      #NB_POS - 1, xCounter
        ST      #MSIZE - ldec, xDeltaP
        ST      #Addr_h1 + 1, xptr_hf

        STM     #rri2i3 + MSIZE - 1, p4
        STM     #rri1i2 + MSIZE - 1, p3
        STM     #rri0i1 + MSIZE - 1, p2
        STM     #rri0i4 + MSIZE - 2, p1
LoopG1:
        STM     #Addr_h1, pH1
        MVDM    xptr_hf, pH2

        LD      xCounter,A
        ADD	#-1 ,A
        BCD     EndInnerLoopG1, ALT
        STLM    A, BRC
        LD      #0, A

        RPTBD   EndInnerLoopG1 - 1
        STM     #ldec, AR0

                MAC     *pH1+, *pH2+, A
                MAC     *pH1+, *pH2+, A
                LD	A, ASM, B
                STL     B, -16, *p4-0

                MAC     *pH1+, *pH2+, A
                LD	A, ASM, B
                STL     B, -16, *p3-0

                MAC     *pH1+, *pH2+, A
                LD	A, ASM, B
                STL     B, -16, *p2-0

                MAC     *pH1+, *pH2+, A
                LD	A, ASM, B
                STL     B, -16, *p1-0


EndInnerLoopG1:

        MVDM    xDeltaP, AR0

        MAC     *pH1+, *pH2+, A
        MAC     *pH1+, *pH2+, A
        LD	A, ASM, B
        STL     B, -16, *p4+0

        MAC     *pH1+, *pH2+, A
        LD	A, ASM, B
        STL     B, -16, *p3+0

        MAC     *pH1+, *pH2+, A
        LD	A, ASM, B
        STL     B, -16, *p2+0

        MAR     *p1+0
        MAR     *+p1(7)

        LD      xCounter,A
        ADD 	#-1 ,A
        ADDM    #-ldec, xDeltaP
        STL     A, xCounter

        BCD     LoopG1, AGEQ
        ADDM    #STEP, xptr_hf

   ; Compute elements of: rri2i4[], rri1i3[], rri0i2[], rri1i4[], rri0i3

        ST      #NB_POS - 1, xCounter
        ST      #MSIZE - ldec, xDeltaP
        ST      #Addr_h1 + 2, xptr_hf

        STM     #rri2i4 + MSIZE - 1, p4
        STM     #rri1i3 + MSIZE - 1, p3
        STM     #rri0i2 + MSIZE - 1, p2
        STM     #rri1i4 + MSIZE - 2, p1p0
LoopG2:
        STM     #Addr_h1, pH1
        MVDM    xptr_hf, pH2

        LD      xCounter,A
        ADD 	#-1 ,A
        BCD     EndInnerLoopG2, ALT
        STLM    A, BRC
        LD      #0, A
        RPTBD   EndInnerLoopG2 - 1
        STM     #ldec, AR0

                MAC     *pH1+, *pH2+, A
       		LD	A, ASM, B
       		STL     B, -16, *p4-0

                MAC     *pH1+, *pH2+, A
       		LD	A, ASM, B
       		STL     B, -16, *p3-0

                MAC     *pH1+, *pH2+, A
       		LD	A, ASM, B
       		STL     B, -16, *p2-0

                MAC     *pH1+, *pH2+, A
       		LD	A, ASM, B
       		STL     B, -16, *p1p0

                MAR     *+p1p0(-i1i4_i0i3)

                MAC     *pH1+, *pH2+, A
       		LD	A, ASM, B
       		STL     B, -16, *p1p0-0

                MAR     *+p1p0(i1i4_i0i3)
EndInnerLoopG2:

        MVDM    xDeltaP, AR0

        MAC     *pH1+, *pH2+, A
        LD	A, ASM, B
        STL     B, -16, *p4+0

        MAC     *pH1+, *pH2+, A
        LD	A, ASM, B
        STL     B, -16, *p3+0

        MAC     *pH1+, *pH2+, A
        LD	A, ASM, B
        STL     B, -16, *p2+0

        MAR     *p1p0+0
        MAR     *+p1p0(7)

        LD      xCounter,A
        ADD	#-1 ,A
        ADDM    #-ldec, xDeltaP
        STL     A, xCounter

        BCD     LoopG2, AGEQ
        ADDM    #STEP, xptr_hf

   ; Compute elements of: rri1i4[], rri0i3[], rri2i4[], rri1i3[], rri0i2

        ST      #NB_POS - 1, xCounter
        ST      #MSIZE - ldec, xDeltaP
        ST      #Addr_h1 + 3, xptr_hf

        STM     #rri1i4 + MSIZE - 1, p4
        STM     #rri0i3 + MSIZE - 1, p3
        STM     #rri2i4 + MSIZE - 2, p2
        STM     #rri1i3 + MSIZE - 2, p1p0
LoopG3:
        STM     #Addr_h1, pH1
        MVDM    xptr_hf, pH2

        LD      xCounter,A
        ADD 	#-1 ,A
        BCD     EndInnerLoopG3, ALT
        STLM    A, BRC
        LD      #0, A

        RPTBD   EndInnerLoopG3 - 1
        STM     #ldec, AR0

                MAC     *pH1+, *pH2+, A
       		LD	A, ASM, B
       		STL     B, -16, *p4-0

                MAC     *pH1+, *pH2+, A
       		LD	A, ASM, B
       		STL     B, -16, *p3-0

                MAC     *pH1+, *pH2+, A
                LD	A, ASM ,B
                STL     B, -16, *p2-0

                MAC     *pH1+, *pH2+, A
                LD	A, ASM ,B
                STL     B, -16, *p1p0

                MAR     *+p1p0(-i1i3_i0i2)

                MAC     *pH1+, *pH2+, A
                LD	A, ASM ,B
                STL     B, -16, *p1p0-0

                MAR     *+p1p0(i1i3_i0i2)
EndInnerLoopG3:

        MVDM    xDeltaP, AR0

        MAC     *pH1+, *pH2+, A
        LD	A, ASM, B
        STL     B, -16, *p4+0

        MAC     *pH1+, *pH2+, A
        LD	A, ASM, B
        STL     B, -16, *p3+0

        MAR     *+AR0(7)
        LD      xCounter,A
        ADD	#-1 ,A
        MAR     *p2+0
        MAR     *p1p0+0

        ADDM    #-ldec, xDeltaP
        STL     A, xCounter

        BCD     LoopG3, AGEQ
        ADDM    #STEP, xptr_hf

   ; Compute elements of: rri0i4[], rri2i3[], rri1i2[], rri0i1[]

        ST      #NB_POS - 1, xCounter
        ST      #MSIZE - ldec, xDeltaP
        ST      #Addr_h1 + 4, xptr_hf

        STM     #rri0i4 + MSIZE - 1, p4
        STM     #rri2i3 + MSIZE - 2, p3
        STM     #rri1i2 + MSIZE - 2, p2
        STM     #rri0i1 + MSIZE - 2, p1
LoopG4:
        STM     #Addr_h1, pH1
        MVDM    xptr_hf, pH2

        LD      xCounter,A
        ADD 	#-1 ,A
        BCD     EndInnerLoopG4, ALT
        STLM    A, BRC
        LD      #0, A

        RPTBD   EndInnerLoopG4 - 1
        STM     #ldec, AR0

                MAC     *pH1+, *pH2+, A
       		LD	A, ASM, B
       		STL     B, -16, *p4-0

                MAC     *pH1+, *pH2+, A
                MAC     *pH1+, *pH2+, A
       		LD	A, ASM, B
       		STL     B, -16, *p3-0

                MAC     *pH1+, *pH2+, A
       		LD	A, ASM, B
       		STL     B, -16, *p2-0

                MAC     *pH1+, *pH2+, A
       		LD	A, ASM, B
        	STL     B, -16, *p1-0
EndInnerLoopG4:

        MVDM    xDeltaP, AR0

        MAC     *pH1+, *pH2+, A
        LD	A, ASM, B
        STL     B, -16, *p4+0

        MAR     *+AR0(7)
        LD      xCounter,A
        ADD 	#-1 ,A
        MAR     *p3+0
        MAR     *p2+0
        MAR     *p1+0

        ADDM    #-ldec, xDeltaP
        STL     A, xCounter

        BCD     LoopG4, AGEQ
        ADDM    #STEP, xptr_hf

        RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -