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

📄 test.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 S
📖 第 1 页 / 共 5 页
字号:
		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 + -