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

📄 pcm.s

📁 关于DVD上的PCM的解码的代码,PCM的DSP压缩,解调的算法,用RISC32指令来写.
💻 S
📖 第 1 页 / 共 3 页
字号:
rtn_decoder:
	
#ifdef	REAL_TIME

	rlwi	r0,STC
	dsw	r0,END_DECODE_TIME
	dlw	r1,START_DECODE_TIME
	dlw	r2,MAX_DURATION
	sub	r0,r1
	maxs	r3,r0,r2
	dsw	r3,MAX_DURATION
	dlw	r1,DEBUG_BUF_PTR
	nop
	dswr	r0,r1
	addi	r1,4
	tsti	r1,DEBUG_BUF_END
	blt	Lok
	movi	r1,DEBUG_BUF
Lok:	
	dsw	r1,DEBUG_BUF_PTR
#endif		

#ifdef	EFFECT	
	jsr	r31,SUB_copy_to_middle	//this will advance wr_ptr
#if 0	//yyy
	dlw	r0,mid_buf_wr_ptr
	nop
	addi	r0,3072
	tsti	r0,MIDDLE_BUF_END_WORD
	blt	1f
	subi	r0,MIDDLE_BUF_SIZE_WORD
1:	dsw	r0,mid_buf_wr_ptr
#endif	//yyy	
Lno_decoding:
	nop
	
	dlw	r0,mid_buf_wr_ptr
	dlw	r1,mid_buf_rd_ptr
	dlw	r3,ok_decode_flag
	sub	r2,r0,r1		//gap from rd_ptr to wr_ptr
	tsti	r2,0
	bgt	Lno_mid_wrap2
	addi	r2,MIDDLE_BUF_SIZE
Lno_mid_wrap2:
	tsti	r2,256*4*3		//samples needed for key shift
	blte	Lno_key_shift
	tsti	r3,2	//3
	blt	Lno_key_shift
	
        movb    r2,LBPCM_flag
	tsti	r2,1			// test bit 0
	bne	LCheckPCM		// skip key shift if PCM not ready

	
#if	DEBUGGER	
	mupi	r2,0x1000
	dlw	r3,DEBUG_BUF_PTR
	nop
	or	r0,r2
	dswr	r0,r3	//wr
	addi	r3,4
	nop
	or	r1,r2
	dswr	r1,r3	//rd
	addi	r3,4
	rlwi	r1, PCM_Rd_Ptr
	dswr	r1,r3	//ptr
	addi	r3,4
	nop
	dswr	r1,r3
	addi	r3,4
	tsti	r3,DEBUG_BUF_END
	blt	Lno_db_wrap2
	movi	r3,DEBUG_BUF
Lno_db_wrap2:	
	dsw	r3,DEBUG_BUF_PTR
#endif	//DEBUGGER
	
	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
	dlw	r1,COMMAND1
	mupi    r0,MEM_SEG
	tsti	r1,0
	beq	chk_new_command1_done
	dsw	r1,EFFECT_COMMAND
chk_new_command1_done:
	dlw	r1,Audio_Effect_Entry
	la      r31,rtn_Effect
        or      r31,r0
	or	r1,r0
#if	1	//yyyy
	j	r1
#endif

rtn_Effect:
	
	jsr	r31,SUB_save_keyshift_context	//0x0-0x1000
	jsr	r31,SUB_restore_pcm_context	//0x0-0x2000
	
	movi	DcacheBase,MEM_SEG	//back to mpeg segment
	
Lno_key_shift:	
	movi	r1,0			// clear flag, signal there will be
	movb	LBPCM_flag,r1		// a valid PCM block
	
//Lno_key_shift:
	movi	DcacheBase,MEM_SEG	//back to mpeg segment
	movi	StartAddrHigh,MEM_SEG
	j       rtn_PCM
	
#else	//EFFECT
	// need to add error handler routine here
        j       rtn_PCM
#endif	//EFFECT
		
LCheckPCM:
	// Make sure PCM sub will not rely on any parameter passed from
	// register
	
#ifndef	EFFECT
	movi	r1,0			// clear flag, signal there will be
	movb	LBPCM_flag,r1		// a valid PCM block
#endif	//EFFECT

	movi	r0,MEM_SEG
	andi	r0,0x3
	shl	r0,16
	la	r27,rtn_PCM
	or	r27,r0
	movw	r1,LWPCMentry
	or	r1,r0
	j	r1
rtn_PCM:
	movi	r0,0
	movb	LBPCMlow,r0		// PCM got data in buffer
Lend_user:
	
#ifdef	REAL_TIME
	movb	r1,LBPCM_flag
	tsti	r1,1			// test bit 0
	bne	Lready   		// not ready yet
	rlwi	r0,STC
	dlw	r1,START_DECODE_TIME
	nop
	sub	r0,r1
	dsw	r0,BLOCK_PERIOD
Lready:	
#endif
	j	LoopStart

ExecCmd:
#define CMD_BUF_ADR             0xffc0
	dlw     r1,CMD_BUF_ADR
        dlw     r2,CMD_BUF_ADR+0x4
        dlw     r3,CMD_BUF_ADR+0x8
        dlw     r4,CMD_BUF_ADR+0xc

        shl     r1,8
        shr     r5,r2,24
        or      r1,r5

        shl     r2,8
        shr     r5,r3,24
        or      r2,r5

        shl     r3,8
        shr     r5,r4,24
        or      r3,r5

        shl     r4,8
        or      r4,r0

        dsw     r1,CMD_BUF_ADR
        dsw     r2,CMD_BUF_ADR+0x4
        dsw     r3,CMD_BUF_ADR+0x8
        dsw     r4,CMD_BUF_ADR+0xc


	movh	r1,LIstatus
	tsti	r0,CMD_STOP
	bgt	LCommand2
	tsti	r0,CMD_PLAY
	beq	LPlay
	tsti	r0,CMD_STOPF
	beq	LStopf
	tsti	r0,CMD_STOP
	beq	LStop
	tsti	r0,CMD_PCM
	beq	LPCM
	j	LClearCmd

LPCM:
#ifdef	I2S
	mupi	r2, 0x0030	//GPIO  4 and 5 enable
	ori	r2, 0x2000	//48 kHz MicroClock. need to test I2S later
	mupi	r0, 0xffcf
	ori	r0, 0xcfff	// mask
#endif
	rlwi	r3, GPIO_CTRL_REG
	and	r3, r0
	or	r3, r2
#if	!LS388
	rswi	r3, GPIO_CTRL_REG
#endif	// LS388
//	mupi	r0, 0x0008
//	ori	r0, 0x0040	//48k,16bit
//	ori	r0, 0x0058	//96k,24bit
//	ori	r0, 0x0048	//48k,24bit
//	dsw	r0, USER_OCFG		//debug. should be set by host

	
#ifdef	I2S
	movi	r0, 0x3cfb		; enable 6-channel PCM output
#else
#if	LS388
#ifdef	EXTERNAL_A_CLOCK
	li	r3,0x30000
	rlwi	r0,PCM_Out_Ctrl
	and	r0,r3
	movi	r3,0x7449	// reverse PCM clock, 24-bit clock, 6-channel
	or	r0,r3
#else	// EXTERNAL_A_CLOCK
	li	r0,0x17449	// reverse PCM clock, 24-bit clock, 6-channel
#endif	// EXTERNAL_A_CLOCK
#else	// LS388
	movi	r0, 0x3c21		; enable 6-channel PCM output
#endif	// LS388
#endif
	dsw	r0, PCM_Config_Word
#ifndef	R3K_PCM_OUT_CTRL
	rswi	r0,PCM_Out_Ctrl
#endif	// R3K_PCM_OUT_CTRL
	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
#if 1
	movh	LIold_rd_ptr,r2
#else
	andi	r0,r2,0xffff
	movh	r3,LIold_rd_ptr
	tst	r0,r3
	bgte	1f
	addi	r0,PCM_IBUF_SIZE
1:	sub	r0,r3
	movh	LIold_rd_ptr,r2
	movw	r3,LWbytecount
	add	r3,r0
	movw	LWbytecount,r3
#endif
	movi	r0,0x800
	movh	LIMpegAttr,r0		// init for qt_snc
	mupi	r0,MEM_SEG
#endif	// LS388
	addi	r2,PCM_IBUF_SIZE	// set up buffer end address
	dsw	r2,Stream_End
	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
//	movb	LBFIFO_flag,r0
	movw	LWbytecount,r0
	movw	LWoldPTS,r0

#ifdef	EFFECT
	movi	r0,MIDDLE_BUF
	dsw	r0,mid_buf_rd_ptr
	dsw	r0,mid_buf_wr_ptr
	movi	r0,SUB_Audio_Effect
//	movi	r0, main_audio_task
	dsw	r0,Audio_Effect_Entry
#if	DEBUGGER
	movi	r0,DEBUG_BUF
	dsw	r0,DEBUG_BUF_PTR
#endif	// DEBUGGER
	movi	r0,0
	dsw	r0,0xf140
#endif	//EFFECT
	
	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	
LPlay:

	dlw	r2,COMMAND1
	andi	r0,r1,PAUSE
	tsti	r2,0
	dlw	r2,EFFECT_COMMAND
	bne	1f			// branch if no new effect command
	dsw	r2,COMMAND1		// restore effect command
1:
	tsti	r0,PAUSE
	bne	1f
	andi	r1,RESET_RESUME
1:
	ori	r1,SET_RUN
	
#ifdef	EFFECT
	movi	r0,0
	dsw	r0,ok_decode_flag	//not  allow to decode
	dsw	r0,MUTE_BLK_CNT
#endif	//EFFECT
	
#if	DEBUGGER
	movi	r0,0
	dsw	r0,START_DECODE_TIME
	dsw	r0,END_DECODE_TIME
	dsw	r0,MAX_DURATION
	rswi	r0,STC			//clear STC
	movi	r0,0x2dd
	rswi	r0,STC_INTERVAL		//STC interval in 90kHz clock
	rlwi	r0,AUDIO_CTRL
	ori	r0,1			//enable STC
#if	!LS388
	rswi	r0,AUDIO_CTRL
#endif	// LS388

	movi	r0,DEBUG_BUF
	dsw	r0,DEBUG_BUF_PTR
#endif	//DEBUGGER

	
	j	LStoreStatus

LStopb:
	movi	r0,0
//	movw	LWoldPTS,r0
	movw	LWbytecount,r0

LStopf:
	dsw	r0, DiskAttrib	// DTS CD Corin
//	movi	r0,1
//	movb	LBPCM_flag,r0
//	movi	r0,0x0
//	movb	LBFIFO_flag,r0
//	dsw	r0,FIFO_BLK_PTR
//	rswi	r0,PCM_Run_Halt
	jsr	r31,SUB_mute_PCM	//TChou
	jsr	r31,SUB_clear_PCM
	movh	r1,LIstatus
	andi	r1,RESET_STOP		// need to flush PCM buffer

	j	LStoreStatus	
LStop:
//	movi	r0,0x0
//	rswi	r0,PCM_Run_Halt
	jsr	r31,SUB_mute_PCM
	jsr	r31,SUB_clear_PCM
	movh	r1,LIstatus
	ori	r1,SET_PAUSE
	andi	r1,RESET_STOP
LStoreStatus:
	movh	LIstatus,r1
LClearCmd:
//	movi	r0,0
	movi	r0, 0x0100
	dsw	r0,COMMAND0
	j	LoopStart	

LCommand2:
	tsti	r0,CMD_STAT
	beq	LStat
	tsti	r0,CMD_STOPB
	beq	LStopb
	tsti	r0,CMD_UNMUTE
	beq	LUnmute
	tsti	r0,CMD_VER
	beq	LVer
	tsti	r0,CMD_GAIN
	beq	Lgain
	tsti	r0,CMD_CONFIG
	beq	LConfig
	tsti	r0,CMD_FRAMES
	beq	LFrames
#if	LS388
	tsti	r0,CMD_CPYP_CLEAR
	beq	LCpyp_clear
	tsti	r0,CMD_CPYP_DEC_AUTH
	beq	LDec_Auth
	tsti	r0,CMD_CPYP_DRV_AUTH
	beq	LDrv_Auth
	tsti	r0,CMD_CPYP_KEY_SHARE
	beq	LKey_Share
	tsti	r0,CMD_CPYP_DISC_KEY
	beq	LDisc_Key
	tsti	r0,CMD_CPYP_TITLE_KEY
	beq	LTitle_Key
	tsti	r0,CMD_CPYP_DRIVER_TYPE
	beq	LDriver_Type
#endif	// LS388

/*-------- commands for trick modes ----------*/
#if	!LS388
	rlwi    r5, DSP_INT_CTRL
        li      r2, DSP_INT_DISABLE
        and     r2, r5
        rswi    r2, DSP_INT_CTRL
#endif	// LS388
        li      r2,  0xfffffe03
        movh	r3, LIMpegAttr
        tsti    r0, CMD_SLOW_PLAY
        beq     LSlowPlay
        tsti    r0, CMD_FAST_PLAY
        beq     LFastPlay
        tsti    r0, CMD_FF_FB_PLAY
        beq     LFFFBPlay
        tsti    r0, CMD_STEP_PLAY
        beq     LStepPlay
        tsti    r0, CMD_NORMAL_PLAY
        beq     LNormalPlay
/*--------------------------------------------*/
LStat:
	movh	r0,LIfrmsize		//yyyy
	dsw	r0,STATUS1
	dsw	r1,STATUS0
	j	LClearCmd	
LUnmute:
	andi	r1,RESET_UNMUTE
	j	LStoreStatus	
LVer:
	movi	r1,ROM_VER
	dsw	r1,STATUS0
	j	LClearCmd
Lgain:
	dlw	r1,PCM_SCALE
	nop
	movw	LWpcmscale,r1
	j	LClearCmd
LConfig:
	dlw	r1,USER_OCFG
	nop
	movh	LIocfg,r1
	j	LClearCmd	
LFrames:
	movw	r1,LWFrameCount
	dsw	r1,STATUS0
	j	LClearCmd

/*-------- commands for trick modes ----------*/

LSlowPlay:
        ori     r3, 0x0010
        j       enable_STC
LFastPlay:
        ori     r3, 0x0010
        j       enable_STC
LFFFBPlay:
        ori     r3, 0x0020
        j       enable_STC
LStepPlay:
        ori     r3, 0x0080
        j       enable_STC
LNormalPlay:
	movh	r3,LIstatus
	ori	r3,SET_PROCESS_NEW	// process, new
	movh	LIstatus,r3
#ifdef	EFFECT
	movi	r0,MIDDLE_BUF
	dsw	r0,mid_buf_rd_ptr
	dsw	r0,mid_buf_wr_ptr
	movi	r0,SUB_Audio_Effect
//	movi	r0, main_audio_task
	dsw	r0,Audio_Effect_Entry
	la	r3,SUB_pcm_pcm
#else	//EFFECT
        la      r3,SUB_out_fifo
#endif	//EFFECT
	movw	LWPCMentry,r3
	la      r3,SUB_PCM_decoder
	movw	LWentry,r3
	movi	r3,1
	movb	LBPCM_flag,r3
	movi	r3,0
	movw	LWhungrySTC,r3
	movb	LBblknum,r3
	movi	r0,0
	dsw	r0,0xf140
 
enable_STC:
	movh    LIMpegAttr, r3
        jsr     r31, SUB_clear_PCM
	jsr	r31, SUB_clear_keyshift_context

#if LS388	//==================================
	dlw	r0, USER_OCFG
	nop
	andi	r11, r0, OCFG_CHANNEL_MASK
	shr	r11, OCFG_CHANNEL_SHIFT		; N-1 for N channels
	
	andi	r2, r0, OCFG_SAMP_FREQ_MASK
	shr	r2, OCFG_SAMP_FREQ_SHIFT	; 0 for 48kHz; 1 for 96kHz

	andi	r3, r0, OCFG_WORD_LEN_MASK
	shr	r3, OCFG_WORD_LEN_SHIFT
	addi	r3, 4		; nibles/sample (16-bit=4, 20-bit=5, 24-bit=6)

	add	r11,r2
	addi	r11,7		; 7=8-1 (256 samples/block, 2 nibles/byte)
	shlv	r0,r3,r11

	movh	LIfrmsize,r0

#else // LS388

	dlw	r10,USER_ICFG
	nop
	andi	r0,r10,ICFG_SPDIF_MASK
	shr	r0,ICFG_SPDIF_SHIFT
	tsti	r0,SPDIF_ENABLED
//	beq	LSpdif		//tchou

	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
#endif // LS388
	

⌨️ 快捷键说明

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