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

📄 firs2.asm

📁 CCS3.3自带的TI 5400系列DSP的dsplib文件。文档说明可以在TI公司网站上下载。
💻 ASM
字号:
;***********************************************************
; Version 2.20.01                                           
;***********************************************************
;****************************************************************
;  Function:	firs2.asm
;  Description: implements symmetric finite impulse response filter
;
;  Copyright Texas instruments Inc, 1998
;----------------------------------------------------------------
;  Revision History:
;  1.00, K. Baldwin. 8/31/98. Original release.
;****************************************************************

; Far-mode adjustment  
  
         .if __far_mode
OFFSET   .set  2
FRAME_SZ	.set   2
         .else
OFFSET   .set  1
FRAME_SZ	.set   1
         .endif

REG_SAVE_SZ	.set   4

PARAM_OFFSET	.set   OFFSET + FRAME_SZ + REG_SAVE_SZ

	.mmregs
  

        .asg    0, ncoeffs       
        .asg    0 + FRAME_SZ, SAVE_AR6
        .asg    1 + FRAME_SZ, SAVE_AR1
 
        .asg    0 + FRAME_SZ + REG_SAVE_SZ, RETURN_ADDR
        .asg    0 + PARAM_OFFSET, h
        .asg    1 + PARAM_OFFSET, r
        .asg    2 + PARAM_OFFSET, db
        .asg    3 + PARAM_OFFSET, nh
        .asg    4 + PARAM_OFFSET, nx

	.asg	AR2, r_ptr
	.asg	AR3, db1_ptr
	.asg	AR4, db2_ptr
        .asg    AR5, h_ptr
        .asg    AR6, x_ptr
        .asg    AR1, nloops

	.text
 	.global _firs2
_firs2

;
; Save contents of AR1 and AR6                            
; Reserve stack space for local variables                 
; Set sign extension mode                                 
; Set FRCT bit                                            
;----------------------------------------------------------------

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

	.if FRAME_SZ
        FRAME   #-FRAME_SZ                              ; 1 cycle
        .endif


        SSBX    SXM                                     ; 1 cycle
        SSBX    FRCT                                    ; 1 cycle
        STM     #2, AR0                                 ; 2 cycles

;
; Store pointer to input sample buffer locally                
;----------------------------------------------------------------
	
        STLM    A, x_ptr                                ; 1 cycle

;
; Set repeat count to NSAMPS-1, store in block repeat count  
; register                                                     
;----------------------------------------------------------------

        MVDK    *sp(nx), nloops                         ; 2 cycles

;
; Save pointer to coefficients H[k]                           
;----------------------------------------------------------------

        MVDK    *sp(h), h_ptr                           ; 2 cycles
        MVDK    *sp(db), db1_ptr                        ; 2 cycles
        MAR     *nloops-                                ; 1 cycle

        
;
; Set BK register to length of data buffer                    
;----------------------------------------------------------------

	LD      *sp(nh), A                              ; 1 cycle 
	STLM	A,BK                                    ; 1 cycle 

;
; Save pointer to delay buffer and set pointers to oldest     
; and newest elements in buffer                               
;----------------------------------------------------------------

        LD     *db1_ptr, B                              ; 1 cycle
        STLM   B, db1_ptr                               ; 2 cycles

;
;  Set repeat count for Filter to Buffer length minus 1     
;----------------------------------------------------------------

        LD      A, 1, B                                ; 1 cycle
	SUB	#2, A				       ; 2 cycles
	STL	A, *sp(ncoeffs)			       ; 1 cycle
        STLM    B, BK                                  ; 1 cycle

;
; Set address of delay buffer 1 to point to oldest element  
; in the buffer, X[(-N/2)]                                  
;----------------------------------------------------------------

        MVMM    db1_ptr, db2_ptr                        ; 1 cycle
  
;
; Set pointer to output buffer                           
; Adjust pointer to delay buffer                         
;----------------------------------------------------------------

	MVDK	*sp(r), r_ptr                          ; 2 cycles
        MAR     *db2_ptr+                              ; 1 cycle
    
;
; Main loop for each data sample - apply filter              
;----------------------------------------------------------------            

OUTER_LOOP:

;
; Get next input sample from input data buffer              
;----------------------------------------------------------------

        LD      *x_ptr+,  A                     ; 1 cycle

;
; Write sample -N/2 to oldest sample -N  X[-N/2] , X[-N]    
;----------------------------------------------------------------

	MVDD	*db1_ptr, *db2_ptr+0%	        ; 2 cycles
        MVDK    *sp(ncoeffs), BRC                ; 2 cycles
        MVDK    *sp(h), h_ptr                    ; 2 cycles
 
;
; Add first sum before entering the loop. Last MAC is     
; performed outside of loop, reducing loop count by 1    
;----------------------------------------------------------------

        STL     A, *db1_ptr                     ; 1 cycle

	RPTBD   end_inner_loop-1		; 2 cycles
        LD      #0, B                           ; 1 cycle
        ADD     *db1_ptr+0%, *db2_ptr+0%, A	; 1 cycle

; LOOP START

        MACA    *h_ptr+, B                      ; 1 cycle
        ADD     *db1_ptr+0%, *db2_ptr+0%, A	; 1 cycle

end_inner_loop 
       
        MACAR   *h_ptr+, B                      ; 1 cycle

;
; Adjust pointers to next element and store output          
;----------------------------------------------------------------

        BANZD   OUTER_LOOP, *nloops-            ; 2 cycles
	MAR	*db1_ptr-0%			; 1 cycle                     
        STH     B, *r_ptr+                      ; 1 cycle
end_loop:    
          

;
;  Return current pointer into delay buffer                
;  Return overflow status                                 
;----------------------------------------------------------------

RETURN:
        LDM     db1_ptr, B                      ; 1 cycle
        MVDK    *sp(db), db2_ptr                ; 2 cycles

        LD      #0, A                           ; 1 cycle
        XC      1, BOV                          ; 2 cycles if true
        LD      #1, A                           ; 1 cycle


        .if FRAME_SZ
        FRAME   #FRAME_SZ                       ; 1 cycle
        .endif        

        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

        STL     B, *db2_ptr                     ; 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 + -