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

📄 cs_dec.s

📁 关于DVD上的PCM的解码的代码,PCM的DSP压缩,解调的算法,用RISC32指令来写.
💻 S
📖 第 1 页 / 共 2 页
字号:
	movi	AGRAdr0, L16k
	movi	AGRAdr1, R16k
	movi	AGRAdr2, logdifLRhi

	movi	AGRAdr4, Log_a1
	li	r15, 0x00FFFFFF
	li	r17, 0x00800000
	li	r18, 0x00400000

	movi	AGRAdr3, local_iir_filter_byte

	loop	BLOCKSIZE, LRlogdifhi
	abs	r4, a0(1*4)	//1.23
    	abs	r16, a1(1*4)	//1.23

//	movi	AGRSiz3, 0xffff
	loop	2, FindLog2_LR16k
//	abs	r4
//	li	r2, 0xFFFFFFFF
	movi	r2,0xff
	tst	r4, r17		// test if equal 0x00800000=1
	bne	tst_one_LR16k
	mov	r4, r18
	movi	r2, 0x0
tst_one_LR16k:
	tsti	r4, 0x80	// test if less than 2^(-16)
	bgte	tst_norm_LR16k
	movi	r4, 0x80
//	nop
tst_norm_LR16k:
	and	r1, r4, r18
	tst	r1, r18
	beq	start_log2_LR16k
	subi	r2, 1	// integer protion of log
	shl	r4, 1	// new x  
	j	tst_norm_LR16k
start_log2_LR16k:
	mov	r6, r4
	mulf	r8, r6, r4	// r8 = x^2
	mulf	r10, r4,a4(4) 	// r10 =a1 * x
	madd	r10, r8,a4(-8)	// r10 =a2 * x^2 + a1 * x
	add	r6, r10, a4(4)	// r6  =a2 * x^2 + a1 * x + a0
	shl	r6, 3		// r6  = 4 * (a2* x^2 + a1* x + a0)
//	andi	r2, 0xFF
	and	r6, r15
	shl	r2, 24
	or	r6, r2
	shra	r6, 6		// divide by 32 and shift sign bit back
	mov	r4, r16

	rnd	a3(1*4),r6
FindLog2_LR16k:
	mov	r4, a3(-8)	//log2(L)
	sub	r2, r6, a3(0)		//log2(R)-log2(L)r2
	mov	a2(1*4), r2 
LRlogdifhi:
//Log Difference for 480Hz high pass filtered L,R signals
	movi	AGRAdr0, L480
	movi	AGRAdr1, R480
	movi	AGRAdr2, logdifLRlo

	loop	BLOCKSIZE, LRlogdiflo
	abs	r4, a0(1*4)	//1.23
    	abs	r16,a1(1*4)	//1.23

	loop	2, FindLog2_LR480
//	abs	r4
//	li	r2, 0xFFFFFFFF
	movi	r2,0xff
	tst	r4, r17		// test if equal 0x00800000=1
	bne	tst_one_LR480
	mov	r4, r18
	movi	r2, 0x0
tst_one_LR480:
	tsti	r4, 0x80	// test if less than 2^(-16)
	bgte	tst_norm_LR480
	movi	r4, 0x80
//	nop
tst_norm_LR480:
	and	r1, r4, r18
	tst	r1, r18
	beq	start_log2_LR480
	subi	r2, 1	// integer protion of log
	shl	r4, 1	// new x  
	j	tst_norm_LR480
start_log2_LR480:
	mov	r6, r4
	mulf	r8, r6, r4	// r8 = x^2
	mulf	r10, r4,a4(4) 	// r10 =a1 * x
	madd	r10, r8,a4(-8)	// r10 =a2 * x^2 + a1 * x
	add	r6, r10, a4(4)	// r6  =a2 * x^2 + a1 * x + a0
	shl	r6, 3		// r6  = 4 * (a2* x^2 + a1* x + a0)
//	andi	r2, 0xFF
	and	r6, r15
	shl	r2, 24
	or	r6, r2
	shra	r6, 6	// divide by 32 and shift sign bit back
	mov	r4, r16

	rnd	a3(1*4), r6
FindLog2_LR480:
	mov	r4, a3(-8)	//log2(L)
	sub	r2, r6, a3(0)		//log2(R)-log2(L)r2
	mov	a2(1*4), r2 
LRlogdiflo:
//Log Difference for 480Hz high pass filtered L-R,L+R signals
	movi	AGRAdr0, LMR480
	movi	AGRAdr1, LPR480
	movi	AGRAdr2, logdifLMPR
//	nop

	loop	BLOCKSIZE, LMPRlogdif
	abs	r4, a0(1*4)	//1.23
    	abs	r16,a1(1*4)	//1.23

//	movi	AGRAdr3, local_iir_filter_byte
	loop	2, FindLog2_3
//	abs	r4
//	li	r2, 0xFFFFFFFF
	movi	r2,0xff
	tst	r4, r17		// test if equal 0x00800000=1
	bne	tst_one_LMPR
	mov	r4, r18
	movi	r2, 0x0
tst_one_LMPR:
	tsti	r4, 0x80	// test if less than 2^(-16)
	bgte	tst_norm_LMPR
	movi	r4, 0x80
//	nop
tst_norm_LMPR:
	and	r1, r4, r18
	tst	r1, r18
	beq	start_log2_LMPR
	subi	r2, 1	// integer protion of log
	shl	r4, 1	// new x  
	j	tst_norm_LMPR
start_log2_LMPR:
	mov	r6, r4
	mulf	r8, r6, r4	// r8 = x^2
	mulf	r10, r4,a4(4) 	// r10 =a1 * x
	madd	r10, r8,a4(-8)	// r10 =a2 * x^2 + a1 * x
	add	r6, r10, a4(4)	// r6  =a2 * x^2 + a1 * x + a0
	shl	r6, 3		// r6  = 4 * (a2* x^2 + a1* x + a0)
//	andi	r2, 0xFF
	and	r6, r15
	shl	r2, 24
	or	r6, r2
	shra	r6, 6	// divide by 32 and shift sign bit back
	mov	r4, r16

	rnd	a3(1*4), r6
FindLog2_3:
	mov	r4, a3(-8)	//log2(L)
	sub	r2, r6, a3(0)		//log2(R)-log2(L)r2
	mov	a2(1*4), r2 
LMPRlogdif:
//Low pass filter on the high band path
	movi	AGRAdr3, logdifLRhi	//a3->Log difference output buffer		
	movw	r7, hblogdif		//r7->y(n-1)
	mov	r4, a3(1*4)

	loop	BLOCKSIZE,lowpass1
	mulf	r8, r7, l1p32_1		//r0=-a1*y(n-1),a6->b0
	madd	r8, r4, l1p32_2
	mov	r4, a3(1*4)
	mov	r7, r8
lowpass1:
	movw	hblogdif, r7	//Decimated by 16,last one stored
	movw	hb1v10db, r7	//signal, 1v/10db
	abs	r7
	movw	tccntl,r7	//Store it in TConst control volt
//Low pass filters on the lowband/frontback signal path

	movi	AGRAdr0, logdifLRlo     //a3->Log difference for Lowband
	movi	AGRAdr1, logdifLMPR     //a4->Log difference for Hiband
	movw	r7, lblogdif
	movw	r8, fblogdif
	movi	AGRAdr4, iir_l1p16_1     
	movi	AGRAdr5, iir_l1p16_2    

	loop	BLOCKSIZE,lowpass2
	mulf	r10, r7, i4
	mulf	r12, r8, i4
//	mov	r3, a0(1*4)
//	mov	r4, a1(1*4)
	madd	r10, i5,a0(1*4)
	madd	r12, i5,a1(1*4)
	mov	r7, r10
	mov	r8, r12
lowpass2:
	movw	lblogdif, r7
	movw	fblogdif, r8
	shl	r10, 1
	movw	r7, tccntl	//Store it in TConst control volt
	movw	lb2v10db, r10

	li	r0, 0x266666	//r0=0.3
	abs	r10
	movw	%local_iir_filter_byte, r0
	tst	r7, r10
	blt	4f
	mov	r10, r7		//save the one that is bigger
4:
	madd	r12, r8, %local_iir_filter_byte
	nop
	shl	r12, 1
	nop
	movw	fb2v10db, r12
	abs	r12
	tst	r10, r12
	bgte	5f
	mov	r10, r12	//store max to r10
5:
	movw	tccntl, r10
// Evaluate Time constant filter coefficients
// from Time Constant Control
// Voltage.
	movw	r1, vartclow
	movw	r0, vartchigh
	tst	r10, r1
	bgte	1f
	mov	r10, r1
1:
	movw	r1, hbslope
	tst	r0, r10
	bgte	2f
	mov	r10, r0
2:
	movw	r0, hpinter
	li	r2, 0x7FFFFF
	mulf	r6, r10, r1	//r10=x0
	movw	r3, lofbslope
	movw	r4, lofbinter
	add	r6, r0
	add	r6, r0
	movw	hba1, r6	//r6=a
	sub	r14, r2, r6	//r7=b
	mulf	r6, r10, r3
	movw	hbb0, r14
	add	r6, r4
	add	r6, r4		
	sub	r9, r2, r6	//r9=a, r6=y0
	movw	lofba1, r6
	movw	lofbb0, r9
	mulf	r10, r6, fbtcout//r10=b
	movi	r0, 0		//r0=y0=0
	madd	r10, r9, fb2v10db	//r10=b
	nop 
	tsti	r10, 0x0
	bgte	NOSV
// Exponential Ratio circuit on Sv
	movw	fbtcout, r10
	sub	r8, r0, r10	// r8 = -r10
	movw	Cv, r0		// Cv = 0
	movw	Sv, r8		// Sv = -r10
	mov	r10, r8
	movw	r1, exprcoeff1
	mulf	r4, r8, r10
	movw	r2, exprcoeff2
	mulf	r6, r8, r1
//	movw	%local_iir_filter_byte+4, r2
	movw	r3, exprcoeff3
	madd	r6, r4, exprcoeff2
	nop
	madd	r6, r4, exprcoeff2
	nop
	add	r6, r3
	tst	r0, r6
	blt	3f
	mov	r6, r0	//at least 0, nonnegative
3:
	nop
	movw	Bv, r6
	j	Varmultupdate

NOSV:
	movw	fbtcout, r10
	movw	Bv, r0		// Bv = 0
	movw	Sv, r0		// Sv = 0
	movw	Cv, r10		// Cv = fbtcout
// Variable Multiplier value update
Varmultupdate:
	movi	r0, 0
	movh	r3, Lhcsflag
	andi	r3, SURROUND525
	movw	r6, Sv
	movw	r1, vmlowend
	tsti	r3, SURROUND525
	bne	1f
	mov	r0, r6	//r0=b
1:
	movw	r2, vmupend
	tst	r1, r0
	blt	2f
	mov	r0, r1
2:
	movw	r8, vminter
	tst	r2, r0
	bgt	3f
	mov	r0, r2	//r2 = x1
3:
	movw	r4, vmslope
	movw	%local_iir_filter_byte, r0
	movw	r10, hba1	//r5=y1
	nop
	madd	r8, r4, %local_iir_filter_byte
	nop
	movw	multval, r8	//Store multiplier value.
// Make high band time constant, long for dominant surround
	movw	r12, hbb0
	tst	r0, r2
	blt	Hbtcfilter
	li	r10, 0x7F6500	//   0.99527
	li	r12, 0X009AFE	// 1-0.99527
// Varable Timeconstant filter on the highband signal path
Hbtcfilter:
	movw	r6, hb1v10db
//	nop
	mulf	r4, r6, r12	//r4=a
//	nop
	madd	r4, r10, hbtcout
// Varable Multiplier circuit in highband path
	nop
	movw	hbtcout, r4
	mulf	r14, r4, r8	//r14=a
	nop
	shl	r8, r14, 8	// multiply by 256
	movi	r12, 0x0
	shl	r9, r8, 8
	shra	r8, 24
	shra	r9, 8
	nop
// Find Lha, Rha
	mov	r10, r9
	tsti	r8, 0x0
	bgte	1f
	movi	r8, 0x0
	movi	r10, 0x0
1:
	sub	r0, r12, r9
	movw	Lha, r10
	tsti	r0, 0x0
	bgte	2f
	movi	r0, 0x0
2:
	movw	r3, lofba1
	movw	Rha, r0
// Variable Timeconstant filter on the lowband signal path
	movw	r2, lbtcout
	mulf	r8, r2, r3
	movw	r5, lofbb0
	movw	r6, multval
//	nop
	madd	r8, r5, lb2v10db
	nop
	mov	r2, r8
	shra	r8, 2	//r8=a
	movi	r0, 0x0
	mov	r10, r8	// r8=r10=a
	tsti	r8, 0x0
	bgte	3f
	movi	r8, 0x0
3:
	nop
	movw	Flv, r8
	abs	r8, r10
	sub	r12, r0, r10	//r12=b
	movw	RLatt, r8
	tsti	r12, 0x0
	bgte	4f
	movi	r12, 0x0
4:
	mulf	r8, r2, r6	//r8=a
	movw	lbtcout, r2
	shl	r8, 7	// multiply by 128
	movw	Frv, r12
	shl	r9, r8, 8
	shra	r8, 24
	shra	r9, 8
	nop
// Find Lla, Rla
	mov	r12, r9
	tsti	r8, 0x0
	bgte	5f
	movi	r8, 0x0
	movi	r12, 0x0
5:
	sub	r10, r0, r9	//r0=0
	movw	Lla, r12
	tsti	r10, 0x0
	bgte	6f
	movi	r10, 0x0
6:
	li	r2, 0x600000	// 0.75
	movw	Rla, r10
// Evaluate Flv, Frv
	movw	r1, Cv
	li	r3, 0x09F73E	// 1.5*ONEVOLT
	mulnf	r8, r1, r2
	nop
	add	r8, r3
	movw	r4, Flv
	tsti	r8, 0x0
	bgte	1f
	movi	r8, 0x0
1:
	nop
	shl	r8, 1
	movw	r6, Frv
	tst	r8, r4
	blt	2f
	mov	r4, r8
2:
	tst	r8, r6
	blt	3f
	mov	r6, r8
3:
	movw	Flv, r4	// r4=b
	movw	Frv, r6	// r6=a
// Vca Update
	movi	r3, VCA0500
	movi	r1, vcatable
	movi	r2, MAXVCAINDEX
// Update Vca1 and Vca2 - Frv, Flv
	mulf	r8, r6, r3
	nop
	tst	r8, r2
	blte	4f
	mov	r8, r2	//r8=N6
4:
	mulf	r10, r4, r3
	shl	r8, 2	// convert to byte address
	tst	r10, r2
	blte	5f
	mov	r10, r2	//r10=N6
5:
	add	r12, r1, r8
	shl	r10, 2	// convert to byte address
	dlwr	r14, r12
	add	r11, r1, r10
	dlwr	r15, r11
	movw	vca1, r14
	movw	vca2, r15
// Update Vca09, Vca10 - Lha, Lla
	movi	r3, VCA1250
	movw	r4, Lha
	movw	r5, Lla
	mulf	r8, r4, r3
	nop
	tst	r8, r2
	blte	1f
	mov	r8, r2	//r8=N6
1:
	mulf	r10, r5, r3
	shl	r8, 2	// convert to byte address
	tst	r10, r2
	blte	2f
	mov	r10, r2
2:
	add	r12, r1, r8
	shl	r10, 2	// convert to byte address
	dlwr	r14, r12	//r14=a
	add	r11, r1, r10
	movw	r6, sscale
	dlwr	r15, r11
	mulf	r8, r6, r14
	mulf	r10, r6, r15
//	nop
	movw	vca09, r8
	movw	vca10, r10
// Update Vca11, Vca12 - Rha, Rla
	movi	r3, VCA1250
	movw	r4, Rha
	movw	r5, Rla
	mulf	r8, r4, r3
	nop
	tst	r8, r2
	blte	3f
	mov	r8, r2	//r8=N6
3:
	mulf	r10, r5, r3
	shl	r8, 2	// convert to byte address
	tst	r10, r2
	blte	4f
	mov	r10, r2
4:
	add	r12, r1, r8
	shl	r10, 2	// convert to byte address
	dlwr	r14, r12	//r14=a
	add	r11, r1, r10
	dlwr	r15, r11		//r5=b
	movw	vca11, r14
	movw	vca12, r15
// Update Vca8, Vca34
	movw	r4, RLatt
	movw	r5, Bv
	mulf	r8, r4, r3
	movi	r3, VCA0500
	tst	r8, r2
	blte	5f
	mov	r8, r2	//r8=N6
5:
	mulf	r10, r5, r3
	shl	r8, 2
	tst	r10, r2
	blte	6f
	mov	r10, r2
6:
	add	r12, r1, r8
	shl	r10, 2	// convert to byte address
	dlwr	r14, r12	//r14=a
	add	r11, r1, r10
	dlwr	r15, r11	//r5=b
	movw	vca8, r14
	movw	vca5, r14
	movw	vca34, r15
// Check for Wide/Narrow mode
	li	r2, 0x7FFFFF
	movh	r3, Lhcsflag
	andi	r5, r3, WIDE
	tsti	r5, WIDE
	beq	1f
	mov	r14, r2
1:
//	movw	vca8, r14
// Check for MUSIC/CINEMA mode and Set vca1, vca2 accordingly
	movw	r0, vca1
	movw	r1, vca2
	andi	r5, r3, MUSIC
	tsti	r5, MUSIC
	beq	2f
	movi	r0, 0x0
	movi	r1, 0x0
2:
	movw	vca1, r0
	movw	vca2, r1
//===== Move output to 0x1000 - 0x1C00 =====
	movi	AGRAdr1, LFRF
	movi	AGRAdr2, LSRS
	movi	AGRAdr3, CTSW
	movw	r2, storedataptr
	mov	AGRAdr4, r2
	movi	AGRSiz4, 0xffff

	loop	BLOCKSIZE, Align_6ch_data
	mov	r3, a1(1*4)
	mov	r4, a2(1*4)
	mov	r5, a3(1*4)
	mov	a4(1*4), r3
	mov	a4(1*4), r4
	mov	a4(1*4), r5
Align_6ch_data:
	mov	r2, AGRAdr4
	movw	storedataptr, r2	//Store ptr for next block

	addi	r20, 1	// counter

	tsti	r20, BLOCKSIZE
	bne	jump_SRS_init
no_SRS:
	jsr	r30, SUB_save_SRS_context
	jsr	r30, SUB_restore_pcm_context1000
	j	r29




/////===== SRS Context Switch ==================
SUB_save_pcm_context1000:		//0xd000-0xefff
	movi	StartAddrHigh, DataSeg	//to second segment
	movi	DMASize,31
	movi	r10,0x0
	movi	r11,(mpeg_context)>>2
	
	loop	32, save_pcm1000	//total of 32*32 words
	mov	LocalAddr, r10	
	dmawr	r11	
Lwait7:	bdb	Lwait7
	addi	r10, 32			//32 words each block
	addi	r11, 32
save_pcm1000:
	movi	r10,(0x1c00)>>2		// save a few high bank loacal mem

//	loop	2, save_pcm1c00		//total of 2*32 words
	mov	LocalAddr, r10	
	dmawr	r11	
Lwait7h:
	bdb	Lwait7h
	addi	r10, 32			//32 words each block
	addi	r11, 32
//save_pcm1c00:
	movi	StartAddrHigh,MEM_SEG	//back to first segment
	j	r30
//=========================================
SUB_restore_pcm_context1000:		//0xd000-0xefff
	movi	StartAddrHigh, DataSeg	//to second segment
	movi	DMASize,31
	movi	r10,0x0
	movi	r11,(mpeg_context)>>2
	
	loop	32, restore_pcm1000	//total of 32*32 words
	mov	LocalAddr, r10	
	dmarr	r11	
Lwait8:	bdb	Lwait8
	addi	r10, 32			//32 words each block
	addi	r11, 32
restore_pcm1000:
	movi	r10,(0x1c00)>>2		// restore a few high bank loacal mem

//	loop	2, restore_pcm1c00	//total of 2*32 words
	mov	LocalAddr, r10	
	dmarr	r11	
Lwait8h:
	bdb	Lwait8h
	addi	r10, 32			//32 words each block
	addi	r11, 32
//restore_pcm1c00:

	movi	StartAddrHigh,MEM_SEG	//back to first segment
	j	r30
//=========================================
SUB_save_SRS_context:		//0x8000-0x9000
	movi	StartAddrHigh, DataSeg	//to second segment
	movi	DMASize, 31
	movi	r10, 0x0
	movi	r11, (SRS_context)>>2
	
	loop	32, save_SRS	//total of 32*32 words
	mov	LocalAddr, r10	
	dmawr	r11	
Lwait9:	bdb	Lwait9
	
	addi	r10, 32		//32 words each block
	addi	r11, 32
save_SRS:
	movi	r10,(0x1c00)>>2		// save a few high bank loacal mem

//	loop	2, save_SRS1c00		//total of 2*32 words
	mov	LocalAddr, r10	
	dmawr	r11	
Lwait9h:
	bdb	Lwait9h
	addi	r10, 32			//32 words each block
	addi	r11, 32
//save_SRS1c00:

	movi	StartAddrHigh, MEM_SEG	//back to first segment
	j	r30




//=========================================
SUB_restore_SRS_context:		//0x8000-0x9000
	movi	StartAddrHigh, DataSeg	//to second segment
	movi	DMASize, 31
	movi	r10, 0x0		//no need to copy output
	movi	r11, (SRS_context)>>2	//SRS_context = 0x8000
	
	loop	32, restore_SRS		//total of 32*32 words
	mov	LocalAddr, r10	
	dmarr	r11	
Lwait10:
	bdb	Lwait10
	
	addi	r10, 32			//32 words each block
	addi	r11, 32
restore_SRS:
	movi	r10,(0x1c00)>>2		// restore a few high bank loacal mem

//	loop	2, restore_SRS1c00	//total of 2*32 words
	mov	LocalAddr, r10	
	dmarr	r11	
Lwait10h:
	bdb	Lwait10h
	addi	r10, 32			//32 words each block
	addi	r11, 32
//restore_SRS1c00:
	movi	StartAddrHigh,MEM_SEG	//back to first segment
	j	r30
/////===== End of SRS Context Switch ==================

⌨️ 快捷键说明

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