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

📄 pcm_dec.s

📁 关于DVD上的PCM的解码的代码,PCM的DSP压缩,解调的算法,用RISC32指令来写.
💻 S
📖 第 1 页 / 共 2 页
字号:
L2_channel_loop_96k:
#else

#if 1
#if 1
	dlw	r0,USER_OCFG
#else
	dlw	r0,0xff00
#endif
	nop
	andi	r0, OCFG_PCM_FREQ_MASK
	tsti	r0, 0				; 0/1 - 48/96 kHz output
	bne	L96k_ND

//Decimation filter applied
;******* load the coefficient of the filter in local memory *************
		movi	StartAddrHigh, DataSeg	

		movi	DMASize, 31		; coefficient = 32
		movi	r9, local_dec_filter_word
		movi	r26, decimation2
		shr	r26,2

		mov	LocalAddr,r9
								; sets the location in local memory
		dmarr	r26				; adress in DRAM for history
		WaitDma

;******* load the history of the filter in local memory *************

		movi	DMASize, 31		; history =64 data
		movi	r9, local_hist_mid_buf_word
		movi	r26, (pcm_dec_hist)>>2

		loop	2,load_hist_sample		
		mov		LocalAddr,r9
								; sets the location in local memory
		dmarr	r26				; adress in DRAM for history
		WaitDma
		addi	r9,32
		addi	r26,32
load_hist_sample:

;******* set up the AGRAdr ******************************************
;******* filter coefficients********
		movi	AGRAdr4, local_dec_filter_byte; pointer to filter coefficients
		movi	AGRSiz4, 0x7e		; 64 coefficients, circular buffer
		movi	AGRInc4, 0x2		; increments by 2 (one coefficient)

;******* data_in *******
		movi	AGRAdr2, local_hist_mid_buf_byte ; +4 pointer on the beginning of history 
		movi	AGRSiz2, 0xffff
		movi	AGRMod2, 0
		movi	AGRInc2, 0xff02		; increments by -254 (reset of history)

;******* process a block of 128 samples *******************************

		loop	64, L2_channel_loop_96k	;64

		mulhf	r8, i4, a2(4)		
//		nop
//		mov		r6,r8					;test

		loop	21, decimation_flt_1
		maddhf	r8, i4, a2(4)			; first filter set
		maddhf	r8, i4, a2(4)			; second
		maddhf	r8, i4, a2(4)			; third,  go back to first set of filter
decimation_flt_1:
		nop
;		shra	r8,1				;test
		rndhf	a3(1*2), r8			

		movhf	r6,i2					; dummy a4 point to next channel -254


		mulhf	r8, i4, a2(4)		
//		nop

		loop	21, decimation_flt_2	; 2nd channel
		maddhf	r8, i4, a2(4)			; first filter set
		maddhf	r8, i4, a2(4)			; second
		maddhf	r8, i4, a2(4)			; third,  go back to first set of filter
decimation_flt_2:
		nop
;		shra	r8,1				;test
		rndhf	a3(1*2), r8			

		mov		a3(1*4), r0			; clear the non-existing channels
		mov		a3(1*4), r0

		movhf	r6,i2				; dummy instruction for data shifting
		movhf	r6,a2(4)			; dummy instr

L2_channel_loop_96k:
;******* save the history of the filter in DRAM *************

		movi	DMASize, 31		; history =64 data
		movi	r9, local_last_dec_buf_word
		movi	r26, (pcm_dec_hist)>>2
		
		loop	2,save_hist_sample
		mov		LocalAddr,r9
								; sets the location in local memory
		dmawr	r26				; adress in DRAM for history
		WaitDma
		addi	r9,32
		addi	r26,32
save_hist_sample:
		j	L2_channel_loop_96k_ND
#else
	loop	64, L2_channel_loop_96k
	mov	r3, a2(2*4)
	mov	a3(1*4), r3
	mov	a3(1*4), r0		//clear the non-existing channels
	mov	a3(1*4), r0
L2_channel_loop_96k:
#endif		//0 test

L96k_ND:
	loop	128, L2_channel_loop_96k_ND
	mov	r3, a2(1*4)
	mov	a3(1*4), r3
	mov	a3(1*4), r0		//clear the non-existing channels
	mov	a3(1*4), r0
L2_channel_loop_96k_ND:

#endif
	 	movi	TrapReg,1<<2
	
	j	Lchannel_continue_96k

//---------------------------------------------------
L3_channel_96k:

	tsti	r19, 0
	beq	L3_first_blk_96k
	tsti	r19, 1
	beq	L3_second_blk_96k
	tsti	r19, 2
	beq	L3_third_blk_96k

L3_first_blk_96k:

	jsr	r29, SUB_3_channel_96k
	movi	AGRAdr0, local_temp_buf_byte
	mov	r3, a2(1*4)		//save 2 left-over words
	mov	a0(1*4), r3
	mov	r3, a2(1*4)
	mov	a0(1*4), r3
	j	Lchannel_continue_96k

L3_second_blk_96k:

	movi	AGRAdr0, local_temp_buf_byte
	nop
	mov	r3, a0(1*4)		//get left-over from previous block
	mov	a3(1*4), r3
	mov	r3, a0(0*4)
	andi	r3, 0xffff
	mov	a3(1*4), r3
	mov	a3(1*4), r0		//clear the non-existing channels
	shr	r3, a0(1*4), 16
	shl	r4, a2(0*4), 16		//get new data
	or	a3(1*4), r3, r4
	shr	r3, a2(1*4), 16
	mov	a3(1*4), r3
	mov	a3(1*4), r0		//clear the non-existing channels
	
	jsr	r29, SUB_3_channel_96k
	
	movi	AGRAdr0, local_temp_buf_byte
	mov	r3, a2(1*4)		//save 1 left-over words
	mov	a0(1*4), r3
	j	Lchannel_continue_96k

L3_third_blk_96k:

	movi	AGRAdr0, local_temp_buf_byte
	nop
	mov	r3, a0(1*4)		//get left-over from previous block
	mov	a3(1*4), r3
	mov	r3, a2(0*4)		//get new data
	andi	r3, 0xffff 
	mov	a3(1*4), r3
	mov	a3(1*4), r0		//clear the non-existing channels
	shr	r3, a2(1*4), 16
	shl	r4, a2(0*4), 16		//get new data
	or	a3(1*4), r3, r4
	shr	r3, a2(1*4), 16
	mov	a3(1*4), r3
	mov	a3(1*4), r0		//clear the non-existing channels
	
	jsr	r29, SUB_3_channel_96k
	
	j	Lchannel_continue_96k

//---------------------------------------------------
L4_channel_96k:
	movi	TrapReg,0
	nop
	nop
#ifdef	I2S
	loop	32, L4_channel_loop_96k
#else
	loop	64, L4_channel_loop_96k
#endif
	mov	r3, a2(0*4)
	mov	a3(1*4), r3
	mov	r3, a2(0*4)
	mov	a3(1*4), r3
	mov	a3(1*4), r0		//clear the non-existing channels
L4_channel_loop_96k:
	movi	TrapReg,1<<2
	
	j	Lchannel_continue_96k

//---------------------------------------------------
L5_channel_96k:
	tsti	r19, 0
	beq	L5_first_blk_96k
	tsti	r19, 1
	beq	L5_second_blk_96k
	tsti	r19, 2
	beq	L5_third_blk_96k
	tsti	r19, 3
	beq	L5_fourth_blk_96k
	tsti	r19, 4
	beq	L5_fifth_blk_96k
	
L5_first_blk_96k:
	
	jsr	r29, SUB_5_channel_96k
	mov	r3, a2(1*4)
	mov	a3(1*4), r3
	mov	r3, a2(1*4)
	mov	a3(1*4), r3
	mov	r3, a2(0*4)
	andi	r3, 0xffff
	mov	a3(1*4), r3
	
	movi	AGRAdr0, local_temp_buf_byte
	mov	r3, a2(1*4)		//save 1/2 left-over word
	mov	a0(1*4), r3
	j	Lchannel_continue_96k


L5_second_blk_96k:

	movi	AGRAdr0, local_temp_buf_byte
	nop
	shr	r3, a0(1*4), 16		//get 1/2 left-over word
	shl	r4, a2(0*4), 16
	or	a3(1*4), r3, r4
	shr	r3, a2(1*4), 16
	shl	r4, a2(0*4), 16
	or	a3(1*4), r3, r4
	shr	r3, a2(1*4), 16
	mov	a3(1*4), r3
	jsr	r29, SUB_5_channel_96k

	movi	AGRAdr0, local_temp_buf_byte
	mov	r3, a2(1*4)		//save 1 left-over word
	mov	a0(1*4), r3
	j	Lchannel_continue_96k

L5_third_blk_96k:

/*	movi	AGRAdr0, local_temp_buf_byte
	nop
	mov	r3, a0(1*4)
	mov	a3(1*4), r3
	mov	r3, a2(1*4)
	mov	a3(1*4), r3
	mov	r3, a2(0*4)
	andi	a3(1*4), r3, 0xffff
	jsr	r29, SUB_5_channel_96k
*/
	
L5_fourth_blk_96k:	
L5_fifth_blk_96k:	
		
	j	Lchannel_continue_96k

L6_channel_96k:
L7_channel_96k:
L8_channel_96k:	
Lchannel_continue_96k:

//-----------------------------------------------------

		
Lupdate_channel_count:		
	
	addi	r19, 1			//inc channel count

	addi	r18, 1
	tst	r18, r17
	blt	Lchannel_loop_start

//****************************************************************
//	De-emphasis will start here
//****************************************************************		
	

#if 0
	dlw	r0,0xff10		; testing purpose
	nop
	nop
	tsti	r0,0x80
	bne	skip_Deemphasis
#else
	andi	r0, r20, OCFG_EMPHA_MASK
	tsti	r0,0
	beq	skip_Deemphasis

#endif

;******* load the coefficient of the filter in local memory *************

	movi	StartAddrHigh, DataSeg	

	movi	DMASize, 2		; coefficient = 5
	movi	r9, local_deemphasis_filter_word
	movi	r26, Deemphasis_coef
	shr	r26,2

	mov	LocalAddr,r9
					; sets the location in local memory
	dmarr	r26			; adress in DRAM for history
	WaitDma


;******* set up the AGRAdr ******************************************
;******* filter coefficients********

	movi	AGRAdr2,local_deemphasis_filter_byte
	movi	AGRSiz2,2*4		; 5 coefficients circular buffer
	movi	AGRInc2, 2	    

;******* Filter Left Data Input********
	movi	AGRAdr7, local_deemph_hist_byte_L
	movi	AGRSiz7,0xffff
	movi	AGRInc7, 2    

	movi	AGRAdr6, local_FApcm_buf_byte
	movi	AGRSiz6,0xffff
	movi	AGRInc6, 4*3	    


	mulhf	r8,i2,i7		; -a2 * Y(t-1)
	maddhf	r8,i2,i7		; -a2 * Y(t-1)-a3 * Y(t-2)
	maddhf	r8,i2,i6		; ..+b1 * X
	maddhf	r8,i2,i7		; ..+b2 * X(t-1)
	maddhf	r8,i2,a7(-2*3)		; ..+b3 * X(t-2)

	movhf	r0,a7(0)		; Y(t-1)->Y(t-2)
	rndhf	a7(+2),r8		; Y(t)->Y(t-1) 
	movhf	a7(-2),r0
		
#if 1
	nop
#else
	nop
	nop

	mov	r1,AGRAdr7
	dsw	r1,0xff34

	mov	r0,AGRAdr6
	dsw	r0,0xff38

	mov	r1,AGRAdr2
	dsw	r1,0xff3c


//	dlw	r0,0xff30
	shr	r8,8
	nop
test_66:
	nop
	nop
	nop
//	tsti	r0,0xbeef
	tsti	r0,0x5000
	bgt	test_66
	nop
	nop
	nop
//	j	test_66

#endif

	mulhf	r8,i2,i7		; -a2 * Y(t-1)
	maddhf	r8,i2,i7		; -a2 * Y(t-1)-a3 * Y(t-2)
	maddhf	r8,i2,a6(-12*1)		; ..+b1 * X
	maddhf	r8,i2,a6(+12*2)		; ..+b2 * X(t-1)
	maddhf	r8,i2,a7(-2*2)		; ..+b3 * X(t-2)

	movhf	r0,a7(0)		; Y(t-1)->Y(t-2)
	rndhf	a7(+2),r8		; Y(t)->Y(t-1) 
	movhf	a7(-2),r0


	loop	252,till_the_last_2L
	mulhf	r8,i2,i7		; -a2 * Y(t-1)
	maddhf	r8,i2,a7(0)		; -a2 * Y(t-1)-a3 * Y(t-2)
	maddhf	r8,i2,a6(-12*1)		; ..+b1 * X
	maddhf	r8,i2,a6(-12*1)		; ..+b2 * X(t-1)
	maddhf	r8,i2,a6(0)		; ..+b3 * X(t-2)
	movhf	r0,a7(-2)		; 
	movhf	r1,a7(2)
	movhf	a6(+12*3),r0		; store output
	movhf	a7(-2),r1		; Y(t-1)->Y(t-2)
	rndhf	a7(0),r8		; Y(t)->Y(t-1) 

till_the_last_2L:


	mulhf	r8,i2,i7		; -a2 * Y(t-1)
	maddhf	r8,i2,a7(+4)		; -a2 * Y(t-1)-a3 * Y(t-2)
	
	movhf	r3,a6(0)		; X(t-2) for next frame
	
	maddhf	r8,i2,a6(-12*1)		; ..+b1 * X
	maddhf	r8,i2,a6(-12*1)		; ..+b2 * X(t-1)
	maddhf	r8,i2,a6(0)		; ..+b3 * X(t-2)
	
	movhf	a7(-4),r3		; store X(t-2)

//	dsw	r3,0xff60		//test

	movhf	r0,a7(-2)		; 
	movhf	r1,a7(2)
	movhf	a6(+12*3),r0		; store output
	movhf	a7(-2),r1		; Y(t-1)->Y(t-2)
	rndhf	a7(0),r8		; Y(t)->Y(t-1) 

	
	mulhf	r8,i2,i7		; -a2 * Y(t-1)
	maddhf	r8,i2,i7		; -a2 * Y(t-1)-a3 * Y(t-2)

	movhf	r3,a6(0)		; X(t-1) for next frame

	maddhf	r8,i2,a6(-12*1)		; ..+b1 * X
	maddhf	r8,i2,a6(-12*1)		; ..+b2 * X(t-1)
	maddhf	r8,i2,a6(0)		; ..+b3 * X(t-2)

	movhf	a7(-2),r3		; store X(t-1)

//	dsw	r3,0xff5c		//test

	movhf	r0,a7(-2)		; 
	movhf	r1,a7(2)
	movhf	a6(+12*1),r0		; store output
	movhf	a7(-2),r1		; Y(t-1)->Y(t-2)
	movhf	a6(+12*1),r1		; store output
	rndhf	a7(0),r8		; Y(t)->Y(t-1) 
	rndhf	a6(0),r8		;store output
#if 0

	dsw	r1,0xff54
	nop
	dsw	r8,0xff50
#endif


;******* Filter Right Data Input********
	movi	AGRAdr7, local_deemph_hist_byte_R

	movi	AGRAdr6, local_FApcm_buf_byte+2

	mulhf	r8,i2,i7		; -a2 * Y(t-1)
	maddhf	r8,i2,i7		; -a2 * Y(t-1)-a3 * Y(t-2)
	maddhf	r8,i2,i6		; ..+b1 * X
	maddhf	r8,i2,i7		; ..+b2 * X(t-1)
	maddhf	r8,i2,a7(-2*3)		; ..+b3 * X(t-2)

	movhf	r0,a7(0)		; Y(t-1)->Y(t-2)
	rndhf	a7(+2),r8		; Y(t)->Y(t-1) 
	movhf	a7(-2),r0
	nop		

	mulhf	r8,i2,i7		; -a2 * Y(t-1)
	maddhf	r8,i2,i7		; -a2 * Y(t-1)-a3 * Y(t-2)
	maddhf	r8,i2,a6(-12*1)		; ..+b1 * X
	maddhf	r8,i2,a6(+12*2)		; ..+b2 * X(t-1)
	maddhf	r8,i2,a7(-2*2)		; ..+b3 * X(t-2)

	movhf	r0,a7(0)		; Y(t-1)->Y(t-2)
	rndhf	a7(+2),r8		; Y(t)->Y(t-1) 
	movhf	a7(-2),r0

	loop	252,till_the_last_2R
	mulhf	r8,i2,i7		; -a2 * Y(t-1)
	maddhf	r8,i2,a7(0)		; -a2 * Y(t-1)-a3 * Y(t-2)
	maddhf	r8,i2,a6(-12*1)		; ..+b1 * X
	maddhf	r8,i2,a6(-12*1)		; ..+b2 * X(t-1)
	maddhf	r8,i2,a6(0)		; ..+b3 * X(t-2)
	movhf	r0,a7(-2)		; 
	movhf	r1,a7(2)
	movhf	a6(+12*3),r0		; store output
	movhf	a7(-2),r1		; Y(t-1)->Y(t-2)
	rndhf	a7(0),r8		; Y(t)->Y(t-1) 

till_the_last_2R:

	mulhf	r8,i2,i7		; -a2 * Y(t-1)
	maddhf	r8,i2,a7(+4)		; -a2 * Y(t-1)-a3 * Y(t-2)
	
	movhf	r3,a6(0)		; X(t-2) for next frame
	
	maddhf	r8,i2,a6(-12*1)		; ..+b1 * X
	maddhf	r8,i2,a6(-12*1)		; ..+b2 * X(t-1)
	maddhf	r8,i2,a6(0)		; ..+b3 * X(t-2)
	
	movhf	a7(-4),r3		; store X(t-2)

	movhf	r0,a7(-2)		; 
	movhf	r1,a7(2)
	movhf	a6(+12*3),r0		; store output
	movhf	a7(-2),r1		; Y(t-1)->Y(t-2)
	rndhf	a7(0),r8		; Y(t)->Y(t-1) 

	
	mulhf	r8,i2,i7		; -a2 * Y(t-1)
	maddhf	r8,i2,a7(+2)		; -a2 * Y(t-1)-a3 * Y(t-2)

	movhf	r3,a6(0)		; X(t-1) for next frame

	maddhf	r8,i2,a6(-12*1)		; ..+b1 * X
	maddhf	r8,i2,a6(-12*1)		; ..+b2 * X(t-1)
	maddhf	r8,i2,a6(0)		; ..+b3 * X(t-2)

	movhf	a7(-2),r3		; store X(t-1)

	movhf	r0,a7(-2)		; Y(t-1)->Y(t-2)
	movhf	r1,a7(2)
	movhf	a6(+12*1),r0		; store output
	movhf	a7(-2),r1		; Y(t-1)->Y(t-2)
	movhf	a6(+12*1),r1		; store output
	rndhf	a7(0),r8		; Y(t)->Y(t-1) 
	rndhf	a6(0),r8		;store output

	movi	AGRSiz2,0xffff		; back to linear buffer

skip_Deemphasis:
//****************************************************************
//	End of De-emphasis
//****************************************************************
			
	movb	r1,LBblknum
	addi	r1,1
	tsti	r1, 6
	blte	blk_ok
	movi	r1,1		; starts with 1
blk_ok:	
	movb	LBblknum,r1

	mult	r4, r13, r17		//#blk * #chan
	dlw	r1, Stream_Start
	dlw	r2, Stream_End
#ifdef	I2S
	shl	r4, 6			//*16*4
#else
	shl	r4, 7			//*32*4
#endif
	add	r0, r21, r4
	multi	r10, r4, 3		//*6/2 (6 blk per PTS.16-bit per word)
	tst	r0, r2
	blt	end_PCM_decode
	subi	r0, PCM_IBUF_SIZE	;circular IBUF read ptr
end_PCM_decode:
//	dsw	r0, Stream_Rd_Ptr	;update IBUF read ptr
	SvStrRdPtr	r0
	movw	LWibufRdPtr,r0
#if LS388
	rswi	r0, Comm_Reg3		//for host
	andi	r2,r0,0xffff
	movh	r10,LIold_rd_ptr
	tst	r2,r10
	bgte	1f
	addi	r2,PCM_IBUF_SIZE
1:	sub	r2,r10
	movh	LIold_rd_ptr,r0
	movw	r10,LWbytecount
	add	r10,r2
//	add	r10,r4
	movw	LWbytecount,r10
//	movh	LIfrmsize, r4		;for PTS
#else	// LS388
	movh	LIfrmsize, r10		;for PTS
#endif	// LS388
	dsw	r4, MIN_IBUF_VAR	;for testing buffer emptyness 

	
	j	r31
	
	 
// sub-routines
	
SUB_3_channel:
	movi	TrapReg,0
	nop
	nop	
	loop	42, L3_channel_loop
	mov	r3, a2(1*4)
	mov	a3(1*4), r3
	mov	r3, a2(0*4)
	andi	r3, 0xffff
	mov	a3(1*4), r3
	mov	a3(1*4), r0	//clear the non-existing channels
	shr	r3, a2(1*4), 16
	shl	r4, a2(0*4), 16
	or	a3(1*4), r3, r4
	shr	r3, a2(1*4), 16
	mov	a3(1*4), r3
	mov	a3(1*4), r0	//clear the non-existing channels
L3_channel_loop:
	movi	TrapReg,1<<2
	j	r29

SUB_5_channel:
	movi	TrapReg,0
	nop
	nop		
	loop	25, L5_channel_loop
	mov	r3, a2(1*4)
	mov	a3(1*4), r3
	mov	r3, a2(1*4)
	mov	a3(1*4), r3
	mov	r3, a2(0*4)
	andi	r3, 0xffff
	mov	a3(1*4), r3
	shr	r3, a2(1*4), 16
	shl	r4, a2(0*4), 16
	or	a3(1*4), r3, r4
	shr	r3, a2(1*4), 16
	shl	r4, a2(0*4), 16
	or	a3(1*4), r3, r4
	shr	r3, a2(1*4), 16
	mov	a3(1*4), r3
L5_channel_loop:
	movi	TrapReg,1<<2
	j	r29

SUB_3_channel_96k:
	movi	TrapReg,0
	nop
	nop
	loop	42, L3_channel_loop_96k
	mov	r3, a2(1*4)
	mov	a3(1*4), r3
	mov	r3, a2(0*4)
	andi	r3, 0xffff
	mov	a3(1*4), r3
	mov	a3(1*4), r0	//clear the non-existing channels
	shr	r3, a2(1*4), 16
	shl	r4, a2(0*4), 16
	or	a3(1*4), r3, r4
	shr	r3, a2(1*4), 16
	mov	a3(1*4), r3
	mov	a3(1*4), r0	//clear the non-existing channels
L3_channel_loop_96k:
	movi	TrapReg,1<<2
	j	r29

SUB_5_channel_96k:
	movi	TrapReg,0
	nop
	nop
	loop	25, L5_channel_loop_96k
	mov	r3, a2(1*4)
	mov	a3(1*4), r3
	mov	r3, a2(1*4)
	mov	a3(1*4), r3
	mov	r3, a2(0*4)
	andi	r3, 0xffff
	mov	a3(1*4), r3
	shr	r3, a2(1*4), 16
	shl	r4, a2(0*4), 16
	or	a3(1*4), r3, r4
	shr	r3, a2(1*4), 16
	shl	r4, a2(0*4), 16
	or	a3(1*4), r3, r4
	shr	r3, a2(1*4), 16
	mov	a3(1*4), r3
L5_channel_loop_96k:
	movi	TrapReg,1<<2
	j	r29

	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -