?? tpgain.asm
字號:
PGAIN_DEBUG .SET 1
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.IF PGAIN_DEBUG
.version 50
.mmregs
.MLIB "mac.lib"
.SECT "ONCHIP1"
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
.DATA
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
LAR AR0,#PG_X_E0+59
LACC #E0
SAMM BMAR
MAR *,AR0
RPT #59
BLDD BMAR,*-
LACC #30
SACL PG_LEN
LACC #20
SACL PG_M
LACC #6
SACL PG_BP
LACC #1
SACL PG_FIRST
LACC #650
SACL PG_BP_FLAG
SLAC EMAX
LAR AR5,#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
.bss BB,5
;-------------
PG_X_E0 .USECT "ONCHIP0",60
PG_Y_1 .USECT "DRAM",1 ;serve as the y[-1]
PG_Y .USECT "DRAM",60
PG_Y2 .USECT "DRAM",60
PG_GAIN .USECT "ONCHIP0",256
PG_MATCH .USECT "ONCHIP0",256*2
;--------------
.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]
;AR0(EX),AR1(IMP_H),AR2(PG_Y),AR7(BANZ)
;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
.BSS PG_LEN_1,1
.BSS PG_RPTC,1
.BSS PG_EX,1
.bss PG_Y_ADDR,1
;-----------------------------------
;=================================
PGAIN
LACC PG_LEN
SUB #1
SACL PG_LEN_1
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 #PG_Y_1
;SACL PG_Y_ADDR
LACC #PS_V0+219
SUB PG_M
SAMM AR0
LACC PG_LEN
ADD #IMP_H-1
SAMM AR1
LACC PG_LEN
ADD #PG_Y-2
SAMM AR2
MAR *,AR0
LT *,AR1
MPY *-,AR2
LACC PG_LEN
SUB #2
SAMM BRCR
RPTB PG_NOT_FIRST_I-1
LACC *,13,AR1 ;AR0->Y[I-1]
MPYA *-,AR2
;BSAR 13
;SACL *-
SACH *-,3
PG_NOT_FIRST_I
;==========================================
; //for (i = l - 1; i > 0; i--) y[i] = y[i - 1];
; //y[0] = ex[0] * h[0];
; y[-1] = (((long)ex[0] * (long)h1[0])>>13);
; }
;==========================================
;LAR AR2,#PG_Y+58
;MAR *,AR2
;RPT #58
; DMOV *-
LAR AR2,#PG_Y_1
LAR AR1,#IMP_H
MAR *,AR1
MPY *,AR2 ;TREG0=PS_V0[0]
PAC
BD PG__Y2
BSAR 13
SACL *
;=================================
;{ 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; } }
;=================================
PG__FIRST
;=================================
LACC #PG_Y_1
SACL PG_Y_ADDR
LACC #IMP_H
SAMM BMAR
;SAMM AR1
ZAC
SACL PG_RPTC
LACC #59
SAMM BRCR
LACC #PS_V0+219
SUB PG_M
SAMM AR0 ;AR0->EX[0]
SACL PG_EX
MAR *,AR0
LAR AR2,#PG_Y_1
;-------
RPTB PG_FIRST_I-1
ZAP
RPT PG_RPTC ;AR0 -> EX[I] , BMAR->H[0]
;MAC IMP_H,*-
MADS *-
APAC
BSAR 13
MAR *+,AR2 ;AR0->H[0]
SACL *+,0,AR0
LACC PG_RPTC
ADD #1
SACB
LACC PG_LEN_1 ;29/59
CRLT
SACL PG_RPTC
LACC PG_EX
ADD #1
SACL PG_EX
SAMM AR0 ;AR0->EX[I]
PG_FIRST_I
;=================================
; 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]; }
;=================================
PG__Y2
LACC PG_M
SUB #60
BCNDD PG_COR_MACD,C ;JUMP IF M>=60
LAR AR0,#PG_Y_1+59
;=====
PG_M_GEQ_30
LACC PG_M
SUB #1
SACL PG_RPTC ;PG_RPTC=M-1
SUB #29
BCNDD PG_M_LT_30,NC ;JUMP IF M<30
LAR AR0,#PG_Y2
;-----
LACC PG_Y_ADDR
SAMM AR1
SAMM BMAR
MAR *,AR0
RPT PG_RPTC
BLDD BMAR,*+ ;AR0->Y2[M]
LACC PG_M
SUB #59
ABS
SAMM BRCR
LACC PG_Y_ADDR
ADD PG_M
SAMM AR2
MAR *,AR1 ;for (i = m; i < l; i++)
RPTB PG_M_GEQ_30_1-1 ; y2[i] = y[i-1] + y[i-1 - m]; //WHT
LACC *+,0,AR2 ;ARP==0-->AR1
ADD *+,0,AR0
SACL *+,0,AR1
PG_M_GEQ_30_1
B PG_COR_MAC
;====================================================
; 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];}
;====================================================
PG_M_LT_30
;LAR AR0,#PG_Y2 ;BMAR=PG_Y_1=Y[-1]
LACC PG_Y_ADDR
SAMM AR1
ADD PG_M ;AR0: Y2[I] AR3: Y2[I+M] ar1:y[i-1] ar2:y[i-1+m]
SAMM AR2
LAMM AR0
ADD PG_M
SAMM AR3
LACC PG_RPTC ;M-1
SAMM BRCR
MAR *,AR1 ;for (i = m; i < 2*m; i++)
RPTB PG_M_LT_30_1-1 ; y2[i] = y[i-1] + y[i-1 - m]; //WHT
LACC *+,0,AR0 ;ARP==0-->AR1
SACL *+,0,AR2
ADD *+,0,AR3
SACL *+,0,AR1
PG_M_LT_30_1
LACC PG_M,1
SUB #59
ABS
SAMM BRCR
MAR *,AR0
;-----------
; for (i = 2 * m; i < l; i++) y2[i] = y[i-1] + y[i-1-m] + y[i-1-2 * m];}
;----------AR0:Y2[M], AR3:Y2[2*M], AR2:Y[2*M-1], ARP==1
RPTB PG_COR_MAC-1
LACC *+,0,AR2
ADD *+,0,AR3
SACL *+,0,AR0
PG_COR_MAC
MAR *,AR0
LAR AR0,#PG_Y_1+59
RPT #59
DMOV *-
LACC PG_BP
LAR AR0,#PG_Y2
XC 1,GT ;PIPELINE
SPM 3
ZAP
RPT #59
MAC E0,*+
APAC
SACB
SLAC PG_COR
BD PG_COR_OVER
LAR AR0,#PG_Y2
PG_COR_MACD
LACC PG_BP
MAR *,AR0 ;AR0=Y[58]
XC 1,GT ;PIPELINE
SPM 3
ZAP
RPT #59
MACD PG_X_E0,*- ;AR0: Y[-2]
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
;SACB ;AR0: Y2[0]/Y[0]
ZAP
RPT #60 ;GET ENG :61 times
SQRA *+
SLAC PG_ENG
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
;LAMM AR0
;SAMM TREG1
;----
;LACB
;SACL ACCBUF+1
;=================================
; acc=(accb<<14)/acc; pgain=acc<<ax0;
; acc=pgain;
; if(labs(acc)>0x7fff) PGAIN=(acc<0) ? -0x8000l : 0x7fff;
;=================================
CALLD PG_DIV ;ACCBUF+1/ACCBUF ->2.14 RESULT IN ACL & ACCBUF
LACB
SACL ACCBUF+1
LACT ACCBUF ;TREG1=AR0
SACB
ABS
SUB #7FFFH
;LACB
BCNDD PG_MATCH4,NC
LACB
SACL BB+2
;---
XC 2,GT
LACC #7FFFH
XC 2,LT
LACC #1,15
SACL BB+2
PG_MATCH4
;--------
.IF PGAIN_DEBUG
MAR *,AR4 ;AR4->PG_GAIN
SACL *+,0,AR1
.ENDIF
;--------
;SACL BB+2
;=================================
; if(ax0>4) ax0-=4; //ACCB<(ACC<<AX0)
; 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; }
;=========================================
LLAC 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
BD PG_MATCH9
XC 1,C
BSAR 8
;----
PG_MATCH6
LACC PG_BP_FLAG
SUB #10
BCNDD PG_MATCH7,C ;JUMP IF PG_BP_FLAG>=10
LACB
BSAR 8
;----
LAR AR1,#IMP_H+1
MAR *,AR1
LACC *,0,AR3 ;else if(bp_pflag<10 && fabs(h[1])<1.0 ){accb>>=2;}
ABS
SUB #2000H
LACB
XC 1,NC ;SHIFT IF H[1]<1.0
BSAR 2
;XC 1,C ;SHIFT IF H[1]>=1.0
;BSAR 8
BD PG_MATCH9
XC 1,C ;SHIFT IF H[1]>=1.0
BSAR 8
;---
PG_MATCH7 ;else { accb>>=8; }//acc>>=4; }
;LACB
;BSAR 8
PG_MATCH9
;--------------
SLAC MPY_32
ABS
SUB #7FFFH
BCNDD PG_DO_MPY32,C ;JUMP IF >=0X7FFF
LT ACCBUF
MPY MPY_32
;-----
BD PG_OVER_MPY32
PAC
SACB
;====================================
; *match=(float)accb*(acc<<ax0);
;=================================
PG_DO_MPY32
;SLAC MPY_32
CALLD MPY16_32
LACC ACCBUF
SACL MPY_16
SACB
PG_OVER_MPY32
LAMM AR0
SAMM TREG1
LACB
SATL
;---------
.IF PGAIN_DEBUG
MAR *,AR5
SACL *+
SACH *+
.ENDIF
;--------
;=========================================
; if(*match>EMAX) { PGemax=*match; PGemax_ptr=m-20; }
;=======ACC=*MATCH==================================
SACB
LLAC EMAX
SBB
BCND PG_OVER_EMAX,C ;JUMP IF EMAX>=*MATCH
LACB
SLAC EMAX
LACC PG_M
SUB #20
SACL EMAX_PTR
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;
; 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; }
; while(labs(accb)>0x7fff) { ax0++; accb>>=1; }
; *match=(float)accb*(acc<<ax0);
; acc=pgain;
; if(labs(acc)>0x7fff) acc=(acc<0) ? -0x8000l : 0x7fff;
; pgain=pgain/0x4000;
; if(*match>EMAX) { PGemax=*match; PGemax_ptr=m-20; }
; if (match[i] > emax)
; { topptr = i; emax = match[topptr]; }
; return (pgain); }
;=================================
.INCLUDE "MPY16_32.ASM"
.INCLUDE "pg_div.ASM"
.IF PGAIN_DEBUG
.INCLUDE "C50_INIT.ASM"
.ENDIF
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -