📄 test.s
字号:
addh r3, %Length
#ifdef EFFECT
movh r19,%CSEARCH_END
tst r3,r19
#else //EFFECT
tsth r3, %CSEARCH_END; test if the time is right to update
#endif //EFFECT
bne normal ; do not do anything yet
; do the first part of the windowing
movi AGRAdr0,window0 ; ptr on window, decrement
movi AGRSiz0, 0xffff ; linear buffer
movi AGRInc0, 0xfffe ; Decrement
nop ; work around for interrupt bug
nop ; work around for interrupt bug
mov AGRAdr1, r7 ; ptr on output sequence
movi AGRSiz1, 0xffff ; linear buffer
movi AGRInc1, 2*2 ; increment: skip on channel on two
#ifdef EFFECT
mov AGRAdr4, r6 ; a4 = pos1+N+deltap+0x1000
movi AGRSiz4, 0xffff ; linear buffer
movi AGRInc4, 1*2 ; increment of one sample
#else //EFFECT
mov AGRAdr2, r6 ; a2 = pos1+N+deltap+0x1000
movi AGRSiz2, 0xffff ; linear buffer
movi AGRInc2, 1*2 ; increment of one sample
#endif //EFFECT
;**************************************
;***** deseable interrupt mask ********
movi TrapReg, 0x0
nop
nop
;**************************************
;**************************************
loop 128, first_part_window
#ifdef EFFECT
mulhf r0, i0,i4
nop
rndhf i1, r0
mulhf r0, i0,i4
nop
#else //EFFECT
mulhf r0, i0,i2
rndhf i1, r0
mulhf r0, i0,i2
#endif //EFFECT
rndhf i1, r0
first_part_window:
;**************************************
;***** enable interrupt mask **********
movi TrapReg,0x24
;**************************************
;**************************************
; store the value of r5 needed for the 2nd windowing before calling search
movh %temp, r5
;****** load the value of NDec, NLength, NNb, (NNb-1)*NLength ********
;****** depending on the value of key ********************************
movh r1,%keyshift_com; read the new command
; movi StartAddrHigh, 0x40 ; read from ROM
movi StartAddrHigh, DataSeg ; read from DRAM 10-13-98
movh %Nkey_value, r1 ; key2=0
multi r1, 8 ; computing the offset in the table
#ifdef EFFECT
movi DMASize, 1 ; 2 words to load
movi LocalAddr, NDec>>2 ; set the location in local memory
addi r1, table
shr r1, 2
dmarr r1
WaitDma
#else //EFFECT
movi ByteSize, 6 ; (4-1)*2, 4 data to load
movi ByteLocal, NDec ; set the location in local memory
addi r1, table
dmabrr r1
#endif //EFFECT
movh r1, %NLength
tstsi r1, 256*2
blt Npos1_N ; if length >=N, pos1=N
movi r0,256*2
movh %Npos1,r0 ; Npos1=N
j Npos1_3N
Npos1_N:
movi r0,384*2
movh %Npos1, r0 ; Npos1=3*N/2
Npos1_3N:
; modifies the current local search buffer, and load in DRAM the new sequence
; r3 is needed by the subroutine
movh r3, %Csearch_ptr
jsr r11, SUB_search_update
; do the second part of the windowing
movi r6, 0x7fff
movh r5, %temp
#ifdef EFFECT
mov AGRAdr5, r5 ; a3 = pos1+length+deltac+0x1000
movi AGRInc5, 1*2 ; increment of one sample
movi AGRSiz5, 0xffff ; linear buffer
#else //EFFECT
mov AGRAdr3, r5 ; a3 = pos1+length+deltac+0x1000
movi AGRInc3, 1*2 ; increment of one sample
movi AGRSiz3, 0xffff ; linear buffer
#endif //EFFECT
mov AGRAdr1, r7
movi AGRInc1, 2*2 ; increment: skip on channel on two
movi AGRSiz1, 0xffff ; linear buffer
movi AGRAdr0, window1; ptr on window, increment
movi AGRInc0, 0x2 ; increment by one
movi AGRSiz0, 0xffff ; linear buffer
;**************************************
;***** desable interrupt mask **********
movi TrapReg, 0x0
nop
nop
;**************************************
;**************************************
loop 128, end_of_second_window
#ifdef EFFECT
mulhf r0, i0,i5
maddhf r0, r6, a1(0)
nop
#else //EFFECT
mulhf r0, i0,i3
maddhf r0, r6, a1(0)
#endif //EFFECT
rndhf i1, r0
#ifdef EFFECT
mulhf r0, i0,i5
maddhf r0, r6, a1(0)
nop
#else //EFFECT
mulhf r0, i0,i3
maddhf r0, r6, a1(0)
#endif //EFFECT
rndhf i1, r0
end_of_second_window:
;**************************************
;***** enable interrupt mask ********
movi TrapReg, 0x24
;**************************************
;**************************************
; update the current end of search buffer in DRAM, and the search_ptr
movh r1,%CSBUF_START ; r1 = start @ of current search buffer
addh r0, r1,%NNb_1 ; r0 = end @ of current search buffer
movh r2, %pos1
addh r2, %Cdeltap
addi r2, 0x1200 ; r2 =Cgoal_start=pos1+Cdeltap+N+0x1000
; tests which channel is being processed
tsti r12, 0x1
bne right11
movh %LSEARCH_END, r0; update the left end of search in DRAM
movh %Lsearch_ptr, r1; update the Lsearch_ptr
movh %Lgoal_start, r2; update the start @ of goal in left search
j end_of_key_change
right11:
movh %RSEARCH_END, r0; update the right end of search in DRAM
movh %Rsearch_ptr, r1; update the Rsearch_ptr
movh %Rgoal_start, r2; update the start @ of goal in right search
;;;; update Length, Nb, pos1,Nb_1 since both channels have been processed
movh r0, %Nkey_value
movh %key_value, r0
movh r0, %NDec
movh %Dec, r0 ; update Dec for the filtering
movh r0, %NNb
movh %Nb,r0 ; update Nb
movh r0, %NLength
movh %Length, r0 ; update Length
movh r0, %Npos1
movh %pos1, r0 ; update pos1
movh r0, %NNb_1
movh %Nb_1, r0 ; update Nb_1
;;; update sizes of search buffer in local memory
addi r1, r0, 0x1000
movh %localsearch_ptr, r1
;;; update the value of the key
movi r0, 0x0
movh %key_change, r0 ; reset the key_change to zero
;;; update the value of registers r8, r9, r10
movh r10, %Nb ; r10=Nb
movh r9, %Dec ; r9 = Dec
movh r8, %Length ; r8 = Length
;;; update the value of count, not to go through search init again !!!!
movh %count, r10
;;;;;; end of the key-change ;;;;;;;;
;;;;;; debug ;;;;;;;
mov r0, TrapReg
movi r1, 0xc260
; dshr r0, r1
j end_of_key_change
normal:
;*********************************************************************
;******* PERFORM WINDOWING ONLY IF KEYSHIFT IS REQUIRED **************
;*********************************************************************
movi r1,Key_default ; no keyshift required
#ifdef EFFECT
movh r19,%key_value
tst r1,r19
#else //EFFECT
tsth r1, %key_value
#endif //EFFECT
beq done_window
//debug
// j done_window
;******* jump to subroutine window ***********************************
;******* interrupt mask is desabbled within the subroutine ***********
jsr r11, SUB_ster_windowing
done_window:
;****** wrap search pointer if necessary *****************************
movh r3, %Csearch_ptr
#ifdef EFFECT
movh r19,%CSEARCH_END
tst r3,r19
#else //EFFECT
tstsh r3, %CSEARCH_END
#endif //EFFECT
blt not_wrapped3
movh r3, %CSBUF_START
not_wrapped3:
;****** save current sequence (length) in search buff in DRAM ********
; movi StartAddrHigh, 0x7
movi StartAddrHigh, DataSeg // 10-13-9
#ifdef EFFECT
movh r4, %localsearch_ptr ; r13 modif
shr r4, 2
shr r1, r8, 2 ; size of the dma transfer in words
andi r0, r1, 0x1f ; remainder of 32-word block
shr r1, 5 // integer blocks of 32-word
movi DMASize, 31 ; 32-word each block
shr r3, 2
loop r1, transfer_buf3
mov LocalAddr, r4
dmawr r3
WaitDma
addi r4, 32
addi r3, 32
transfer_buf3:
tsti r0,0
beq Lno_extra_1
subi r19,r0,1 //-1 for dma
mov DMASize, r19 //remainder
mov LocalAddr, r4 ; @ in local mem of decimated seq
dmawr r3
WaitDma
Lno_extra_1:
add r4, r0
add r3, r0 //inc ptrs
shl r4, 2 //restore for later use
shl r3, 2
#else //EFFECT
mov r1, r8
subi r1, 2 ; r1=length-2= size of the transfert
mov ByteSize,r1 ; size of transfert =length samples
movh r4, %localsearch_ptr ; r13 modif
mov ByteLocal,r4 ; sets the location in local memory
dmabwr r3 ; initiate the DMA transfert.
#endif //EFFECT
;******* increments the pointer on DRAM search buffer ****************
ptr_increment3:
#ifndef EFFECT //already done above
add r3, r3, r8 ; search_ptr=search_ptr +length
#endif //EFFECT
movh %Csearch_ptr, r3
;******* update the start @ of the goal in the current search buffer**
movh r2, %pos1
addh r2, %Cdeltap
addi r2, 0x1200 ; r2 =Cgoal_start=pos1+Cdeltap+N+0x1000
tsti r12, 0x1
bne right12
movh %Lgoal_start,r2 ; update the @ of goal in left search buffer
#ifdef EFFECT
tsti r3,LSBUF_END
blt Left_ok3
subi r3,0x1000 //wraping
Left_ok3:
#endif //EFFECT
movh %Lsearch_ptr,r3 ; update the pointer in left search buffer
j end_of_key_change
right12:
movh %Rgoal_start,r2 ; update the @ of goal in right search buffer
#ifdef EFFECT
tsti r3,RSBUF_END
blt Right_ok3
subi r3,0x1000 //wraping
Right_ok3:
#endif //EFFECT
movh %Rsearch_ptr,r3 ; update the pointer in right search buffer
end_of_key_change:
;;;;;;; debug ;;;;;;
mov r0, TrapReg
movi r1, 0xc2d0
; dshr r0, r1
;******* common part even if key has just been changed ***************
;******* test which channel is being processed ***********************
tsti r12, 0x1
bne right10
;******* save the current registers in left channel ******************
movh r3, %Cdeltap
movh %Ldeltap, r3
;******* update left_right *******************************************
movi r12, 0x0
movh %left_right, r12
;******* update registers to process right channel *******************
movi r0, Rhistory ; right channel
movi r1, Rhist_point
movi r2,localA_data+2; right channel start at localA_data
// movi r2,0x1300+2
movh %Cinput_adr, r2
movh r3, %Rgoal_start
movh %Cgoal_start, r3; load @ of goal in right search buffer
movh r3, %Rsearch_ptr
movh %Csearch_ptr, r3; load right search ptr
movh r3, %RSEARCH_END
movh %CSEARCH_END, r3; load end of right search buffer
movi r3, RSBUF_START_low
movh %CSBUF_START,r3
movh r3, %Rdeltap ; load value of right previous delta
movh %Cdeltap, r3
;******* jump back to process right channel **************************
j right_filtering
right10:
;******* save the current registers in right channel ******************
movh r3, %Cdeltap
movh %Rdeltap, r3
run_through:
//enable trebble j r27 //debug--------------------
;********* perform the channel_select ***************************
movi AGRAdr4,localA_data ; set the point index
movi AGRAdr0,localA_data+2 ; set the point index
movi AGRSiz0, 0xffff
movi AGRSiz4, 0xffff
movi AGRInc0,0x4
movi AGRInc4,0x4
movi DcacheBase, MEM_SEG
movh r1,%channelsel ; select the r_l register
// nop
// dsw r1,0xffa0
// nop
tsti r1,1
beq channelr_l
tsti r1,2
beq channell_r
j channelout
channell_r:
loop 0,channell_rend
movhf r0,i4
movhf i0,r0
channell_rend:
j channelout
channelr_l:
loop 0,channelr_lend
movhf r0,i0
movhf i4,r0
channelr_lend:
nop
channelout:
;**********************************************************************
;******* perform the bass filtering ************************************
movh r4, %bass_com ; read the bass command
tstsi r4, 0x7 ; test if bass is required
beq bass_done
movi r5, bass_coeff ; set up routine registers: r4,r5,r14,r15
movi r14, Lu0u1 ; adress of Left bass history
movi r15, Ru0u1 ; adress of Right bass history
movi r9, 0x0
jsr r11, SUB_trebble_bass
bass_done:
;******* perform the trebble filtering *********************************
movh r4, %trebble_com ; read the trebble command
tstsi r4, 0x7 ; test if trebble is required
beq trebble_done
movi r5, trebble_coeff
movi r14, TLu0u1
movi r15, TRu0u1
tstsi r4, 0x7
bgt do_trebble2
movi r9, 0x0
jsr r11, SUB_trebble_bass
j trebble_done
do_trebble2:
movi r9, 0x1
jsr r11, SUB_trebble_bass
trebble_done:
#if (MICRO == 0)
j r27 //debug--tchou------------------
#endif
;**********************************************************************
;**********************************************************************
;******* if microphone is required, get a new sequence from micro *****
;******* get a new sequence from the microphone input *****************
#if MICRO
#ifdef EFFECT
rlwi r1,PCM_In_Current_Addr
andi r1,0xffff
movi r0,MIC_BUF_START_B ; range check in case nonexistence of hw
tst r1,r0
blt echo_mixing_done
movi r0,MIC_BUF_END_B
tst r1,r0
bgt echo_mixing_done
movh r0, %mic_data_ptr ; read the current address of pointer
tst r1,r0
bgte got_256_samples
addi r1,MIC_BUF_SIZE_B
got_256_samples:
sub r1,r0
tsti r1,0x400
blt echo_mixing_done ;wait_till_next
shr r0, 2
movi DMASize, 31 ; get 512 data (L/R)
movi StartAddrHigh, DataSeg ; read from the micro Fifo
movi r9, local_micro_44>>2
loop 8, read_micro_fifo
mov LocalAddr,r9
dmarr r0 ; read the micro block.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -