📄 search_update2.s
字号:
;************************************************************************
; (c)1997 Copyright LuxSonor, Inc. All rights reserved
;
; Revision 1.0
;
;
; Module: search_update
; this module modifies the buffer search, located in part B
; of local memory, when the key changes
;
; Initial version:Cecile Foret
; Jinshi Huang 12/1/98 for LS388/LS500
; Calling : none
; Called by: key control
; Return: none
; Param in: r3, adress in DRAM where to store the new sequence of
; search
;
; Temp reg:
; AGR reg: AGRAdr0, AGRAdr1 point at the triangular window (128 points)
; AGRAdr1, AGRAdr2 point at the search buffer in local buffer
;
;************************************************************************
.nolist
#include "regdef2.h"
#include "stereo_user.h"
#include "memory2.h"
.list
.data
.global SUB_search_update
;************************************************************************
SUB_search_update:
;************************************************************************
;********* set up the pointers on the window ****************************
movi AGRAdr0, localA_window
movi AGRSiz0, 0x1fe
movi AGRInc0, 0x4 ; increments by two =128 points
movi AGRAdr1, localA_window+0x1fc
movi AGRSiz1, 0x1fe
movi AGRInc1, 0xfffc ; decrements by two
;************************************************************************
;********* set up the pointers on the search buffer *********************
movh r1, %Nb_1 ; ptr on search buffer
subi r1, 0x2
addh r1, %Length ; r1=Nb*length
movh r2, %NNb_1
subi r2, 0x2
addh r2, %Length ; r2=length+(New_Nb-1)*New_length
addi r2, 0x1000
addi r1, 0x1000
#ifdef EFFECT
mov AGRAdr4, r2 ; points at the result location.
movi AGRSiz4, 0xffff
movi AGRInc4, 0xfffe ; decrements by one
nop ; work around for interrupt bug
nop ; work around for interrupt bug
mov AGRAdr5, r1 ; points at the continuity point.
movi AGRSiz5, 0xffff
movi AGRInc5, 0xfffe ; decrements by one
nop ; work around for interrupt bug
nop ; work around for interrupt bug
#else //EFFECT
mov AGRAdr2, r2 ; points at the result location.
movi AGRSiz2, 0xffff
movi AGRInc2, 0xfffe ; decrements by one
nop ; work around for interrupt bug
nop ; work around for interrupt bug
mov AGRAdr3, r1 ; points at the continuity point.
movi AGRSiz3, 0xffff
movi AGRInc3, 0xfffe ; decrements by one
nop ; work around for interrupt bug
nop ; work around for interrupt bug
#endif //EFFECT
;************************************************************************
;********* test if Nb_missing is positive or negative *******************
movh r0, %NNb_1
subh r0, %Nb_1
mov r6, r0 ; save Nb_missing=r6
tstsi r0, 0x0
#ifdef EFFECT
blte squeeze_buffer
#else //EFFECT
blt squeeze_buffer
#endif //EFFECT
;********* extend the search buffer *************************************
generate:
; movhf r2, i3
; movhf i2, r2 ; copy Nb_missing points
#ifdef EFFECT
movhf r1, i5
movhf i4, r1 ; copy Nb_missing points
#else //EFFECT
movhf r1, i3
movhf i2, r1 ; copy Nb_missing points
#endif //EFFECT
subi r0, 0x2
#ifdef EFFECT
bne generate
#else //EFFECT
bnz generate
#endif //EFFECT
;**************************************
;***** desable interrupt mask *********
movi TrapReg, 0x0
nop
nop
;**************************************
;**************************************
loop 128, cont ; get the continuity
#ifdef EFFECT
mulhf r4, i5, i1
maddhf r4, i0, a4(0)
nop
rndhf i4, r4
#else //EFFECT
mulhf r4, i3, i1
maddhf r4, i0, a2(0)
rndhf i2, r4
#endif //EFFECT
cont:
;**************************************
;***** enable interrupt mask **********
movi TrapReg, 0x24
;**************************************
;**************************************
movh r3, %CSEARCH_END ;r3=end_of_search -Length
subh r3, %Length
; movi StartAddrHigh, 0x7
movi StartAddrHigh, DataSeg // 10-13-98
#ifdef EFFECT
addh r4, r6, %Length ; load back in DRAM Nb_missing+Length point
shr r1, r4, 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
movh r0, %Nb_1
addi r0, 0x1000
shr r0, 2
mov LocalAddr, r0
shr r3, 2
loop r1, transfer_search
mov LocalAddr, r0
dmawr r3
WaitDma
addi r0, 32
addi r3, 32
transfer_search:
mov DMASize, r2 //remainder
mov LocalAddr, r0
dmawr r3
WaitDma
#else //EFFECT
addh r4, r6, %Length ; load back in DRAM Nb_missing+Length point
subi r4, 0x2
mov ByteSize, r4
movh r0, %Nb_1
addi r0, 0x1000
mov ByteLocal, r0
dmabwr r3 ; write back in DRAM at Csearch_ptr
#endif //EFFECT
j zero_pad
squeeze_buffer:
;**************************************
;***** desable interrupt mask *********
movi TrapReg, 0x0
nop
nop
;**************************************
;**************************************
;********* squeeze the search buffer ************************************
loop 128, squeeze
#ifdef EFFECT
mulhf r4, i1, i5
maddhf r4, i0, a4(0)
nop
rndhf i4, r4
#else //EFFECT
mulhf r4, i1, i3
maddhf r4, i0,a2(0)
rndhf i2, r4
#endif //EFFECT
squeeze:
;**************************************
;***** enable interrupt mask **********
movi TrapReg, 0x24
;**************************************
;**************************************
movh r3, %NNb_1
subi r3, 0x100 ; r3 = (Nb-1)*NLength-128
addh r3, %CSBUF_START ; r3=start_of_search+(Nb-1)*NLength-128
; movi StartAddrHigh, 0x7
movi StartAddrHigh, DataSeg // 10-13-98
#ifdef EFFECT
movi DMASize, 31
mov r0, AGRAdr4 ; last reconstructed sample -1
addi r0, 0x2
shr r0, 2
shr r3, 2
loop 2, save_reconstr ; save 128 samples in DRAM
mov LocalAddr, r0
dmawr r3 ; write back in DRAM.
WaitDma
addi r0, 32
addi r3, 32
save_reconstr:
#else //EFFECT
movi ByteSize, 0xfe ; save 128 samples in DRAM
mov r0, AGRAdr2 ; last reconstructed sample -1
addi r0, 0x2
mov ByteLocal, r0
dmabwr r3 ; write back in DRAM.
#endif //EFFECT
;********* if N*Length>NN*Nlength, pad some extra zeros in local buffer *
;******** clean the search buffer (if N*Length+Nbmissing > NN*NLength)***
;******** on a ecrit jusque r2 dans search buffer. Si r2>NN*Nlength, mettre des
;******** zeros
zero_pad:
; addh r6, %NLength
; subh r6, %Length ; r6=NN*Nlength -N*Length
; tstsi r6, 0x0
; bgte end_of_update
; movh r1, %Nb_1
; addh r1, %Length
; addi r1, 0xffe ; points at N*L-1+0x1000
; mov AGRAdr2, r1
movh r1, %Nb_1
addh r1, %Length
addi r1, 0xffe ; points at N*L-1+0x1000
tst r1, r2 ; r2=point ultime ou on a ecrit dans le buffer
bgte r1_max
movh r6, %NLength ; case r2 > r1
subh r6, %Length ; r6 = NLength-Length, negative
j r2_max
r1_max:
addh r6, %NLength
subh r6, %Length ; r6 = NN*Nlength -N*Length
mov r2, r1
r2_max:
tstsi r6, 0x0
bgte end_of_update
#ifdef EFFECT
mov AGRAdr4, r2
#else //EFFECT
mov AGRAdr2, r2
#endif //EFFECT
movi r0, 0x0
nop
z1:
#ifdef EFFECT
movhf i4, r0
#else //EFFECT
movhf i2, r0
#endif //EFFECT
addi r6, 0x2 ; r6 is negative !
#ifdef EFFECT
tsti r6, 0 //add will not set z or eq status
bne z1
#else //EFFECT
bnz z1
#endif //EFFECT
end_of_update:
nop
j r11 ; return to main program
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -