📄 qua_gain.asm
字号:
*****************************************************************************
** Description: Qua_gain() in qua_gain.c **
** **
** Inputs **
** **
** al ---Word16 exp_gcode0 **
** ar3 ---Word16 frac_gcode0 **
** xar4---Word16 frac_coeff[] **
** xar5---Word16 exp_coeff[] **
** ar6 ---Word16 gp_limit **
** **
** Outputs: **
** **
** xar1---Word16 *gain_pit **
** xar0---Word16 *gain_cod **
** xar2---Word16 *qua_ener_MR122 **
** xar7---Word16 *qua_ener **
** **
** **
** Return value : ar5 **
** **
** Attribute : Cycles: 21389 Pm: 192 **
** Modified Registers: all **
** **
** Programmer : Qi Ying **
*****************************************************************************
.global _qua_gain
.global table_gain_lowrates
.ref _pow2
.ref _buffer1
.ref _buffer2
_qua_gain:
push acc
push xar1
push xar0
push xar2
push xar7
sub al, #11
mov ar2, al ;ar2=exp_code
push xar2
push xar4
push xar5
push xar6
mov ar2, #14
LCR _pow2
movl acc, xar1
mov ar3, al ;ar3=gcode0
pop xar6
pop xar5
pop xar4
pop xar2
movl xar7, xar5 ;xar7=exp_max[]
mov al, *xar5++
sub al, #13
mov *xar7++, al ;exp_max[0] = sub(exp_coeff[0], 13)
mov al, *xar5++
sub al, #14
mov *xar7++, al ;exp_max[1] = sub(exp_coeff[1], 14)
mov al, ar2
lsl al, #1
addb al, #15
add al, *xar5++
mov *xar7++, al ;exp_max[2] = add(exp_coeff[2], add(15, shl(exp_code, 1)));
mov al, *xar5++
add al, ar2
mov *xar7++, al ;exp_max[3] = add(exp_coeff[3], exp_code);
inc ar2
mov al, ar2
add al, *xar5
mov *xar7, al ;exp_max[4] = add(exp_coeff[4], add(1, exp_code));
subb xar7, #4 ;xar7指回exp_max头
mov ar0, #4
mov al, *+xar7[ar0] ;al=e_max
dec ar0
_Loop_142:
cmp al, *+xar7[ar0]
sb _Line_148, GEQ
mov al, *+xar7[ar0]
_Line_148:
banz _Loop_142, ar0--
inc al
mov ar5, al ;ar5=e_max
mov ar0, #0 ;ar0=i
movl xar1, xar7 ;xar1=coeff[]
movl xar2, xar1
addb xar2, #5 ;xar2=coeff_lo[]
_Loop_154:
cmp ar0, #5
sb _Line_173, GEQ
mov al, ar5
sub al, *+xar7[ar0]
mov T, al ;T=j
movb acc, #0
mov ah, *+xar4[ar0] ;acc=L_tmp
asrl acc, T ;acc=L_tmp = L_shr(L_tmp, j)
mov *+xar1[ar0], ah ;coeff[]
push acc
mpy acc,*+xar1[ar0],#16384
lsl acc, #1
movl P, acc
mov al, #1
mov T, al
pop acc
asrl acc, T
subl acc, p
mov *+xar2[ar0], al ;coeff_lo[]
inc ar0
sb _Loop_154, UNC
_Line_173:
mov al, #0
mov pl, al ;pl=index
mov al, #0xffff
mov ah, #0x7fff
movl XT, acc ;XT=dist_min
movl xar4, #table_gain_lowrates ;xar4=p
mov ar0, #0
_Loop_177:
cmp ar0, #64
sb _Line_215, GEQ
movz ar5, *xar4++ ;ar5=g_pitch
nop
nop
nop
nop
mov ar7, *xar4++ ;ar7=g_code
addb xar4, #2
mov al, ar5
cmp al, ar6 ;比较g_pitch和gp_limit
sb _Line_207, GEQ
push p
push XT
mov T, ar7
mpy acc, T, ar3 ;g_code*gcode0
lsl acc, #1
mov ar7, ah ;ar7=g_code
mov T, ar5
mpy acc, T, ar5 ;g_pitch*g_pitch
lsl acc, #1 ;ah=g2_pitch
mov T, ah
mpy acc, T, *xar2++ ;g2_pitch*coeff_lo[0]
lsl acc, #1
mov al, ah
mov ah, #0
lsl acc, #1
movl p, acc
mpy acc, T, *xar1++ ;g2_pitch*coeff[0]
lsl acc, #1
addl p, acc ;p=L_temp
mov T, ar5 ;g_pitch
mpy acc, T, *xar2++ ;g_pitch*coeff_lo[1]
lsl acc, #1
mov al, ah
mov ah, #0
lsl acc, #1
addl p, acc
mpy acc, T, *xar1++ ;g_pitch*coeff[1]
lsl acc, #1
addl P, acc ;P=L_add(L_tmp, Mpy_32_16(coeff[1], coeff_lo[1], g_pitch));
mov T, ar7 ;g_code
mpy acc, T, ar7 ;g_code*g_code
lsl acc, #1 ;ah=g2_code
mov T, ah
mpy acc, T, *xar2++ ;g2_code*coeff_lo[2]
lsl acc, #1
mov al, ah
mov ah, #0
lsl acc, #1
addl p, acc
mpy acc, T, *xar1++ ;g2_code*coeff[2]
lsl acc, #1
addl P, acc ;P=L_add(L_tmp, Mpy_32_16(coeff[2], coeff_lo[2], g2_code));
mov T, ar7 ;g_code
mpy acc, T, *xar2++ ;g_code*coeff_lo[3]
lsl acc, #1
mov al, ah
mov ah, #0
lsl acc, #1
addl p, acc
mpy acc, T, *xar1++ ;g_code*coeff[3]
lsl acc, #1
addl P, acc ;P=L_add(L_tmp, Mpy_32_16(coeff[3], coeff_lo[3], gcode));
mpy acc, T, ar5 ;g_code*g_pitch
lsl acc, #1 ;ah=g_pit_cod
mov T, ah
mpy acc, T, *xar2 ;g_pit_cod*coeff_lo[4]
lsl acc, #1
mov al, ah
mov ah, #0
lsl acc, #1
addl p, acc
mpy acc, T, *xar1 ;g2_code*coeff[4]
lsl acc, #1
addl P, acc ;P=L_add(L_tmp, Mpy_32_16(coeff[4], coeff_lo[4],g_pit_cod));
subb xar1, #4 ;xar1指回coeff头
subb xar2, #4 ;xar2指回coeff_lo头
movl acc, P
pop XT
pop p
cmpl acc, XT ;比较L_tmp和dist_min
sb _Line_207, GEQ
movl XT, acc ;dist_min = L_tmp
mov pl, ar0 ;index=i
_Line_207:
inc ar0 ;i++
sb _Loop_177, UNC
_Line_215:
pop xar7
pop xar2
pop xar0
pop xar1
movl acc, p ;al=index
mov ar5, al ;ar5=index
lsl al, #2
mov pl, al
movl xar4, #table_gain_lowrates
movl acc, xar4
add acc, pl
movl xar4, acc ;xar4=p
mov al, *+xar4[0]
mov *xar1, al ;*xar1=*gain_pit
mov ar6, *+xar4[1] ;ar6=g_code = *p++
nop
nop
nop
nop
mov al, *+xar4[2]
mov *xar2, al ;*xar2=*qua_ener_MR122
mov al, *+xar4[3]
mov *xar7, al ;*xar7=*qua_ener
pop acc ;exp_gcode0
movb ah, #10
sub ah, al
mov ar4, ah ;ar4= sub(10,exp_gcode0)
mov T, ar6
mpy acc, T, ar3 ;g_code*gcode0
lsl acc, #1
mov T, ar4
asrl acc, T
mov *xar0, ah ;*xar0=*gain_cod
LRETR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -