📄 g723decoder.asm
字号:
.title "g723decoder.asm"
.include "g723_global.asm"
.include "g723tab_h.asm"
.include "g723_stat.asm"
.mmregs
;----------------------------------------------------------------------------
;void
;g723_40_decoder(
; short *wIn,
; short *wOut,
; struct g723_state *state_ptr)
;{
; short sezi, sei, sez, se; /* ACCUM */
; short y; //dif; /* MIX */
; short sr; /* ADDB */
; short dq;
; short dqsez;
; short i;
var_sl .set 0
var_sei .set var_sl+1
var_sezi .set var_sei+1
var_se .set var_sezi+1
var_sez .set var_se+1
var_d .set var_sez+1
var_y .set var_d+1
var_sr .set var_y+1
var_dqsez .set var_sr+1
var_dq .set var_dqsez+1
var_i .set var_dq+1
;ST1
;AR7
;AR6
;AR1
off_m .set -10
off_p .set 10
frame_size .set 14
;return address
wOut .set frame_size+1
state_ptr .set frame_size+2
.text
_g723_40_decoder:
pshm AR1
pshm AR6
pshm AR7
pshm ST1
frame #off_m
stlm A, AR2
ssbx CPL
ssbx SXM
ssbx OVM
ssbx FRCT
rsbx C16
mvdk *SP(wOut), AR1
mvdk *SP(state_ptr), AR7
;------------------------------------------------------------
; i = *wIn & 0x1f; /* mask to get proper bits */
; sezi = predictor_zero(state_ptr);
; sez = sezi >> 1;
; sei = sezi + predictor_pole(state_ptr);
; se = sei >> 1; /* se = estimated signal */
;------------------------------------------------------------
ld *AR2, A
and #0x1f, A
stl A, *SP(var_i)
mvmm SP, AR6
calld predictor_zero ;AR7=state_ptr
mar *+AR6(var_sezi) ;*AR6=var_sezi
ld *AR6, -1, A
stl A, *SP(var_sez)
call predictor_pole ;返回值放在A
add *SP(var_sezi), A ;A=sei
stl A, -1, *SP(var_se)
;-----------------------------------------------------------------
; y = step_size(state_ptr); /* adaptive quantizer step size */
;------------------------------------------------------------------
call step_size ;AR7=state_ptr ;返回值y = A
stl A, *SP(var_y)
;----------------------------------------------------------------------
; dq = reconstruct(i & 0x10, _dqlntab[i], y); /* estimation diff. */
;----------------------------------------------------------------------
ld #tab_dqlntab, B
ld *SP(var_i), A
add A, B ;B->dqlntab[i]
stlm B, AR3
and #0x10, A, A
stlm A, AR6 ;AR6=i & 0x10
ld *SP(var_y), A ;A->var_y
call reconstruct ;返回值=B
stl B, *SP(var_dq)
;---------------------------------------------------------------------------
; sr = (dq < 0) ? (se - (dq & 0x7FFF)) : (se + dq); /* reconst. signal */
;---------------------------------------------------------------------------
ld *SP(var_dq), A
bc a1, AGEQ
a0 ld #0x7fff, A
and *SP(var_dq), A
sub *SP(var_se), A
neg A
b enda1
a1: ld *SP(var_se), A
add *SP(var_dq), A
enda1:
stl A, *SP(var_sr)
;---------------------------------------------------------------------------
; dqsez = sr - se + sez; /* pole prediction diff. */
;---------------------------------------------------------------------------
add *SP(var_sez), A ;A=sr + sez
ld *SP(var_se), B
sub B, A ;A=dqsez
;---------------------------------------------------------------------------
; update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
;---------------------------------------------------------------------------
mvmm SP, AR4
mar *+AR4(var_y) ;AR4->var_y
mvmm SP, AR5
mar *+AR5(var_dq) ;AR5->var_dq
mvmm SP, AR6
ld *SP(var_i), B ;B=i
calld update ;AR7=state_ptr ;A=dqsez
mar *+AR6(var_sr) ;AR6->var_sr
;---------------------------------------------------------------------------
; *wOut= sr << 2; /* sr was of 14-bit dynamic range */
;
;}
ld *SP(var_sr), A
stl A, 2, *AR1
frame #off_p
popm ST1
popm AR7
popm AR6
popm AR1
ret
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -