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

📄 mpg.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 S
📖 第 1 页 / 共 3 页
字号:
	dlw	r5,Debug_Dump_Ptr
	dlw	r6,Stream_Rd_Ptr
	dlw	r7,Stream_Wr_Ptr
	movi	DcacheBase,0x12
	movw	r0,LWbytecount
	nop
	dswr	r0,r5			// LWbytecount
	addi	r5,4
	li	r0,0x11111111
	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	r1,0x130000
	tst	r5,r1
	bne	update_r3k_fast_play
	li	r5,0x120000
update_r3k_fast_play:
	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
#endif	//	DUMP_PAGE12
//xxxxxxxxxxxxxx end
        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
	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_MPEG_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
//xxxxxxxxxxxxxx
#ifdef	DUMP_PAGE12
	dlw	r6,Stream_Rd_Ptr
	dlw	r7,Stream_Wr_Ptr
	dlw	r5,Debug_Dump_Ptr
	li	r0,0x22222222
	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	r1,0x130000
	tst	r5,r1
	bne	update_r3k_normal_play
	li	r5,0x120000
update_r3k_normal_play:
	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       enable_STC

enable_STC:
	movi	r0,0
	movw	LWFrameCount,r0
	movh    LIMpegAttr, r3
        movi    r0, CMD_STOP
	movh	r3, LIMpegAttr
        andi    r2, r3, 0x100
        tsti    r2, 0x100
        beq     ExecCmd
        movi    r0, CMD_PLAY
        j       ExecCmd
/*--------------------------------------------*/
LVer:
	movi	r1,ROM_VER
	dsw	r1,STATUS0
	j	LClearCmd
LEndOfData:
	movi	r1,0x1
	dsw	r1,EOD_flag
	j	LClearCmd
LConfig:
	dlw	r1,USER_OCFG
	nop
	movh	LIocfg,r1
	j	LClearCmd	

#ifdef CPY_PRT
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
	jsr	r26,SUB_Title_Key		// beware it's r26
rtn_Title_Key:
#ifndef	LS240
	movi	TrapReg,1<<2
#endif
	j	LClearCmd
#endif

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

//--------------------------------------------------
SUB_swap_byte:
	dlw	r11,Stream_Wr_Ptr
	dlw	r10,SWAP_PTR
	nop
	andi	r11, 0xffff
	tst	r11,r10
	bgte	Lcheck_swap
	addi	r11,IBUF_SIZE		// always assume wr ahead of rd
Lcheck_swap:
	sub	r11,r10

	tsti	r11,32*4
	blte	Lno_swap

	movi	DMASize, 31		;32 words each block
	movi	BlockSkip, 0	
	movi	BlockSize, 0		;block size = 1.
	mupi	r13, 0x00ff	; mask
	movi	AGRSiz0, 0xffff
	
	shr	r11, 7		; # of 32-word blocks
	shr	r10, 2		; to word addr
.if	1
        CLR_TrapReg
	loop	r11, Lswap_block

	tsti	r10, IBUF_END_OVER_4	//IBUF_END/4
	blt	Lblock_ok
	subi	r10, IBUF_SIZE_OVER_4	//IBUF_SIZE/4 	
Lblock_ok:	
	movi	LocalAddr, Lswap_scratch_word
	dmarr	r10	

Ldma_1:	bdb	Ldma_1

	movi	AGRAdr0, Lswap_scratch_byte

	loop	32, Lswap_loop
	mov	r15, a0(0*4)
	shl	r16, r15, 24	; 0
	shl	r17, r15, 8
	and	r17, r13	; 1
	shr	r18, r15, 8
	andi	r18, 0xff00	; 2
	shr	r19, r15, 24	; 3
	or	r19, r16
	or	r19, r17
	or	a0(1*4), r19, r18
Lswap_loop:

	movi	LocalAddr, Lswap_scratch_word
	dmawr	r10	

Ldma_2:	bdb	Ldma_2
	
	addi	r10, 32		; to next block

Lswap_block:
        SET_TrapReg
.endif
	shl	r10, 2		; back to byte addr
	dsw	r10, SWAP_PTR
	
Lno_swap:
	nop
	nop
	j	r31
///////////////////////////////////////////////////////
/////	SUB_clear_PCM
SUB_clear_PCM:
        CLR_TrapReg_1
	movi	r0,0			// flush PCM FIFO
#ifdef	EFFECT
	movi	DcacheBase,DataSeg
	movi	r2,MIDDLE_BUF
	loop	24,LclearEFFECT
	loop	128,LclearEFFECT
	dswr	r0,r2
	addi	r2,4
LclearEFFECT:
#endif	//EFFECT
////////Corin   ////////////////////////////////////////
//////// Test PCM read pointer /////////////////////////
///// Caution: r1 is reversed here can't use r1 here.
///// Or will hang the system !!!
LclearPCMcheck0:
	rlwi	r0, PCM_Rd_Ptr	; read current pointer register (28c)
	andi	r0,0xffff
	tsti	r0,PCM_FIFO_1_START
	movi	r0,0
	movi	r2,PCM_FIFO_0_START
	blte	LclearPCMcheck0
	loop	32,LclearPCM_FIFO_0		
	loop	48,LclearPCM_FIFO_0
	dswr	r0,r2
	addi	r2,4
LclearPCM_FIFO_0:
	nop
LclearPCMcheck1:
	rlwi	r0, PCM_Rd_Ptr	; read current pointer register (28c)
	andi	r0,0xffff
	tsti	r0,PCM_FIFO_1_START
	movi	r0,0
	movi	r2,PCM_FIFO_1_START
	bgte	LclearPCMcheck1
	loop	32,LclearPCM_FIFO_1		
	loop	48,LclearPCM_FIFO_1
	dswr	r0,r2
	addi	r2,4
LclearPCM_FIFO_1:
////////Corin   ////////////////////////////////////////
////////Corin   ////////////////////////////////////////
LclearPCM_local_Start:
	movi	AGRAdr2, local_pcm_sample_byte
	movi	AGRSiz2,0xffff
//LclearPCM:
#ifdef	EFFECT
	movi	DcacheBase,MEM_SEG
#endif	//EFFECT	
	nop
	nop
        loop    SBLIMIT, LclearPCM_local        // clear 3*32 words
        mov     a2(1*4), r0
        mov     a2(1*4), r0
        mov     a2(1*4), r0
LclearPCM_local:
        SET_TrapReg
	j	r31
////// End of SUB_clear_PCM ///////////////////////////
///////////////////////////////////////////////////////

SUB_clear_IBUF:
        movi    r0,0                    // flush IBUF
        movi    r2,IBUF_START
        CLR_TrapReg
        loop    32,LclearIBUF
        loop    128,LclearIBUF
	dswr	r0,r2
	addi	r2,4
LclearIBUF:
        SET_TrapReg
	j	r31

#ifdef	EFFECT
	
SUB_save_mpeg_context:			//0x0-0x1000 and 0x1c80-0x1f80
	movi	StartAddrHigh,DataSeg	//to second segment
	movi	DMASize,31
	movi	r10,0x0
	movi	r11,mpeg_context>>2
	
	loop	32, save_mpeg		;total of 32*32 words
	mov	LocalAddr, r10	
	dmawr	r11	
Lwait0:	bdb	Lwait0	
	
	addi	r10, 32			;32 words each block
	addi	r11, 32
save_mpeg:

	movi	r10,local_scale_index_word	
	movi	r11,(mpeg_context>>2+local_scale_index_word)	
	
	loop	6, save_mpeg2		;total of 6*32 words
	mov	LocalAddr, r10	
	dmawr	r11	
Lwait0a:	bdb	Lwait0a	
	
	addi	r10, 32			;32 words each block
	addi	r11, 32
save_mpeg2:
	
	movi	StartAddrHigh,MEM_SEG	//back to first segment
	
	j	r31
	
SUB_restore_mpeg_context:		//0x0-0x1000
	movi	StartAddrHigh,DataSeg	//to second segment
	movi	DMASize,31
	movi	r10,0x0
	movi	r11,mpeg_context>>2
	
	loop	32, restore_mpeg	;total of 32*32 words
	mov	LocalAddr, r10	
	dmarr	r11	
Lwait1:	bdb	Lwait1	
	
	addi	r10, 32			;32 words each block
	addi	r11, 32
restore_mpeg:

	movi	r10,local_scale_index_word	
	movi	r11,(mpeg_context>>2+local_scale_index_word)	
	
	loop	6, restore_mpeg2		;total of 6*32 words
	mov	LocalAddr, r10	
	dmarr	r11	
Lwait1a:	bdb	Lwait1a	
	
	addi	r10, 32			;32 words each block
	addi	r11, 32
restore_mpeg2:
	
	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
	mov	LocalAddr, r10	
	dmawr	r11	
Lwait2:	bdb	Lwait2	
	
	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
	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
	
	j	r31

SUB_restore_keyshift_context:		//0x400-0x1000
	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
	mov	LocalAddr, r10	
	dmarr	r11	
Lwait3:	bdb	Lwait3	
	
	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_pcm_sample_word	//output of mpeg
	shr	r11,2			//destination in word 
	
	loop	3, copy_to_middle	;total of 3*32 words
	mov	LocalAddr, r10	
	dmawr	r11	
Lwait4:	bdb	Lwait4	
	
	addi	r10, 32			;32 words each block
	addi	r11, 32
	tsti	r11,MIDDLE_BUF_END_WORD
	blt	Lno_wrap_to
	movi	r11,MIDDLE_BUF_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 
	
	loop	8, copy_from_middle	;total of 8*32 words
	mov	LocalAddr, r10	
	dmarr	r11	
Lwait5:	bdb	Lwait5	
	
	addi	r10, 32			;32 words each block
	addi	r11, 32
	tsti	r11,MIDDLE_BUF_END_WORD
	blt	Lno_wrap_from
	movi	r11,MIDDLE_BUF_WORD
Lno_wrap_from:	nop
copy_from_middle:

	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 + -