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

📄 dequanti.s

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

const_MaxScale		equ		22

		MP3DequantiSection
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;			d1	d0	 s1	  s0
;	sd0  = -1 | 3  | -2 | 1
;	sd1  = xx | xx | -1 | 2
;	sd2  = xx | xx | xx | 1
;	sd3  = xx | xx | xx | xx
;
;	rp0 : used as the pointer of the current decoding pointer
;	rp1 : used as the pointer of sfb's frequency
;	rp2 : used as the pointer of scalefactor
;	rp3 : used as a temporary pointer
;		x0		u		mantissa
;		x1		u		the table pointer of power2x
;		y0 		u		pow(2,-(i%4))
;		y1  	u		shift value
;		si		u		the table pointer etbl_mantisaOfPow43Org
;		sr		u		const_MaxScale
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DecodingDequantizer::
	eld		sd0		,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(0<<0)
	eld		sd1		,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(2<<0)	
	esd2	s0		,#1
	eld		sd3		,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(1<<0)		

	eld		sa		,#-6									;for newton polynominal
	eld		a		,#tbl_pretab
	eld		rpd1.index_LRPxBackupBuffer		,a
	eld		a		,#tbl_powerMask
	eld		rpd1.index_LbackupTable			,a			;backup	
	eld		rp2		,#Area_Scalefactor					;scalefactor pointer

	ldb		r0		,@[a13+Index_ChannelLoop]
	cmp		eq		,r0		,#0
	brf		decq_ch
	erpn	rp2		,#SizeOfScalefactor	
decq_ch	
	eld		c		,rpd1.index_GptrCurrentDecodingData		
	eld		rp0		,c
	eld		a		,#tbl_power2x
	eld		x1		,a									;x1<-tbl_power2x
	eld		a		,#tbl_mantisaOfPow43Org				;tbl_exponentOfPow43
	eld		si		,a

	eld		b		,rpd0.index_globalGain				;b[23:16]=global_gain
														;b[15:8]=scalefac_compress
														;b[7:0]=scalefac_compress
	esra8	b											;b<-global_gain
	esra8	b
	efz16	b
	esub	b		,#210								;b<-global_gain-210
	eld		rpd1.index_LglobalGain210	,b
	eld		a		,rpd0.index_windowSwitchingFlag		;a[23:16]<-windowSwitchingFlag
														;a[15:8]=blockType
														;a[7:0]=mixedBlockFlag
	esra	a											;c<-mixedBlockFlag
	etst	nc		,t
	efs8	a	
//	ecp		a		,#((1<<16)|(const_shortBlock<<8))>>1	;switching&short
	eld		c		,#((1<<16)|(const_shortBlock<<8))>>1

	ecld	r0		,a
	ecld	r1		,c
	cmp		eq		,r0		,r1
	brf		LongBlock														;eq if pure short					

	cmpu	ge		,r0		,r1
	brt		ShortBlock														;eq if pure short					
MixedBlock
	esec2	#sec_z										;ec2<-z-flag
	eld		c		,rpd1.index_GLongSfBandIndex		;rp1:sfb band index
	eld		rp1		,c
	erpd	rp1+d0										;rp1<-rp1+1	

	ld		r6		,#7									;sfb size
	eld		a		,@rp1+s1							;a<-bands[i+1],rp1<-rp1-1	
MixedBlockLongSfbLoop
	eld		c		,@rp1+s0
	esub	a		,c									;a<-bands[i+1]-bands[i],	
														;rp1<-rp1+2
	eadd	a		,#-1
	ecld	r2		,a									;r2<-frequency lines
	eld		c		,rpd1.index_LRPxBackupBuffer
	eld		rp2		,c
	eld		a		,@rp2+s0								;a<-tbl_pretab[sfb]
	eld		c		,rp2
	eld		rpd1.index_LRPxBackupBuffer		,c
	eld		b		,rpd0.index_preFlag					;a[23:16]<-region0Count
														;a[15:8]<-region1Count
														;a[7:0]<-preFlag
	efz16	b
	etst	z		,t
	efz8t	a
	
	eld		c		,@rp2+s0
	eadd	a		,c									;a<-_l[sfb]+tbl_pretab[sfb]
	eld		b		,rpd0.index_scalefacScale			;b[23:16]<-zero
														;b[15:8]<-scalefacScale
														;b[7:0]<-count1TableSelect
	esra8	b
	etst	nz		,t
	eslat	a											;a *= 4 if scalefac_scale
	esla	a											;a *= 2 if !scalefac_scale
	eld		c		,rpd1.index_LglobalGain210
	esub	a		,c									;a<-scalefac_mul*(scalefac_l+preflag*pretab)
														;-(global_gain-210)
	push	a14
	jsr		DecodingDequantizerCommon
	pop		a14

	bnzd	r6		,MixedBlockLongSfbLoop
	eld		a		,@rp1+s1								;a<-bands[i+1],rp1<-rp1-1
	
	ld		r6		,#12-3								;sfb size of short block	
	erpn	rp1		,#18									;for pointing rp1 to band_s[3]

	jmp		ShortBlockCommon				
ShortBlock
	esec2	#sec_z										;ec2<-z-flag

	eld		c		,rpd1.index_GShortSfBandIndex		;rp1:sfb band index
	eld		rp1		,c
	erpd	rp1+d0										;rp1<-rp1+1	

	ld		r6		,#12									;sfb size of short block
ShortBlockCommon	
	eld		a		,@rp1+s1								;a<-bands[i+1],rp1<-rp1-1	
ShortBlockSfbLoop	
	eld		c		,@rp1+s0
	esub	a		,c									;a<-bands[i+1]-bands[i],
														;rp1<-rp1+2
	eadd	a		,#-1
	ecld	r2		,a									;r1<-frequency lines in sfb
	eld		b		,@rp2+s0								;b<-scalefac_s[][0]	
	esla8	b										
	eld		c		,@rp2+s0
	eadd	b		,c										;b<-scalefac_s[][1]	
	esla8	b
	eld		c		,@rp2+s0
	eadd	b		,c								;b[23:16]<-scalefac_s[i]	
														;b[15:8]<-scalefac_s[i+1]
														;b[7:0]<-scalefac_s[i+2]

	eld		a		,rpd0.index_scalefacScale			;b[23:16]<-zero
														;b[15:8]<-scalefacScale
														;b[7:0]<-count1TableSelect
	esra8	a
	etst	nz		,t
	eslat	b											;b *= 4 if scalefac_scale
	esla	b											;b *= 2 if !scalefac_scale
	eld		a		,rpd0.index_subBlockGain0			;a[23:16]<-subBlockGain0
														;a[15:8]<-subBlockGain1
														;a[7:0]<-subBlockGain2
	esla	a
	esla	a
	esla	a											;a=subBlockGain[0,1,2]*8	
	eadd	a		,b									;a[23:16]<- subblock_gain0*8
														;+scalefac_mutiplier*scalefac_s[i]*4
														;a[15:8]<- subblock_gain1*8
														;+scalefac_mutiplier*scalefac_s[i+1]*4
														;a[7:0]<- subblock_gain2*8
														;+scalefac_mutiplier*scalefac_s[i+2]*4
	eld		rpd1.index_LbackA		,a
	esra8	a
	esra8	a
	eld		c		,rpd1.index_LglobalGain210
	esub	a		,c									;a-=(global_gain-210)
	ld		r1		,r2									;backup
	push	a14
	jsr		DecodingDequantizerCommon					;window 0
	pop		a14
	
	eld		a		,rpd1.index_LbackA
	esra8	a
	efz16	a											;a<-subBlock1's value
	eld		c		,rpd1.index_LglobalGain210
	esub	a		,c									;a-=(global_gain-210)
	
	ld		r2		,r1
	push	a14
	jsr		DecodingDequantizerCommon					;window 1
	pop		a14

	eld		a		,rpd1.index_LbackA
	efz16	a											;a<-subBlock2's value
	eld		c		,rpd1.index_LglobalGain210
	esub	a		,c									;a-=(global_gain-210)
	
	ld		r2		,r1									;frequency lines
	push	a14
	jsr		DecodingDequantizerCommon					;window 2
	pop		a14

	eld		a		,@rp1+s1							;a<-bands[i+1],rp1<-rp1-1
	cmp		eq		,r6		,#0
	brfd	ShortBlockSfbLoop
	dec		r6
	
	jmp		DequantizerCommon
LongBlock
	esec2	#sec_z										;ec2<-z-flag
	eld		c		,rpd1.index_GLongSfBandIndex			;rp1:sfb band index
	eld		rp1		,c
	erpd	rp1+d0										;rp1<-rp1+1	

	ld		r6		,#21
	eld		a		,@rp1+s1								;a<-bands[i+1],rp1<-rp1-1	
LongBlockSfbLoop	
	eld		c		,@rp1+s0
	esub	a		,c									;a<-bands[i+1]-bands[i],	
														;rp1<-rp1+2
	eadd	a		,#-1
	ecld	r2		,a										;r2<-frequency lines	
	eld		a		,rpd1.index_LRPxBackupBuffer
	eld		rp3		,a
	eld		a		,@rp3+s0								;a<-tbl_pretab[sfb]
	eld		b		,rp3
	eld		rpd1.index_LRPxBackupBuffer		,b
	eld		b		,rpd0.index_preFlag					;a[23:16]<-region0Count
														;a[15:8]<-region1Count
														;a[7:0]<-preFlag
	efz16	b
//Insert,1999.11.24
	etst	z		,t									;for preflag[gr]*pretab[sfb]
	esra8t	a											;a=0,if b==0	
//Insert end,1999.11.24
	eld		c		,@rp2+s0
	eadd	a		,c									;a<-_l[sfb]+tbl_pretab[sfb]
	eld		b		,rpd0.index_scalefacScale
	esra8	b
	etst	nz		,t
	eslat	a											;a *= 4 if scalefac_scale
	esla	a											;a *= 2 if !scalefac_scale
	eld		c		,rpd1.index_LglobalGain210
	esub	a		,c									;a<-scalefac_mul*(scalefac_l+preflag*pretab)
														;-(global_gain-210)
	push	a14
	jsr		DecodingDequantizerCommon
	pop		a14

	bnzd	r6		,LongBlockSfbLoop
	eld		a		,@rp1+s1								;a<-bands[i+1],rp1<-rp1-1
DequantizerCommon	
	esec2	#sec_t										;ec2<-t flag	

	ret

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;		rp0		I		the pointer of input buffer
;		a		I		in case of short:(-(global_gain-210)+8*subblock_gain+
;						                  scalefac_multiplier*scalefac_s*(2 or 4))
;						in case of long: (-(global_gain-210)+scalefac_multiplier*
;										 (scalefac_s+preflag*pretab)*(2 or 4))
;						a-register will be always positive or zero
;		tbl_power2x		pow (2,(0/4,1/4,2/4 or 3/4)
;		xr = sign(isi)*|isi|-----
;
;	a = 4*(scalefac_multiplier*(scalefac_l[sfb][ch][gr]+preflag[gr]*pretab[sfb]))-(global_gain[gr]-210)
;	Generally A is positive.
;	pow({is|,4/3)'exponent is the value =(real value+22)
;	xr = sign(is) * [pow(|is|,4/3)'mantiss*(y1<<23)] >> (pow(|is|,4/3)'exponent+y0)
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DecodingDequantizerCommon:
	eld		sg		,a
	esra	a
	esra	a												;a<- a/4
	enmsk	sg		,#2										;sg<-a%4
	eld		b		,sg

	eadd	b		,x1										;x1:tbl_power2x
	eld		rp3		,b

	eld		ma0		,a										;mah<-scalefactor's shif value
	eld		y0		,@rp3									;y0<-pow(2,-i/4),i=0,1,2,3
DequantizerScaleLoop
	eld		b		,@rp0+s0									;b<-
	ecp		b		,#0
	enop
	bra		ec2		,DequantizerMantissaZero2				;if zero
	
	etst	neg		,t										;check sign flag
	eld		rpd1.index_LbackupB		,b	
	eabs	b
	eld		a		,#1023
	ecp		a		,b
	enop
	bra		ec1		,NewtomMethod
	eld		rp3		,b
	erpn	rp3		,#tbl_exponentOfPow43Org				//(0xAB86-0x4000)	;tbl_exponentOfPow43Org

	eld		a		,@rp3									;a[23:16]<-exponent
	esra8	a												;because of xdm
	esra8	a												;a<-exponent

	eadd	b		,si										;b<-b+tbl_mantisaOfPow43Org
	eld		rp3		,b
	eadd	a		,ma0		,x0		,@rp3						;x0<-mantissa
DequantizerScaleCommon
	ecp		a		,#const_MaxScale
	enop
	bra		ec1		,DequantizerNonZero						;ec1=c if a>=22
	eld		b		,#0
DequantizerMantissaZero2
	eld		@rp0+d0	,b										;dummy for delay, rp0+=1
	cmp		eq		,r2		,#0
	brfd	DequantizerScaleLoop
	dec		r2
		
	ret
DequantizerNonZero
	eld		c		,rpd1.index_LbackupTable					;a:shif+tbl_powerMask
	eadd	a		,c
	
	eld		rp3		,a
	emul	x0y0	,y1		,@rp3								;p<-mantisa*pow(2,-i/4)
															;y1<-shift value
	eld		x0		,p
	emul	x0y1											;p<-(signed mantisa)*pow(2,-i/4)*shift
	eld		b		,p
	enegt	b
	eld		@rp0+d0,b										;dummy for delay, rp0+=1
	cmp		eq		,r2		,#0
	brfd	DequantizerScaleLoop
	dec		r2

	ret
	
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;	B	In	i
;
;	Order =  X0    X1    X    X2
;			f(X0) f(X1) f(X) f(X2)
;	f(X) = f(X0) + (X-X0)[f(X1)-f(X0)] + (X-X0)(X-X1)[(f(X2)-f(X1))-(f(X1)-f(X0))]/2
;		 = f(X0) + (X-X0)[f(X1)-f(X0)][1-(X-X1)/2] + (X-X0)(X-X1)[f(X2)-f(X1)]/2
;		 = f(X0) + (X-X0)[[f(X1)-f(X0)][1-(X-X1)/2] + (X-X1)[f(X2)-f(X1)]/2]
;
;		 = f(X0) + [[f(X1)-f(X0)][1-(X-X1)/2] + (X-X1)[f(X2)-f(X1)]/2]
;		   +[[f(X1)-f(X0)][1-(X-X1)/2] + (X-X1)[f(X2)-f(X1)]/2]*(X-X0)'s fraction
;	The result is based on f(X1)
;
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
NewtomMethod:
///caution
	esft	b		,sa										;sr<-i/64, sg<-i%64
	eld		a		,sr										;a<-i/64	
	eld		rp3		,a
///caution	(esra8	a)	
	eld		a		,sg
	esra8	a
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		NewtomMethodZero

	eld		ma1		,ma0									;backup	
	erpn	rp3		,#tbl_exponentOfPow43Org
	eld		a		,@rp3+s1									;a<-f(X1)'s exponent
	esra8	a												;because of in xdm area
	esra8	a												;a<-exponent
	eld		x0		,a	
	ecld	r0		,a										;backup

	eld		b		,@rp3+s0									;b<-f(X0)'s exponent	
	esra8	b												;because of in xdm area
	esra8	b												;b<-exponent

	ecp		a		,b
	etst	nz		,t
		
	erps	rp3+s0
	eld		b		,@rp3+s1									;ma0<-f(X2)'s exponent
	esra8	b												;because of in xdm area
	esra8	b												;b<-exponent
	eld		ma0		,b										;backup
	
											;t<-nz	
;---- Calculate f(X1)-f(X0)
;y1 <- f(X1)-f(X0)
	eld		b		,sr										;b<-i/64
	eld		rp3		,b
	erpn	rp3		,#tbl_mantisaOfPow43Org					;rp3<-tbl_mantisaOfPow43Org+i/64

	eld		a		,@rp3+s1									;a<-f(X1)
	eld		b		,@rp3+s0									;b<-f(X0)
	esrat	b												;b<-f(X0)/2 when exponents differ	
	
	esub	a		,b										;a<-f(X1)-f(X0)
	eld		y1		,a										;y1<-f(X1)-f(X0)
	
	eld		a		,x0
	ecp		a		,ma0										;compare f(X1) vs. f(X2)'exponent
	etst	nz		,t										;t<-nz

	eld		ma0		,b										;ma0<-f(X0)/2,conditionally
	eld		a		,sg										;a[15:0]<-(X-X1)	
	esra8	a
	efz8	a												;a[23:16]<-0,c<-0
	esrc	a												;a[15:0]<-(X-X1)'s fraction
															;because of sign bit
	esrc	a												;a[15:0]<-(X-X1)/2's fraction	
	
	eld		b		,#0x8000
	efz8	b
	esub	b		,a

	esla8	b												;b<-[1-(X-X1)/2]
	eld		x0		,b
	emul	x0y1											;p<-[f(X1)-f(X0)][1-(X-X1)/2]	
	
	esla8	a												;a[23:0]<-(X-X1)/2's fraction
	eld		x0		,a										;x0<-(X-X1)/2's fraction
;---- Calculate f(X2)-f(X1)	
;
	erps	rp3+s0
	eld		b		,@rp3+s1									;b<-f(X2)	
	eslat	b												;b<-f(X2)*2 when exponents differ
	eld		c		,@rp3+s0									
	esub	b		,c											;b<-f(X2)-f(X1)
	eld		y1		,b	
	eld		b		,ma0

	emld	ma0		,x0y1											;ma0<-[f(X1)-f(X0)][1-(X-X1)/2]
																;p<-(X-X1)[f(X2)-f(X1)]/2
	emad	ma0		,x0y1											
	eld		x0		,ma0										;ma0<-[f(X1)-f(X0)][1-(X-X1)/2]
															;+(X-X1)[f(X2)-f(X1)]/2
	esla	a
	eld		y1		,a										;y1<-(X-X1)'s fraction
	eld		p		,ma0										;p<-
	eld		ma0		,b										;ma0<-f(X0)/2,conditionally
	
	emad	ma0		,x0y1									;		ma0a<-
	emad	ma0		,x0y1											;forma0a+=p


	eld		x0		,ma0
	eld		ma0		,ma1
	ecld	a		,r0	
	efs16	a
	eadd	a		,#-8	
	eadd	a		,ma0
	eld		b		,rpd1.index_LbackupB	
//
	eld		b		,b
//
	etst	neg		,t

	jmp		DequantizerScaleCommon
NewtomMethodZero
	erpn	rp3		,#tbl_exponentOfPow43Org
	eld		a		,@rp3+s1									;a<-f(X1)'s exponent
	esra8	a												;because of in xdm area
	esra8	a												;a<-exponent
	eadd	a		,#-8	
	eadd	a		,ma0

	eld		b		,sr
	eadd	b		,si
	eld		rp3		,b										;tbl_mantisaOfPow43Org+i/64
	eld		x0		,@rp3+s0

	jmp		DequantizerScaleCommon


	end
	
	

⌨️ 快捷键说明

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