📄 disp.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 + -