📄 fircircfunc.asm
字号:
;FIRcircfunc.asm ASM function called from C using circular addressing
;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
.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 ;point to bottom of delays buffer
.text ;code section
_fircircfunc: ;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
MVK last_addr,A9 ;A9=last circ addr(lower 16 bits)
MVKH last_addr,A9 ;last circ addr (higher 16 bits)
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 + -