📄 fircircfunc_ext.asm
字号:
;FIRcircfunc_ext.asm Function using circular buffer in external memory
;A4=newest sample, B4=coefficient address, A6=filter order
;Delay samples organized: x[n-(N-1)]...x[n]; coeff as h(0)...h[N-1]
.def _fircircfunc_ext
.def last_addr
.def delays
.sect "circdata" ;circular data section
.align 256 ;align delay buffer 256-byte boundary
delays .space 256 ;init 256-byte buffer with 0's
last_addr .int last_addr-1
.text ;code section
_fircircfunc_ext: ;FIR function using circ addr
MV A6,A1 ;setup loop count
MPY A6,2,A6 ;since dly buffer data as byte
ZERO A8 ;init A8 for accumulation
ADD A6,B4,B4 ;since coeff buffer data as bytes
SUB B4,1,B4 ;B4=bottom coeff array h[N-1]
MVKL 0x00070040,B6 ;select A7 as pointer and BK0
MVKH 0x00070040,B6 ;BK0 for 256 bytes (128 shorts)
MVC B6,AMR ;set address mode register AMR
MVKL last_addr,A9 ;A9=bottom circ addr in external mem
MVKH last_addr,A9 ;(higher 16 bits)in external circ
LDW *A9,A7 ;A7=last circ addr
NOP 4
STH A4,*A7++ ;newest sample-->last address
loop: ;begin FIR loop
LDH *A7++,A2 ;A2=x[n-(N-1)+i] i=0,1,...,N-1
|| LDH *B4--,B2 ;B2=h[N-1-i] i=0,1,...,N-1
SUB A1,1,A1 ;decrement count
[A1] B loop ;branch to loop if count # 0
NOP 2
MPY A2,B2,A6 ;A6=x[n-(N-1)+i]*h[N-1+i]
NOP
ADD A6,A8,A8 ;accumulate in A8
STW A7,*A9 ;store last circ addr to last_addr
B B3 ;return addr to calling routine
MV A8,A4 ;result returned in A4
NOP 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -