📄 pgain.asm
字号:
PGAIN_DEBUG .SET 0
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.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 #ACCBUF
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 #1
SACL PG_FIRST
LAR AR5,#PG_MATCH
LAR AR4,#PG_GAIN
;----------
;first = TRUE; pg_shift=0; oldbp_pg=0; oldmatch=0l;
LACL #0
SACL PG_SHIFT
SACL TOPBP_PG
SLAC PG_EMAX
;---------
LOOP_PG
CALL PGAIN
LACL #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
;-------------
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_SHIFT,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
;-----------
.BSS TOPM,1
.BSS TOPBP_PG,1
.BSS TOPPGAIN,1
.BSS NEW_PGAIN,1
.BSS PG_SHIFT,1
.BSS PG_EMAX,2
;-----------------------------------
;=================================
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
PAC
SACH *,3
;=================================
;{ 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]
MADS *-
APAC
;BSAR 13
MAR *+,AR2 ;AR0->H[0]
SACH *+,3,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_SHIFT
LAR AR0,#PG_Y2
XC 1,GT ;PIPELINE
SPM 3
;CLRC OV
BCND PG_COR_CLR_OV1,OV
PG_COR_CLR_OV1
RPTZ #59
MAC E0,*+
APAC
;--------
BCND PG_COR_MAC_OVERFLOW,OV
SACB
PG_COR_MAC_NOT_OVERFLOW
SLAC PG_COR
BD PG_COR_OVER
LAR AR0,#PG_Y2
PG_COR_MAC_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_MAC_OV_OLD1,NC ;JUMP IF >6
NEG
SAMM TREG1
LLAC PG_EMAX
SATL
LACL #0
SACL TOPBP_PG
PG_COR_MAC_OV_OLD1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -