📄 cubias.asm
字号:
;***********************************************************
; Version 2.20.01
;***********************************************************
;****************************************************************
; Filename: cubias.asm
; Description: calculates unbiased full length correlation
;----------------------------------------------------------------
; Revision History:
; 1.00, K. Baldwin. Original Beta Release 8/31/98
;****************************************************************
.mmregs
.global _corr_unbias
_corr_unbias
; Far-mode adjustment
.if __far_mode
OFFSET .set 2
.else
OFFSET .set 1
.endif
.if __far_mode
FRAME_SZ .set 6
.else
FRAME_SZ .set 7
.endif
REG_SAVE_SZ .set 4
PARAM_OFFSET .set REG_SAVE_SZ + FRAME_SZ + OFFSET
.asg 0, inverse
.asg 1, b1_save
.asg 2, b3_save
.asg 3, a1_save
.asg 4, a3_save
.asg 5, n_macs
.asg 6, a2_save
.asg 0 + FRAME_SZ, SAVE_AR6
.asg 1 + FRAME_SZ, SAVE_AR1
.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 AR2, r_ptr
.asg AR2, r1_ptr
.asg AR3, a_ptr
.asg AR4, b_ptr
.asg AR1, r3_ptr
.asg AR6, a_save
.asg AR5, b_save
.asg AR0, mac_cnt
; 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
; Region 1 & 3 will be calculated in same loop. For both
; region 1 & 3, the pointers to vector A will initially point
; to the last element in A.
; In region 1, the pointer to vector , B will point to last
; b[na-2]. In region 3, the pointer will initially point to
; b[nb-1].
; The output vector pointer will initially point to r[0] for
; region 1, and to r[nb-1], for region 3
;----------------------------------------------------------------
STL A, *sp(a2_save) ; 1 cycle
ADD na, A ; 1 cycle
SUB #1, A ; 2 cycles
STL A, *sp(a1_save) ; 1 cycle
SUB #1, A ; 2 cycles
STL A, *sp(a3_save) ; 1 cycle
LD *sp(bp), B ; 1 cycle
ADD na, B, A ; 1 cycle
SUB #2, A ; 2 cycles
STL A, *sp(b1_save) ; 1 cycle
ADD nb, B ; 1 cycle
SUB #1, B ; 2 cycles
STL B, *sp(b3_save) ; 1 cycle
LD *sp(r), A ; 1 cycle
ADD na, A, B ; 1 cycle
SUB #2, B ; 2 cycles
STLM B, r1_ptr ; 1 cycle
ADD nb, A ; 1 cycle
STLM A, r3_ptr ; 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 na, B ; 1 cycle
SUB #1, B, A ; 2 cycles
SUB #4, B ; 2 cycles
STLM B, BRC ; 1 cycle
STLM B, mac_cnt ; 1 cycle
;
; Initial lag is in region 1, load initial MAC count and
; number of elements to calculate in region 1
;----------------------------------------------------------------
REGION1_AND_3:
MVDK *sp(b1_save), b_ptr ; 2 cycles
MVDK *sp(a1_save), a_ptr ; 2 cycles
REGION1_LOOP:
RPTBD END_REGION1_LOOP-1 ; 2 cycles
STL A, *sp(n_macs) ; 1 cycle
RSBX SXM ; 1 cycle
;LOOP START
;
; Calculate inverse of number of MACs
;----------------------------------------------------------------
LD #32767, A ; 2 cycles
RPT #15 ; 1 cycle
SUBC *sp(n_macs), A ; 16 cycles
SSBX SXM ; 1 cycle
STL A, *sp(inverse) ; 1 cycle
;--------- Calculate sum in region 1
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, ..)
MAC *a_ptr-, *b_ptr-, A ; 1 cycle
LD *(AH), T ; 2 cycles
MPYR *sp(inverse), A ; 1 cycle
MVDK *sp(a3_save), a_ptr ; 2 cycles
MVDK *sp(b3_save), b_ptr ; 2 cycles
ADDM #-1, *sp(b1_save) ; 2 cycles
STH A, *r1_ptr- ; 1 cycle
;--------- Calculate sum in region 3
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, ..)
MAC *a_ptr-, *b_ptr-, A ; 1 cycle
LD *(AH), T ; 2 cycles
MPYR inverse, A ; 1 cycle
ADDM #-1, *sp(a3_save) ; 2 cycles
MVDK *sp(a1_save), a_ptr ; 2 cycles
MVDK *sp(b1_save), b_ptr ; 2 cycles
ADDM #-1, *sp(n_macs) ; 2 cycles
STH A, *r3_ptr+ ; 1 cycle
RSBX SXM ; 1 cycle
MAR *mac_cnt- ; 1 cycle
END_REGION1_LOOP
;
; Calculate last two correlation elements outside of loop
;----------------------------------------------------------------
;---------- Region 1
MPY *a_ptr-, *b_ptr-, A ; 1 cycle
MACR *a_ptr+ , *b_ptr, A ; 1 cycle
STH A, -1, *r1_ptr- ; 2 cycles
LD #0, A ; 1 cycle
MACR *a_ptr, *b_ptr, A ; 1 cycle
STH A, *r1_ptr- ; 1 cycle
;---------- Region 3
MVDK *sp(a3_save), a_ptr ; 2 cycles
MVDK *sp(b3_save), b_ptr ; 2 cycles
MVDK *sp(bp), b_save ; 2 cycles
MVDK *sp(a2_save), a_save ; 2 cycles
MPY *a_ptr-, *b_ptr-, A ; 1 cycle
MACR *a_ptr , *b_ptr+, A ; 1 cycle
STH A, -1, *r3_ptr+ ; 2 cycles
LD #0, A ; 1 cycle
MACR *a_ptr, *b_ptr, A ; 1 cycle
STH A, *r3_ptr ; 1 cycle
;
; Calculate inverse of number of MACs = na
; We load Q15 equivalent of 1 into accumulator and use SUBC
; Thus calculating Q15 equivalent of 1/N
; This value wil be used to calculate the unbiased results
; for region 2
;----------------------------------------------------------------
RSBX SXM ; 1 cycle
LD #32767, A ; 2 cycles
RPT #15 ; 1 cycle
SUBC na, A ; 16 cycles
ADD #1, A ; round result ; 1 cycle
STL A, *sp(inverse) ; 1 cycle
SSBX SXM ; 1 cycle
;
; Begin Loop for Region 2:
; b[0] , b[1], b[2], .... b[nb-na]
;----------------------------------------------------------------
REGION2:
LD na, B ; 1 cycle
LD nb, A ; 1 cycle
SUB B, A ; 1 cycle
STLM A, BRC ; 1 cycle
STLM B, mac_cnt ; 1 cycle
SUB #1, B ; 2 cycles
ADD *sp(r), B ; 1 cycle
STLM B, r_ptr ; 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
MAC *a_ptr+, *b_ptr+, A ; 1 cycle
LD *(AH), T ; 2 cycles
MPYR *sp(inverse), 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
;
; Return to calling function, restoring C environment first
; If necessary
;----------------------------------------------------------------
RETURN:
;
; Return value of OVA flag in accum A
;----------------------------------------------------------------
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 ; 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 + -