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

📄 pcm.s

📁 关于DVD上的PCM的解码的代码,PCM的DSP压缩,解调的算法,用RISC32指令来写.
💻 S
📖 第 1 页 / 共 3 页
字号:
        movi    r0, CMD_STOP
	movh	r3, LIMpegAttr
        andi    r2, r3, 0x100
        tsti    r2, 0x100
        beq     ExecCmd
        movi    r0, CMD_PLAY
        j       ExecCmd

#if 0

/********************************************************/
/*	Set PCM_Out_Ctrl in R3k, the rest has no difference */
/*  from 6 ch. This sub could be removed.				*/
/********************************************************/
 
LSpdif:
	la	r11,CLOCK_TABLE
	andi	r0,r10,ICFG_CLOCK_MASK
	shl	r0, 3		; each entry takes 8 bytes
	add	r11,r0
	dlwr	r2,r11		; get clock value and enable bits
	addi	r11,4
	dlwr	r0,r11		; get mask
	
	rlwi	r3, GPIO_CTRL_REG
	and	r3, r0
	or	r3, r2
#if	!LS388
	rswi	r3, GPIO_CTRL_REG
#endif	// LS388
	
#if LS388
#ifdef	EXTERNAL_A_CLOCK
	li	r2,0x30000
	rlwi	r0,PCM_Out_Ctrl
	and	r0,r2
	li	r2,0x47049	// reverse PCM clock, 24-bit clock, 6-channel, front to S/PDIF
	or	r0,r2
#else	// EXTERNAL_A_CLOCK
	li	r0,0x57049	// reverse PCM clock, 24-bit clock, 6-channel, front to S/PDIF
#endif	// EXTERNAL_A_CLOCK
#else	// LS388
	li	r0,0x13d21
#endif	// LS388
#ifndef	R3K_PCM_OUT_CTRL
	rswi	r0,PCM_Out_Ctrl
#endif	// R3K_PCM_OUT_CTRL
	dsw	r0, PCM_Config_Word
	movi	r0, PCM_MIN_IBUF_DEPTH	//default
	dsw	r0, MIN_IBUF_VAR
#if	THREEPAGE
	mupi	r0,MEM_SEG12		// init input buffer write pointer
#else	// THREEPAGE
	mupi	r0,MEM_SEG		// init input buffer write pointer
#endif	// THREEPAGE
	ori	r2,r0,PCM_IBUF_START	// set up input stream circular buffer
	dsw	r2,Stream_Start
	movw	LWibufRdPtr,r2
//	dsw	r2,Stream_Wr_Ptr	// init input buffer write pointer
//	dsw	r2,Stream_Rd_Ptr
	SvStrWrPtr	r2
	nop
	SvStrRdPtr	r2
#if LS388
	rswi	r2, Comm_Reg3		//for host
	movh	LIold_rd_ptr,r2
#endif	// LS388
	addi	r2,PCM_IBUF_SIZE	// set up buffer end address
	dsw	r2,Stream_End
	mupi	r0,MEM_SEG
	addi	r2,r0,PTS_FIFO_START
	dsw	r2,PTS_FIFO_Start
//	dsw	r2,PTS_FIFO_Rd_Ptr
//	dsw	r2,PTS_FIFO_Wr_Ptr
	SvPTSRdPtr	r2
	SvPTSWrPtr	r2
	addi	r2,r0,PTS_FIFO_END
	dsw	r2,PTS_FIFO_End
	movi	r0,1
	movb	LBPCM_flag,r0
	movi	r0,0
	movb	LBblknum,r0		//match convention of AC-3
	movw	LWbytecount,r0
	movw	LWoldPTS,r0
/******************************************************/
/* For Spdif mode Make (user_icfg=0x02 then 0x82)	  */
/******************************************************/

	la	r0,SUB_PCM_decoder	// PCM decoder
	movw	LWentry,r0	
	la	r0,SUB_pcm_pcm
	movw	LWPCMentry,r0		// default, ac3 as decoder
	ori	r1,SET_PROCESS_NEW	// process, new
	j	LStoreStatus

#endif

#if	LS388
LCpyp_clear:			// Drv_RD, Drv_acc, Drv_CD are assumed in the
	movi	r1,0		// consecutive byte location.
	movi	r2,Drv_RD	// 16 byte/4 dword total
	dswr	r1,r2
	addi	r2,4
	dswr	r1,r2
	addi	r2,4
	dswr	r1,r2
	addi	r2,4
	dswr	r1,r2
LDrv_Auth:
#ifndef	LS240
	movi	TrapReg,0
	nop
	nop
#endif
	jsr	r27,SUB_Drv_Auth
rtn_Drv_Auth:
#ifndef	LS240
	movi	TrapReg,1<<2
#endif
	j	LClearCmd

LDec_Auth:
#ifndef	LS240
	movi	TrapReg,0
	nop
	nop
#endif
	jsr	r27,SUB_Dec_Auth
rtn_Dec_Auth:
#ifndef	LS240
	movi	TrapReg,1<<2
#endif
	j	LClearCmd

LKey_Share:
#ifndef	LS240
	movi	TrapReg,0
	nop
	nop
#endif
	jsr	r27,SUB_Key_Share
rtn_Key_Share:
#ifndef	LS240
	movi	TrapReg,1<<2
#endif
	j	LClearCmd

LDisc_Key:
#ifndef	LS240
	movi	TrapReg,0
	nop
	nop
#endif
	jsr	r26,SUB_Disc_Key		// beware it's r26
rtn_Disc_Key:
#ifndef	LS240
	movi	TrapReg,1<<2
#endif
	j	LClearCmd

LTitle_Key:
#ifndef	LS240
	movi	TrapReg,0
	nop
	nop
#endif
	movh	r0,LIMpegAttr
	dsw	r0,TEMP_MpegAttr
	
	jsr	r26,SUB_Title_Key		// beware it's r26
rtn_Title_Key:
	dlw	r0,TEMP_MpegAttr
	nop
	movh	LIMpegAttr,r0
	
#ifndef	LS240
	movi	TrapReg,1<<2
#endif
	j	LClearCmd
#endif	// LS388

LDriver_Type:
	movi	r0,0x1
	movb	LBDriver,r0		// External DVD
	j	LClearCmd

///////////////////////////////////////////////////////
/////	SUB_clear_PCM
SUB_clear_PCM:
	movi	TrapReg,0
	movi	r0,0			// flush PCM FIFO
#ifdef	EFFECT
	movi	DcacheBase,DataSeg
	movi	r2,MIDDLE_BUF
	loop	24,LclearEFFECT
	loop	128,LclearEFFECT
#if	1	//yyyy
	dswr	r0,r2
#endif
	addi	r2,4
LclearEFFECT:
#endif	// EFFECT
////////Corin   ////////////////////////////////////////
////////Corin   ////////////////////////////////////////
	movi	r8, PCM_FIFO_0_START
	movi	r9, PCM_FIFO_0_END
	rlwi	r1, PCM_Rd_Ptr	; read current pointer register (28c)
	andi	r1,0xffff
	tst	r1, r9
	blt	LclrPCM_from_BLK_1
// Clear from BLOCK 0
	movi	r0,0
	movi	r2,PCM_FIFO_0_START
	loop	32,LclearPCM_FIFO_0		
	loop	48,LclearPCM_FIFO_0
	dswr	r0,r2
	addi	r2,4
LclearPCM_FIFO_0:
	movi	r0,0
	movi	r2,PCM_FIFO_1_START
	loop	32,LclearPCM_FIFO_1
	loop	48,LclearPCM_FIFO_1
	dswr	r0,r2
	addi	r2,4
LclearPCM_FIFO_1:
	j	LclrPCM_BLK_0
LclrPCM_from_BLK_1:
	movi	r0,0
	movi	r2,PCM_FIFO_1_START
	loop	32,LclrPCM_BLK_1
	loop	48,LclrPCM_BLK_1
	dswr	r0,r2
	addi	r2,4
LclrPCM_BLK_1:
	movi	r0,0
	movi	r2,PCM_FIFO_0_START
	loop	32,LclrPCM_BLK_0
	loop	48,LclrPCM_BLK_0
	dswr	r0,r2
	addi	r2,4
LclrPCM_BLK_0:
////////Corin   ////////////////////////////////////////
////////Corin   ////////////////////////////////////////
////////Corin   ////////////////////////////////////////
/*corin	movi	r2,PCM_FIFO_BASE
	loop	32,LclearPCM		
	loop	96,LclearPCM
#if	1	//yyyy
	dswr	r0,r2
#endif
	addi	r2,4
*/
LclearPCM:
	movi	DcacheBase,MEM_SEG
	movi	AGRAdr0,local_FApcm_buf_byte
	movi	AGRSiz0,0xffff
	loop	32,LclearPCM_local
#ifdef	EFFECT
	loop	8,LclearPCM_local
#else	//EFFECT
	loop	24,LclearPCM_local
#endif	//EFFECT
	mov	a0(4),r0
LclearPCM_local:
	movi	TrapReg,1<<2
	j	r31
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////

SUB_mute_PCM:
#ifdef	I2S
	dlw	r11,USER_ICFG
	nop
	andi	r11,ICFG_SPDIF_MASK
	shr	r11,ICFG_SPDIF_SHIFT
#endif
	
	movi	r29,0		//loop counter

	movi	AGRSiz0,0xffff
	movi	AGRMod0,0

#ifdef	I2S
	li	r3,0x007ae7d2	; 0.960199606 time constant for 256 samples
				// 10 ^^ (-15 * lg 2 / 256)
	tsti	r11,SPDIF_ENABLED
	bne	Lnot_Spdif	//in spdif mode, use non-I2S
	li	r3,0x007d6d4a	; 0.979897753 time constant for 512 samples
				// 10 ^^ (-15 * lg 2 / 512)
Lnot_Spdif:	

#else
	li	r3,0x007d6d4a	; 0.979897753 time constant for 512 samples
				// 10 ^^ (-15 * lg 2 / 512)
#endif
	mov	r16,r3		; start with r3
start_mute_loop:	
	movi	TrapReg,0
	nop
	nop

#ifdef	I2S
	tsti	r11,SPDIF_ENABLED
	beq	LSpdif_i2s	//in spdif mode, use non-I2S
	
	movi	AGRAdr0,local_FApcm_buf_byte
	loop	128,Linear
	movhf	r1,a0(12)	; L
	movhf	r2,a0(-12)	; R
	mulf	r6,r1,r16
	mulf	r8,r2,r16
	movhf	a0(12),r6	//pcm_dec in 1.15 format. to R sample
	movhf	a0(12),r8	//pcm_dec in 1.15 format. to next L sample
	mulf	r16,r16,r3	//decaying
Linear:
	j	Lcont_mute

LSpdif_i2s:
	
	movi	AGRAdr0,local_FApcm_buf_byte
	loop	256,Linear_spf
	movhf	r1,a0(2)	//L
	movhf	r2,a0(-2)	//R
	mulf	r6,r1,r16
	mulf	r8,r2,r16	
	movhf	a0(2),r6	//to R sample
	movhf	a0(10),r8	//to next L sample
	mulf	r16,r16,r3
Linear_spf:	
Lcont_mute:		
#else	
	movi	AGRAdr0,local_FApcm_buf_byte
	loop	256,Linear
	movhf	r1,a0(2)	//L
	movhf	r2,a0(-2)	//R
	mulf	r6,r1,r16
	mulf	r8,r2,r16	
	movhf	a0(2),r6	//to R sample
	movhf	a0(10),r8	//to next L sample
	mulf	r16,r16,r3
Linear:	
#endif	
	movi	TrapReg,1<<2

#ifdef	EFFECT
	dsw	r31,r31_temp		//push stack
	jsr	r31,SUB_copy_to_middle	//this will advance wr_ptr
	jsr	r31,SUB_save_pcm_context	//0x0-0x2000
	jsr	r31,SUB_restore_keyshift_context	//0x400-0x1000	
	jsr	r31,SUB_copy_from_middle //this will advance rd_ptr
	jsr	r31,SUB_save_keyshift_context	//0x0-0x1000
	jsr	r31,SUB_restore_pcm_context	//0x0-0x2000
	movi	DcacheBase,MEM_SEG	//back to mpeg segment
	movi	StartAddrHigh,MEM_SEG
	dlw	r31,r31_temp		//pop stack
#endif	//EFFECT
	
wait_PCM:	
	movi	r1,0			// clear flag, signal there will be
	movb	LBPCM_flag,r1		// a valid PCM block
	movi	r0,MEM_SEG
	andi	r0,0x3
	shl	r0,16
	la	r27,rtn_PCM2
	or	r27,r0
	movw	r1,LWPCMentry		//should not use r16,r17,r18,r19,r29
	or	r1,r0
	j	r1

rtn_PCM2:
	movb	r1,LBPCM_flag
	tsti	r1,1			// test bit 0
	bne	wait_PCM		// wait until set


	addi	r29,1
	tsti	r29,4			//do 4 blocks
	blt	start_mute_loop
		
	j	r31


#ifdef	EFFECT
	
SUB_save_pcm_context:			//0x0-0x2000 
	movi	StartAddrHigh,DataSeg	//to second segment
	movi	DMASize,31
	movi	r10,0x0
	movi	r11,(mpeg_context)>>2
	
	loop	64, save_pcm		;total of 64*32 words
#if	1	//yyyy
	mov	LocalAddr, r10	
	dmawr	r11	
Lwait0:	bdb	Lwait0
#endif
	addi	r10, 32			;32 words each block
	addi	r11, 32
save_pcm:
	
	movi	StartAddrHigh,MEM_SEG	//back to first segment
	
	j	r31
	
SUB_restore_pcm_context:		//0x0-0x2000
	movi	StartAddrHigh,DataSeg	//to second segment
	movi	DMASize,31
	movi	r10,0x0
	movi	r11,(mpeg_context)>>2
	
	loop	64, restore_pcm		;total of 64*32 words
#if	1	//yyyy
	mov	LocalAddr, r10	
	dmarr	r11	
Lwait1:	bdb	Lwait1
#endif	
	addi	r10, 32			;32 words each block
	addi	r11, 32
restore_pcm:

	movi	StartAddrHigh,MEM_SEG	//back to first segment
	
	j	r31
	
SUB_save_keyshift_context:		//0x2000-0x3000
	movi	StartAddrHigh,DataSeg	//to second segment
	movi	DMASize,31
	movi	r10,0x0
	movi	r11,keyshift_context
	shr	r11,2
	
	loop	32, save_keyshift	;total of 32*32 words
#if	1	//yyyy
	mov	LocalAddr, r10	
	dmawr	r11	
Lwait2:	bdb	Lwait2
#endif
	
	addi	r10, 32			;32 words each block
	addi	r11, 32
save_keyshift:
	movi	StartAddrHigh,MEM_SEG	//back to first segment
	
	j	r31
	
SUB_clear_keyshift_context:		//0x2000-0x3000
	movi	DcacheBase,DataSeg	//to second segment
	movi	r10,0x0
	movi	r11,keyshift_context
	
	loop	32, clear_keyshift	;total of 32*32 words
	loop	32, clear_keyshift	;total of 32*32 words
	dswr	r10,r11	
	addi	r11, 4
clear_keyshift:
	movi	DcacheBase,MEM_SEG	//back to first segment
	
	j	r31
	
SUB_restore_keyshift_context:		//0x2400-0x3000
	movi	StartAddrHigh,DataSeg	//to second segment
	movi	DMASize,31
	movi	r10,0x400		//no need to copy output
	shr	r10,2
	movi	r11,(keyshift_context+0x400)
	shr	r11,2
	
	loop	24, restore_keyshift	;total of 24*32 words
#if	1	//yyyy
	mov	LocalAddr, r10	
	dmarr	r11	
Lwait3:	bdb	Lwait3
#endif
	
	addi	r10, 32			;32 words each block
	addi	r11, 32
restore_keyshift:
	movi	StartAddrHigh,MEM_SEG	//back to first segment
	
	j	r31


	
SUB_copy_to_middle:
	movi	DcacheBase,MEM_SEG	//direct to first segment
	movi	StartAddrHigh,DataSeg	//dma to second segment
	movi	DMASize,31
	dlw	r11,mid_buf_wr_ptr
	movi	r10,local_FApcm_buf_word 	//output of pcm
	shr	r11,2			//destination in word 
	
	loop	24, copy_to_middle	;total of 3*8*32 words
#if	1	//yyyy
	mov	LocalAddr, r10	
	dmawr	r11	
Lwait4:	bdb	Lwait4
#endif
	
	addi	r10, 32			;32 words each block
	addi	r11, 32
	tsti	r11,MIDDLE_BUF_END_WORD
	blt	Lno_wrap_to
	subi	r11,MIDDLE_BUF_SIZE_WORD
Lno_wrap_to:	nop
copy_to_middle:

	shl	r11,2
	dsw	r11,mid_buf_wr_ptr
	movi	StartAddrHigh,MEM_SEG	//back to first segment
	
	j	r31

SUB_copy_from_middle:
	movi	DcacheBase,MEM_SEG	//direct to first segment
	movi	StartAddrHigh,DataSeg	//dma to second segment
	movi	DMASize,31
	dlw	r11,mid_buf_rd_ptr
	movi	r10,0x0			//input of keyshift
	shr	r11,2			//source in word 
	movi	BlockSkip, 2		//6- to 2-channel
	
	loop	8, copy_from_middle	;total of 8*32 words
#if	1	//yyyy
	mov	LocalAddr, r10	
	dmarr	r11	
Lwait5:	bdb	Lwait5
#endif
	
	addi	r10, 32			;32 words each block
	addi	r11, 32*3		//with skip
	tsti	r11,MIDDLE_BUF_END_WORD
	blt	Lno_wrap_from
	subi	r11,MIDDLE_BUF_SIZE_WORD
Lno_wrap_from:	nop
copy_from_middle:

	movi	BlockSkip, 0
	shl	r11,2	
	dsw	r11,mid_buf_rd_ptr
	movi	StartAddrHigh,MEM_SEG	//back to first segment
	
	j	r31
#endif	//EFFECT

⌨️ 快捷键说明

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