📄 gaeca4a.s55
字号:
pshboth(xar5);
pshboth(xar6);
push(t2);
push(t3);
ac3 = *ar1(#(GAEC_tSc.asSSC))
if (ac3 == #0) goto L03;
ac0 = dbl(*ar0(#(GAEC_tDb.aslEn4)))
ac1 = dbl(*ar0(#(GAEC_tDb.aslAdEn)))
ac1 = ac1 + (ac0 << #-4);
ac2 = #GAEC_ADEN_BASE << #GAEC_ADEN_SHFT;
ac1 = min(ac2, ac1);
dbl(*ar0(#(GAEC_tDb.aslAdEn))) = ac1;
ac0 = ac0 + ac1;
; invert here, put it into t2
ac0 = mant(ac0), t2 = -exp(ac0);
ac1 = ac0 - (#32767 << #16);
ac0 = #16020 << #16;
ac0 = ac0 - (ac1 << #-1);
ac1 = ac1 * ac1;
ac0 = ac0 + (ac1 << #1);
ac0 = ac0 * *ar1(#(GAEC_tSc.asSSC));
ac0 = ac0 + (#1 << #11);
ac0 = ac0 << #4;
t2 = #30 + t2;
brc0 = #(GAEC_BLKS-1);
xar3 = mar(*ar1(#(GAEC_tSc.aasErr)));
xar2 = mar(*ar1(#(GAEC_tSc.asNormErr)));
localrepeat {
ac1 = ac0 * *ar3+;
*ar2+ = HI(rnd(ac1 << #1));
}
mar(ar2 - #(GAEC_BLKS))
;
; set up ptrs
xar4 = mar(*ar0(#(GAEC_tDb.asAdf))) ; ar4 = psAdf
xar5 = dbl(*ar0(#(GAEC_tDb.psRcv))); ; ar5 = psRcv
mar(ar5 + #(GAEC_ADF_BSZ));
;
; the merging point for band 0 and band GAEC_BANDS
L10
xar6 = mar(*ar1(#(GAEC_tSc.asTmp)));
;
; set up shifts
t1 = #2; ; t1 = moving between Adf
t2 = t2 - #11; ; t2 = adf loading shift
ac3 = t2 - #15;
;
; accomodate dynamic range
if (ac3 <= #0) goto L01
t3 = ac3 - #16;
t3 = -t3; ; t3 = adf storing shift
brc0 = #(GAEC_BLKS-1);
localrepeat {
ac0 = *ar2;
*ar2+ = HI(saturate(rnd(ac0 << t3)));
}
mar (ar2 - #GAEC_BLKS);
t2 = #15;
t3 = #1;
|| goto L02
L01
t3 = t2 - #16;
t3 = -t3; ; t3 = adf storing shift
if (t2 > #0) goto L02
brc0 = #(GAEC_BLKS-1);
localrepeat {
ac0 = *ar2;
*ar2+ = HI(saturate(rnd(ac0 << t3)));
}
mar (ar2 - #GAEC_BLKS);
t2 = #0;
t3 = #16;
L02
;
; setup repeat counters
brc0 = #(4-1);
brc1 = #(GAEC_ADF_SZ/4-1);
*ar6 = #(27852); Q15(0.85) = 27852.8
t0 = #(1-GAEC_BLKS);
;
; the loop
localrepeat {
localrepeat {
ac0 = *ar4 << t2;
.loop (GAEC_BLKS-1);
ac0 = ac0 + (*ar2+ * *ar5+);
.endloop
ac0 = ac0 + (*(ar2+t0) * *(ar5+t0));
*(ar4+t1) = HI(saturate(rnd(ac0 << t3)));
mar (*ar5-);
}
.loop (GAEC_BLKS-1)
ac0 = *ar2 * *ar6;
*ar2+ = HI(rnd(ac0 << #1));
.endloop
ac0 = *ar2 * *ar6;
*(ar2+t0) = HI(rnd(ac0 << #1));
}
L03
t3 = pop();
t2 = pop();
xar6 = popboth();
xar5 = popboth();
.arms_on
bit(ST2, #ST2_ARMS) = #1;
return;
;-------------------------------------------------------------------------
.global __adapt_dc4B
;-------------------------------------------------------------------------
; band GAEC_BANDS
__adapt_dc4B
; GAEC_tDb *pDb = ar0
; GAEC_tSc *pSc = ar1
;
; input parameters are not modified
;
; if band = GAEC_BANDS;
.arms_off
bit(ST2, #ST2_ARMS) = #0;
pshboth(xar5);
pshboth(xar6);
push(t2);
push(t3);
ac3 = *ar1(#(GAEC_tSc.asSSC+GAEC_BANDS))
if (ac3 == #0) goto L03;
ac0 = dbl(*ar0(#(GAEC_tDb.aslEn4+GAEC_BANDS*2)))
ac1 = dbl(*ar0(#(GAEC_tDb.aslAdEn+GAEC_BANDS*2)))
ac1 = ac1 + (ac0 << #-4);
ac2 = #GAEC_ADEN_BASE << #GAEC_ADEN_SHFT;
ac1 = min(ac2, ac1);
dbl(*ar0(#(GAEC_tDb.aslAdEn+GAEC_BANDS*2))) = ac1;
ac0 = ac0 + ac1;
; invert here, put it into t2
ac0 = mant(ac0), t2 = -exp(ac0);
ac1 = ac0 - (#32767 << #16);
ac0 = #16020 << #16;
ac0 = ac0 - (ac1 << #-1);
ac1 = ac1 * ac1;
ac0 = ac0 + (ac1 << #1);
ac0 = ac0 * *ar1(#(GAEC_tSc.asSSC+GAEC_BANDS));
ac0 = ac0 + (#1 << #11);
ac0 = ac0 << #4;
t2 = #30 + t2;
brc0 = #(GAEC_BLKS-1);
xar3 = mar(*ar1(#(GAEC_tSc.aasErr+GAEC_BLKS*GAEC_BANDS)));
xar2 = mar(*ar1(#(GAEC_tSc.asNormErr)));
localrepeat {
ac1 = ac0 * *ar3+;
*ar2+ = HI(rnd(ac1 << #1));
}
mar(ar2 - #(GAEC_BLKS))
;
; set up ptrs
xar4 = mar(*ar0(#(GAEC_tDb.asAdf+1))) ; ar4 = psAdf
xar5 = dbl(*ar0(#(GAEC_tDb.psRcv))); ; ar5 = psRcv
mar (*+ar5(#(GAEC_BANDS*GAEC_RCV_SZ + GAEC_ADF_BSZ)));
goto L10 ; merge with band 0 code stream
;-------------------------------------------------------------------------
.global __adapt_ac4A
; .sym __adapt_ac4A, __adapt_ac4A, 32, 2, 0
;-------------------------------------------------------------------------
__adapt_ac4A
; GAEC_tDb *pDb = ar0
; GAEC_tSc *pSc = ar1
;
; input parameters are NOT modified
;
.arms_off
bit(ST2, #ST2_ARMS) = #0;
pshboth(xar5);
pshboth(xar6);
push(t2);
push(t3);
; let's preset pointers
xar2 = mar(*ar1(#(GAEC_tSc.asSSC+1)))
xar3 = mar(*ar0(#(GAEC_tDb.aslEn4+2)))
xar4 = mar(*ar0(#(GAEC_tDb.aslAdEn+2)))
xar5 = mar(*ar1(#(GAEC_tSc.aasErr+GAEC_BLKS)))
xar6 = mar(*ar1(#(GAEC_tSc.asTmp))) ; for asNormErr
ac2 = #GAEC_ADEN_BASE << #GAEC_ADEN_SHFT;
t1 = #(GAEC_BLKS*GAEC_BANDS);
brc0 = #(GAEC_BANDS-2);
brc1 = #(GAEC_BLKS-1);
blockrepeat {
ac3 = *ar2;
; if step size != 0
ac0 = dbl(*ar3+);
ac1 = dbl(*ar4);
ac1 = ac1 + (ac0 << #-4);
ac1 = min(ac2, ac1);
if (ac3 != #0) execute (D_unit) ; do not update AdEn if not valid
|| dbl(*ar4+) = ac1;
ac0 = ac0 + ac1;
; invert here, put it into t2
ac0 = mant(ac0), t2 = -exp(ac0);
ac1 = ac0 - (#32767 << #16);
ac0 = #16020 << #16;
ac0 = ac0 - (ac1 << #-1);
ac1 = ac1 * ac1;
ac0 = ac0 + (ac1 << #1);
ac0 = ac0 * *ar2+;
ac0 = ac0 << #4;
ac0 = rnd(ac0)
|| t2 = #(30-11) + t2;
*ar6+ = t2;
localrepeat {
ac1 = ac0 * *(ar5 + t1);
*ar6+ = HI(rnd(ac1 << #1));
ac1 = ac0 * *(ar5 - t1);
*ar6+ = HI(rnd(ac1 << #1));
mar(*ar5+);
}
*ar6+ = #(27852); // Q15(0.75)
}
;;;;;;;;; goto L24 - dbg
;
; setup ptrs initially
;
; ar2 = band counter
; ar3 -> Adf
; ar4 -> RcvI
; ar5 -> RcvQ
; ar6 -> Tmp (precalculated& stored vars)
; cdp -> NormErr
;
xar2 = #(GAEC_BANDS-2);
xar3 = mar(*ar0(#(GAEC_tDb.asAdf+GAEC_ADF_SZ*2))) ; ar4 = psAdf
xar4 = dbl(*ar0(#(GAEC_tDb.psRcv))); ; ar5 = psRcv
mar (*+ar4(#(GAEC_RCV_SZ + GAEC_ADF_BSZ)));
xar5 = mar(*ar4(#(GAEC_RCV_SZ*GAEC_BANDS)))
xar6 = mar(*ar1(#(GAEC_tSc.asTmp)));
xcdp = mar(*ar1(#(GAEC_tSc.asNormErr)))
L23
;
; load shifts
t2 = *ar6+; ; t2 = adf loading shift
ac3 = t2 - #15;
;
; recover NormErr
repeat (#(GAEC_BLKS*2-1));
coef(*cdp+) = *ar6+;
mar (*+cdp(#(-GAEC_BLKS*2)));
;
; set up shifts and adjust NormErr
if (ac3 <= #0) goto L21
; if tx > 15
brc0 = #(GAEC_BLKS*2-1);
t3 = ac3 - #16;
t3 = -t3; ; t3 = adf storing shift
localrepeat {
ac0 = *cdp;
*cdp+ = HI(saturate(rnd(ac0<<t3)));
}
mar (*+cdp(#(-GAEC_BLKS*2)));
t2 = #15;
t3 = #1;
goto L22
L21
t3 = t2 - #16;
t3 = -t3; ; t3 = adf storing shift
if (t2 >= #0) goto L22
; if tx < 0
brc0 = #(GAEC_BLKS*2-1);
localrepeat {
ac0 = *cdp;
*cdp+ = HI(saturate(rnd(ac0<<t3)));
}
mar (*+cdp(#(-GAEC_BLKS*2)));
t2 = #0;
t3 = #16;
L22
;
; setup block repeat counters
brc0 = #(4-1);
brc1 = #(GAEC_ADF_SZ/4-1);
t1 = #(1+GAEC_BLKS);
t0 = #(-GAEC_BLKS*2);
;
; the loop
blockrepeat {
localrepeat {
ac0 = *ar3+ << t2;
ac1 = *ar3- << t2;
.loop (GAEC_BLKS);
ac0 = ac0 + (*ar4 * coef(*cdp+)),
ac1 = ac1 + (*ar5 * coef(*cdp+));
ac1 = ac1 - (*ar4+ * coef(*cdp+)),
ac0 = ac0 + (*ar5+ * coef(*cdp+));
.endloop
mar (*(ar4-t1)), mar(*(ar5-t1)), mar(coef(*(cdp+t0)));
*ar3+ = HI(saturate(rnd(ac0 << t3)));
*ar3+ = HI(saturate(rnd(ac1 << t3)));
}
.loop (GAEC_BLKS*2)
ac0 = *ar6 * coef(*cdp);
*cdp+ = HI(rnd(ac0 << #1));
.endloop
mar (*ar4), mar(*ar5), mar(coef(*(cdp+t0)));
}
; advance to the next band
; psAdf is advanced automatically
mar (ar4 + #(GAEC_RCV_SZ + GAEC_ADF_SZ)); psRcvI
mar (ar5 + #(GAEC_RCV_SZ + GAEC_ADF_SZ)); psRcvI
mar (ar6 + #1);
if (*ar2- != #0) goto L23
L24
t3 = pop();
t2 = pop();
xar6 = popboth();
xar5 = popboth();
.arms_on
bit(ST2, #ST2_ARMS) = #1;
return;
.if 1
;-------------------------------------------------------------------------
.global _GAEC_adapt4
; .sym _GAEC_adapt4, _GAEC_adapt4, 32, 2, 0
;-------------------------------------------------------------------------
_GAEC_adapt4
call _GAEC_update_energy4
call __adapt_dc4A
call __adapt_dc4B
goto __adapt_ac4A
.endif
.endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -