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

📄 cbias.asm

📁 CCS3.3自带的TI 5400系列DSP的dsplib文件。文档说明可以在TI公司网站上下载。
💻 ASM
字号:
;***********************************************************
; Version 2.20.01                                           
;***********************************************************
;****************************************************************
;  Filename:	cbias.asm
;  Description: calculates biased full length correlation 
;
;  Copyright Texas instruments Inc, 1998
;----------------------------------------------------------------
;  Revision History:
;  1.00 K. Baldwin, Original Beta Release 8/31/98
;****************************************************************


; Far-mode adjustment

         .if __far_mode
OFFSET   .set  2
         .else
OFFSET   .set  1
         .endif

	.mmregs
	.global _corr_bias
_corr_bias
;


                .if __far_mode
FRAME_SZ        .set   2
                .else
FRAME_SZ	.set   3
                .endif

REG_SAVE_SZ	.set   4
PARAM_OFFSET    .set   REG_SAVE_SZ + FRAME_SZ + OFFSET

        .asg    0, region1_and_3_loop_cnt
        .asg    1, n_inverse
        .asg    0 + FRAME_SZ, SAVE_AR6
        .asg    1 + FRAME_SZ, SAVE_AR6
        .asg    0 + REG_SAVE_SZ + FRAME_SZ, RETURN_ADDR
        .asg    0 + PARAM_OFFSET, bp
        .asg    1 + PARAM_OFFSET, r
        .asg    2 + PARAM_OFFSET, na
        .asg    3 + PARAM_OFFSET, nb
        .asg    4 + PARAM_OFFSET, nr

	.asg	AR2, r_ptr
	.asg	AR3, a_ptr
	.asg	AR4, b_ptr
        .asg    AR1, a_save
        .asg    AR1, a3_save
        .asg    AR6, a2_save
	.asg	AR5, b_save
        .asg    AR0, mac_cnt

;
; Save contents of AR1 & AR6                                  
; Reserve space on frame for local variables                  
;----------------------------------------------------------------

        PSHM    AR1                                     ; 1 cycle
        PSHM    AR6                                     ; 1 cycle

        PSHM    ST0                                 ; 1 cycle
        PSHM    ST1                                 ; 1 cycle
        RSBX    OVA                                 ; 1 cycle
        RSBX    OVB                                 ; 1 cycle

        FRAME   #-FRAME_SZ                              ; 1 cycle
 
        RSBX    SXM                                     ; 1 cycle
        SSBX    FRCT                                    ; 1 cycle
        

        MVDK    *sp(r), r_ptr                           ; 2 cycles      
           
;
; Set pointer to A to point to last element                   
;----------------------------------------------------------------
    
        STLM    A, a2_save                               ; 1 cycle
        ADD     *sp(na), A                               ; 1 cycle
        STLM    A, a_save                                ; 1 cycle
 
;
; Calculate inverse of number of MACs  = na                 
; We load Q15 equivalent of 1 into accumulator and use SUBC 
; Thus calculating Q15 equivalent of 1/N                    
;----------------------------------------------------------------

        LD      #32767, A                           ; 2 cycles
        RPT     #15                                 ; 1 cycle
        SUBC    *sp(na), A                          ; 16 cycles

        ADD     #1, A                ; round result ; 2 cycles
        STL     A, *sp(n_inverse)                   ; 1 cycle
        SSBX    SXM                                 ; 1 cycle
 
;
; Set pointers vector , b,                                    
;----------------------------------------------------------------

        LD      *sp(bp), A                          ; 1 cycle
        STLM    A, b_save                           ; 1 cycle

;
; Initialize MAC cnt for regions 1 & 3                                        
;----------------------------------------------------------------

        LD      *sp(na), B                             ; 1 cycle
        SUB     #4, B                                  ; 2 cycles
        STL     B, *sp(region1_and_3_loop_cnt)         ; 1 cycle
        
        MAR     *a_save-                               ; 1 cycle
 
;        
; Initial lag is in region 1, load initial MAC count and      
; number of elements to calculate in region 1                 
;----------------------------------------------------------------


REGION1:
        MVMM     b_save, b_ptr                          ; 1 cycle
        MVMM     a_save, a_ptr                          ; 1 cycle

        LD       *sp(region1_and_3_loop_cnt), A         ; 1 cycle
        STLM     A, BRC                                 ; 1 cycle
        STM      #0, mac_cnt                            ; 2 cycles 

       ;
       ; Calculate first two elements outside of the loop     
       ;--------------------------------------------------

        LD       #0, A                                  ; 1 cycle
        MAC      *a_ptr, *b_ptr+, A                     ; 1 cycle
        LD       *(AH), T                               ; 2 cycles
        MPYR     *sp(n_inverse), A                      ; 1 cycle
       
        STH      A, *r_ptr+                             ; 1 cycle

        MPY      *a_ptr-, *b_ptr-, A                    ; 1 cycle
        MAC      *a_ptr , *b_ptr , A                    ; 1 cycle
        LD       *(AH), T                               ; 2 cycles
        MPYR     *sp(n_inverse), A                      ; 1 cycle
       
        MAR      *+b_save(2)                            ; 2 cycles
        MVMM     a_save, a_ptr                          ; 1 cycle
        MVMM     b_save, b_ptr                          ; 1 cycle
             
REGION1_LOOP:
        RPTBD   END_REGION1_LOOP-1                      ; 2 cycles
        STH      A, *r_ptr+                             ; 1 cycle
        MPY     *a_ptr-, *b_ptr-, A                     ; 1 cycle        
