📄 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 "user2.h"
#ifdef EFFECT
#include "memory.h"
#else //EFFECT
#include "globalv.h"
#endif //EFFECT
#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.
.extern mic_data_ptr
.extern dc_offset_44
.extern rtn_Microphone
.extern SUB_record // for record the microphone
.extern SUB_play // play back the microphone
.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)
;*********************************************************************
#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 !
// dsw r0,echo_com ; tchou
movh %micro_com, r0 ; no micro by default
// dsw r0,micro_com ; 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
#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
addi r9,32
decim_interp_coef:
#else
;******* load the 4 sets of filter coefficients ********************
; movi StartAddrHigh, 0x40 ; read from ROM
movi StartAddrHigh, DataSeg ; read from DRAM 10-13-98
movi ByteSize,0xfe ; 128 coefficients in total
movi ByteLocal, local_rate_filter
dmabr ratefilt ; adress in ROM of the rate filter
#endif //EFFECT
#if 1
;*******************************************************************
;********** init of echo *******************************************
;********** init buffers in DRAM to zero ***************************
movi AGRAdr0, 0x1000
movi AGRInc0, 0x2
movi AGRSiz0, 0xffff
movi r0, 1403
movi r1, 0x0
buffer_init:
movhf i0, r1
subi r0, 0x1
#ifdef EFFECT
bne buffer_init
#else //EFFECT
bnz buffer_init
#endif //EFFECT
#ifdef EFFECT
movi DMASize, 31
movi r0, 0x1000>>2
movi r1, HBASE>>2
loop 22, init_HBASE //704 words
mov LocalAddr, r0
dmawr r1
WaitDma
addi r0, 32
addi r1, 32
init_HBASE:
#else //EFFECT
; movi StartAddrHigh, 0x7
movi StartAddrHigh, DataSeg // 10-13-98
movi ByteSize, 0xaf4
movi ByteLocal, 0x1000
dmabw HBASE
#endif //EFFECT
;********** init of gain coefficients ******************************
movi r0, 13107
movh %g1, r0 ; NAP1
movh %g4, r0 ; NAP3
movi r0, 19661
movh %g2, r0 ; NAP2
movi r0, 9830
movh %g3, r0 ; OAP1
movi r0, 3277
movh %g5, r0 ; OAP2
movi r0, 1000 ; default value of feedback gain
movh %FBgain, r0
;********** init of the lowpass filter (feedback)*******************
#ifdef EFFECT
movi LocalAddr, LPFB>>2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -