📄 cpda.s54
字号:
*-------------------------------------------------------------------------*
* *
* THIS IS AN UNPUBLISHED WORK CONTAINING CONFIDENTIAL AND PROPRIETARY *
* INFORMATION. IF PUBLICATION OCCURS, THE FOLLOWING NOTICE APPLIES: *
* "COPYRIGHT 2001 MIKET DSP SOLUTIONS, ALL RIGHTS RESERVED" *
* *
*-------------------------------------------------------------------------*/
.mmregs
.include "cpdi.h54"
.global _CPD_aBpI
.global _CPD_aBpQ;
.global _CPD_aPg;
.global _CPD_aPhase;
.sect ".ftext"
en2log .macro added
add #1, a
exp a
ld #(0x780+added), b
norm a
ld a, -16, a
add a, -5, b
mac #-512, b, a
.endm
;-------------------------------------------------------------------------
.global _cpd_en2log
.sym _cpd_en2log, _cpd_en2log, 32, 2, 0
;-------------------------------------------------------------------------
_cpd_en2log
; S32 slEn = a
; S16 sCorr = sp(1)
;
ssbx sxm
add #1, a
exp a
ld #0x780, b
norm a
ld a, -16, a
add a, -5, b
mac #-512, b, a
add *sp(1), a
ret
;-------------------------------------------------------------------------
.global _cpd_move_data_in
.sym _cpd_move_data_in, _cpd_move_data_in, 32, 2, 0
_cpd_move_data_in
;-------------------------------------------------------------------------*/
; CPD_tDb *pDb = a
; CPD_tSc *pSc = sp(1)
; S16 *psIn = sp(2)
stlm a, ar2
ssbx sxm
nop
mvdk *ar2(#(CPD_tDb.pCfg)), ar3
ld *ar3(#(ICPD_tCfg.sNormShift)), asm
mvmm ar2, ar4
mvdk *sp(1), ar5
mar *+ar4(#(CPD_tDb.asBpDataSav))
mar *+ar5(#(CPD_tSc.asBpData))
rpt #CPD_BP_SSZ-1
mvdd *ar4+, *ar5+
mvdk *sp(2), ar4
.if 0
ld *ar4+, 16, b
rpt #ICPD_FR_SZ-2
st b, *ar5+ || ld *ar4+, b
sth b, asm, *ar5+
.else
stm #ICPD_FR_SZ-1, brc
rptb Lmovein-1
ld *ar4+, 16, b
sth b, asm, *ar5+
Lmovein
.endif
mvmm ar2, ar4
mvdk *sp(1), ar5
mar *+ar4(#(CPD_tDb.asPgIDataSav))
mar *+ar5(#(CPD_tSc.asPgIData))
rpt #CPD_PG_SSZ-1
mvdd *ar4+, *ar5+
mvmm ar2, ar4
mvdk *sp(1), ar5
mar *+ar4(#(CPD_tDb.asPgQDataSav))
mar *+ar5(#(CPD_tSc.asPgQData))
rpt #CPD_PG_SSZ-1
mvdd *ar4+, *ar5+
ret
;-------------------------------------------------------------------------*/
.global _cpd_filter_bp
.sym _cpd_filter_bp, _cpd_filter_bp, 32, 2, 0
_cpd_filter_bp
;-------------------------------------------------------------------------*/
; CPD_tSc *pSc = a
;
stlm a, ar2
ssbx sxm
nop
;
; I --------------------------
;
; in
mvmm ar2, ar3
mar *+ar3(#(CPD_tSc.asBpData))
; coef
stm #_CPD_aBpI, ar4
; out
mvmm ar2, ar5
mar *+ar5(#(CPD_tSc.asPgIData + CPD_PG_SSZ))
; misc
ld #0, a
stm #1-CPD_BP_FSZ, ar0
stm #0, bk
stm #(ICPD_FR_SZ/CPD_BP_DR-1), brc
; loop
rptb L11-1
rptz b, #CPD_BP_FSZ-2
mac *ar3+, *ar4+, b
macr *ar3+0%, *ar4+0%, b
sth b, *ar5
squra *ar5+, a
mar *+ar3(#CPD_BP_DR)
L11
;
; Q --------------------------
;
; in
mvmm ar2, ar3
mar *+ar3(#(CPD_tSc.asBpData))
; coef
stm #_CPD_aBpQ, ar4
; out
mvmm ar2, ar5
mar *+ar5(#(CPD_tSc.asPgQData + CPD_PG_SSZ))
; misc
; stm #1-CPD_BP_FSZ, ar0
; stm #0, bk
stm #(ICPD_FR_SZ/CPD_BP_DR-1), brc
; loop
rptb L12-1
rptz b, #CPD_BP_FSZ-2
mac *ar3+, *ar4+, b
macr *ar3+0%, *ar4+0%, b
sth b, *ar5
squra *ar5+, a
mar *+ar3(#CPD_BP_DR)
L12
;
; energy -------------------
;
; dst a, *ar2(#(CPD_tSc.slBpEn))
sth a, *ar2(#(CPD_tSc.slBpEn))
stl a, *ar2(#(CPD_tSc.slBpEn+1))
en2log CPD_EN_BP
stl a, *ar2(#(CPD_tSc.sBpEn))
ret
;-------------------------------------------------------------------------*/
.global _cpd_sum_sub
.sym _cpd_sum_sub, _cpd_sum_sub, 32, 2, 0
_cpd_sum_sub
;-------------------------------------------------------------------------*/
; CPD_tSc *pSc = a
;
stlm a, ar2
ssbx sxm
nop
mvmm ar2, ar3
mvmm ar2, ar4
mvmm ar2, ar5
mar *+ar2(#(CPD_tSc.asPgIData))
mar *+ar3(#(CPD_tSc.asPgIData+(CPD_PG_FSZ-1)))
mar *+ar4(#(CPD_tSc.asPgISum))
mar *+ar5(#(CPD_tSc.asPgIDif))
stm #CPD_PG_HSZ-1, brc
rptb L21-1
add *ar2, *ar3, b
sth b, *ar4+
sub *ar2+, *ar3-, b
sth b, *ar5+
L21
stlm a, ar2
nop
nop
mvmm ar2, ar3
mvmm ar2, ar4
mvmm ar2, ar5
mar *+ar2(#(CPD_tSc.asPgQData))
mar *+ar3(#(CPD_tSc.asPgQData+(CPD_PG_FSZ-1)))
mar *+ar4(#(CPD_tSc.asPgQSum))
mar *+ar5(#(CPD_tSc.asPgQDif))
stm #CPD_PG_HSZ-1, brc
rptb L22-1
add *ar2, *ar3, b
sth b, *ar4+
sub *ar2+, *ar3-, b
sth b, *ar5+
L22
ret
;-------------------------------------------------------------------------*/
.global _cpd_filter_pg
.sym _cpd_filter_pg, _cpd_filter_pg, 32, 2, 0
_cpd_filter_pg
;-------------------------------------------------------------------------*/
; CPD_tSc *pSc = a
;
stlm a, ar2
ssbx sxm
pshm ar1
mvmm ar2, ar3
mvmm ar2, ar4
mvmm ar2, ar5
mar *+ar3(#(CPD_tSc.asPgISum))
mar *+ar4(#(CPD_tSc.asPgQSum))
mar *+ar5(#(CPD_tSc.aOut))
stm #_CPD_aPg, ar2
stm #1-2*CPD_PG_HSZ, ar0
stm #0, bk
stm #CPD_FREQS-1, ar1
L31
stm #CPD_PG_HSZ-2, brc
rptbd L32-1
mpy *ar3+, *ar2, a
mpy *ar4+, *ar2+, b
mac *ar3+, *ar2, a
mac *ar4+, *ar2+, b
L32
stm #CPD_PG_HSZ-2, brc
rptb L33-1
mas *ar4+, *ar2, a
mac *ar3+, *ar2+, b
L33
masr *ar4+0%, *ar2, a
macr *ar3+0%, *ar2+, b
sth a, *ar5+
sth b, *ar5
squr a, a
squra *ar5+, a
dst a, *ar5
banzd L31, *ar1-
mar *+ar5(#(CPD_tOut_Sz-2))
popm ar1
ret
;-------------------------------------------------------------------------*/
.global _cpd_sort_freqs
.sym _cpd_sort_freqs, _cpd_sort_freqs, 32, 2, 0
_cpd_sort_freqs
;-------------------------------------------------------------------------*/
; CPD_tSc *pSc = a
;
stlm a, ar2
ssbx sxm
nop
mvmm ar2, ar3
mvmm ar2, ar4
mar *+ar3(#(CPD_tSc.aOut+CPD_tOut.slEn))
mar *+ar4(#(CPD_tSc.aslEnSort))
stm #(CPD_tOut_Sz), ar0
stm #CPD_FREQS-1, brc
rptb L41-1
dld *ar3+0, b
; sth b, *ar4+
; stl b, *ar4+
dst b, *ar4+
L41
nop
nop
mar *+ar4(#(-CPD_FREQS*2))
dld *ar4+, a
stm #0, ar3
stm #0, ar0
stm #CPD_FREQS-2, brc
rptb L42-1
dld *ar4+, b
max a
mar *ar3+
nop
xc 1, c
mvmm ar3, ar0
L42
mvkd ar0, *ar2(#(CPD_tSc.sMaxIdx))
en2log CPD_EN_PG
stl a, *ar2(#(CPD_tSc.sMaxEn))
mar *+ar4(#(-CPD_FREQS*2))
mvmm ar4, ar5
mar *ar5+0
mar *ar5+0
ld #0, a
dst a, *ar5
dld *ar4+, a
stm #0, ar3
stm #0, ar0
stm #CPD_FREQS-2, brc
rptb L43-1
dld *ar4+, b
max a
mar *ar3+
nop
xc 1, c
mvmm ar3, ar0
L43
mvkd ar0, *ar2(#(CPD_tSc.sNextIdx))
en2log CPD_EN_PG
stl a, *ar2(#(CPD_tSc.sNextEn))
mar *+ar4(#(-CPD_FREQS*2))
mvmm ar4, ar5
mar *ar5+0
mar *ar5+0
ld #0, a
dst a, *ar5
dld *ar4+, a
stm #0, ar3
stm #0, ar0
stm #CPD_FREQS-2, brc
rptb L44-1
dld *ar4+, b
max a
mar *ar3+
nop
xc 1, c
mvmm ar3, ar0
L44
mvkd ar0, *ar2(#(CPD_tSc.sRestIdx))
en2log CPD_EN_PG
stl a, *ar2(#(CPD_tSc.sRestEn))
ret
.if 0
;-------------------------------------------------------------------------*/
.global _cpd_get_err
.sym _cpd_get_err, _cpd_get_err, 32, 2, 0
_cpd_get_err
;-------------------------------------------------------------------------*/
; S32 slEn = a
; S32 *slErr = sp(1)
;
ssbx sxm
mvdk *sp(1), ar2
dld *ar2, b
abs b
bit *ar2, (15-15) ; tc = sign
min b
add #1, a
exp a
nop
norm a
norm b
ld b, -1, b
sth a, *sp(1)
rpt #16-1
subc *sp(1), b
stl b, *sp(1)
mpy *sp(1), #-5450, a
xc 1, tc
neg a
ld a, -15, a
ret
.endif
;-------------------------------------------------------------------------*/
.global _cpd_get_elem_data
.sym _cpd_get_elem_data, _cpd_get_elem_data, 32, 2, 0
_cpd_get_elem_data
;-------------------------------------------------------------------------*/
; CPD_tDb *pDb = a
; CPD_tSc *pSc = sp(1)
; CPD_tElem *pElem = sp(2)
; S16 sIdx = sp(3)
stlm a, ar2
ssbx sxm
ssbx frct
mvdk *sp(3), ar0
; set ar5 = pPhase
stm #_CPD_aPhase, ar5
mar *ar5+0
mar *ar5+0
; set ar2 = psC0 / psS0
mar *+ar2(#(CPD_tDb.aOutSav))
mar *ar2+0
mar *ar2+0
; set ar3 = psC1 / psS1 / pslEn
mvdk *sp(1), ar3
mar *+ar3(#(CPD_tSc.aOut))
mar *ar3+0
mar *ar3+0
mar *ar3+0
mar *ar3+0
; set ar4 = pElem
mvdk *sp(2), ar4
; calculate Cpred / Spred
mpy *ar2+, *ar5, a
mpy *ar2, *ar5+, b
macr *ar2-, *ar5, a
masr *ar2, *ar5, b
sth a, *ar4+
sth b, *ar4-
; calculate log(distance)
rsbx frct
sub *ar4+, *ar3+, a
squr a, b
sub *ar4+, *ar3, a
squr a, a
add b, a
en2log CPD_EN_PG
stl a, *ar4-
mar *ar4-
; calculate slErr
mpy *ar3-, *ar4+, b
mas *ar3+, *ar4+, b
mar *ar4+
mar *ar3+
; calculate sErr
dld *ar3, a
xc 1, blt
ssbx tc
abs b, b
sub a, b ; b = |err| - en, shall be < 0
bc L51, bgeq
add a, b
add #1, a
exp a
nop
norm a
norm b
sth a, *ar4
and #0xffff,16,b
ld b,-1,b
rpt #(16-1)
subc *ar4, b
.if 1
stl b, *ar4
mpy *ar4, #-5450, b
ld b, -15, b
xc 1, tc
neg b
stl b, *ar4
.else
xc 1, tc
neg b
stl b, *ar4
.endif
ret
L51
st #-5450, *ar4
xc 2, tc
st #5450, *ar4
ret
;-------------------------------------------------------------------------*/
.global _cpd_move_data_out
.sym _cpd_move_data_out, _cpd_move_data_out, 32, 2, 0
_cpd_move_data_out
;-------------------------------------------------------------------------*/
; CPD_tDb *pDb = a
; CPD_tSc *pSc = sp(1)
;
stlm a, ar2
ssbx sxm
nop
mvdk *sp(1), ar3
; save Bp data
mvmm ar2, ar4
mvmm ar3, ar5
mar *+ar4(#(CPD_tDb.asBpDataSav))
mar *+ar5(#(CPD_tSc.asBpData+(CPD_BP_ASZ-CPD_BP_SSZ)))
rpt #CPD_BP_SSZ-1
mvdd *ar5+, *ar4+
; save PgI data
mvmm ar2, ar4
mvmm ar3, ar5
mar *+ar4(#(CPD_tDb.asPgIDataSav))
mar *+ar5(#(CPD_tSc.asPgIData+(CPD_PG_ASZ-CPD_PG_SSZ)))
rpt #CPD_PG_SSZ-1
mvdd *ar5+, *ar4+
; save PgQ data
mvmm ar2, ar4
mvmm ar3, ar5
mar *+ar4(#(CPD_tDb.asPgQDataSav))
mar *+ar5(#(CPD_tSc.asPgQData+(CPD_PG_ASZ-CPD_PG_SSZ)))
rpt #CPD_PG_SSZ-1
mvdd *ar5+, *ar4+
; save Out: sC, sS
mvmm ar2, ar4
mvmm ar3, ar5
mar *+ar4(#(CPD_tDb.aOutSav))
mar *+ar5(#(CPD_tSc.aOut))
stm #CPD_FREQS-1, brc
stm #CPD_tOut_Sz-1, ar0
stm #0, bk
rptb L61-1
mvdd *ar5+, *ar4+
mvdd *ar5+0%, *ar4+
L61
; delay asSum and update asSum[0]
mvmm ar2, ar4
mvmm ar3, ar5
mar *+ar4(#(CPD_tDb.v.asSumEn+CPD_EN_SZ-2))
mar *+ar5(#(CPD_tSc.sSumEn))
rpt #CPD_EN_SZ-2
delay *ar4-
mar *ar4+
mvdd *ar5, *ar4
ret
;-------------------------------------------------------------------------
.global _cpd_avrg
.sym _cpd_avrg, _cpd_avrg, 32, 2, 0
_cpd_avrg
;-------------------------------------------------------------------------
; S16 *psVal = a
; S16 sNew = sp(1)
; S16 sCoeff = sp(2)
;
stlm a, ar4
ssbx sxm
ssbx frct
ld *sp(1), 16, a
sub *ar4, 16, a
ld *ar4, 16, b
macar *sp(2)
sth b, *ar4
rsbx frct
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -