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

📄 fir.asm

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

	.mmregs

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

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


FRAME_SZ       .set 1

REG_SAVE_SZ    .set 2

PARAM_OFFSET   .set FRAME_SZ + REG_SAVE_SZ + OFFSET 

; Register usage
; --------------
    
        .asg    0 + FRAME_SZ, SAVE_AR1
        .asg    0 + REG_SAVE_SZ + FRAME_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	0, nc
	
	
	.asg	AR2, r_ptr
	.asg	AR3, h_ptr
	.asg	AR4, x_ptr
	.asg	AR5, db_ptr
	.asg	BRC, rptb_cnt

;**************************************************************************
	.global _fir
_fir

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

;
; Save contents of AR1                                    
; And establish local frame                               
; Set sign extension mode                                 
; Set FRCT bit:                                           
;----------------------------------------------------------------


	FRAME	#-(FRAME_SZ)			; 1 cycle

        SSBX	SXM                             ; 1 cycle
        SSBX    FRCT                            ; 1 cycle

;
; Copy arguments to their local locations as necessary        
;----------------------------------------------------------------

        STLM    A, x_ptr                            ; 1 cycle

    

        MVDK   *sp(h), h_ptr                        ; 2 cycles
	MVDK   *sp(r), r_ptr                        ; 2 cycles
	MVDK   *sp(db), db_ptr                      ; 2 cycles
  
	
;
; Set outer loop count by subtracting 1 from nsamps and      
; storing into block repeat count register                   
;----------------------------------------------------------------

        LD     *sp(nx), A                        ; 1 cycle
        SUB     #1, A                            ; 2 cycles
        STLM    A, rptb_cnt                      ; 1 cycle

;
; Set pointer to delay buffer                                 
;----------------------------------------------------------------

        LD      *db_ptr, A                       ; 1 cycle
        STLM    A, db_ptr                        ; 1 cycle

;
; Store length of coefficient vector/ delay buffer in BK     
; register                                                   
;----------------------------------------------------------------

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

	SUB	#3, A				; 2 cycles
	STL	A, *sp(nc)			; 1 cycle

;
; Begin outer loop on # samples                               
;----------------------------------------------------------------
_start:
     RPTBD END_LOOP - 1 			    ; 2 cycles

;
; Store 0 to AR0, to use as circular addressing offset       
;----------------------------------------------------------------

	STM	#1, AR0                 ; delay slot; 2 cycles
                                
;
; Zero the accumulator before calculating next sum.          
; Move next input sample into delay buffer                   
;----------------------------------------------------------------

       MVDD    *x_ptr+, *db_ptr 			 ; 1 cycles
;
; Sum h * x for next y value                                 
;----------------------------------------------------------------
	MPY	 *h_ptr+0%, *db_ptr+0%, A		  ; 1 cycle
	RPT	 *sp(nc)				  ; 2 cycle
	MAC	 *h_ptr+0% , *db_ptr+0%, A		  ; 1 cycle * ncoeffs-2
	MACR	 *h_ptr+0% , *db_ptr, A 		  ; 1 cycle

;
; Store result                                                    
;----------------------------------------------------------------

	STH	 A, *r_ptr+				 ; 1 cycle
END_LOOP:
_end:
;
; Reset FRCT bit to restore normal C operating environment 
; Return overflow condition, OVA, in accumulator A         
; Restore stack to previous value, FRAME, etc..            
;----------------------------------------------------------------

RETURN:
      
        LDM      db_ptr, B                                ; 1 cycle
        MVDK     *sp(db), db_ptr                          ; 2 cycles
         
       
        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

        .if __far_mode
           FRETD                                          ; 4 cycles
        .else
	   RETD                                           ; 3.0 cycles
        .endif
        NOP                                               ; delay slot 1 cycle
	STL	B, *db_ptr				  ; delay slot 1 cycle

;END

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