📄 me.s
字号:
.include "Karaoke_def.h"
.if KARAOKE_MIC_ECHO_SUPPORTED == 1
.extern DelayFactor_me
.extern DecayFactor_me
.extern _DelayCount
.extern XDelayBuf_me
.extern YDelayBuf_me
.extern InScale, MixScale_me
.extern DelayCount_me
.extern _s0_base_ptr_pscon
.extern mi_output
.extern Echo_gain_me
.extern LowpassBuf_me
.extern Coeff_lpf_me
.extern noisecount
sec_MicEchoCode section code, AFTERADDR POST_CODE_BASE
sec_MicEchoCode
_MicEcho::
// Add EJY===============================================================
push a12, a14
push a8, a9
push r0, r1
push r2, r3
push r5, r6
push r4, r7
// ======================================================================
eld sd0 ,#0x1010
eld sd3 ,sd0
ldb r0, @[a11+ME_Init]
cmp eq, r0, #0
brf %f1
eld c, #0
ld r6, #3200
eld rp0, #XDelayBuf_me
bnzd r6, $
eld @rp0+d1, c
ld r0, #1
ldb @[a11+ME_Init], r0
%1:
// Add EJY===============================================================
ldw r4, @[a10+iPOST_MIC_CENTER]
ld r7, #0x80
sub r7, r4 ;r7 = difference
ldw r4, @[a10+iPOST_MIC_VARIATION]
ld r12, #0x80
ld r8, #0x80
sub r12, r4
add r8, r4
// ======================================================================
ldb r1, @[a11+ME_Onoff]
cmp eq, r1, #0
brt No_Echo
eld c, #0
ldb r0, @[a11+ME_delay] // Delay
eld rp3, #DelayFactor_me
ecld c, r0
erpn rp3, c
eld d, @rp3 ;m
ecld r5, d
sub r5, #1
ldb r0, @[a11+ME_decay] // Decay
ecld c, r0
eld rp3, #DecayFactor_me
erpn rp3, c
eld y1, @rp3 ;g
ldb r0, @[a11+ME_gain] ;echo gain
ecld c, r0
eld rp3, #Echo_gain_me
erpn rp3, c
eld a, @rp3
eld MixScale_me+1, a
ld a9, #StartAddress_Xmem_Calm
ld r9, #DelayCount_me
sl r9
ldw r1, @[a9]
ecld c, r1
eld rp0, #XDelayBuf_me
erpn rp0, c
eld rp2, #YDelayBuf_me
erpn rp2, c
eld rp1, #mi_output
eld rp3, #MixScale_me
esd0 s0, #0
esd0 d0, #1
esd2 s0, #0
esd2 d0, #1
esd1 d0, #1
esd3 s0, #1
esd3 s1, #-1
ebk #1111b
// Add EJY For reduce noise==============================================
eld rp1, #noisecount
eld c, @rp1+s0
ecld r0, c
// ======================================================================
eld rp1, #0x7ffe
eld rp0, #LowpassBuf_me ;delay buffer
eld rp3, #Coeff_lpf_me ;coefficient
esd0 s0, #1
esd0 s1, #-1
esd0 d0, #1
esd0 d1, #-1
esd3 s0, #1
esd3 s1, #-2
esd1 s0, #0
ld r6, #110
loop:
ebk #1111b
eld a, @rp1+s0 ;input
esra8 a
// Add EJY For reduce noise==============================================
ecld r4, a
add r4, r7 ;r7 = difference
cmp ge, r4, r8
brt valid_value
cmp ge, r12, r4
brt valid_value
add r0, #1
bra valid_checkend
valid_value:
ld r0, #0
valid_checkend:
cmp ge, r0, #20
brf noreset
ld r4, #0x80
ld r0, #21
noreset: //Overflow check====================
cmp ge, r4, #0x100
brf checkunder
ld r4, #0xFF
bra startecho
checkunder:
cmp ge, r4, #0
brt startecho
ld r4, #0
startecho:
ecld a, r4
// ======================================================================
eadd a, #0x80
esla8 a
esla8 a
eld b, a
esra b ;half
eld x1, a ;x(n)
/* low pass filter */
eld y0, @rp3+s0
emul x1y0, x0, @rp0+s0, y0, @rp3+s0
emld ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
emad ma0, x0y0
esub ma0, p
eld @rp0+d0, x1 //x(n-1)
eld @rp0+d1, ma0 //y(n-1)
ebk #0000b
eld x0, @rp2+s0 ;y(n-m)
emul x0y1 ;g*y(n-m)
eld x0, ma0
emld ma1, x0y1 ;g*x(n)
esub ma1, p
eld p, @rp0+s0 ;x(n-m)
eadd ma1, p ;y(n)
eld @rp0+d0, ma0
eld @rp2+d0, ma1
eld x0, b
eld x1, ma1
eld y0, @rp3+s0
emul x0y0, y0, @rp3+s1
emld ma0, x1y0
eadd ma0, p
esla ma0
cmp eq, r1, r5
brfd %f1
add r1, #1
eld rp0, #XDelayBuf_me
eld rp2, #YDelayBuf_me
ld r1, #0
%1:
; esra ma0 //Change EJY
dt r6
brfd loop
eld @rp1+d0, ma0
// Add EJY For reduce noise==============================================
eld rp1, #noisecount
ecld c, r0
efz8 c
eld @rp1+d0, c
// ======================================================================
eld sd0 ,#0x1010
eld sd1 ,sd0
eld sd2 ,sd0
eld sd3 ,sd0
bra loop_end
No_Echo:
// Add EJY For reduce noise==============================================
eld rp1, #noisecount
eld c, @rp1+s0
ecld r0, c
// ======================================================================
eld rp1, #0x7ffe
eld rp3, #mi_output
ld r6, #110-1
loopNo:
eld a, @rp1+s0 // MIC1
esra8 a
// Add EJY===============================================================
ecld r4, a
add r4, r7 ;r7 = difference
cmp ge, r4, r8
brt valid_valueNo
cmp ge, r12, r4
brt valid_valueNo
add r0, #1
bra valid_checkendNo
valid_valueNo:
ld r0, #0
valid_checkendNo:
cmp ge, r0, #20
brf noresetNo
ld r4, #0x80
noresetNo:
ecld a, r4
// ======================================================================
eadd a, #0x80
esla8 a
esla8 a
bnzd r6, loopNo
eld @rp3+d1, a
// Add EJY For reduce noise==============================================
eld rp1, #noisecount
ecld c, r0
efz8 c
eld @rp1+d0, c
// ======================================================================
loop_end:
ldw @[a9], r1 ;save
ldw r1, @[a13+rSBL0OFF+0]
ldw r0, @[a13+rSBL0OFF+2]
ldw r5, @[a10+iPOST_MIC_IN_BUF_START_PTR+2]
cmp eq, r0, r5
brt buffer_start_point
sub r0, #1
ldw @[a13+rSBL0OFF+2], r0
ld r5, #SBF0_FILL
ldw @[a13 + rSBFCON], r5
ld r5, r0
and r5, #0x3
cmp eq, r5, #0
brt buffer_start_point
eld rp1, #0x7ffe
eld a, @rp1+s0 // MIC1
//======================================================================For Simulator
/* ldw r2, @[a10+iPOST_MIC_IN_BUF_END_PTR+2]
cmp eq, r0 ,r2
brf No_bufferend
ldw r0, @[a10+iPOST_MIC_IN_BUF_START_PTR+2]
ldw @[a13+rSBL0OFF+2], r0
; ld r0, #SBF0_FILL
; ldw @[a13 + rSBFCON], r0
No_bufferend:
*/
//===================================================================================
buffer_start_point:
ldw @[a10+iPOST_MIC_IN_BUF_RD_PTR+0], r1
ldw @[a10+iPOST_MIC_IN_BUF_RD_PTR+2], r0
; pop r1
; ldw @[a13+rCONFIG0], r1
// Add EJY===============================================================
pop r7, r4
pop r6, r5
pop r3, r2
pop r1, r0
pop a9, a8
pop a14, a12
// ======================================================================
ret
.ifndef KARAOKE_MIC_ECHO_SUPPORTED
.extern |ME_MEM$$me_coeff$$LOAD|
.extern |ME_MEM$$me_coeff$$SIZE|
.extern |ME_MEM$$me_coeff$$START|
load_me_coeff section code
load_me_coeff
_load_me_coeff::
push R4, R6
push A11, A12
push A13
ld R6, #|ME_MEM$$me_coeff$$SIZE|
sub R6, #1
ld A11, #|ME_MEM$$me_coeff$$LOAD|
ld A12, #0x220000+(StartAddress_Ymem_Mac-0x8000)*2
ld A13, #0x220000+(StartAddress_Ymem_Mac-0x8000)*2 + 0x10000
ldc R4, @A11
%1
push R4
srb R4
ldb @[A13+1], R4
pop R4
and R4, #0x00ff
ldb @[A12+0], R4
add A11, #2
add A13, #2
ldc R4, @A11
push R4
srb R4
ldb @[A12+1], R4
pop R4
and R4, #0x00ff
ldb @[A13+1], R4
add A11, #2
add A12, #2
add A13, #2
ldc R4, @A11
ldw @[A12+0], R4
add A11, #2
add A12, #2
sub R6, #1
bnzd R6, %b1
ldc R4, @A11
pop A13
pop A12, A11
pop R6, R4
ret
_clr_me_buf::
push r6
esd1 d0, #1
eld a, #0
ld r6, #1600-1
eld rp1, #XDelayBuf_me
bnzd r6, $
eld @rp1+d0, a
ld r6, #1600-1
eld rp1, #YDelayBuf_me
bnzd r6, $
eld @rp1+d0, a
ld r6, #1-1
eld rp1, #DelayCount
bnzd r6, $
eld @rp1+d0, a
pop r6
ret
.endif /* ifndef KARAOKE_MIC_ECHO_SUPPORTED */
.endif /* if KARAOKE_MIC_ECHO_SUPPORTED == 1 */
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -