lspp.asm

来自「文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的」· 汇编 代码 · 共 350 行

ASM
350
字号
;=================================
;PCLSP
	LDP #ACCBUF
	LACC #0
	SACL LSPFLAG
	LACC #2
	SAMM INDX
	LACC #LSP+P10_1
	SAMM ARCR
	LACC #15
	SAMM TREG1
	LAR AR0,#LSP
	LAR AR1,#LSPPQ
	LAR AR2,#LSPCOS
	LAR AR3,#LPC
	LAR AR6,#LPC+P10_1
;=============================
;for (i = 0; i < mh; i++)
;  { p[i] = a[i+1] + a[m-i];
;    if(fabs(p[i])>0x7fffu||fabs(q[i]>0x7fff))
;      { for (j = 0; j < m; j++)  freq[j] = lastfreq[j];
;	return;  } }
;==================================
	LACC #HP10_1
	SAMM BRCR
	MAR *,AR3
	LACL #0
	SACL CORFLAG
	RPTB PCLSP_1-1
	  LACC *+,0,AR6
	  ADD *-,0,AR1
	  ;PUSH
	  SACL ACC_PUSH
	  ABS
	  SUB #7FFFH
	  NOP
	  XC 2,GT
	   LACL #1
	   SACL CORFLAG
	  ;POP
	  LACC ACC_PUSH
	  SACL *+,0,AR3
;==================================
;  fl = 0.;
;  for (p32=0x2000,pxl = 1.0, j = 0; j < mh; j++) p32+=p[j];
;  if(fabs(p32)>0x7fff) p32>>=2;
;  pxl=p32;
;==================================
PCLSP_1                 	;compute p at f=0.
	LACC CORFLAG
	BCND PCLSP_END1,GT
	;=========
	LACL #0
	SACL FL
	LAR AR1,#LSPPQ
	MAR *,AR1
	LACC #2000H
	RPT #HP10_1
	  ADD *+
	CALL INTACC
	SACH PXL
;=============================================
;  //search for zeros of p
;  nf = 0;  fr=0;
;  for (i = 1; i <= N; pxl = tpxr, fl = tfr, i++)
;------------------------------------------
PCLSP_3 	   ;*search for zeros of p
	LAR AR7,#N128-1
	LACC #1
	SACL IBUF
;================================================
;{   fr=i*128; 				//fr = i * (0.5 / N)*0x8000u;
;    tfr = fr;
;------------------------------------------------
;//PCLSP_GETP1
PCLSP_GETP_FOR
	LACC IBUF
	SACL FR,7
	SACL TFR,7
;================================
;    p32=(int)lspcos[(i-1)*6]>>2;      //1.15->3.13
;    for (j = 0; j < mh; j++)
;    { ax0=lspcos[(i-1)*6 + j+1];	//1.15
;      p32+=((long)(ax0*p[j]))>>15;    }
;    if(fabs(p32)>0x7fff) p32>>=2;
;    pxr=p32;
;    tpxr = pxr;
;=======================================
	LACC #HP10_1
	SAMM BRCR
	LAR AR1,#LSPPQ
	MAR *,AR2		;LSPCOS[6*128]
	LACC *+,0,AR1		;AR1:LSPPQ[]
	SFR
	SFR
	SACB
	LT *+,AR2
	RPTB PCLSP_4-1
	  MPY *+,AR1
	  LTP *+,AR2		;TREG0 : LSPPQ
	  SATL			;ACC>>15
	  ADDB
	  SACB
PCLSP_4
	LACB
	CALL INTACC
	SACH PXR
	SACH TPXR
;====================================
;    test  (pxl * pxr)
;=======================================
	LT PXL
	MPY PXR
	PAC
	BCND PCLSP_GETP2,LT
	BCND PCLSP_PXR_0,EQ
		;if pxl*pxr>0
;====================================
;    if (pxl * pxr > 0.0) continue;
;    i.e. pxl = tpxr, fl = tfr, i++
;=======================================
	LACC IBUF
	ADD #1
	SACL IBUF
	LACC TPXR
	SACL PXL
	LACC TFR
	SACL FL
	MAR *,AR7
	BANZ PCLSP_GETP_FOR,*-,AR2
	B PCLSP_GETQ0
PCLSP_PXR_0		;if pxr==0
;===============================
;if(pxr==0) { freq[nf]=fr/0x8000u;
;	  nf += 2;
;	  if(nf>m-2)break;
;	  if(i==N) break;
;	  i++;
;	  tfr=i*128;	//fl=tfr
;	  tpxr=-pxl;	//pxl=tpxr
;	  continue; }
;====================================
	MAR *,AR0
	LACC FR
	SACL *0+,0,AR2		;INDX=2
	CMPR  2			;test if ar0>arcr=#LSP+9
	BCND PCLSP_GETQ0,TC
	ADRK #6
	MAR *,AR7
	BANZ PCLSP_PXR0_1,*-		;test if ar7==0 i.e. i=128
	B PCLSP_GETQ0
PCLSP_PXR0_1
	LACC IBUF
	ADD #1
	;SACL IBUF
	SACL FL,7
	ADD #1
	SACL IBUF
	;--------
	LACC PXL
	NEG
	SACL PXL
	;------
	;MAR *,AR7
	BANZ PCLSP_GETP_FOR,*-,AR2
PCLSP_GETP2
;===============================
; //if(pxl*pxr<0) find zero of p
;   if(fabs(pxl)<fabs(pxr) ){minpxm[0]=pxl; minpxm[1]=fl;}
;   else {minpxm[0]=pxr; minpxm[1]=fr;}
;===============================5.6 wht hello
	LACC PXL
	ABS
	SACB
	LACC PXR
	ABS
	CRLT
	SACL MINPQ
	BCND PCLSP_GETP2_1,C	;jump if fabs(pxr)<fabs(pxl)
	LACC FL
	B PCLSP_GETP2_2
PCLSP_GETP2_1
	LACC FR
PCLSP_GETP2_2
	SACL MINPQ+1
;%%%%%%%%%%%%%%%
;  mb=0;
;  do{ mb++;
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	LAR AR6,#NBP-1
PCLSP_GETP2_DO
;=================================
;	fm=fr+fl;
;=================================
	LACC FR
	ADD FL
	SACL FM		;FM=2*FM
;=================================
;       p32=wcos(mp*fm)>>2;
;=================================
	LACC #P10P
	SAMM TREG0
	SUB #2
	SAMM AR5
	MPY FM
	PAC
	;SATL
	CALL WCOS
	SFR             	;1.15->>3.13
	SFR
	SACB
;=================================
;      for (j = 0; j < mh; j++)
;      { jc = mp - (j+1) * 2;
;	ax0=wcos(jc*fm/0x8000u);
;	p32 += ((long)(ax0* p[j]))>>15;      }
;=================================
	LAR AR4,#HP10_1
	;SAMM BRCR
	LAR AR1,#LSPPQ
	MAR *,AR1
	;----------
PCLSP_GETP_DO_FOR
	;RPTB PCLSP_GETP2_3-1
	  LAMM AR5
	  SAMM TREG0
	  SUB #2
	  SAMM AR5
	  MPY FM
	  PAC
	  ;SATL
	  ;-------
	  EXAR
	  SACL ACCBBUF
	  SACH ACCBBUF+1
	  EXAR
	  CALL WCOS
	  EXAR
	  LACC ACCBBUF+1,16
	  OR ACCBBUF
	  EXAR
	  ;---------
	  MAR *,AR1
	  SAMM TREG0
	  MPY *+,AR4
	  PAC
	  SATL
	  ADDB
	  SACB
	BANZ PCLSP_GETP_DO_FOR,*-
PCLSP_GETP2_3
;----------
;      fm/=2;
;-----------
	LACC FM		;FM/=2
	SFR
	SACL FM
;=======================
;      if(fabs(p32)>0x7fff) p32>>=2;
;      pxm=p32;
;=========================
	LACB
	CALL INTACC
	SACH PXM
;======================
;      if(fabs(pxm)<fabs(minpxm[0])) {minpxm[0]=pxm; minpxm[1]=fm;}
;=======================
	LACC PXM
	ABS
	SACB
	LACC MINPQ
	ABS
	CRLT
	BCND PCLSP_GETP2_4,C	;jump if fabs(pxm)>=fabs(minpq)
	SACL MINPQ
	LACC FM
	SACL MINPQ+1
;===========================
;     (pxm*pxl > 0.0) ? (pxl = pxm, fl = fm) : (pxr = pxm, fr = fm);
;==========================-
PCLSP_GETP2_4
	LACC FM,16
	OR PXM
	SACB
	SAMM TREG0
	MPY PXL
	PAC
	BCND PCLSP_GETP2_5,GT
	LACB
	SACL PXR
	SACH FR
	B PCLSP_GETP2_6
PCLSP_GETP2_5
	LACB
	SACL PXL
	SACH FL
PCLSP_GETP2_6
;-----------------------------------------------
;    } while ((fabs(minpxm[0]) > LSPEPS) && (mb < NBP));
;===============================================
	LACC MINPQ
	SUB #LSPEPS
	BCND PCLSP_GETP3,LEQ
	MAR *,AR6
	BANZ PCLSP_GETP2_DO,*-
;===========================================
;  do{ mb++;
;      fm=fr+fl;
;      p32=wcos(mp*fm/0x8000u)>>2;
;      for (j = 0; j < mh; j++)
;      { jc = mp - (j+1) * 2;
;	ax0=wcos(jc*fm/0x8000u);
;	p32 += ((long)(ax0* p[j]))>>15;      }
;      fm/=2;
;      if(fabs(p32)>0x7fff) p32>>=2;
;      pxm=p32;
;      if(fabs(pxm)<fabs(minpxm[0])) {minpxm[0]=pxm; minpxm[1]=fm;}
;     (pxm*pxl > 0.0) ? (pxl = pxm, fl = fm) : (pxr = pxm, fr = fm);
;    } while ((fabs(minpxm[0]) > LSPEPS) && (mb < NBP));
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;==================================
;    freq[nf]=minpxm[1]/0x8000u;
;    nf += 2;
;    if (nf > m-2) break;
;    else continue;}
;==================================
PCLSP_GETP3
	MAR *,AR0
	LACC MINPQ+1
	SACL *0+,0,AR7		;INDX=2
	CMPR  2			;test if ar0>arcr=#LSP+9
	BCND PCLSP_GETQ0,TC
	LACC IBUF
	ADD #1
	SACL IBUF
	LACC TPXR
	SACL PXL
	LACC TFR
	SACL FL
	;MAR *,AR7
	BANZ PCLSP_GETP_FOR,*-,AR2
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;PCLSP_GETQ0

;PCLSP_END1
 ;	LACC #1
 ;	SACL LSPFLAG
 ;	RET
;=================================

⌨️ 快捷键说明

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