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

📄 iirlat.asm

📁 CCS3.3自带的TI 5400系列DSP的dsplib文件。文档说明可以在TI公司网站上下载。
💻 ASM
字号:
;***********************************************************
; Version 2.20.01                                           
;***********************************************************
;****************************************************************************
;  Function:	iirlat
;  Description: All-pole lattice filter C-callable implementation
;
;  Copyright Texas instruments Inc, 1998
;----------------------------------------------------------------------------
; Revision History:
;  1.00, A. Aboagye, 8/31/98 - Original release. Started from code written by
;					Pierre Ponce
;
;********************************************************************************

                .mmregs

; resolve stack frame issues

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

; mnemonic declarations

		.asg	*sp(2), SAVE_AR1
		.asg	*sp(3), SAVE_AR6
		.asg	*sp(4+OFFSET), RETURN_ADDR
		.asg	*sp(5+OFFSET), k
		.asg    *sp(6+OFFSET), y
		.asg    *sp(7+OFFSET), f
		.asg    *sp(8+OFFSET), nk
		.asg    *sp(9+OFFSET), nx

		.asg    AR1, in
		.asg    AR2, e_buff_r
		.asg    AR3, h
		.asg    AR4, e_buff_w
		.asg    AR5, out
		.asg    AR6, count

		.global _iirlat

                .text
               
_iirlat:
		PSHM AR1				; store register contents in stack
		PSHM AR6
                PSHM    ST0                                 ; 1 cycle
                PSHM    ST1                                 ; 1 cycle
                RSBX    OVA                                 ; 1 cycle
                RSBX    OVB                                 ; 1 cycle

		SSBX	SXM				; set math and overflow modes
		SSBX	FRCT
		SSBX	OVM
		LD	#0, ASM

		STLM	A, in				; extract arguments from function call
		MVDK	f, e_buff_r
		MVDK	k, h
		MVDK	y, out
		MVDK	nx, count
		MVMM	e_buff_r, e_buff_w
		MVDK	nk, BK

                STM     #-1, AR0			; set circular buffering step size
		MAR     *e_buff_r+0%			; adjust coefficient buffer pointer position
		MAR     *e_buff_w+0%
		MAR     *count-				; start counting samples


; loop through all samples

oLoop:
		LDM	BK, A
		SUB	#2, A
		STLM    A, BRC
                MAR     *h+0%
		MAR     *e_buff_r+0%

		LD      *in+, 16, A			; input --> fN(n) = x(n)
		LD	*e_buff_r, 16, B

		RPTB    endiLoop - 1
		MAS	*h+0%, *e_buff_r+0%, A		; fI(n) = fI+1(n) - KI+1 * bI(n-1)
							; fI(n)==>A, KI+1==>T
		MACA    T, B				; bI+1(n) = bI(n-1) + KI+1 * fI(n)
		ST      B, *e_buff_w+0%			; bI+1(n)==>B
		|| LD   *e_buff_r, B

endiLoop:	BANZD	oLoop, *count-			; store first forward error as output & make
							; first backward be equal to first forward error
		STH	A, *out+			; output --> y(n) = f0(n)
		STH	A, *e_buff_w+0%			; b0(n) = f0(n)           

_end:
		XOR	A, 0				; check for overflow
		XC	1, AOV
		LD	#1, A

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

		.if __far_mode
		FRETD
		.else
		RETD
		.endif
		NOP
		NOP


⌨️ 快捷键说明

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