📄 gaeca2a.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"
_ADJ .set (2)
_ADJSS .set (_ADJ)
_DEXP .set (22937) ; Q15(0.7)
;-------------------------------------------------------------------------
.global _gaec_get_energy2
;-------------------------------------------------------------------------
_gaec_get_energy2
;
; GAEC_tDb *pDb = a
; S16 blk = sp(1)
;
stlm a, ar2
ssbx sxm
nop
mvdk *sp(1), ar0
;
; psRcvI = ar3
mvdk *ar2(#(GAEC_tDb.psRcv)), ar3
mar *+ar3(#(GAEC_ADF_BSZ-GAEC_OFF2))
mar *ar3+0
;
; psRcvQ = ar4
mvmm ar3, ar4
mar *+ar4(#(GAEC_BANDS*GAEC_RCV_SZ))
;
; pDb->aslEn2 = ar5
mvmm ar2, ar5
mar *+ar5(#(GAEC_tDb.aslEn2))
;
; set ptr increment
stm #GAEC_RCV_SZ, ar0
;
; band 0
dld *ar5, a
sub a, -5, a
squr *ar3+0, b
add b, -2, b
add b, -_ADJ, a
dst a, *ar5+
mar *ar4+0
;
; bands 1..BANDS-1
stm #GAEC_BANDS-1-1, brc
rptb L01-1
dld *ar5, a
sub a, -5, a
squr *ar3+0, b
squra *ar4+0, b
add b, -2, b
add b, -_ADJ, a
dst a, *ar5+
L01
;
; band BANDS
dld *ar5, a
sub a, -5, a
squr *ar3+0, b
add b, -2, b
add b, -_ADJ, a
dst a, *ar5+
ret
;-------------------------------------------------------------------------
.global __invert
;-------------------------------------------------------------------------
__invert
; S32 *pslEn = a
; S16 sStepSz = sp(1)
; return a
;
;
stlm a, ar2
ssbx sxm
nop
frame #-2
dld *ar2, a
exp a
nop
norm a
st t, *sp(1)
ld a, -16, a
ld #1,15, b
sub a, b
stl b, *sp(0)
ld #16020, a
add *sp(0), -1, a
squr *sp(0), b
add b, -15, a
ld a, 8, a
ld a, 8, a
mpya *sp(3)
add #(1<<11), b
ld b, -12, b
dst b, *ar2
ld #30, a
sub *sp(1), a;
nop
nop
frame #2
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_dc2p
;-------------------------------------------------------------------------
_gaec_adapt_dc2p
; GAEC_tDb *pDb = a;
; GAEC_tSc *pSc = sp(1)
; S16 blk = sp(2)
; S16 band = sp(3)
;
pshm ar1
pshm ar6
pshm ar7
stlm a, ar2
ssbx sxm
orm #1, *(pmst)
mvdk *sp(1+3), ar3
mvdk *sp(2+3), ar0
cmpm *sp(3+3), #0
;
; set pointers
mvmm ar3, ar4
mar *+ar4(#(GAEC_tSc.asSSC))
mvmm ar2, ar5
mar *+ar5(#(GAEC_tDb.aslEn2))
mvmm ar2, ar6
mar *+ar6(#(GAEC_tDb.aslAdEn))
mvmm ar3, ar7
mar *+ar7(#(GAEC_tSc.aasErr))
mar *ar7+0
mvmm ar3, ar1
mar *+ar1(#(GAEC_tSc.u.aA2))
;
; adjust pointers if band == BANDS
bc B20, tc
mar *+ar4(#(GAEC_BANDS))
mar *+ar5(#(GAEC_BANDS*2))
mar *+ar6(#(GAEC_BANDS*2))
mar *+ar7(#(GAEC_BANDS*GAEC_BLKS))
B20
ld *ar4, a
bc B21, aeq;
ld #(_ADJSS+1), a
call _gaec_adapt_pre
mpy *ar7+, b
ld b, asm, b
add #1, 14, b
sth b, 1, *ar1+
B21
andm #~1, *(pmst)
popm ar7
popm ar6
popm ar1
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_dc2d
;-------------------------------------------------------------------------
_gaec_adapt_dc2d
; GAEC_tDb *pDb = a;
; GAEC_tSc *pSc = sp(1)
; S16 blk = sp(2)
; S16 band = sp(3)
;
stlm a, ar2
ssbx sxm
nop
orm #1, *(pmst)
mvdk *sp(1), ar5
mvdk *sp(2), ar0
cmpm *sp(3), #0
;
; set up ptrs
; ar0 = blk
; ar2 = sections
; ar3 = psAdf
; ar4 = psRcv
; ar5 = pA2
;
mar *+ar5(#(GAEC_tSc.u.aA2))
mvdk *ar2(#(GAEC_tDb.psAdf)), ar3
mar *+ar3(#(GAEC_OFF2*2))
mvdk *ar2(#(GAEC_tDb.psRcv)), ar4;
mar *+ar4(#(GAEC_ADF_BSZ - GAEC_OFF2));
mar *ar4+0
stm #(GAEC_SECTIONS2 - 1), ar2
; tc is still (band == 0)
bc B26, tc
mar *ar3+
mar *+ar4(#(GAEC_BANDS*GAEC_RCV_SZ))
B26
call _gaec_adapt_dc2_core
andm #~1, *(pmst)
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_ac2p
;-------------------------------------------------------------------------
_gaec_adapt_ac2p
; GAEC_tDb *pDb = a;
; GAEC_tSc *pSc = sp(1)
; S16 blk = sp(2)
;
pshm ar1
pshm ar6
pshm ar7
stlm a, ar2
ssbx sxm
orm #0x1, *(pmst)
mvdk *sp(1+3), ar3
mvdk *sp(2+3), ar0
;
; ptr assignment
;
; ar0 = blk
; ar1 = pSc->u.aA2[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.aslEn2+2));
mvmm ar2, ar6
mar *+ar6(#(GAEC_tDb.aslAdEn+2));
mvmm ar3, ar7
mar *+ar7(#(GAEC_tSc.aasErr+GAEC_BLKS));
mar *ar7+0
mvmm ar3, ar1
mar *+ar1(#(GAEC_tSc.u.aA2))
stm #GAEC_BANDS-1-1, brc
rptb B35-1
ld *ar4, a
bc B34, aeq;
ld #_ADJSS, a
call _gaec_adapt_pre
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+
st #_DEXP, *ar1+
mar *+ar1(#(-GAEC_tScA2_Sz))
B34
; ptr increment
mar *+ar1(#GAEC_tScA2_Sz)
mar *ar4+
mar *+ar5(#2)
mar *+ar6(#2)
mar *+ar7(#GAEC_BLKS) ; next band
B35
andm #~0x1, *(pmst)
popm ar7
popm ar6
popm ar1
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_ac2d
;-------------------------------------------------------------------------
_gaec_adapt_ac2d
; GAEC_tDb *pDb = a;
; GAEC_tSc *pSc = sp(1)
; S16 blk = sp(2)
;
pshm ar1
pshm ar6
pshm ar7
stlm a, ar2
ssbx sxm
orm #0x1, *(pmst)
mvdk *sp(1+3), ar1
mvdk *sp(2+3), ar0
;
; set up ptrs for adaptation
;
; ar0 = blk
; ar1 = pSc->u.aA2 [ tx, sErrI, sErrQ, Dexp ]
; ar2 = psErr (pSc->asTmp[..]), both ErrI & ErrQ
; ar3 = psAdf
; ar4 = psRcvI
; ar5 = psRcvQ
; ar6 = loop cntr (sections)
; ar7 = loop cntr (bands)
;
mar *+ar1(#(GAEC_tSc.u.aA2))
mvdk *ar2(#(GAEC_tDb.psAdf)), ar3
mar *+ar3(#((GAEC_OFF2+GAEC_ADF_SZ)*2))
mvdk *ar2(#(GAEC_tDb.psRcv)), ar4;
mar *+ar4(#(GAEC_RCV_SZ + GAEC_ADF_BSZ - GAEC_OFF2));
mar *ar4+0;
mvmm ar4, ar5
mar *+ar5(#(GAEC_RCV_SZ*GAEC_BANDS))
stm #(GAEC_BANDS-2), ar7
B36
stm #(GAEC_SECTIONS2 - 1), ar6
call _gaec_adapt_ac_core
mar *+ar3(#(GAEC_ADF_SZ - GAEC_SECTIONS2*GAEC_SECTION_SZ)*2)
mar *+ar4(#(GAEC_SECTIONS2*GAEC_SECTION_SZ + GAEC_RCV_SZ))
mar *+ar5(#(GAEC_SECTIONS2*GAEC_SECTION_SZ + GAEC_RCV_SZ))
banz B36, *ar7-
andm #~0x1, *(pmst)
popm ar7
popm ar6
popm ar1
ret
.sect ".smcode"
;-------------------------------------------------------------------------
.global _gaec_adapt_dc2_core
;-------------------------------------------------------------------------
_gaec_adapt_dc2_core
frame #-1
; S16 *psAdf = ar3
; S16 *psRcv = ar4
; S16 *psTmp = ar5
; asTmp = [tx, sErr]
; (GAEC_SECTIONSX - 1) = ar2
;
; this is a self-modifying code.
;
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), B10S + 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), B10S + 7
;
; go
stm #2, ar0
stm #0, bk
B10S
stm #GAEC_SECTION_SZ-1, brc
rptb B10E-1
ldr *ar3, a
ld a, -6, a
mac *ar4-, *ar5, a
sth a, 6, *ar3+0%
B10E
stm #_DEXP, t
mpy *ar5, b
add #1, 14, b
sth b, 1, *ar5
banz B10S, *ar2-
frame #1
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_ac_core
;-------------------------------------------------------------------------
_gaec_adapt_ac_core
ld *ar1+, b
frame #-1 ; give space for internal vars of gaec_adapt_core
;
; 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), B20S + 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), B20S + 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), B20S + 12
;
; 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), B20S + 13
;
; set ptrs
mvmm ar1, ar2
mar *+ar1(#2)
B20S
stm #GAEC_SECTION_SZ-1, brc
rptb B20E-1
ldr *ar3+, a ;[4]
ldr *ar3-, b
ld a, -6, a ;[6]
ld b, -6, b
mac *ar4, *ar2, a
mac *ar5, *ar2+, b
mac *ar5-, *ar2, a
mas *ar4-, *ar2-, b
sth a, 6, *ar3+ ; [10]
sth b, 6, *ar3+
B20E
ld *ar1, t
mpy *ar2, a
add #1, 14, a
sth a, 1, *ar2+
mpy *ar2, a
add #1, 14, a
sth a, 1, *ar2-
banz B20S, *ar6-
mar *ar1+
frame #1
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -