📄 tcgain.asm
字号:
CGAIN_DEBUG .SET 1
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.IF CGAIN_DEBUG
.version 50
.mmregs
.MLIB "MAC.LIB"
.DATA
CODEBOOK .COPY "CODEBOOK.DAT"
E0 .int 1451,1316,1600,581,242,1467,1220,270,438,0,-1456,-158,143,-154,-1181,121,-287,-1060,1513,-156
.int 282,-237,127,21,-1458,-1456,0,-18,-40,-1526,2415,-89,-15,88,-1243,1330,12,949,1215,94
.int -1037,-209,-188,207,-922,0,-300,-80,-1330,106,-104,324,-2242,-1109,-403,1162,-1017,-846,-188,-304
IMP_H .int 8192,11557,8353,7750,8788,7475,4817,3201,2141,1103,372,-200,-551,-519,-382,-363,-304,-136,-12,27
.int 52,76,80,69,50,28,13,4,-6,-14,-15,-13,-12,-11,-9,-7,-5,-4,-4,-4
.int -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4
.TEXT
CALL C50_INIT
LDP #ACCBUF
LACC #0
SACL CG_Y60
SACL CG_Y59
LACC #1
SACL CG_FIRST
LACC #CODEBOOK+1022
SACL CG_BOOK
LAR AR3,#CG_MATCH
LAR AR4,#CG_GAIN
LOOP_CG
CALL CGAIN
LACC #0
SACL CG_FIRST
LACC CG_BOOK
SUB #2
SACL CG_BOOK
SUB #CODEBOOK
BCND LOOP_CG,C
HERE: B HERE
.BSS ACCBUF,2
.BSS SIGNFLAG,1
.ENDIF
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;-----------------------------------
;-------------
CG_MATCH .USECT "WARRAY",512*2
CG_GAIN .USECT "WARRAY",512
CG_Y .USECT "WARRAY",60
;--------------
.BSS CG_COR,2
.BSS CG_ENG,2
.BSS CG_BOOK,1
.BSS CG_Y59,1
.BSS CG_Y60,1
.BSS CG_FIRST,1
;-----------------------------------
;ACCBUF*2, SIGNFLAG ,CG_FIRST,CG_COR*2,CG_ENG*2,CG_Y59,CG_Y60,CG_BOOK
;CALL MPY16_32, CG_DIV
;AR3->MATCH[512*2], AR4->CG_GAIN[512]
;PUSH AR0,AR1,AR2,AR7
;ACC,ACCB,PREG,TREG0/1,BRCR
;ARRAY: CG_MATCH[512*2], CG_GAIN[512], CG_Y[60], IMP_H[60], E0[60]
; CODEBOOK[1082]
;NOTE: H[0]=0X2000!! DMOV CG_Y, |COR/ENG|<0X7FFF
;H: 3.13,
;CG_Y: 5.11
;COR: 27.5
;ENG: 16.16
;=================================
CGAIN
LAMM AR0
PUSH
LAMM AR1
PUSH
LAMM AR2
PUSH
LACC CG_FIRST
BCND CG__FIRST,NEQ
;==========================================
; else
; { if (ex[1] != 0)
; { if (ex[1] == 1)
; for (i = len - 1; i > 0; i--) y[i - 1] += (h1[i]>>2);
; else
; for (i = len - 1; i > 0; i--) y[i - 1] -= (h1[i]>>2);
; }
;// y[0] = (((long)ex[1] * (long)h1[0])>>2); STORED IN PREG !!!
;==========================================
LACC CG_BOOK
ADD #1
SAMM AR0
LAR AR1,#IMP_H+29
LAR AR2,#CG_Y+28
MAR *,AR0
;LT *,AR1
;MPY *,AR0 ;PREG RESERVES Y[0]
LACC *,0,AR1 ;AR0->EX[1]
BCND CG_EX1_END,EQ
BCND CG_EX1_LT,LT
LACC #28
SAMM BRCR
;-----ARP==1------
RPTB CG_EX1_GT-1 ;for (i = len - 1; i > 0; i--)
LACC *-,0,AR2 ; y[i - 1] += (h1[i]>>2);
BSAR 2
ADD *
SACL *-,0,AR1
CG_EX1_GT
B CG_EX1_END
CG_EX1_LT
;-----ARP==1------
LACC #28
SAMM BRCR
RPTB CG_EX1_END-1 ;for (i = len - 1; i > 0; i--)
LACC *-,0,AR2 ; y[i - 1] -= (h1[i]>>2);
BSAR 2
SUB *
NEG
SACL *-,0,AR1
CG_EX1_END
;==========================================
; for (i = l - 1; i > 0; i--) y[i] = y[i - 1];
; //y[0] = (((long)ex[1] * (long)h1[0])>>2); //h[0]=1?
; y[0] = (int)ex[1]<<11; //11=13-2
;================;AR0->EX[1]==========================
LAR AR2,#CG_Y+58
MAR *,AR2
RPT #58
DMOV *-
MAR *,AR0
LACC *-,11,AR2 ;AR0->EX[0]
LAR AR2,#CG_Y
SACL *,0,AR0
;==========================================
; if (ex[0] != 0)
; { if (ex[0] == 1)
; for (i = len - 1; i > 0; i--) y[i - 1] += (h1[i]>>2);
; else
; for (i = len - 1; i > 0; i--) y[i - 1] -= (h1[i]>>2);
; }
;=================ARP==0=========================
LAR AR1,#IMP_H+29
LAR AR2,#CG_Y+28
;MAR *,AR0 ;AR0->EX[0]
;LT *,AR1
;MPY *,AR0 ;PREG RESERVES Y[0]
LACC *,0,AR1
BCND CG_EX0_END,EQ
BCND CG_EX0_LT,LT
LACC #28
SAMM BRCR
;-----ARP==1------
RPTB CG_EX0_GT-1 ;for (i = len - 1; i > 0; i--)
LACC *-,0,AR2 ; y[i - 1] += (h1[i]>>2);
BSAR 2
ADD *
SACL *-,0,AR1
CG_EX0_GT
B CG_EX0_END
CG_EX0_LT
;-----ARP==1------
LACC #28
SAMM BRCR
RPTB CG_EX0_END-1 ;for (i = len - 1; i > 0; i--)
LACC *-,0,AR2 ; y[i - 1] -= (h1[i]>>2);
BSAR 2
SUB *
NEG
SACL *-,0,AR1
CG_EX0_END
;==========================================
; for (i = l - 1; i > 0; i--) y[i] = y[i - 1];
; //y[0] = (((long)ex[0] * (long)h1[0])>>2); //h[0]=1?
; y[0] = (int)ex[0]<<11; //11=13-2
;=======;AR0->EX[0]===================================
LAR AR2,#CG_Y+58
MAR *,AR2
RPT #58
DMOV *-
MAR *,AR0
LACC *,11,AR2
LAR AR2,#CG_Y
SACL *
B CG_GET_COR
;==========================================
CG__FIRST
;==========================================
; if (first)
; { for (i = 0; i < l; i++)
; { acc=0l;
; for (j = 0; j <= i && j < len; j++)
; { p32=(long)h1[j] * ex[i - j]; acc += p32; }
; y[i]=acc>>2; }
; }
;=================================
LAMM AR7
PUSH
LACC CG_BOOK
SAMM AR0
LACC #59
SAMM AR7
LAR AR2,#CG_Y
LAMM AR0
PUSH
MAR *,AR1
CG_FIRST_I
;-----------
LAMM AR7
SUB #59
ABS
SACB
LACC #29
CRLT
SAMM BRCR ;for (j = 0; j <= i && j < len; j++)
LAR AR1,#IMP_H
;--------------
;=================================
; { p32=(long)h1[j] * ex[i - j]; acc += p32; }
;=================================
LT *+,AR0
ZAP
RPTB CG_FIRST_J-1
MPYA *-,AR1
LT *+,AR0
NOP
CG_FIRST_J
APAC
BSAR 2 ;y[i]=acc>>2; } }
MAR *,AR2
SACL *+,0,AR7
POP
ADD #1
PUSH
SAMM AR0
;MAR *,AR7
BANZ CG_FIRST_I,*-,AR1
pop ;pop out AR0
POP
SAMM AR7
;=================================
CG_GET_COR
;==========================================
; cor = 0;
; for (i = 0; i < l; i++) cor +=(((long)y[i] * (long)e0[i])>>6);
;==========================================
SPM 3
;-----
MAR *,AR0
LAR AR0,#CG_Y
LAR AR1,#E0
LACC #29
SAMM BRCR
ZAP
RPTB CG_DO_COR-1
LT *+,AR1 ;cor += (((long)y[i] * (long)e0[i])>>bp_pgain);
MPYA *+,AR0
LT *+,AR1
MPYA *+,AR0
CG_DO_COR
APAC
SACL CG_COR
SACH CG_COR+1
;==========================================
; if (ex[0] == 0 && ex[1] == 0 && !first)
; eng = eng - (((long)y59save * (long)y59save)>>6) - (((long)y60save * (long)y60save)>>6);
;============ARP==0==============================
LAR AR0,CG_BOOK
LACC *+,16 ;LOAD EX[0] & EX[1]
OR *-
ABS
ADD CG_FIRST
BCND CG_ENG_NEW,NEQ
ZAP
SQRA CG_Y59
SQRA CG_Y60
APAC
SACB
LLAC CG_ENG
SBB
B CG_TEST_ENG
CG_ENG_NEW
;========ARP==0======================================
; else
; { eng = 0;
; for (i = 0; i < l; i++) eng += (((long)y[i] * (long)y[i])>>6); //16.16
; }
; if(eng < (1lu<<16) ) eng=1lu<<16; //if eng<1 then eng=1;
;===========ARP=0===================================
LAR AR0,#CG_Y
ZAP
RPT #60 ;GET ENG :61 times
SQRA *+
;-----------
CG_TEST_ENG
SACB
LACC #1,15 ;1<<16
SFL
CRGT
SLAC CG_ENG
;-------
SPM 0
;==========================================
; y59save = y[l - 2]; y60save = y[l - 1];
;=======ARP==0===================================
LAR AR0,#CG_Y+58
LACC *+
SACL CG_Y59
LACC *
SACL CG_Y60
;==========================================
; accb=cor; //27.5
; acc=eng; //14.18 ->16.16
; if(labs(accb)< (1lu<<20) ) accb<<=11;
; else if(labs(accb)< (1lu<<25) ) { accb<<=6; acc>>=5; }
; else acc>>=11;
;==========================================
LACC #1,14
SACL ACCBUF
LACC ACCBUF,6 ;ACC=1<<20
SACB
LLAC CG_COR
ABS
SBB
BCNDD CG_COR_11_1,C ;JUMP IF |COR|>= (1<<20)
LLAC CG_COR
RPT #10 ;accb<<=11;
SFL
SACB
LLAC CG_ENG
B CG_COR_11_OVER
CG_COR_11_1
ADDB
SACB
LACC ACCBUF,11 ;ACC=1<<25
EXAR
SBB
BCNDD CG_COR_11_2,C ;JUMP IF |COR|>= (1<<25)
LLAC CG_COR
RPT #5
SFL ;{ accb<<=6; acc>>=5; }
SACB
LLAC CG_ENG
BSAR 5
B CG_COR_11_OVER
CG_COR_11_2
LLAC CG_COR ;else acc>>=11;
BSAR 11
SACB
LLAC CG_ENG
;-----ACC=CG_ENG.. ACCB=CG_COR----
CG_COR_11_OVER
;==========================================
; ax0=0;
; while( acc>0x7ffflu ) { acc>>=1; ax0++; }
; accb>>=ax0;
;==============ARP==0============================
LAR AR0,#16
RPT #15
NORM *-
;NOP
SACH ACCBUF ;ACCBUF IS shifted eng
LACC ACCBUF
BSAR 1
SACL ACCBUF+1 ;ACCBUF+1 =ACCBUF/2
LAMM AR0
SAMM TREG1
LACB
SATL ;acc IS SHIFTED COR
;==========================================
; if(accb<0) accb-=acc/2;
; else accb+=acc/2;
;==========================================
xc 1,GEQ
ADD ACCBUF+1
XC 1,LT
SUB ACCBUF+1
;==========================================
;!!!!!!!!!!!!!!!! BE WARN OF OVERFLOW
; accb=accb/acc; //-1330 <..<1330
; acc=accb;
;===========ACC/ACCBUF->ACCBUF & ACClow===============================
CALL CG_DIV
;==========================================
; cgain=accb;
; accb=cor;
; *match = (float)acc* (accb>>6);
;==========================================
MAR *,AR4 ;AR4->CG_GAIN[512]
SACL *+,0,AR3 ;AR3->CG_MATCH[512*2]
SACL MPY_16
LLAC CG_COR
BSAR 6
SLAC MPY_32
CALL MPY16_32
SACL *+
SACH *+
;==========================================
POP
SAMM AR2
POP
SAMM AR1
POP
SAMM AR0
RET
;==========================================
.IF CGAIN_DEBUG
.INCLUDE "C50_INIT.ASM"
.INCLUDE "MPY16_32.ASM"
.INCLUDE "cg_div.ASM"
.ENDIF
.end
;=================================================
; if (first)
; { for (i = 0; i < l; i++)
; { acc=0l;
; for (j = 0; j <= i && j < len; j++)
; { p32=(long)h1[j] * ex[i - j]; acc += p32; }
; y[i]=acc>>2; }
; }
; else
; { if (ex[1] != 0)
; { if (ex[1] == 1)
; for (i = len - 1; i > 0; i--) y[i - 1] += (h1[i]>>2);
; else
; for (i = len - 1; i > 0; i--) y[i - 1] -= (h1[i]>>2);
; }
; for (i = l - 1; i > 0; i--) y[i] = y[i - 1];
; //y[0] = (((long)ex[1] * (long)h1[0])>>2);
; //y[0] = (((long)ex[1] * (long)h1[0])>>2); //h[0]=1?
; y[0] = (int)ex[1]<<11; //11=13-2
; if (ex[0] != 0)
; { if (ex[0] == 1)
; for (i = len - 1; i > 0; i--) y[i - 1] += (h1[i]>>2);
; else
; for (i = len - 1; i > 0; i--) y[i - 1] -= (h1[i]>>2);
; }
; for (i = l - 1; i > 0; i--) y[i] = y[i - 1];
; //y[0] = (((long)ex[0] * (long)h1[0])>>2);
; //y[0] = (((long)ex[1] * (long)h1[0])>>2); //h[0]=1?
; y[0] = (int)ex[0]<<11; //11=13-2
; }
; cor = 0;
; for (i = 0; i < l; i++) cor +=(((long)y[i] * (long)e0[i])>>6);
; if (ex[0] == 0 && ex[1] == 0 && !first)
; eng = eng - (((long)y59save * (long)y59save)>>6) - (((long)y60save * (long)y60save)>>6);
; else
; { eng = 0;
; for (i = 0; i < l; i++) eng += (((long)y[i] * (long)y[i])>>6); //16.16
; }
; if(eng < (1lu<<16) ) eng=1lu<<16; //if eng<1 then eng=1;
; y59save = y[l - 2];
; y60save = y[l - 1];
; accb=cor; //27.5
; acc=eng; //14.18 ->16.16
; if(labs(accb)< (1lu<<20) ) accb<<=11;
; else if(labs(accb)< (1lu<<25) ) { accb<<=6; acc>>=5; }
; else acc>>=11;
; ax0=0;
; while( acc>0x7ffflu ) { acc>>=1; ax0++; }
; accb>>=ax0;
; if(accb<0) accb-=acc/2;
; else accb+=acc/2;
; accb=accb/acc; //-1330 <..<1330
; acc=accb;
;// if(labs(accb)>0x7fff) accb=(accb<0) ? -0x8000l : 0x7fff;
; cgain=accb;
; accb=cor;
; *match = (float)acc* (accb>>6);
;=================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -