⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pgain.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
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 + -