📄 craw.asm
字号:
;***********************************************************
; Version 2.20.01
;***********************************************************
;****************************************************************
; Function: corr_raw
; Description: raw full length correlation of two vectors
;
; Copyright Texas instruments Inc, 1998
;----------------------------------------------------------------
; Revision History:
; 1.00 K.Baldwin, Original Beta Release 8/31/98
;****************************************************************
; Far-mode adjustment
.if __far_mode
OFFSET .set 2
.else
OFFSET .set 1
.endif
.mmregs
.global _corr_raw
_corr_raw
;
FRAME_SZ .set 2
REG_SAVE_SZ .set 4
PARAM_OFFSET .set REG_SAVE_SZ + FRAME_SZ + OFFSET
.asg 0, region1_and_3_loop_cnt
.asg 1, one
.asg 0 + FRAME_SZ, SAVE_AR6
.asg 1 + FRAME_SZ, SAVE_AR6
.asg 0 + REG_SAVE_SZ + FRAME_SZ, RETURN_ADDR
.asg 0 + PARAM_OFFSET, bp
.asg 1 + PARAM_OFFSET, r
.asg 2 + PARAM_OFFSET, na
.asg 3 + PARAM_OFFSET, nb
.asg AR0, mac_cnt
.asg AR1, a_save
.asg AR1, a3_save
.asg AR2, r_ptr
.asg AR3, a_ptr
.asg AR4, b_ptr
.asg AR5, b_save
.asg AR6, a2_save
;
; Save contents of AR1 & AR6
; Reserve space on frame for local variables
;----------------------------------------------------------------
PSHM AR1 ; 1 cycle
PSHM AR6 ; 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
MVDK *sp(r), r_ptr ; 2 cycles
ST #1, one ; 2 cycles
;
; Set pointer to A to point to last element
;----------------------------------------------------------------
STLM A, a2_save ; 1 cycle
ADD *sp(na), A ; 1 cycle
STLM A, a_save ; 1 cycle
;
; Set pointers for vector , b,
;----------------------------------------------------------------
LD *sp(bp), A ; 1 cycle
STLM A, b_save ; 1 cycle
;
; Initialize MAC cnt for regions 1 & 3, these will be
; calculated in one loop, since the number of elements is the
; same in each region.
;----------------------------------------------------------------
LD *sp(na), B ; 1 cycle
SUB #4, B ; 2 cycles
STL B, region1_and_3_loop_cnt ; 1 cycle
MAR *a_save- ; 1 cycle
;
; Initial lag is in region 1, load initial MAC count and
; number of elements to calculate in region 1
;----------------------------------------------------------------
REGION1:
MVMM b_save, b_ptr ; 1 cycle
MVMM a_save, a_ptr ; 1 cycle
LD region1_and_3_loop_cnt, A ; 1 cycle
STLM A, BRC ; 1 cycle
STM #0, mac_cnt ; 2 cycles
;
; Calculate first two elements outside of the loop
;
LD #0, A ; 1 cycle
MACR *a_ptr, *b_ptr+, A ; 1 cycle
STH A, *r_ptr+ ; 1 cycle
MPY *a_ptr-, *b_ptr-, A ; 1 cycle
MACR *a_ptr , *b_ptr , A ; 1 cycle
MAR *+b_save(2) ; 2 cycles
MVMM a_save, a_ptr ; 1 cycle
MVMM b_save, b_ptr ; 1 cycle
REGION1_LOOP:
RPTBD END_REGION1_LOOP-1 ; 2 cycles
STH A, *r_ptr+ ; 1 cycle
MPY *a_ptr-, *b_ptr-, A ; 1 cycle
;LOOP START
RPT *(mac_cnt) ; 1 cycle
MAC *a_ptr-, *b_ptr-, A ; sum(mac_cnt-1 + mac_cnt-2, ..)
MACR *a_ptr-, *b_ptr-, A ; 1 cycle
MAR *b_save+ ; 1 cycle
MVMM a_save, a_ptr ; 1 cycle
MVMM b_save, b_ptr ; 1 cycle
MAR *mac_cnt+ ; 1 cycle
STH A, *r_ptr+ ; 1 cycle
MPY *a_ptr-, *b_ptr-, A ; 1 cycle
END_REGION1_LOOP
MVDK *sp(bp), b_save ; 2 cycles
MVMM a2_save, a_save ; 1 cycle
;
; Begin Loop for Region 2:
; b[0] , b[1], b[2], .... b[nb-na]
;----------------------------------------------------------------
REGION2:
LD *sp(na), B ; 1 cycle
LD *sp(nb), A ; 1 cycle
SUB B, A ; 1 cycle
STLM A, BRC ; 1 cycle
STLM B, mac_cnt ; 1 cycle
MVMM a_save, a_ptr ; 1 cycle
MVMM b_save, b_ptr ; 1 cycle
REGION2_LOOP:
RPTBD END_REGION2_LOOP-1 ; 2 cycles
MAR *+mac_cnt(-3) ; 2 cycles
;LOOP START
MAR *b_save+ ; 1 cycle
MPY *a_ptr+, *b_ptr+, A ; 1 cycle
RPT *(mac_cnt) ; 1 cycle
MAC *a_ptr+, *b_ptr+, A ; mac_cnt
MACR *a_ptr+, *b_ptr+, A ; 1 cycle
MVMM a_save, a_ptr ; 1 cycle
MVMM b_save, b_ptr ; 1 cycle
STH A, *r_ptr+ ; 1 cycle
END_REGION2_LOOP
;
; Begin REGION3 loop:
; x[nb-na+1], x[nb-na+2], .. x[nb-1]
;----------------------------------------------------------------
REGION3:
LD region1_and_3_loop_cnt, A ; 1 cycle
STLM A, BRC ; 1 cycle
MVMM a_save, a_ptr ; 1 cycle
MVMM b_save, b_ptr ; 1 cycle
REGION3_LOOP:
RPTBD END_REGION3_LOOP-1 ; 2 cycles
MAR *mac_cnt- ; 1 cycle
NOP ; 1 cycle
;LOOP START
MPY *a_ptr+, *b_ptr+, A ; 1 cycle
RPT *(mac_cnt) ; 1 cycle
MAC *a_ptr+, *b_ptr+, A ; sum(mac_cnt-1 + mac_cnt-2,..)
MACR *a_ptr+, *b_ptr+, A ; 1 cycle
MAR *b_save+ ; 1 cycle
MVMM a_save, a_ptr ; 1 cycle
MVMM b_save, b_ptr ; 1 cycle
STH A, *r_ptr+ ; 1 cycle
MAR *mac_cnt- ; 1 cycle
END_REGION3_LOOP
;
; Calculate last two correlation elements outside of loop
;----------------------------------------------------------------
MPY *a_ptr+, *b_ptr+, A ; 1 cycle
MACR *a_ptr-, *b_ptr, A ; 1 cycle
STH A, *r_ptr+ ; 1 cycle
LD #0, A ; 2 cycles
MACR *a_ptr, *b_ptr, A ; 1 cycle
STH A, *r_ptr+ ; 1 cycle
;
; Return to calling function, restoring C environment first
; If necessary
;----------------------------------------------------------------
RETURN:
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
POPM AR6 ; 1 cycle
POPM AR1 ; 1 cycle
.if __far_mode
FRETD ; 4 cycles
.else
RETD ; 3 cycles
.endif
NOP ; 1 cycle
NOP ; 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 + -