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

📄 stereo.s

📁 samsung 9908DVD源代码,
💻 S
字号:
;-----------------------------------------------------------
;		The following program will decoding MP3 bitstream
;		by S/W Algorithm
;			File Name: stereo_up.s
;			copyright ji,Han      2000.11.28
;
;-----------------------------------------------------------
.include	"mp3_def.h"
.include	"mp3_ext.h"

	MP3SteteoSection

DecodingStereoLSF::	
	ldb		r0		,@[a13+Index_Mode]
	cmp		eq		,r0		,#const_jointStereo							;(01)
	brt		conti_st
	ret
conti_st	
	eld		sd0,	#((-1&0fh)<<12)|(0<<8)|((-1&0fh)<<4)|(0<<0)	
	eld		sd1,	#((-1&0fh)<<12)|(0<<8)|((-1&0fh)<<4)|(0<<0)	
	eld		sd2,	#((1&0fh)<<12)|(0<<8)|((1&0fh)<<4)|(0<<0)	
	eld		sd3,	#((1&0fh)<<12)|(0<<8)|((1&0fh)<<4)|(0<<0)
	
	eld		b		,rpd1.index_GmpegModeExt					;b[23:8]<-Zero
																;b[7:0]<-mode extension
	eld		sg		,b
	enmsk	sg		,#1
	eld		a		,sg
	eld		rpd1.index_LiStereo		,a
	
	esra	b
	eld		rpd1.index_LmsStereo	,b
	
	eld		a		,#576
	eld		rpd1.index_Lbound		,a
		
	// intensity stereo 
	eld		a		,rpd1.index_LiStereo						
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		NotiStereo

	eld		a		,d
	eld		rpd1.index_LsfbL		,a
	eld		c		,rpd1.index_GLongSfBandIndex		
	eadd	a		,c
	eld		rp3		,a
	eld		a		,@rp3
	eld		rpd1.index_Lbound		,a	

	eld		a		,#0
	eld		rpd1.index_Lf			,a
	eld		rpd1.index_Lw			,a
	eld		rpd1.index_Ln			,a

	eld		a		,rpd0.index_scalefacCompress+8
	eld		sg		,a
	enmsk	sg		,#1
	eld		a		,sg
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		io_type
	
	eld		a		,#tbl_stereoLsfTable2+3
	eld		rpd1.index_LstereoLeftRight	,a				;backup		
	jmp		NonLSFStereo	
io_type		
	eld		a		,#tbl_stereoLsfTable2
	eld		rpd1.index_LstereoLeftRight	,a				;backup	
NonLSFStereo
	eld		b		,rpd0.index_blockType
	ecld	r0		,b
	srb		r0
	cmp		eq		,r0		,#2
	brt		Short_Process

	eld		a		,#7
	eld		rpd1.index_LisPos		,a

	esec0	#1
	esec1	#3
	esec2	#2
	eld		a		,rpd1.index_Lbound 
	eld		rpd1.index_LloopCounti2	,a	
BoundForLoop
	eld		a		,rpd1.index_LloopCounti2		
	ecld	r4		,a
	cmp		ge		,r4		,#576
	brt		BoundForLoopEnd

	ecp		a		,#576
	enop
	bra		ec0		,LoopPass

	jmp 	BoundForLoopEnd
LoopPass	
	eld		a		,rpd1.index_Lf
	ecld	r4		,a
	cmp		eq		,r4		,#0
    brf		fCount

	// long blocks 	
	eld		b		,rpd1.index_Glsf
	ecld	r1		,b
	cmp		eq		,r1		,#0
	brf		LSFBitrate2
	eld		b		,rpd1.index_GOrgSampFreq	
	jmp		LSFBitrateEnd2				
LSFBitrate2				
	eld		b		,rpd1.index_GOrgSampFreq	
	eadd	b		,#3
LSFBitrateEnd2				
	eld		x0		,b
	eld		y0		,#22
	emul	x0y0
	eld		b		,pl
	esra	b
	eadd	b		,#tbl_sfwidth_l
	eld		c		,rpd1.index_LsfbL
	eadd	b		,c
	eld		rp3		,b
	eld		b		,@rp3+s0
//	esub	b		,#1
	eld		rpd1.index_Lf		,b			

	eld		b		,rpd1.index_Glsf		
	ecld	r0		,b
	cmp		eq		,r0		,#2
	brf		pass_mpeg25L2	
	
	eld		b		,rpd1.index_GLongSfBandIndex
	eld		c		,rpd1.index_LsfbL
	eadd	b		,c
	eadd	b		,#1
	eld		rp0		,b
	eld		b		,@rp0+s1
	eld		c		,@rp0+s0
	esub	b		,c
	eld		rpd1.index_Lf	,b				
pass_mpeg25L2		
	eld		b		,#Area_Scalefactor
	eadd	b		,#SizeOfScalefactor
	eld		c		,rpd1.index_LsfbL
	eadd	b		,c
	eld		rp3		,b
	eld		b		,@rp3+s0
	eld		rpd1.index_LisPos	,b	
	eld		b		,rpd1.index_LsfbL
	eadd	b		,#1
	eld		rpd1.index_LsfbL	,b	
	jmp		fCountEnd	
fCount
	eld		a		,rpd1.index_Lf
	esub	a		,#1
	eld		rpd1.index_Lf		,a
fCountEnd
	eld		b		,#Area_leftChannel
	eld		c		,rpd1.index_LloopCounti2
	eadd	b		,c
	eld		rp0		,b
	eld		b		,#Area_rightChannel
	eld		c		,rpd1.index_LloopCounti2
	eadd	b		,c
	eld		rp1		,b

	eld		a		,rpd1.index_LisPos
	ecld	r0		,a
	cmp		ge		,r0		,#7
	brt		isPosOver

	eld		c		,#tbl_isTable+6
	eld		rp2		,c
	eld		x0		,@rp0+s0
	
	eld		a		,rpd1.index_Glsf
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		NonLsfStereo
	
	eld		a		,rpd1.index_LisPos
	eld		sr		,a
	eld		b		,sr
	enop
	bra		ec0		,PassIntensityUp							;ec0=nz

	eld		y0		,@rp2+s0
	emul	x0y0
	emld	ma0		,x0y0
	ernd	ma0
	
	eld		@rp0+d0	,ma0
	eld		@rp1+d0	,ma0

	jmp		NoneMSstereo
PassIntensityUp
	eld		sg		,sr
	enmsk	sg		,#1
	eld		b		,sg
	enop
	bra		ec0		,kr_intensityUp							;ec0=nz

	eld		b		,sr										;b<-is_pos[sfb]
//	esub	b		,#1
	esra	b
	eld		c		,rpd1.index_LstereoLeftRight	
	eadd	b		,c							;b+=tbl_stereoLeftRight	
	eld		rp3,	b	
	eld		y1		,@rp3+s0					
	emul	x0y1

	emld	ma0		,x0y1
	ernd	ma0
	eld		@rp1+d0	,ma0

	eld		y0		,@rp2+s0
	emul	x0y0
	emld	ma0		,x0y0
	ernd	ma0
	eld		@rp0+d0	,ma0

	jmp		NoneMSstereo
kr_intensityUp	
	eld		b		,sr										;b<-is_pos[sfb]
	esub	b		,#1
	esra	b
	eld		c		,rpd1.index_LstereoLeftRight				;b+=tbl_stereoLeftRight
	eadd	b		,c
	eld		rp3,	b	
	eld		y0		,@rp3+s0
	emul	x0y0

	emld	ma0		,x0y0
	ernd	ma0
	eld		@rp0+d0	,ma0

	eld		y0		,@rp2+s0
	emul	x0y0
	emld	ma0		,x0y0
	ernd	ma0
	eld		@rp1+d0	,ma0
	
	jmp		NoneMSstereo
NonLsfStereo
	eld		a		,rpd1.index_LisPos
	eadd	a		,#tbl_isTable
	eld		rp3		,a
	eld		y0		,@rp3+s0
	eld		b		,#6
	eld		c		,rpd1.index_LisPos
	esub	b		,c
	eadd	b		,#tbl_isTable
	eld		rp3		,b
	eld		y1		,@rp3+s0

	emul	x0y0
	emld	ma0		,x0y0
	ernd	ma0
	eld		@rp0+d0	,ma0
	emul	x0y1
	emld	ma0		,x0y1	
	ernd	ma0
	eld		@rp1+d0	,ma0	

	jmp		NoneMSstereo
NonLsfStereoEnd	
		
isPosOver
	eld		b		,rpd1.index_LmsStereo
	ecld	r0		,b
	cmp		eq		,r0		,#0
	brt		NoneMSstereo

	ld		r0		,#0x827a
	ecld	c		,r0
	ld		r0		,#0x5a
	ecld	ch		,r0
	eld		y0		,c
	
	eld		a		,@rp0+s0
	eld		c		,@rp1+s0
	eadd	a		,c
	
	eld		x0		,a
	eld		a		,@rp0+s0
	eld		c		,@rp1+s0
	esub	a		,c
	eld		x1		,a	
	
	emul	x0y0
	emld	ma0		,x1y0
	ernd	ma0
	eld		@rp0+d0	,ma0

	emld	ma0		,x1y0
	ernd	ma0
	eld		@rp1+d0	,ma0	
NoneMSstereo
	eld		a		,rpd1.index_LloopCounti2		
	eadd	a		,#1
	eld		rpd1.index_LloopCounti2	,a	
	jmp		BoundForLoop
BoundForLoopEnd	
	
NotiStereo
	// middle/side stereo 
	eld		a		,rpd1.index_LmsStereo
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		NotmsStereo
	
	esec0	#0
	eld		a		,rpd1.index_Lbound
	eld		rpd1.index_LloopCounti2	,a	
	eld		b		,#Area_leftChannel-1
	eld		c		,rpd1.index_LloopCounti2
	eadd	b		,c
	eld		rp0		,b
	eld		b		,#Area_rightChannel-1
	eld		c		,rpd1.index_LloopCounti2
	eadd	b		,c
	eld		rp1		,b	

	ld		r0		,#0x827a
	ecld	c		,r0
	ld		r0		,#0x5a
	ecld	ch		,r0
	eld		y0		,c
BoundWhileLoop
	eld		a		,rpd1.index_LloopCounti2		
	ecp		a		,#0
	enop
	bra		ec0		,BoundWhileLoopEnd
	
	eld		a		,@rp0+s0
	eld		c		,@rp1+s0
	eadd	a		,c
	eld		x0		,a
	
	eld		a		,@rp0+s0
	eld		c		,@rp1+s0
	esub	a		,c
	eld		x1		,a	
	
	emul	x0y0
	emld	ma0		,x1y0
	ernd	ma0
	eld		@rp0+d1	,ma0

	emld	ma0		,x1y0
	ernd	ma0
	eld		@rp1+d1	,ma0		
	
	eld		a		,rpd1.index_LloopCounti2		
	esub	a		,#1
	eld		rpd1.index_LloopCounti2	,a	

	jmp		BoundWhileLoop	
BoundWhileLoopEnd

NotmsStereo
	eld		sd0		,#((-2&0fh)<<12)|(2<<8)|((-1&0fh)<<4)|(1<<0)	
	eld		sd1		,#((-1&0fh)<<12)|(-2<<8)|((-1&0fh)<<4)|(1<<0)	
	eld		sd2		,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(0<<0)	
	eld		sd3		,#((-1&0fh)<<12)|(1<<8)|((-3&0fh)<<4)|(7<<0)	

	esec0	#1
	esec1	#5
	esec2	#0x0f
		
	ret
///////////////////////////////////////////////////////////////////	
///////////////////////////////////////////////////////////////////	
Short_Process	
	esd0	d0		,#1
	esd1	d0		,#1
	esd0	d1		,#1
	esd1	d1		,#1

	esec0	#0
	esec1	#1
	esec2	#2
	
	eld		a		,#0
	eld		rpd1.index_Lf		,a
	eld		rpd1.index_Lw		,a
	eld		rpd1.index_Ln		,a
ShortWindowLoop	
	eld		b		,rpd1.index_Lw
	ecld	r4		,b
	cmp		eq		,r4		,#3
	brt		ShortWindowLoopEnd	

	eld		a		,rpd1.index_GZeroPart		
	ecld	r0		,a										// each window bound sfb
	and		r0		,#0xff									// each window bound sfb
	esra8	a
	eld		rpd1.index_GZeroPart,a
	eld		a		,#0
	ecld	a		,r0
	eld		rpd1.index_LsfbS	,a
	eld		rpd1.index_Ln		,a		
ShortSfbLoop
	eld		a		,rpd1.index_LsfbS
	ecld	r4		,a
	cmp		eq		,r4		,#13							//11.29
	brt		ShortSfbLoopEnd	

	eld		b		,#Area_Scalefactor
	eadd	b		,#SizeOfScalefactor
	eld		a		,rpd1.index_LsfbS
//
	esub	a		,#1
//
	eld		x0		,a
	eld		y0		,#3									
	emul	x0y0	
	eld		a		,pl
	esra	a
	eadd	b		,a
	eld		c		,rpd1.index_Lw						// window	
	eadd	b		,c
	eld		rp3		,b
	eld		b		,@rp3+s0
	eld		rpd1.index_LisPos	,b

	eld		b		,rpd1.index_Glsf
	ecld	r1		,b
	cmp		eq		,r1		,#0
	brf		LSFBitrateS2S
	eld		b		,rpd1.index_GOrgSampFreq	
	jmp		LSFBitrateEndS2S				
LSFBitrateS2S				
	eld		b		,rpd1.index_GOrgSampFreq	
	eadd	b		,#3
LSFBitrateEndS2S				
	eld		x0		,b
	eld		y0		,#13
	emul	x0y0
	eld		b		,pl
	esra	b
	eadd	b		,#tbl_sfwidth_s
	eld		c		,rpd1.index_LsfbS	
	eadd	b		,c
	eld		rp3		,b
	eld		b		,@rp3+s0
	eld		rpd1.index_Lf	,b					 //sb		

	eld		b		,rpd1.index_Glsf		
	ecld	r0		,b
	cmp		eq		,r0		,#2
	brf		pass_mpeg25S1	
	
	eld		b		,rpd1.index_GShortSfBandIndex		
	eld		c		,rpd1.index_LsfbS
	eadd	b		,c
	eadd	b		,#1
	eld		rp0		,b
	eld		b		,@rp0+s1
	eld		c		,@rp0+s0
	esub	b		,c
	eld		rpd1.index_Lf	,b				
pass_mpeg25S1	
	eld		b		,rpd1.index_Lf
	eld		x0		,b
	eld		b		,rpd1.index_Lw
	eld		y0		,b
	emul	x0y0
	eld		b		,pl
	esra	b	
	
	eld		a		,rpd1.index_LsfbS	
	eld		c		,rpd1.index_GShortSfBandIndex		
	eadd	a		,c
	eld		rp3		,a
	eld		a		,@rp3+s0
	eld		c		,@rp3+s0
	eadd	a		,c
	eld		c		,@rp3+s0
	eadd	a		,c

	eadd	a		,b
	eld		rpd1.index_LloopCounti2	,a
	eadd	a		,#Area_leftChannel
	eld		rp0		,a

	eld		a		,@rp3+s0
	eld		c		,@rp3+s0
	eadd	a		,c
	eld		c		,@rp3+s0
	eadd	a		,c
	
	eadd	a		,b
	eadd	a		,#Area_rightChannel	
	eld		rp1		,a	
ShortSbLoop
	eld		a		,rpd1.index_Lf
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		ShortSbLoopEnd

	eld		a		,rpd1.index_LisPos
//	esec0	#3
	ecld	r0		,a
	cmp		ge		,r0		,#7
	brt		isPosOverS
			
	eld		rp2		,#tbl_isTable+6
	eld		x0		,@rp0+s0
	
	eld		a		,rpd1.index_Glsf
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		NonLsfStereoS
	
	eld		a		,rpd1.index_LisPos
	eld		sr		,a
	eld		b		,sr
	enop
	bra		ec1		,PassIntensityUpS

	eld		y0		,@rp2+s0
	emul	x0y0
	emld	ma0		,x0y0
	ernd	ma0
	
	eld		@rp0+d0	,ma0
	eld		@rp1+d0	,ma0

	jmp		NoneMSstereoS
PassIntensityUpS
	eld		sg		,sr
	enmsk	sg		,#1
	eld		b		,sg
	enop
	bra		ec1		,kr_intensityUpS

	eld		b		,sr										;b<-is_pos[sfb]
//	esub	b		,#1
	esra	b
	eld		c		,rpd1.index_LstereoLeftRight
	eadd	b		,c						;b+=tbl_stereoLeftRight
	eld		rp3,	b	
	eld		y1		,@rp3+s0					
	emul	x0y1
	emld	ma0		,x0y1
	ernd	ma0
	eld		@rp1+d0	,ma0

	eld		y0		,@rp2+s0
	emul	x0y0
	emld	ma0		,x0y0
	ernd	ma0
	eld		@rp0+d0	,ma0

	jmp		NoneMSstereoS
kr_intensityUpS	
	eld		b		,sr										;b<-is_pos[sfb]
	esub	b		,#1
	esra	b
	eld		c		,rpd1.index_LstereoLeftRight				;b+=tbl_stereoLeftRight
	eadd	b		,c										;b+=tbl_stereoLeftRight
	eld		rp3,	b	
	eld		y0		,@rp3+s0
	emul	x0y0
	emld	ma0		,x0y0
	ernd	ma0
	eld		@rp0+d0	,ma0

	eld		y0		,@rp2+s0
	emul	x0y0
	emld	ma0		,x0y0
	ernd	ma0
	eld		@rp1+d0	,ma0
	
	jmp		NoneMSstereoS
NonLsfStereoS
	eld		a		,rpd1.index_LisPos
	eadd	a		,#tbl_isTable
	eld		rp3		,a
	eld		y0		,@rp3+s0
	
	eld		b		,#6
	eld		c		,rpd1.index_LisPos
	esub	b		,c
	eadd	b		,#tbl_isTable
	eld		rp3		,b
	eld		y1		,@rp3+s0

	emul	x0y0
	emld	ma0		,x0y0
	ernd	ma0
	eld		@rp0+d0	,ma0
	emul	x0y1
	emld	ma0		,x0y1	
	ernd	ma0
	eld		@rp1+d0	,ma0	

	jmp		NoneMSstereoS
NonLsfStereoEndS	
		
isPosOverS
	eld		b		,rpd1.index_LmsStereo
	ecld	r0		,b
	cmp		eq		,r0		,#0
	brt		NoneMSstereoS

///	eld		rp3		,#tbl_overSquaRoot
///	eld		y0		,@rp3+s0
	ld		r0		,#0x827a
	ecld	c		,r0
	ld		r0		,#0x5a
	ecld	ch		,r0
	eld		y0		,c
	
	eld		a		,@rp0+s0
	eld		c		,@rp1+s0
	eadd	a		,c
	eld		x0		,a
	eld		a		,@rp0+s0
	eld		c		,@rp1+s0
	esub	a		,c
	eld		x1		,a	
	
	emul	x0y0
	emld	ma0		,x1y0
	ernd	ma0
	eld		@rp0+d0	,ma0
	emld	ma0		,x1y0
	ernd	ma0
	eld		@rp1+d0	,ma0	
NoneMSstereoS
	eld		a		,rpd1.index_Lf
	esub	a		,#1
	eld		rpd1.index_Lf	,a
	esec0	#0
	jmp		ShortSbLoop
ShortSbLoopEnd
	eld		a		,rpd1.index_LsfbS
	eadd	a		,#1
	eld		rpd1.index_LsfbS,a
	jmp		ShortSfbLoop
ShortSfbLoopEnd
///////////////////////////////////////////////////
	// middle/side stereo 
	eld		a		,rpd1.index_LmsStereo
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		ShortSfbLoopMSEnd

	eld		a		,rpd1.index_Ln
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		ShortSfbLoopMSEnd

	esub	a		,#1
	eld		rpd1.index_LsfbS,a
ShortSfbLoopMS
	eld		a		,rpd1.index_LsfbS
	ecld	r0		,a
	cmp		ge		,r0		,#0
	brf		ShortSfbLoopMSEnd

	eld		b		,rpd1.index_Glsf
	ecld	r1		,b
	cmp		eq		,r1		,#0
	brf		LSFBitrateS2MS		
	eld		b		,rpd1.index_GOrgSampFreq	
	jmp		LSFBitrateEndS2MS				
LSFBitrateS2MS				
	eld		b		,rpd1.index_GOrgSampFreq	
	eadd	b		,#3
LSFBitrateEndS2MS				
	eld		x0		,b
	eld		y0		,#13
	emul	x0y0
	eld		b		,pl
	esra	b
	eadd	b		,#tbl_sfwidth_s
	eld		c		,rpd1.index_LsfbS	
	eadd	b		,c
	eld		rp3		,b
	eld		b		,@rp3+s0
	eld		rpd1.index_Lf	,b					 //sb		

	eld		b		,rpd1.index_Glsf		
	ecld	r0		,b
	cmp		eq		,r0		,#2
	brf		pass_mpeg25S2	
	
	eld		b		,rpd1.index_GShortSfBandIndex		
	eld		c		,rpd1.index_LsfbS
	eadd	b		,c

	eadd	b		,#1
	eld		rp0		,b
	eld		b		,@rp0+s1
	eld		c		,@rp0+s0
	esub	b		,c
	eld		rpd1.index_Lf	,b				
pass_mpeg25S2	
	eld		b		,rpd1.index_Lf					
	eld		x0		,b
	eld		b		,rpd1.index_Lw
	eld		y0		,b
	emul	x0y0
	eld		b		,pl
	esra	b	

	eld		a		,rpd1.index_LsfbS	
	eld		c		,rpd1.index_GShortSfBandIndex		
	eadd	a		,c

	eld		rp3		,a
	eld		a		,@rp3+s0
	eld		c		,@rp3+s0
	eadd	a		,c

	eld		c		,@rp3+s0
	eadd	a		,c
	eadd	a		,#Area_leftChannel
	eadd	a		,b
	eld		rp0		,a
	
	eld		a		,@rp3+s0
	eld		c		,@rp3+s0
	eadd	a		,c
	eld		c		,@rp3+s0
	eadd	a		,c
	eadd	a		,#Area_rightChannel
	eadd	a		,b
	eld		rp1		,a	
	
///	eld		rp3		,#tbl_overSquaRoot
///	eld		y0		,@rp3+s0	
	ld		r0		,#0x827a
	ecld	c		,r0
	ld		r0		,#0x5a
	ecld	ch		,r0
	eld		y0		,c
ShortSbLoopMS	
	eld		a		,rpd1.index_Lf
	enop
	bra		ec0		,ShortSbLoopMSEnd
	
	eld		a		,@rp0+s0
	eld		c		,@rp1+s0
	eadd	a		,c
	eld		x0		,a
	
	eld		a		,@rp0+s0
	eld		c		,@rp1+s0
	esub	a		,c
	eld		x1		,a	
	emul	x0y0
	emld	ma0		,x1y0
	ernd	ma0
	eld		@rp0+d1	,ma0

	emld	ma0		,x1y0
	ernd	ma0
	eld		@rp1+d1	,ma0		

	eld		a		,rpd1.index_Lf
	esub	a		,#1
	eld		rpd1.index_Lf	,a

	jmp		ShortSbLoopMS	
ShortSbLoopMSEnd
	eld		a		,rpd1.index_LsfbS
	esub	a		,#1
	eld		rpd1.index_LsfbS,a
	jmp		ShortSfbLoopMS
ShortSfbLoopMSEnd	
	eld		a		,rpd1.index_Lw
	eadd	a		,#1
	eld		rpd1.index_Lw	,a
	jmp		ShortWindowLoop
ShortWindowLoopEnd
	jmp		NotmsStereo
	
	end

⌨️ 快捷键说明

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