📄 g723encoder.asm
字号:
.title "g723encoder.asm"
.include "g723_global.asm"
.include "g723tab_h.asm"
.include "g723_stat.asm"
.mmregs
;--------------------------------------------------------------
;void
;g723_40_encoder(
; short *wIn,
; short *wOut,
; struct g723_state *state_ptr)
;{
; short sei, sezi, se, sez; /* ACCUM */
; short d; /* SUBTA */
; short y; /* MIX */
; short sr; /* ADDB */
; short dqsez; /* ADDC */
; short dq;
; short i;
; int sl;
;--------------------------------------------------------------
var_sl .set 0
;var_sei .set var_sl+2
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;-11
off_p .set 10;11
frame_size .set 10+4
;return address
wOut .set frame_size+1
state_ptr .set frame_size+2
.text
_g723_40_encoder:
pshm AR1
pshm AR6
pshm AR7
pshm ST1
frame #off_m
stlm A, AR2
ssbx CPL
ssbx SXM
ssbx OVM
ssbx FRCT
rsbx C16
nop
mvdk *SP(wOut), AR1
mvdk *SP(state_ptr), AR7
;---------------------------------------------------------------
; sl = *wIn >> 2; /* sl of 14-bit dynamic range */
;-----------------------------------------------------------------
ld *AR2, -2, A
stl A, *SP(var_sl)
;----------------------------------------------------------------
; sezi = predictor_zero(state_ptr);
;--------------------------------------------------------------
mvmm SP, AR6
calld predictor_zero ;AR7=state_ptr
mar *+AR6(var_sezi) ;*AR6=var_sezi
;--------------------------------------------------------------
; sez = sezi >> 1;
;---------------------------------------------------------------
ld *AR6, -1, A
stl A, *SP(var_sez)
;---------------------------------------------------------------
; sei = sezi + predictor_pole(state_ptr);
;----------------------------------------------------------------
;AR7=state_ptr
call predictor_pole ;返回值放在A
add *SP(var_sezi), A ;A=sei
;----------------------------------------------------------------
; se = sei >> 1; /* se = estimated signal */
;----------------------------------------------------------------
stl A, -1, *SP(var_se)
;----------------------------------------------------------------
; d = sl - se; /* d = estimation difference */
;----------------------------------------------------------------
ld *SP(var_sl), A
sub *SP(var_se), A ; A = d
stl A, *SP(var_d)
;----------------------------------------------------------------
; /* quantize prediction difference */
; y = step_size(state_ptr); /* adaptive quantizer step size */
;----------------------------------------------------------------
call step_size ;AR7=state_ptr
;返回值y = A
stl A, *SP(var_y)
;----------------------------------------------------------------
; i = quantize(d, y, qtab_723_40, 15); /* i = ADPCM code */
;----------------------------------------------------------------
mvmm SP, AR6
mar *+AR6(var_d) ;AR6->var_d
calld quantize ; y=A
stm #tab_qtab, AR3 ;AR3=qtab_723_40
nop ;返回值i=A
stl A, *SP(var_i)
stl A, *AR1
;-------------------------------------------------------------------
; dq = reconstruct(i & 0x10, _dqlntab[i], y); /* quantized diff */
;-------------------------------------------------------------------
ld #tab_dqlntab, B
add A, B
stlm B, AR3 ;AR3->dqlntab[i]
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; /* reconstructed 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 + sez - se; /* dqsez = 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 = i;
;-------------------------------------------------------------------------
frame #off_p
popm ST1
popm AR7
popm AR6
popm AR1
ret
;}
;
;----------------------------------------------------------------------------
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -