📄 pgain611.asm
字号:
PGAIN_DEBUG .SET 0
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.IF PGAIN_DEBUG
.version 50
.mmregs
.MLIB MAC.LIB
.DATA
PS_V0 .int 0,0,0,0,0,0,0,0,0,0,1451,1316,1600,581,242,1467,1220,270,438,0
.int -1456,-158,143,-154,-1181,121,-287,-1060,1513,-156,282,-237,127,21,-1458,-1456,0,-18,-40,-1526
.int 2415,-89,-15,88,-1243,1330,12,949,1215,94,-1037,-209,-188,207,-922,0,-300,-80,-1330,106
.int -104,324,-2242,-1109,-403,1162,-1017,-846,-188,-304,0,1008,1439,1230,1436,818,-84,1528,2064,-1049
.int 108,-196,-1166,-89,-15,1010,-322,0,12,-1303,1134,1085,-89,-15,88,87,-1330,-1318,949,22
.int -1549,-2877,0,-20,-43,-2951,2564,-1425,-16,93,-1321,1412,12,1007,-40,99,-1102,-1552,-200,219
.int -980,0,-319,-85,-1413,112,1219,-986,-2381,-1178,-428,1233,-2411,-899,1130,-323,0,2400,1528,1306
.int 1524,868,-1420,1622,2191,-1114,114,1121,-1239,-95,-16,1072,-1672,0,12,-2714,1204,1152,-95,-125
.int -21,122,-1209,-524,-1838,1322,30,-2160,-4011,0,-1358,1270,-4114,3574,-657,-23,1459,-1842,1968,1346
.int 1403,-56,-1192,-1537,-2164,-279,305,-37,1330,-445,1211,-1970,156,1699,-1375,-3320,-1643,-597,1718,-3361
.int -2584,1575,-451,1330,3345,2130,1820,3454,1209,-3310,2261,3054,-223,158,1562,-1728,1197,-23,1494,0
.int 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.int 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.int 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
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 #PG_FIRST
LACC #20
SACL PG_M
LACC #6
SACL PG_BP
LACC #1
SACL PG_FIRST
LAR AR3,#PG_MATCH
LAR AR4,#PG_GAIN
LOOP_PG
CALL PGAIN
LACC #0
SACL PG_FIRST
LACC PG_M
ADD #1
SACL PG_M
SUB #70
BCND LOOP_PG,NEQ
HERE: B HERE
;------------
.BSS ACCBUF,2
.BSS SIGNFLAG,1
.BSS PG_FIRST,1
.BSS PG_BP,1
.BSS PG_BP_FLAG,1
.BSS EMAX_PTR,1
.BSS EMAX,2
;-------------
PG_MATCH .USECT "WARRAY",256*2
PG_GAIN .USECT "WARRAY",256
PG_Y .USECT "WARRAY",60
PG_Y2 .USECT "WARRAY",60
;--------------
.ENDIF
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;ACCBUF*2, SIGNFLAG ,PG_FIRST,PG_M,PG_BP,PG_COR*2,PG_ENG*2,PG_BP_FLAG
;CALL MPY16_32, PG_DIV
;AR3->PG_MATCH[256*2], AR4->PG_GAIN[256]
;PUSH AR0,AR1,AR2,AR7
;ACC,ACCB,PREG,TREG0/1,BRCR
;ARRAY: PG_MATCH[256*2], PG_GAIN[256], PG_Y[60], PG_Y2[60], IMP_H[60], E0[60]
;H: 3.13,
;PG_Y: 16.0
.BSS PG_M,1
.BSS PG_COR,2
.BSS PG_ENG,2
.BSS PG_LEN,1
;-----------------------------------
;=================================
PGAIN
;LAMM AR0
;PUSH
;LAMM AR1
;PUSH
;LAMM AR2
;PUSH
LACC PG_FIRST
BCND PG__FIRST,NEQ
;==========================================
; 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); }
;==========================================
LACC #PS_V0+219
SUB PG_M
SAMM AR0
;LAR AR0,#PS_V0
;LAR AR1,#IMP_H+29
LACC PG_LEN
ADD #IMP_H-1
SAMM AR1
;LAR AR2,#PG_Y+28
LACC PG_LEN
ADD #PG_Y-2
SAMM AR2
MAR *,AR0
LT *,AR1
LACC PG_LEN
SUB #2
;LACC #28
SAMM BRCR
RPTB PG_NOT_FIRST_I-1
MPY *-,AR2
PAC
BSAR 13
ADD *
SACL *-,0,AR1
PG_NOT_FIRST_I
;==========================================
; 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);
; }
;==========================================
LAR AR2,#PG_Y+58
MAR *,AR2
RPT #58
DMOV *-
LAR AR2,#PG_Y
LAR AR1,#IMP_H
MAR *,AR1
MPY *,AR2 ;TREG0=PS_V0[0]
PAC
BSAR 13
SACL *
B PG__Y2
;=================================
;{ 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>>13; } }
;=================================
PG__FIRST
;=================================
;LAMM AR7
;PUSH
LACC #59
SAMM AR7
;LAR AR0,#PS_V0
LACC #PS_V0+219
SUB PG_M
SAMM AR0
LAR AR2,#PG_Y
LAMM AR0
PUSH
MAR *,AR1
PG_FIRST_I
;-----------
LAMM AR7
SUB #59
ABS
SACB
;LACC #29
LACC PG_LEN
SUB #1
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 PG_FIRST_J-1
MPYA *-,AR1
LT *+,AR0
NOP
PG_FIRST_J
APAC
BSAR 13 ;y[i]=acc>>13; } }
MAR *,AR2
SACL *+,0,AR7
POP
ADD #1
PUSH
SAMM AR0
;MAR *,AR7
BANZ PG_FIRST_I,*-,AR1
pop ;pop out AR0
;POP
;SAMM AR7
;=================================
; for (i = 0; i < l; i++) y2[i] = y[i];
; if (m < l)
; { //for (i = m; i < l; i++) y2[i] = y[i] + y[i - m];
;<--> for (i = m; i < l; i++) y2[i] = y2[i] + y[i - m]; //WHT
;=================================
PG__Y2
LACC #PG_Y
SAMM BMAR
LAR AR0,#PG_Y2
MAR *,AR0
RPT #59
BLDD BMAR,*+
LACC PG_M
SUB #60
BCNDD PG_CORENG,C ;JUMP IF PG_M>=60 ,ARP==0
;------
LAR AR0,#PG_Y
ABS
;------
SUB #1
SAMM BRCR
LACC #PG_Y2 ;ARP==0
ADD PG_M
SAMM AR1 ;for (i = m; i < l; i++)
RPTB PG_Y2_1-1 ; y2[i] = y2[i] + y[i - m]; //WHT
LACC *+,0,AR1 ;ARP==0-->AR1
ADD *
SACL *+,0,AR0
PG_Y2_1
;================================
; if (m < l / 2)
; for (i = 2 * m; i < l; i++) y2[i] = y2[i] + y[i - 2 * m]; }
;================================
LACC PG_M
SUB #30
BCNDD PG_CORENG,C
;------
LAR AR0,#PG_Y
ABS
;------
SFL
SUB #1 ;2*(M-L/2)=2*M-L
SAMM BRCR
LACC #PG_Y2
ADD PG_M,1
SAMM AR1 ;for (i = 2 * m; i < l; i++)
RPTB PG_CORENG-1 ; y2[i] = y2[i] + y[i - m]; //WHT
LACC *+,0,AR1 ;ARP==0
ADD *
SACL *+,0,AR0
PG_CORENG
;=================================
; 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
;======================================
LACC PG_BP
LAR AR0,#PG_Y2
XC 1,GT
SPM 3
ZAP
RPT #60 ;GET ENG :61 times
SQRA *+
SACL PG_ENG
SACH PG_ENG+1
SACB
;---ARP==0-------
LAR AR0,#PG_Y2
LAR AR1,#E0
LACC #29
SAMM BRCR
ZAP
RPTB PG_GET_COR-1
LT *+,AR1 ;cor += (((long)y2[i] * (long)e0[i])>>bp_pgain);
MPYA *+,AR0
LT *+,AR1
MPYA *+,AR0
PG_GET_COR
APAC
SACL PG_COR
SACH PG_COR+1
SPM 0
;=================================
; accb=cor; acc=eng; p32=cor;
; ax0=0;
; while(labs(acc)>0x7fffl) { acc>>=1; ax0++; }
; if(acc<1l) acc=1l;
; accb>>=ax0;
;=======ARP--0==========================
EXAR
LAR AR0,#16
RPT #15
NORM *-
NOP
XC 2,LEQ
LACC #1
SACH 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
BCND PG_MATCH2,NC ;JUMP IF |ACCB|<ACCBUF
LACB
SFR
MAR *+
B PG_MATCH1
PG_MATCH2
LAMM AR0
SAMM TREG1
LACB
;SATL
SACL ACCBUF+1
;=================================
; acc=(accb<<14)/acc; pgain=acc<<ax0;
; acc=pgain;
; if(labs(acc)>0x7fff) PGAIN=(acc<0) ? -0x8000l : 0x7fff;
;=================================
CALL PG_DIV ;ACCBUF+1/ACCBUF ->2.14 RESULT IN ACL & ACCBUF
LACT ACCBUF ;TREG1=AR0
SACB
ABS
SUB #7FFFH
LACB
BCND PG_MATCH4,NC
XC 2,GT
LACC #7FFFH
XC 2,LT
LACC #1,15
PG_MATCH4
MAR *,AR4 ;AR4->PG_GAIN
SACL *+,0,AR1
;=================================
; if(ax0>4) ax0-=4;
; else { acc>>=(4-ax0); ax0=0; }
;=========================================
LAMM AR0
SUB #4
SAMM AR0
BCND PG_MATCH5,C ;JUMP IF AR0>=4
LAR AR0,#0
ABS
SAMM TREG1
LACC ACCBUF
SATL
SACL ACCBUF
PG_MATCH5
;=========================================
; accb=cor;
; if(bp_pflag>100 && bp_pgain==0 ) { accb>>=10; }//acc>>=2;}
; else if(bp_pflag<10 && fabs(h[1])<1.0 ) { accb>>=2; }//acc>>=4; }
; else { accb>>=8; }//acc>>=4; }
;=========================================
LACC PG_COR+1,16
OR PG_COR
SACB
LACC PG_BP_FLAG
SUB #101
BCND PG_MATCH6,NC ;JUMP IF bp_flag<=100
LACC PG_BP
SUB #1
LACB
XC 1,NC ;SHIFT IF BP_PGAIN==0
BSAR 10
XC 1,C
BSAR 8
B PG_MATCH9
PG_MATCH6
LACC PG_BP_FLAG
SUB #10
BCND PG_MATCH7,NC
LAR AR1,#IMP_H+1
MAR *,AR1
LACC *,0,AR3 ;else if(bp_pflag<10 && fabs(h[1])<1.0 ){accb>>=2;}
ABS
SUB #4000H
LACB
XC 1,NC ;SHIFT IF H[1]<1.0
BSAR 2
XC 1,C
BSAR 8
B PG_MATCH9
PG_MATCH7 ;else { accb>>=8; }//acc>>=4; }
LACB
BSAR 8
PG_MATCH9
;=================================
; *match=(float)accb*(acc<<ax0);
;=================================
SACL MPY_32
SACH MPY_32+1
LACC ACCBUF
SACL MPY_16
CALL MPY16_32
SACB
LAMM AR0
SAMM TREG1
LACB
SATL
MAR *,AR3
SACL *+
SACH *+
;=========================================
;if(emax>*match) { emax=*match; emax_ptr=m-20; }
;=========================================
SACB
LLAC EMAX
SBB
BCND PG_OVER_EMAX,LEQ
ADDB
SLAC EMAX
LACC PG_M
SUB #20
SACL EMAX_PTR
PG_OVER_EMAX
;=========================================
;POP
;SAMM AR2
;POP
;SAMM AR1
;POP
;SAMM AR0
RET
;=========================================
;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]=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);
; }
; for (i = 0; i < l; i++) y2[i] = y[i];
; if (m < l)
; { for (i = m; i < l; i++) y2[i] = y[i] + y[i - m];
; if (m < l / 2)
; for (i = 2 * m; i < l; i++) y2[i] = y2[i] + y[i - 2 * m];
; }
; 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];
; }
; accb=cor; acc=eng; p32=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; pgain=acc<<ax0;
; if(ax0>=4) ax0-=4;
; else { acc>>=(4-ax0); ax0=0; }
; accb=cor;
; if(bp_pflag>100 && bp_pgain==0 ) { accb>>=10; }//acc>>=4; }
; else if(bp_pflag<10 && fabs(h[1])<1.0 ) { accb>>=2; }//acc>>=4; }
; else { accb>>=8; }//acc>>=4; }
; *match=(float)accb*(acc<<ax0);
; acc=pgain;
; if(labs(acc)>0x7fff) acc=(acc<0) ? -0x8000l : 0x7fff;
; pgain=pgain/0x4000;
; if(emax>*match) { PGemax=*match; PGemax_ptr=m-20; }
; 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 + -