;LOOP START
        
        RPT     *(mac_cnt)                              ; 1 cycle
        MAC     *a_ptr-, *b_ptr-, A                     ; sum(mac_cnt-1 + mac_cnt-2, ..)
        MAC     *a_ptr-, *b_ptr-, A                     ; 1 cycle
        LD      *(AH), T                                ; 2 cycles
        MPYR    *sp(n_inverse), A                       ; 1 cycle
    

        MAR     *b_save+                                ; 1 cycle
        MVMM    a_save, a_ptr                           ; 1 cycle
        MVMM    b_save, b_ptr                           ; 1 cycle
    

        MAR     *mac_cnt+                               ; 1 cycle
        STH     A, *r_ptr+                              ; 1 cycle
        MPY     *a_ptr-, *b_ptr-, A                     ; 1 cycle     
END_REGION1_LOOP

        MVDK    *sp(bp), b_save                         ; 2 cycles
        MVMM    a2_save, a_save                         ; 1 cycle

;
; Begin Loop for Region 2:                                      
;         b[0] , b[1], b[2], .... b[nb-na]                      
;----------------------------------------------------------------

REGION2:
        LD      *sp(na), B                              ; 1 cycle
        LD      *sp(nb), A                              ; 1 cycle                                            
        SUB     B, A                                    ; 1 cycle
  
        STLM    A, BRC                                  ; 1 cycle
        STLM    B, mac_cnt                              ; 1 cycle
    
        MVMM    a_save, a_ptr                           ; 1 cycle
        MVMM    b_save, b_ptr                           ; 1 cycle
   
REGION2_LOOP:
        RPTBD   END_REGION2_LOOP-1                      ; 2 cycles
        MAR     *+mac_cnt(-3)                           ; 2 cycles
 
;LOOP START

        MAR     *b_save+                                ; 1 cycle
        MPY     *a_ptr+, *b_ptr+, A                     ; 1 cycle
        RPT     *(mac_cnt)                              ; 1 cycle
        MAC     *a_ptr+, *b_ptr+, A                     ; mac_cnt
        MAC     *a_ptr+, *b_ptr+, A                     ; 1 cycle
        LD      *(AH), T                                ; 2 cycles
        MPYR    *sp(n_inverse), A                       ; 1 cycle

        MVMM    a_save, a_ptr                           ; 1 cycle
        MVMM    b_save, b_ptr                           ; 1 cycle

        STH     A, *r_ptr+                              ; 1 cycle
    
END_REGION2_LOOP  

  
;
; Begin REGION3 loop:                                           
;         x[nb-na+1], x[nb-na+2], .. x[nb-1]                    
;----------------------------------------------------------------

REGION3:
        LD      *sp(region1_and_3_loop_cnt), A          ; 1 cycle
        STLM    A, BRC                                  ; 1 cycle
        MVMM    a_save, a_ptr                           ; 1 cycle 
        MVMM    b_save, b_ptr                           ; 1 cycle

REGION3_LOOP:
        RPTBD   END_REGION3_LOOP-1                      ; 2 cycles
        MAR     *mac_cnt-                               ; delay slot 1 cycle        
        NOP                                             ; delay slot 1 cycle
   
;LOOP START

        MPY     *a_ptr+, *b_ptr+, A                     ; 1 cycle
        RPT     *(mac_cnt)                              ; 1 cycle
        MAC     *a_ptr+, *b_ptr+, A                     ; sum(mac_cnt-1 + mac_cnt-2,..)
        MAC     *a_ptr+, *b_ptr+, A                     ; 1 cycle
        LD      *(AH), T                                ; 2 cycles
        MPYR    *sp(n_inverse), A                       ; 1 cycle
 
        MAR     *b_save+                                ; 1 cycle
        MVMM    a_save, a_ptr                           ; 1 cycle
        MVMM    b_save, b_ptr                           ; 1 cycle

 
        STH     A, *r_ptr+                              ; 1 cycle   
        MAR     *mac_cnt-                               ; 1 cycle
   
END_REGION3_LOOP
       
;
; Calculate last two correlation elements outside of loop       
;----------------------------------------------------------------

        MPY     *a_ptr+, *b_ptr+, A                     ; 1 cycle
        MACR     *a_ptr-, *b_ptr, A                     ; 1 cycle
        LD      *(AH), T                                ; 2 cycles
        MPYR    *sp(n_inverse), A                       ; 1 cycle

        STH      A, *r_ptr+                             ; 1 cycle

        LD       #0, A                                  ; 1 cycle
        MAC     *a_ptr, *b_ptr, A                       ; 1 cycle
        LD      *(AH), T                                ; 2 cycles
        MPYR    *sp(n_inverse), A                       ; 1 cycle
        STH      A, *r_ptr+                             ; 1 cycle

;
; Return to calling function, restoring C environment first 
; If necessary                                              
;----------------------------------------------------------------

RETURN:
;
; Return value of OVA flag in accum A                        
;----------------------------------------------------------------
  
        LD      #0, A                               ; 1 cycle
        XC      1, AOV                              ; 1 cycle
        LD      #1, A                               ; 1 cycle

        FRAME   #FRAME_SZ                           ; 1 cycle

        POPM    ST1                                 ; 1 cycle
        POPM    ST0                                 ; 1 cycle
        POPM    AR6                                 ; 1 cycle
        POPM    AR1                                 ; 1 cycle

        .if __far_mode
            FRETD                                   ; 4 cycles
        .else
	    RETD                                    ; 3 cycles
        .endif
        NOP                                         ; delay slot 1 cycle
	NOP                                         ; delay slot 1 cycle

;end of file. please do not remove. it is left here to ensure that no lines of code are removed by any editor

⌨️ 快捷键说明

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