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

📄 araw.asm

📁 CCS3.3自带的TI 5400系列DSP的dsplib文件。文档说明可以在TI公司网站上下载。
💻 ASM
字号:
;***********************************************************
; Version 2.20.01                                           
;***********************************************************
;****************************************************************
;  Function:	acorr_raw
;  Description: calculate the positive raw 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
	.global _acorr_raw
_acorr_raw

; Far-mode adjustment
;----------------------------------------------------------------

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

;----------------------------------------------------------------
;
; Data declarations:                                                                                          
;    r_ptr	- pointer to output vector                    
;    a_ptr	- pointer to vector a                         
;    a2_ptr	- pointer to vector a'                        
;    a_save	- saves start address for vector a            
;    a2_save    - saves start address for vector a'          
;    count     - MAC count                                   
;                                                            
;----------------------------------------------------------------

         .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    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
  

;  Save contents of AR1, AR6, AR7                           
;  Set local FRAME if required                              
;  Make sure sign extension mode and frct bit are set       
;  Clear overflow flag                                      
;----------------------------------------------------------------
        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


        SSBX    SXM                                 ; 1 cycle
        SSBX    FRCT                                ; 1 cycle
        STM     #0, exec                            ; 2 cycles
               
;
; 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                               ; 2 cycles
        BCD     L1, BEQ                             ; 3 cycles
        LD      *sp(na), A                          ; 1 cycle
        MAR     *loop_count-                        ; 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-                              ; 1 cycle
        MAR     *loop_count-                        ; 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:
        MVMM    a_save, a_ptr                       ; 1 cycle
        MVMM    a2_save, a2_ptr                     ; 1 cycle

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

        MAR     *+count(-3)                         ; 2 cycles
;
; Perform correlation:                                       
;----------------------------------------------------------------

        RPTBD   END_LOOP-1                          ; 2 cycles
        MVDK    *sp(r), r_ptr                       ; delay slot 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
        MACR    *a_ptr , *a2_ptr,  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 

;
;  Store result to output 
;----------------------------------------------------------------

        STH     A, *r_ptr+                          ; 1 cycle

;
;  Decrement MAC counter                                    
;----------------------------------------------------------------

        MAR     *count-                             ; 1 cycle
 

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

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

        MPY     *a_ptr+, *a2_ptr+, A                ; 1 cycle
        MACR    *a_ptr-, *a2_ptr , A                ; 1 cycle
        STH     A, *r_ptr+                          ; 1 cycle

        BC       RETURN, BLT                        ; 5 cycles

        LD       #0, A                              ; 1 cycle
        MACR     *a_ptr, *a2_ptr, A                 ; 1 cycle
        STH     A, *r_ptr+                          ; 1 cycle

;
;  Reset FRCT bit - this restores C opersting 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                                    ; 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 + -