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

📄 echo2.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 S
📖 第 1 页 / 共 2 页
字号:
;********************************************************************
;
; (c)1997 Copyright LuxSonor, Inc. All rights reserved
;
; Revision 1.0
;
;	
;	Module:	AUDIO code
;
;	Initial version:Cecile Foret, August 1997
;			Jinshi Huang 12/1/98 for LS388/LS500
;	This routine performs the rate conversion from 11kH to 44kH, for 
;	the microphone input.
;
;	return adress to main routine: r11
;	returns: none, the decimated sequence will be written in local memory
;	input  : r2, input adress for micro sequence
;	debug information to check if ByteSize>=0
;	Initially=echo.S, but do not load the input sequence required to
;	do the FB 
;*********************************************************************
	.nolist
#include "regdef2.h"
#include "stereo_user.h"
#include "memory2.h"
	.list
	
	.data
	.global	SUB_echo


SUB_echo:

;************ choice of the gain factor, depending on the command *******
//		movhf	r0, %echo_com		tchou
		movh	r0, %echo_com
//		dlw		r0,echo_com
//		nop
		shl		r0,1
//		multi	r0, 0x2
		addi	r0, feedback_gain	; adress in DRAM

#ifdef	EFFECT
		dlhr	r1,r0
		nop
		movh	%FBgain,r1		//use direct access

#else	//EFFECT
;		movi	StartAddrHigh, 0x40	; read from ROM
		movi	StartAddrHigh, DataSeg	; read from DRAM 10-13-98
		movi	ByteSize, 0x0		; read g1,g2
		movi	ByteLocal, FBgain 
		dmabrr	r0
#endif	//EFFECT

;********** load history of DL1 (x, M0=256+64) *********************
//		movhf	r0, %DL1_ptr	tchou
		movh	r0, %DL1_ptr
;		movi	StartAddrHigh, 0x8
;		movi	StartAddrHigh, 0x7
		movi	StartAddrHigh, DataSeg	// 10-13-98
#ifdef	EFFECT
		shr	r0, 2			; to word addr 
		movi	DMASize, 31		//32 words (0x80 bytes)			
		movi	LocalAddr, (local_DL1)>>2
		dmarr	r0
		WaitDma
#else	//EFFECT
		movi	ByteSize, 0x7e
		movi	ByteLocal, local_DL1
		dmabrr	r0
#endif	//EFFECT
	
;********** load history of OAP1 (z, T3=64) ************************
#ifdef	EFFECT
		movi	r0,(OAP1_START)>>2	; to word addr 
		movi	DMASize, 31		//32 words (0x80 bytes)			
		movi	LocalAddr, (local_OAP1)>>2
		dmarr	r0
		WaitDma
#else	//EFFECT
		movi	ByteSize, 0x7e
		movi	ByteLocal, local_OAP1
		dmabr	OAP1_START
#endif	//EFFECT
	
		movi	AGRAdr2, local_DL1	; points on X/U
		movi	AGRInc2, 0x2
		movi	AGRSiz2, 0xffff

		movi	AGRAdr3, local_OAP1	; points on Z/Y
		movi	AGRInc3, 0x2
		movi	AGRSiz3, 0xffff

;********** OAP1 ***************************************************
		movhf	r3, %g3				
//		movi	r0, 0x7fff			
		li		r0,0x007fffff			

;******** deseable interrupt ***********
		movi	TrapReg, 0x0
		nop
		nop

		loop	64, OAP1_loop
;********** update Yn **********************************************
		mulhf	r6, r0, a3(0)	; r6=Z(n-T3)*32767	
		msubhf	r6, r3, a2(0)	; r6=Z(n-T3)*32767-g3*X(n)	
		rndhf	a3(0), r6		; Y(n)

;********** update Un **********************************************
		mulhf	r6, r0, a2(0)	; r6=X(n)*32767
		maddhf	r6, r3, i3		; r6=X(n)*32767+g3*Y(n)		
		rndhf	i2, r6			; U(n)
OAP1_loop:


;********* enable interrupt *************
		movi	TrapReg, 1<<2

;********* NAP1 HISTORY (T(n-M1))***********************************
;********* load 64 samples of the history of NAP1 (M1=242) *********
;		movi	StartAddrHigh, 0x8
;		movi	StartAddrHigh, 0x7
		movi	StartAddrHigh, DataSeg	// 10-13-98
//		movhf	r0, %NAP1_ptr	; base of the block tchou
		movh	r0, %NAP1_ptr	; base of the block
		addi	r1, r0, 0x80	; add 64 samples 
		tsti	r1, NAP1_END	; test if wrapping is required or not
		blte	no_NAP1_wrapp
; wrapping required, split the block in two pieces....
; bytes required for the second transfert=r2

#ifdef	EFFECT
		subi	r2,r1,NAP1_SIZE+NAP1_START+4 

; bytes required for the first transfert=r3
		movi	r3,0x78
		sub	r3, r2
		addi	r4, r3,local_NAP1+4
// do in words
		shr	r0,2
		shr	r2,2
		shr	r3,2
		shr	r4,2
//first DMA in words
		mov	DMASize, r3					
		movi	LocalAddr, (local_NAP1)>>2
		dmarr	r0
		WaitDma

//second DMA in words
		movi	r0,(NAP1_START)>>2
		mov	DMASize, r2			
		mov	LocalAddr, r4
		dmarr	r0
		WaitDma
#else	//EFFECT
		subi	r2,r1,NAP1_SIZE+NAP1_START+2

; bytes required for the first transfert=r3
		movi	r3,0x7c
		sub		r3, r2	
; first transfert
		mov		ByteSize, r3
		movi	ByteLocal, local_NAP1
		dmabrr	r0
; second transfert
		addi	r4, r3,local_NAP1+2
		mov		ByteSize, r2
		mov		ByteLocal, r4
		dmabr	NAP1_START
#endif	//EFFECT
		j		NAP1_load_done
no_NAP1_wrapp:
; no need to wrap....
#ifdef	EFFECT
		shr	r0,2			//in words
		movi	DMASize, 31		//32 words (0x80 bytes)			
		movi	LocalAddr, (local_NAP1)>>2
		dmarr	r0
		WaitDma
#else	//EFFECT
		movi	ByteSize, 0x7e
		movi	ByteLocal,local_NAP1 
		dmabrr	r0	 
#endif	//EFFECT		
NAP1_load_done:



;*****************************************************************************
;******** NAP1 ***************************************************************
		movi	AGRAdr2, local_DL1	; points on U/T
		movi	AGRAdr3, local_NAP1	; points on T/V

		movhf	r3, %g1
//		movi	r0, 0x7fff			
		li		r0, 0x7fffff	
;********** deseable interrupt ***********
		movi	TrapReg, 0x0
		nop
		nop

		loop	64, NAP1_loop
;********** update Vn **********************************************
		mulhf	r6, r0, a3(0)	; r6=T(n-M1)*32767	
		msubhf	r6, r3, a2(0)	; r6=T(n-M1)*32767-g1*U(n)	
		rndhf	a3(0), r6		; V(n)

;********** update Tn **********************************************
		mulhf	r6, r0, a2(0)	; r6=U(n)*32767
		maddhf	r6, r3, i3		; r6=U(n)*32767+g1*V(n)
		rndhf	i2, r6			; T(n)
NAP1_loop:

;********** enable interrupt **************
		movi	TrapReg, 1<<2

;*********************************************************************
;********* Update NAP1 history (Tn) **********************************
;********* load 64 samples of the history of NAP1 (M1=242) ***********
//		movhf	r0, %NAP1_ptr	; base of the block	tchou
		movh	r0, %NAP1_ptr	; base of the block
		addi	r1, r0, 0x80	; add 64 samples 
		tsti	r1, NAP1_END	; test if wrapping is required or not
		blte	no_NAP1_up_wrapp
; wrapping required, split the block in two pieces....
; bytes required for the second transfert=r2

#ifdef	EFFECT
		subi	r2,r1,NAP1_SIZE+NAP1_START+4 

; bytes required for the first transfert=r3
		movi	r3,0x78
		sub	r3, r2
		addi	r4, r3,local_DL1+4
// do in words
		shr	r0,2
		shr	r2,2
		shr	r3,2
		shr	r4,2
//first DMA in words
		mov	DMASize, r3					
		movi	LocalAddr, (local_DL1)>>2
		dmawr	r0
		WaitDma

//second DMA in words
		movi	r0,(NAP1_START)>>2
		mov	DMASize, r2			
		mov	LocalAddr, r4
		dmawr	r0
		WaitDma
#else	//EFFECT
		subi	r2,r1,NAP1_SIZE+NAP1_START+2 

; bytes required for the first transfert=r3
		movi	r3,0x7c
		sub		r3, r2			

; new pointer on NAP1 in DRAM=r5
;		subi	r5, r1, NAP1_SIZE

; first transfert
		mov		ByteSize, r3
		movi	ByteLocal, local_DL1
		dmabwr	r0
; second transfert
		addi	r4, r3,local_DL1+2
		mov		ByteSize, r2
		mov		ByteLocal, r4
		dmabw	NAP1_START
#endif	//EFFECT
		j		NAP1_up_done
no_NAP1_up_wrapp:
	
#ifdef	EFFECT
		shr	r0,2			//in words
		movi	DMASize, 31		//32 words (0x80 bytes)			
		movi	LocalAddr, (local_DL1)>>2
		dmawr	r0
		WaitDma
#else	//EFFECT
; no need to wrap....
;		mov		r5, r1
		movi	ByteSize, 0x7e
		movi	ByteLocal,local_DL1 
		dmabwr	r0	 
#endif	//EFFECT		
NAP1_up_done:


;********* update pointer on NAP1 in DRAM **************************
;********* r1=previous pointer + 0x80 ******************************
;		movhf	%NAP1_ptr, r5

//		tstsi	r1, NAP1_END	tchou
		tsti	r1, NAP1_END
		blt		no_NAP1_ptr_wrap
		subi	r1, NAP1_SIZE	; wrap if necessary
no_NAP1_ptr_wrap:
		nop
//		movhf	%NAP1_ptr, r1	; update the pointer	tchou
		movh	%NAP1_ptr, r1	; update the pointer 

;********* NAP2 HISTORY (W(n-M2))***********************************
;********* load 64 samples of the history of NAP2 (M2=91) **********
//		movhf	r0, %NAP2_ptr	; base of the block		tchou
		movh	r0, %NAP2_ptr	; base of the block
		addi	r1, r0, 0x80	; add 64 samples 
		tsti	r1, NAP2_END	; test if wrapping is required or not
		blte	no_NAP2_wrapp
; wrapping required, split the block in two pieces....
; bytes required for the second transfert=r2
#ifdef	EFFECT
		subi	r2,r1,NAP2_SIZE+NAP2_START+4 

; bytes required for the first transfert=r3
		movi	r3,0x78
		sub	r3, r2
		addi	r4, r3,local_NAP2+4
// do in words
		shr	r0,2
		shr	r2,2
		shr	r3,2
		shr	r4,2
//first DMA in words
		mov	DMASize, r3					
		movi	LocalAddr, (local_NAP2)>>2
		dmarr	r0
		WaitDma

//second DMA in words
		movi	r0,(NAP2_START)>>2
		mov	DMASize, r2			
		mov	LocalAddr, r4
		dmarr	r0
		WaitDma
#else	//EFFECT
		subi	r2,r1,NAP2_SIZE+NAP2_START+2 

; bytes required for the first transfert=r3
		movi	r3,0x7c
		sub		r3, r2			

; first transfert
		mov		ByteSize, r3
		movi	ByteLocal, local_NAP2
		dmabrr	r0
; second transfert
		addi	r4, r3,local_NAP2+2
		mov		ByteSize, r2
		mov		ByteLocal, r4
		dmabr	NAP2_START
#endif	//EFFECT
		j		NAP2_load_done
no_NAP2_wrapp:
; no need to wrap....
#ifdef	EFFECT
		shr	r0,2			//in words
		movi	DMASize, 31		//32 words (0x80 bytes)			
		movi	LocalAddr, (local_NAP2)>>2
		dmarr	r0
		WaitDma
#else	//EFFECT
		movi	ByteSize, 0x7e
		movi	ByteLocal,local_NAP2 
		dmabrr	r0	 
#endif	//EFFECT		
NAP2_load_done:


;*******************************************************************
;******** NAP2 *****************************************************
		movi	AGRAdr2, local_NAP1	; points on V/W
		movi	AGRAdr3, local_NAP2	; points on W/Z

		movhf	r3, %g2
//		movi	r0, 0x7fff		
		li		r0,0x7fffff		
;********** deseable interrupt *************
		movi	TrapReg, 0x0
		nop
		nop

		loop	64, NAP2_loop
;********** update Zn **********************************************
		mulhf	r6, r0, a3(0)	; r6=W(n-M2)*32767	
		msubhf	r6, r3, a2(0)	; r6=W(n-M2)*32767-g2*V(n)	
		rndhf	a3(0), r6		; Z(n)

;********** update Wn **********************************************
		mulhf	r6, r0, a2(0)	; r6=V(n)*32767
		maddhf	r6, r3, i3		; r6=V(n)*32767+g2*Z(n)
		rndhf	i2, r6			; W(n)
NAP2_loop:


;********** enable interrupt ****************
		movi	TrapReg, 1<<2


;********* UPDATE OAP1 and NAP2 HISTORY ****************************
;********* update the history of OAP1 (Wn) *************************
#ifdef	EFFECT
		movi	r0,(OAP1_START)>>2	//in words
		movi	DMASize, 31		//32 words (0x80 bytes)			
		movi	LocalAddr, (local_NAP1)>>2
		dmawr	r0
		WaitDma
#else	//EFFECT
		movi	ByteSize, 0x7e
		movi	ByteLocal, local_NAP2
		dmabw	OAP1_START
#endif	//EFFECT
;********* no need to update the pointer in DRAM of OAP1 ***********

;********* update the history of NAP2 ******************************
//		movhf	r0, %NAP2_ptr	; base of the block	tchou
		movh	r0, %NAP2_ptr	; base of the block
		addi	r1, r0, 0x80	; add 64 samples 
		tsti	r1, NAP2_END	; test if wrapping is required or not
		blte	no_NAP2_up_wrapp
; wrapping required, split the block in two pieces....
; bytes required for the second transfert=r2
#ifdef	EFFECT
		subi	r2,r1,NAP2_SIZE+NAP2_START+4 

; bytes required for the first transfert=r3
		movi	r3,0x78
		sub	r3, r2
		addi	r4, r3,local_NAP1+4
// do in words
		shr	r0,2
		shr	r2,2
		shr	r3,2
		shr	r4,2
//first DMA in words
		mov	DMASize, r3					
		movi	LocalAddr, (local_NAP1)>>2
		dmawr	r0
		WaitDma

//second DMA in words
		movi	r0,(NAP2_START)>>2
		mov	DMASize, r2			
		mov	LocalAddr, r4
		dmawr	r0
		WaitDma
#else	//EFFECT
		subi	r2,r1,NAP2_SIZE+NAP2_START+2 

; bytes required for the first transfert=r3
		movi	r3,0x7c
		sub		r3, r2			
; first transfert
		mov		ByteSize, r3
		movi	ByteLocal, local_NAP1
		dmabwr	r0
; second transfert
		addi	r4, r3,local_NAP1+2
		mov		ByteSize, r2
		mov		ByteLocal, r4
		dmabw	NAP2_START
#endif	//EFFECT
		j		NAP2_up_done
no_NAP2_up_wrapp:
; no need to wrap....
#ifdef	EFFECT
		shr	r0,2			//in words
		movi	DMASize, 31		//32 words (0x80 bytes)			
		movi	LocalAddr, (local_NAP1)>>2
		dmawr	r0
		WaitDma
#else	//EFFECT
		movi	ByteSize, 0x7e
		movi	ByteLocal,local_NAP1 
		dmabwr	r0	 
#endif	//EFFECT		
NAP2_up_done:

;********* update pointer on NAP2 in DRAM **************************

//		tstsi	r1, NAP2_END	tchou
		tsti	r1, NAP2_END
		blt		no_NAP2_ptr_wrap
		subi	r1, NAP2_SIZE	; wrap if necessary
no_NAP2_ptr_wrap:
		nop
//		movhf	%NAP2_ptr, r1	; update the pointer 
		movh	%NAP2_ptr, r1	; update the pointer 

;*******************************************************************
;********* load the intermediate delay between two OAP *************
#ifdef	EFFECT
		movi	r0,(DL2_START)>>2		//in words
		movi	DMASize, 4		//5 words (10 samples)			
		movi	LocalAddr, (local_DL1)>>2
		dmarr	r0
		WaitDma
#else	//EFFECT
		movi	ByteLocal, local_DL2
		movi	ByteSize, 0x12		; 10 samples =0x14
		dmabr	DL2_START
#endif	//EFFECT
;********* update this intermediate buffer (Yn) ********************
#ifdef	EFFECT
		movi	r0,(DL2_START)>>2		//in words
		movi	DMASize, 4		//5 words (10 samples)			
		movi	LocalAddr, ((local_DL2)>>2+32)

⌨️ 快捷键说明

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