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

📄 test.s

📁 关于DVD上的PCM的解码的代码,PCM的DSP压缩,解调的算法,用RISC32指令来写.
💻 S
📖 第 1 页 / 共 5 页
字号:
/************************************************************************/
; (C)1997 Copyright LuxSonor, Inc. All rights reserved
;
; Revision 1.0
;
;	
;	Module:	AUDIO test code
;
;	Initial version:Cecile Foret, mars 1997
;			Jinshi Huang 12/1/98 for LS388/LS500
; 
;	test interrupt in the PCM OUT BUFFER
;	when an audio interrupt is catched, take data from a fake buffer....
;	command read from outside in Comm_Reg3 and analysed 
;	routine for trebble/bass and 3D sound integrated in code 
;	keyshift, trebble/bass and 3D commands are directly handled by
;	the command subroutine.
;	rate conversion 11Kh-44Kh for micro input 
;	echo on the micro phone input at 11Kh
;	interpolation of the echo -> 44.1Kh.
;	microphone input, command handled by CommReg3 (see all_command.S
;	for details ).
;	mixing with audio signal
;************************************************************************
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;  How to have echo/mixing back
;	 MICRO = 1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

	.nolist
#include "regdef2.h"
#include "stereo_user.h"
#include "user.h"
#include "globalv.h"
#include "memory2.h"
	.list

	.data

	.global	SUB_Audio_Effect
	.global	main_audio_task
#ifdef	EFFECT
	.extern	Audio_Effect_Entry
#endif
	
; tables related to key shift stuff
	.extern table			; table containing length, dec, Nb
	.extern FIR_coeff		; location in MM of the FIR coefficients.
	.extern window			; location in MM of triangular window
	.extern key_val			; location in MM of the value of the key.
	.extern ratefilt		; location in MM of rate conversion filter sets.
	
; subroutines related to key shift stuff
	.extern SUB_search_update	; routine to modify search buffer, when key change
	.extern SUB_trebble1		; routines to perform trebble filtering 
	.extern SUB_trebble2		; routines to perform trebble filtering
	.extern SUB_bass		; routine to perform the bass filtering
	.extern SUB_command		; routine to get the command from r3k
	.extern SUB_rate		; routine to change freq rate 11Kh->44.1Kh
	.extern SUB_echo		; routine to perform echo on MIC input
	.extern SUB_presence		; routine to add presence and do rate conv.

	.set	noreorder

; used to scale input by 0.5 
#define		INTERRUPT	1
#define		ALG		1

#define		KEYSHIFT	1
#define		NOP_ENABLE  0

;; ALG is set up to run the keyshift algorithm
#define		MICRO		1
#define		FAKE		0
;***********************************************************************
;;;; definitions related to AUDIO, CD, PCM-IN and PCM-OUT buffers 
;***********************************************************************
; start address high =0 byte start/end adress for audio buffer 1,5 Kbytes	
#define	AUD_BUF_START_B	0x0c00
#define AUD_BUF_END_B	0x1200
; word & shifted start/end @ for audio buffer 1.5 Kbytes 
#define AUD_BUF_START_W 0x60
#define AUD_BUF_END_W	0x90
#define AUD_BUF_SIZE_W	0x30

;; start address high =0, CD fifo, 0x1e00-0x3c00
#define CD_BUF_START	0x1e00
#define CD_BUF_END		0x3600
#define CD_BUF_SIZE		0x1800

#define CD_BUF_START_W	0x1e0
#define CD_BUF_SIZE_W	0xc0

#if OLD_PCM_BUF_SEG	// 10-13-98
; start @=0x79000, end @=0x7a000, 2K samples
#define PCM_BUF_START	0x7900
#define PCM_BUF_END		0x7a00
#else	// 10-13-98
; start @=0xf3000, end @=0xf4000, 2K samples
#define PCM_BUF_START	0xf900
#define PCM_BUF_END		0xfa00
#endif	// 10-13-98

#if OLD_PCM_IN_SEG	// 10-13-98
; start adress high = 3, start @ = 0x35c00, end @ = 0x37c00, size = 0x2000
#define PCMIN_HIGH		0x3
#define PCMIN_BUF_START 0x5c00
#define PCMIN_BUF_END	0x7c00
#define PCMIN_BUF_SIZE	0x2000

#define PCMIN_BUF_START_W	0x35c0
#define PCMIN_BUF_END_W		0x37c0
#define PCMIN_BUF_SIZE_W	0x200
#else	// 10-13-98
; start adress high = f, start @ = 0xf3000, end @ = 0xf5000, size = 0x2000
#define PCMIN_HIGH		0xf
#define PCMIN_BUF_START 0x3000
#define PCMIN_BUF_END	0x5000
#define PCMIN_BUF_SIZE	0x2000

#define PCMIN_BUF_START_W	0xf300
#define PCMIN_BUF_END_W		0xf500
#define PCMIN_BUF_SIZE_W	0x200
#endif	// 10-13-98

;***********************************************************************
;;;  definitions related to fake input buffer (micro)
;***********************************************************************
; Start adress high =9
#define INPUT_BUF_START	0x0000
; input buffer starts at adress 90000, ends at a0000


;****************************************************************
;			DEFINITIONS RELATED TO ECHO 
;****************************************************************




;*********************************************************************
;;; definitions related to local adresses (filters,data,window,history)
;*********************************************************************



;*********************************************************************
;			DEFINITION RELATED TO THE MICROPHONE 
;*********************************************************************
; start address high =0 byte start/end adress for MICRO FIFO:0x1200-0x1e00
#if	0			//ZhangWei
#define MIC_BUF_START_B	0x9000		//0x8000			;0x1200
#define MIC_BUF_END_B	0x9c00		//0x8c00
#else
#define MIC_BUF_START_B	0x9400		//0x8000			;0x1200
#define MIC_BUF_END_B	0xa000		//0x8c00
#endif
#define MIC_BUF_SIZE_B	MIC_BUF_END_B - MIC_BUF_START_B; 0xc00

; address of first block to be taken in the Micro Fifo=last block in fifo
;#define mic_start_addr	0x1a00
#define mic_start_addr	0x9000		//0x8000			//0x1200

#define local_hist_point	0x530

;************** MAIN PROGRAM ***************************************
;************** Start actual DSP code ******************************

SUB_Audio_Effect:

#ifdef	EFFECT
	movi	StartAddrHigh, DataSeg
	movi	DcacheBase, DataSeg		
	movi	BlockSkip, 0
	movi	BlockSize, 0		;block size = 1.
#endif	//EFFECT
	
		movi	r0, 0x0
		movh	%Prev_Int, r0	; first interrupt should be audio !

;************** set up the command to default values ***************
		movi	r0, 0x7			; trebble = bass = 0dB
		movh	%bass_com,r0	; no bass by default !
		movh	%trebble_com, r0; no trebble by default
		movi	r0, 0xffff
		movh	%echo_com, r0	; no echo by default !
		movh	%micro_com, r0	; no micro by default
		movi	r0, Key_default
		movh	%keyshift_com,r0

#if		MICRO
;********** init microphone related stuff ***********************
;********** put 3 blocks in MICRO FIFO to start *****************

#if		0	//---------------tchou

#ifdef	EFFECT
		movi	StartAddrHigh, DataSeg		//0x0
		movi	DMASize, 31		//32 words each
		movi	r0, 0
		movi	r1, mic_start_addr
		shr	r1, 2
	
		loop	8, init_mic_0
		
		mov		LocalAddr, r0
		dmawr	r1		; third block
		WaitDma

		addi	r0, 32
		addi	r1, 32
init_mic_0:

		movi	r0, 0
		movi	r1, 0x1200
		shr	r1, 2
	
		loop	8, init_mic_1
		
		mov		LocalAddr, r0
		dmawr	r1		; first block
		WaitDma

		addi	r0, 32
		addi	r1, 32
init_mic_1:

		movi	r0, 0
		movi	r1, 0x1600
		shr	r1, 2
	
		loop	8, init_mic_2
		
		mov		LocalAddr, r0
		dmawr	r1		; first block
		WaitDma

		addi	r0, 32
		addi	r1, 32
init_mic_2:

#else	//EFFECT
		movi	StartAddrHigh, 0x0
		movi	ByteSize, 0x3fe
		movi	ByteLocal, 0x0
		dmabw	mic_start_addr		; third block

		movi	ByteSize, 0x3fe
		movi	ByteLocal, 0x0
		dmabw	0x1200				; first block

		movi	ByteSize, 0x3fe
		movi	ByteLocal, 0x0
		dmabw	0x1600				; second block
#endif	//EFFECT
#endif			//------------------tchou
;********** set up the read pointer in the micro FIFO ***********
		li	r0,0
		mupi	r0,0x1011
		ori		r0,MIC_BUF_START_B
		rswi	r0,PCM_In_Fifo_Start_Addr
		rswi	r0,PCM_In_Current_Addr
//		ori		r0,MIC_BUF_END_B
		addi		r0,MIC_BUF_SIZE_B	//ZhangWei
		rswi	r0,PCM_In_Fifo_End_Addr
		
//---------------------PCM-in registers setting------------------
		movi	DcacheBase,MEM_SEG
		nop
		nop
		dlw	r0,USER_ICFG
		nop
		andi	r0,ICFG_LS128_MASK
		tsti	r0,ICFG_LS128_MASK
		bne	not_ls128_adc
		movi	r0,0x61
		j	adc_chip_set_done
not_ls128_adc:
		movi	r0,0x16d			;0x56d
adc_chip_set_done:
		rswi	r0,PCM_In_Control_Reg
//		movi	r0,	mic_start_addr
		movi	r0,MIC_BUF_START_B
		movh	%mic_data_ptr, r0
//--------------------------------------------------------------
;************************************************
;	Add for ufon hardware existence check		*
;************************************************
		movi	DcacheBase, MEM_SEG

		dlw		r0,USER_ICFG
		nop
		andi	r0,0x8000				;bit15 stands for ufone hardware
		tsti	r0,0x8000
		bz		skip_ufon_resetting		;skip if non-existence

		rlwi	r0,PCM_Run_Halt
		tsti	r0,0x131				; Yes it is set already
		beq		skip_ufon_resetting
		ori		r0,0x0600
		rswi	r0,PCM_Run_Halt

		subi	r0,0x0500
		nop
		rswi	r0,PCM_Run_Halt		;ufon is turned on
skip_ufon_resetting:				
		movi	DcacheBase, DataSeg		

#endif	//MICRO

;************* init of the bass buffers to 0 *****************************
		movi	AGRAdr1, 0x0
		movi	AGRInc1, 0x2
		movi	AGRSiz1, 0xffff
;		movi	StartAddrHigh, 0x7
		movi	StartAddrHigh, DataSeg	// 10-13-98

#ifdef	EFFECT
		movi	DMASize, 1		;2 words
		movi	LocalAddr, 0x0
		movi	r0,0x0
		loop	4,trebble_hist
		movhf	i1,r0
trebble_hist:
		movi	r0, Lu0u1
		shr	r0, 2		//to word addr
		dmawr	r0			; set up left history
		WaitDma
		
		movi	r0, Ru0u1
		shr	r0, 2
		movi	LocalAddr, 0x0
		dmawr	r0					; set up right history
		WaitDma
		
#else	//EFFECT
		movi	ByteSize, 0x6		;(2*2-1)*2
		movi	ByteLocal, 0x0
		movi	r0,0x0
		loop	4,trebble_hist
		movhf	i1,r0
trebble_hist:
		movi	r0, Lu0u1
		dmabwr	r0					; set up left history
		
		movi	r0, Ru0u1
		movi	ByteSize, 0x6
		movi	ByteLocal, 0x0
		dmabwr	r0					; set up right history
#endif	//EFFECT
	
;************ Init of the trebble buffers to 0 ***************************

#ifdef	EFFECT
		movi	r0, TLu0u1			; set up left trebble  history
		shr	r0, 2
		movi	DMASize, 1			
		movi	LocalAddr, 0x0
		dmawr	r0
		WaitDma
	
		movi	r0, TRu0u1			; set up right trebble history
		shr	r0, 2
		movi	LocalAddr, 0x0
		dmawr	r0
		WaitDma
#else	//EFFECT
		movi	r0, TLu0u1			; set up left trebble  history 
		movi	ByteSize, 0x6			
		movi	ByteLocal, 0x0
		dmabwr	r0

		movi	r0, TRu0u1			; set up right trebble history 
		movi	ByteSize, 0x6
		movi	ByteLocal, 0x0
		dmabwr	r0
#endif	//EFFECT

;************ Set u0,u1 to zero ******************************************

#ifdef	EFFECT
		movi	DMASize, 0	//1 word
		movi	LocalAddr, 0x0
		movi	r0, TDu0u1
		shr	r0, 2		//to word addr
		dmawr	r0
		WaitDma
#else	//EFFECT
		movi	ByteSize, 0x2		;(2*2-1)*2
		movi	ByteLocal, 0x0
		movi	r0, TDu0u1
		dmabwr	r0
#endif	//EFFECT
	
;************ Init of the decimation 44.1Khz-> 11Khz ***************
;******* init the dec_hist *****************************************
		movi	AGRAdr0, 0x0
		movi	AGRInc0, 0x2
		movi	AGRSiz0, 0xffff
		movi	r0, 0x0
		
		loop	127, dec_init
		movhf	i0, r0
dec_init:

#ifdef	EFFECT
		movi	DMASize, 31
		movi	StartAddrHigh, DataSeg	
		movi	r0, 0
		movh	r1,%Echo_delay_ptr
;		movi	r1, dec_hist
;		shr	r1, 2
	
		loop	2, init_dec_hist
	
		mov	LocalAddr, r0
		dmawr	r1
		WaitDma

		addi	r0, 32
		addi	r1, 32
init_dec_hist:
	
#else	//EFFECT
		movi	ByteSize, 0xfc
		movi	ByteLocal, 0x0
;		movi	StartAddrHigh, 0x7
		movi	StartAddrHigh, DataSeg	// 10-13-98
		dmabw	dec_hist
#endif


;************ Init of the interpolation  11Khz->44Khz***************
;******* init the history of the rate filter to zero ***************
#ifdef	EFFECT
		movi	AGRAdr4, 0x1000
		movi	AGRSiz4, 0xffff
		movi	AGRInc4, 0x2
#else	//EFFECT
		movi	AGRAdr2, 0x1000
		movi	AGRSiz2, 0xffff
		movi	AGRInc2, 0x2
#endif	//EFFECT
		movi	r0, 0x0
		loop	32, rate_hist_init
#ifdef	EFFECT
		movhf	i4, r0
#else	//EFFECT
		movhf	i2, r0
#endif	//EFFECT
rate_hist_init:

#ifdef	EFFECT
		movi	DMASize, 16		; history =31 coefficients
		movi	LocalAddr, 0x1000>>2
		movi	r0, rate_hist>>2
		dmawr	r0			; adress in DRAM for history of rate filter
		WaitDma
#else	//EFFECT
		movi	StartAddrHigh, 0x7
		movi	StartAddrHigh, DataSeg	// 10-13-98
		movi	ByteSize, 0x3c		; history =31 coefficients
		movi	ByteLocal, 0x1000
		dmabw	rate_hist		; adress in DRAM for history of rate filter
#endif

#ifdef	EFFECT	//put system variables at 0x400 for now ???
;******* load the 4 sets of filter coefficients ********************
;		movi	StartAddrHigh, 0x40	; read from ROM
		movi	StartAddrHigh, DataSeg	; read from DRAM 10-13-98
		movi	DMASize,31		; 128 coefficients in total 
		movi	r0,ratefilt
		movi	r9, local_rate_filter>>2
		shr		r0,2

		loop	2,decim_interp_coef
		mov		LocalAddr, r9
		dmarr	r0					; adress in ROM of the rate filter
		WaitDma
		addi	r0,32

⌨️ 快捷键说明

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