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

📄 musicout.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 S
📖 第 1 页 / 共 3 页
字号:
        // sub-band synthesis
	movb	r23,  LBfr_ps_stereo 	
	movi	r21, 0			//seg count always = 0
	movi	r20, 0			// channel count
	
synthesis_I_loop_begin:
        jsr     r26, SUB_SubBandSynthesis       // r21 is not used
rtn_SubBandSynthesis:		

	addi	r20, 1
	tst	r20, r23		
        blt     synthesis_I_loop_begin

I_pack_pcm_samples_begin:
        // pack pcm smaples
        jsr     r26,SUB_pack_pcm
rtn_pack_pcm_I:

//be careful ! need to accumulate 3 blocks for layer I
#ifdef	EFFECT	//for EFFECT with keyshift use SUB_pcm_pcm
	j	out_fifo_done_I
#endif	//EFFECT
	
        // output pcm
checking_pcm_flag_I:
        movi    r1, 0
        movb    LBPCM_flag, r1          //reset flag
#if	SR48
	movb    r1,LBhdr_sampling_frequency
        tsti    r1,SAMPLING_FREQ_480
	beq	L_I_no_sr48
        jsr     r26,SUB_out_fifo_SR48
	j	rtn_I_out_fifo
L_I_no_sr48:
#endif	//SR48
	jsr     r26,SUB_out_fifo
rtn_I_out_fifo:

.if     PCM_OUT
	movb	r1, LBPCM_flag		//this should be in top level later
	tsti	r1, 1
#ifndef  EXECTIVE
        bne     checking_pcm_flag_I
        movi    r1, 0
        movb    LBPCM_flag, r1          //reset flag
#else // EXECTIVE
        beq     out_fifo_done_I
        la      r1,checking_pcm_flag_I
        movw    LWPCMentry,r1
        j       r31
out_fifo_done_I:
#endif // EXECTIVE
.endif // PCM_OUT
#endif // NO_RHDEBUG

	mupi	r6,MEM_SEG
        la      r26,I_block_loop_start
	or	r26,r6
I_block_loop_end:

        j       Block_loop_end


chk_layer2:
        tsti    r8,2
        movi    r10,F_LAYER_ERROR
        bne     error_handler
        movi    r8,8
        movb    LBbitsPerSlot,r8
        movi    r8,1152
        movh    LIsamplesPerFrame,r8
        jsr     r26,SUB_II_decode_bitalloc
rtn_II_decode_bitalloc:

        jsr     r26,SUB_II_decode_scale
rtn_II_decode_scale:

        movb    r8,LBhdr_error_protection
        tsti    r8,0
        bne     end_II_chk_CRC
        jsr     r26,SUB_II_CRC_calc
rtn_II_CRC_calc:
        jsr     r26,SUB_chk_CRC
rtn_II_chk_CRC:
        tsti    r10,0
        bne     error_handler
end_II_chk_CRC:

        /* for (i=0;i<SCALE_BLOCK;i++) { ... } */
        movi    r6,0
        movb    LBblknum,r6
II_block_loop_start:
.if SB_OUT
        movi    AGRAdr4,local_sample_byte       // r5=addr. of sample[0][0][i]
        movi    r10,0
        mupi    r10,0x1111
        CLR_TrapReg
        loop    2,6f            // for(j=0;j<2;j++)
        loop    3,6f            // for(k=0;k<3;k++)
        loop    32,6f           // for(i=0;i<SBLIMIT;i++)
        mov     a4(4),r10
6:
        SET_TrapReg
.endif // SB_OUT
        jsr     r26,SUB_II_buffer_sample
rtn_II_buffer_sample:

.if SB_OUT
        movi    r10,local_sample_byte
        rswi    r10,0x500       // start address to dump
        addi    r10,2*3*32*4
        rswi    r10,0x504       // end address to dump
        movi    r10,1
        rswi    r10,0x508       // enable dumping
.endif // SB_OUT

#if NO_RHDEBUG

	movb	r22, LBblknum
	shr	r22, 2		//r22=x=i>>2
	
        jsr     r26,SUB_II_dequantize_sample
rtn_II_dequantize_sample:
       
        // sub-band synthesis
        movb    r23,  LBfr_ps_stereo 
	movi	r21, 0			// segment count

segment_loop_begin:			//max 3 nested hardware loops	
	movi	r20, 0			// channel count
	
synthesis_II_loop_begin:
        jsr     r26, SUB_SubBandSynthesis       // r21 is not used
rtn_SubBandSynthesis_II:	
	
	addi	r20, 1
	tst	r20, r23			
	blt	synthesis_II_loop_begin

II_check_segment:
	addi	r21, 1
	tsti	r21, 3
	blt	segment_loop_begin
	
        // pack pcm smaples
        jsr     r26,SUB_pack_pcm
rtn_pack_pcm_II:

#ifdef	EFFECT	//for EFFECT with keyshift use SUB_pcm_pcm
	j	out_fifo_done_II
#endif	//EFFECT
	        
        // output pcm
checking_pcm_flag_II:
        movi    r1, 0
        movb    LBPCM_flag, r1          //reset flag
#if	SR48
	movb    r1,LBhdr_sampling_frequency
        tsti    r1,SAMPLING_FREQ_480
	beq	L_II_no_sr48
        jsr     r26,SUB_out_fifo_SR48
	j	rtn_II_out_fifo
L_II_no_sr48:
#endif	//SR48
        jsr     r26,SUB_out_fifo
rtn_II_out_fifo:

.if     PCM_OUT
	movb	r1, LBPCM_flag		//this should be in top level later
	tsti	r1, 1
#ifndef  EXECTIVE
        bne     checking_pcm_flag_II
        movi    r1, 0
        movb    LBPCM_flag, r1          //reset flag
#else // EXECTIVE
	
        beq     out_fifo_done_II
        la      r1,checking_pcm_flag_II
        movw    LWPCMentry,r1
        j       r31
out_fifo_done_II:
#endif // EXECTIVE
.endif // PCM_OUT
#endif // NO_RHDEBUG
	
	mupi	r6,MEM_SEG
        la      r26,II_block_loop_start
	or	r26,r6
II_block_loop_end:
Block_loop_end:

	dlw	r6,Sync_Rd_Ptr	// Rd_Ptr at sync location
	dlw	r7,Stream_Rd_Ptr
	nop
	tst	r6, r7
	bne	Lend1frame	// if neq, bit-stream errors occur, do NOT decode
	
	movb	r6,LBblknum
	addi	r6,1
	movb	LBblknum,r6
        tsti    r6,SCALE_BLOCK
#ifdef	EXECTIVE
	beq	Lend1frame
        movw    LWentry,r26     // (r26 = addr. of block_loop_start)
        j       r31                     // return to exective
Lend1frame:
	movw	r6,LWFrameCount
	addi	r6,1
	movw	LWFrameCount,r6
	movi    r6,0		//j.h.:	 reset blknum so that
        movb    LBblknum,r6	//Check_PTS can start
#else // EXECTIVE
        bgte    2f      // branch if loop count > SCALE_BLOCK
        j       r26     // decode next block (r26 = addr. of block_loop_start)
2:
#endif // EXECTIVE

.if FRAMECOUNT
        dlw     r7,framecount_DB
	nop
        addi    r7,1
	tsti	r7, 441
	blte	Lcnt_ok
	movi	r7, 1
#if ISO
#ifndef MPEG_2
	movh    r0,LIfrmsize_offset
	dsw	r0,frmsize_offset_cnt
#endif // MPEG_2
#else // ISO
#ifdef MPEG_2
        movb    r0,LBhdr_sampling_frequency
        tsti    r0,1
        beq     Lcnt_ok
#endif // MPEG_2
	movh    r0,LIfrmsize_offset
	dsw	r0,frmsize_offset_cnt
#endif // ISO
Lcnt_ok:	
	dsw     r7,framecount_DB	
.endif // FRAMECOUNT

	la	r10,Lframe_loop		// set entry for exective
	movw	LWentry,r10
        j       r31                     // return to exective

Ldecode_done:
.if     PCM_OUT
        ;; read location of read fifo
pcm_end_wait:	
#ifdef FILE_OUT
	dlw	r1, PCM_Rd_Ptr	; read current pointer register (28c to 294)
	nop
#else // FILE_OUT
	rlwi	r1, PCM_Rd_Ptr	; read current pointer register (28c to 294)
#endif // FILE_OUT
#ifdef STREAM_SIM
	shr	r1, 16		; make it just the current address portion
#endif // STREAM_SIM
#ifdef	EFFECT
	mupi	r10,DataSeg
#else	// EFFECT
	mupi	r10,MEM_SEG
#endif	// EFFECT
	tst	r1, r10		;until last 6-word unit is out
	bne	pcm_end_wait
.endif // PCM_OUT

#ifdef	EXECTIVE
        j       r31
#else		
	halt pass
#endif

//------------------------------------------------------
	
error_handler:          // r10 = error flag

	
        dlw     r12,DB_FLAG_ADR+0x4
        movh    r0,LIstatus
        or      r0,r10
        movh    LIstatus,r0
#if FRAMECOUNT
        dlw     r0,framecount_DB
        dlw     r1,DB_FLAG_ADR+0x4     // sticky error flag
#endif  // FRAMECOUNT
        or      r12,r10
        dsw     r10,DB_FLAG_ADR+0       // new error flag
        dsw     r12,DB_FLAG_ADR+0x4     // sticky error flag
#if FRAMECOUNT
        tsti    r1,0
        bne     2f
        dsw     r0,DB_FLAG_ADR+0xc      // framecount when error occur
2:
#endif  // FRAMECOUNT

//--------------------j.h.:	added to update Rd_Ptr and bytecount
	movh    r11,LIfrmsize
        shl     r11,3                   // byte addr -> bit addr
	mov     r12,Gb_Getbits_Ptr
	add	r12,r11			//advance one frame
#ifdef	LS388
#if	SVCD
        li	r13,0x804e0000		//end of buffer
#else	// SVCD
        li	r13,0x80860000		//end of buffer
#endif	// SVCD
#else	// LS388
        li	r13,0x80fe0000		//end of buffer
#endif	// LS388
	tst	r12,r13
	blt	1f
	li	r13,0x00020000		//ibuf length in bits
	sub	r12,r13
1:
	
	mov  	Gb_Shadow_Ptr, r12	// load stream bit pointer 
	nop
	nop
	gbi 	r10, 0x0	// Init bit stream, works without it in sim
	
	mov     r12,Gb_Getbits_Ptr
        shl     r12,8   // to clear MS byte
        shr     r12,3+8 // r12 = byte addr of the last byte of current frame
        andi    r12,0xffff
	tsti	r12,IBUF_END_plus1
	blt	1f
	subi	r12,IBUF_END_plus1	// wrapped
	addi	r12,IBUF_START
1:
        mupi    r13,MEM_SEG             // restore segment
        or      r12,r13
        dlw     r0,Stream_Rd_Ptr
        nop
	dsw	r12,Stream_Rd_Ptr	// update read pointer for host
	movw	LWibufRdPtr,r12

        sub     r13,r12,r0
        tst     r12,r0
        bgte    1f
        addi	r13,0x4000		//ibuf length
1:
        movw    r0,LWbytecount
        add	r0,r13
//xxxxxxxxxxxxxx
#ifdef	DUMP_PAGE12
	dlw	r5,Debug_Dump_Ptr
	dlw	r14,Stream_Wr_Ptr
	nop
	movi	DcacheBase,0x12
	nop
	li	r3,0xffffff02
	dswr	r0,r5			// LWbytecount
	addi	r5,4
	dswr	r3,r5			// signature
	addi	r5,4
	dswr	r12,r5			// Stream_Rd_Ptr
	addi	r5,4
	dswr	r14,r5			// Stream_Wr_Ptr
	addi	r5,4
	li	r1,0x130000
	tst	r5,r1
	bne	error_handler_dump
	li	r5,0x120000
error_handler_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
//-------------------------------------
// added by j.h. clear delay buffer to smooth out
// clear F2Abuf0 and F2Abuf1. Done at the begining

	movi	AGRAdr0, local_buf0_byte
	movi	AGRAdr1, local_buf1_byte
	movi	r1, 0
	loop	16, Lclear_0
	loop	32, Lclear_0
	mov	a0(1*4), r1
	mov	a1(1*4), r1
Lclear_0:

	

	movi	AGRAdr0, local_pcm_sample_byte
	loop	6, Lclear_1
	loop	32, Lclear_1
	mov	a0(1*4), r1
Lclear_1:

	movi	BlockSize, 31		;get 32 words
	movi	DMASize, 31
	
	movi	r5, F2Abuf0		;buf0
	movi	r1, local_buf1_byte
	
        CLR_TrapReg
	loop	16, clr_buf0_a		; total of 512 words
	
	mov	ByteLocal, r1
	dmabwr	r5

	WaitDma
	
	addi	r5, 32*4

clr_buf0_a:
        SET_TrapReg

	movi	r5, F2Abuf1		;buf1
	movi	r1, local_buf1_byte
	
        CLR_TrapReg
	loop	16, clr_buf1_a		; total of 512 words
	
	mov	ByteLocal, r1
	dmabwr	r5

	WaitDma

	addi	r5, 32*4

clr_buf1_a:
        SET_TrapReg

	la	r10,SUB_MPEG_decoder	//start decoder again if errors found
	movw	LWentry,r10
	
//--------------------------------------------
	

#ifdef  EXECTIVE
        j       r31
#else
        halt    fail
#endif

#ifndef MPEG_2
	.global	frmsize_offset_cnt
frmsize_offset_cnt:	.align	2
		.word	0x00000000
#endif // MPEG_2

⌨️ 快捷键说明

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