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

📄 qt_snc.s

📁 关于DVD上的PCM的解码的代码,PCM的DSP压缩,解调的算法,用RISC32指令来写.
💻 S
字号:
;;;
;;; Test external interrupts
;;;
	.nolist
#include "regdef.h"
#include "user.h"
#include "sync.h"
#include "stereo_user.h"

	.globl	SUB_check_PTS
	.globl	SUB_consume_data
	.globl	SUB_seek_DTS_SYNC	// Corin 101
	.extern	Debug_Dump_Ptr		// xxxxxxxxx

	.list
	.text
	.set	noreorder

#define DTSDVD_SyncHigh	0xfe7f
#define DTSDVD_SyncLow	0x0180
#define DTSCD_SyncHigh	0xff1f
#define DTSCD_SyncLow	0x00e8

/***************************************************************************************
 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


//=================================================
// DTS CD Seek Sync  Subroutine
//=================================================
SUB_seek_DTS_SYNC:
	dlh	r7, DiskAttrib+2
	movi	StartAddrHigh, MEM_SEG
	movi	AGRSiz2, 0xffff
	movi	DMASize, 31	//32 words each block
	movi	BlockSkip, 0	
	movi	BlockSize, 0	// block size = 1
	addi	r7, 1
	dsh	r7, DiskAttrib+2	// counter for seek sync

	LdStrRdPtr	r21
	dlw	r23, Stream_End
	movi	r1, 0x400	// 0x400(word)=0x1000(byte)
	andi	r22, r21, 0xffff
	andi	r23, 0xffff
	shr	r22, 2
	shr	r23, 2
	movi	r3, 0		// counter for DMA
	movi	r0, 0		// counter for seek sync
Seek_sync:
	movi	AGRAdr2, 0x1000
	tst	r22, r23
	blt	DMA_data
	subi	r22, PCM_IBUF_SIZE/4
DMA_data:
	mov	LocalAddr, r1	
	dmarr	r22		
	WaitDma
	addi	r22, 32		// 32 words each block
	addi	r3, 1
get_next_word:
	mov	r4, a2(1*4)
	shr	r6, r4, 16	// Sync Low     0x00e8
	andi	r4, 0xffff	// Sync High    0xff1f

	tsti	r4, DTSCD_SyncHigh
	bne	find_DVD_Syncword
	tsti	r6, DTSCD_SyncLow
	beq	sync_found
find_DVD_Syncword:
	tsti	r4, DTSDVD_SyncHigh
	bne	find_next_word
	tsti	r6, DTSDVD_SyncLow
	beq	sync_found
find_next_word:

	addi	r0, 1
	tsti	r0, 32
	blt	get_next_word
	movi	r0, 0
	tsti	r3, 8
	blt	Seek_sync

	movi	r0, 2		// PCM CDDA
	j	No_DTS_Sync

sync_found:
// DiskAttrib: Low half for Disk Attribution, Hi half for seek snyc counter
// Low half: 0 = not seek yet, 1 = DTS CD, 2 = PCM CD
// Hi half: number of seeking sync 
	movi	r0, 1
No_DTS_Sync:
	nop
	dsh	r0, DiskAttrib
End_seeking:
	j	r29

⌨️ 快捷键说明

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