满意答案
hbylicf3
2014.09.05
采纳率:42% 等级:8
已帮助:309人
.mmregs
; Far-mode adjustment
; -------------------
.if __far_mode
OFFSET .set 2
.else
OFFSET .set 1
.endif
FRAME_SZ .set 1
REG_SAVE_SZ .set 2
PARAM_OFFSET .set FRAME_SZ + REG_SAVE_SZ + OFFSET
; Register usage
; --------------
.asg 0 + FRAME_SZ, SAVE_AR1
.asg 0 + REG_SAVE_SZ + FRAME_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 0, nc
.asg AR2, r_ptr
.asg AR3, h_ptr
.asg AR4, x_ptr
.asg AR5, db_ptr
.asg BRC, rptb_cnt
;**************************************************************************
.global _fir
_fir
PSHM ST0 ; 1 cycle
PSHM ST1 ; 1 cycle
RSBX OVA ; 1 cycle
RSBX OVB ; 1 cycle
;
; Save contents of AR1
; And establish local frame
; Set sign extension mode
; Set FRCT bit:
;----------------------------------------------------------------
FRAME #-(FRAME_SZ) ; 1 cycle
SSBX SXM ; 1 cycle
SSBX FRCT ; 1 cycle
;
; Copy arguments to their local locations as necessary
;----------------------------------------------------------------
STLM A, x_ptr ; 1 cycle
MVDK *sp(h), h_ptr ; 2 cycles
MVDK *sp(r), r_ptr ; 2 cycles
MVDK *sp(db), db_ptr ; 2 cycles
;
; Set outer loop count by subtracting 1 from nsamps and
; storing into block repeat count register
;----------------------------------------------------------------
LD *sp(nx), A ; 1 cycle
SUB #1, A ; 2 cycles
STLM A, rptb_cnt ; 1 cycle
;
; Set pointer to delay buffer
;----------------------------------------------------------------
LD *db_ptr, A ; 1 cycle
STLM A, db_ptr ; 1 cycle
;
; Store length of coefficient vector/ delay buffer in BK
; register
;----------------------------------------------------------------
LD *sp(nh), A ; 1 cycle
STLM A, BK ; 1 cycle
SUB #3, A ; 2 cycles
STL A, *sp(nc) ; 1 cycle
;
; Begin outer loop on # samples
;----------------------------------------------------------------
_start:
RPTBD END_LOOP - 1 ; 2 cycles
;
; Store 0 to AR0, to use as circular addressing offset
;----------------------------------------------------------------
STM #1, AR0 ; delay slot; 2 cycles
;
; Zero the accumulator before calculating next sum.
; Move next input sample into delay buffer
;----------------------------------------------------------------
MVDD *x_ptr+, *db_ptr ; 1 cycles
;
; Sum h * x for next y value
;----------------------------------------------------------------
MPY *h_ptr+0%, *db_ptr+0%, A ; 1 cycle
RPT *sp(nc) ; 2 cycle
MAC *h_ptr+0% , *db_ptr+0%, A ; 1 cycle * ncoeffs-2
MACR *h_ptr+0% , *db_ptr, A ; 1 cycle
;
; Store result
;----------------------------------------------------------------
STH A, *r_ptr+ ; 1 cycle
END_LOOP:
_end:
;
; Reset FRCT bit to restore normal C operating environment
; Return overflow condition, OVA, in accumulator A
; Restore stack to previous value, FRAME, etc..
;----------------------------------------------------------------
RETURN:
LDM db_ptr, B ; 1 cycle
MVDK *sp(db), db_ptr ; 2 cycles
LD #0, A ; 1 cycle
XC 1, AOV ; 1 cycle
LD #1, A ; 1 cycle
FRAME #(FRAME_SZ) ; 1 cycle
POPM ST1 ; 1 cycle
POPM ST0 ; 1 cycle
.if __far_mode
FRETD ; 4 cycles
.else
RETD ; 3.0 cycles
.endif
NOP ; delay slot 1 cycle
STL B, *db_ptr ; delay slot 1 cycle
;END
;end of file. please do not remove. it is left here to ensure that no lines of code are removed by any editor
10分享举报