📄 fir.asm
字号:
;一个FIR滤波器源程序 fir.asm
.mmregs ;定义存储器映射寄存器的符号名,
;这样就可以用AR0、PMST等助记符替换实际的存储器地址。
.global start ;定义符号名
.def start,_c_int00
INDEX .set 1 ;定义符号常量
KS .set 256 ;模拟输入数据缓冲区大小
N .set 17
COFF_FIR .sect "COFF_FIR" ;FIR滤波器系数
;
;.word 0
;.word 158
;.word 264
;.word -290
;.word -1406
;.word -951
;.word 3187
;.word 9287
;.word 12272
;.word 9287
;.word 3187
;.word -951
;.word -1406
;.word -290
;.word 260
;.word 158
;.word 0
;
;;;;;;;;;;;
.word 0
.word 1
.word 2
.word 3
.word 4
.word 5
.word 6
.word 7
.word 8
.word 9
.word 10
.word 11
.word 12
.word 13
.word 14
.word 15
.word 16
;;;;;;;;;;
.data ;紧跟其后的是已初始化数据,.int或.word
INPUT .copy "firin.inc" ;模拟输入在数据存储区0x2400。将指定数据复制到当前位置。
OUTPUT .space 1024 ;输出数据在数据区0x2500。以位为单位,空出n位存储空间。
;FIR_DP .usect "FIR_VARS",0
;D_FIN .usect "FIR_VARS",1
;D_FOUT .usect "FIR_VARS",1
COFFTAB .usect "FIR_COFF",N ;为未初始化变量保留存储空间的自定义段。
DATABUF .usect "FIR_BFR",N
BOS .usect "STACK",0Fh
TOS .usect "STACK",1
.text ;源程序正文。
.asg AR0,INDEX_P ;定义替代符号。
.asg AR4,DATA_P ;输入数据x(n)循环缓冲区指针
.asg AR5,COFF_P ;FIR系数表指针
.asg AR6,INBUF_P ;模拟输入数据指针
.asg AR7,OUTBUF_P;FIR滤波器输出数据指针
_c_int00
b start
nop
nop
start: rsbx FRCT
;ssbx FRCT ;小数乘法编程时,设置小数方式位。
STM #COFFTAB,COFF_P
RPT #N-1 ;将FIR系数从程序存储器移动
MVPD #COFF_FIR,*COFF_P+ ;到数据存储器
STM #INDEX,INDEX_P
STM #DATABUF,DATA_P
RPTZ A,#N-1
STL A,*DATA_P+ ;将数据循环缓冲区清零
STM #(DATABUF+N-1),DATA_P ;数据缓冲区指针指向x[n-(N-1)]
STM #COFFTAB,COFF_P ;系数表指针指向h(0)
FIR_TASK:
STM #INPUT,INBUF_P ;模拟输入数据指针指向第一个值。
STM #OUTPUT,OUTBUF_P ;FIR滤波器输出数据指针指向第一个输出。
STM #KS-1,BRC ;定义块循环次数。
RPTBD LOOP-1 ;延时块循环命令,紧跟其后的一个两字节指令或两个单字节指令在块循环之前先执行。
STM #N,BK ;FIR循环缓冲区大小。BK:循环缓冲区大小,MMR。
LD *INBUF_P+,A ;装载输入数据
FIR_FILTER:
STL A,*DATA_P+% ;寻址结束后,ARx中的地址按循环加的方法加1。
RPTZ A,N-1
MAC *DATA_P+0%,*COFF_P+0%,A ;寻址结束后,按循环加的方法吧AR0的值加到ARx中。
;STH A,*OUTBUF_P+
STL A,*OUTBUF_P+
LOOP:
EEND B EEND
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -