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

📄 qt_snc.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 S
字号:
;;;
;;; Test external interrupts
;;;
	.nolist
#include "regdef.h"
#include "user.h"
#include "sync.h"

	.globl	SUB_check_PTS
	.globl	SUB_consume_data
	.extern	Debug_Dump_Ptr		// xxxxxxxxx

	.list
	.text
	.set	noreorder

/***************************************************************************************
 This routine updates STC with audio PTS and consumes one PTS, if
   1. PTS fifo is not empty;
   2. (internal bytecount) >= (A_PTS bytecount).
***************************************************************************************/
SUB_check_PTS:
	movw	r23,LWbytecount	
#ifdef	WS_DEBUG
//	dlw	r21,PTS_FIFO_Rd_Ptr	// point to PTS
//	dlw	r20,PTS_FIFO_Wr_Ptr
	LdPTSRdPtr	r21
	LdPTSWrPtr	r20
	rlwi	r2,STC			// xxxxxx debug
//	dsw	r23,0xff40		// internal bytecount
//	dsw	r2,0xff44		// STC
	tst	r20,r21
	beq	Lcheck_PTS_done		// branch if PTS fifo empty
update_data_to_r3k:
	dlwr	r0,r21			// load A_PTS
	addi	r1,r21,4
	dlwr	r4,r1			// load A_PTS bytecount
	dsw	r23,0xff40		// internal bytecount
	dsw	r2,0xff44		// STC
	dsw	r0,0xff48		// A_PTS
	shl	r0,1
	dsw	r0,0xff58		// A_PTS
	dsw	r4,0xff4c		// A_PTS bytecount
//xxxxxxxxxxxxxx
#ifdef	DUMP_PAGE12
	dlw	r5,Debug_Dump_Ptr
	nop
	movi	DcacheBase,0x12
	nop
	nop
	dswr	r23,r5			// LWbytecount
	addi	r5,4
	dswr	r2,r5			// STC
	addi	r5,4
	dswr	r0,r5			// A_PTS
	addi	r5,4
	dswr	r4,r5			// A_PTSbytecount
	addi	r5,4
	li	r1,0x130000
	tst	r5,r1
	bne	update_r3k_done_1
	li	r5,0x120000
update_r3k_done_1:
	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
#endif	// WS_DEBUG

LPTS1:
	addi	r24,r21,4		// point to byte count

	tst	r20,r21
	beq	Lcheck_PTS_done		// branch if PTS fifo empty

	dlwr	r22,r24			// get byte count
	dlwr	r2,r21			// get PTS


	tst	r23,r22
	blt	Lcheck_PTS_done		// branch if 
					// (internal bytecount) < (A_PTS bytecount)
	shl	r2,1			// PTS passed is bit 32..1

#if	LS388
	movh    r0,LIMpegAttr
	andi	r0,0x00b0		//STEP or FF/FB or fast/slow play mode
	tsti	r0,0
	bne	update_STC_done		// not update STC in trick modes
#if	1	//yyyy
	rswi	r2,STC			// load STC only in normal mode
#endif
update_STC_done:

#else	// LS388
	rswi	r2,AUDIO_PTS		// load audio PTS
#endif	// LS388

Lno_update:
	mupi	r0,MEM_SEG
	addi	r0,PTS_FIFO_END
	addi	r21,8			// two element per entry
	tst	r21,r0
	blt	Lupdate_rd_ptr
	mupi	r21,MEM_SEG
	addi	r21,PTS_FIFO_START	// wrap around
Lupdate_rd_ptr:
//	dsw	r21,PTS_FIFO_Rd_Ptr	// update read pointer
	SvPTSRdPtr	r21

	LdPTSWrPtr	r20
	j	LPTS1			// keep consuming A_PTS and its bytecount until
					//  either PTS fifo empty or
					//  (internal bytecount) < (A_PTS bytecount)

Lcheck_PTS_done:

	j	r28

/***************************************************************************************
 This routine consumes data in trick modes.
 Consume one audio frame and update internal bytecount.
 Consume one PTS, if PTS fifo is not empty and (internal bytecount) > (A_PTS bytecount).
 There must be at least one audio frame in IBUF when enter this routine.
***************************************************************************************/
SUB_consume_data:
	movw    r3,LWbytecount
#ifdef	WS_DEBUG
//	dlw	r6,PTS_FIFO_Wr_Ptr
//	dlw	r7,PTS_FIFO_Rd_Ptr
	LdPTSWrPtr	r6
	LdPTSRdPtr	r7
	rlwi	r2,STC
	tst	r6,r7
#if 0
	beq	update_r3k_done
#else	// 1
	bne	update_r3k
	li	r2,0xdeadbeef
	dsw	r3,0xff40		// LWbytecount
	dsw	r2,0xff44		// STC - update STC even PTS fifo empty
//	dsw	r2,0xff48		// A_PTS
//	j	update_r3k_done
	j	check_video_fifo_empty	// check video fifo if PTS fifo empty
#endif	// 1
update_r3k:
	dlwr	r0,r7
	addi	r1,r7,4
	dlwr	r4,r1
	dsw	r3,0xff40		// LWbytecount
	dsw	r2,0xff44		// STC
	dsw	r0,0xff48		// A_PTS
	shl	r0,1
	dsw	r0,0xff58		// A_PTS
	dsw	r4,0xff4c		// A_PTSbytecount
//xxxxxxxxxxxxxx
#ifdef	DUMP_PAGE12
	dlw	r5,Debug_Dump_Ptr
	nop
	movi	DcacheBase,0x12
	nop
	nop
	dswr	r3,r5			// LWbytecount
	addi	r5,4
	dswr	r2,r5			// STC
	addi	r5,4
	dswr	r0,r5			// A_PTS
	addi	r5,4
	dswr	r4,r5			// A_PTSbytecount
	addi	r5,4
	li	r1,0x130000
	tst	r5,r1
	bne	update_r3k_done_2
	li	r5,0x120000
update_r3k_done_2:
	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
update_r3k_done:
#endif	// WS_DEBUG
//	dlw	r1,PTS_FIFO_Rd_Ptr	// point to PTS
//	dlw	r0,PTS_FIFO_Wr_Ptr
	addi	r4,r7,4			// point to byte count
	dlwr	r2,r4			// get byte count
	dlwr	r5,r7			// get A_PTS
	rlwi	r4,STC			// get STC
	shl	r5,1
	tst	r4,r5
	movh	r4,LIfrmsize
//	blt	end_consume_data	// branch if STC < A_PTS
	blt	check_video_fifo_empty
	add	r3,r4			// consume one frame, bytecount
	movw    LWbytecount,r3
	tst	r3,r2
	blt	update_pts_rd_ptr_done	// branch if bytecount < A_PTSbytecount
	tst	r6,r7
	beq	update_pts_rd_ptr_done	// branch if PTS fifo empty
	addi	r7,8
	andi	r0,r7,0xffff
	tsti	r0,PTS_FIFO_END
	blt	update_pts_rd_ptr
	subi	r0,PTS_FIFO_SIZE
update_pts_rd_ptr:
	mupi	r1,MEM_SEG
	or	r1,r0
//	dsw	r1,PTS_FIFO_Rd_Ptr
	SvPTSRdPtr	r1
consume_one_more_PTS:
	tst	r1,r6
	beq	update_pts_rd_ptr_done	// branch if PTS fifo empty
	addi	r1,4			// point to next A_PTSbytecount
	dlwr	r5,r1			// next A_PTSbytecount
	nop
	tst	r3,r5
	blt	update_pts_rd_ptr_done	// branch if (bytecount < A_PTSbytecount)
	addi	r1,4			// point to 2nd next PTS
	andi	r1,0xffff
	tsti	r1,PTS_FIFO_END
	blt	save_one_more_PTS
	subi	r1,PTS_FIFO_SIZE
save_one_more_PTS:
	mupi	r0,MEM_SEG
	or	r1,r0
	SvPTSRdPtr	r1
	j	consume_one_more_PTS	// until (bytecount < A_PTSbytecount) or PTS fifo empty
update_pts_rd_ptr_done:
//	movh	r4,LIfrmsize
	movw	r5,LWibufRdPtr	
	andi	r5,0xffff
	add	r5,r4			// consume one frame, ibuf_rd_ptr
	tsti	r5,IBUF_END
	blt	5f
	subi	r5,IBUF_SIZE
5:
	mupi	r0,MEM_SEG		// prefix w/ segment number
	or	r5,r0
	movw	LWibufRdPtr,r5		// update read pointer
//	dsw	r5,Stream_Rd_Ptr
	SvStrRdPtr	r5
//	dsw	r5,OLD_Stream_Rd_Ptr
	movh	LIold_rd_ptr,r5
//xxxxxxxxxxxxxx
#ifdef	DUMP_PAGE12
//	dlw	r6,Stream_Wr_Ptr
	LdStrWrPtr	r6
	mov	r7,r5
	movw	r0,LWbytecount
	dlw	r5,Debug_Dump_Ptr
	nop
	movi	DcacheBase,0x12
	nop
	li	r3,0xffffff03
	dswr	r0,r5			// LWbytecount
	addi	r5,4
	dswr	r3,r5			// signature
	addi	r5,4
	dswr	r7,r5			// Stream_Rd_Ptr
	addi	r5,4
	dswr	r6,r5			// Stream_Wr_Ptr
	addi	r5,4
	li	r1,0x130000
	tst	r5,r1
	bne	consume_data_dump
	li	r5,0x120000
consume_data_dump:
	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
end_consume_data:
	movi	r0,128
1:
	nop
	loop	16,delay_loop1
	nop
	nop
	nop
	nop
delay_loop1:
	subi	r0,1
	tsti	r0,0
	bne	1b
	j	r31

check_video_fifo_empty:
	rlwi	r4,MPEG_VID_FIFO_CUR_BYTE
	tsti	r4,0
	bne	end_consume_data
	movh	r4,LIfrmsize
	add	r3,r4			// consume one frame, bytecount
	movw    LWbytecount,r3
	j	update_pts_rd_ptr_done

⌨️ 快捷键说明

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