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

📄 musicout.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 S
📖 第 1 页 / 共 3 页
字号:
;	Module: musicout - MPEG-I audio decoding main routine
;
;	Initial version: R. Huang 	2/19/97
;			Jinshi Huang 12/1/98 for LS388/LS500
;	Call	:     r26	; set up return address for called subroutine,
;         	  decode_info,
;		  I_bitalloc_scale, I_CRC_calc, I_buf_sample, I_requantize,
;		  II_bitalloc_scale, II_CRC_calc, II_buf_sample, II_requantize,
;		  recover_CRC_error, out_fifo
;	Permanent:    
;	Temp reg:
;	AGR  reg:
;	Local buffer:
	.nolist
; 			global include file
#include "regdef.h"
#include "common.h"
#include "memory.h"
#include "mpg_mac.h"
#include "user.h"
#ifdef	EFFECT
#include "stereo_user.h"
#endif	//EFFECT
; 			local include file
;			test reference file, to be removed
#define	FRAMECOUNT	1
	.list
	.text

	.extern	framecount_DB
        .extern SUB_seek_sync_mpg
	.extern	SUB_decode_info
	.extern	SUB_I_bitalloc_scale
	.extern	SUB_I_CRC_calc
	.extern	SUB_I_buffer_sample
	.extern	SUB_I_dequantize_sample
	.extern	SUB_II_bitalloc_scale
	.extern	SUB_II_CRC_calc
	.extern	SUB_II_buffer_sample
	.extern	SUB_II_dequantize_sample
	.extern	SUB_recover_CRC_error
#if	SR48
	.extern	SUB_out_fifo_SR48
#endif
	.extern	SUB_out_fifo
	.extern SUB_pack_pcm
#if QSOUND
	.extern	filterCoeffs
	.extern	m48both
	.extern	m44both
#endif	// QSOUND
	.extern	SAMPLING_FREQ_TEMP

        .globl  Lframe_loop

	.set	noreorder

#ifdef	EXECTIVE
        .globl  SUB_MPEG_decoder
SUB_MPEG_decoder:
#if SR48
        movi    r10,0
        dsw     r10,PCM_store_ptr
        dsw     r10,PCM_blk_cnt
#ifdef  I2S
        movi    r10,local_scaled_pcm_byte
#else
        movi    r10,local_pcm_sample_byte
#endif
        dsw     r10,PCM_load_ptr
#endif  // SR48
	movh	r10,LIstatus
	andi	r2,r10,SET_PROCESS_NEW
	tsti	r2,SET_PROCESS_NEW
	bne	Lframe_loop
	andi	r10,RESET_PROCESS_OLD
	movh	LIstatus,r10
#else
	.globl	_start
_start:
#endif

	movi	BlockSkip,0
	movi	ByteSize, 31*4		;get 32 words
	
// clear F2Abuf0 and F2Abuf1. Done at the begining

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

	movi	r5, F2Abuf0		;buf0
	movi	r1, local_buf1_byte
	
        CLR_TrapReg
	loop	16, clr_buf0		; total of 512 words
	
	mov	ByteLocal, r1
	dmabwr	r5

	WaitDma
	
	addi	r5, 32*4

clr_buf0:
        SET_TrapReg

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

	WaitDma

	addi	r5, 32*4

clr_buf1:
        SET_TrapReg


;-----------read cos_tbl. This should be done at the initialization

	movi	BlockSize, 31		;get 32 words
	movi	DMASize, 31
	
	la	r1, (FAcos_tbl)		;external memory addr in bytes
	shr	r1, 2			;make a word addr	
	movi	r3, local_cos1_64_word
	
	mov	LocalAddr, r3
	dmarr	r1			;initiate DMA transfer
	
wait_dma_4:
	mov	r2,StatusPort
	tsti	r2,DmaDoneBit
	bz	wait_dma_4		;wait for dma done

;----------read window coefs. This should be done at the initialization

	la	r1, (FAnew_win)		;external memory addr in bytes
	shr	r1, 2			;make a word addr	
	movi	r3, LFAnew_win_word

        CLR_TrapReg
	loop	16, read_window		; total of 512 words
	mov	LocalAddr, r3
	dmarr	r1			;initiate DMA transfer
	
wait_dma_4a:
	mov	r2,StatusPort
	tsti	r2,DmaDoneBit
	bz	wait_dma_4a		;wait for dma done	

	addi	r1, 32
	addi	r3, 32
read_window:
        SET_TrapReg


//----------read FAmultiple. This should be done at the initialization
	
	movi	BlockSkip,0
	movi	BlockSize, 31		;get 32 words
	movi	DMASize, 31

	la	r1, (FAmultiple)	;external memory addr in bytes
	shr	r1, 2			;make a word addr	
	movi	r3, local_multiple_word
		
        CLR_TrapReg
	loop	2, read_multiple	//total of 64 words
	mov	LocalAddr, r3
	dmarr	r1
	
wait_dma_3:
	mov	r2,StatusPort
	tsti	r2,DmaDoneBit
	bz	wait_dma_3		;wait for dma done

	addi	r1, 32
	addi	r3, 32
	
read_multiple:
        SET_TrapReg

//---------read FAc_tbl & FAd_tbl. This should be done when layer_II is decided


	movi	BlockSize, 16		;get 17 words
	movi	DMASize, 16

	la	r1, (FAc_tbl)		;external memory addr in bytes
	shr	r1, 2			;make a word addr	
	movi	r3, local_c_tbl_word
	
	mov	LocalAddr, r3
	dmarr	r1			;initiate DMA transfer
	
wait_dma_4h:
	mov	r2,StatusPort
	tsti	r2,DmaDoneBit
	bz	wait_dma_4h		;wait for dma done

	la	r1, (FAd_tbl)		;external memory addr in bytes
	shr	r1, 2			;make a word addr	
	movi	r3, local_d_tbl_word
	
	mov	LocalAddr, r3
	dmarr	r1			;initiate DMA transfer
	
wait_dma_4i:
	mov	r2,StatusPort
	tsti	r2,DmaDoneBit
	bz	wait_dma_4i		;wait for dma done


	
//--------------------------------------------------------------------
// Local buffer base: 0x0; Local buffer size: 32 words
//  movi    r1,0x6400	; IBUF_SIZE 0x4000
	movi    r1,0x6000	; IBUF_SIZE 0x4000	
	mov	Gb_Control,r1
	mupi	r1,MEM_SEG
	ori	r1,IBUF_START		// set up input stream circular buffer
#ifdef	STREAM_SIM
	rswi	r1,Stream_Start		// start address	
	movi	r1,IBUF_SIZE		// set up buffer size
	rswi	r1,Stream_Size
	movi	r1,0x1			// enable 
	rswi	r1,Stream_Enable
#else
	dsw	r1,Stream_Start
        addi    r1,IBUF_SIZE
        dsw     r1,Stream_End
#endif

//---------------------------------------------------------------------
#if QSOUND
	;;; Default filter coefficient is 48kHz.
	mupi	r4,MEM_SEG
	ori	r4,m48both
	;;; update QExpander filter coefficient
	mupi	r3,MEM_SEG
	ori	r3,filterCoeffs
#if !THREE_STAGE
	loop	9,config48kHzdone
#else	// !THREE_STAGE
	loop	7,config48kHzdone
#endif	// !THREE_STAGE
	dlwr	r0,r4
	addi	r4,4
	dswr	r0,r3
	addi	r3,4
config48kHzdone:
#endif	// QSOUND
//---------------------------------------------------------------------

/* Loop until end of strem pattern found in stream buffer,
   host will fill end of strem pattern into buffer once end of stream reached */

	movi 	r25,0
	mov	Gb_Shadow_Ptr,r25	// reset stream before enable it
	movw	r1,LWibufRdPtr
	shl	r1,3
	mupi 	r25,0x8000		// bit 31=1, enable bit stream
	or  	r25,r1			// it is a bit pointer
	mov  	Gb_Shadow_Ptr, r25	// load stream bit pointer 
	nop
	nop
	gbi 	r10, 0x0	// Init bit stream, works without it in sim
	
Lframe_loop:
#ifdef	EFFECT
	dlw	r1,Stream_Rd_Ptr
	movh	r0,LIold_rd_ptr
	mupi	r2,MEM_SEG
	or	r0,r2
	sub	r2,r1,r0
	tst	r1,r0
	beq	Lcheck_PTS_done
	bgt	Lcall_check_PTS
	addi	r2,IBUF_SIZE
Lcall_check_PTS:
	movw	r3,LWbytecount
	add	r2,r3
	movh	LIold_rd_ptr,r1
	movw	LWbytecount,r2
	jsr	r28,SUB_check_PTS
Lcheck_PTS_done:
//xxxxxxxxxxxxxx
#ifdef	DUMP_PAGE12
	dlw	r5,Debug_Dump_Ptr
//	dlw	r0,Stream_Wr_Ptr
	movh	r0,LIfrmsize
	dlw	r1,Stream_Rd_Ptr
	movw	r2,LWbytecount
	movi	DcacheBase,0x12
	nop
	nop
	li	r3,0xffffff01
	dswr	r2,r5			// LWbytecount
	addi	r5,4
	dswr	r3,r5			// signature
	addi	r5,4
	dswr	r1,r5			// Stream_Rd_Ptr
	addi	r5,4
	dswr	r0,r5			// Stream_Wr_Ptr
	addi	r5,4
	li	r1,0x130000
	tst	r5,r1
	bne	frame_loop_dump
	li	r5,0x120000
frame_loop_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
#endif	// EFFECT
	;
	; Set up input bit stream pointer
	;

	
//--------------------------------------
	;
	; Initialize AGRSiz(s)
	;
	movi	AGRSiz4,0xffff
	movi	AGRSiz5,0xffff
	movi	AGRSiz6,0xffff

        movi    r11, FRAME_SIZE_LIMIT
#if 0
	dlw	r1,0xff20
	mov     r0,Gb_Getbits_Ptr
	movi	DcacheBase,0x12
	shr	r0,3
	andi	r0,0xffff
	dshr	r0,r1
	addi	r1,2
	tsti	r1,0xffff
	blt	chk_dump_ptr_done0
	movi	r1,0
chk_dump_ptr_done0:
	movi	DcacheBase,MEM_SEG
	nop
	dsw	r1,0xff20
#endif	// debug
        jsr     r26,SUB_seek_sync_mpg
#if 0
	dlw	r1,0xff20
	mov     r0,Gb_Getbits_Ptr
	movi	DcacheBase,0x12
	shr	r0,3
	andi	r0,0xffff
	dshr	r0,r1
	addi	r1,2
	tsti	r1,0xffff
	blt	chk_dump_ptr_done1
	movi	r1,0
chk_dump_ptr_done1:
	movi	r0,0
	dsw	r0,r1
	nop
	movi	DcacheBase,MEM_SEG
	nop
	dsw	r1,0xff20
#endif	// debug
rtn_seek_sync:
	tsti	r10,F_SYNC_ERROR
        beq     error_handler

//--------------------j.h.:	added to update Rd_Ptr and bytecount

	mov     r12,Gb_Getbits_Ptr
	subi	r12,0x10			//align to sync word and 4 bits
        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
	dsw	r12,Sync_Rd_Ptr		// save for later use
	movw	LWibufRdPtr,r12
        sub     r13,r12,r0
        tst     r12,r0
        bgte    1f
        addi	r13,IBUF_SIZE
1:	
        movw    r0,LWbytecount
        add	r0,r13
//-------------------------------------
#ifdef	LS388	//debug
	dlw     r0,Stream_Rd_Ptr
	nop
//	rswi	r0, 0xd08>>2		//for host
#if !LS1888_TEST
	rswi	r0, Comm_Reg3		//for host
#endif	// LS1888_TEST
#endif	//LS388
	
        jsr     r26,SUB_decode_info
        tsti    r10,0
        bne     error_handler
        movb    r10,LBhdr_lay
//        tsti    r10,0x1                          // exclude layer-I
//        beq     error_handler
        tsti    r10,0x2                          // layer-II only
        bne     error_handler
rtn_decode_info:


//-------- detect and skip bad frame -------
	dlw	r2,VAL_PLL_CTRL_48K
	rlwi	r1,Chip_Id
	tsti	r2,0
	bne	load_PLL_CTRL_done		// branch if value provided by RISC
	li	r2,PLL_CTRL_48K_500
	tsti	r1,LS500_ID
	beq	load_PLL_CTRL_done
#if !LS1888_TEST
	li	r2,PLL_CTRL_48K_508
#else	// LS1888_TEST
	li	r2,PLL_CTRL_48K_1888
#endif	// LS1888_TEST
load_PLL_CTRL_done:
#if !LS1888_TEST
	rlwi	r0,PLL_Ctrl_Reg2
#else	// LS1888_TEST
	rlwi	r0,PLL_Ctrl_Reg1

⌨️ 快捷键说明

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