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