📄 gaeca3a.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+1)
_DEXP .set (26214) ; Q15(0.8)
;-------------------------------------------------------------------------
.global _gaec_get_energy3
;-------------------------------------------------------------------------
_gaec_get_energy3
;
; 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_OFF3))
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.aslEn3))
;
; 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 _gaec_adapt_dc3p
;-------------------------------------------------------------------------
_gaec_adapt_dc3p
; GAEC_tDb *pDb = a;
; GAEC_tSc *pSc = sp(1)
; S16 blk = sp(2)
; S16 band = sp(3)
;
stlm a, ar2
ssbx sxm
nop
mvdk *sp(1), ar3
mvdk *sp(2), ar0
cmpm *sp(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.aslEn3))
pshm ar7
pshm ar6
pshm ar1
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.aA3))
;
; adjust pointers if band == BANDS
bc C20, tc
mar *+ar4(#(GAEC_BANDS))
mar *+ar5(#(GAEC_BANDS*2))
mar *+ar6(#(GAEC_BANDS*2))
mar *+ar7(#(GAEC_BANDS*GAEC_BLKS))
C20
ld *ar4, a
bc C25, aeq;
ld #_ADJSS, a
call _gaec_adapt_pre
orm #1, *(pmst)
stm #2-1, brc
rptb C24-1
mpy *ar7+, b
ld b, asm, b
add #1, 14, b
sth b, 1, *ar1+
C24
andm #~1, *(pmst)
C25
popm ar1
popm ar6
popm ar7
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_dc3d
;-------------------------------------------------------------------------
_gaec_adapt_dc3d
; GAEC_tDb *pDb = a;
; GAEC_tSc *pSc = sp(1)
; S16 blk = sp(2)
; S16 band = sp(3)
;
stlm a, ar2
ssbx sxm
orm #1, *(pmst)
mvdk *sp(1), ar5
mvdk *sp(2), ar0
cmpm *sp(3), #0
;
; set up ptrs
; ar0 = blk
; ar2 = pDb, sections
; ar3 = paAdf
; ar4 = psRcv
; ar5 = pSc->u.aA3
;
mar *+ar5(#(GAEC_tSc.u.aA3));
mvdk *ar2(#(GAEC_tDb.psAdf)), ar3
mar *+ar3(#(GAEC_OFF3*2)) ; ar3 = psAdf
mvdk *ar2(#(GAEC_tDb.psRcv)), ar4; ; ar4 = psRcv
mar *+ar4(#(GAEC_ADF_BSZ - GAEC_OFF3));
mar *ar4+0
stm #(GAEC_SECTIONS3 - 1), ar2
; tc is (band == 0)
bc C26, tc
mar *ar3+
mar *+ar4(#(GAEC_BANDS*GAEC_RCV_SZ))
C26
call _gaec_adapt_dc3_core
andm #~1, *(pmst)
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_ac3p
;-------------------------------------------------------------------------
_gaec_adapt_ac3p
; 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.aA3[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.aslEn3+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.aA3))
stm #(GAEC_BANDS-1)-1, brc
rptb C35-1
ld *ar4, a
bc C34, aeq;
ld #_ADJSS, a
call _gaec_adapt_pre
.loop 2
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+
.endloop
mar *+ar7(#-2)
st #_DEXP, *ar1+
mar *+ar1(#(-GAEC_tScA3_Sz))
C34
;
; ptr increment - to the next band
mar *+ar1(#GAEC_tScA3_Sz); pA3
mar *ar4+ ; asSSC
mar *+ar5(#2) ; aslEn3
mar *+ar6(#2) ; aslAdEn
mar *+ar7(#GAEC_BLKS) ; aasErr
C35
andm #~0x1, *(pmst)
popm ar7
popm ar6
popm ar1
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_ac3d
;-------------------------------------------------------------------------
_gaec_adapt_ac3d
; 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.aA3 [ tx, sErr1I, sErr1Q, sErr2I, sErr2Q, 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.aA3))
mvdk *ar2(#(GAEC_tDb.psAdf)), ar3
mar *+ar3(#((GAEC_OFF3+GAEC_ADF_SZ)*2))
mvdk *ar2(#(GAEC_tDb.psRcv)), ar4;
mar *+ar4(#(GAEC_RCV_SZ + GAEC_ADF_BSZ - GAEC_OFF3));
mar *ar4+0;
mvmm ar4, ar5
mar *+ar5(#(GAEC_RCV_SZ*GAEC_BANDS))
stm #(GAEC_BANDS-2), ar7
C36
stm #(GAEC_SECTIONS3 - 1), ar6
call _gaec_adapt_ac3_core
mar *+ar3(#(GAEC_ADF_SZ - GAEC_SECTIONS3*GAEC_SECTION_SZ)*2)
mar *+ar4(#(GAEC_SECTIONS3*GAEC_SECTION_SZ + GAEC_RCV_SZ))
mar *+ar5(#(GAEC_SECTIONS3*GAEC_SECTION_SZ + GAEC_RCV_SZ))
banz C36, *ar7-
andm #~0x1, *(pmst)
popm ar7
popm ar6
popm ar1
ret
.sect ".smcode"
;-------------------------------------------------------------------------
.global _gaec_adapt_dc3_core
;-------------------------------------------------------------------------
_gaec_adapt_dc3_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), C10S + 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), C10S + 8
;
; go
stm #2, ar0
stm #0, bk
C10S
stm #GAEC_SECTION_SZ-1, brc
rptb C10E-1
ldr *ar3, a
ld a, -6, a
mac *ar4+, *ar5+, a
mac *ar4-, *ar5-, a
sth a, 6, *ar3+0%
mar *ar4-
C10E
stm #_DEXP, t
mpy *ar5, b
add #1, 14, b
sth b, 1, *ar5+
mpy *ar5, b
add #1, 14, b
sth b, 1, *ar5-
banz C10S, *ar2-
frame #1
ret
;-------------------------------------------------------------------------
.global _gaec_adapt_ac3_core
;-------------------------------------------------------------------------
_gaec_adapt_ac3_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), C20S + 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), C20S + 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), C20S + 16
;
; 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), C20S + 17
;
; set ptrs
mvmm ar1, ar2
mar *+ar1(#4)
stm #-3, ar0
stm #0, bk
C20S
stm #GAEC_SECTION_SZ-1, brc
rptb C20E-1
ldr *ar3+, a ;[4]
ldr *ar3-, b
ld a, -6, a ;[6]
ld b, -6, b
mac *ar4, *ar2, a ; [8]
mac *ar5, *ar2+, b
mac *ar5+, *ar2, a
mas *ar4+, *ar2+, b
mac *ar4, *ar2, a ; [12]
mac *ar5, *ar2+, b
mac *ar5-, *ar2, a
mas *ar4-, *ar2+0%, b
sth a, 6, *ar3+ ; [16]
sth b, 6, *ar3+
mar *ar4-
mar *ar5-
C20E
ld *ar1, t
stm #(4-1), brc
rptb C20EE-1
mpy *ar2, a
add #1, 14, a
sth a, 1, *ar2+
C20EE
mar *+ar2(#-4)
banz C20S, *ar6-
mar *ar1+
frame #1
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -