📄 test.s
字号:
subi r19,r0,1 //-1 for dma
mov DMASize, r19 //remainder
mov LocalAddr, r4 ; @ in local mem of decimated seq
dmawr r2
WaitDma
Lno_extra:
movh r2, %Csearch_ptr //restore for later use
#else //EFFECT
movh r4, %localsearch_ptr
mov ByteLocal, r4 ; @ in local mem of decimated seq
mov r1, r8
subi r1, 2 ; size of the dma transfert
mov ByteSize, r1 ; length samples to transfert
movh r2, %Csearch_ptr
dmabwr r2
#endif //EFFECT
;****** increment the pointer on the search buffer *******************
add r2,r2,r8 ; search_ptr=search_ptr + length
;****** check which channel is being processed ************************
tsti r12, 0x1
bne right1
;****** update the left_right flag ************************************
movi r12, 0x0 ; set flag to right
movh %left_right, r12
;****** save Left search_ptr ******************************************
#ifdef EFFECT
tsti r2,LSBUF_END
blt Left_ok
subi r2,0x1000 //wraping
Left_ok:
#endif //EFFECT
movh %Lsearch_ptr, r2
;****** update registers to process the right channel *****************
movi r0, Rhistory ; right channel
movi r1, Rhist_point
movi r2,localA_data+2; right channel start at localA_data+2
movh r3, %Rsearch_ptr
movh %Csearch_ptr, r3
j channel2
right1:
;****** save right search_ptr *****************************************
#ifdef EFFECT
tsti r2,RSBUF_END
blt Right_ok
subi r2,0x1000 //wraping
Right_ok:
#endif //EFFECT
movh %Rsearch_ptr, r2
;****** increment counter *********************************************
movh r1, %count
addi r1, 1
movh %count, r1
;****** output 512 zeros samples (256 left and right) ****************
movi AGRAdr1, 0x0
movi AGRInc1, 0x2
movi AGRSiz1, 0x3fe
movi r1, 0x0
;**************************************
;***** deseable interrupt mask ********
movi TrapReg, 0x0
nop
nop
;**************************************
;**************************************
j r27 //debug--------------------
loop 0, generate_zeros
movhf i1, r1 ; left
movhf i1, r1 ; right
generate_zeros:
;**************************************
;***** enable interrupt mask **********
movi TrapReg, 0x24
;**************************************
;**************************************
//done in pcm_pcm jsr r11, pcm_load
j r27 //return
search_init_end:
;******* main part of the correlation *******************************
;******* do the filtering *******************************************
;************ load left_right flag = r12 ****************************
movi r12, 0x1 ; first process left channel
movi r0, Lhistory ; left channel
movi r1, Lhist_point
movi r2, localA_data ; left channel start at localA_data
// movi r2, 0x1300
movh %Cinput_adr, r2
movh r3, %Lgoal_start
movh %Cgoal_start, r3; start @ of goal in left search
movh r3, %Lsearch_ptr
movh %Csearch_ptr, r3; load left search ptr
movh r3, %LSEARCH_END
movh %CSEARCH_END, r3; load end of left search buffer
movi r3, LSBUF_START_low
movh %CSBUF_START,r3
movh r3, %Ldeltap ; load value of left previous delta
movh %Cdeltap, r3
;****** jump to filtering subroutine *********************************
right_filtering:
jsr r11, SUB_filtering
;**************************************
;***** deseable interrupt mask ********
movi TrapReg, 0x0
nop
nop
;**************************************
;**************************************
;******* load Nb-1 block from DRAM to local buffer ******************
subi r0, r10, 1 ; r0= Nb-1
movi r4, localB_data ; set up pointer in local buffer
#ifdef EFFECT
movh r3, %Csearch_ptr; load current value of search_ptr
#endif //EFFECT
loop r0, load_search_buf
;****** wrap pointer if necessary *************************************
#ifndef EFFECT //moved out of loop for EFFECT
movh r3, %Csearch_ptr; load current value of search_ptr
#endif //EFFECT
#ifdef EFFECT
movh r19,%CSEARCH_END
tst r3,r19
#else //EFFECT
tstsh r3, %CSEARCH_END; test if pointer has reached the end
#endif //EFFECT
blt not_wrapped2
movh r3, %CSBUF_START; wrapp pointer to the beginning
not_wrapped2:
;****** load current sequence (length) in search buff from DRAM *****
#ifdef EFFECT
shr r4, 2
shr r1, r8, 2 ; size of the dma transfer in words
andi r2, 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_buf
mov LocalAddr, r4
dmarr r3
WaitDma
addi r4, 32
addi r3, 32
transfer_buf:
tsti r2,0
beq Lno_extra_2
subi r19,r2,1 //-1 for dma
mov DMASize, r19 //remainder
mov LocalAddr, r4 ; @ in local mem of decimated seq
dmarr r3
WaitDma
Lno_extra_2:
add r4, r2
add r3, r2 //inc ptrs
shl r4, 2 //restore for later use
shl r3, 2
#else //EFFECT
; movi StartAddrHigh, 0x7
movi StartAddrHigh, DataSeg // 10-13-98
mov ByteLocal, r4 ; sets the location in local memory
mov r1, r8
subi r1, 2
mov ByteSize, r1 ; set size of the transfert (length-2)
dmabrr r3 ; start dma transfert
#endif //EFFECT
#ifndef EFFECT //already done above
add r4, r8 ; increments position in local memory
#endif //EFFECT
;******* increments the pointer on SBUF in DRAM **********************
ptr_increment2:
#ifndef EFFECT //already done above
add r3, r3, r8 ; search_ptr=search_ptr +length
#endif //EFFECT
movh %Csearch_ptr, r3; save the current value of search_ptr
nop
load_search_buf:
;**************************************
;***** enable interrupt mask **********
movi TrapReg, 0x24
;**************************************
;**************************************
;A VOIR SI ON NE PEUT PAS METTRE CA PLUS LOIN
;******* save the search_ptr at the right place (left/right) *********
tsti r12, 0x1
bne right4
#ifdef EFFECT
tsti r3,LSBUF_END
blt Left_ok2
subi r3,0x1000 //wraping
Left_ok2:
#endif //EFFECT
movh %Lsearch_ptr, r3
j left4
right4:
#ifdef EFFECT
tsti r3,RSBUF_END
blt Right_ok2
subi r3,0x1000 //wraping
Right_ok2:
#endif //EFFECT
movh %Rsearch_ptr, r3
left4:
;*********************************************************************
;******* COMPUTE DELTA ONLY IF KEYSHIFT IS REQUIRED, ELSE DELTA=0 ****
;*********************************************************************
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 no_correlation
//debug
// j no_correlation
;******* computes delta **********************************************
;*********************************************************************
;******* set up adr of input seq and goal sequence *******************
movi AGRSiz1, 0x1fe ; 256 samples (128 per channel )
movi AGRInc1, 4 ; not to erase the other channel
movh r1, %Cinput_adr
mov AGRAdr1, r1 ; load start @ for input sequence
movh r0, %Cgoal_start; r0=pos1+N+deltap+0x1000 (or old_pos1)
#ifdef EFFECT
mov AGRAdr5, r0
#else //EFFECT
mov AGRAdr3, r0
#endif //EFFECT
;**************************************
;***** deseable interrupt mask ********
movi TrapReg, 0x0
nop
nop
;**************************************
;**************************************
;******* Copy the goal sequence (1sample/4) in local memory **********
loop 128, copy
#ifdef EFFECT
// movhf r0, a5(8) ; copy 1 sample on 4
// movhf i1, r0
shrahf i1, a5(8), 3 ; fixes the probleme with the 1Khz sin wav
#else //EFFECT
; movhf i1, a3(8) ; copy 1 sample on 4
shrahf i1, a3(8), 3 ; fixes the probleme with the 1Khz sin wav
#endif //EFFECT
copy:
;**************************************
;***** enable interrupt mask **********
movi TrapReg, 0x24
;**************************************
;**************************************
;******* set up registers before calling sub routine (1) ************
;******* start position =r5 *****************************************
movh r5, %pos1
add r5, r8
subi r5, 512*2 ; start=pos1+length-512*2 (byte @)
addi r5, 0x1000 ; search buffer in B part of memory
movh %inter_pos, r5 ; store r5 in local memory
;******* number of correlation coefficients computed =r1 ***********
movi r1, 128 ; Dmin=Dmax=64 => 128 iterations
;******* number of correlation coefficients skipped =r0 ************
movi r0, 8*2 ; 1 coefficient on 8 (byte increment)
;**************************************
;***** desable interrupt mask *********
movi TrapReg, 0x0
nop
nop
;**************************************
;**************************************
;******* jump to subroutine key *************************************
;******* return register r2=deltai +512 *****************************
jsr r11, SUB_delta_comp
;**************************************
;***** enable interrupt mask **********
movi TrapReg, 0x24
;**************************************
;**************************************
;******* save result in deltai (left or right) **********************
movh %Cdeltai, r2
;******* set up registers before calling sub routine (2) *************
;******* start position =r5 ******************************************
tstsi r2,9*2 ; comparaison in bytes
bgt d1
mov r1, r2 ; Dmin =deltai+512
j d2
d1:
movi r1, 10*2 ; Dmin =10, in bytes
d2:
movh %Dmin, r1 ; store the value of Dmin in memory
tstsi r2,1014*2 ; comparaison in bytes
blt d3
movi r0, 1024*2
sub r0, r2 ; Dmax =512-deltai
j d4
d3:
movi r0, 10*2 ; Dmax=10, in bytes
d4:
movh r5, %inter_pos ; load previous value of r5
add r5, r2
sub r5, r1 ; r5= new start location in bytes
movh %inter_pos, r5 ; store new value of r5
;******* number of correlation coefficients computed =r1 ************
add r1, r0, r1
shr r1, 1 ; r1=Dmin+Dmax, not in bytes
;******* number of correlation coefficients skipped =r0 *************
movi r0, 1*2 ;do not skip any correlation coeff
;**************************************
;***** desable interrupt mask *********
movi TrapReg, 0x0
nop
nop
;**************************************
;**************************************
;******* jump to subroutine key **************************************
;******* return r2 = deltaf +Dmin ************************************
jsr r11, SUB_delta_comp
;**************************************
;***** enable interrupt mask **********
movi TrapReg, 0x24
;**************************************
;**************************************
;******* set up registers before calling subroutine window ***********
;******* r5=start pos of matched sequence, r6=start pos of goal seq **
;******* r7 = start adress of output sequence ************************
movh r5, %inter_pos ; load previous value of r5
add r5, r5, r2 ; r5=pos1+length+deltac+0x1000
;******* compute current delta & update the value of deltac **********
subh r2,%Dmin ; r2 = deltaf
subi r2, 512*2
addh r2, r2, %Cdeltai; r2 = deltai + deltaf=deltap
movh r6, %Cgoal_start; r6=pos1+deltap+N+0x1000
movh r7, %Cinput_adr
movh %Cdeltap, r2 ; save the value of deltap
j correlation_done
;******* set up registers before calling subroutine window in case ***
;******* no correlation is required (no keyshift )********************
no_correlation:
movh r6, %Cgoal_start; r6=pos1+deltap+N+0x1000
movh r7, %Cinput_adr
movi r2, 0x0
movh %Cdeltap, r2 ; save the value of deltap=0
movh r5, %pos1 ; get the start pos of matched sequence
add r5, r8 ; r5= pos1+length
addi r5, 0x1000 ; r5 =pos1+length +0x1000+0 (deltac=0)
correlation_done:
;*********************************************************************
;******* check if key has been changed and if something needs to be **
;******* done, depending where the Csearch_ptr is ********************
;*********************************************************************
movi r0, 0x0
#ifdef EFFECT
movh r19,%key_change
tst r0,r19
#else //EFFECT
tsth r0, %key_change
#endif //EFFECT
beq normal ; if key has not changed, process normal
movh r3, %Csearch_ptr
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 ********************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -