📄 araw.asm
字号:
;***********************************************************
; Version 2.20.01
;***********************************************************
;****************************************************************
; Function: acorr_raw
; Description: calculate the positive raw auto-correlation
;
; Copyright Texas instruments Inc, 1998
;----------------------------------------------------------------
; Revision History:
; 1.00 -K. Baldwin, 8/31/98. Original version
; 2.00 - Li Yuan, 4/09/02. fixed overflow flag setup at the end of code.
;****************************************************************
.mmregs
.global _acorr_raw
_acorr_raw
; Far-mode adjustment
;----------------------------------------------------------------
.if __far_mode
OFFSET .set 2
.else
OFFSET .set 1
.endif
;----------------------------------------------------------------
;
; Data declarations:
; r_ptr - pointer to output vector
; a_ptr - pointer to vector a
; a2_ptr - pointer to vector a'
; a_save - saves start address for vector a
; a2_save - saves start address for vector a'
; count - MAC count
;
;----------------------------------------------------------------
.if __far_mode
FRAME_SZ .set 1
.else
FRAME_SZ .set 2
.endif
REG_SAVE_SZ .set 5
PARAM_OFFSET .set FRAME_SZ + REG_SAVE_SZ + OFFSET
.asg 0, temp
.asg 0 + FRAME_SZ, SAVE_AR1
.asg 1 + FRAME_SZ, SAVE_AR6
.asg 2 + FRAME_SZ, SAVE_AR7
.asg 0 + FRAME_SZ + REG_SAVE_SZ, RETURN_ADDR
.asg 0 + PARAM_OFFSET, r
.asg 1 + PARAM_OFFSET, na
.asg 2 + PARAM_OFFSET, nr
.asg AR2, r_ptr
.asg AR3, a_ptr
.asg AR4, a2_ptr
.asg AR1, count
.asg AR5, a_save
.asg AR6, loop_count
.asg AR7, exec
.asg AR0, a2_save
; Save contents of AR1, AR6, AR7
; Set local FRAME if required
; Make sure sign extension mode and frct bit are set
; Clear overflow flag
;----------------------------------------------------------------
PSHM AR7 ; 1 cycle
PSHM AR6 ; 1 cycle
PSHM AR1 ; 1 cycle
PSHM ST0 ; 1 cycle
PSHM ST1 ; 1 cycle
RSBX OVA ; 1 cycle
RSBX OVB ; 1 cycle
FRAME #-FRAME_SZ ; 1 cycle
SSBX SXM ; 1 cycle
SSBX FRCT ; 1 cycle
STM #0, exec ; 2 cycles
;
; Copy arguments to their local locations as necessary
;----------------------------------------------------------------
LD *sp(nr), B ; 1 cycle
STLM B, loop_count ; 1 cycle
STLM A, a_save ; 1 cycle
STLM A, a2_save ; 1 cycle
SUB #1, B ; 2 cycles
BCD L1, BEQ ; 3 cycles
LD *sp(na), A ; 1 cycle
MAR *loop_count- ; 1 cycle
;
; If the number of correlation elements to calculate is
; exactly equal to na, then we want to calculate the last
; 2 elements outside of the loop. Since loop assumes minimum
; of 3 MAC operations
;----------------------------------------------------------------
SUB *sp(nr), A ; 1 cycle
STL A, *sp(temp) ; 1 cycle
CMPM *sp(temp), #1 ; 2 cycles
BC L0, NTC ; 5 cycles
BD L1 ; 2 cycles
MAR *exec- ; 1 cycle
MAR *loop_count- ; 1 cycle
L0:
CMPM *sp(temp), #0 ; 2 cycles
BC L1, NTC ; 5 cycles
MAR *+loop_count(-2) ; 2 cycles
MAR *exec+ ; 1 cycle
L1:
MVMM a_save, a_ptr ; 1 cycle
MVMM a2_save, a2_ptr ; 1 cycle
MVDM *(loop_count), BRC ; 2 cycles
MVDK *sp(na), count ; 2 cycles
MAR *+count(-3) ; 2 cycles
;
; Perform correlation:
;----------------------------------------------------------------
RPTBD END_LOOP-1 ; 2 cycles
MVDK *sp(r), r_ptr ; delay slot 2 cycles
LOOP:
;
; Preload A with first multiply
;----------------------------------------------------------------
MPY *a_ptr+, *a2_ptr+, A ; 1 cycle
RPT *(count) ; 2 cycles
MAC *a_ptr+, *a2_ptr+, A ; na-2
MACR *a_ptr , *a2_ptr, A ; 1 cycle
;
; Increment pointer to a'
; Restore pointer to a
;----------------------------------------------------------------
MAR *a2_save+ ; 1 cycle
MVMM a_save, a_ptr ; 1 cycle
MVMM a2_save, a2_ptr ; 1 cycle
;
; Store result to output
;----------------------------------------------------------------
STH A, *r_ptr+ ; 1 cycle
;
; Decrement MAC counter
;----------------------------------------------------------------
MAR *count- ; 1 cycle
END_LOOP
LD *(exec), B ; 2 cycles
BCD RETURN, BEQ ; 2 cycles
;
; The last two elements are calculated outside the loop
;----------------------------------------------------------------
MPY *a_ptr+, *a2_ptr+, A ; 1 cycle
MACR *a_ptr-, *a2_ptr , A ; 1 cycle
STH A, *r_ptr+ ; 1 cycle
BC RETURN, BLT ; 5 cycles
LD #0, A ; 1 cycle
MACR *a_ptr, *a2_ptr, A ; 1 cycle
STH A, *r_ptr+ ; 1 cycle
;
; Reset FRCT bit - this restores C opersting environment
; as expected by the TI TMS320C54x C Compiler
;
; Return to calling function passing OVA status
;----------------------------------------------------------------
RETURN:
FRAME #FRAME_SZ ; 1 cycle
LD #0, A ; 1 cycle
XC 1, AOV ; 1 cycle
LD #1, A ; XC slot 1 cycle
POPM ST1 ; 1 cycle
POPM ST0 ; 1 cycle
POPM AR1 ; 1 cycle
POPM AR6 ; 1 cycle
POPM AR7 ; 1 cycle
.if __far_mode
FRETD ; 4 cycles
.else
RETD ; 3 cycles
.endif
NOP ; 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 + -