📄 pgain.asm
字号:
;========
SPM 3
SBRK #60
RPTZ #59
MAC E0,*+
BD PG_COR_MAC_NOT_OVERFLOW
APAC
SACB
PG_COR_MACD
LACC PG_SHIFT
MAR *,AR0 ;AR0=Y[58]
XC 1,GT ;PIPELINE
SPM 3
;CLRC OV
BCND PG_COR_CLR_OV2,OV
PG_COR_CLR_OV2
RPTZ #59
MACD PG_X_E0,*- ;AR0: Y[-2]
APAC
;--------
BCND PG_COR_MACD_OVERFLOW,OV
SLAC PG_COR
BD PG_COR_OVER
ADRK #2 ;AR0: Y[0]
SACB
PG_COR_MACD_OVERFLOW
;==================================
; 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 PG_COR_MACD_OV_OLD1,NC ;JUMP IF >6
NEG
SAMM TREG1
LLAC PG_EMAX
SATL
LACL #0
SACL TOPBP_PG
PG_COR_MACD_OV_OLD1
;========
SPM 3
SBRK #60
RPTZ #59
;MACD PG_X_E0,*+
MAC PG_X_E0,*+;!!!!!!!!!!!!!!
APAC
SLAC PG_COR
BD PG_COR_OVER
ADRK #2 ;AR0: Y[0]
SACB
;=================================
; cor = 0.0; eng = 0.0;
;=================================
;=================================
; for (i = 0; i < l; i++)
; { cor += (((long)y2[i] * (long)e0[i])>>bp_pgain);
; eng += (((long)y2[i] * (long)y2[i])>>bp_pgain);
; //cor += y2[i] * e0[i]; eng += y2[i] * y2[i];
; }
;=========ARP==0=======================
; if(bp_pgain==6) pm==3
;======================================
PG_COR_OVER
BCND PG_OVER_EMAX,EQ ;IF COR=0 RET
;SACB ;AR0: Y2[0]/Y[0]
RPTZ #60 ;GET ENG :61 times
SQRA *+
BCNDD PG_ENG_NOT_OVERFLOW,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 PG_ENG_OV_OLD1,NC ;JUMP IF >6
NEG
SAMM TREG1
LLAC PG_EMAX
SATL
LACL #0
SACL TOPBP_PG
PG_ENG_OV_OLD1
;========
LACB
BSAR 6
SACB
SLAC PG_COR
;----
SBRK #61
SPM 3
RPTZ #60
SQRA *+
SLAC PG_ENG
PG_ENG_NOT_OVERFLOW
SPM 0
;========ACC=ENG ACCB=COR=========================
; accb=cor; acc=eng; p32=cor;
; ax0=0;
; while(labs(acc)>0x7fffl) { acc>>=1; ax0++; }
; if(acc<1l) acc=1l;
; accb>>=ax0;
;=======ARP--0==========================
LAR AR0,#16
RPT #15
NORM *-
BSAR 16 ;ACCH->ACCL
XC 1,LEQ
LACL #1
SACL ACCBUF
LAMM AR0
SAMM TREG1
LACB
SATL
;=================================
; ax0=0;
; while( labs(accb)>= acc ) { accb>>=1; ax0++; }
;=======ARP==0==========================
LAR AR0,#0
PG_MATCH1
SACB ;ACCB== SHIFTED COR
ABS
SUB ACCBUF
BCNDD PG_MATCH2,NC ;JUMP IF |ACCB|<ACCBUF
LAMM AR0
SAMM TREG1
;----
LACB
BD PG_MATCH1
SFR
MAR *+
PG_MATCH2
;=================================
; acc=(accb<<14)/acc; acc=acc<<ax0; accb=acc;
; if(labs(accb)>0x7fff) accb=(accb<0) ? -0x8000 : 0x7fff;
; pgain=accb;
;============ARP==0=====================
CALLD PG_DIV ;ACCBUF+1/ACCBUF ->2.14 RESULT IN ACL & ACCBUF
LACB
SACL ACCBUF+1
LACT ACCBUF ;TREG1=AR0
SACB
SAMM TREG0
ABS
SUB #7FFFH
LACB
LAR AR0,#16
BCND PG_MATCH4,NC
ADRK #16
LACB
RPT #15
NORM *-
BSAR 16
SAMM TREG0
;---
XC 2,GT
LACC #7FFFH
XC 2,LT
LACC #1,15
PG_MATCH4
SACL NEW_PGAIN
;--------
.IF PGAIN_DEBUG
MAR *,AR4 ;AR4->PG_GAIN
SACL *+,0,AR0
.ENDIF
;--------
;============ACCB=PGAIN=====================
; bp_pg=0;
; if(acc<0) while(acc<-0x8000lu) { acc>>=1; bp_pg++;}
; else while(acc>0x7fff) { acc>>=1; bp_pg++;}
;===========ARP--0=======================
; accb=cor;
; if(accb<0) while(accb<-0x8000lu) { accb>>=1; bp_pg++;}
; else while(accb>0x7fff) { accb>>=1; bp_pg++;}
;==================================
LLAC PG_COR
RPT #15
NORM *-
SACH ACCBUF ;ACCBUF=shifted COR, TREG0=shifted COR/ENG
;===================================
MPY ACCBUF
PAC
SACB
;====================================
; *match=(float)accb*(acc<<ax0);
; while(*match<(1lu<<30) && bp_pg>0) { *match *=2; bp_pg--; }
;=================================
LAMM AR0
BCND PG_MATCH_CMP,EQ
SUB #1
SACL ACCBUF
LACB
RPT ACCBUF
NORM *-
SACB
;=================================
PG_MATCH_CMP
.IF PGAIN_DEBUG
MAR *,AR5
SACL *+
SACH *+,0,AR0
.ENDIF
;--------
;=========================================
; if( (bp_pg>oldbp_pg) || (bp_pg==oldbp_pg && *match>oldmatch) )
; { oldmatch=(long)*match; oldbp_pg=bp_pg;
; topm=m; top_pgain=pgain; }
;=======ACCB=ACC=*MATCH==================================
LAMM AR0
SUB TOPBP_PG
BCND PG_OVER_EMAX,LT ;JUMP IF AR0<TOPBP_PG
BCND PG_T_EMAX,GT ;JUMP IF AR0>TOPBP_PG
LLAC PG_EMAX
SBB
BCND PG_OVER_EMAX,C ;JUMP IF PG_EMAX>=*MATCH
PG_T_EMAX
LACB
SLAC PG_EMAX
LACC PG_M
SACL TOPM
LAMM AR0
SACL TOPBP_PG
LACC NEW_PGAIN
SACL TOPPGAIN
PG_OVER_EMAX
;=========================================
RETD
ZAP
SACL PG_FIRST
;=========================================
;float wpgain(ex[279], l=60, first=0/1, m, len=30, match[256])
;{ 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-1]=acc>>13; }
; }
; else
; { //for (i = len - 1; i > 0; i--) y[i - 1] += ex[0] * h[i];
; for (i = len - 1; i > 0; i--)
; { acc = (long)ex[0] *(long)h1[i];
; y[i-1] += (acc>>13); }
; //for (i = l - 1; i > 0; i--) y[i] = y[i - 1];
; //y[0] = ex[0] * h[0];
; //y[0] = (((long)ex[0] * (long)h1[0])>>13);
; y[-1] = (((long)ex[0] * (long)h1[0])>>13);
; }
; if(m>=l) for (i = 0; i < l; i++) y2[i] = y[i-1]; do not need y2!
; else if( m>=l/2)
; { for (i = 0; i < m; i++) y2[i] = y[i-1];
; for (i = m; i < l; i++) y2[i] = y[i-1] + y[i-1 - m]; }
; else { for (i = 0; i < m; i++) y2[i] = y[i-1];
; for (i = m; i < 2*m; i++) y2[i] = y[i-1] + y[i-1 - m];
; for (i = 2 * m; i < l; i++) y2[i] = y[i-1] + y[i-1-m] + y[i-1- 2 * m];}
; for (i = l - 1; i > 0; i--) y[i] = y[i - 1];
; cor = 0.0; eng = 0.0;
; acc=0l; accb=0l;
; for (i = 0; i < l; i++)
; { cor += (((long)y2[i] * (long)e0[i])>>pg_shift);
; if( fabs(cor) >=(1lu<<31) )
; { pg_shift=6;
; if(oldbp_pg<=6) { oldmatch>>=(6-oldbp_pg); oldbp_pg==0; }
; else oldbp_pg-=6;
; for (cor=0,i = 0; i < l; i++) cor += ((long)(y2[i] * e0[i])>>pg_shift);
; break; } }
; for(i=0;i<l;i++)
; { eng += ((long)(y2[i] * y2[i])>>pg_shift);
; if( eng >=(1lu<<31) )
; { if(oldbp_pg<=6) { oldmatch>>=(6-oldbp_pg); oldbp_pg==0; }
; else oldbp_pg-=6;
; pg_shift=6;
; cor=(long)cor>>6;
; for(eng=0,i=0;i<l;i++) eng += ((long)(y2[i] * y2[i])>>pg_shift);
; break; } }
; acc=(long)eng; accb=(long)cor;
; ax0=0;
; while(labs(acc)>0x7fffl) { acc>>=1; ax0++; }
; accb>>=ax0;
; if(acc<1l) acc=1l;
; ax0=0;
; while( labs(accb)>= acc ) { accb>>=1; ax0++; }
; acc=(accb<<14)/acc;
; acc<<=ax0; accb=acc;
; if(labs(accb)>0x7fff) accb=(accb<0) ? -0x7fff-1 : 0x7fff;
; pgain=accb;
; bp_pg=0;
; if(acc<0) while(acc<-0x8000lu) { acc>>=1; bp_pg++;}
; else while(acc>0x7fff) { acc>>=1; bp_pg++;}
; accb=cor;
; if(accb<0) while(accb<-0x8000lu) { accb>>=1; bp_pg++;}
; else while(accb>0x7fff) { accb>>=1; bp_pg++;}
; *match=(float)accb*acc;
; while(*match<(1lu<<30) && bp_pg>0) { *match *=2; bp_pg--; }
; if( (bp_pg>oldbp_pg) || (bp_pg==oldbp_pg && *match>oldmatch) )
; { oldmatch=(long)*match; oldbp_pg=bp_pg;
; topm=m; top_pgain=pgain; }
; pgain=pgain/0x4000;
; return (pgain);}
;=================================
.INCLUDE "MPY16_32.ASM"
.INCLUDE "pg_div.ASM"
.IF PGAIN_DEBUG
.INCLUDE "C50_INIT.ASM"
.ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -