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

📄 test.s

📁 关于DVD上的PCM的解码的代码,PCM的DSP压缩,解调的算法,用RISC32指令来写.
💻 S
📖 第 1 页 / 共 5 页
字号:
		WaitDma
		addi	r0,32
		addi	r9,32
read_micro_fifo:
		shl	r0, 2
#else	//EFFECT
		movh	r0, %mic_data_ptr	; read the current address of pointer
		movi	ByteSize, 0x3fe		; get 512 data (L/R)
		movi	StartAddrHigh, 0x0	; read from the micro Fifo
		movi	ByteLocal, local_micro_44
		dmabrr	r0					; read the micro block.

#endif	//EFFECT
	
;******* update the microphone read pointer ***************************
//		addi	r0, 0x400
		tsti	r0, MIC_BUF_END_B
		blt		no_micro_read_wrap
		subi	r0, MIC_BUF_SIZE_B
no_micro_read_wrap:
		nop
		movh	%mic_data_ptr, r0
#endif	//MICRO

;;;;;; debug;;;;;
//		mov		r0, TrapReg
//		movi	r1, 0xc2a0
;		dshr	r0, r1

//------------- Mic_automute and volume control ----------------------
		movi	DcacheBase,MEM_SEG
		nop
		nop
		dlw	r0,USER_ICFG
		nop
		andi	r0,ICFG_LS128_MASK
		tsti	r0,ICFG_LS128_MASK
		bne	need_not_automute_mic

		jsr	r11,SUB_automute_mic
		nop
		li	r5,0
		movi	r15,0x128				//r15 as a flag of ls128
		j	one_micro_vol
need_not_automute_mic:
		movi	r15,0
		dlw		r5,mic1_vol			;mic1 (R) volume
one_micro_vol:
		dlw		r4,mic2_vol			;mic2 (L) volume
//-------------------------------------------------------------------		

#if		1				// For microphone volume control

		movi	AGRAdr0, local_micro_44
		movi	AGRInc0, 0x2
		movi	AGRSiz0, 0xffff

		movi	AGRAdr1, local_micro_44
		movi	AGRInc1, 0x2
		movi	AGRSiz1, 0xffff

		nop		
		loop	256,spkfon_vol_adj
		mulhf	r0, r4, i0			;mic2
		mulhf	r2, r5, i0			;mic1
		rndhf	i1,r0
		rndhf	i1,r2
spkfon_vol_adj:
		movi	DcacheBase, DataSeg		

#endif

;******* do the decimation of the input micro phone sequence **********

		jsr	r11, SUB_presence

;******* Automatic Voice Following ************************************
		.extern	AVF_CMD_BUF
		movi	DcacheBase, MEM_SEG
		nop
		dlw	r0,AVF_CMD_BUF
		movh	r1,%energy_indicator
		tsti	r0,0
		beq	avf_done
		tsti	r1,0
		beq	avf_done
		movi	AGRAdr0, 0x0
		movi	AGRInc0, 0x4
		movi	AGRSiz0, 0xffff
		movi	AGRAdr1, 0x2
		movi	AGRInc1, 0x4
		movi	AGRSiz1, 0xffff

		andi	r1,r0,CMD1_AVF_LR_ON
		tsti	r1,CMD1_AVF_LR_ON
		bne	chk_avf_left_channel
		// AVF_LR_ON: clear L & R
		movi	r1,0
		loop	256,avf_LR_zero
		movhf	i0,r1
		movhf	i1,r1
avf_LR_zero:
		j	avf_done
chk_avf_left_channel:
		andi	r1,r0,CMD1_AVF_L_ON
		tsti	r1,CMD1_AVF_L_ON
		bne	chk_avf_right_channel
		// AVF_L_ON: copy R to L
		loop	256,avf_R_2_L
		movhf	r1,i1
		movhf	i0,r1
avf_R_2_L:
		j	avf_done
chk_avf_right_channel:
		andi	r1,r0,CMD1_AVF_R_ON
		tsti	r1,CMD1_AVF_R_ON
		bne	avf_done
		// AVF_R_ON: copy L to R
		loop	256,avf_L_2_R
		movhf	r1,i0
		movhf	i1,r1
avf_L_2_R:
avf_done:
//------------- HW_ECHO? ---------------------------------------------
		movi	DcacheBase,MEM_SEG
		nop
		nop
		dlw	r0,USER_ICFG
		nop
		andi	r0,ICFG_HWECHO_MASK
		tsti	r0,ICFG_HWECHO_MASK
		beq	total_echo_done
//--------------------------------------------------------------------

;******* 3D spatializer ***********************************************
;******* test if some echo is required ********************************
		movhf	r0, %echo_com
		tstsi	r0, 0x0
		blt	echo_mixing_done2	; if no echo is required do nothing

;******* do the echo **************************************************
//------------- bypass reverb ? --------------------------------------
		movi	DcacheBase,MEM_SEG
		nop
		nop
		dlw	r0,USER_ICFG
		nop
		andi	r0,ICFG_REVERB_BYPASS_MASK
		tsti	r0,ICFG_REVERB_BYPASS_MASK
		beq	no_reverb
//--------------------------------------------------------------------
		jsr	r11, SUB_echo
		nop
no_reverb:
;******* perform the rate conversion on the microphone input **********

		jsr	r11, SUB_rate

		movi	DcacheBase, DataSeg		
;****** add the echo to the direct input and mix with audio ***********

		movi	AGRAdr4, local_micro_44
		movi	AGRInc4, 0x2
		movi	AGRSiz4, 0xffff

		movi	AGRAdr5, local_micro_out			
		movi	AGRInc5, 0x2
		movi	AGRSiz5, 0xffff

		movi	AGRAdr0, 0x0
		movi	AGRInc0, 0x2
		movi	AGRSiz0, 0xffff

//		movi	r3, 0x7fff	
//		li		r3,0x006fffff
//		li		r4,0x004fffff

		li		r3,0x007fffff
		li		r4,0x007fffff		

		loop	256, add_echo
		mulhf	r0, r3, a0(0)		; left audio signal
		maddhf	r0, r4, a5(0)		; presence (left=right)
		nop
		rndhf	i0, r0				; left channel=L+0.75*(L-R)^echo

		mulhf	r0, r3, a0(0)		; right audio signal
//		msubhf	r0, r4, i5			; presence (left=right)
		maddhf	r0, r4, i5			; ZhangWei:R=R+echo
		nop
		rndhf	i0, r0				; right channel=R-0.75(L-R)^echo

add_echo:

;******* enable interrupt *******************
		movi	TrapReg, 0x24

//		j		echo_mixing_done		remove later


echo_mixing_done2:


;******* if no echo is required, just mix microphone with audio data **
#if		MICRO
mixing_no_echo:
		movi	AGRAdr0, 0x0
		movi	AGRInc0, 0x2
		movi	AGRSiz0, 0xffff

#ifdef	EFFECT
		movi	AGRAdr4, local_micro_44
		movi	AGRInc4, 0x2
		movi	AGRSiz4, 0xffff
#else	//EFFECT
		movi	AGRAdr2, local_micro_44
		movi	AGRInc2, 0x2
		movi	AGRSiz2, 0xffff
#endif	//EFFECT
//		li		r2, 0x006fffff
//		li		r3,	0x004fffff
		li		r2, 0x007fffff
		li		r3, 0x003fffff		

;		movi	r2, 0x7fff
;******* desable interrupt **************
;		movi	TrapReg, 0x0
;		nop	
;		nop

		loop	256, mic_mix_no_echo
#ifdef	EFFECT
		mulhf	r0, r2, a0(0)			
//tchou		maddhf	r0, r2, i4			
//-------------------------------------------
		tsti	r15,0x128
		bne	not_ls128_mix1
		maddhf	r0, r3, a4(0)
		j	not_ls128_mix1_done
not_ls128_mix1:
		maddhf	r0, r3, i4			
not_ls128_mix1_done:				
//-------------------------------------------
		nop
#else	//EFFECT
		mulhf	r0, r2, a0(0)		
		maddhf	r0, r2, i2
#endif	//EFFECT
		rndhf	i0, r0				; mix left

#ifdef	EFFECT
		mulhf	r0, r2, a0(0)		
//tchou		maddhf	r0, r2, i4			
//-------------------------------------------
		tsti	r15,0x128
		bne	not_ls128_mix2
		maddhf	r0, r3, a4(4)
		j	not_ls128_mix2_done
not_ls128_mix2:
		maddhf	r0, r3, i4			
not_ls128_mix2_done:
//-------------------------------------------
		nop
#else	//EFFECT
		mulhf	r0, r2, a0(0)
		maddhf	r0, r2, i2
#endif	//EFFECT
		rndhf	i0, r0				; mix right
mic_mix_no_echo:

;******* enable interrupt *****************
;		movi	TrapReg, 0x24
;		nop
#if		0

test_11:
		dlw		r9,0x9f00
		nop
		addi	r9,1
		dsw		r9,0x9f00
		nop
		tsti	r9,600
		blt		keep_going
test_12:
		nop
		nop
		nop
		j		test_12
keep_going:

#endif
		
echo_mixing_done:
		nop

total_echo_done:

#if		0			

;******* synchronise the microphone buffer, even no micro input *******
;******* read the microphone command : micro or not *******************
		movhf	r0, %micro_com
		tstsi	r0, 0x0
		bgte	mic_sync_done		; if micro is required, sync is done
		movh	r0, %mic_data_ptr	; read the current address of pointer

;******* update the microphone read pointer ***************************
		addi	r0, 0x400
		tsti	r0, MIC_BUF_END_B
		blt		no_micro_sync_wrap
		subi	r0, MIC_BUF_SIZE_B
no_micro_sync_wrap:
		nop
		movh	%mic_data_ptr, r0
mic_sync_done:

#endif			
#endif	//MICRO


;;;;;; debug;;;;;
		mov		r0, TrapReg
		movi	r1, 0xc2b0
;		dshr	r0, r1
#endif	//?



;******* load a new sequence in PCM_OUT *******************************

//done in pcm_pcm		jsr	r11, pcm_load

;******* return to main routine ***************************************
;;;;;; debug ;;;;;;
		mov		r0, TrapReg
		movi	r1, 0xc270
;		dshr	r0, r1

		j	r27		//return

;******* end of pcm_out routine ***************************************
;**********************************************************************

//-------------------------------------------------------------------
SUB_read_data:
//	dlw	r0, Stream_Rd_Ptr
	LdStrRdPtr	r0
	dlw	r1, Stream_End
	dlw	r2, Stream_Start
	movi	r3, local_FApcm_buf_word	; word addr
	movi	DMASize, 31		;32 words each block
	movi	BlockSkip, 0
	movi	BlockSize, 0		;block size = 1.

	shr	r0, 2			//to word addr
	
	loop	8, Lget_data
	mov	LocalAddr, r3
	
	dmarr	r0			;read data from DRAM
wait_dma_21:	bdb	wait_dma_21
	
	addi	r3, 32			;32 words each block
	addi	r0, 32
Lget_data:	

	shl	r0, 2			//back to byte addr
	tst	r0, r1
	blt	Lno_wrap
	mov	r0, r2		//wraping to start
Lno_wrap:
//	dsw	r0, Stream_Rd_Ptr	//update Rd_Ptr
	SvStrRdPtr	r0
	movw	LWibufRdPtr,r0
#if LS388
	rswi	r0, Comm_Reg3		//for host
	andi	r1,r0,0xffff
	movh	r3,LIold_rd_ptr
	tst	r1,r3
	bgte	1f
	addi	r1,PCM_IBUF_SIZE
1:	sub	r1,r3
	movh	LIold_rd_ptr,r0
	movw	r3,LWbytecount
	add	r3,r1
	movw	LWbytecount,r3
#endif	// LS388

// update block count
	
	movb	r1,LBblknum
	addi	r1,1
	tsti	r1, 6
	blte	blk_ok
	movi	r1,1		; starts with 1
blk_ok:	
	movb	LBblknum,r1

	j	r27		//return

//*********************** Mic auto_mute for LS128 ******************
//ZhangWei:for ls128,L = R
SUB_automute_mic:
	movi	DcacheBase, MEM_SEG

        movi	AGRAdr0,local_micro_44
	movi	AGRInc0,2
	movi	AGRInc0,0xffff
	
	dlh	r3,mute_num_mic
	movhf	r6,%dc_offset_44
	nop
	tsti	r3,0xa
	beq	dcoff44

	loop	256,dcoff44
	movhf	r2,a0(4)
	
	sub	r2,r6
	shra	r2,11
	add	r6,r2
	
dcoff44:
	nop
		
        movi	AGRAdr0,local_micro_44
	movi	r1,0
	loop	256,test_mute_mic
	movhf	r2,a0(4)
	sub	r2,r6
	abs	r2,r2
	shr	r2,8
//	dsw	r2,0xff90	//debug
	tsti	r2,0x1000
	blt	tst_m0_mic
	movi	r1,1
tst_m0_mic:
	nop
test_mute_mic:

	movhf	%dc_offset_44,r6
	
	tsti	r1,0
	beq	add_mute_num_mic
	movi	r0,0
	dsh	r0,mute_num_mic
	j	test_mute_end_mic
	
add_mute_num_mic:

	dlh	r0,mute_num_mic
	nop
	nop
	addi	r0,1	
	tsti	r0,0xa
	bgt	mute_mic
	dsh	r0,mute_num_mic
	j	test_mute_end_mic
mute_mic:	
	
        movi	AGRAdr0,local_micro_44
        nop
	loop	256,mute_mic_done
	movhf	a0(2),r6				//mute
	movhf	a0(2),r6				//mute
	nop
mute_mic_done:	

	movi	r0,0xa
	dsh	r0,mute_num_mic
test_mute_end_mic:
	nop
	j	r11
	nop
	nop

⌨️ 快捷键说明

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