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

📄 mp3decnew.s

📁 samsung 9908DVD源代码,
💻 S
📖 第 1 页 / 共 5 页
字号:
CheckSyncWordHeaderGood
	ld		r3		,#0
/////////////////////////////////////////////////////
	cmp		eq		,r5		,#0010b					//	layer2
	jpt		Layer2Sync
//////////////////////////////////////////////////////
	cmp		eq		,r5		,#0011b					//	layer1
	jpt		Layer1Sync
//////////////////////////////////////////////////////	
CheckSyncWordValidEmpty
	eld		a		,ma0
	ecld	r0		,a
	ldw		@[a13+Index_InputBufferValidData]	,r0	
	eneg	a
	eadd	a		,rp0							;a<-used data size
	eadd	a		,y0							;a<-next read pointer
	ecld	r0		,a
	ecld	r1		,ah

	cmpu	ge		,r0		,#BitstreamEnd
	brf		buf_addr_pass
	
	sub		r0		,#0x800

/*	
	ld		e12		,r1
	ld		r12		,r0
//d	and		r0		,#SyncMASK					//0xf7ff
	or		r1		,#0x20
	cmp		ge		,r1		,#CBitstreamEnd>>16
	brf		buf_addr_pass
	
	cmp		ge		,r0		,#CBitstreamEnd
	brf		buf_addr_pass	
	
	sub		a12		,#0x800
	ld		r0		,r12
	ld		r1		,e12
	or		r1		,#0x20
buf_addr_pass	
*/
buf_addr_pass	
	ldw		@[a13+Index_InputBufferRPointerL]	,r0
	ld		r1		,#0x20
	ldw		@[a13+Index_InputBufferRPointerH]	,r1
CheckStartSyncWordValidEmpty	
	eld		a		,G_firFrame
	ecld	r1		,a
	cmp		eq		,r1		,#1
	brt		NoneFirstFrame
	
//	push	a14
//	jsr		Fill_bufferMP3
//	pop		a14
	
	eld		a		,#1
	eld		G_firFrame	,a
	
//	jmp		CheckSyncWord
NoneFirstFrame	
	
	ld		r0		,r3							;return condition
	esec2	#sec_t
	ret

Layer2Sync
	eld		a		,#1
	eld		GLayerDiff	,a
	ld		r0		,#1
	esec2	#sec_t
	ret
Layer1Sync
	eld		a		,#2
	eld		GLayerDiff	,a
	ld		r0		,#1
	esec2	#sec_t
	ret				
	
//CheckSyncWordValidEmptyTest
//	jmp		CheckSyncWordValidEmpty
//////////////////////////////////////////////////////////////////////////////////
;		d			In		sideinformation save pointer
;		rp1			In		side_information fetch start pointer
;
//////////////////////////////////////////////////////////////////////////////////
GetSideInformation::
	eld		rp0		,#Area_sideInformation+const_sideInformationSize
	eld		sa		,#9										;fetch main_data_begin

	eld		a		,rpd1.index_Glsf
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		Mp3MainData
	
	eld		sa		,#8										;fetch LSF main_data_begin	
Mp3MainData
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3		
	pop		a14

	eld		a		,sg
	eld		rpd1.index_LmainDataBegin,	a					;store main_data_begin
	
	eld		a		,rpd1.index_GmpegChannel				;a[23:16]<-padding
															;a[15:8]<-mode
															;a[7:0]<-channel number
	ecld	r0		,a
	and		r0		,#0xff
	cmp		eq		,r0		,#0
	brt		GetSideInformationSingleChannel
	eld		sa		,#3										;fetch private bit for stereo
	eld		a		,rpd1.index_Glsf
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		Mp3Private
	eld		sa		,#2										;fetch LSF private bit for stereo
Mp3Private
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3
	pop		a14

	eld		a		,rpd1.index_Glsf
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brf		GetSideInformationGranule
	eld		sa		,#8										;fetch scfi
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3
	pop		a14
	eld		a		,sg
	eld		rpd1.index_Gscfi,	a							;save scfi[7:0]	
	jmp		GetSideInformationGranule
GetSideInformationSingleChannel	
	eld		sa		,#5										;fetch private bit for mono
	eld		a		,rpd1.index_Glsf
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		Mp3PrivateMono	
	eld		sa		,#1										;fetch LSF private bit for mono
Mp3PrivateMono
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3
	pop		a14
	
	eld		a		,rpd1.index_Glsf
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brf		GetSideInformationGranule
	
	eld		sa		,#4										;fetch scfi[3:0]
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3	
	pop		a14
	eld		a		,sg
	esla	a
	esla	a
	esla	a
	esla	a	
	eld		rpd1.index_Gscfi,	a
GetSideInformationGranule
	ld		r6		,#01h
	eld		a		,rpd1.index_GmpegChannel					;a[23:16]<-padding
															;a[15:8]<-mode
															;a[7:0]<-channel number	
	eld		sa		,#12										;part2_3_length
	ecld	r7		,a
	and		r7		,#0xff
GetSideInformationChannelLoop
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch part2_3_length
	pop		a14
	eld		@rp0+d0	,sg

	eld		sa		,#9										;big_values
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch big_values	
	pop		a14
	eld		@rp0+d0	,sg									;save big_values
	
	eld		sa		,#8										;global_gain
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch global_gain	
	pop		a14
	eld		a		,sg
	esla8	a
	esla8	a
	eld		rpd1.index_LlsfBackA	,a
	eld		sa		,#4										;scalefac_compress	

	eld		a		,rpd1.index_Glsf
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		Mp3Scalefac
	eld		sa		,#9										;LSF scalefac_compress	
Mp3Scalefac
	eld		a		,rpd1.index_LlsfBackA	
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch scalefac_compress
	pop		a14
	eadd	a		,sg
	eld		@rp0+d0	,a										;save a
															;a[23:16]=global_gain
															;a[15:8]=scalefac_compress
															;a[7:0]=scalefac_compress

	eld		sa		,#1										;window_switching_flag
	esft	sr		,sa										;fetch window_switching_flag
	etst	nc		,t
	eadd	b		,sa
	enop
	bra		ec1		,bra_bit1									;ec1 = nc
	eld		b		,#-16
	eld		c		,@rp1+s0									;rp1 += 1
	esla8	c
	eld		sr		,c
bra_bit1	
	eld		a		,sg		
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		GetSideInformationNotSwitching
	esla8	a												;a<<=8
	eld		sa		,#2										;block_type	

	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch block_type
	pop		a14
	eadd	a		,sg
	esla8	a												;a<<=8
	
	eld		sa		,#1										;mixed_block_flag	
	esft	sr		,sa										;fetch mixed_block_flag	
	eadd	b		,sa
	enop
	bra		ec1		,bra_bit2									;ec1 = nc		
	eld		b		,#-16
	eld		c		,@rp1+s0									;refill sr		
	esla8	c
	eld		sr		,c
bra_bit2
	eadd	a		,sg	
	eld		@rp0+d0	,a									;save a
															;a[23:16]=window_switching_flag
															;a[15:8]=block_type
															;a[7:0]=mixed_block_flag
	ecld	r0		,a										;r0<-block type
	srb		r0
	
	eld		sa		,#5										;table_select[0]	

	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch table_select[0]	
	pop		a14
	eld		a		,sg
	esla8	a												;a<<=8
	
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch table_select[1]	
	pop		a14
	eadd	a		,sg	
	esla8	a
	eld		@rp0+d0	,a									;save a
															;a[23:16]=table_select[0]
															;a[15:8]=table_select[1]
															;a[7:0]=null zero
															
	eld		sa		,#3										;subblock_gain	

	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch subblock_gain[0]	
	pop		a14
	eld		a		,sg	
	esla8	a	

	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch subblock_gain[1]
	pop		a14
	eadd	a		,sg
	esla8	a
	
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch subblock_gain[2]	
	pop		a14
	eadd	a		,sg	
	eld		@rp0+d0	,a										;save a
															;a[23:16]=subblock_gain[0]
															;a[15:8]=subblock_gain[1]
															;a[7:0]=subblock_gain[2]	
	eld		a		,#8
	cmp		eq		,r0		,#1
	brt		block_match		
	
	cmp		eq		,r0		,#3
	brt		block_match		

	jmp		block_matchEnd
block_match
	eld		a		,#7
block_matchEnd		
	eld		si		,a
	esla8	a
	eadd	a		,#20
	esub	a		,si										;a<-region0Count|region1Count

	jmp		GetSideInformationPreflag
GetSideInformationNotSwitching
	eld		@rp0+d0	,a										;save with a=0
															;a[23:16]=window_switching_flag
															;a[15:8]=block_type
															;a[7:0]=mixedBlockFlag
															
	eld		sa		,#5										;table_select[0,1,2]

	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch table_select[0]	
	pop		a14
	eld		a		,sg
	esla8	a
	
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch table_select[1]	
	pop		a14
	eadd	a		,sg
	esla8	a	
	
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch table_select[2]	
	pop		a14
	eadd	a		,sg	
	eld		@rp0+d0	,a										;save a
															;a[23:16]=table_select[0]
															;a[15:8]=table_select[1]
															;a[7:0]=table_select[2]

	eld		@rp0+d0	,a										;save a
															;a[23:16]=dummy(sub_block0)
															;a[15:8]=dummy(sub_block1)
															;a[7:0]=dummy(sub_block2)
	eld		sa		,#4										;region0_count
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch region0_count	
	pop		a14
	eld		a		,sg	
	esla8	a
	eld		sa		,#3										;region1_count

	push	a14	
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch region1_count	
	pop		a14
	eadd	a		,sg
GetSideInformationPreflag
	esla8	a												;a<<=8
	
	eld		rpd1.index_LlsfBackA	,a
	eld		a		,rpd1.index_Glsf
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brf		LsfPreflag
	
	eld		sa		,#1										;preflag
	esft	sr		,sa										;fetch preflag	
	eadd	b		,sa
	enop
	bra		ec1		,bra_bit3									;ec1 = nc	
	eld		b		,#-16
	eld		c		,@rp1+s0								;refill sr with 16-bit	
	esla8	c
	eld		sr		,c
bra_bit3
	eld		a		,rpd1.index_LlsfBackA	
	eadd	a		,sg	
	eld		@rp0+d0	,a										;save
															;a[23:16]=region0_count
															;a[15:8]=region1_count
															;a[7:0]=preflag		
	jmp		LsfPreflagEnd
LsfPreflag
	eld		a		,rpd1.index_LlsfBackA			
	eld		@rp0+d0	,a										;save
															;a[23:16]=region0_count
															;a[15:8]=region1_count
															;a[7:0]=None
LsfPreflagEnd								
	eld		sa		,#1
	esft	sr		,sa
	eadd	b		,sa										;scalefac_scale
	enop
	bra		ec1		,bra_bit4									;ec1 = nc		
	eld		b		,#-16
	eld		c		,@rp1+s0									;refill sr		
	esla8	c
	eld		sr		,c
bra_bit4	
	eld		a		,sg	
	esla8	a												;a<<=8
	esft	sr		,sa		
	eadd	b		,sa										;count1table_select	
	enop
	bra		ec1		,bra_bit5									;ec1 = nc	
	eld		b		,#-16
	eld		c		,@rp1+s0									;refill sr		
	esla8	c
	eld		sr		,c
bra_bit5		
	eadd	a		,sg
	eld		@rp0+d0	,a										;save a
															;a[23:16]=Null zero
															;a[15:8]=scalefac_scale
	eld		sa		,#12										;part2_3_length		
	cmp		eq		,r7		,#0
	brfd	GetSideInformationChannelLoop
	dec		r7

	eld		a		,rpd1.index_Glsf
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brf		OneGrannule	
	
	eld		a		,rpd1.index_GmpegChannel					
	ecld	r7		,a
	and		r7		,#0xff									;a[23:16]<-padding
															;a[15:8]<-mode
															;a[7:0]<-channel number	
	cmp		eq		,r6		,#0
	brfd	GetSideInformationChannelLoop
	dec		r6
OneGrannule
	ret
//////////////////////////////////////////////////////////////////////////////////
;
;		d					the pointer for saving main data
;							main data are modular buffer (1024-size)
;		sd1		s1		-1
//////////////////////////////////////////////////////////////////////////////////
FetchMainData::
	ecp		b		,#-16									;check whether SR-register is empty
	etst	z		,t										;next used t-flag	
	eld		a		,rpd1.index_Glsf
	ecld	r1		,a
	ldw		r0		,@[a13+Index_FrameLength]				;r0<-frame length 
	ecld	b		,r0
	efz8	b												;a<-frame size
	eld		rp2		,b										;backup-register

	cmp		eq		,r1		,#0
	brf		SideInfoLSF

	eld		a		,rpd1.index_LmpegCrc						;a[7:0]<-CRC
	esla	a												;a*=2
	eadd	a		,#-2
	eadd	a		,#-(17+4)
	ldb		r0		,@[a13+Index_Mode]

	cmp		eq		,r0		,#3
	brt		double_size
	eadd	a		,#-(32-17)
double_size
	eadd	a		,b
	jmp		SideInfoLSFEnd	
SideInfoLSF
	eld		a		,rpd1.index_LmpegCrc						;a[7:0]<-CRC
	esla	a												;a*=2
	eadd	a		,#-2									// Opt
	eadd	a		,#-(9+4)

	ldb		r0		,@[a13+Index_Mode]
	cmp		eq		,r0		,#3
	brt		single_ch
	eadd	a		,#-(17-9)
single_ch
	eadd	a		,b
SideInfoLSFEnd	
	eld		b		,rp2										;b<-frame size
	eneg	b

	cmp		eq		,r1		,#0
	brf		LsfFrameSize
//////////////////////////////////		
//	0822	HJI
	esra	b
//////////////////////////////////		
LsfFrameSize	
	ecld	r0		,b
	ldw		r5		,@[a13+Index_InputBufferValidData]
	add		r0		,r5
	ldw		@[a13+Index_InputBufferValidData]	,r0
	
	eld		b		,rpd1.index_GptrNextMainData			;destination
	ld		r0		,#0x20
	ld		e12		,r0
	ecld	r5		,b										;a12->destination
	ld		r12		,r5
	
	erps	rp1+s1			//1999.12.1										
	er		me1												;disable rp1 modulo	
	eld		b		,rp1	
	esla	b												;because of CalmRISC address
	enop
	bra		ec2		,FetchMainDataEvenOdd	
	eadd	b		,#1										;if remained data exits
FetchMainDataEvenOdd
	ld		r0		,#0x20									;a11->source
	ld		e11		,r0
	ecld	r5		,b
	ld		r11		,r5
	
;r3/idl1<-the pointer of previous bitstreams (scalefactor+huffman code) end per byte-length
;r2/idl0<-the pointer of current frame (header+scalefactor+huffman code), byte-aligned
	esub	a		,#1		
	ecld	r6		,a
FetchMainDataLoop
	ldb		r0		,@[a11+0]
	inc		r11
	cmp		eq		,r11	,#BitstreamEnd		//0x4800		
	brf		pass_src
	ld		r11		,#BitstreamStart			//0x4000
pass_src		
	ldb		@[a12+0],r0	
	inc		r12
	cmp		eq		,r12	,#MainDataEnd		//0x4000		
	brf		pass_des
	ld		r12		,#MainDataStart				//0x3800
pass_des
	bnzd	r6		,FetchMainDataLoop
	nop

	ldw		@[a13+Index_InputBufferRPointerL]	,r11		;source	
	ld		r0		,#0x20
	ldw		@[a13+Index_InputBufferRPointerH]	,r0		;source	
	
	eld		a		,rpd1.index_GptrNextMainData				;
	efz8	b
	ld		r5		,r12
	ecld	b		,r5										;destination
	
	eld		rpd1.index_GptrNextMainData		,b
	eld		c		,rpd1.index_LmainDataBegin
	esub	a		,c
	ecld	r0		,a
	and		r0		,#FetchMASK					//0x07ff
	or		r0		,#MainDataStart				//0x3800
	ecld	a		,r0
	esra	a												;c<-even or odd
	eld		rp1		,a
	es		me1												;enable rp1 modulo	
	eld		c		,@rp1+s0
	eld		b		,#-16
	eld		sa		,#0
	enop
	bra		ec1		,byte_align
	eld		sa		,#8	
byte_align
	esla8	c
	eld		sr		,c

	eadd	b		,sa	
	esft	sr		,sa
	
	eld		rpd1.index_GcopyB	,b							;store b register	
	eld		c		,rp1							;store rp1 register
	eld		rpd1.index_GcopyRp1	,c
	eld		b		,sr
	eld		rpd1.index_GcopySr	,b							;store SR register

	ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CopySideInformation:
	esd0	d0		,#1
	esd1	s0		,#1
	ld		r6		,#const_sideInformationSize-1
	eld		rp0		,#Area_sideInformation
	eld		c		,rpd1.index_GptrSideInformation
	eld		rp1		,c
sidei_copy	
	eld		a		,@rp1+s0
	bnzd	r6		,sidei_copy
	eld		@rp0+d0	,a

	eld		c		,rp1
	eld		rpd1.index_GptrSideInformation	,c					;update sideInformation pointer

⌨️ 快捷键说明

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