📄 test.s
字号:
rndhf i1,r2
spkfon_vol_adj:
movi DcacheBase, DataSeg
#endif
/*===================================================================================*\
** record
\*-----------------------------------------------------------------------------------*/
#ifdef ENABLE_REREAD
nop
jsr r11,SUB_record
nop
jsr r11,SUB_play // first do record
nop
#if 0
movi AGRAdr0, 0
movi AGRSiz0, 0xffff
nop
movi r0,0
loop 0,clear_pcm_data1
mov a0(4),r0
nop
nop
clear_pcm_data1:
nop
#endif
#endif /* ENABLE_REREAD */
//====================================================================================
;******* do the decimation of the input micro phone sequence **********
jsr r11, SUB_presence
;******* Automatic Voice Following ************************************
.extern AVF_CMD_BUF
movi DcacheBase, MEM_SEG
nop
dlw r0,AVF_CMD_BUF
movh r1,%energy_indicator
tsti r0,0
beq avf_done
tsti r1,0
beq avf_done
movi AGRAdr0, 0x0
movi AGRInc0, 0x4
movi AGRSiz0, 0xffff
movi AGRAdr1, 0x2
movi AGRInc1, 0x4
movi AGRSiz1, 0xffff
andi r1,r0,CMD1_AVF_LR_ON
tsti r1,CMD1_AVF_LR_ON
bne chk_avf_left_channel
// AVF_LR_ON: clear L & R
movi r1,0
loop 256,avf_LR_zero
movhf i0,r1
movhf i1,r1
avf_LR_zero:
j avf_done
chk_avf_left_channel:
andi r1,r0,CMD1_AVF_L_ON
tsti r1,CMD1_AVF_L_ON
bne chk_avf_right_channel
// AVF_L_ON: copy R to L
loop 256,avf_R_2_L
movhf r1,i1
movhf i0,r1
avf_R_2_L:
j avf_done
chk_avf_right_channel:
andi r1,r0,CMD1_AVF_R_ON
tsti r1,CMD1_AVF_R_ON
bne avf_done
// AVF_R_ON: copy L to R
loop 256,avf_L_2_R
movhf r1,i0
movhf i1,r1
avf_L_2_R:
avf_done:
//------------- HW_ECHO? ---------------------------------------------
movi DcacheBase,MEM_SEG
nop
nop
dlw r0,USER_ICFG
nop
andi r0,ICFG_HWECHO_MASK
tsti r0,ICFG_HWECHO_MASK
// beq total_echo_done
bne clear_micro_done
movi AGRAdr4, local_micro_44
movi AGRInc4, 0x2
movi AGRSiz4, 0xffff
movi AGRAdr5, local_DL1FB
movi AGRInc5, 0x2
movi AGRSiz5, 0xffff
movi r0,0
loop 256,clear_micro_done1
mov a4(4),r0
clear_micro_done1:
nop
loop 32,clear_micro_done
mov a4(4),r0
clear_micro_done:
//--------------------------------------------------------------------
;******* 3D spatializer ***********************************************
;******* test if some echo is required ********************************
movhf r0, %echo_com ;tchou
tstsi r0, 0x0
blte echo_mixing_done2 ; if no echo is required do nothing
// blt echo_mixing_done ; if no echo is required do nothing
;******* do the echo **************************************************
//------------- bypass reverb ? --------------------------------------
movi DcacheBase,MEM_SEG
nop
nop
dlw r0,USER_ICFG
nop
andi r0,ICFG_REVERB_BYPASS_MASK
tsti r0,ICFG_REVERB_BYPASS_MASK
beq no_reverb
//--------------------------------------------------------------------
jsr r11, SUB_echo
nop
no_reverb:
;******* perform the rate conversion on the microphone input **********
jsr r11, SUB_rate
movi DcacheBase, DataSeg
;****** add the echo to the direct input and mix with audio ***********
movi AGRAdr4, local_micro_44
movi AGRInc4, 0x2
movi AGRSiz4, 0xffff
movi AGRAdr5, local_micro_out
movi AGRInc5, 0x2
movi AGRSiz5, 0xffff
movi AGRAdr0, 0x0
movi AGRInc0, 0x2
movi AGRSiz0, 0xffff
// movi r3, 0x7fff
li r3,0x007fffff
li r4,0x007fffff
#if 0
dlw r5,mic1_vol ;mic1 (R) volume
dlw r4,mic2_vol ;mic2 (L) volume
tst r5,r4
blt get_higher_gain ;r4 has higher gain
mov r4,r5
get_higher_gain:
#endif
loop 256, add_echo
mulhf r0, r3, a0(0) ; left audio signal
maddhf r0, r4, a5(0) ; presence (left=right)
nop
rndhf i0, r0 ; left channel=L+0.75*(L-R)^echo
mulhf r0, r3, a0(0) ; right audio signal
// msubhf r0, r4, i5 ; presence (left=right)
maddhf r0, r4, i5 ; ZhangWei:R=R+echo
nop
rndhf i0, r0 ; right channel=R-0.75(L-R)^echo
add_echo:
;******* enable interrupt *******************
movi TrapReg, 0x24
j echo_mixing_done //remove later
echo_mixing_done2:
;******* if no echo is required, just mix microphone with audio data **
#if MICRO
mixing_no_echo:
movi AGRAdr0, 0x0
movi AGRInc0, 0x2
movi AGRSiz0, 0xffff
#ifdef EFFECT
movi AGRAdr4, local_micro_44
movi AGRInc4, 0x2
movi AGRSiz4, 0xffff
#else //EFFECT
movi AGRAdr2, local_micro_44
movi AGRInc2, 0x2
movi AGRSiz2, 0xffff
#endif //EFFECT
li r2,0x007fffff ;7fffff
li r3,0x005fffff ;2fffff
loop 256, mic_mix_no_echo
#ifdef EFFECT
mulhf r0, r2, a0(0)
//tchou maddhf r0, r2, i4
//-------------------------------------------
tsti r15,FLAG_LS128
bne not_ls128_mix1
maddhf r0, r3, a4(0)
j not_ls128_mix1_done
not_ls128_mix1:
maddhf r0, r3, i4
not_ls128_mix1_done:
//-------------------------------------------
nop
#else //EFFECT
mulhf r0, r2, a0(0)
maddhf r0, r2, i2
#endif //EFFECT
rndhf i0, r0 ; mix left
#ifdef EFFECT
mulhf r0, r2, a0(0)
//tchou maddhf r0, r2, i4
//-------------------------------------------
tsti r15,FLAG_LS128
bne not_ls128_mix2
maddhf r0, r3, a4(4)
j not_ls128_mix2_done
not_ls128_mix2:
maddhf r0, r3, i4
not_ls128_mix2_done:
//-------------------------------------------
nop
#else //EFFECT
mulhf r0, r2, a0(0)
maddhf r0, r2, i2
#endif //EFFECT
rndhf i0, r0 ; mix right
mic_mix_no_echo:
;******* enable interrupt *****************
; movi TrapReg, 0x24
; nop
echo_mixing_done:
nop
total_echo_done:
#if 0
;******* synchronise the microphone buffer, even no micro input *******
;******* read the microphone command : micro or not *******************
movhf r0, %micro_com ;tchou
// dlw r0,micro_com
// nop
tstsi r0, 0x0
bgte mic_sync_done ; if micro is required, sync is done
movh r0, %mic_data_ptr ; read the current address of pointer
;******* update the microphone read pointer ***************************
addi r0, 0x400
tsti r0, MIC_BUF_END_B
blt no_micro_sync_wrap
subi r0, MIC_BUF_SIZE_B
no_micro_sync_wrap:
nop
movh %mic_data_ptr, r0
mic_sync_done:
#endif
#endif //MICRO
//*********************************************************
#if AUTO_MUTE
jsr r11,SUB_Automute
#endif
//*********************************************************
#endif //?
;******* load a new sequence in PCM_OUT *******************************
//done in pcm_pcm jsr r11, pcm_load
;******* return to main routine ***************************************
j r27 //return
;******* end of pcm_out routine ***************************************
;**********************************************************************
//-------------------------------------------------------------------
SUB_read_data:
dlw r0, Stream_Rd_Ptr
dlw r1, Stream_End
dlw r2, Stream_Start
movi r3, local_FApcm_buf_word ; word addr
movi DMASize, 31 ;32 words each block
movi BlockSkip, 0
movi BlockSize, 0 ;block size = 1.
shr r0, 2 //to word addr
loop 8, Lget_data
mov LocalAddr, r3
dmarr r0 ;read data from DRAM
wait_dma_21: bdb wait_dma_21
addi r3, 32 ;32 words each block
addi r0, 32
Lget_data:
shl r0, 2 //back to byte addr
tst r0, r1
blt Lno_wrap
mov r0, r2 //wraping to start
Lno_wrap:
dsw r0, Stream_Rd_Ptr //update Rd_Ptr
// update block count
movb r1,LBblknum
addi r1,1
tsti r1, 6
blte blk_ok
movi r1,1 ; starts with 1
blk_ok:
movb LBblknum,r1
j r27 //return
//*********************** Mic auto_mute for LS128 ******************
//ZhangWei:for ls128,L = R
#if 1
SUB_automute_mic:
movi DcacheBase, MEM_SEG
mov r7,AGRSiz0
movi AGRAdr0,local_micro_44
movi AGRSiz0,0xffff
movi AGRInc0,2
dlh r3,mute_num_mic
nop
// movhf r6,%dc_offset_44
dlw r6,dc_offset_44
nop
tsti r3,0xa
beq dcoff44
loop 256,dcoff44
movhf r2,a0(4)
sub r2,r6
shra r2,11
add r6,r2
dcoff44:
nop
movi AGRAdr0,local_micro_44
movi AGRSiz0,0xffff
movi r1,0
loop 256,test_mute_mic
movhf r2,a0(4)
sub r2,r6
abs r2,r2
shr r2,8
// dsw r2,0xff90 //debug
tsti r2,0x1000
blt tst_m0_mic
movi r1,1
tst_m0_mic:
nop
test_mute_mic:
// movhf %dc_offset_44,r6
dsw r6,dc_offset_44
tsti r1,0
beq add_mute_num_mic
movi r0,0
dsh r0,mute_num_mic
j test_mute_end_mic
add_mute_num_mic:
dlh r0,mute_num_mic
nop
nop
addi r0,1
tsti r0,0xa
bgt mute_mic
dsh r0,mute_num_mic
j test_mute_end_mic
mute_mic:
movi AGRAdr0,local_micro_44
movi AGRSiz0,0xffff
nop
loop 256,mute_mic_done
movhf a0(2),r6 //mute
movhf a0(2),r6 //mute
nop
mute_mic_done:
movi r0,0xa
dsh r0,mute_num_mic
test_mute_end_mic:
nop
mov AGRSiz0,r7 //recover AGRSize0, if not, echo not work
j r11
nop
nop
#endif
//*************************** automute *****************************
//ZhangWei:for VCD test Disc
#if AUTO_MUTE
SUB_Automute:
movi DcacheBase, MEM_SEG
// mov AGRAdr0,r3
movi AGRAdr0,0x0
movi r1,0
loop 256,test_mute
mov r0,a0(4)
shra r2,r0,16
shl r0,16
shra r0,16
abs r0,r0
abs r2,r2
// tsti r0,3
tsti r0,0x10
bgt tst_m0
// tsti r2,3
tsti r2,0x10
bgt tst_m0
j tst_m1
tst_m0:
movi r1,1
tst_m1:
nop
test_mute:
tsti r1,0
beq add_mute_num
movi r0,0
dsh r0,mute_num
#if 1
rlwi r0,0x44>>2
nop
nop
ori r0,0x1000
rswi r0,0x44>>2
#endif
j test_mute_end
add_mute_num:
dlh r0,mute_num
nop
addi r0,1
nop
tsti r0,0x20
bgt send_mute_msg
dsh r0,mute_num
j test_mute_end
send_mute_msg:
#if 1
rlwi r0,0x44>>2
nop
nop
andi r0,0xefff
rswi r0,0x44>>2
#endif
movi r0,0x20
dsh r0,mute_num
test_mute_end:
nop
j r11
#endif
//********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -