?? levinson.asm
字號:
*****************************************************************************
** Description: levinson() in levinson.c **
** **
** Inputs : **
** *XAR1---Word16 old_A[M + 1] :LevinsonState **
** *XAR2---Word16 Rh[] : Rh[m+1] Vector of autocorrelations (msb) **
** *XAR3---Word16 Rl[], : Rl[m+1] Vector of autocorrelations (lsb) **
** **
** Outputs: **
** *XAR4---Word16 A[], : A[m] LPC coefficients (m = 10) **
** *XAR5---Word16 rc[] : rc[4] First 4 reflection coefficients **
** **
** Return value : AL **
** **
** Attribute : Cycles:21272 Pm: 277 **
** Modified Registers:XAR0--XAR7 **
** @_buffer1--@_buffer1+17 **
** @_buffer2--@_buffer2+46 **
** ACC,P,T **
** **
** Programmer : ZHOU Bei (ok! MAR 17th,2003) **
*****************************************************************************
.global _levinson
.ref _div_32
.ref _mpy_32
.ref _buffer1
.ref _buffer2
.ref M
_levinson:
;Save #MAX_32
MOV @_buffer1+11,#7fffh
MOV @_buffer1+10,#0ffffh
;t1 = L_Comp (Rh[1], Rl[1])
ADDB XAR3,#1
ADDB XAR2,#1
MOV ACC,*XAR3<<1 ;AL=Rl[1]<<1
MOV AH,*XAR2 ;AH=Rh
MOVL @_buffer1+4,ACC ;Temp save t1
ABS ACC ;abs
SUBB XAR3,#1
SUBB XAR2,#1
;t0=Div_32 (t2, Rh[0], Rl[0])
PUSH XAR1
PUSH XAR4
PUSH XAR2
PUSH XAR3
PUSH XAR5
PUSH ACC
MOV AL,*XAR2
MOV AR2,AL
MOV AL,*XAR3
MOV AR3,AL
POP ACC
LCR _div_32 ;Result save in ACC
POP XAR5
POP XAR3
POP XAR2
;if (t1 > 0) t0 = L_negate (t0);
TBIT @_buffer1+5,#15
BF _LINE_184,TC
NOT ACC
ADDB ACC,#1
_LINE_184:
;L_Extract (t0, &Kh, &Kl)
;Save Kh to @_buffer1+7
;Save Kl to @_buffer1+6
PUSH ACC
MOV @_buffer1+7,AH ;Save kh in @_buffer1+7
LSR AL,#1
MOV @_buffer1+6,AL ;Save kl in @_buffer1+6
;rc[0] = round (t0)
POP ACC
PUSH ACC
ADD ACC,#0800H<<4 ; Round
MOVL @_buffer1+16,XAR5
MOV *XAR5,AH ; Save MSB to rc[0],xar5++
POP ACC
;t0 = L_shr (t0, 4)
MOV AR0,#4
MOV T,AR0
ASRL ACC,T
;L_Extract (t0, &Ah[1], &Al[1]); /* A[1] in DPF */
;Save Ah[] to @_buffer2--@_buffer2+10
;Save Al[] to @_buffer2+12--@_buffer2+22
MOVL XAR7,#_buffer2+1
MOVL XAR6,#_buffer2+13
MOV *XAR7,AH ;Save to @_buffer2
LSR AL,#1
MOV *XAR6,AL ;Save to @_buffer2+11
;t0 = Mpy_32 (Kh, Kl, Kh, Kl) /* k*k */
ZAPA
MOV T,@_buffer1+7
MPYA P,T,@_buffer1+7 ;P=kh*kh
MPYA P,T,@_buffer1+6 ;ACC=P<<1,P=kh*kl
MOVH AR0,P ;Get upper 16bit without sign
ADD ACC,AR0<<#2 ;Add to ACC
ABS ACC ;abs
;t0 = L_sub ((Word32) 0x7fffffffL, t0)
SUBL @_buffer1+10,ACC
;L_Extract (t0, &hi, &lo);
MOV AL,@_buffer1+10
LSR AL,#1
MOV @_buffer1+10,AL
;t0 = Mpy_32 (Rh[0], Rl[0], hi, lo)
ZAPA
MOV T,@_buffer1+11
MPYA P,T,*XAR2 ;P=hi*Rh[0]
MPYA P,T,*XAR3++ ;ACC=P<<1,P=hi*Rl[0];xar3++
MOVH AR0,P ;Get upper 16bit without sign
ADD ACC,AR0<<#1 ;Add to ACC
MOV T,@_buffer1+10
MPY P,T,*XAR2++ ;P=lo*Rh[0],xar2++
MOVH AR0,P ;Get upper 16bit without sign
ADD ACC,AR0<<#1 ;Add to ACC
;norm
MOVB XAR0,#0 ; Initialize XAR0 to zero
RPT #31 ; Repeat next operation 32 times
||NORM ACC,XAR0++ ; Normalize contents of ACC;Save norm time to AR0
MOV @_buffer1+12,AR0 ;Save alp_exp to _buffer1+12
;L_Extract (t0, &alp_h, &alp_l); /* DPF format */
MOV @_buffer1+9,AH ;Save to @_buffer2
LSR AL,#1
MOV @_buffer1+8,AL
;for (i = 2; i <= M; i++) (here:1--M-1)
MOV @_buffer1+13,#1 ;Loop time--i
_LOOP_214:
MOVL XAR7,#_buffer2+1
MOVL XAR6,#_buffer2+13
MOV @_buffer1+14,#1 ;Loop time--j
PUSH XAR2 ;Point to Rh[1]
PUSH XAR3 ;Point to Rl[1]
MOV ACC,@_buffer1+13
SUB ACC,@_buffer1+14
ADD AR6,AL ;Calculate start addr of Ah[i-j]
ADD AR7,AL ;Calculate start addr of Al[i-j]
MOV @_buffer1+4,#0 ;Save result
MOV @_buffer1+5,#0
;for (j = 1; j < i; j++)
_LOOP_219:
;t0 = L_add (t0, Mpy_32 (Rh[j], Rl[j], Ah[i - j], Al[i - j])
LCR _mpy_32
INC @_buffer1+14
ADDL @_buffer1+4,ACC
SUBB XAR6,#1 ;Al,Ah--
SUBB XAR7,#1
ADDB XAR2,#1
ADDB XAR3,#1 ;Rh,Rl++
MOV AL,@_buffer1+13
CMP AL,@_buffer1+14
;BF _LOOP_219,HIS,C
BF _LOOP_219,GEQ
MOVL ACC,@_buffer1+4
POP XAR3
POP XAR2
;t0 = L_shl (t0, 4)
LSL ACC,#4
MOVL @_buffer1+4,ACC
;t1 = L_Comp (Rh[i], Rl[i]);
PUSH XAR2
PUSH XAR3
MOV ACC,@_buffer1+13
ADD AR2,AL ;Calculate start addr of Ah[i]
ADD AR3,AL
MOV ACC,*XAR3<<1 ;AL=Rl[1]<<1
MOV AH,*XAR2 ;AH=Rh
POP XAR3
POP XAR2
;t0 = L_add (t0, t1);
ADDL ACC,@_buffer1+4
MOVL @_buffer1+4,ACC
;t1 = L_abs (t0);
ABS ACC
;t2 = Div_32 (t1, alp_h, alp_l)
PUSH XAR2
PUSH XAR3
PUSH XAR5
PUSH ACC
MOV AL,@_buffer1+9
MOV AR2,AL
MOV AL,@_buffer1+8
MOV AR3,AL
POP ACC
LCR _div_32 ;Result save in ACC
POP XAR5
POP XAR3
POP XAR2
;if (t0 > 0) t2 = L_negate (t2);
TBIT @_buffer1+5,#15
BF _LINE_236,TC
NOT ACC
ADDB ACC,#1
_LINE_236:
;t2 = L_shl (t2, alp_exp)
MOV T,@_buffer1+12
LSL ACC,T
;L_Extract (t2, &Kh, &Kl)
PUSH ACC
MOV @_buffer1+7,AH ;Save kh in @_buffer1+7
LSR AL,#1
MOV @_buffer1+6,AL ;Save kl in @_buffer1+6
;if (sub (i, 5) < 0) {rc[i - 1] = round (t2)}
CMP @_buffer1+13,#4
;BF _LINE_242,HIS,C
BF _LINE_242,GEQ
MOV AL,@_buffer1+13
ADD AR5,AL
POP ACC
PUSH ACC
ADD ACC,#0800H<<4 ; Round
MOV *XAR5,AH ; Save MSB to rc[0],xar5++
MOVL XAR5,@_buffer1+16
_LINE_242:
;if (sub (abs_s (Kh), 32750) > 0)
MOV AL,@_buffer1+7
ABS ACC
CMP AL,#7FEEH
BF _LINE_249,LOS
;for (j = 0; j <= M; j++) A[j] = st->old_A[j];
POP ACC
POP XAR4
POP XAR1
PUSH XAR1
PUSH XAR4
PUSH ACC
MOV AR0,#M
_LOOP_251:
MOV ACC,*XAR1++ ;old_A[j]->ACC
MOV *XAR4++,ACC
BANZ _LOOP_251,AR0--
;for (j = 0; j < 4; j++) rc[j] = 0;
MOVL XAR5,@_buffer1+16 ;resume addr of rc[]
RPT #4
||MOV *XAR5++,#0
_LINE_249:
;for (j = 1; j < i; j++)
MOV @_buffer1+14,#1 ;Loop time--j
MOVL XAR7,#_buffer2+1 ;star addr of Ah,Al
MOVL XAR6,#_buffer2+13
PUSH XAR2
PUSH XAR3
PUSH XAR5
MOVL XAR0,#_buffer2+1 ;star addr of Ah,Al
MOVL XAR5,#_buffer2+13
MOV ACC,@_buffer1+13
SUB ACC,@_buffer1+14
ADD AR6,AL ;Calculate start addr of Ah[i-j]
ADD AR7,AL ;Calculate start addr of Al[i-j]
MOVL XAR2,#_buffer1+7 ;Point to Kh
MOVL XAR3,#_buffer1+6 ;Point to Kl
MOVL XAR1,#_buffer2+25 ;Point to Anh[1]
MOVL XAR4,#_buffer2+37 ;Point to Anl[1]
_LOOP_269:
;t0 = Mpy_32 (Kh, Kl, Ah[i - j], Al[i - j]);
PUSH XAR4
LCR _mpy_32
MOVL @_buffer1+4,ACC
POP XAR4
;t0 = L_add(t0, L_Comp(Ah[j], Al[j]))
MOV ACC,*XAR5++<<1 ;AL=Al[j]<<1
MOV AH,*XAR0++ ;AH=Al[j],j++
ADDL ACC,@_buffer1+4
;L_Extract (t0, &Anh[j], &Anl[j])
MOV *XAR1++,AH ;Save MSB to Anh[j]
LSR AL,#1
MOV *XAR4++,AL ;Save LSB>>1 to Anl[j]
INC @_buffer1+14 ;j++
SUBB XAR6,#1 ;Al,Ah--
SUBB XAR7,#1
MOV AL,@_buffer1+13
CMP AL,@_buffer1+14
;BF _LOOP_269,HIS,C
BF _LOOP_269,GEQ
POP XAR5
POP XAR3
POP XAR2
POP ACC
;t2 = L_shr (t2, 4)
MOV AR0,#4
MOV T,AR0
ASRL ACC,T
;L_Extract (t2, &Anh[i], &Anl[i])
MOVL @_buffer1+4,ACC
MOVL XAR0,#_buffer2+25
MOVL ACC,XAR0
ADD ACC,@_buffer1+13
MOV AR0,AL
MOV AL,@_buffer1+5 ;Save MSB to Anh[i]
MOV *XAR0,AL
MOVL XAR0,#_buffer2+37
MOVL ACC,XAR0
ADD ACC,@_buffer1+13
MOV AR0,AL
MOV AL,@_buffer1+4
LSR AL,#1
MOV *XAR0,AL ;Save LSB>>1 to Anl[i]
;t0 = Mpy_32 (Kh, Kl, Kh, Kl);
ZAPA
MOV T,@_buffer1+7
MPYA P,T,@_buffer1+7 ;P=kh*kh
MPYA P,T,@_buffer1+6 ;ACC=P<<1,P=kh*kl
MOVH AR0,P ;Get upper 16bit without sign
ADD ACC,AR0<<#2 ;Add to ACC
ABS ACC ;abs
;t0 = L_sub ((Word32) 0x7fffffffL, t0)
MOV @_buffer1+11,#7fffh
MOV @_buffer1+10,#0ffffh
SUBL @_buffer1+10,ACC
;L_Extract (t0, &hi, &lo);
MOV AL,@_buffer1+10
LSR AL,#1
MOV @_buffer1+10,AL
;t0 = Mpy_32 (alp_h, alp_l, hi, lo);
ZAPA
MOV T,@_buffer1+11
MPYA P,T,@_buffer1+9
MPYA P,T,@_buffer1+8 ;ACC=P<<1,P=
MOVH AR0,P ;Get upper 16bit without sign
ADD ACC,AR0<<#1 ;Add to ACC
MOV T,@_buffer1+10
MPY P,T,@_buffer1+9 ;
MOVH AR0,P ;Get upper 16bit without sign
ADD ACC,AR0<<#1 ;Add to ACC
;j = norm_l (t0); t0 = L_shl (t0, j)
MOVB XAR0,#0 ; Initialize XAR0 to zero
RPT #31 ; Repeat next operation 32 times
||NORM ACC,XAR0++ ; Normalize contents of ACC;Save norm time to AR0
;L_Extract (t0, &alp_h, &alp_l)
MOV @_buffer1+9,AH
LSR AL,#1
MOV @_buffer1+8,AL
;alp_exp = add (alp_exp, j);
MOV AL,AR0
ADD @_buffer1+12,AL
;for (j = 1; j <= i; j++)
MOV AL,@_buffer1+13
MOV AR0,AL
MOVL XAR7,#_buffer2+1 ;star addr of Ah,Al
MOVL XAR6,#_buffer2+13
MOVL XAR1,#_buffer2+25 ;Point to Anh[1]
MOVL XAR4,#_buffer2+37 ;Point to Anl[1]
_LOOP_296:
;Ah[j] = Anh[j] Al[j] = Anl[j]
MOV AH,*XAR1++
MOV AL,*XAR4++
MOV *XAR7++,AH
MOV *XAR6++,AL
BANZ _LOOP_296,AR0--
;i++<=M,loop
INC @_buffer1+13
CMP @_buffer1+13,#M
BF _LOOP_214,LT
;A[0] = 4096
POP XAR4
POP XAR1
MOV *XAR4++,#1000H
;for (i = 1; i <= M; i++)
MOV AR0,#M-1
ADDB XAR1,#1
MOVL XAR7,#_buffer2+1 ;star addr of Ah,Al
MOVL XAR6,#_buffer2+13
_LOOP_304:
;t0 = L_Comp (Ah[i], Al[i]);
MOV ACC,*XAR6++<<1 ;AL=Rl[1]<<1
MOV AH,*XAR7++ ;AH=Rh
;st->old_A[i] = A[i] = round (L_shl (t0, 1))
LSL ACC,#1
ADD ACC,#0800H<<4
MOV *XAR4++,AH
MOV *XAR1++,AH
BANZ _LOOP_304,AR0--
MOV AL,#0
LRETR
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -