📄 iirlat.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 + -