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

📄 disp.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 S
字号:
//*****************************************************************************
// (c)2000 Copyright LuxSonor,  Inc. All rights reserved
// Revision 1.0;;	;	Module:	DISPLAY SPECTRUM
//	Initial version: XUE XIANG WAN 7/27/2000
//	Calling	:     	none;	Called by:	    pcm_pcm 
//*****************************************************************************
//	Return:		r25:                       
//	Param in:       No :    
//	Temp reg:	                                       
//	AGR  reg:	AGR0: pointer for search buffer        
//			AGR1:
//                       AGR2                                    
//	Local buffer:                           
//   			
//                       use MPEG PCM buffer all 2k bytes (used) now in 1400
//*****************************************************************************
//*****************************************************************************
#define DMA_SIZE	32
//#define DEBUG_PSM     1
#define FFT_CACULATING	0x5a5a
#define FFT_DATA_READY	0x5555
#ifdef mpg // DISC==1
#define SAVE_REG	0
#else
#define SAVE_REG	1
#endif

#ifdef pcm
#define DATA_SAMPLE		4
#else
#define DATA_SAMPLE		2
#endif
#if ENABLE_PSM

//*****************************************************************************
//  Next for headfile
//*****************************************************************************
        .nolist                
#include "regdef.h"
#ifdef mp3
#include "mp3.h"
#else
#include "regdef2.h"
#include "memory2.h"
#endif
#include "app_mem.h"
		.list
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



#define LB_PSM_BASE			0x1000

// pcm_data all for 512 words 
#define pcm_data_buffer_address	LB_PSM_BASE
#define PCM_BUFF_SIZE		0x400
#define PCM_BUFF_END		(pcm_data_buffer_address + PCM_BUFF_SIZE)

// cos_table in local buffer 132 words
#define cos_table_buffer	PCM_BUFF_END
#define COS_TABLE_SIZE		0x400
#define COS_TABLE_END		(cos_table_buffer + COS_TABLE_SIZE)


// in the local buffer 40 words
#define PSM_RESULT_BUFF_BASE	PCM_BUFF_END	
#define PSM_RESULT_BUFF_SIZE	0x30
#define PSM_RESULT_BUFF_END		(PSM_RESULT_BUFF_BASE + PSM_RESULT_BUFF_SIZE)
#define disp_spectrum_buff_address	PSM_RESULT_BUFF_BASE
#define real_temp                          0x1844
#define imag_temp                         0x1848


//*****************************************************************************

                .extern	fft_coeff
                .extern  cos_table
                .extern	fft_stage
                .extern  pcm_buffer
                .extern  mpeg_debug_pcm  
                
                .extern  r0_temp
                .extern  r1_temp
                .extern  r2_temp
                .extern  r3_temp
                .extern  r4_temp
                .extern  r5_temp
                .extern  r6_temp
                .extern  r7_temp
                .extern  r8_temp
                .extern  r10_temp
                .extern  spectrum_buffer
                .extern  BlockSize_temp
                .extern  BlockSkip_temp
                .extern  DMASize_temp 
                
//*****************************************************************************
//*****************************************************************************
	.macro PSM_STAGE_TST	STAGE
	dlw		r0, fft_stage
	nop
	tsti	r0, \STAGE
	.endm

	.macro PSM_STAGE_SET	STAGE
	movi	r0, \STAGE
	dsw		r0, fft_stage
	nop
	.endm

	.macro M_DMA function, src, dst, size
	movi	r0, (\src)>>2
	movi	r1, (\dst)
	movi	r2, \size
	jsr		r6, \function
	nop
	.endm
	
	.macro	M_MIX dst, src
	movi    AGRAdr0, \dst
	movi    AGRAdr1, \src
	jsr		r6, mix_two_channel
	nop
	.endm
	
	.text
     .align   4 
                
     .global  disp_spectrum

	.extern psm_count		   
	

disp_spectrum:
/*	used register 
	r0,r1,r2,r3,r4,r6,r7,
	r24	DcacheBase 
	r25 return address
*/
//-----------------------------------------------------------------------------------------
//*******************************************************************************
//-----------------------------------------------------------------------------------------
       
//------------------------------------------------------------------------------------
// check fft_on_off_flag  use r0 --white
//------------------------------------------------------------------------------------

	mov    r24, DcacheBase                    ; protect the Dcachebase register
	SWITCH_TO_APP
        movi   DcacheBase, APP_DATA_SEG             
#if 1 //ndef MP3
	dlw		r0, app_status
	nop
	andi	r0, (APP_PSM_ENABLE|APP_PSM_RUN)
	tsti	r0, (APP_PSM_ENABLE|APP_PSM_RUN)
	bne		fft_return2
#endif	
// end of check psm_on_off_flag --white
		
	dlw		r0, app_debug
	tsti	r0, FFT_DATA_READY
	beq		fft_return2

#ifdef mp3
                dlw     r0, risc_flag1
                nop
                tsti     r0, 0                          // wait for risc to prepare the data
                bne    fft_return2
                movi   r0, 0xaaaa                     // set communciation data flag 
                dsw    r0, risc_flag1                 // set communciation data flag
#endif
	INCW r0, psm_count

#ifndef mp3
	tsti     r0,10                                            // for time reduce bandwidth
	blt	fft_return2
;	movi	r0, 0
;	dsw	r0, psm_count
;	nop
#endif
#if DEBUG_PSM
	INCW	r0, app_debug
	nop
#endif

#if SAVE_REG
	dsw    r4, r4_temp
	dsw    r6, r6_temp
	dsw    r7, r7_temp
#endif	
mov    r0, BlockSize
dsw    r0, BlockSize_temp
mov    r1, BlockSkip
dsw    r1, BlockSkip_temp
mov    r0, DMASize
dsw    r0, DMASize_temp
mov    r1,StartAddrHigh
dsw    r1,StartAddrHigh_temp
movi	StartAddrHigh,  APP_DATA_SEG 

#ifndef mp3
//               PSM_STAGE_SET
cal_fft1:        
	PSM_STAGE_TST	0
	bne    cal_fft2
	movi	r0, FFT_CACULATING
	dsw		r0, app_debug
	M_MIX	LB_PSM_BASE, LB_PSM_BASE
	M_DMA	dma_write, LB_PSM_BASE, pcm_buffer, 4
	PSM_STAGE_SET	1
	j      fft_return
cal_fft2:
	tsti    r0, 1
	bne    cal_fft3
	M_MIX	LB_PSM_BASE, LB_PSM_BASE
	M_DMA	dma_write, LB_PSM_BASE, pcm_buffer+0x200, 4
	PSM_STAGE_SET	2
	j      fft_return
cal_fft3:                 
cal_fft:       
#else
// save local buffer	--white
	M_DMA dma_write, LB_PSM_BASE, local_temp, 17
#endif               
// load pcm data
#ifndef mp3	
	M_DMA	dma_read, pcm_data_buffer_address, pcm_buffer, 8
#else
	M_DMA	dma_read, pcm_data_buffer_address, pcm_buffer, 16
//	mix two channel --white 
	M_MIX	LB_PSM_BASE, LB_PSM_BASE
	jsr		r6, mix_two_channel		// 0x100-0x1ff samples
	nop
// load the cos_table to local buffer 128 x 16 ************************		
	M_DMA	dma_read, cos_table_buffer, cos_table, 8
#endif                                

#ifndef mp3	
	M_DMA	dma_read, cos_table_buffer, cos_table, 4
	jsr	r6, expand_cos_table
#endif
	movi	AGRMod0, 0                             // set agr mode as 0 
	movi    AGRMod1, 0                          

	movi	r3, 0
	loop	7, 7f
	shl		r1, r3,1
	addi	r1, fft_coeff
	dlhr	r7, r1
	j       fft_data_change_over
	nop
conv_done:	
	shl     r1,r3,2
	addi    r1,spectrum_buffer
	dswr    r0,r1
	addi	r3,1
7:	
	nop
	movi	r0, FFT_DATA_READY
	dsw		r0, app_debug
	nop
	movi	r0, 0
	dsw	r0, psm_count
	nop
	movi    AGRSiz1, 0xffff                             // set as linar buffer 
	movi    AGRSiz2, 0xffff                             // set as linar buffer  
	PSM_STAGE_SET	0
                                             
fft_return:
#ifdef mp3
// restore local buffer
	M_DMA	dma_read, LB_PSM_BASE, local_temp, 17
#endif
fft_return1:
	     
	dlw	r0,StartAddrHigh_temp
	dlw	r1, BlockSize_temp
	dlw	r2, BlockSkip_temp
	dlw	r3, DMASize_temp 
	mov	StartAddrHigh,r0 
	mov	BlockSize, r1
	mov	BlockSkip, r2
	mov	DMASize, r3
#if SAVE_REG
	dlw    r4, r4_temp
	dlw    r6, r6_temp
	dlw    r7, r7_temp
#endif	
fft_return2:	
	mov	DcacheBase,r24                                               
	j       r25                                         // for return main_prog
	nop
/*=========================================================================*/
// end of main function                                
                
/*=========================================================================*\
	dma_read  --white
	used: r0,r1,r2,r6
	input:	
		r0: local buffer address (word address)
		r1:	memory buffer address (byte address)
		r2: length ( divide by 32*4 )
	return:	
		r6
\*-------------------------------------------------------------------------*/
dma_read:	
	movi   StartAddrHigh,APP_DATA_SEG
	movi   DMASize,DMA_SIZE-1
	movi   BlockSkip,0
	movi   BlockSize,DMA_SIZE-1

	loop	r2, dma_read_loop
	mov		LocalAddr,r0
	mov		DmaByteRd, r1
	addi    r1, DMA_SIZE*4
	WaitDma
	addi    r0, DMA_SIZE
dma_read_loop:
	nop
	j	r6
	nop
/*=========================================================================*/

/*=========================================================================*\
	dma_write  --white
	used: r0,r1,r2,r6
	input:	
		r0: local buffer address (word address)
		r1:	memory buffer address (byte address)
		r2: length ( divide by 32*4 )
	return:	
		r6
\*-------------------------------------------------------------------------*/
dma_write:	
	movi   StartAddrHigh,APP_DATA_SEG
	movi   DMASize,DMA_SIZE-1
	movi   BlockSkip,0
	movi   BlockSize,DMA_SIZE-1

	loop	r2, dma_write_loop
	mov		LocalAddr,r0
	mov		DmaByteWr, r1
	addi    r1, DMA_SIZE*4
	WaitDma
	addi    r0, DMA_SIZE
dma_write_loop:
	nop
	j	r6
	nop
/*=========================================================================*/

/*=========================================================================*\
	mix two channel  --white
	input:	AGR0(dst), AGR1(src)
	return:	r6
	used: r0,r1,AGR0,AGR1
\*-------------------------------------------------------------------------*/
mix_two_channel:
	movi	AGRSiz0, 0xffff		                 // linear addressing           
	movi    AGRSiz1, 0xffff                           
	loop    0, 1f
	movhf   r0,a1(DATA_SAMPLE)
	addhf   r0,a1(DATA_SAMPLE)
	shra    r0,1
	movhf   a0(2), r0
1:
	nop
	j	r6
	nop
/*=========================================================================*/
fft_data_change_over:

               movi    AGRAdr0, pcm_data_buffer_address                
               movi    AGRInc0, 0x2

//----------------------------------------------------------------------------
//----------------------------------------------------------------------------

                movi    AGRAdr1, cos_table_buffer
                movi    AGRSiz1,1024-2
                mov    AGRInc1, r7


                movi    AGRAdr2, cos_table_buffer+384          // for sin table
                movi    AGRSiz2,1024-2
                mov    AGRInc2, r7

//-----------------------------------------------------------------------------------
//*************** next for use DFT ******************************************** 
//-----------------------------------------------------------------------------------
                movi    r0, 0
                movi    r1, 0
                movi    r4,0
//                movi    r5,0

                loop    0,fft_cycle

                movhf   r6,i1
                shra    r6,8
                maddhf  r0,r6,a0(0)                                 // 

                movhf   r6,i2
                shra    r6,8
                maddhf  r4,r6,i0

//-------------------------------------------------------------------------------------              

                movhf   r6,i1
                shra    r6,8
                maddhf  r0,r6,a0(0)

                movhf   r6,i2
                shra    r6,8
                maddhf  r4,r6,i0                                   //
fft_cycle:

                nop              
//                nop     

                rndhf   %real_temp,r0
                rndhf   %imag_temp,r4
                nop
                nop
    //           nop
                
                movhf   r0,%real_temp
                movhf   r4,%imag_temp

                mulhf    r0,r0,%real_temp                           // for cal energy
                maddhf  r0,r4,%imag_temp
      //        nop
                nop
                rndhf   r0,r0
                shl     r0,4 
j	conv_done
nop

#ifndef mp3
expand_cos_table:
	li      r1,0xffffffff
	movi   AGRAdr0, cos_table_buffer
	movi   AGRAdr1, cos_table_buffer+512
	movi   AGRAdr2, cos_table_buffer+512
	movi   AGRAdr3, cos_table_buffer+1024-2

	loop    128, expand_cos_table_loop
	movhf  r0,a0(2)
	movhf  a3(-2),r0
//	sub    r0,r1
	sub    r0,r1,r0
	movhf  a1(-2),r0
	movhf  a2(2),r0
expand_cos_table_loop:
	nop
	j	r6
	nop
#endif

#endif	/* ENABLE_PSM */

⌨️ 快捷键说明

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