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

📄 mpg.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 S
📖 第 1 页 / 共 3 页
字号:
	tsti	r0,0
	bne	clear_PCM_once
	dsw	r1,clr_buffer_flag
	jsr     r31,SUB_clear_PCM
clear_PCM_once:
//	jsr     r27,SUB_clr_all_downmix
	jsr	r31,SUB_consume_data	//update bytecount w/o decoding
//	j	rtn_decoder
	j	LoopStart
#endif	// 1
Lnormal_decode:	
	movi	r0,0
	dsw	r0,clr_buffer_flag

#ifdef	EFFECT
	dlw	r0,mid_buf_rd_ptr
	dlw	r1,mid_buf_wr_ptr
	nop
	sub	r2,r0,r1		//gap from wr_ptr to rd_ptr
	tsti	r2,0
	bgt	Lno_mid_wrap
	addi	r2,MIDDLE_BUF_SIZE
Lno_mid_wrap:
	dsw	r2,0xf100	//debug
	tsti	r2,3*SBLIMIT*4		//samples produced in each block
	blte	Lno_decoding

	dlw	r3,ok_decode_flag
	nop
	tsti	r3,3
	bgte	Lno_inc
	addi	r3,1
	dsw	r3,ok_decode_flag
Lno_inc:
#endif	//EFFECT

//debug
#ifdef	DEBUGGER
	dlw	r2,0xf140
	nop
	addi	r2,1
	dsw	r2,0xf140
	dlw	r3,DEBUG_BUF_PTR
	nop
	dswr	r1,r3	//wr
	addi	r3,4
	nop
	dswr	r0,r3	//rd
	addi	r3,4
	rlwi	r1, PCM_Rd_Ptr
//	movw	r1,LWentry	
	dswr	r1,r3	//pcm_ptr
	addi	r3,4
//	dlw	r1,Stream_Rd_Ptr
	movb	r1,LBblknum
	nop
	dswr	r1,r3	//stream_rd_ptr
	addi	r3,4
	tsti	r3,DEBUG_BUF_END
	blt	Lno_db_wrap
	movi	r3,DEBUG_BUF
Lno_db_wrap:	
	dsw	r3,DEBUG_BUF_PTR
#endif	// DEBUGGER
	
	// call decoder
        mupi    r0,MEM_SEG
	la	r31,rtn_decoder
	or	r31,r0
	movw	r1,LWentry		// set up subroutine entry
	or	r1,r0
	j	r1
rtn_decoder:

#ifdef	EFFECT
	jsr	r31,SUB_copy_to_middle	//this will advance wr_ptr
	
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		//samples needed for key shift
	blte	Lno_key_shift
	tsti	r3,3
	blt	Lno_key_shift
	
        movb    r2,LBPCM_flag
	tsti	r2,1			// test bit 0
	bne	LCheckPCM		// skip key shift if PCM not ready

	
//debug
	
#ifdef	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_mpeg_context	//0x0-0x1000
	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
	j	r1	
rtn_Effect:
//	jsr	r31,SUB_Audio_Effect
	
	jsr	r31,SUB_save_keyshift_context	//0x0-0x1000
	jsr	r31,SUB_restore_mpeg_context	//0x0-0x1000
	
	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
	
        mupi    r0,MEM_SEG

	la      r31,rtn_PCM
        or      r31,r0
//	movw	r1,LWPCMentry
//	or	r1,r0
//	j	r1
	jsr	r31,SUB_pcm_pcm

	
rtn_PCM:
	movi	r0,0
	movb	LBPCMlow,r0		// PCM got data in buffer
	
	movh	r0,LIstatus
	andi	r1,r0,ERROR_MASK
	tsti	r1,0
	bne	Lclear_status
	ori	r0,FIRST_PCM_OUT
	movh	LIstatus,r0
	
	j	LoopStart
Lclear_status:
	andi	r0, RESET_ERROR
	movh	LIstatus,r0
	movi	r1,0
	movi	AGRSiz0,0xffff
	movi	AGRMod0,0
#ifdef	I2S
	movi	AGRAdr0,local_scaled_pcm_byte
#else
	movi	AGRAdr0,local_pcm_sample_byte
#endif
        CLR_TrapReg
#ifdef	I2S
	loop	6, clr_outer_1
#else
	loop	3, clr_outer_1
#endif
        loop    32, clr_inner_1   // 3*32*2 words
	mov	a0(1*4),r1
clr_inner_1:
clr_outer_1:	
        SET_TrapReg

	j	LoopStart
		
Lend_user:
#ifdef	STREAM_SIM
	halt 	pass
#else
	j	LoopStart
#endif

ExecCmd:
#ifdef CMD_BUF
        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
#endif
	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_MPEG1
        beq     LMPEG
        tsti    r0,CMD_MPEG2
        beq     LMPEG
        tsti    r0,CMD_AC3
        beq     LMPEG
        j       LClearCmd
LMPEG:
        jsr     r31,SUB_clear_PCM
#if SR48
        dsw     r0,PCM_store_ptr
        dsw     r0,PCM_blk_cnt
#ifdef I2S
        movi    r0,local_scaled_pcm_byte
#else  // I2S
        movi    r0,local_pcm_sample_byte
#endif // I2S
        dsw     r0,PCM_load_ptr
	dsw	r0,EOD_flag
        movi    r0,5
        dsw     r0,PCM_bcnt
        movi    r0,8
        dsw     r0,PCM_scnt
        movi    r0,3
        dsw     r0,PCM_gcnt
#endif // SR48

	mupi	r0,MEM_SEG		// init input buffer write pointer
#ifdef QT_SYNC
	addi	r2,r0,PTS_FIFO_START
	dsw	r2,PTS_FIFO_Start
	dsw	r2,PTS_FIFO_Rd_Ptr
	dsw	r2,PTS_FIFO_Wr_Ptr
	addi	r2,r0,PTS_FIFO_END
	dsw	r2,PTS_FIFO_End
#endif // QT_SYNC
        addi	r2,r0,IBUF_END
	dsw	r2,Stream_End
	addi	r0,IBUF_START
	dsw	r0,Stream_Start
	movw	LWibufRdPtr,r0
	dsw	r0,Stream_Wr_Ptr
	dsw	r0,Stream_Rd_Ptr
//	dsw	r0,OLD_Stream_Rd_Ptr
	movh	LIold_rd_ptr,r0
	movi	r0,IBUF_START
	dsw	r0,SWAP_PTR
#ifdef	EFFECT
	movi	r0,MIDDLE_BUF
	dsw	r0,mid_buf_rd_ptr
	dsw	r0,mid_buf_wr_ptr
	movi	r0,SUB_Audio_Effect
	dsw	r0,Audio_Effect_Entry

#ifdef	DEBUGGER
	movi	r0,DEBUG_BUF
	dsw	r0,DEBUG_BUF_PTR
#endif	// DEBUGGER
	movi	r0,0
	dsw	r0,0xf140
	movw	LWFrameCount,r0
#endif	//EFFECT
#ifdef QT_SYNC
	movi	r0,0
        movh    LIMpegAttr,r0           // init for QT_SYNC 
	movw	LWbytecount,r0
        movw    LWhungrySTC,r0
#endif // QT_SYNC

//        jsr     r31,SUB_clear_PCM

        mupi    r0,DataSeg
        rswi    r0,PCM_FIFO_StartReg
	ori	r0,PCM_OUT_END
        rswi    r0,PCM_FIFO_EndReg

#ifndef	LS388
#ifndef	R3K_PCM_OUT_CTRL
        rswi    r0,PCM_Out_Ctrl
        rlwi    r0,Audio_CtrlReg
        ori     r0,0x22
        rswi    r0,Audio_CtrlReg
#endif	// R3K_PCM_OUT_CTRL
#endif	//LS388
	
        la      r0,SUB_MPEG_decoder
	movw	LWentry,r0
#ifdef	EFFECT
	la	r0,SUB_pcm_pcm
#else	//EFFECT
        la      r0,SUB_out_fifo
#endif	//EFFECT
        movw    LWPCMentry,r0           // default, ac3 as decoder
	movi	r0,1
	movb	LBPCM_flag,r0
	ori	r1,SET_PROCESS_NEW	// process, new
	
//xxxxxxxxxxxxxx
#ifdef	DUMP_PAGE12
	dlw	r6,Stream_Rd_Ptr
	dlw	r7,Stream_Wr_Ptr
	dlw	r5,Debug_Dump_Ptr
	li	r0,0x33333333
	movi	DcacheBase,0x12
	nop
	movw	r3,LWbytecount
	dswr	r3,r5			// LWbytecount
	addi	r5,4
	dswr	r0,r5			// signature
	addi	r5,4
	dswr	r6,r5			// Stream_Rd_Ptr
	addi	r5,4
	dswr	r7,r5			// Stream_Wr_Ptr
	addi	r5,4
	li	r2,0x130000
	tst	r5,r2
	bne	update_r3k_mpeg
	li	r5,0x120000
update_r3k_mpeg:
	li	r0,0xdeadbeef
	dswr	r0,r5
	addi	r5,4
	dswr	r0,r5
	addi	r5,4
	dswr	r0,r5
	addi	r5,4
	dswr	r0,r5
	subi	r5,0xc
	movi	DcacheBase,MEM_SEG
	nop
	nop
	dsw	r5,Debug_Dump_Ptr
	movi	r3,0
#endif	//	DUMP_PAGE12
//xxxxxxxxxxxxxx end
	j	LStoreStatus	
LPlay:

        movi    r0,0
	dsw	r0,EOD_flag

	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:
	movi	r2,0xffff		//so that FIFO and clocks are reset
	dsw     r2,SAMPLING_FREQ_TEMP
	
	movi	r0,0
	dsw	r0,ok_decode_flag	//not  allow to decode

	andi	r1,RESET_RESUME
        ori     r1,SET_RUN
	j	LStoreStatus

LStopb:
#if	1	//	LS388
	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
 	dsw	r0,Audio_Effect_Entry
	la	r3,SUB_pcm_pcm
#else	//EFFECT
        la      r3,SUB_out_fifo
#endif	//EFFECT
#endif	// 1

	movi	r0,0
	movw	LWbytecount,r0
	ori	r1,SET_PROCESS_NEW	// process, new
	
LStopf:
	jsr     r31,SUB_clear_PCM
	movi    r0,1            // xxxx
	movb    LBPCM_flag,r0   // xxxx
	andi	r1,RESET_STOP		// need to flush PCM buffer
	j       LStoreStatus

LStop:
	ori	r1,SET_PAUSE
	andi	r1,RESET_STOP

LStoreStatus:
        jsr     r31,SUB_clear_PCM
	movh	LIstatus, r1
LClearCmd:
        movi    r0,0x100
	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_EOD
	beq	LEndOfData

#ifdef CPY_PRT
	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

/*-------- commands for trick modes ----------*/
        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
/*--------------------------------------------*/
	j	LClearCmd

LStat:
	dsw	r1,STATUS0	
	j	LClearCmd
Lgain:	
	dlw	r1,PCM_SCALE
	nop
        movw    LWpcmscale,r1
	j	LClearCmd
LMute:
	ori	r1,SET_MUTE
	j	LStoreStatus	
LUnmute:
	andi	r1,RESET_UNMUTE
        j       LStoreStatus

/*-------- commands for trick modes ----------*/
LSlowPlay:
        ori     r3, 0x0010
        j       enable_STC
LFastPlay:
        ori     r3, 0x0010
//xxxxxxxxxxxxxx
#ifdef	DUMP_PAGE12

⌨️ 快捷键说明

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