📄 gaeca4a.s54
字号:
*-------------------------------------------------------------------------*
* *
* THIS IS AN UNPUBLISHED WORK CONTAINING CONFIDENTIAL AND PROPRIETARY *
* INFORMATION. IF PUBLICATION OCCURS, THE FOLLOWING NOTICE APPLIES: *
* "COPYRIGHT 2003 MICHAEL TSIROULNIKOV, ALL RIGHTS RESERVED" *
* *
*-------------------------------------------------------------------------*/
.mmregs
.include "gaeci.h54"
.sect ".ftext1"
;-------------------------------------------------------------------------
.global _gaec_adapt_pre
;-------------------------------------------------------------------------
_gaec_adapt_pre
; in
;-----------
; a = _ADJSS
; ar1 -> pSc->asTmp[0]
; ar4 -> pSc->asSSC[band]
; ar5 -> pDb->aslEnX[band]
; ar6 -> pDb->aslAdEn[band]
;
; out
;----------
; asm: shift
; t: corr step size
;
frame #-3
nop
stl a, *sp(2)
;
; add energy
dld *ar5, a
dld *ar6, b
add a, -4, b
ld #GAEC_ADEN_BASE, GAEC_ADEN_SHFT, a;
min b
dst b, *ar6
dadd *ar5, b, a
;
; invert here, put it into t2
exp a
nop
norm a
st t, *sp(0)
ld a, -16, a
ld #1,15, b
sub a, b
stl b, *sp(1)
ld #16020, a
add *sp(1), -1, a
squr *sp(1), b
add b, -15, a
ld a, 8, a
ld a, 8, a
mpya *ar4
add #(1<<11), b
ld b, -12, b
stlm b, t ; t = corrected step size
ld #(30 - 15), a
add *sp(2), a; --
sub *sp(0), a;
stl a, *sp(0) ; sp(0) = tx
;
; compare tx > 15
ld #15, b
sub *sp(0), b ; a = 15-tx
bc A01, bgeq
; tx > 15
bd A03
st #15, *ar1+
A01
ld *sp(0), b
bc A02, bgt
;
; tx < 0
neg b
bd A03
st #0, *ar1+
A02
; 0 < tx < 15
stl b, *ar1+
ld #0, b
A03
stl b, *sp(0)
ld *sp(0), asm
frame #3
ret
;-------------------------------------------------------------------------
_ADJ .set (4)
_ADJSS .set (_ADJ+2)
_DEXP .set (29491) ; Q15(0.9)
;-------------------------------------------------------------------------
.global _gaec_get_energy4
;-------------------------------------------------------------------------
_gaec_get_energy4
;
; GAEC_tDb *pDb = a
; GAEC_tSc *pSc = sp(1)
;
stlm a, ar2
ssbx sxm
nop
;
; psRcvI = ar3
mvdk *ar2(#(GAEC_tDb.psRcv)), ar3
mar *+ar3(#(GAEC_ADF_BSZ-GAEC_OFF4))
;
; psRcvQ = ar4
mvmm ar3, ar4
mar *+ar4(#(GAEC_BANDS*GAEC_RCV_SZ))
;
; pDb->aslEn4 = ar5
mvmm ar2, ar5
mar *+ar5(#(GAEC_tDb.aslEn4))
;
st #0, *sp(1) ; sp(1) = band
L01
;
cmpm *sp(1), #0
nop
nop
xc 2, ntc
cmpm *sp(1), #GAEC_BANDS
dld *ar5, a
; tc = 1 if band == 0 or BANDS
;
stm #GAEC_BLKS-1, brc
rptb L02-1
sub a, -6, a
squr *ar3+, b
xc 1, ntc
squra *ar4, b
mar *ar4+ ; inc ptr anyway
add b, -2, b
add b, -3, b
add b, -_ADJ, a
L02
dst a, *ar5+
mar *+ar3(#(GAEC_RCV_SZ-GAEC_BLKS))
mar *+ar4(#(GAEC_RCV_SZ-GAEC_BLKS))
addm #1, *sp(1)
cmpm *sp(1), #(GAEC_BANDS + 1)
bc L01, ntc
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_dc4p
;-------------------------------------------------------------------------
_gaec_adapt_dc4p
; GAEC_tDb *pDb = a;
; GAEC_tSc *pSc = sp(1)
; S16 band = sp(2)
;
pshm ar1
pshm ar6
pshm ar7
stlm a, ar2
ssbx sxm
orm #1, *(pmst)
mvdk *sp(1+3), ar3
cmpm *sp(2+3), #0
;
; ar0 = blk
; ar1 = pSc->u.aA3
; ar2 = pDb
; ar3 = pSc
; ar4 = pSc->asSSC[band];
; ar5 = pDb->aslEn3[band];
; ar6 = pDb->aslAdEn[band];
; ar7 = pSc->aasErr[band][blk]
;
mvmm ar3, ar4
mar *+ar4(#(GAEC_tSc.asSSC))
mvmm ar2, ar5
mar *+ar5(#(GAEC_tDb.aslEn4))
mvmm ar2, ar6
mar *+ar6(#(GAEC_tDb.aslAdEn))
mvmm ar3, ar7
mar *+ar7(#(GAEC_tSc.aasErr))
mvmm ar3, ar1
mar *+ar1(#(GAEC_tSc.u.aA4))
;
; adjust pointers if band == BANDS
bc A20, tc
mar *+ar4(#(GAEC_BANDS))
mar *+ar5(#(GAEC_BANDS*2))
mar *+ar6(#(GAEC_BANDS*2))
mar *+ar7(#(GAEC_BANDS*GAEC_BLKS))
A20
ld *ar4, a
bc A25, aeq;
ld #_ADJSS, a
call _gaec_adapt_pre
stm #GAEC_BLKS-1, brc
rptb A24-1
mpy *ar7+, b
ld b, asm, b
add #1, 14, b
sth b, 1, *ar1+
A24
A25
andm #~1, *(pmst)
popm ar7
popm ar6
popm ar1
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_dc4d
;-------------------------------------------------------------------------
_gaec_adapt_dc4d
; GAEC_tDb *pDb = a;
; GAEC_tSc *pSc = sp(1)
; S16 band = sp(2)
;
stlm a, ar2
ssbx sxm
orm #1, *(pmst)
mvdk *sp(1), ar5
cmpm *sp(2), #0
;
; ar0 = blk
; ar2 = pDb, sections
; ar3 = psAdf
; ar4 = psRcv
; ar5 = pSc->u.aA4
;
mar *+ar5(#(GAEC_tSc.u.aA4))
mvdk *ar2(#(GAEC_tDb.psAdf)), ar3
mar *+ar3(#(GAEC_OFF4*2)) ; ar3 = psAdf
mvdk *ar2(#(GAEC_tDb.psRcv)), ar4; ; ar4 = psRcv
mar *+ar4(#(GAEC_ADF_BSZ - GAEC_OFF4));
stm #(GAEC_SECTIONS4 - 1), ar2
; tc is (band == 0)
bc A26, tc
mar *ar3+
mar *+ar4(#(GAEC_BANDS*GAEC_RCV_SZ))
A26
call _gaec_adapt_dc4_core
andm #~1, *(pmst)
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_ac4p
;-------------------------------------------------------------------------
_gaec_adapt_ac4p
; GAEC_tDb *pDb = a;
; GAEC_tSc *pSc = sp(1)
;
pshm ar1
pshm ar6
pshm ar7
stlm a, ar2
ssbx sxm
nop
orm #0x1, *(pmst)
mvdk *sp(1+3), ar3
;
; ar1 = pSc->u.aA4[band]
; ar2 = pDb
; ar3 = pSc
; ar4 = pSc->asSSC[band]
; ar5 = pDb->aslEn2[band]
; ar6 = pDb->aslAdEn[band]
; ar7 = pSc->aasErr[band][blk]
;
mvmm ar3, ar4
mar *+ar4(#(GAEC_tSc.asSSC+1));
mvmm ar2, ar5
mar *+ar5(#(GAEC_tDb.aslEn4+2));
mvmm ar2, ar6
mar *+ar6(#(GAEC_tDb.aslAdEn+2));
mvmm ar3, ar7
mar *+ar7(#(GAEC_tSc.aasErr+GAEC_BLKS));
mvmm ar3, ar1
mar *+ar1(#(GAEC_tSc.u.aA4))
stm #(GAEC_BANDS-1)-1, ar0
A30
ld *ar4, a
bc A35, aeq;
ld #_ADJSS, a
call _gaec_adapt_pre
stm #GAEC_BLKS-1, brc
rptb A34-1
mpy *ar7, a
ld a, asm, a
add #1, 14, a
sth a, 1, *ar1+
mpy *ar7(#(GAEC_BANDS*GAEC_BLKS)), a
ld a, asm, a
add #1, 14, a
sth a, 1, *ar1+
mar *ar7+
A34
mar *+ar7(#-GAEC_BLKS)
st #_DEXP, *ar1+
mar *+ar1(#(-GAEC_tScA4_Sz))
A35
;
; ptr increment - to the next band
mar *+ar1(#GAEC_tScA4_Sz); pA4
mar *ar4+ ; asSSC
mar *+ar5(#2) ; aslEn4
mar *+ar6(#2) ; aslAdEn
mar *+ar7(#GAEC_BLKS) ; aasErr
banz A30, *ar0-
andm #~0x1, *(pmst)
popm ar7
popm ar6
popm ar1
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_ac4d
;-------------------------------------------------------------------------
_gaec_adapt_ac4d
; GAEC_tDb *pDb = a;
; GAEC_tSc *pSc = sp(1)
;
pshm ar1
pshm ar6
pshm ar7
stlm a, ar2
ssbx sxm
nop
orm #0x1, *(pmst)
mvdk *sp(1+3), ar1
;
; ar0 = blk
; ar1 = pSc->u.aA4 [ tx, 4*{sErrI, sErrQ}, Dexp ]
; ar2 = psErr (pSc->u.aA4.asErr[..]), both ErrI & ErrQ
; ar3 = psAdf
; ar4 = psRcvI
; ar5 = psRcvQ
; ar6 = loop cntr (sections)
; ar7 = loop cntr (bands)
;
mar *+ar1(#(GAEC_tSc.u.aA4))
mvdk *ar2(#(GAEC_tDb.psAdf)), ar3
mar *+ar3(#((GAEC_OFF4+GAEC_ADF_SZ)*2))
mvdk *ar2(#(GAEC_tDb.psRcv)), ar4;
mar *+ar4(#(GAEC_RCV_SZ + GAEC_ADF_BSZ - GAEC_OFF4));
mvmm ar4, ar5
mar *+ar5(#(GAEC_RCV_SZ*GAEC_BANDS))
;
stm #(GAEC_BANDS-1)-1, ar0
A36
stm #(GAEC_SECTIONS4 - 1), ar6
call _gaec_adapt_ac4_core
mar *+ar3(#(GAEC_ADF_SZ - GAEC_SECTIONS4*GAEC_SECTION_SZ)*2)
mar *+ar4(#(GAEC_SECTIONS4*GAEC_SECTION_SZ + GAEC_RCV_SZ))
mar *+ar5(#(GAEC_SECTIONS4*GAEC_SECTION_SZ + GAEC_RCV_SZ))
banz A36, *ar0-
;
andm #~0x1, *(pmst)
popm ar7
popm ar6
popm ar1
ret
.sect ".smcode"
;-------------------------------------------------------------------------
.global _gaec_adapt_dc4_core
;-------------------------------------------------------------------------
_gaec_adapt_dc4_core
; S16 *psAdf = ar3
; S16 *psRcv = ar4
; S16 *psTmp = ar5
; asTmp = [tx, sErr1, sErr2]
; (GAEC_SECTIONSX - 1) = ar2
;
; this is a self-modifying code.
;
frame #-1
ld *ar5+, b
;
; set first shift (tx-16) in 'ld a, tx-16, a'
sub #16, b, a
and #0x001f, a
or #0xf440, a
stl a, *sp(0)
mvdp *sp(0), A10S + 5
;
; set second shift (16-tx) in 'sth a, 15-tx, *ar3+0%
sub #16, b, a
neg a
or #0x9ad0, a
stl a, *sp(0)
; stl a, 0, *ar3+0% instead of sth a, 16, *ar3+0%, which is not valid
xc 2, beq
st #0x98d0, *sp(0)
mvdp *sp(0), A10S + 8
;
; go
stm #2, ar0
stm #0, bk
A10S
stm #GAEC_SECTION_SZ-1, brc
rptb A10E-1
ldr *ar3, a
ld a, -6, a
rpt #(GAEC_BLKS-1)
mac *ar4+, *ar5+, a
sth a, 6, *ar3+0%
mar *+ar4(#-(GAEC_BLKS+1))
mar *+ar5(#-GAEC_BLKS)
A10E
stm #_DEXP, t
stm #GAEC_BLKS-1, brc
rptb A10EE - 1
mpy *ar5, b
add #1, 14, b
sth b, 1, *ar5+
A10EE
mar *+ar5(#-GAEC_BLKS)
banz A10S, *ar2-
frame #1
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_ac4_core
;-------------------------------------------------------------------------
_gaec_adapt_ac4_core
ld *ar1+, b
frame #-1
;
; set shift (tx-16) in 'ld a, tx-16, a'
sub #16, b, a
and #0x001f, a
or #0xf440, a
stl a, *sp(0)
mvdp *sp(0), A20S + 6
; set shift (tx-16) in 'ld b, tx-16, b'
sub #16, b, a
and #0x001f, a
or #0xf740, a
stl a, *sp(0)
mvdp *sp(0), A20S + 7
;
; set shift (16-tx) in 'sth a, 16-tx, *ar3+
sub #16, b, a
neg a
or #0x9a90, a
stl a, *sp(0)
; stl a, 0, *ar3+0% instead of sth a, 16, *ar3+0%, which is not valid
xc 2, beq
st #0x9890, *sp(0)
mvdp *sp(0), A20S + 24
;
; set shift (16-tx) in 'sth b, 16-tx, *ar3+
sub #16, b, a
neg a
or #0x9b90, a
stl a, *sp(0)
; stl a, 0, *ar3+0% instead of sth b, 16, *ar3+, which is not valid
xc 2, beq
st #0x9990, *sp(0)
mvdp *sp(0), A20S + 25
;
; set ptrs
mvmm ar1, ar2
mar *+ar1(#2*GAEC_BLKS)
A20S
stm #GAEC_SECTION_SZ-1, brc
rptb A20E-1
ldr *ar3+, a ;[4]
ldr *ar3-, b
ld a, -6, a ;[6]
ld b, -6, b
.loop GAEC_BLKS
mac *ar4, *ar2, a ; [8]
mac *ar5, *ar2+, b
mac *ar5+, *ar2, a
mas *ar4+, *ar2+, b
.endloop
sth a, 6, *ar3+ ; [24]
sth b, 6, *ar3+
mar *+ar2(-GAEC_BLKS*2)
mar *+ar4(-GAEC_BLKS-1)
mar *+ar5(-GAEC_BLKS-1)
A20E
ld *ar1, t
stm #(2*GAEC_BLKS-1), brc
rptb A20EE-1
mpy *ar2, a
add #1, 14, a
sth a, 1, *ar2+
A20EE
mar *+ar2(#-2*GAEC_BLKS)
banz A20S, *ar6-
mar *ar1+
frame #1
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -