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

📄 abias.asm

📁 CCS3.3自带的TI 5400系列DSP的dsplib文件。文档说明可以在TI公司网站上下载。
💻 ASM
字号:
;***********************************************************
; Version 2.20.01                                           
;***********************************************************
;****************************************************************
;  Function:	acorr_bias
;  Description: calculates positive biased auto-correlation
;
;  Copyright Texas instruments Inc, 1998
;----------------------------------------------------------------
; Revision History:  
; 1.00	- K. Baldwin, 8/31/98. original version
; 2.00	- Li Yuan, 4/09/02. fixed overflow flag setup at the end of code.
;----------------------------------------------------------------

	.mmregs



; Far-mode adjustment

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


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

REG_SAVE_SZ .set 5

PARAM_OFFSET    .set  FRAME_SZ + REG_SAVE_SZ + OFFSET

        .asg    0, temp
	.asg	1, n_inverse
        .asg    0 + FRAME_SZ, SAVE_AR1
        .asg    1 + FRAME_SZ, SAVE_AR6
        .asg    2 + FRAME_SZ, SAVE_AR7
        .asg    0 + FRAME_SZ + REG_SAVE_SZ, RETURN_ADDR
        .asg    0 + PARAM_OFFSET, r
        .asg    1 + PARAM_OFFSET, na
        .asg    2 + PARAM_OFFSET, nr
	.asg	AR2, r_ptr
	.asg	AR3, a_ptr
	.asg	AR4, a2_ptr
        .asg    AR1, count
	.asg	AR5, a_save
        .asg    AR6, loop_count
        .asg    AR7, exec
        .asg    AR0, a2_save


;
;  Function Definition
;----------------------------------------------------------------

 	.global _acorr_bias
_acorr_bias 

;
;  Save contents of AR1                                     
;  Set local FRAME if required                              
;  Make sure sign extension mode is set                     
;  Set FRCT bit.                                            
;----------------------------------------------------------------


        PSHM    AR7                                 ; 1 cycle
        PSHM    AR6                                 ; 1 cycle
        PSHM    AR1                                 ; 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
        STM     #0, exec                            ; 1 cycle
               
;
; Copy arguments to their local locations as necessary        
;----------------------------------------------------------------

        LD      *sp(nr), B                          ; 1 cycle
        STLM    B, loop_count                       ; 1 cycle
        STLM    A, a_save                           ; 1 cycle
        STLM    A, a2_save                          ; 1 cycle

        SUB     #1, B                               ; 1 cycle
        BCD     L1, BEQ                             ; 1 cycle
        LD      *sp(na), A                          ; 1 cycle
        MAR     *loop_count-                        ; 1 cycle

        MVMM    a_save, a_ptr                       ; 1 cycle
        MVMM    a2_save, a2_ptr                     ; 1 cycle

;
; If the number of correlation elements to calculate is      
; exactly equal to na, then we want to calculate the last    
; 2 elements outside of the loop. Since loop assumes minimum 
; of 3 MAC operations                                        
;----------------------------------------------------------------
  
        SUB     *sp(nr), A                          ; 1 cycle
        STL     A, *sp(temp)                        ; 1 cycle
        CMPM    *sp(temp), #1                       ; 2 cycles
        BC      L0, NTC                             ; 5 cycles
        BD      L1                                  ; 2 cycles
        MAR     *exec-                              ; delay slot 1 cycle
        MAR     *loop_count-                        ; delay slot 1 cycle
L0:
        CMPM    *sp(temp), #0                       ; 2 cycles
        BC      L1, NTC                             ; 5 cycles
        MAR     *+loop_count(-2)                    ; 2 cycles
        MAR     *exec+                              ; 1 cycle
        
       
L1:
;
; 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 ; 1 cycle
        STL     A, *sp(n_inverse)                   ; 1 cycle
        SSBX    SXM                                 ; 1 cycle

        MVDM    *(loop_count), BRC                  ; 2 cycles
        MVDK    *sp(na), count                      ; 2 cycles

        MAR     *+count(-3)                         ; 2 cycles

;
; Main correlation loop                                      
;----------------------------------------------------------------


        RPTBD   END_LOOP-1                          ; 2 cycles
        MVDK    *sp(r), r_ptr                       ; 2 cycles   
        

LOOP:   

;
; Preload A with first multiply                              
;----------------------------------------------------------------

  
        MPY     *a_ptr+, *a2_ptr+, A                ; 1 cycle
        RPT     *(count)                            ; 2 cycles
        MAC     *a_ptr+, *a2_ptr+, A                ; na-2
        MAC     *a_ptr , *a2_ptr,  A                ; 1 cycle
        LD      *(AH), T                            ; 2 cycles
        MPYR    *sp(n_inverse), A                   ; 1 cycle


; Increment pointer to a'                                
; Restore pointer to a                                   
;----------------------------------------------------------------


        MAR     *a2_save+                           ; 1 cycle 
        MVMM    a_save, a_ptr                       ; 1 cycle
        MVMM    a2_save, a2_ptr                     ; 1 cycle 

        STH     A, *r_ptr+                          ; 1 cycle

;
;  Decrement MAC counter                                    
;----------------------------------------------------------------
        MAR     *count-                             ; 1 cycle
 

END_LOOP
        LD      *(exec), B                          ; 2 cycles
        BCD     RETURN, BEQ                         ; 3 cycles 

;
; The last two elements are calculated outside the loop     
;----------------------------------------------------------------

        MPY     *a_ptr+, *a2_ptr+, A                ; 1 cycle
        MAC     *a_ptr-, *a2_ptr , A                ; 1 cycle
        LD      *(AH), T                            ; 2 cycles
        MPYR    *sp(n_inverse), A                   ; 1 cycle
        STH     A, *r_ptr+                          ; 1 cycle

        BC       RETURN, BLT                        ; 5 cycles

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

;
; Reset FRCT bit - this restores C operating environment 
; as expected by the TI TMS320C54x C Compiler            
;                                                           
; Return to calling function passing OVA status          
;-------------------------------------------------------------
RETURN:

        FRAME    #FRAME_SZ                          ; 1 cycle

        LD      #0, A                                ; 1 cycle
        XC      1, AOV                              ; 1 cycle
        LD      #1, A                               ; XC slot 1 cycle

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

        .if __far_mode
           FRETD                                     ; 6 cycles
        .else
	   RETD                                      ; 5 cycles
        .endif
        NOP                                          ; 1 cycle
	NOP

;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 + -