📄 firs2.asm
字号:
;***********************************************************
; Version 2.20.01
;***********************************************************
;****************************************************************
; Function: firs2.asm
; Description: implements symmetric finite impulse response filter
;
; Copyright Texas instruments Inc, 1998
;----------------------------------------------------------------
; Revision History:
; 1.00, K. Baldwin. 8/31/98. Original release.
;****************************************************************
; Far-mode adjustment
.if __far_mode
OFFSET .set 2
FRAME_SZ .set 2
.else
OFFSET .set 1
FRAME_SZ .set 1
.endif
REG_SAVE_SZ .set 4
PARAM_OFFSET .set OFFSET + FRAME_SZ + REG_SAVE_SZ
.mmregs
.asg 0, ncoeffs
.asg 0 + FRAME_SZ, SAVE_AR6
.asg 1 + FRAME_SZ, SAVE_AR1
.asg 0 + FRAME_SZ + REG_SAVE_SZ, RETURN_ADDR
.asg 0 + PARAM_OFFSET, h
.asg 1 + PARAM_OFFSET, r
.asg 2 + PARAM_OFFSET, db
.asg 3 + PARAM_OFFSET, nh
.asg 4 + PARAM_OFFSET, nx
.asg AR2, r_ptr
.asg AR3, db1_ptr
.asg AR4, db2_ptr
.asg AR5, h_ptr
.asg AR6, x_ptr
.asg AR1, nloops
.text
.global _firs2
_firs2
;
; Save contents of AR1 and AR6
; Reserve stack space for local variables
; Set sign extension mode
; Set FRCT bit
;----------------------------------------------------------------
PSHM AR1 ; 1 cycle
PSHM AR6 ; 1 cycle
PSHM ST0 ; 1 cycle
PSHM ST1 ; 1 cycle
RSBX OVA ; 1 cycle
RSBX OVB ; 1 cycle
.if FRAME_SZ
FRAME #-FRAME_SZ ; 1 cycle
.endif
SSBX SXM ; 1 cycle
SSBX FRCT ; 1 cycle
STM #2, AR0 ; 2 cycles
;
; Store pointer to input sample buffer locally
;----------------------------------------------------------------
STLM A, x_ptr ; 1 cycle
;
; Set repeat count to NSAMPS-1, store in block repeat count
; register
;----------------------------------------------------------------
MVDK *sp(nx), nloops ; 2 cycles
;
; Save pointer to coefficients H[k]
;----------------------------------------------------------------
MVDK *sp(h), h_ptr ; 2 cycles
MVDK *sp(db), db1_ptr ; 2 cycles
MAR *nloops- ; 1 cycle
;
; Set BK register to length of data buffer
;----------------------------------------------------------------
LD *sp(nh), A ; 1 cycle
STLM A,BK ; 1 cycle
;
; Save pointer to delay buffer and set pointers to oldest
; and newest elements in buffer
;----------------------------------------------------------------
LD *db1_ptr, B ; 1 cycle
STLM B, db1_ptr ; 2 cycles
;
; Set repeat count for Filter to Buffer length minus 1
;----------------------------------------------------------------
LD A, 1, B ; 1 cycle
SUB #2, A ; 2 cycles
STL A, *sp(ncoeffs) ; 1 cycle
STLM B, BK ; 1 cycle
;
; Set address of delay buffer 1 to point to oldest element
; in the buffer, X[(-N/2)]
;----------------------------------------------------------------
MVMM db1_ptr, db2_ptr ; 1 cycle
;
; Set pointer to output buffer
; Adjust pointer to delay buffer
;----------------------------------------------------------------
MVDK *sp(r), r_ptr ; 2 cycles
MAR *db2_ptr+ ; 1 cycle
;
; Main loop for each data sample - apply filter
;----------------------------------------------------------------
OUTER_LOOP:
;
; Get next input sample from input data buffer
;----------------------------------------------------------------
LD *x_ptr+, A ; 1 cycle
;
; Write sample -N/2 to oldest sample -N X[-N/2] , X[-N]
;----------------------------------------------------------------
MVDD *db1_ptr, *db2_ptr+0% ; 2 cycles
MVDK *sp(ncoeffs), BRC ; 2 cycles
MVDK *sp(h), h_ptr ; 2 cycles
;
; Add first sum before entering the loop. Last MAC is
; performed outside of loop, reducing loop count by 1
;----------------------------------------------------------------
STL A, *db1_ptr ; 1 cycle
RPTBD end_inner_loop-1 ; 2 cycles
LD #0, B ; 1 cycle
ADD *db1_ptr+0%, *db2_ptr+0%, A ; 1 cycle
; LOOP START
MACA *h_ptr+, B ; 1 cycle
ADD *db1_ptr+0%, *db2_ptr+0%, A ; 1 cycle
end_inner_loop
MACAR *h_ptr+, B ; 1 cycle
;
; Adjust pointers to next element and store output
;----------------------------------------------------------------
BANZD OUTER_LOOP, *nloops- ; 2 cycles
MAR *db1_ptr-0% ; 1 cycle
STH B, *r_ptr+ ; 1 cycle
end_loop:
;
; Return current pointer into delay buffer
; Return overflow status
;----------------------------------------------------------------
RETURN:
LDM db1_ptr, B ; 1 cycle
MVDK *sp(db), db2_ptr ; 2 cycles
LD #0, A ; 1 cycle
XC 1, BOV ; 2 cycles if true
LD #1, A ; 1 cycle
.if FRAME_SZ
FRAME #FRAME_SZ ; 1 cycle
.endif
POPM ST1 ; 1 cycle
POPM ST0 ; 1 cycle
POPM AR6 ; 1 cycle
POPM AR1 ; 1 cycle
.if __far_mode
FRETD ; 4 cycles
.else
RETD ; 3 cycles
.endif
STL B, *db2_ptr ; delay slot 1 cycle
NOP ; delay slot 1 cycle
;end of file. please do not remove. it is left here to ensure that no lines of code are removed by any editor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -