📄 durbin.asm
字号:
DUR_DEBUG .SET 0
;------------------------------
;------ACC,ACCB,INDX==3,AR0,AR1,AR2,AR4,AR6,AR7
;-----TMP[10],LPC[10],RC[10],COR[11]
;CALL LONGDIV , AJUST
;---------AR0->PC[10], AR1->COR[11]; AR2->RC[10],
;---------AR7->LOOP, AR6->TMP, AR4->NORM
;CORFLAG,ACCBUF[2],ALPHA[2],BETA[2],TEMP,DIVISOR,SIGNFLAG,TJ
;====================================
.IF DUR_DEBUG
.version 50
.mmregs
.MLIB "MAC.LIB"
;====================================
.BSS TJ,2
.BSS CORFLAG,1
.BSS ACCBUF,2
.BSS TEMP,1
.BSS DIVISOR,1
.BSS SIGNFLAG,1
RC .USECT "ONCHIP1",10
TMP .USECT "ONCHIP1",10
.DATA
LPC0 .INT 2000H
LPC .INT 0,0,0,0,0,0,0,0,0,0
;COR .LONG 191bafH,0104605h, 07c0cbh, 068dc4h, 02fac4h, 02c64h, 0fffe133fh, 0fffea6beh, 0fffffcfch, 0fffdde49h, 0fffdd7d8h
;TLPC .INT 0daf6h, 02086h, 0dafdh, 023a6h, 0e09dh, 01edbh, 0e704h, 0f02h, 0f8beh, 0382h
COR .LONG 0e522cH, 06327bh, 0fff8a3bch, 0fff489aeh, 0fffca8aah, 080df9h, 093460h, 0ffff8bffh, 0fff77b67h, 0fff9b95fh, 030cb4h
TLPC .INT 0dca9h, 02bdeh, 0e07ah, 02c06h, 0d2b3h, 024c8h, 0e85dh, 01520h, 0f050h, 074bh
;-------
.TEXT
CALL C50_INIT
LDP #ACCBUF
CALL DURBIN
HERE B $
.ENDIF
;--------------
.BSS ALPHA,2
.BSS BETA,2
.BSS AR0_PUSH,1
;-----------------
DURBIN
LACL #0
SACL CORFLAG ;CORFLAG=0
LACL #3
SAMM INDX ;INDX=3
LAR AR0,#LPC
LAR AR1,#COR+1
LAR AR2,#RC
LACL #P10_1
SAMM BRCR
;---test for c0>fabs(c[i])-----------
MAR *,AR1 ;AR1->high 16 bits
LACC *-,16
OR *0+
SACB
RPTB DURBIN_1A-1
LACC *-,16
OR *0+
ABS
CRGT ;IF C0<=C THEN C=1
NOP
XC 2,C
LACL #1
SACL CORFLAG
NOP
DURBIN_1A
LACC CORFLAG
BCND ENDDURB,GT
;------------
;****** alpha = c0; *a = rc[0] = -*c / c0; beta = *c ---******
DURBIN_2
LAR AR1,#COR+1
MAR *,AR1
LACC *-,16
OR *0+
SACL ALPHA ;alpha=c0=C[0];
SACH ALPHA+1
EXAR
LACC *-,16 ; beta=*c=C[1],AR1=c[1]=C[2]
OR *0+
SACL BETA
SACH BETA+1
EXAR ;ACC=c0,ACCB=c[1],
;LONGDIV=ACCB/ACC
NEG
CALL LONGDIV
MAR *,AR2 ;ar0->pc ,ar2->rc
SACL *,0,AR0 ; *a=rc[0]=-C[1]/C[0]
BSAR 2
SACL *,0,AR0 ;LPC: 3.13
;--------- for (i = 1; i < n; i++)----------
;----------alpha = alpha + beta * rc[i - 1];
;----------beta = *(c+i);
;---------AR1->*(c+1)-------------------------------
LAR AR7,#P10_2
;//alpha = alpha + beta * rc[i - 1],AR2(->RC) +1 AT HERE---------
DURBIN_3
LACC BETA+1,16
OR BETA
CALL AJUST ;AR4 store exponent, t2>>=bp
SAMM TREG0
LACL #15
SAMM TREG1
MAR *,AR2 ;AR2->RC[0]
MPY *+,AR1 ;AR2->RC[1],ARP->1
PAC
SATL ;TREG1=15, ACC>>15
;-------
SACB;
;LDP #0
LAMM AR4;
BCND DURBIN_3B,NEQ;
B DURBIN_3C
DURBIN_3B;
SUB #1 ;AR4-1
SAMM AR4
SACL TJ;!!!!!!!!!!
LACB;
RPT TJ
SFL
SACB
DURBIN_3C
;LDP #ALPHA
LACC ALPHA+1,16
OR ALPHA
ADDB
BCND DURBIN_3A,NEQ
LACL #1 ;if(alpha==0) alpha=1 //wht
DURBIN_3A
SACL ALPHA
SACH ALPHA+1 ;alpha = alpha + beta * rc[i - 1];
;--------beta = *(c+i) ARP->1
MAR *,AR1 ;AR1->C[2]
LACC *-,16
OR *
SACL BETA
SACH BETA+1
SACB
;---ACCB=BETA-----------------------------
;------for (j = 0; j <= i - 1; j++) beta = beta + *(c+j) * *(a+i-j-1);
;---------------------------------
LAMM AR0 ;AR0->STACK
SACL AR0_PUSH
;PUSH
LAMM AR7
SUB #P10_2
ABS
SACL TEMP
SAMM BRCR
LACL #13
SAMM TREG1
;LDP #0
LAR AR1,#COR+3
MAR *,AR1
RPTB DURBIN_4-1
;MAR *,AR1
LACC *-,16
OR *0+,AR4
LAR AR4,#16
RPT #15
NORM *-
BSAR 16
SAMM TREG0
MAR *,AR0 ;AR0->LPC[0] AT LAST
MPY *-,AR1
LAMM AR4
SUB #13
NEG
BCND DURBIN_BETA_1,LT ;JUMP IF AR4>13
SAMM TREG1
BD DURBIN_BETA_ADD
PAC
SATL
DURBIN_BETA_1
;----
NEG
SUB #1
SACL TJ
PAC
RPT TJ
SFR
;----
DURBIN_BETA_ADD
ADDB
SACB
;===================
DURBIN_4
MAR *,AR1
ADRK #2
SLAC BETA
;----------------------------------------
;---------------------rc[i] = -beta / alpha;
;-------if(|beta|>|alpha|) corflag=1---------------------------------
ABS
SACB
LLAC ALPHA
ABS
CRLT
;BCND DURBIN_5,C
BCND ENDDURB,C
DURBIN_5
LACC BETA+1,16
OR BETA
SACB
LACC ALPHA+1,16
OR ALPHA
NEG
CALL LONGDIV
MAR *,AR2
SACL *,0,AR0
;-------for (j = 0; j <= i - 1; j++) tmp[j] = rc[i] * *(a+i-j-1);
LAR AR6,#TMP ;TMP :3.13
SAMM TREG0
;LDP #TEMP
LACC TEMP
SAMM BRCR
LACC AR0_PUSH
;POP
SAMM AR0 ;AR0->*(a+i-1)
RPTB DURBIN_6-1
MPY *-,AR6
PAC
SACH *+,1,AR0
DURBIN_6
;-----for (j = 0; j <= i - 1; j++) *(a+j) = *(a+j) + tmp[j];
;-------ARP=0------------------------------
LAR AR6,#TMP
LAR AR0,#LPC
LACC TEMP
SAMM BRCR
RPTB DURBIN_7-1
LACC *,0,AR6
ADD *+,0,AR0
SACL *+
;NOP
NOP
DURBIN_7
;-------*(a+i) = rc[i];-------------------
MAR *,AR2
LACC *,0,AR0
SFR
SFR ;1.15->3.13
SACL *,0,AR7
DURBIN_8
BANZ DURBIN_3,*-
RET
ENDDURB
;LDP #CORFLAG
LACL #1
SACL CORFLAG ;CORFLAG=1
LAR AR0,#LPC
MAR *,AR0
RPTZ #9
SACL *+
LAR AR0,#RC
RPTZ #9
SACL *+
RET
; if (c0 <= 0.0)
; { for (i = 0; i < n; i++) rc[i] = 0.0;
; return; }
; alpha = c0; *a = rc[0] = -*c / c0; beta = *c;
; for (i = 1; i < n; i++)
; { alpha = alpha + beta * rc[i - 1];
; if(alpha==0)alpha=1;//wht
; beta = *(c+i);
; for (j = 0; j <= i - 1; j++) beta = beta + *(c+j) * *(a+i-j-1);
; rc[i] = -beta / alpha;
; for (j = 0; j <= i - 1; j++) tmp[j] = rc[i] * *(a+i-j-1);
; for (j = 0; j <= i - 1; j++) *(a+j) = *(a+j) + tmp[j];
; *(a+i) = rc[i];
; }
;--------------------------
.IF DUR_DEBUG
.include "c50_init.asm"
.include "longdiv.asm"
.INCLUDE "AJUST.ASM"
.INCLUDE "SET_CON.ASM"
.ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -