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

📄 mpg.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 S
📖 第 1 页 / 共 3 页
字号:
;	Module: user
;
;	Initial version: K. WEN 	9/24/96
;			Jinshi Huang 12/1/98 for LS388/LS500
;	Call	:     r26	; set up return address for called subroutine
;		      ac3_pcm ac3_dec	  	      
;	Permanent:    
;	Temp reg:
;	AGR  reg:
;	Local buffer:
	.nolist
; 			global include file
#include "regdef.h"
#include "memory.h"
#include "constant.h"
#include "common.h"
; 			local include file
#include "user.h"
#include "sync.h"
#ifdef	EFFECT
#include "stereo_user.h"
#endif	//EFFECT

	.list
	.text
	.extern APP_Init
	.extern APP_Main
	.extern APP_Exit
	.extern	SUB_isr
	.extern SWAP_PTR
	.extern	LBDriver
        .extern SUB_MPEG_decoder
#ifdef	EFFECT
	.extern	mid_buf_rd_ptr
	.extern	mid_buf_wr_ptr
	.extern	ok_decode_flag
	.extern	Audio_Effect_Entry
	.extern	SUB_Audio_Effect
	.extern	SUB_pcm_pcm
	.extern	EFFECT_COMMAND
	.extern	mic_data_ptr
#else	//EFFECT
        .extern SUB_out_fifo
#endif	//EFFECT
        .extern Lframe_loop
	.extern	EOD_flag
	.extern	SAMPLING_FREQ_TEMP
#ifdef	CERTIFY
	.extern	idle_flag
#endif
#if SR48
        .extern PCM_store_ptr
        .extern PCM_load_ptr
        .extern PCM_blk_cnt
        .extern PCM_bcnt
        .extern PCM_scnt
        .extern PCM_gcnt
#endif
	.globl	ProgStart
	.globl	LoopStart
	.globl	_start
        .globl  LBreakPointEntry
	.globl	rtn_Microphone
	.set	noreorder
	
#ifdef DEBUGGER
        .extern SUB_DSP_DEBUGGER
        .extern dbg_last_inst
#define	DEBUG_BUF	0xf200
#define	DEBUG_BUF_END	0xf600
#define DEBUG_BUF_PTR	0xf130
#endif  // DEBUGGER
	
_start:
	movi	DcacheBase,MEM_SEG
	movi	StartAddrHigh,MEM_SEG
        CLR_TrapReg_1
	j	ProgStart
	.align	4
#ifdef DEBUGGER
        j       SUB_DSP_DEBUGGER        // break point
        la      r0,dbg_last_inst        // RETURN_OFFSET (addr: 0x1f1814)
#else   // DEBUGGER
        ret
#endif  // DEBUGGER
	.align	4
#ifdef DEBUGGER
        j       SUB_DSP_DEBUGGER        // debug
#else   // DEBUGGER
        ret
#endif  // DEBUGGER			// debug
	.align	4
#ifdef DEBUGGER
        j       SUB_DSP_DEBUGGER        // debug
#else   // DEBUGGER
#ifdef QT_SYNC
#if	LS388
	ret
#else	// LS388
        j       SUB_isr                 // interrupt
#endif	// LS388
#else	// QT_SYNC
	nop
#endif
#endif	// DEBUGGER
	.align	4
ProgStart:

	//
	// init section
	//
	li	r0,0xffffffff
	dsw	r0,COMMAND0		// clear command

//--------------------------------------------------------------------------------------
//  ShenZhen application
//--------------------------------------------------------------------------------------

	jsr	    r31, APP_Init
	nop
//---------------------------------------------------------------------------------------
	movw	r20,LWtitlekey0
	dsw	r20,Drv_RD
	rswi	r20,0x3c>>2
	movb	r20,LBtitlekey4
	dsw	r20,Drv_RD+4
	rswi	r20,0x38>>2
	movi	r0,MIN_IBUF_DEPTH
	movh	LIfrmsize,r0		// use default as depth to start with
	mupi	r0,MEM_SEG		// init input buffer write pointer
	addi	r1,r0,IBUF_START
	movw	LWibufRdPtr,r1
	dsw	r1,Stream_Wr_Ptr
	dsw	r1,Stream_Rd_Ptr
#ifdef	EFFECT
//	dsw	r1,OLD_Stream_Rd_Ptr
	movh	LIold_rd_ptr,r1
#endif
	dsw	r1,Stream_Start
	addi	r1,IBUF_SIZE
	dsw	r1,Stream_End
#ifdef QT_SYNC
	addi	r1,r0,PTS_FIFO_START
	dsw	r1,PTS_FIFO_Start
	dsw	r1,PTS_FIFO_Rd_Ptr
	dsw	r1,PTS_FIFO_Wr_Ptr
	addi	r1,r0,PTS_FIFO_END
	dsw	r1,PTS_FIFO_End
#endif
	mupi	r1,DataSeg
        rswi    r1,PCM_FIFO_StartReg
	ori	r1,PCM_OUT_END
        rswi    r1,PCM_FIFO_EndReg

        jsr     r31,SUB_clear_PCM	//clear PCM before enable PCM out

#ifdef CMD_BUF
        movi    r0,0
        dsw     r0,CMD_BUF_ADR
        dsw     r0,CMD_BUF_ADR+0x4
        dsw     r0,CMD_BUF_ADR+0x8
        dsw     r0,CMD_BUF_ADR+0xc
#ifdef DB_FLAG
        dsw     r0,DB_FLAG_ADR+0x0
        dsw     r0,DB_FLAG_ADR+0x4
        dsw     r0,DB_FLAG_ADR+0x8
        dsw     r0,DB_FLAG_ADR+0xc
        dsw     r0,DB_FLAG_ADR+0x10
        dsw     r0,DB_FLAG_ADR+0x14
        dsw     r0,DB_FLAG_ADR+0x18
        dsw     r0,DB_FLAG_ADR+0x1c
#endif
#endif

// clear local buffer. This should be done at initialization

	movi	AGRMod0, 0		
	movi	AGRSiz0, 0xffff		;linear addressing
	movi	AGRAdr0, 0x80
	movi	r0, 0
	dsw	r0,LBDriver		// Default as loader DVD
	loop	63, clr_outer_loop	; total of 2048 words
	loop	32, clr_inner_loop
	mov	a0(1*4), r0
clr_inner_loop:
clr_outer_loop:

        movi    r0,0xffff
        dsw     r0,SAMPLING_FREQ_TEMP

	li	r0,0x7fffff
	movw	LWpcmscale,r0		// default to unity gain

	movi	r0,MIN_IBUF_DEPTH
	movh	LIfrmsize,r0

	movi	r0,1
	movb	LBPCM_flag,r0		// set PCM_flag done
	movb	LBPCMlow,r0		// set PCM buffer empty
	movi	r0,0

#ifdef QT_SYNC
        movh    LIMpegAttr,r0           // init for QT_SYNC
	movw	LWbytecount,r0		// init byte count
#endif

#ifdef  CERTIFY
	movi	r0,0
	dsw	r0, idle_flag
#endif

	ori	r0,SET_PROCESS_NEW	// set process, new

	movh	LIstatus,r0		// init status

	jsr	r31,SUB_clear_keyshift_context


	//
	// enable interrupt
	//
#ifdef QT_SYNC
        movi    TrapReg,TRAPREG_VAL            // enable int
	nop
	nop
#endif

LoopStart:
;************************************************
;	Add for ufon hardware existence check	*
;************************************************

		dlw	r0,USER_ICFG
		nop
		andi	r0,ICFG_MIC_EXIST_MASK		;bit15 stands for ufone hardware
		tsti	r0,ICFG_MIC_EXIST_MASK
		bz	skip_ufon_resetting		;skip if non-existence

		rlwi	r1,PCM_Run_Halt
		tsti	r1,0x131			; Yes it is set already
		beq	skip_ufon_resetting
;********** set up the read pointer in the micro FIFO ***********
		mupi	r0,0x1011
		ori	r0,MIC_BUF_START_B
		rswi	r0,PCM_In_Fifo_Start_Addr
		rswi	r0,PCM_In_Current_Addr
		ori	r0,MIC_BUF_END_B
		rswi	r0,PCM_In_Fifo_End_Addr
		
		movi	r0,mic_start_addr
		dsh	r0,mic_data_ptr

		ori	r1,0x0600
		rswi	r1,PCM_Run_Halt

		subi	r1,0x0500
//		ori	r1,0x0100
		nop
		rswi	r1,PCM_Run_Halt		;ufon is turned on

		movi	r0,SUB_Audio_Effect
		dsw	r0,Audio_Effect_Entry

skip_ufon_resetting:				

//
// get command from memory
//
//=====================================================================
//	check application command	--white
//---------------------------------------------------------------------
         
	   nop

//-------------------------------------------------------------------------------
// *********** ShenZhen application ****************************************
//-------------------------------------------------------------------------------

       j	    APP_Main
       nop

APP_Exit:

	   nop	

//------------------------------------------------------------------------------
	dlw	r0,COMMAND0             // get command from host(DRAM)
	nop
	andi    r0,0xff
	tsti    r0,CMD_NOP              // check if it's a NOP
	beq	LcheckStatus
	tsti	r0,0xff
	bne	ExecCmd			// exec and clear command
	movi	r0,0x100
	dsw	r0,COMMAND0		// clear command

LcheckStatus:
	movh	r1,LIstatus		// read in current status
	andi	r0,r1,RUN_STOP_MASK	// check if process stopped 

	tsti	r0,STATUS_STOP
	/* checking QSOUND command to avoid R3K lock up */
	bne	Lno_chk_qsnd_cmd
	dlw	r0,COMMAND1
	nop
	tsti	r0,CMD1_QSOUND
	beq	Lupdate_qsnd_cmd
	tsti	r0,CMD1_QSOUND_A
	beq	Lupdate_qsnd_cmd
	tsti	r0,CMD1_QSOUND_OFF
	bne	Lchk_qsnd_done
Lupdate_qsnd_cmd:
	movi	DcacheBase, DataSeg
	nop
	dsw	r0,QSOUND_CMD_BUF
	nop
	movi	DcacheBase, MEM_SEG
	nop
Lchk_qsnd_done:
#if 1
//***********************************************************************
//	Enabled Microphone when Mpeg is not running
//***********************************************************************
//---------------------PCM-in registers setting------------------
		dlw	r0,USER_ICFG
		nop
		andi	r0,ICFG_LS128_MASK
		tsti	r0,ICFG_LS128_MASK
		bne	not_ls128_adc
		movi	r0,0x61
		j	adc_chip_set_done
not_ls128_adc:
		movi	r0,0x16d			;0x56d
adc_chip_set_done:
		rswi	r0,PCM_In_Control_Reg
//--------------------------------------------------------------

		dlw	r0,USER_ICFG
		nop
		andi	r0,ICFG_MIC_EXIST_MASK	;bit15 stands for ufone hardware
		tsti	r0,ICFG_MIC_EXIST_MASK
		bz	No_ufone_at_all		;skip if non-existence

		rlwi	r1,PCM_In_Current_Addr
		andi	r1,0xffff
		movi	r0,MIC_BUF_START_B	; range check in case nonexistence of hw
		tst	r1,r0
		blt	No_ufone_at_all

		movi	r0,MIC_BUF_END_B
		tst	r1,r0
		bgt	No_ufone_at_all


		dlh	r0, mic_data_ptr	; read the current address of pointer
		nop

		tst	r1,r0
		bgte	Yes_256_samples
		addi	r1,MIC_BUF_SIZE_B

Yes_256_samples:
		sub	r1,r0
		tsti	r1,0x400
		blt	No_ufone_at_all		;wait_till_next		; avoid dram bandwidth consume ;

Clear_Audio_samples_for_ufone_omly:
	movi	r0,0
	movi	AGRAdr2, 0
	movi	AGRSiz2,0xffff
        

 	jsr	r31,SUB_save_mpeg_context	//0x0-0x1000
	jsr	r31,SUB_restore_keyshift_context	//0x400-0x1000

	loop    128, Clear_Audio_stream
        mov     a2(1*4), r0
        mov     a2(1*4), r0
Clear_Audio_stream:
	
	dlw	r1,COMMAND1
	mupi    r0,MEM_SEG
	tsti	r1,0
	beq	Effct_in
	dsw	r1,EFFECT_COMMAND
Effct_in:
	dlw	r1,Audio_Effect_Entry
	la      r31,rtn_Microphone
        or      r31,r0
	or	r1,r0
	j	r1	
rtn_Microphone:
	
	jsr	r31,SUB_save_keyshift_context	//0x0-0x1000
	jsr	r31,SUB_restore_mpeg_context	//0x0-0x1000
	
	movi	DcacheBase,MEM_SEG	//back to mpeg segment
	movi	StartAddrHigh,MEM_SEG
	j	LCheckPCM

//***************** Ufone
#endif
No_ufone_at_all:
	j	LoopStart
Lno_chk_qsnd_cmd:

#ifndef	EFFECT
LCheckPCM_flag:	
        movb    r1,LBPCM_flag
	tsti	r1,1			// test bit 0
	bne	LCheckPCM		// skip decoder, wait until set
#endif	//EFFECT
		
Lcheck_ibuf_depth:
	dlw	r1,Stream_Wr_Ptr
	dlw	r0,Stream_Rd_Ptr
	nop
	tst	r1,r0
	bgte	Lcheck_space
	addi	r1,IBUF_SIZE		// always assume wr ahead of rd
Lcheck_space:
	sub	r1,r0
	movh    r0,LIMpegAttr
	andi	r0,0x00b0		//STEP or FF/FB or fast/slow play mode
	tsti	r0,0
	bne	Lcheck_2frmsize
	movh	r0,LIfrmsize
	addi	r0,0x8			// leave some margin
	tst	r1,r0			// guarantee at least one freame in normal mode
	bgte	Lcheck_status
	j	Lcheck_space_done
Lcheck_2frmsize:

	movh	r0,LIfrmsize
	shl	r0,1			// guarantee at least two frame in trick modes
	tst	r1,r0
	bgte	Lcheck_status
Lcheck_space_done:
	dlw	r0,EOD_flag
	nop
	tsti	r0,1
	beq	hungry_clear_PCM
        rlwi    r0,STC
        movw    r2,LWhungrySTC
        tsti    r2,0
        bne     1f
        movw    LWhungrySTC,r0
	j       clear_PCM_already
1:
	movb    r1,LBhdr_sampling_frequency
	tsti	r1,1			// 0: 44.1kHz, 1: 48kHz
	beq	hungry_clear_PCM	// do not repeat PCM if it's DVD
	sub	r1,r0,r2
//        tsti    r1,0x22d6		// check if I/O out of sync - repeat up to 4 frames
        tsti    r1,0x45ac		// check if I/O out of sync - repeat up to 8 frames
	blte	LoopStart

hungry_clear_PCM:
        movi    r0,0
	dsw	r0,EOD_flag
        movw    LWhungrySTC,r0

	dlw	r0,clr_buffer_flag
	movi	r1,1
	tsti	r0,0
	bne	clear_PCM_already
	dsw	r1,clr_buffer_flag
	jsr     r31,SUB_clear_PCM
clear_PCM_already:
        
	j	LoopStart
Lcheck_status:
#ifdef	DB_FLAG
        movi    r0,0x1
        dsw     r0,0xe028
#endif  // debug
        // do byteswap if needed
	jsr	r31, SUB_swap_byte

        movi    r0,0
        movw    LWhungrySTC,r0
	
	movh	r0,LIstatus
	andi	r0,ERROR_MASK
        tsti    r0,0
	beq	Ldo_decode
#ifdef CERTIFY
//4-27-98        tsti    r0,F_SYNC_ERROR
//4-27-98        beq     1f
        andi    r0,RESET_ERROR          //4-27-98
        movh    LIstatus,r0             //4-27-98
	movw	r1,LWibufRdPtr		// move ahead 4 byte before seek
        andi    r1,0xffff
	addi	r1,4			// otherwise data rate error will
        tsti    r1,IBUF_END_plus1
        blt     5f
        subi    r1,IBUF_END_plus1
        addi    r1,IBUF_START
5:
        mupi    r0,MEM_SEG
        or      r1,r0
	movw	LWibufRdPtr,r1		// stick
	movw	r1,LWbytecount
	addi	r1,4
	movw	LWbytecount,r1
1:

        jsr     r31,SUB_clear_PCM

#if 0
        mupi    r0,MEM_SEG
        la      r1,Lframe_loop          // do seek_SYNC
        or      r1,r0
        j       r1
#endif  // 0
#else   // CERTIFY
	jsr	r31,SUB_seek_SYNC	// won't return to do_decode
#endif  // CERTIFY
Ldo_decode:
/*
	movb	r0,LBblknum
	tsti	r0,0
	bne	Lnormal_decode		//start consuming data at end of frame
*/
	movh    r0,LIMpegAttr
	andi	r0,0x00b0		//STEP or FF/FB or fast/slow play mode
	tsti	r0,0
	beq	Lnormal_decode
#if 1
	dlw	r0,clr_buffer_flag
	movi	r1,1

⌨️ 快捷键说明

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