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

📄 mp3decnew.s

📁 samsung 9908DVD源代码,
💻 S
📖 第 1 页 / 共 5 页
字号:
	pop		a14

	eld		a		,sg

	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch private_bit	
	pop		a14

	esla8	a
	eld		sa		,#2										;mode: 2-bit
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3
	pop		a14
	eadd	a		,sg
	esla8	a	
	ecld	r0		,a
	srb		r0
	ldb		@[a13+Index_Mode]	,r0

	cmp		eq		,r0		,#const_mono					;check mode
	brt		bra_ch
	eadd	a		,#1										;setting 2-channel
bra_ch
	eld		@rp0+d0	,a										;save a
															;a[23:16]=padding
															;a[15:8]=mode
															;a[7:0]=channel number
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch mode_ext		
	pop		a14
	
	eld		@rp0+d0	,sg										;save sg
															;sg[15:8]=null zero
															;sg[7:0]=mode_ext
	eld		sa		,#4
															;emphasis
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch copyright,original/copy
	pop		a14
															;emphasis															
	eld		a		,si										;for checking CRC
	enop
	bra		ec0		,ParsingHeaderNoCRC
	eld		a		,#16
	eld		sa		,a										;	

	push	a14	
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch protection_bit	
	pop		a14

	push	a14
	jsr		CheckCRC
	pop		a14
ParsingHeaderNoCRC
	ld		r0		,#0
	ldb		@[a13+Index_FrameErrorFlag]		,r0				;indicates "TRUE"
	ldb		@[a10+Index_DecodeErrFlag]		,r0
	ret

ParsingHeaderSyncError	
	nop
ParsingHeaderFreqError	
	ld		r0		,#1
	ldb		@[a13+Index_FrameErrorFlag]		,r0				;indicates "FALSE"
	ldb		@[a10+Index_DecodeErrFlag]		,r0
	ret
//////////////////////////////////////////////////////////////////////////////////
;		sg-register		In 	CRC value
//////////////////////////////////////////////////////////////////////////////////
CheckCRC:
	ret

//////////////////////////////////////////////////////////////////////////////////
;
;	If a Sync and header data are valid, set the z-flag
;	else clear the z-flag
;	
;	rp0				valid data size
;	MA[47:24]		rp0's backup
;	P[47:24]		for MA++
;	x0				temporary buffer
;	y0				read buffer pointer
;
//////////////////////////////////////////////////////////////////////////////////
CheckSyncWord:
	esec2	#sec_z
	ld		r3		,#1							;indicates "FALSE"
	eld		c		,#tbl_mainDataSize
	eld		rp2		,c

	eld		a		,rpd1.index_Glsf
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		NoneLsfSize

	eld		c		,#tbl_mainDataSizeLSF
	eld		rp2		,c	
	cmp		eq		,r0		,#1
	brt		NoneLsfSize
	eld		c		,#tbl_mainDataSizeLSF2
	eld		rp2		,c	
NoneLsfSize
	eld		sd0		,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(1<<0)	;initialize post-modified value
	eld		sd1		,sd0		
	eld		a		,#1	
	eld		p		,a
	
	ldw		r0		,@[a13+Index_InputBufferValidData]
	ecld	a		,r0
	efz8	a
	eld		rp0		,a							;valid data size
	eld		ma0		,a
	ldw		r0		,@[a13+Index_InputBufferRPointerL]
	ecld	a		,r0
	efz8	a
	eld		y0		,a							;read pointer	
CheckSyncWordLoop
	esra	a									;set carry-flag
	etst	nc		,t	
	eld		rp1		,a
	es		me1									;enable rp1 modulo	
	eld		c		,@rp1+s0
	esla8	c
	eld		sr		,c
	eld		b		,#-16
	eld		a		,#8
	esra8t	a
	eadd	b		,a
	esft	sr		,a							;align byte	
	eld		a		,ma0

	ecld	r5		,a
	cmpu	ge		,r5		,#4
	brf		CheckSyncWordValidEmpty		;ec1=nc,check if valid data>=4-byte(header size)
	eld		sa,		#4							;Sync word(0fffh):12-bit	

	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3
	pop		a14

	eld		sa		,#8	
	eld		a		,sg
SearchSyncWordLoop
	esla8	a
	push	a14	
	jsr		GetNBitFromBitstreamOnlyMP3	
	pop		a14

	eadd	a		,sg
	eld		sg		,a
	enmsk	sg,		#12	
	eld		a		,sg
	ecp		a,		#0xfff						;compare A with Sync.word
	enop
	bra		ec2		,ParsingHeaderData			;ec2=z-flag

	ecld	r0		,a
	cmp		eq		,r0		,#0xffe
	brt		ParsingHeaderData2_5

	eld		x0		,a
	esub	ma0		,p							;valid size--
	eld		a		,ma0						;MAH<-the size of valid data
	ecld	r0		,a
	cmpu    ge		,r0		,#4
	brf		CheckSyncWordValidEmpty

	eld		a		,x0
	ecld	r0		,a
	cmpu    ge		,r0		,#0
	brf		CheckSyncWordValidEmpty

	jmp		SearchSyncWordLoop
ParsingHeaderData
	eld		rpd1.index_Lsync	,a

	eld		sa,		#1							
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3			;ID(0) LSF / ID(1) MP3
	pop		a14
								
	eld		a		,sg							//1010
	eld		rpd1.index_LID		,a								
												
	eld		a		,#0
	eld		rpd1.index_LMpegVersion		,a
	eld		rpd1.index_Glsf		,a				; MPEG1 MP3
	eld		c		,#tbl_mainDataSize
	eld		rp2		,c	
	eld		a		,sg
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brf		NoneLSF
	
	eld		a		,#1
	eld		rpd1.index_Glsf		,a				; MPEG2 LSF
	eld		c		,#tbl_mainDataSizeLSF
	eld		rp2		,c
	eld		rpd1.index_LMpegVersion		,a
NoneLSF		
	jmp		Chk_IDEnd
ParsingHeaderData2_5	
	eld		rpd1.index_Lsync	,a	
	
	eld		sa,		#1								
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3			;ID(0) Mpeg 2.5
	pop		a14

	eld		a		,sg
	eld		rpd1.index_LID		,a

	eld		a		,#2
	eld		rpd1.index_Glsf		,a				; MPEG2 2.5
	eld		c		,#tbl_mainDataSizeLSF2
	eld		rp2		,c
	eld		rpd1.index_LMpegVersion		,a								
Chk_IDEnd
	eld		sa		,#2							;Layer:2-bit
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3			
	pop		a14

	eld		a		,sg
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		ParsingHeaderLayerError
	
	eld		a		,sg
	eld		rpd1.index_Llayer	,a	

	ecld	r5		,a							;r5 -> layer
//////////////////////////////////////////////////
	cmp		eq		,r5		,#1
	brt		layer3_pass

	eld		a		,rpd1.index_Glsf	
	ecld	r4		,a
	cmp		eq		,r4		,#0
	brf		Lsf_LowLayer
	
	cmp		eq		,r5		,#2
	brf		Layer1_frame
	
	eld		rp2		,#tbl_FrameSizeL2
	jmp		layer3_pass
Layer1_frame
	eld		rp2		,#tbl_FrameSizeL1	

	jmp		layer3_pass
Lsf_LowLayer

	cmp		eq		,r5		,#2
	brf		Layer1_frameLsf
	
	eld		rp2		,#tbl_FrameSizeLSFL2

	jmp		layer3_pass
Layer1_frameLsf
	eld		rp2		,#tbl_FrameSizeLSFL1
layer3_pass
//////////////////////////////////////////////////

	eld		sa		,#1							;Protection(CRC): 1-bit
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3
	pop		a14
	
	eld		sa		,#4							;bitrate: 4-bit	
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3
	pop		a14

	eld		a		,sg
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		ParsingHeaderLayerError
	cmp		eq		,r0		,#15
	brt		ParsingHeaderLayerError	
	eld		si		,sg

	eld		sa		,#2							;sampling freq.: 2-bit
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3	
	pop		a14

	eld		a		,sg
	eld		rpd1.index_Lsamp	,a	

	ecld	r0		,a
	cmp		eq		,r0		,#3
	brt		ParsingHeaderLayerError

	esla	a
	esla	a
	esla	a
	esla	a									;a*=4	
	eadd	a		,si
	eadd	a		,rp2							;rp2:table of main Data Size
	eld		rp3		,a	

	eld		a		,@rp3						;a<-(frame size-padding)

	eld		sa		,#1							;padding:1-bit	

	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3	
	pop		a14

	//skip for license 
	cmp		eq		,r5		,#3
	brf		Layer1Padding4Byte
	
	eld		c		,sg
	esla	c
	esla	c
	eadd	a		,c	
Layer1Padding4Byte	
//	eadd	a		,sg							;a<-frame size	
	ecld	r0		,a

	ldw		@[a13+Index_FrameLength]	,r0		;frame size 	
		
	eld		x0		,a							;x0:temporary buffer

// for invalid frame size
//	cmp		gt		,r0		,#0x5a0
//	brt		over_frame_size

	push	a14
	jsr		CheckFrameSize
	pop		a14

	cmp		eq		,r1		,#0
	brt		over_frame_size		
		
	eld		a		,ma0
	esub	a		,x0							;a<-(valid data size)-(frame size)
	esub	a		,#3							;a<-(valid data size)-(frame size)-3
	ecld	r0		,ah
	cmp		ge		,r0		,#0
	brf		CheckSyncWordValidEmpty	
//	brf		CheckSyncWordValidEmptyTest	
over_frame_size	
	eld		a		,rp0						;rp0:first read pointer
	esub	a		,ma0	
	eadd	a		,y0							;a<-next read pointer
	eadd	a		,x0
	eld		sg		,a
	enmsk	sg		,#11
	eld		a		,sg							;the content of A is modulo-value
	eadd	a		,#StartReadPointer			;Be causious !!!!
	efz8	a
	esra	a									;set carry-flag
	etst	nc		,t
	eld		rp1		,a
	es		me1									;enable rp1 modulo	
	eld		c		,@rp1+s0
	esla8	c
	eld		sr		,c

	eld		b		,#-16
	eld		a		,#8
	esra8t	a
	eadd	b		,a
	esft	sr		,a							;align byte	

	eld		a,		#0xfff						;a<-y1(#0xfff)
	eld		sa,		#12							;Sync word(0fffh):12-bit
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3		
	pop		a14
	
.if(1)
	ecp		a		,sg
	enop
	bra		ec2		,HeaderGoodJMP	;ec2=z-flag	
	
	eld		a		,#0xffe
	ecp		a		,sg
	enop
	bra		ec2		,HeaderGoodJMP	;ec2=z-flag	

	jmp		sec_padding_chk
HeaderGoodJMP
////////
//	for Layer1	
//	cmp		eq		,r5		,#3
//	brt		CheckSyncWordHeaderGood
////////
	enmsk	sg		,#4	
	eld		a		,sg
	esla8	a

	eld		sa		,#8
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3		
	pop		a14		
	eadd	a		,sg

	eld		c		,#0xfff
	ecp		a		,c
//	bra		ec2		,padding_process		;ec2=z-flag	
	enop
	bra		ec2		,rangeCoverPadd		;ec2=z-flag	
		
	eld		c		,#0xffe
	ecp		a		,c
//	bra		ec2		,padding_process		;ec2=z-flag
	enop
	bra		ec2		,rangeCoverPadd		;ec2=z-flag	
/*
/////////////////////////	
	;ID(0) LSF / ID(1) MP3	
	ecld	r1		,a
	
	ld		r0		,r1
	srb		r0
	sr		r0
	sr		r0	
	sr		r0	
	eld		c		,rpd1.index_LID
	ecld	r2		,c
	cmp		eq		,r0		,r2
	brf		ParsingHeaderLayerError

	;Layer(01):2-bit
	ld		r0		,r1
	srb		r0
	sr		r0
	sr		r0
	and		r0		,#0x3	
	cmp		eq		,r0		,#0
	brt		ParsingHeaderLayerError			

	eld		c		,rpd1.index_Llayer
	ecld	r2		,c
	cmp		eq		,r0		,r2
	brf		ParsingHeaderLayerError	
		
	;bitrate: 4-bit	
	ld		r0		,r1
	sr		r0
	sr		r0
	sr		r0
	sr		r0
	and		r0		,#0xf	
	cmp		eq		,r0		,#0
	brt		ParsingHeaderLayerError
	
	cmp		eq		,r0		,#15
	brt		ParsingHeaderLayerError	
	
	;sampling freq.: 2-bit
	ld		r0		,r1
	sr		r0
	sr		r0
	and		r0		,#0x3	
	cmp		eq		,r0		,#3
	brt		ParsingHeaderLayerError	
	
	eld		c		,rpd1.index_Lsamp
	ecld	r2		,c
	cmp		eq		,r0		,r2
	brf		ParsingHeaderLayerError
///////////////////////
*/
	cmp		eq		,r5		,#1
	brf		ParsingHeaderLayerError
//	cmp		eq		,r5		,#3
//	brt		ParsingHeaderLayerError
//	cmp		eq		,r5		,#2
//	brt		ParsingHeaderLayerError	

	jmp		CheckSyncWordHeaderGood
rangeCoverPadd	
	jmp		padding_process
	
sec_padding_chk

	enmsk	sg		,#4	
	eld		a		,sg
	esla8	a

	eld		sa		,#8
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3		
	pop		a14		
	eadd	a		,sg

	eld		c		,#0xfff
	ecp		a		,c
	enop
	bra		ec2		,padding_process		;ec2=z-flag	
	
	eld		c		,#0xffe
	ecp		a		,c
	enop
	bra		ec2		,padding_process		;ec2=z-flag

	jmp		ParsingHeaderLayerError	
padding_process
	// second sync verify	
		
//	eld		a		,sg
//	eld		c		,rpd1.index_Lsync
//	ecp		a		,c
//	bra		ec0		,ParsingHeaderLayerError	
		
	eld		sa		,#1							
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3			;ID(0) LSF / ID(1) MP3	
	pop		a14
	
	eld		a		,sg
	eld		c		,rpd1.index_LID
	ecp		a		,c
	enop
	bra		ec0		,ParsingHeaderLayerError	
		
	eld		sa		,#2							;Layer(01):2-bit
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3			;01	
	pop		a14
	
	eld		a		,sg
	enop
	bra		ec2		,ParsingHeaderLayerError
	eld		c		,rpd1.index_Llayer
	ecp		a		,c
	enop
	bra		ec0		,ParsingHeaderLayerError		
	
	eld		sa		,#1							;Protection(CRC): 1-bit
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3
	pop		a14

	eld		sa		,#4							;bitrate: 4-bit	
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3
	pop		a14
	
	eld		a		,sg
	enop
	bra		ec2		,ParsingHeaderLayerError
	ecp		a		,#15
	enop
	bra		ec2		,ParsingHeaderLayerError	
	
	eld		sa		,#2							;sampling freq.: 2-bit
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3	
	pop		a14
	eld		a		,sg	
	
	ecp		a		,#3
	enop
	bra		ec2		,ParsingHeaderLayerError	
	eld		c		,rpd1.index_Lsamp
	ecp		a		,c
	enop
	bra		ec0		,ParsingHeaderLayerError

	/////////////////////////////////////////
	ldw		r0		,@[a13+Index_FrameLength]			;frame size 	
	add		r0		,#1
	ldw		@[a13+Index_FrameLength]	,r0
		
	jmp		CheckSyncWordHeaderGood
.endif
ParsingHeaderLayerError
	esub	ma0		,p
	eld		a		,rp0							;rp0:first read pointer
	esub	a		,ma0	
	eadd	a		,y0							;a<-next read pointer
	eld		sg		,a
	enmsk	sg		,#11
	eld		a		,sg							;the content of A is modulo-value
	eadd	a		,#StartReadPointer			;Be causious !!!!	
	efz8	a
	jmp		CheckSyncWordLoop	
//Valid data in the input buffer are not enough to parse header or decode frame.

⌨️ 快捷键说明

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