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

📄 tcosold.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
字号:
	.version        50
	.mmregs
	.BSS TLSP_0,1
	.BSS TLSP_1,1
	.BSS TLSP_2,1
	.BSS TLSP_0_M,1
	.BSS TLSP_1_M,1
	.BSS IBUF,1
	.BSS LOW,1
	.BSS LEVELS,1
	.BSS ERRORDN,1
	.BSS ERRORUP,1
	;--------
FLEN	.SET 240
P10	.SET 10
P10_1	.SET 9
	;-----------
TEMPLSP	.USECT "WARRAY",10
FINDEX  .USECT "WARRAY",10
	.data
LSP	.INT 34eh,8ceh,1093h,171eh,24a6h,27b3h,2d4dh,34b3h,39b5h,3b57h
	;// 2,  10,  10,  10,  15,  6,  7,  7,  7,  6,
LSPTAB	.COPY "LSPTAB.DAT"
BITS_1	.INT 7,15,15,15,15,7,7,7,7,7 ;//{3, 4, 4, 4, 4, 3, 3, 3, 3, 3};
	;----------
	.text
	CALL C50_INIT
	CALL LSP34
HERE:	NOP
	B HERE
;=================================
LSP34
	LDP #IBUF
	LAR AR7,#P10_1
	LAR AR0,#FINDEX
	LAR AR1,#LSPTAB
	LAR AR2,#LSP
	LAR AR3,#BITS_1
	LAR AR4,#TEMPLSP
	LACC #2
	SAMM INDX
;=================================
;  for (i = 0; i < no; i++)
;  { levels = (1 << bits[i]) - 1;
;    low = dist = fabs(freq[i] - *newlsptab[i] );
;    findex[i] = 0;
;=================================
	LACC #0
	SACL IBUF
	MAR *,AR3
LSP34_FOR
	LACC *+,0,AR5
	SACL LEVELS
	LACC #LSPTAB
	ADD IBUF,4
	SAMM AR5
	MAR *,AR5
	LACC *+,0,AR2
	SUB *,0,AR0
	ABS
	SACL LOW
	LACC #0
	SACL *,0,AR2
;=========================================
;    for (j = 1; j <= levels; j++)
;    { dist = fabs(freq[i] - newlsptab[i][j]);
;      if (dist < low)
;      { low = dist;  findex[i] = j;   TEMPLSP[i]=newlsptab[i][j]; }  }
;=========ARP=2================================
	LACC LEVELS
	SUB #1
	SAMM BRCR
	RPTB LSP34_FOR_J-1
	   LACC *,0,AR5
	   SUB *+,0,AR0
	   ABS
	   SACB
	   LACC LOW
	   EXAR
	   CRLT
	   BCND LSP34_FOR_J_1,NC	  ;jump if DIST>=LOW.. low<=dist
	   SACL LOW
	   LAMM BRCR
	   SUB LEVELS
	   ABS
	   SACL *,0,AR5
	   MAR *-
	   LACC *+,0,AR4
	   SACL *,0,AR2
LSP34_FOR_J_1
	   MAR *,AR2
	   NOP
LSP34_FOR_J
;=========================================
;    if (i > 0)
;    { if (newlsptab[i][findex[i]] <= newlsptab[i - 1][findex[i - 1]])
;      {tlsp_0=newlsptab[i][findex[i]];
;	tlsp_1=newlsptab[i-1][findex[i-1]];
;	//tlsp_2=newlsptab[i-2][findex[i-2]];
;	tlsp_0_m=newlsptab[i][mmin(findex[i] + 1, levels)];
;	tlsp_1_m=newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)];
;=========================================
	LACC IBUF
	BCND LSP34_NEXT_FOR,EQ
	MAR *,AR4
	LACC *-
	SACL TLSP_0
	SACB
	LACC *0+
	SACL TLSP_1
	CRLT				;jump if TLSP_1<TLSP_0
	BCND LSP34_NEXT_FOR,C
	SBRK #3
	LACC *0+			;INDX=2
	SACL TLSP_2
	MAR *+,AR0
	;-------------
	LACC *-,0,AR5 	;tlsp_0_m=newlsptab[i][mmin(findex[i] + 1, levels)];
	ADD #1
	SACB
	LACC LEVELS
	CRLT
	LACC #LSPTAB
	ADD IBUF,4
	ADDB
	SAMM AR5
	LACC *,0,AR0
	SACL TLSP_0_M
	;------------
	LACC *+,0,AR5 ;tlsp_1_m=newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)];
	SUB #1
	SACB
	LACC #0
	CRGT
	LACC #LSPTAB-16
	ADD IBUF,4
	ADDB
	SAMM AR5
	LACC *,0,AR2
	SACL TLSP_1_M
;=========================================
;      errorup = fabs(freq[i] - newlsptab[i][mmin(findex[i] + 1, levels)])
;		+ fabs(freq[i - 1] - newlsptab[i - 1][findex[i - 1]]);
;=========================================
	LACC *-,0
	SUB TLSP_0_M
	ABS
	SACB
	LACC *+,0
	SUB TLSP_1
	ABS
	ADDB
	SACL ERRORUP
;=========================================
;	errordn = fabs(freq[i] - newlsptab[i][findex[i]]) +
;	  fabs(freq[i - 1] - newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)]);
;=========================================
	LACC *-,0
	SUB TLSP_0
	ABS
	SACB
	LACC *+,0,AR0
	SUB TLSP_1_M
	ABS
	ADDB
	SACL ERRORDN
;=========================================
;	if (errorup < errordn)
;	{ //findex[i] = mmin(findex[i] + 1, levels);
;=======ARP=0==================================; jump if errorup>=errordn
	LACC ERRORDN
	SACB
	LACC ERRORUP
	CRGT
	BCND LSP34_DN,C
;=========================================
;	{ findex[i] = mmin(findex[i] + 1, levels);
;	  while (newlsptab[i][findex[i]] < newlsptab[i-1][findex[i-1]])
;	    findex[i] = mmin(findex[i] + 1, levels);	}
;=======ARP=0==================================;
LSP34_UP
	MAR *,AR0
	LACC *,0
	ADD #1
	SACB
	LACC LEVELS
	CRLT
	SACL *,0
;=========================================
;	  while (newlsptab[i][findex[i]] < newlsptab[i-1][findex[i-1]])
;	    findex[i] = mmin(findex[i] + 1, levels);	}
;=======ARP=0==================================
LSP34_UP_WHILE
	LACC #LSPTAB	;tlsp_0=newlsptab[i][findex[i]];
	ADD IBUF,4
	ADD *-,0,AR5
	SAMM AR5
	LACC *,0,AR0
	SACL TLSP_0
	;--------------------------
	LACC #LSPTAB-16	;tlsp_1=newlsptab[i-1][findex[i-1]];
	ADD IBUF,4
	ADD *+,0,AR5
	SAMM AR5
	LACC *,0,AR0
	SACL TLSP_1
	;-------------------------jump if tlsp_0>=tlsp_1
	SACB
	LACC TLSP_0
	CRGT
	BCND LSP34_NEXT_FOR,C
	LACC *,0
	ADD #1
	SACB
	LACC LEVELS
	CRLT
	SACL *,0,AR0
	B LSP34_UP_WHILE
LSP34_DN
;=========================================
;	else if (i == 1)  findex[i - 1] = mmax(findex[i - 1] - 1, 0);
;=========================================
	LACC IBUF
	SUB #1
	BCND LSP34_DN_NOT1,GT
LSP34_DN_1
	MAR *,AR0
	MAR *-
	LACC *,0
	SUB #1
	SACB
	LACC #0
	CRGT
	SACL *+,0
	B LSP34_NEXT_FOR
;=========================================
;      else if(newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)]
;	> newlsptab[i - 2][findex[i - 2]])
;	  findex[i - 1] = mmax(findex[i - 1] - 1, 0);
;=========================================
LSP34_DN_NOT1
	LACC TLSP_1_M
	SACB			;jump if tlsp_2>=tlsp_1_m
	LACC TLSP_2
	CRGT
	BCND LSP34_UP,C
	B LSP34_DN_1
;=========================================
LSP34_NEXT_FOR
	LACC IBUF
	ADD #1
	SACL IBUF
	MAR *,AR0
	MAR *+,AR2
	MAR *+,AR4
	MAR *+,AR7
	BANZ LSP34_FOR,*-,AR3

;=========================================
	nop
	NOP
LSP34_END
	RET
;=================================
	.include "c50_init.asm"
	.end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -