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

📄 d4i40_1fv.asm

📁 TI C54写的G729代码,视线8kbps高质量语音编码,汇编优化
💻 ASM
📖 第 1 页 / 共 2 页
字号:
			LD sq2,A
			STL A,sq
			LD alp_16,A
			STL A,alp		
			LD i2,A
			STL A,ix
			LD i3,A
			STL A,iy
BeforeLoopi3End:
	MAR *+pDn(STEP)
	ADDM #STEP,i3
Loopi3End:
	ADDM #STEP,i2
	BANZD Loopi2,*AR_INDEX2-	
		MVDM addr_dn,pDn
		
;s=L_msu(L_mult(alpk,sq),psk,alp)
	LD alpk,T
	MPY sq,A
	LD psk,T
	MPY alp,B
	SUB B,A
	BC BeforeSearch4,ALEQ		;if(s>0)
		LD sq,A
		STL A,psk
		LD alp,A
		STL A,alpk
		LD i0,A
		STL A,ip2
		LD i1,A
		STL A,ip3
		LD ix,A
		STL A,ip0
		LD iy,A
		STL A,ip1
BeforeSearch4:
	ST #-1,sq			;sq=-1
	ST #1,alp			;alp=1;
;i0 loop:2 positions in track 3/4
	ST #-1,prev_i0
	STM #2-1,AR_INDEX2		;for(i=0;i<2;i++)
Loop_3_4_i0:
		ST #-1,max
		LD #4 ,A
		SUB *(AR_INDEX),A
		STLM A,AR0			;j=4-AR_INDEX  ------>AR0
		STM #Addr_Dn,pDn		;calculate the head address of Dn
		ADD *(pDn),A		;A=dn[j]
		STLM A,pDn
;search "dn[]" maximum posiition in track 3/4
		STM #NB_POS-1,BRC
		RPTB SearchMaxDn_3_4_End-1
			LD *pDn,A
			LD max,B
			MAX A
			STLM A,T						;T for the temp result
			BCD BeforeSearchMaxDn_3_4_End,C		;if A<B (dn[j]<max) goto ...
			MAR *+pDn(STEP)				;use the delate circle
				LD prev_i0,A
				SUB *(AR0),A	
				BC BeforeSearchMaxDn_3_4_End,AEQ		;if prev_i0==j goto ...
				LDM T,A						;else all above
				STL A,max
				MVMD AR0,i0
BeforeSearchMaxDn_3_4_End:
			MAR *+AR0(STEP)				;j+=STEP
SearchMaxDn_3_4_End:
		STM #6554,T
		LD i0,A
		STL A,prev_i0
		MPY i0,A
		LD A,-16						;j(A)=mult(i0,6554)
		STLM A,BRC			;save j into BRC for temp purpose					;save j into T
		MVDM ptr_rri3i3_i4,p0
		ADD *(p0),A					
		STLM A,p0					
		STM #8192,T
		MPY *p0,A	
		DST A,alp1					;alp1=L_mult(*p0,_1_4)
		STM #Addr_Dn,pDn				;ps1=dn[i0]
		LD i0,A
		ADD *(pDn),A
		STLM A,pDn
		NOP
		NOP
		LD *pDn,A
		STL A,ps1
		LD *(BRC),A
		MVDM ptr_rri0i3_i4,p0			;p0=ptr_rri0i3_i4
		Add *(p0),A
;		STLM A,p0
		STM #rri0i0,p1				;p1=rri0i0;
		STLM A,p0

		STM #NB_POS-1,BRC
		STM #Addr_Dn,pDn
		ST #0,i1
		RPTB LoopTrack_3_4_End-1
			STM #16384,T				;alp2=L_mac(alp1,*p0,_1_2);
			MPY *p0,B				;alp2=L_mac(alp2,*p1++,_1_2);
			DADD alp1, B
			MAR *+p0(NB_POS)
			STM #8192,T
			MPY *p1+,A
			ADD B,A					;A=alp2
			ADD #1,15,A				;apl_16=round(alp2)
			STL A,-16,alp_16
			LD ps1,A					;ps2=add(s1,dn[i1])
			ADD *pDn,A
			STL A,ps2
			SQUR *(AL),B
			STL B,-16,sq2
;s=L_msu(L_mult(alp,sq2),sq,alp_16)
			LD alp,T
			MPY sq2,A
			LD sq,T
			MPY alp_16,B
			SUB B,A
			BC BeforLoopTrack_3_4_End,ALEQ		;if(s>0)
				LD sq2,A
				STL A,sq
				LD ps2,A
				STL A,ps
				LD alp_16,A
				STL A,alp
				LD i0,A
				STL A,ix
				LD  i1,A
				STL A,iy
BeforLoopTrack_3_4_End:
		MAR *+pDn(STEP)
		ADDM #STEP,i1
LoopTrack_3_4_End:
	BANZ Loop_3_4_i0,*AR_INDEX2-
	LD ix,A
	STL A,i0
	LD iy,A
	STL A,i1
	STM #6554,T
	MPY i1,A
	LD A,-16
	LD A,3
	STL A,i1_offset
	LD ps,A
	STL A,ps0
	STM #8192,T
	MPY alp,A
	DST A,alp0
	ST #-1,sq
	ST #1,alp
	
	STM #6554,T
	
	MVDM ptr_rri2i3_i4,p0			;p0=ptr_rri2i3_i4+mult(i0,6554)
	MPY i0,A
	LD A,-16
	ADD *(p0),A
	STLM A,p0
	STM #rri0i2,p1		;p1=rri0i2+i1_offset
	LD i1_offset,A
	ADD *(p1),A
	STLM A,p1
	STM #rri2i2,p2		;p2=rri2i2
	STM #tmp_vect,p3		;p3=tmp_vect
;for(i3=2;i3<L_SUBFR;i3+=STEP)	
	STM #NB_POS-1,BRC
	RPTB Loopi2_3_4_End-1
		STM #8192,T			;s=L_mult(*p0,_1_4)
		MPY *p0,A			
		MAR *+p0(NB_POS)		;p0+=NB_POS
		MPY *p1+,B			;s=L_mac(s,*p1++,_1_4)
		ADD B,A
		STM #4096,T			;s=L_mac(s,*p2++,_1_8)
		MPY *p2+,B			
		ADD B,A
		ADD #1,15,A		;*p3++=round(s)
		STL A,-16,*p3+
Loopi2_3_4_End:
	STM #6554,T
	MVDM ptr_rri1i3_i4,p0		;p0=PTR_rri1i3_I4+mult(i0,6554)
	MPY i0,A
	LD A,-16
	ADD *(p0),A
	STLM A,p0
	STM #rri0i1,p1		;p1=rri0i1+I1_offset
	LD i1_offset,A
	ADD *(p1),A
	STLM A,p1
	STM #rri1i1,p2		;p2=rri1i1
	STM #rri1i2,p3	;p3=rri1i2
	
	STM #NB_POS-1,AR_INDEX2		;AR_INDEX2(AR7) is the loop counter.
	STM #Addr_Dn+1,pDn
	ST #1,i2
Loop_3_4_i2:
	LD ps0,A
	ADD *pDn,A
	MAR *+pDn(STEP)
	STL A,ps1
	MVMD pDn,addr_dn			;save the pointer into addr_dn
;alp1=alp0+rr[i0][i2]+rr[i1][i2]+0.5*rr[i2][i2]
	STM #4096,T
	DLD alp0,A
	MPY *p0,B
	ADD B,A
	MAR *+p0(NB_POS)
	MPY *p1+,B
	ADD B,A
	STM #2048,T
	MPY *p2+,B
	ADD B,A
	DST A,alp1
	STM #tmp_vect,p4
	STM #Addr_Dn+2,pDn		;pDn=dn[i3]
	STM #NB_POS-1,BRC
	ST #2,i3
	RPTB Loopi3_3_4_End-1
		LD ps1,A				;ps2=add(ps1,dn[i3])
		ADD *pDn,A
		STL A,ps2
		SQUR *(AL),B				;sq2=mult(ps2,ps2)
		STL B,-16,sq2
		STM #4096,T
		DLD alp1,A			;alp2=L_mac(alp1,*p3++,_1_8)
		MPY *p3+,B
		ADD B,A
		STM #16384,T			;alp2=L_mac(alp2,*p4++,_1_2)
		MPY *p4+,B
		ADD B,A
		DST A,alp2
		ADD #1,15,A			;alp_16=round(alp2)
		STL A,-16,alp_16
;s=L_msu(L_mult(alp,sq2),sq,alp_16)
		LD alp,T
		MPY sq2,A
		LD sq,T
		MPY alp_16,B
		SUB B,A
		BC BeforeLoopi3_3_4_End,ALEQ		;if(s>0)
			LD sq2,A
			STL A,sq
			LD alp_16,A
			STL A,alp
			LD i2,A
			STL A,ix
			LD i3,A
			STL A,iy
BeforeLoopi3_3_4_End:
		MAR *+pDn(STEP)
		ADDM #STEP,i3
Loopi3_3_4_End:
	ADDM #STEP,i2
	BANZD Loop_3_4_i2,*AR_INDEX2-	
		MVDM addr_dn,pDn	
;s=L_msu(L_mult(alpk,sq),psk,alp)
	LD alpk,T
	MPY sq,A
	LD psk,T
	MPY alp,B
	SUB B,A
	BC BeforeSetSign,ALEQ		;if(s>0)
		LD sq,A
		STL A,psk
		LD alp,A
		STL A,alpk
		LD i0,A
		STL A,ip3
		LD i1,A
		STL A,ip0
		LD ix,A
		STL A,ip1
		LD iy,A
		STL A,ip2
BeforeSetSign:
	;modify pointer of rrixiy
	ST #rri0i4,ptr_rri0i3_i4
	ST #rri1i4,ptr_rri1i3_i4
	ST #rri2i4,ptr_rri2i3_i4
	ST #rri4i4,ptr_rri3i3_i4
	BANZ SearchPosLoop,*AR_INDEX-
;Find the codeword corresponding to the selected positions
	STM #(L_SUBFR>>1)-1,BRC
	LD #0,A
	RPTBD InitCodEnd-1
	STM #Addr_cn,pCn			;pCn=AR2
		DST A,*pCn+
InitCodEnd:
;Set the sign oimpulses
;note:the following code can be optimized.	
	LD ip0,A					;i0=sign_dn[ip0]
	STM #sign_dn,pSignDn		
	ADD *(pSignDn),A
	STLM A,pSignDn
	NOP
	NOP
	LD *pSignDn,A
	STL A,i0
	LD ip1,A					;i1=sign_dn[ip1]
	STM #sign_dn,pSignDn		
	ADD *(pSignDn),A
	STLM A,pSignDn
	NOP
	NOP
	LD *pSignDn,A
	STL A,i1
	LD ip2,A					;i2=sign_dn[ip2]
	STM #sign_dn,pSignDn		
	ADD *(pSignDn),A
	STLM A,pSignDn
	NOP
	NOP
	LD *pSignDn,A
	STL A,i2
	LD ip3,A					;i3=sign_dn[ip3]
	STM #sign_dn,pSignDn		
	ADD *(pSignDn),A
	STLM A,pSignDn
	NOP
	NOP
	LD *pSignDn,A
	STL A,i3

	STM #Addr_cn,pCn			;cod[ip0]=shr(i0,2)
	LD i0,-2,A
	LD ip0,B
	ADD *(pCn),B
	STLM B,pCn
	LD i1,-2,B					;using circle inteval
	STL A,*pCn

	STM #Addr_cn,pCn
	LD ip1,A
	ADD *(pCn),A
	STLM A,pCn
	LD i2,-2,A
	STL B,*pCn
	
	STM #Addr_cn,pCn
	LD ip2,B
	ADD *(pCn),B
	STLM B,pCn
	LD i3,-2,B
	STL A,*pCn
	
	STM #Addr_cn,pCn
	LD ip3,A
	ADD *(pCn),A
	STLM A,pCn
	LD ip0,A
	STLM A,BRC
	STL B,*pCn
;find the filterd codeword
;for(i=0;i<ip0;i++) y[i]=0;
	RPTBD i0Begin-1
	STM #Addr_yn2,pYn2
		ST #0,*pYn2+
i0Begin:
	LD #0,B
	STM #Addr_h1,pH1
	STM #Addr_yn2,pYn2
	LD #L_SUBFR-1,A
	SUB ip0,A
	STLM A,BRC
	STLM A,T
	LD ip0,A
	ADD *(pYn2),A
	STLM A,pYn2
	LD i0,A
	BC i0Else,ALEQ		;if(i0>0)
		RPTB Beforei0Else-1
			MVDD *pH1+,*pYn2+
Beforei0Else:
		ADD #1,B	
		B i1Begin
i0Else:				;slse
	RPTB i1Begin-1
		LD *pH1+,A
		NEG A
		STL A,*pYn2+
i1Begin:
	STM #Addr_h1,pH1
	STM #Addr_yn2,pYn2
	LD #L_SUBFR-1,A
	SUB ip1,A
	STLM A,BRC
	LD ip1,A
	ADD *(pYn2),A
	STLM A,pYn2
	LD i1,A	
	BC i1Else,ALEQ		;if(i1>0)
		RPTB Beforei1Else-1
			LD *pYn2,A
			ADD *pH1+,A
			STL A,*pYn2+
Beforei1Else:
		ADD #2,B
		B i2Begin
i1Else:
		RPTB i2Begin-1
			LD *pYn2,A
			SUB *pH1+,A
			STL A,*pYn2+
i2Begin:
	STM #Addr_h1,pH1
	STM #Addr_yn2,pYn2
	LD #L_SUBFR-1,A
	SUB ip2,A
	STLM A,BRC
	LD ip2,A
	ADD *(pYn2),A
	STLM A,pYn2
	LD i2,A	
	BC i2Else,ALEQ		;if(i1>0)
		RPTB Beforei2Else-1
			LD *pYn2,A
			ADD *pH1+,A
			STL A,*pYn2+
Beforei2Else:
		ADD #4,B
		B i3Begin
i2Else:
		RPTB i3Begin-1
			LD *pYn2,A
			SUB *pH1+,A
			STL A,*pYn2+
i3Begin:
	STM #Addr_h1,pH1
	STM #Addr_yn2,pYn2
	LD #L_SUBFR-1,A
	SUB ip3,A
	STLM A,BRC
	LD ip3,A
	ADD *(pYn2),A
	STLM A,pYn2
	LD i3,A	
	BC i3Else,ALEQ		;if(i1>0)
		RPTB Beforei3Else-1
			LD *pYn2,A
			ADD *pH1+,A
			STL A,*pYn2+
Beforei3Else:
		ADD #8,B
		B FindEnd
i3Else:
		RPTB FindEnd-1
			LD *pYn2,A
			SUB *pH1+,A
			STL A,*pYn2+
FindEnd:
;*sign=i
	STL B,*(PulseSign)
	
	STM #6554,T
	MPY ip0,A
	STL A,-16,ip0
	MPY ip1,A
	STL A,-16,ip1
	MPY ip2,A
	STL A,-16,ip2
	MPY ip3,A			;A(i)=mult(ip3,6554)
	LD A,-16
	LD A,#2,B			;B=shl(i,2)
	ADD A,B			;B(j)=i+shl(i,2)
	ADD #3,B
	STLM A,T			;save shl(i,1)
	LD ip3,A
	SUB B,A
	LDM T,B
	LD B,1
	ADD A,B
	STL B,ip3
	
	LD ip0,B
	LD ip1,3,A
	ADD A,B
	LD ip2,6,A
	ADD A,B
	LD ip3,9,A
	ADD A,B
	STL B,*(PulseIndex)		;return i	
	RET	

⌨️ 快捷键说明

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