⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 search_update2.s

📁 关于DVD上的PCM的解码的代码,PCM的DSP压缩,解调的算法,用RISC32指令来写.
💻 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 + -