📄 cgain.asm
字号:
CRLT
SACL PG_RPTC
LACC CG_EX
ADD #1
SACL CG_EX
SAMM AR0 ;AR0->EX[I]
CG_FIRST_I
LAR AR0,#CG_Y+58
;=================================
CG_GET_COR ;AR0: Y[58], ARP=0
;==========================================
; cor = 0;
; for (i = 0; i < l; i++) cor +=(((long)y[i] * (long)e0[i])>>6);
;==========================================
LACC PG_SHIFT
BCND CG_COR_CLR_OV,OV
CG_COR_CLR_OV
XC 1,GT
SPM 3
;-----
;LAR AR0,#CG_Y+58
;MAR *,AR0 ;AR0=Y[58]
RPTZ #59
MACD PG_X_E0,*- ;AR0: Y[-2]
APAC
;--------
BCNDD CG_COR_NOT_OVERFLOW,NOV
SLAC PG_COR
;==================================
; if(oldbp_pg<=6) { oldmatch>>=(6-oldbp_pg); oldbp_pg==0; }
; else oldbp_pg-=6;
;==================================
LACL #6
SACL PG_SHIFT
SUB TOPBP_PG
NEG
SACL TOPBP_PG ;TOPBP_PG-=6
BCND CG_COR_OV_OLD1,NC ;JUMP IF >6
NEG
SAMM TREG1
LLAC PG_EMAX
SATL
LACL #0
SACL TOPBP_PG
CG_COR_OV_OLD1
;========
SPM 3
SBRK #60
RPTZ #59
MAC PG_X_E0,*+ ;!!!!!!!!!!!!NOT MACD WITHOUT DMOV
APAC
SLAC PG_COR
;=======================
CG_COR_NOT_OVERFLOW
;==========================================
; 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 PG_FIRST
BCND CG_ENG_NEW,NEQ
ZAP
SQRA CG_Y59
SQRA CG_Y60
APAC
SACB
LLAC PG_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===================================
LACC PG_SHIFT
LAR AR0,#CG_Y
XC 1,GT
SPM 3
RPTZ #60 ;GET ENG :61 times
SQRA *+
;-----------
BCNDD CG_TEST_ENG,NOV
SLAC PG_ENG
;==================================
; if(oldbp_pg<=6) { oldmatch>>=(6-oldbp_pg); oldbp_pg==0; }
; else oldbp_pg-=6;
;==================================
LACL #6
SACL PG_SHIFT
SUB TOPBP_PG
NEG
SACL TOPBP_PG ;TOPBP_PG-=6
BCND CG_ENG_OV_OLD1,NC ;JUMP IF >6
NEG
SAMM TREG1
LLAC PG_EMAX
SATL
LACL #0
SACL TOPBP_PG
CG_ENG_OV_OLD1
;========
LACB
BSAR 6
SACB
SLAC PG_COR
;----
SBRK #61
SPM 3
RPTZ #60
SQRA *+
SLAC PG_ENG
CG_TEST_ENG
;=======ACC=ENG
SPM 0
;----
SACB
LACC #1,15 ;1<<16
SFL
CRGT
SLAC PG_ENG
;==========================================
; y59save = y[l - 2]; y60save = y[l - 1];
;=======ARP==0===================================
LAR AR0,#CG_Y+58
LACC *+
SACL CG_Y59
LACC *
SACL CG_Y60
;==========================================
; ax0=11;
; while(labs(acc)>0x7fffl) { acc>>=1; ax0--; }
; if(ax0>0) accb<<=ax0; ACCB=COR
; else accb>>=-ax0;
;==============ARP==0======ACCB=ENG======================
LACB ;ACCB=ENG
LAR AR0,#11-16
RPT #15
NORM *+
SACH ACCBUF ;ACCBUF=shifted ENG
SFR
SACH ACCBUF+1 ;ACCBUF+1=ACCBUF/2
LLAC PG_COR
SACB
LAMM AR0
SACL PG_RPTC
LACC PG_RPTC
BCND CG_SHIFT11_1,GT
NEG
SAMM TREG1
BD CG_OVER_SHIFT11
LACB
SATL
CG_SHIFT11_1
SUB #1
SACL PG_RPTC
LACB
RPT PG_RPTC
SFL
CG_OVER_SHIFT11
;======ACCBUF=ENG, ACC=COR=========
;==========================================
; if(accb<0) accb-=acc/2;
; else accb+=acc/2;
;==========================================
xc 1,GT
ADD ACCBUF+1
XC 1,LT
SUB ACCBUF+1
;==========================================
;!!!!!!!!!!!!!!!! BE WARN OF OVERFLOW
; accb=accb/acc; //-1330 <..<1330
; acc=accb; granted as |cgain|<0x7fff!!!!!!!!!!!
;===========ACC/ACCBUF->ACCBUF & ACClow===============================
CALL CG_DIV
;-------------
.IF CGAIN_DEBUG
MAR *,AR4 ;AR4->CG_GAIN[512]
SACL *+,0,AR0 ;AR3->CG_MATCH[512*2]
.ENDIF
;-------------
BCND CG_OVER_EMAX,EQ ;RET if cor/eng==0
SACL NEW_PGAIN
SAMM TREG0
;====================================================
; bp_cg=0;
; accb=cor;
; if(accb<0) while(accb<-0x8000lu) { accb>>=1; bp_cg++;}
; else while(accb>0x7fff) { accb>>=1; bp_cg++;}
;====================================================
lar ar0,#16
LLAC PG_COR
RPT #15
NORM *-
SACH ACCBUF ;ACCBUF=shifted COR, TREG0=NEW_PGAIN
MPY ACCBUF
PAC
sacb ;ACCB=MATCH
;======================================================
; acc=accb*acc;
; if(acc<0) {printf("acc=match error <0"); exit(0); }
; while(acc<(1lu<<30) && bp_cg>0) { acc<<=1; bp_cg--; }
; *match=acc;
;======================================================
LAMM AR0
BCND CG_MATCH_CMP,LEQ
SUB #1
SACL PG_RPTC
LACB
RPT PG_RPTC
NORM *-
SACB
;=================================
CG_MATCH_CMP
;--------
.IF CGAIN_DEBUG
NOP
NOP
MAR *,AR3
SACL *+
SACH *+,0,AR0
.ENDIF
;--------
;===========================================
; if( (bp_cg>topbp_cg) || (bp_cg==topbp_cg && acc>=cg_emax) )
; { cg_emax=acc; topbp_cg=bp_cg;
; topcodeword=codeword; topcgain=cgain; }
;===========ACCB=MATCH=ACC==============================
LAMM AR0
SUB TOPBP_PG
BCND CG_OVER_EMAX,LT ;JUMP IF AR0<TOPBP_PG
BCND CG_T_EMAX,GT ;JUMP IF AR0>TOPBP_PG
LLAC PG_EMAX
SBB
BCND CG_OVER_EMAX,GT ;JUMP IF PG_EMAX>*MATCH
CG_T_EMAX
LACB
SLAC PG_EMAX
LAMM AR0
SACL TOPBP_PG
LACC NEW_PGAIN
SACL TOPCGAIN
LACC #CODEBOOK+1022
SUB CG_BOOK
SFR
SACL TOPCBINDEX
CG_OVER_EMAX
;=========================================
RETD
LACL #0
SACL PG_FIRST
;=========================================
;==========================================
.IF CGAIN_DEBUG
.INCLUDE "cg_div.ASM"
.INCLUDE "C50_INIT.ASM"
.INCLUDE "MPY16_32.ASM"
.ENDIF
;=================================================
; 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
; { for(i=l-1;i>=len-1;i--) y[i]=y[i-1];
; for(i=len-2;i>=1;i--) y[i]=y[i-1] + (((long)ex[1]*h1[i] + (long)ex[0]*h1[i+1])>>2);
; y[0]=((long)ex[0]*h1[1] + (long)ex[1] * h1[0])>>2;
; for(i=l-1;i>0;i--) y[i]=y[i-1];
; y[0]=(int)ex[0]<<11; }
; cor = 0;
; for (i = 0;i < l; i++)
; { cor +=(((long)y[i] * (long)e0[i])>>cg_shift);
; if( fabs(cor) >=(1lu<<31) )
; { if(topbp_cg<=6) { cg_emax>>=(6-topbp_cg); topbp_cg==0; }
; else topbp_cg-=6;
; cg_shift=6;
; for(cor=0,i = 0;i<l;i++)cor+=(((long)y[i] * (long)e0[i])>>cg_shift);
; break; }
; }
; if (ex[0] == 0 && ex[1] == 0 && !first) eng = eng - (((long)y59save * (long)y59save)>>cg_shift) - (((long)y60save * (long)y60save)>>cg_shift);
; else
; { for (eng=0,i = 0; i < l; i++)
; { eng += (((long)y[i] * (long)y[i])>>cg_shift); //14.18
; if( eng >=(1lu<<31) )
; { if(topbp_cg<=6) { cg_emax>>=(6-topbp_cg); topbp_cg==0; }
; else topbp_cg-=6;
; cg_shift=6;
; cor=(long)cor>>6;
; for(eng=0,i=0;i<l;i++)eng += ((long)(y[i] * y[i])>>cg_shift);
; break; } } }
; y59save = y[l - 2]; y60save = y[l - 1];
; if(eng < (1lu<<16) ) eng=1lu<<16;
; acc=eng; accb=cor;
; //eng=acc:16.16 cor=accb:27.5
; ax0=11;
; while(labs(acc)>0x7fffl) { acc>>=1; ax0--; }
; if(ax0>0) accb<<=ax0;
; else 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; think cgain<=0x7fff
; cgain=accb;
; bp_cg=0;
; accb=cor;
; if(accb<0) while(accb<-0x8000lu) { accb>>=1; bp_cg++;}
; else while(accb>0x7fff) { accb>>=1; bp_cg++;}
; //accb=cor, acc=cgain=cor/eng
; acc=accb*acc;
; if(acc<0) {printf("acc=match error <0"); exit(0); }
; while(acc<(1lu<<30) && bp_cg>0) { acc<<=1; bp_cg--; }
; *match=acc;
; if( (bp_cg>topbp_cg) || (bp_cg==topbp_cg && acc>cg_emax) )
; { cg_emax=acc; topbp_cg=bp_cg;
; topcodeword=codeword; topcgain=cgain; }
; return (cgain);}
;=================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -