📄 echo2.s
字号:
;********************************************************************
;
; (c)1997 Copyright LuxSonor, Inc. All rights reserved
;
; Revision 1.0
;
;
; Module: AUDIO code
;
; Initial version:Cecile Foret, August 1997
; Jinshi Huang 12/1/98 for LS388/LS500
; This routine performs the rate conversion from 11kH to 44kH, for
; the microphone input.
;
; return adress to main routine: r11
; returns: none, the decimated sequence will be written in local memory
; input : r2, input adress for micro sequence
; debug information to check if ByteSize>=0
; Initially=echo.S, but do not load the input sequence required to
; do the FB
;*********************************************************************
.nolist
#include "regdef2.h"
#include "stereo_user.h"
#include "memory2.h"
.list
.data
.global SUB_echo
SUB_echo:
;************ choice of the gain factor, depending on the command *******
// movhf r0, %echo_com tchou
movh r0, %echo_com
// dlw r0,echo_com
// nop
shl r0,1
// multi r0, 0x2
addi r0, feedback_gain ; adress in DRAM
#ifdef EFFECT
dlhr r1,r0
nop
movh %FBgain,r1 //use direct access
#else //EFFECT
; movi StartAddrHigh, 0x40 ; read from ROM
movi StartAddrHigh, DataSeg ; read from DRAM 10-13-98
movi ByteSize, 0x0 ; read g1,g2
movi ByteLocal, FBgain
dmabrr r0
#endif //EFFECT
;********** load history of DL1 (x, M0=256+64) *********************
// movhf r0, %DL1_ptr tchou
movh r0, %DL1_ptr
; movi StartAddrHigh, 0x8
; movi StartAddrHigh, 0x7
movi StartAddrHigh, DataSeg // 10-13-98
#ifdef EFFECT
shr r0, 2 ; to word addr
movi DMASize, 31 //32 words (0x80 bytes)
movi LocalAddr, (local_DL1)>>2
dmarr r0
WaitDma
#else //EFFECT
movi ByteSize, 0x7e
movi ByteLocal, local_DL1
dmabrr r0
#endif //EFFECT
;********** load history of OAP1 (z, T3=64) ************************
#ifdef EFFECT
movi r0,(OAP1_START)>>2 ; to word addr
movi DMASize, 31 //32 words (0x80 bytes)
movi LocalAddr, (local_OAP1)>>2
dmarr r0
WaitDma
#else //EFFECT
movi ByteSize, 0x7e
movi ByteLocal, local_OAP1
dmabr OAP1_START
#endif //EFFECT
movi AGRAdr2, local_DL1 ; points on X/U
movi AGRInc2, 0x2
movi AGRSiz2, 0xffff
movi AGRAdr3, local_OAP1 ; points on Z/Y
movi AGRInc3, 0x2
movi AGRSiz3, 0xffff
;********** OAP1 ***************************************************
movhf r3, %g3
// movi r0, 0x7fff
li r0,0x007fffff
;******** deseable interrupt ***********
movi TrapReg, 0x0
nop
nop
loop 64, OAP1_loop
;********** update Yn **********************************************
mulhf r6, r0, a3(0) ; r6=Z(n-T3)*32767
msubhf r6, r3, a2(0) ; r6=Z(n-T3)*32767-g3*X(n)
rndhf a3(0), r6 ; Y(n)
;********** update Un **********************************************
mulhf r6, r0, a2(0) ; r6=X(n)*32767
maddhf r6, r3, i3 ; r6=X(n)*32767+g3*Y(n)
rndhf i2, r6 ; U(n)
OAP1_loop:
;********* enable interrupt *************
movi TrapReg, 1<<2
;********* NAP1 HISTORY (T(n-M1))***********************************
;********* load 64 samples of the history of NAP1 (M1=242) *********
; movi StartAddrHigh, 0x8
; movi StartAddrHigh, 0x7
movi StartAddrHigh, DataSeg // 10-13-98
// movhf r0, %NAP1_ptr ; base of the block tchou
movh r0, %NAP1_ptr ; base of the block
addi r1, r0, 0x80 ; add 64 samples
tsti r1, NAP1_END ; test if wrapping is required or not
blte no_NAP1_wrapp
; wrapping required, split the block in two pieces....
; bytes required for the second transfert=r2
#ifdef EFFECT
subi r2,r1,NAP1_SIZE+NAP1_START+4
; bytes required for the first transfert=r3
movi r3,0x78
sub r3, r2
addi r4, r3,local_NAP1+4
// do in words
shr r0,2
shr r2,2
shr r3,2
shr r4,2
//first DMA in words
mov DMASize, r3
movi LocalAddr, (local_NAP1)>>2
dmarr r0
WaitDma
//second DMA in words
movi r0,(NAP1_START)>>2
mov DMASize, r2
mov LocalAddr, r4
dmarr r0
WaitDma
#else //EFFECT
subi r2,r1,NAP1_SIZE+NAP1_START+2
; bytes required for the first transfert=r3
movi r3,0x7c
sub r3, r2
; first transfert
mov ByteSize, r3
movi ByteLocal, local_NAP1
dmabrr r0
; second transfert
addi r4, r3,local_NAP1+2
mov ByteSize, r2
mov ByteLocal, r4
dmabr NAP1_START
#endif //EFFECT
j NAP1_load_done
no_NAP1_wrapp:
; no need to wrap....
#ifdef EFFECT
shr r0,2 //in words
movi DMASize, 31 //32 words (0x80 bytes)
movi LocalAddr, (local_NAP1)>>2
dmarr r0
WaitDma
#else //EFFECT
movi ByteSize, 0x7e
movi ByteLocal,local_NAP1
dmabrr r0
#endif //EFFECT
NAP1_load_done:
;*****************************************************************************
;******** NAP1 ***************************************************************
movi AGRAdr2, local_DL1 ; points on U/T
movi AGRAdr3, local_NAP1 ; points on T/V
movhf r3, %g1
// movi r0, 0x7fff
li r0, 0x7fffff
;********** deseable interrupt ***********
movi TrapReg, 0x0
nop
nop
loop 64, NAP1_loop
;********** update Vn **********************************************
mulhf r6, r0, a3(0) ; r6=T(n-M1)*32767
msubhf r6, r3, a2(0) ; r6=T(n-M1)*32767-g1*U(n)
rndhf a3(0), r6 ; V(n)
;********** update Tn **********************************************
mulhf r6, r0, a2(0) ; r6=U(n)*32767
maddhf r6, r3, i3 ; r6=U(n)*32767+g1*V(n)
rndhf i2, r6 ; T(n)
NAP1_loop:
;********** enable interrupt **************
movi TrapReg, 1<<2
;*********************************************************************
;********* Update NAP1 history (Tn) **********************************
;********* load 64 samples of the history of NAP1 (M1=242) ***********
// movhf r0, %NAP1_ptr ; base of the block tchou
movh r0, %NAP1_ptr ; base of the block
addi r1, r0, 0x80 ; add 64 samples
tsti r1, NAP1_END ; test if wrapping is required or not
blte no_NAP1_up_wrapp
; wrapping required, split the block in two pieces....
; bytes required for the second transfert=r2
#ifdef EFFECT
subi r2,r1,NAP1_SIZE+NAP1_START+4
; bytes required for the first transfert=r3
movi r3,0x78
sub r3, r2
addi r4, r3,local_DL1+4
// do in words
shr r0,2
shr r2,2
shr r3,2
shr r4,2
//first DMA in words
mov DMASize, r3
movi LocalAddr, (local_DL1)>>2
dmawr r0
WaitDma
//second DMA in words
movi r0,(NAP1_START)>>2
mov DMASize, r2
mov LocalAddr, r4
dmawr r0
WaitDma
#else //EFFECT
subi r2,r1,NAP1_SIZE+NAP1_START+2
; bytes required for the first transfert=r3
movi r3,0x7c
sub r3, r2
; new pointer on NAP1 in DRAM=r5
; subi r5, r1, NAP1_SIZE
; first transfert
mov ByteSize, r3
movi ByteLocal, local_DL1
dmabwr r0
; second transfert
addi r4, r3,local_DL1+2
mov ByteSize, r2
mov ByteLocal, r4
dmabw NAP1_START
#endif //EFFECT
j NAP1_up_done
no_NAP1_up_wrapp:
#ifdef EFFECT
shr r0,2 //in words
movi DMASize, 31 //32 words (0x80 bytes)
movi LocalAddr, (local_DL1)>>2
dmawr r0
WaitDma
#else //EFFECT
; no need to wrap....
; mov r5, r1
movi ByteSize, 0x7e
movi ByteLocal,local_DL1
dmabwr r0
#endif //EFFECT
NAP1_up_done:
;********* update pointer on NAP1 in DRAM **************************
;********* r1=previous pointer + 0x80 ******************************
; movhf %NAP1_ptr, r5
// tstsi r1, NAP1_END tchou
tsti r1, NAP1_END
blt no_NAP1_ptr_wrap
subi r1, NAP1_SIZE ; wrap if necessary
no_NAP1_ptr_wrap:
nop
// movhf %NAP1_ptr, r1 ; update the pointer tchou
movh %NAP1_ptr, r1 ; update the pointer
;********* NAP2 HISTORY (W(n-M2))***********************************
;********* load 64 samples of the history of NAP2 (M2=91) **********
// movhf r0, %NAP2_ptr ; base of the block tchou
movh r0, %NAP2_ptr ; base of the block
addi r1, r0, 0x80 ; add 64 samples
tsti r1, NAP2_END ; test if wrapping is required or not
blte no_NAP2_wrapp
; wrapping required, split the block in two pieces....
; bytes required for the second transfert=r2
#ifdef EFFECT
subi r2,r1,NAP2_SIZE+NAP2_START+4
; bytes required for the first transfert=r3
movi r3,0x78
sub r3, r2
addi r4, r3,local_NAP2+4
// do in words
shr r0,2
shr r2,2
shr r3,2
shr r4,2
//first DMA in words
mov DMASize, r3
movi LocalAddr, (local_NAP2)>>2
dmarr r0
WaitDma
//second DMA in words
movi r0,(NAP2_START)>>2
mov DMASize, r2
mov LocalAddr, r4
dmarr r0
WaitDma
#else //EFFECT
subi r2,r1,NAP2_SIZE+NAP2_START+2
; bytes required for the first transfert=r3
movi r3,0x7c
sub r3, r2
; first transfert
mov ByteSize, r3
movi ByteLocal, local_NAP2
dmabrr r0
; second transfert
addi r4, r3,local_NAP2+2
mov ByteSize, r2
mov ByteLocal, r4
dmabr NAP2_START
#endif //EFFECT
j NAP2_load_done
no_NAP2_wrapp:
; no need to wrap....
#ifdef EFFECT
shr r0,2 //in words
movi DMASize, 31 //32 words (0x80 bytes)
movi LocalAddr, (local_NAP2)>>2
dmarr r0
WaitDma
#else //EFFECT
movi ByteSize, 0x7e
movi ByteLocal,local_NAP2
dmabrr r0
#endif //EFFECT
NAP2_load_done:
;*******************************************************************
;******** NAP2 *****************************************************
movi AGRAdr2, local_NAP1 ; points on V/W
movi AGRAdr3, local_NAP2 ; points on W/Z
movhf r3, %g2
// movi r0, 0x7fff
li r0,0x7fffff
;********** deseable interrupt *************
movi TrapReg, 0x0
nop
nop
loop 64, NAP2_loop
;********** update Zn **********************************************
mulhf r6, r0, a3(0) ; r6=W(n-M2)*32767
msubhf r6, r3, a2(0) ; r6=W(n-M2)*32767-g2*V(n)
rndhf a3(0), r6 ; Z(n)
;********** update Wn **********************************************
mulhf r6, r0, a2(0) ; r6=V(n)*32767
maddhf r6, r3, i3 ; r6=V(n)*32767+g2*Z(n)
rndhf i2, r6 ; W(n)
NAP2_loop:
;********** enable interrupt ****************
movi TrapReg, 1<<2
;********* UPDATE OAP1 and NAP2 HISTORY ****************************
;********* update the history of OAP1 (Wn) *************************
#ifdef EFFECT
movi r0,(OAP1_START)>>2 //in words
movi DMASize, 31 //32 words (0x80 bytes)
movi LocalAddr, (local_NAP1)>>2
dmawr r0
WaitDma
#else //EFFECT
movi ByteSize, 0x7e
movi ByteLocal, local_NAP2
dmabw OAP1_START
#endif //EFFECT
;********* no need to update the pointer in DRAM of OAP1 ***********
;********* update the history of NAP2 ******************************
// movhf r0, %NAP2_ptr ; base of the block tchou
movh r0, %NAP2_ptr ; base of the block
addi r1, r0, 0x80 ; add 64 samples
tsti r1, NAP2_END ; test if wrapping is required or not
blte no_NAP2_up_wrapp
; wrapping required, split the block in two pieces....
; bytes required for the second transfert=r2
#ifdef EFFECT
subi r2,r1,NAP2_SIZE+NAP2_START+4
; bytes required for the first transfert=r3
movi r3,0x78
sub r3, r2
addi r4, r3,local_NAP1+4
// do in words
shr r0,2
shr r2,2
shr r3,2
shr r4,2
//first DMA in words
mov DMASize, r3
movi LocalAddr, (local_NAP1)>>2
dmawr r0
WaitDma
//second DMA in words
movi r0,(NAP2_START)>>2
mov DMASize, r2
mov LocalAddr, r4
dmawr r0
WaitDma
#else //EFFECT
subi r2,r1,NAP2_SIZE+NAP2_START+2
; bytes required for the first transfert=r3
movi r3,0x7c
sub r3, r2
; first transfert
mov ByteSize, r3
movi ByteLocal, local_NAP1
dmabwr r0
; second transfert
addi r4, r3,local_NAP1+2
mov ByteSize, r2
mov ByteLocal, r4
dmabw NAP2_START
#endif //EFFECT
j NAP2_up_done
no_NAP2_up_wrapp:
; no need to wrap....
#ifdef EFFECT
shr r0,2 //in words
movi DMASize, 31 //32 words (0x80 bytes)
movi LocalAddr, (local_NAP1)>>2
dmawr r0
WaitDma
#else //EFFECT
movi ByteSize, 0x7e
movi ByteLocal,local_NAP1
dmabwr r0
#endif //EFFECT
NAP2_up_done:
;********* update pointer on NAP2 in DRAM **************************
// tstsi r1, NAP2_END tchou
tsti r1, NAP2_END
blt no_NAP2_ptr_wrap
subi r1, NAP2_SIZE ; wrap if necessary
no_NAP2_ptr_wrap:
nop
// movhf %NAP2_ptr, r1 ; update the pointer
movh %NAP2_ptr, r1 ; update the pointer
;*******************************************************************
;********* load the intermediate delay between two OAP *************
#ifdef EFFECT
movi r0,(DL2_START)>>2 //in words
movi DMASize, 4 //5 words (10 samples)
movi LocalAddr, (local_DL1)>>2
dmarr r0
WaitDma
#else //EFFECT
movi ByteLocal, local_DL2
movi ByteSize, 0x12 ; 10 samples =0x14
dmabr DL2_START
#endif //EFFECT
;********* update this intermediate buffer (Yn) ********************
#ifdef EFFECT
movi r0,(DL2_START)>>2 //in words
movi DMASize, 4 //5 words (10 samples)
movi LocalAddr, ((local_DL2)>>2+32)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -