📄 update.asm
字号:
.title "update.asm"
.mmregs
.include "g723_stat.asm"
.include "g723tab_h.asm"
.include "g723_global.asm"
;-------------------------------------------------------------------
;/*
; * update()
; *
; * updates the state variables for each output code
; */
;void
;update(
; int code_size, /* distinguish 723_40 with others */
; int y, /* quantizer step size */
; int wi, /* scale factor multiplier */
; int fi, /* for long/short term energies */
; int dq, /* quantized prediction difference */
; int sr, /* reconstructed signal */
; int dqsez, /* difference from 2-pole predictor */
; struct g723_state *state_ptr) /* coder state pointer */
;{
; int cnt;
; short mag, exp; // mant; /* Adaptive predictor, FLOAT A */
; short a2p; /* LIMC */
; short a1ul; /* UPA1 */
; short /*ua2*/ pks1; /* UPA2 */
; short /*uga2a*/ fa1;
;// short uga2b;
; char tr; /* tone/transition detector */
; short ylint, thr2, dqthr;
; short ylfrac, thr1;
; short pk0;
;-------------------------------------------------------------------------
; pk0 = (dqsez < 0) ? 1 : 0; /* needed in updating predictor poles */
;
; mag = dq & 0x7FFF; /* prediction difference magnitude */
;--------------------------------------------------------------------------
temp_mag .set 0
temp_pk0 .set 1
temp_i .set 2
temp_thr2 .set 3
temp_tr .set 4
temp_pks1 .set 5
temp_dqsez .set 6
temp_a2p .set 7
temp_y .set 8
temp_exp .set 9
temp_dqthr .set 10
;AR4->y, wi=witab[i], fi=fitab[i], B=i
;AR5->dq, AR6->sr, A=dqsez, AR7=state_ptr
.text
update:
frame #-11
nop
nop
mvmm AR7, AR2
stl A, *SP(temp_dqsez)
nop
nop
nop
nop
;mvmm AR7, AR2
stl B, *SP(temp_i)
st #0, *SP(temp_pk0)
ld *AR4, A
stl A, *SP(temp_y)
ld *SP(temp_dqsez), A
nop
nop
xc 2, ALT ;A=dqsez
st #1, *SP(temp_pk0)
ld *AR5, A
and #0x7fff, A
stl A, *SP(temp_mag)
;----------------------------------------------------------------------
; /* TRANS */
; ylint = state_ptr->yl >> 15; /* exponent part of yl */
; ylfrac = (state_ptr->yl >> 10) & 0x1F; /* fractional part of yl */
; thr1 = (32 + ylfrac) << ylint; /* threshold */
; thr2 = (ylint > 9) ? 31 << 10 : thr1; /* limit thr2 to 31 << 10 */
; dqthr = (thr2 + (thr2 >> 1)) >> 1; /* dqthr = 0.75 * thr2 */
; if (state_ptr->td == 0) /* signal supposed voice */
; tr = 0;
; else if (mag <= dqthr) /* supposed data, but small mag */
; tr = 0; /* treated as voice */
; else /* signal is data (modem) */
; tr = 1;
;-----------------------------------------------------------------------
dld *AR2, A
sfta A, -15
stlm A, T ;T = ylint
dld *AR7, A
sfta A, -10
and #0x1f, A
add #32, A
norm A ;A=thr1
ld A, B
ldm T, A ;A=ylint
sub #9, A
nop
nop
xc 2, AGT
ld #0x7f00, B ;B=thr2
ld B, A
add B, -1, A
sfta A, -1 ;A=dqthr
stl A, *SP(temp_dqthr)
mar *+AR2(td)
ld *AR2, A
bc tr1, ANEQ
ld #0, B ;if (state_ptr->td == 0)
b end_tr
tr1:
ld *SP(temp_dqthr), A
sub *SP(temp_mag), A
bc tr2, ALT
ld #0, B ;else if (mag <= dqthr)
b end_tr
tr2:
ld #1, B ;else tr = 1 B=tr
end_tr
stl B, *SP(temp_tr)
;----------------------------------------------------
; /* Quantizer scale factor adaptation.
; */
;
; /* FUNCTW & FILTD & DELAY */
; /* update non-steady state step size multiplier */
; state_ptr->yu = y + ((wi - y) >> 5);
;----------------------------------------------------
ld #tab_witab, A
add *SP(temp_i), A ;A->wi
stlm A, AR2
nop
nop
ld *AR4, B ;*AR4=y
ld *AR2, A ;
sub B, A
sfta A, -5
add *AR4, A ;A=state_ptr->yu
;---------------------------------------------------
; /* LIMB */
; if (state_ptr->yu < 544) /* 544 <= yu <= 5120 */
; state_ptr->yu = 544;
; else if (state_ptr->yu > 5120)
; state_ptr->yu = 5120;
;------------------------------------------------------------
sub #544, A
bcd yu1, AGEQ
add #544, A
ld #544, A
b end_yu
yu1:
sub #5120, A
bcd end_yu, ALEQ
add #5120, A
ld #5120, A
end_yu ; A=state_ptr->yu
mvmm AR7, AR2
mar *+AR2(yu)
stl A, *AR2
;-------------------------------------------------------------
; /* FILTE & DELAY */
; /* update steady state step size multiplier */
; state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6);
;-------------------------------------------------------------
dld *AR7, B
neg B
add B, -6, A
dadd *AR7, A ;A=state_ptr->yl
dst A, *AR7
;---------------------------------------------------------------
; /*
; * Adaptive predictor coefficients.
; */
; if (tr == 1) { /* reset a's and b's for modem signal */
; state_ptr->a[0] = 0;
; state_ptr->a[1] = 0;
; state_ptr->b[0] = 0;
; state_ptr->b[1] = 0;
; state_ptr->b[2] = 0;
; state_ptr->b[3] = 0;
; state_ptr->b[4] = 0;
; state_ptr->b[5] = 0;
; }
;----------------------------------------------------------------
ld *SP(temp_tr), B
sub #1, B
mvmm AR7, AR2
mar *+AR2(a)
mvmm AR7, AR3
mar *+AR3(b)
bc end_ab, BNEQ
rpt #1
st #0, *AR2+
rpt #5
st #0, *AR3+
;----------------------------------------------------------------
; else { /* update a's and b's */
; pks1 = pk0 ^ state_ptr->pk[0]; /* UPA2 */
;---------------------------------------------------------------
end_ab:
mvmm AR7, AR2
mar *+AR2(pk)
ld *SP(temp_pk0), B
xor *AR2, B
stl B, *SP(temp_pks1)
;---------------------------------------------------------------
; /* update predictor pole a[1] */
; a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7);
;---------------------------------------------------------------
mvmm AR7, AR2
mar *+AR2(a+1)
ld *AR2, A
sub *AR2-, -7, A ;A=a2p
stl A, *SP(temp_a2p)
;---------------------------------------------------------------
; if (dqsez != 0) {
; fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0];
; if (fa1 < -8191) /* a2p = function of fa1 */
; a2p -= 0x100;
; else if (fa1 > 8191)
; a2p += 0xFF;
; else
; a2p += fa1 >> 5;
;
; if (pk0 ^ state_ptr->pk[1])
; /* LIMC */
; if (a2p <= -12160)
; a2p = -12288;
; else if (a2p >= 12416)
; a2p = 12288;
; else
; a2p -= 0x80;
; else if (a2p <= -12416)
; a2p = -12288;
; else if (a2p >= 12160)
; a2p = 12288;
; else
; a2p += 0x80; }
;------------------------------------------------------------------------
ld *SP(temp_dqsez), B
bc dqsez00, BEQ
ld *SP(temp_pks1), B
ld *AR2, A ;*AR2= state_ptr->a[0]
nop
xc 1, BEQ
neg A
sub #-8192, A
ld *SP(temp_a2p), B
bcd fa1, AGEQ
add #-8192, A
sub #0x100, B ;B=a2p
b end_fa
fa1:
sub #8191, A
bcd fa2, ALEQ
add #8191, A
add #0xff, B
b end_fa
fa2:
add A, -5, B ;B=a2p
end_fa
stl B, *SP(temp_a2p)
mvmm AR7, AR2
mar *+AR2(pk+1) ;*AR2=state_ptr->pk[1]
ld *SP(temp_pk0), A
xor *AR2, A
bc a2p1, AEQ
sub #-12160, B
bcd a2p01, BGT
add #-12160, B
ld #-12288, B
b end_a2p
a2p01
sub #12416, B
bcd a2p02, BLT
add #12416, B
ld #12288, B
b end_a2p
a2p02
sub #0x80, B ;B=a2p
b end_a2p
a2p1:
sub #-12416, B
bcd a2p11, BGT
add #-12416, B
ld #-12288, B
b end_a2p
a2p11:
sub #12160, B
bcd a2p12, BLT
add #12160, B
ld #12288, B
b end_a2p
a2p12:
add #0x80, B
end_a2p
ld B, A ;A=a2p
stl A, *SP(temp_a2p)
;----------------------------------------
; /* TRIGB & DELAY */
; state_ptr->a[1] = a2p;
;---------------------------------------
dqsez00:
mvmm AR7, AR2
mar *+AR2(a+1)
stl A, *AR2- ;A=a2p
;-------------------------------------------------------
; /* UPA1 */
; /* update predictor pole a[0] */
; state_ptr->a[0] -= state_ptr->a[0] >> 8;
; if (dqsez != 0)
; if (pks1 == 0)
; state_ptr->a[0] += 192;
; else
; state_ptr->a[0] -= 192;
;-------------------------------------------------------
ld *AR2, A ;A=state_ptr->a[0]
sub *AR2, -8, A ;A=state_ptr->a[0]
; stl A, *AR2 ;A=state_ptr->a[0]
ld *SP(temp_dqsez), B
bc end_dqsez11, BEQ
ld *SP(temp_pks1), B
bc pks11, BNEQ
add #192, A
b end_dqsez11
pks11:
sub #192, A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -