📄 test.s
字号:
/************************************************************************/
; (C)1997 Copyright LuxSonor, Inc. All rights reserved
;
; Revision 1.0
;
;
; Module: AUDIO test code
;
; Initial version:Cecile Foret, mars 1997
; Jinshi Huang 12/1/98 for LS388/LS500
;
; test interrupt in the PCM OUT BUFFER
; when an audio interrupt is catched, take data from a fake buffer....
; command read from outside in Comm_Reg3 and analysed
; routine for trebble/bass and 3D sound integrated in code
; keyshift, trebble/bass and 3D commands are directly handled by
; the command subroutine.
; rate conversion 11Kh-44Kh for micro input
; echo on the micro phone input at 11Kh
; interpolation of the echo -> 44.1Kh.
; microphone input, command handled by CommReg3 (see all_command.S
; for details ).
; mixing with audio signal
;************************************************************************
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; How to have echo/mixing back
; MICRO = 1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.nolist
#include "regdef2.h"
#include "stereo_user.h"
#include "user.h"
#include "globalv.h"
#include "memory2.h"
.list
.data
.global SUB_Audio_Effect
.global main_audio_task
#ifdef EFFECT
.extern Audio_Effect_Entry
#endif
; tables related to key shift stuff
.extern table ; table containing length, dec, Nb
.extern FIR_coeff ; location in MM of the FIR coefficients.
.extern window ; location in MM of triangular window
.extern key_val ; location in MM of the value of the key.
.extern ratefilt ; location in MM of rate conversion filter sets.
; subroutines related to key shift stuff
.extern SUB_search_update ; routine to modify search buffer, when key change
.extern SUB_trebble1 ; routines to perform trebble filtering
.extern SUB_trebble2 ; routines to perform trebble filtering
.extern SUB_bass ; routine to perform the bass filtering
.extern SUB_command ; routine to get the command from r3k
.extern SUB_rate ; routine to change freq rate 11Kh->44.1Kh
.extern SUB_echo ; routine to perform echo on MIC input
.extern SUB_presence ; routine to add presence and do rate conv.
.set noreorder
; used to scale input by 0.5
#define INTERRUPT 1
#define ALG 1
#define KEYSHIFT 1
#define NOP_ENABLE 0
;; ALG is set up to run the keyshift algorithm
#define MICRO 1
#define FAKE 0
;***********************************************************************
;;;; definitions related to AUDIO, CD, PCM-IN and PCM-OUT buffers
;***********************************************************************
; start address high =0 byte start/end adress for audio buffer 1,5 Kbytes
#define AUD_BUF_START_B 0x0c00
#define AUD_BUF_END_B 0x1200
; word & shifted start/end @ for audio buffer 1.5 Kbytes
#define AUD_BUF_START_W 0x60
#define AUD_BUF_END_W 0x90
#define AUD_BUF_SIZE_W 0x30
;; start address high =0, CD fifo, 0x1e00-0x3c00
#define CD_BUF_START 0x1e00
#define CD_BUF_END 0x3600
#define CD_BUF_SIZE 0x1800
#define CD_BUF_START_W 0x1e0
#define CD_BUF_SIZE_W 0xc0
#if OLD_PCM_BUF_SEG // 10-13-98
; start @=0x79000, end @=0x7a000, 2K samples
#define PCM_BUF_START 0x7900
#define PCM_BUF_END 0x7a00
#else // 10-13-98
; start @=0xf3000, end @=0xf4000, 2K samples
#define PCM_BUF_START 0xf900
#define PCM_BUF_END 0xfa00
#endif // 10-13-98
#if OLD_PCM_IN_SEG // 10-13-98
; start adress high = 3, start @ = 0x35c00, end @ = 0x37c00, size = 0x2000
#define PCMIN_HIGH 0x3
#define PCMIN_BUF_START 0x5c00
#define PCMIN_BUF_END 0x7c00
#define PCMIN_BUF_SIZE 0x2000
#define PCMIN_BUF_START_W 0x35c0
#define PCMIN_BUF_END_W 0x37c0
#define PCMIN_BUF_SIZE_W 0x200
#else // 10-13-98
; start adress high = f, start @ = 0xf3000, end @ = 0xf5000, size = 0x2000
#define PCMIN_HIGH 0xf
#define PCMIN_BUF_START 0x3000
#define PCMIN_BUF_END 0x5000
#define PCMIN_BUF_SIZE 0x2000
#define PCMIN_BUF_START_W 0xf300
#define PCMIN_BUF_END_W 0xf500
#define PCMIN_BUF_SIZE_W 0x200
#endif // 10-13-98
;***********************************************************************
;;; definitions related to fake input buffer (micro)
;***********************************************************************
; Start adress high =9
#define INPUT_BUF_START 0x0000
; input buffer starts at adress 90000, ends at a0000
;****************************************************************
; DEFINITIONS RELATED TO ECHO
;****************************************************************
;*********************************************************************
;;; definitions related to local adresses (filters,data,window,history)
;*********************************************************************
;*********************************************************************
; DEFINITION RELATED TO THE MICROPHONE
;*********************************************************************
; start address high =0 byte start/end adress for MICRO FIFO:0x1200-0x1e00
#if 0 //ZhangWei
#define MIC_BUF_START_B 0x9000 //0x8000 ;0x1200
#define MIC_BUF_END_B 0x9c00 //0x8c00
#else
#define MIC_BUF_START_B 0x9400 //0x8000 ;0x1200
#define MIC_BUF_END_B 0xa000 //0x8c00
#endif
#define MIC_BUF_SIZE_B MIC_BUF_END_B - MIC_BUF_START_B; 0xc00
; address of first block to be taken in the Micro Fifo=last block in fifo
;#define mic_start_addr 0x1a00
#define mic_start_addr 0x9000 //0x8000 //0x1200
#define local_hist_point 0x530
;************** MAIN PROGRAM ***************************************
;************** Start actual DSP code ******************************
SUB_Audio_Effect:
#ifdef EFFECT
movi StartAddrHigh, DataSeg
movi DcacheBase, DataSeg
movi BlockSkip, 0
movi BlockSize, 0 ;block size = 1.
#endif //EFFECT
movi r0, 0x0
movh %Prev_Int, r0 ; first interrupt should be audio !
;************** set up the command to default values ***************
movi r0, 0x7 ; trebble = bass = 0dB
movh %bass_com,r0 ; no bass by default !
movh %trebble_com, r0; no trebble by default
movi r0, 0xffff
movh %echo_com, r0 ; no echo by default !
movh %micro_com, r0 ; no micro by default
movi r0, Key_default
movh %keyshift_com,r0
#if MICRO
;********** init microphone related stuff ***********************
;********** put 3 blocks in MICRO FIFO to start *****************
#if 0 //---------------tchou
#ifdef EFFECT
movi StartAddrHigh, DataSeg //0x0
movi DMASize, 31 //32 words each
movi r0, 0
movi r1, mic_start_addr
shr r1, 2
loop 8, init_mic_0
mov LocalAddr, r0
dmawr r1 ; third block
WaitDma
addi r0, 32
addi r1, 32
init_mic_0:
movi r0, 0
movi r1, 0x1200
shr r1, 2
loop 8, init_mic_1
mov LocalAddr, r0
dmawr r1 ; first block
WaitDma
addi r0, 32
addi r1, 32
init_mic_1:
movi r0, 0
movi r1, 0x1600
shr r1, 2
loop 8, init_mic_2
mov LocalAddr, r0
dmawr r1 ; first block
WaitDma
addi r0, 32
addi r1, 32
init_mic_2:
#else //EFFECT
movi StartAddrHigh, 0x0
movi ByteSize, 0x3fe
movi ByteLocal, 0x0
dmabw mic_start_addr ; third block
movi ByteSize, 0x3fe
movi ByteLocal, 0x0
dmabw 0x1200 ; first block
movi ByteSize, 0x3fe
movi ByteLocal, 0x0
dmabw 0x1600 ; second block
#endif //EFFECT
#endif //------------------tchou
;********** set up the read pointer in the micro FIFO ***********
li r0,0
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
addi r0,MIC_BUF_SIZE_B //ZhangWei
rswi r0,PCM_In_Fifo_End_Addr
//---------------------PCM-in registers setting------------------
movi DcacheBase,MEM_SEG
nop
nop
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
// movi r0, mic_start_addr
movi r0,MIC_BUF_START_B
movh %mic_data_ptr, r0
//--------------------------------------------------------------
;************************************************
; Add for ufon hardware existence check *
;************************************************
movi DcacheBase, MEM_SEG
dlw r0,USER_ICFG
nop
andi r0,0x8000 ;bit15 stands for ufone hardware
tsti r0,0x8000
bz skip_ufon_resetting ;skip if non-existence
rlwi r0,PCM_Run_Halt
tsti r0,0x131 ; Yes it is set already
beq skip_ufon_resetting
ori r0,0x0600
rswi r0,PCM_Run_Halt
subi r0,0x0500
nop
rswi r0,PCM_Run_Halt ;ufon is turned on
skip_ufon_resetting:
movi DcacheBase, DataSeg
#endif //MICRO
;************* init of the bass buffers to 0 *****************************
movi AGRAdr1, 0x0
movi AGRInc1, 0x2
movi AGRSiz1, 0xffff
; movi StartAddrHigh, 0x7
movi StartAddrHigh, DataSeg // 10-13-98
#ifdef EFFECT
movi DMASize, 1 ;2 words
movi LocalAddr, 0x0
movi r0,0x0
loop 4,trebble_hist
movhf i1,r0
trebble_hist:
movi r0, Lu0u1
shr r0, 2 //to word addr
dmawr r0 ; set up left history
WaitDma
movi r0, Ru0u1
shr r0, 2
movi LocalAddr, 0x0
dmawr r0 ; set up right history
WaitDma
#else //EFFECT
movi ByteSize, 0x6 ;(2*2-1)*2
movi ByteLocal, 0x0
movi r0,0x0
loop 4,trebble_hist
movhf i1,r0
trebble_hist:
movi r0, Lu0u1
dmabwr r0 ; set up left history
movi r0, Ru0u1
movi ByteSize, 0x6
movi ByteLocal, 0x0
dmabwr r0 ; set up right history
#endif //EFFECT
;************ Init of the trebble buffers to 0 ***************************
#ifdef EFFECT
movi r0, TLu0u1 ; set up left trebble history
shr r0, 2
movi DMASize, 1
movi LocalAddr, 0x0
dmawr r0
WaitDma
movi r0, TRu0u1 ; set up right trebble history
shr r0, 2
movi LocalAddr, 0x0
dmawr r0
WaitDma
#else //EFFECT
movi r0, TLu0u1 ; set up left trebble history
movi ByteSize, 0x6
movi ByteLocal, 0x0
dmabwr r0
movi r0, TRu0u1 ; set up right trebble history
movi ByteSize, 0x6
movi ByteLocal, 0x0
dmabwr r0
#endif //EFFECT
;************ Set u0,u1 to zero ******************************************
#ifdef EFFECT
movi DMASize, 0 //1 word
movi LocalAddr, 0x0
movi r0, TDu0u1
shr r0, 2 //to word addr
dmawr r0
WaitDma
#else //EFFECT
movi ByteSize, 0x2 ;(2*2-1)*2
movi ByteLocal, 0x0
movi r0, TDu0u1
dmabwr r0
#endif //EFFECT
;************ Init of the decimation 44.1Khz-> 11Khz ***************
;******* init the dec_hist *****************************************
movi AGRAdr0, 0x0
movi AGRInc0, 0x2
movi AGRSiz0, 0xffff
movi r0, 0x0
loop 127, dec_init
movhf i0, r0
dec_init:
#ifdef EFFECT
movi DMASize, 31
movi StartAddrHigh, DataSeg
movi r0, 0
movh r1,%Echo_delay_ptr
; movi r1, dec_hist
; shr r1, 2
loop 2, init_dec_hist
mov LocalAddr, r0
dmawr r1
WaitDma
addi r0, 32
addi r1, 32
init_dec_hist:
#else //EFFECT
movi ByteSize, 0xfc
movi ByteLocal, 0x0
; movi StartAddrHigh, 0x7
movi StartAddrHigh, DataSeg // 10-13-98
dmabw dec_hist
#endif
;************ Init of the interpolation 11Khz->44Khz***************
;******* init the history of the rate filter to zero ***************
#ifdef EFFECT
movi AGRAdr4, 0x1000
movi AGRSiz4, 0xffff
movi AGRInc4, 0x2
#else //EFFECT
movi AGRAdr2, 0x1000
movi AGRSiz2, 0xffff
movi AGRInc2, 0x2
#endif //EFFECT
movi r0, 0x0
loop 32, rate_hist_init
#ifdef EFFECT
movhf i4, r0
#else //EFFECT
movhf i2, r0
#endif //EFFECT
rate_hist_init:
#ifdef EFFECT
movi DMASize, 16 ; history =31 coefficients
movi LocalAddr, 0x1000>>2
movi r0, rate_hist>>2
dmawr r0 ; adress in DRAM for history of rate filter
WaitDma
#else //EFFECT
movi StartAddrHigh, 0x7
movi StartAddrHigh, DataSeg // 10-13-98
movi ByteSize, 0x3c ; history =31 coefficients
movi ByteLocal, 0x1000
dmabw rate_hist ; adress in DRAM for history of rate filter
#endif
#ifdef EFFECT //put system variables at 0x400 for now ???
;******* load the 4 sets of filter coefficients ********************
; movi StartAddrHigh, 0x40 ; read from ROM
movi StartAddrHigh, DataSeg ; read from DRAM 10-13-98
movi DMASize,31 ; 128 coefficients in total
movi r0,ratefilt
movi r9, local_rate_filter>>2
shr r0,2
loop 2,decim_interp_coef
mov LocalAddr, r9
dmarr r0 ; adress in ROM of the rate filter
WaitDma
addi r0,32
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -