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

📄 dechuff.s

📁 samsung 9908DVD源代码,
💻 S
字号:
;---------------------------------------------------------------------------------
;		The following program will decoding MP3 bitstream
;		by S/W Algorithm
;			File Name: dechuff.s
;			copyright jj,Park      1999.2.7
;
;	using from %9 to %14
;	profile
;		1. 27/5//1999
;			- For monitoring a starting frequency of zero-part,
;			  insert 'index_GzeroPartCh0/index_GzeroPartCh1 register'.
;			  These value are using to optimize looping counter
;		2. 2/11//1999
;			- For having robustness against a bitstream error
;			  insert r2/r3 as protect loop-counter from overlooping 
;		3. Change FillRestWithZero with DecodeOfCount1RET at CheckDismissStuffingBits
;---------------------------------------------------------------------------------
.include	"mp3_def.h"
.include	"mp3_ext.h"

		MP3DechuffSection
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;				Method using a 1-bit search
;
;	y0					esc value
;	y1					Region2start
;
;			table code x,y
;				or		v,w,x,y,0,0,0,0
;
;		rp0 is modulo (1024-word)
;		esd1	d0		1
;		esd2	s0		1
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DecodingHuffman::
	esec2	#sec_z											;ec2<-z-flag	
	eld		sd0		,#((-4&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(1<<0)	
	eld		sd1		,sd0
	eld		sd3		,#0xF110

	eld		a		,#0
	eld		rpd1.index_LloopCounti,	a	
	eld		a		,#tbl_hcodeEsc
	eld		rpd1.index_ptrHEscTable,a
	
	eld		a		,#1
	eld		p		,a										;using for 1-bit fetch
	eld		sa		,#1										;shift amount=1		
	
	ld		r2		,#0x1									;high loop
	ld		r3		,#0x1f									;low loop	

	eld		a		,rpd1.index_GptrCurrentDecodingData		;output buffer pointer	
	eld		rp0		,a
	eld		a		,rpd0.index_blockType					;a[23:16]:windowSwitchFlag


	ecld	r0		,ah
	cmp		eq		,r0		,#1			
	brf		DecodingHuffmanLong

	ecld	r0		,a
	srb		r0
	cmp		eq		,r0		,#2			
	brf		DecodingHuffmanLong
	
	eld		x1		,#(36/2)								;x1:Region1Start
	eld		y1		,#(576/2)								;y1:Region2Start

	ldb		r0		,@[a13+Index_SamplingFreq]				// caution
	cmp		eq		,r0		,#11
	brf		pass_8khzShort
	
	eld		x1		,#(72/2)								// for mpeg2.5 8Khz
pass_8khzShort	

	jmp		AfterRegionSetting	
DecodingHuffmanLong
	eld		a		,rpd0.index_region0Count				;a[23:16]:region0Count
															;a[15:8]:region1Count
															;a[7:0]:preFlag
	esra8	a												;a>>=8
	eld		y1		,a
	esra8	a												;a>>=8
	eld		c		,rpd1.index_GLongSfBandIndex			;+frequency index	
	eadd	a		,c
	eadd	a		,#1
	eld		rp3		,a
	eld		a		,@rp3+s1								;a:Region1Start
	efz8	a
	esra	a
	eld		x1		,a										;x1:Region1Start
	
	eld		a		,y1										;a<-region1Count
	efz16	a
	eadd	a		,rp3
	eld		rp3		,a
	eld		a		,@rp3
	efz8	a
	esra	a	
	eld		y1		,a										;y1:Region2Start	
AfterRegionSetting
	eld		a		,rpd0.index_tableSelection0				;a[23:16]:tableSelection0
															;a[15:8]:tableSelection1
															;a[7:0]:tableSelection2
	esra8	a												;a>>=8
	esra8	a												;a>>=8	

	jmp		Region0Region1Region2
DecodeOfBigValueLoop1
	ecp		a		,x1										;check whether region0 over
DecodeOfBigValueLoop2	
	enop
	bra		ec0		,CheckRegion2							;ec0:NZ= if a ==x1	
	eld		a		,rpd0.index_tableSelection1				;a[23:16]:tableSelection0
															;a[15:8]:tableSelection1
															;a[7:0]:tableSelection2
	esra8	a												;a<-tableSelection1

	jmp		Region0Region1Region2
CheckRegion2	
	ecp		a		,y1										;check whether region1 over
	enop
	bra		ec0		,PassHuffmanInformation					;ec0:NZ flag
	eld		a		,rpd0.index_tableSelection2				;a[23:16]:tableSelection0
															;a[15:8]:tableSelection1
															;a[7:0]:tableSelection2
Region0Region1Region2
	efz16	a	
	eld		rp3		,a	
	eld		c		,rpd1.index_ptrHEscTable	
	eadd	a		,c
	eld		rp2		,a
	eld		a		,@rp2									;y0<-esc value
	efz16	a
	eld		y0		,a
	erpn	rp3		,#tbl_ptrHcode							;hcode address
	eld		a		,@rp3
	ecld	r4		,a
	cmp		eq		,r4		,#0
	brt		GetHuffmanDecoderError
	
	eld		rp2		,a										;rp2<-Huffman code table
PassHuffmanInformation	
	eld		a		,rpd1.index_LloopCounti
	eld		c		,rpd0.index_bigValues					;check whether conversion end?
	ecld	r0		,a
	ecld	r1		,c
	cmp		eq		,r0		,r1
	brt		BigValueExit

	eld		rp3		,rp2										;recover Huffman code table
	ld		r6		,#19										;r1<-level
	eld		a		,@rp3
BigValueHcodeLoop
	ecld	r0		,a										;for checking high byte
	srb		r0
	cmp		eq		,r0		,#0								;ends?
	brt		BigValueEndHcode
															
	esft	sr		,sa	
	etst	nc		,t
	eadd	b		,sa
	enop
	bra		ec1		,%f9									;ec1 = nc
	eld		b		,#-16									;indicates remained bit
	eld		c		,@rp1+s0								;rp0 += 1
	esla8	c
	eld		sr		,c
%9	esra8t	a												;if t,a >>= 8;
	efz16	a												;a[23:8] <- 0
	
	eadd	a		,rp3
	eld		rp3		,a
	bnzd	r6		,BigValueHcodeLoop						;r1;level check
	eadd	ma0		,p		,a		,@rp3					;USED_BIT += 1
															;a<-next table entry value
	jmp		GetHuffmanDecoderError
BigValueEndHcode											;a[7:4]<-x, a[3:0]<-y
	efz8	a												;for checking whether x&y are zero
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		BigValueXYZero

	ld		r6		,#1
	eld		sg		,a	
	enmsk	sg		,#4										;sg[15:4]<-0
	eld		si		,sg										;backup
	esra	a
	esra	a
	esra	a
	esra	a												;a<-x
BigvalueXYLoop	
	enop
	bra		ec2		,BigValueOneZeroOfXY					;check if x==0

	eld		x0		,a										;backup	
	ecp		a		,#15
	enop
	bra		ec0		,BigvalueFetchSign						;check max	

	eld		a		,y0										;a<-esc
	enop
	bra		ec2		,BigvalueSkipEsc						;ec2:checking esc_value
	
	esft	sr		,a
	eadd	b		,a										;b:esc value
	enop
	bra		ec1		,%f10									;ec1 = nc
	eld		c		,@rp1+s0								;rp0 += 1	
	esla8	c
	eld		sr		,c
	esftl	sr		,b										;fetch esc value
	eadd	b		,#-16	
%10	eadd	a		,ma0										;used_bit +=esc
	eld		ma0		,a
	
	eld		a		,sg										;a<-esc_value
BigvalueSkipEsc	
	eadd	a		,x0										;a<-hcode+esc_value	
BigvalueFetchSign
	esft	sr		,sa										;fetch sign bit
	etst	c		,t
	eadd	b		,sa
	enop
	bra		ec1		,%f11									;ec1 = nc
	eld		b		,#-16									;indicates remained bit
	eld		c		,@rp1+s0								;rp1 += 1
	esla8	c
	eld		sr		,c
%11	eadd	ma0		,p										;USED_BIT+=1		
	enegt	a												;negative if C	
BigValueOneZeroOfXY
	eld		@rp0+d0	,a										;save 
	bnzd	r6		,BigvalueXYLoop
	eld		a		,si										;recover

	jmp		BigValueXYLoopCommon
BigValueXYZero
	eld		@rp0+d0	,a										;save x
	eld		@rp0+d0	,a										;save y
BigValueXYLoopCommon
	eld		a		,rpd1.index_LloopCounti
	eadd	a		,#1
	eld		rpd1.index_LloopCounti,	a

	cmp		eq		,r3		,#0
	brfd	DecodeOfBigValueLoop1
	dec		r3
	
	ecp		a		,x1										;check whether region0 over
	cmp		eq		,r2		,#0
	brfd	DecodeOfBigValueLoop2
	dec		r2	
BigValueExit	
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;						Count1  Part Decoding
;	ec2: z-flag
;	ma0		I		USED_BIT(scalefactor+huffman code data)
;	sa		I		1
;	rp2		U		points hcode table A
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DecodeOfCount1:
	eld		a		,rpd1.index_GptrCurrentDecodingData
	eadd	a		,#575
	eld		x1		,a
	eld		c		,#Tbl_hcode32							;rp2<-the pointer of table A	
	eld		rp2		,c
	eld		a		,ma0										;b<-USED_BIT
DecodeOfCount1Loop
	esec1	#sec_c											;ec1=c
	eld		c		,rpd0.index_part23Lenght				;Compare USED_bit Vs.part23Lenght
	esub	a		,c
	ecld	r0		,a
	cmp		ge		,r0		,#0
	brt		CheckRewindNbits

	esec1	#sec_nc		
	eld		a		,x1
	ecld	r0		,a
	eld		c		,rp0
	ecld	r1		,c
	cmpu	ge		,r0		,r1
	brf		CheckDismissStuffingBits

	eld		a		,rpd0.index_count1TableSelect			;a[23:16]=Null zero
															;a[15:8]=scalefac_scale
															;a[7:0]=count1table_select
	efz16	a
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		Count1TableSelect0
;Only inverter operation
	eld		a		,#4										;a<-hcode length
	esft	sr		,a
	eadd	b		,a
	enop
	bra		ec1		,Count1Table1NonLink					;ec1 = nc
	eld		c		,@rp1+s0								;rp0 += 1	
	esla8	c
	eld		sr		,c
	esftl	sr		,b
	eadd	b		,#-16
Count1Table1NonLink
	eadd	a		,ma0										;USED_BIT += hcode
	eld		ma0		,a	
	eld		a		,sg										;0,0,0,0,v,w,x,y
	esla	a
Count1Table0Table1Common
	eld		rp3		,a
	erpr	rp3												;bit reverse
	eld		a		,rp3									;a<-0,0,0,0,y,x,w,v	
	ecld	r0		,a
	ld		r6		,#3
Count1Table1vwxyLoop	
	eld		a		,#0	
	ld		r2		,r0
	sr		r0
	and		r2		,#0x1
	cmp		eq		,r2		,#1
	brt		Count1Table1PassSign	

	eld		a		,#1										;a<-1
	esft	sr		,sa										;fetch sign bit
	etst	c		,t
	enegt	a												;negative if c
	eadd	ma0		,p										;USED_BIT+=1
	eadd	b		,sa
	enop
	bra		ec1		,Count1Table1PassSign					;ec1 = nc
	eld		b		,#-16									;indicates remained bit
	eld		c		,@rp1+s0									;rp1 += 1
	esla8	c
	eld		sr		,c
Count1Table1PassSign
	bnzd	r6		,Count1Table1vwxyLoop	
	eld		@rp0+d0	,a										;save 
		
	eld		a		,ma0										;b<-USED_BIT
	jmp		DecodeOfCount1Loop	
Count1TableSelect0	
	ld		r6		,#6										;for checking level
	eld		rp3		,rp2										;rp3<-table0 A
	eld		a		,@rp3
Count1Table0Loop
	ecld	r0		,a										;for checking high byte	
	srb		r0
	cmp		eq		,r0		,#0
	brt		Count1Table0Table1Common						;check whether conversion
															;ends?	
	esft	sr		,sa	
	etst	nc		,t
	eadd	b		,sa
	enop
	bra		ec1		,%f15									;ec1 = nc
	eld		b		,#-16									;indicates remained bit
	eld		c		,@rp1+s0									;rp0 += 1		
	esla8	c
	eld		sr		,c	
%15	
	esra8t	a												;if t,a >>= 8;
	efz16	a												;a[23:8] <- 0
	
	eadd	a		,rp3
	eld		rp3		,a
	bnzd	r6		,Count1Table0Loop						;r1;level
	eadd	ma0		,p		,a		,@rp3					;USED_BIT += 1	

GetHuffmanDecoderError														
	ld		r0		,#1
	ldb		@[a13+Index_FrameErrorFlag]		,r0				;indicates "FALSE"	
	ldb		@[a10+Index_DecodeErrFlag]		,r0
	esec2	#sec_t											;ec2<-t flag	
	er		me1

	ret
CheckDismissStuffingBits
	eld		x1		,#16
	eld		a		,rpd0.index_part23Lenght
	esub	a		,ma0
	eld		sg		,a
	esra	a
	esra	a
	esra	a
	esra	a
	ecld	r6		,a
//s
	ld		r6		,r6
//
	enmsk	sg		,#4
	eld		a		,sg
DismissStuffingBitsLoop	
	esft	sr		,a
	eadd	b		,a
	enop
	bra		ec1		,DismissStuffingNonLink					;ec1=nc=1,if -b<=sa
	eld		c		,@rp1+s0								;rp1 += 1
	esla8	c
	eld		sr		,c
	esftl	sr		,b
	eadd	b		,#-16
DismissStuffingNonLink	
	bnzd	r6		,DismissStuffingBitsLoop
	eld		a		,x1

	jmp		FillRestWithZero
CheckRewindNbits
;--------			CheckRewindNbits		-------------
	enop
	bra		ec2		,FillRestWithZero						;ec1=nc=1,if -b<=sa

//////////////	
// 2003.07.10 for only GOGO

	eld		y1		,a
	eld		a		,rpd0.index_part23Lenght					;Compare USED_bit Vs.part23Lenght
	ecp		a		,#0
	enop
	bra		ec2		,GOGO_Enc
		
	jmp		GOGO_EncEnd
GOGO_Enc	
	eld		c		,rpd1.index_GcopyRp1					;recover rp1
	eld		rp1		,c
	eld		b		,rpd1.index_GcopySr	
	eld		sr		,b									;recover SI register
	eld		b		,rpd1.index_GcopyB					;recover B register

	eld		a		,y1
	
	jmp		FillRestWithZero
GOGO_EncEnd
	eld		a		,y1
//////////////	
	
	erpd	rp0+d1											;rp0-=4
	erps	rp1+s1											;adjust<-rp1--

	esub	b		,a
	esub	b		,#-16
	enop
	bra		ec1		,%f12									;c=0,if rewind bits		
															;are at current pointer
	eadd	b		,#16
	erps	rp1+s1											;back pointer
%12
	eld		c		,@rp1+s0
	esla8	c
	eld		sr		,c

	ecld	r0		,b
	and		r0		,#0xf
	eld		c		,#0
	ecld	c		,r0	
	eld		sa		,c
	esft	sr		,sa
	eadd	b		,#-16
FillRestWithZero
	esec1	#sec_n	
	eld		a		,rp0
	eld		c		,rpd1.index_GptrCurrentDecodingData
	ecp		a		,c
	enop
	bra		ec1		,UnderPtr
		
	eld		c		,rpd1.index_GptrCurrentDecodingData		;a<-non-zero frequency size	
	esub	a		,c
	
	jmp		UnderPtrEnd
UnderPtr
	eld		a		,#0	
UnderPtrEnd	

	esec1	#sec_nc	
	eld		rpd1.index_GzeroPartCh1,a						;save Ch1's non-zero frequency size
	ldb		r0		,@[a13+Index_ChannelLoop]
	cmp		eq		,r0		,#0
	brt		%f13
	eld		rpd1.index_GzeroPartCh0,a						;save Ch0's non-zero frequency size 
%13	eadd	a		,#-576
	enop
	bra		ec1		,%f14										;ec1=nc, conversion end
	jmp		DecodeOfCount1RET
%14	eld		@rp0+d0	,ma0l										;fill with MAL-zero
	eadd	a		,#1
	enop
	bra		ec1		,%b14									;ec1:carry
DecodeOfCount1RET
	esec2	#sec_t											;ec2<-t flag	
	er		me1
	
	ret
	
	end
	

⌨️ 快捷键说明

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