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

📄 cgain.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
CGAIN_DEBUG	.SET 0
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
	.IF CGAIN_DEBUG
	.version        50
	.mmregs
	.MLIB "MAC.LIB"
	.DATA
CODEBOOK .COPY "CODEBOOK.DAT"
E0	.int 0bh,0fff0h,0dbh,08dh,0dh,0ff85h,0ff3dh,021h,0ffd4h,0ffcbh
	.int 0b3h,039h,0ffedh,01h,0fffah,0fff7h,0fff1h,0ff95h,0fff1h,096h
	.int 0ffdeh,0ff7bh,0ffe4h,052h,086h,061h,0c3h,06bh,0ffaeh,01ah
	.int 0ffc9h,0ff57h,0ffb8h,087h,0d0h,0ff77h,0ffefh,016h,09h,058h
	.int 0fffdh,0ffb8h,0fffdh,06h,05fh,092h,0ff79h,0ff7dh,096h,018h
	.int 0fff7h,0ff96h,0fe43h,0ff6ch,0fffeh,0ff1dh,0ffbah,0ffa2h,0ff14h,03dh

T	.SPACE 16*400H
IMP_H	.int 02000h,013f7h,0fe01h,06fdh,06b6h,0280h,01efh,0261h,01ebh,0ff25h,01ch,0d7h,0ff91h,0ffd2h,0eh,0ffe5h,0ffd4h,0ffe1h,0ah,0ffech
	.int 0ffe9h,04h,0fffah,0fff8h,00h,00h,00h,0fffeh,00h,00h,0ffffh,00h,00h,00h,00h,00h,00h,00h,00h,00h
	.int 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h

	.TEXT
	CALL C50_INIT
	LDP #ACCBUF
	LACL #1
	SACL PG_FIRST
	LACC #CODEBOOK+1022
	SACL CG_BOOK
	LAR AR3,#CG_MATCH
	LAR AR4,#CG_GAIN
	LACC #30
	SACL PG_LEN
	SACL CG_Y60
	SACL CG_Y59
	;------
	LAR AR0,#PG_X_E0+59
	LACC #E0
	SAMM BMAR
	MAR *,AR0
	RPT #59
	 BLDD BMAR,*-
	;====================
	LACL #0
	SACL PG_SHIFT
	SACL TOPBP_PG
        sacl TOPCBINDEX
	SLAC PG_EMAX
	;====================
LOOP_CG
	CALL CGAIN
	LACC CG_BOOK
	SUB #2
	SACL CG_BOOK
	SUB #CODEBOOK
       BCND LOOP_CG,C
HERE:	B HERE
	.BSS ACCBUF,2
	.BSS SIGNFLAG,1
	.BSS PG_EMAX,2
	.BSS NEW_PGAIN,1
	.BSS PG_COR,2
	.BSS PG_ENG,2
	.BSS PG_FIRST,1
	.BSS PG_LEN,1
	.BSS PG_LEN_1,1
	.BSS PG_RPTC,1
	.BSS PG_SHIFT,1
	.BSS TOPBP_PG,1
	.BSS TOPPGAIN,1
	;-------------
CG_MATCH .USECT "ONCHIP1",512*2
CG_GAIN .USECT "ONCHIP1",512
PG_X_E0 .USECT "ONCHIP1",60	;DON'T BE IN SAME BLOCK WITH E0
CG_Y_1	.USECT "DRAM",1
CG_Y	.USECT "DRAM",60
	;--------------

	.ENDIF
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;-----------------------------------
;ACCBUF*2, SIGNFLAG ,PG_FIRST,PG_COR*2,PG_ENG*2,CG_Y59,CG_Y60,CG_BOOK
;CALL MPY16_32, CG_DIV
;AR3->MATCH[512*2], AR4->CG_GAIN[512]
;PUSH AR0,AR1,AR2,AR7
;ACC,ACCB,PREG,TREG0/1,BRCR
;ARRAY: CG_MATCH[512*2], CG_GAIN[512], CG_Y[60], IMP_H[60], E0[60]
; 	CODEBOOK[1082]
;NOTE: H[0]=0X2000!! DMOV CG_Y, |COR/ENG|<0X7FFF
;H: 	3.13,
;CG_Y: 	5.11
;COR:	27.5
;ENG:	16.16
;=================================
	.BSS CG_EX,1
	.BSS CG_EX0,1
	.BSS CG_EX1,1
	.BSS CG_BOOK,1
	.BSS CG_Y59,1
	.BSS CG_Y60,1
	.bss TOPCGAIN,1
	.BSS TOPCBINDEX,1
	;.BSS CBINDEX,1
;============================
CGAIN
	LACC PG_LEN
	SUB #1
	SACL PG_LEN_1
	LACC PG_FIRST
	BCND CG__FIRST,NEQ
;==========================================
; else
;  { for(i=l-1;i>=len-1;i--) y[i]=y[i-1];
;==========================================
	LACL #60
	SUB PG_LEN
	SACL PG_RPTC
	LAR AR0,#CG_Y+58
	MAR *,AR0
	RPT PG_RPTC
	  DMOV *-
;==========================================
;    for(i=len-2;i>=1;i--) y[i]=y[i-1] + (((long)ex[1]*h1[i] + (long)ex[0]*h1[i+1])>>2);
;==========================================
	LACL #2           ;AR0:Y[LEN-3]
	SAMM INDX
	LACC #IMP_H-2
	ADD PG_LEN
	SAMM AR2	;AR2:IMP_H[LEN-2]
	;---
	LACC CG_BOOK
	SAMM AR1	;ARP==0,PIPELINE
	;---
	LACC PG_LEN
	SUB #3
	SAMM BRCR
	;--
	MAR *,AR1
	MAR *+
	LACC *-,7
	SACL CG_EX1
	LACC *,7
	BCNDD CG_EX_NEQ,NEQ
	  SACL CG_EX0
	  SAMM TREG0	;TREG0= EX[0]<<7
	  ;-------
	  LACC CG_EX1		;AR0: Y[LEN-3]
	  BCNDD CG_EX_0NEQ,NEQ
	    SAMM TREG0		;TREG0=EX[1]<<7
	    MAR *,AR0
	  ;----ex[0]=ex[1]=0-----
	    LAMM BRCR
	    SACL PG_RPTC
	    RPT PG_RPTC
	     DMOV *-		;->AR0: Y[-1]
	    LACL #0 ;y[0]=((long)ex[0]*h1[1] + (long)ex[1] * h1[0])>>2;
	    BD CG_EX_OVER
	     SACL *+
	     SACL *   	;Y[-1]=ex[0]* h[0]= CG_Y_1=0

CG_EX_0NEQ
	;---ex[0]=0, ex[1]=-1/1 TREG0=EX[1] AR0:Y[LEN-3],AR2: H[LEN-2] ARP==0
;--------------------------------------
;    for(i=len-2;i>=1;i--) y[i]=y[i-1] + (((long)ex[1]*h1[i])>>2);
;================================================
	MAR *,AR2
	MPY *-,AR0	;TREG0=EX1<<7
	RPTB CG_EX_0NEQ_FOR-1
	  LACC *+,9,AR2
	  MPYA *-,AR0
	  SACH *0-,7	;INDX=2
CG_EX_0NEQ_FOR		;AR0:Y[-1], AR2:H[0]
	  LACL #0
	  SACL *+
	  BD CG_EX_OVER
	    LACC CG_EX1,11-7	;H[0]=1->0X2000=H1[0]>>2
	    SACL *
	;y[0]=ex[0]*h1[1] + ex[1] * h1[0]=EX[1]*H[0]
	;y[-1]=ex[0]* h[0]= CG_Y_1=0
;==========================================
;    for(i=len-2;i>=1;i--) y[i]=y[i-1] + (((long)ex[0]*h1[i+1])>>2);
;==========================================
CG_EX_NEQ	;AR1:EX[1], ARP=1,AR2:H[LEN-2] ,TREG0=EX[0], AR0:Y[LEN-3]
	LACC CG_EX1
	BCND CG_EX_NEQNEQ,NEQ
	;--ex[0]=-1/1, ex[1]=0----
	   MAR *,AR2
	   MAR *+	;AR2:H[LEN-1]
	   MPY *-,AR0
	   RPTB CG_EX_NEQ0_FOR-1
	    LACC *+,9,AR2
	    MPYA *-,AR0
	    SACH *0-,7	;INDX=2
CG_EX_NEQ0_FOR		;AR0:Y[-1] ,AR2: H[0]
	;y[0]=ex[0]*h1[1] + ex[1] * h1[0]=EX[0]*H[1]
	;y[-1]=ex[0]* h[0]
	    LACC CG_EX0,11-7
	    SACL *+,0,AR2
	    MAR *+
	    MPY *,AR0
	    BD CG_EX_OVER
	     PAC
	     SACH *,7
;==========================================
CG_EX_NEQNEQ
;--------------------------------------
;    AR1:EX[0],ARP=1,ACC=EX[1],AR0:Y[LEN-3],AR2:H[LEN-2],BRCR=LEN-3
;    for(i=len-2;i>=1;i--) y[i]=y[i-1] + (((long)ex[1]*h1[i] + (long)ex[0]*h1[i+1])>>2);
;--------------------------------------
	MAR *,AR0
	BCND CG_EX_NEQGT,GT
	  LACC CG_EX0
	BCND CG_EX_GTLT,GT
	  ;---ex[0]=-1,ex[1]=-1
;-----------------------------------
;    for(i=len-2;i>=1;i--) y[i]=y[i-1] - (h1[i] + h1[i+1])>>2;
;-----------------------------------
	 RPTB CG_EX_LTLT_FOR-1
	   LACC *+,9,AR2
	   SUB *+,7
	   SUB *0-,7,AR0
	   SACH *0-,7
CG_EX_LTLT_FOR  	;AR0:Y[-1] ,AR2: H[0]
	;y[0]=ex[0]*h1[1] + ex[1] * h1[0]=-H[1]-H[0]>>2
	;y[-1]=ex[0]* h[0]=-H[0]>>2
	   LACC CG_EX0,13	;EX<<7
	   SACH *+,7,AR2
	   MAR *+	;AR2: H[1]
	   BD CG_EX_OVER
	    SUB *,7,AR0
	    SACH *,7
CG_EX_GTLT
	  ;---ex[0]=1,ex[1]=-1
;-----------------------------------
;    for(i=len-2;i>=1;i--) y[i]=y[i-1] - (h1[i] - h1[i+1])>>2;
;-----------------------------------
	 RPTB CG_EX_GTLT_FOR-1
	   LACC *+,9,AR2
	   SUB *+,7
	   ADD *0-,7,AR0
	   SACH *0-,7
CG_EX_GTLT_FOR  	;AR0:Y[-1] ,AR2: H[0]
	;y[0]=ex[0]*h1[1] + ex[1] * h1[0]=H[1]-H[0]>>2
	;y[-1]=ex[0]* h[0]=H[0]>>2
	   LACC CG_EX0,13
	   SACH *+,7,AR2
	   NEG
	   MAR *+	;AR2: H[1]
	   BD CG_EX_OVER
	    ADD *,7,AR0
	    SACH *,7
;==========================================
CG_EX_NEQGT
	LACC CG_EX0
	BCND CG_EX_GTGT,GT
	  ;---ex[0]=-1,ex[1]=1
;-----------------------------------
;    for(i=len-2;i>=1;i--) y[i]=y[i-1] + (h1[i] - h1[i+1])>>2;
;-----------------------------------
	 RPTB CG_EX_LTGT_FOR-1
	   LACC *+,9,AR2
	   ADD *+,7
	   SUB *0-,7,AR0
	   SACH *0-,7
CG_EX_LTGT_FOR  	;AR0:Y[-1] ,AR2: H[0]
	;y[0]=ex[0]*h1[1] + ex[1] * h1[0]=-H[1]+H[0]>>2
	;y[-1]=ex[0]* h[0]=-H[0]>>2
	   LACC CG_EX0,13
	   SACH *+,7,AR2
	   NEG
	   MAR *+	;AR2: H[1]
	   BD CG_EX_OVER
	     SUB *,7,AR0
	     SACH *,7
	   ;------------
CG_EX_GTGT
	  ;---ex[0]=1,ex[1]=1
;-----------------------------------
;    for(i=len-2;i>=1;i--) y[i]=y[i-1] + (h1[i] + h1[i+1])>>2;
;-----------------------------------
	 RPTB CG_EX_GTGT_FOR-1
	   LACC *+,9,AR2
	   ADD *+,7
	   ADD *0-,7,AR0
	   SACH *0-,7
CG_EX_GTGT_FOR  	;AR0:Y[-1] ,AR2: H[0]
	;y[0]=ex[0]*h1[1] + ex[1] * h1[0]=H[1]+H[0]>>2
	;y[-1]=ex[0]* h[0]=H[0]>>2
	   LACC CG_EX0,13
	   SACH *+,7,AR2
	   MAR *+	;AR2: H[1]
	   ;BD CG_EX_OVER
	     ADD *,7,AR0
	     SACH *,7
;==========================================
CG_EX_OVER
	BD CG_GET_COR	;ARP==0
	 LAR AR0,#CG_Y+58
;==========================================
CG__FIRST
;==========================================
;  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>>2;     }
;  }
;=================================
	;LACC #CG_Y
	;SACL CG_Y_ADDR
	LAR AR2,#CG_Y_1
	LACC #IMP_H
	SAMM BMAR
	LACL #0
	SACL PG_RPTC
	LACL #59
	SAMM BRCR
	LACC CG_BOOK
	SAMM AR0	;AR0->EX[0]
	SACL CG_EX
	MAR *,AR0
	;-------
	RPTB CG_FIRST_I-1
	  ZAP
	  RPT PG_RPTC   ;AR0 -> EX[I] , BMAR->H[0]
	    MADS *-	;CODEBOOK[512] & IMP_H[60] MUST NOT IN SAME BLOCK
	  APAC
	  BSAR 2
	  MAR *+,AR2	;AR0->EX[0]
	  SACL *+,0,AR0
	  LACC PG_RPTC
	  ADD #1
	  SACB
	  LACC PG_LEN_1	;29/59

⌨️ 快捷键说明

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