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

📄 decl2lib.s

📁 samsung 9908DVD源代码,
💻 S
📖 第 1 页 / 共 3 页
字号:
//////////////////////////////////////////////////////////////////////////////////
;		The following program will decoding Layer2 bitstream
;		by S/W Algorithm (for C-PAD3)
;			File Name: DecL2lib.s
;			copyright ji,Han      2001.8.7
;
;	profile
//////////////////////////////////////////////////////////////////////////////////
.include	"mp3_def.h"
.include	"mp3_ext.h"
.include	"mp12_def.h"
.include	"mp12_ext.h"
//.include	"t_mp12dec.h"
//.include 	"CPAD3.REG"

.extern		GetNBitFromBitstreamOnlyMP3,tbl_bitrateLSF
.extern		G_cnt
.extern primL2_cod,ancL2_cod,ancL1_cod



	MP3DecL2libSection
//////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////
InitalizeForL2Decoding::		
	eld		a		,#Area_L2Variables
	eld		rpd0	,a										
//	eld		a		,#Area_mpegVariables
//	eld		rpd1	,a

	eld		a		,#0x0250
	eld		msr2	,a
//	eld		a		,#1
//	eld		rpd1.index_GranuleLoop	,a
	eld		sd0		,#((1&0fh)<<12)|(1<<8)|((2&0fh)<<4)|(1<<0)	
	eld		sd1		,#((1&0fh)<<12)|(1<<8)|((2&0fh)<<4)|(1<<0)	
	eld		sd2		,#((1&0fh)<<12)|(1<<8)|((2&0fh)<<4)|(1<<0)	
	eld		sd3		,#((1&0fh)<<12)|(1<<8)|((2&0fh)<<4)|(1<<0)	

//	eld		a		,GL2Done
//	ecp		a		,#1
//	bra		ec0		,InitalizeForL2DecodingReturn
//d	ldb		r0		,@[a13+Index_GL2Done]

	ldw		r0		,@[a10+Index_pParameterH]
	ld		e12		,r0
	ldw		r0		,@[a10+Index_pParameterL]
	ld		r12		,r0
	
	ldb		r0		,@[a12+Index_P_GL2Done]
	cmp		eq		,r0		,#1
	brt		InitalizeForL2DecodingReturn
	

	eld		a		,#Area_pcmSamples
	eld		rpd1.index_GptrPcmSamples,	a

	eld		a		,#Area_synthesisBufferCh0
	eld		rpd1.index_GptrSynPrevious,a

	eld		a		,#0
	eld		G_cnt	,a

	ld		r0		,#1
//d	ldb		@[a13+Index_GL2Done]	,r0
	ldb		@[a12+Index_P_GL2Done]	,r0
		
	ld		r0		,#0x7f
	ld		r1		,#0xffff
	ecld	ah		,r0
	ecld	a		,r1
	eld		rpd0.index_Gp1	,a
	ld		r0		,#0x80
	ld		r1		,#0x0000
	ecld	ah		,r0
	ecld	a		,r1	
	eld		rpd0.index_Gm1	,a
	
//	push	a14
//	jsr		Load_L2table
//	pop		a14
InitalizeForL2DecodingReturn
	ret

//////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////
ParsingHeaderL2::							
	push	a14
	jsr		CheckSyncWordL2
	pop		a14
	
	cmp		eq		,r0		,#0	
	jpf		ParsingHeaderSyncErrorL2

	ldw		r0		,@[a13+Index_InputBufferRPointerL]
	ecld	a		,r0

	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		sa		,#15										;Sync word(07ffh):11-bit
																;ID(XX):2-bit
																;Layer(01):2-bit	
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3	
	pop		a14
	
	eld		sa		,#1											;Protection(CRC): 1-bit
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3
	pop		a14
	
	eld		a		,sg
	eld		rpd0.index_GCRC	,a									;save Protection(CRC)
	eld		si		,a											;next using
	
	eld		sa		,#4											;bitrate: 4-bit	
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3
	pop		a14
	
	eld		a		,sg
	ecld	r0		,a	
/////////////////////////////////////////////	
// Multi-CODEC //
// No need to change
/////////////////////////////////////////////		
	ldb		@[a13+Index_BitRate]	,r0							;save bitrate
//	
	eld		a		,rpd1.index_Glsf
	ecld	r1		,a
	cmp		eq		,r1		,#0
	brf		bitrateL2_lsf
	
	eld		rp3		,#tbl_bitrateL2-1		
	ecld	a		,r0
	eadd	a		,rp3
	eld		rp3		,a
	eld		a		,@rp3
	ecld	r0		,a
	ecld	r1		,ah
	
	ldw		@[a13+Index_FrameBitRate]	,r0
	ldw		@[a10+Index_BitRateADM+0]	,r1					//High
	ldw		@[a10+Index_BitRateADM+2]	,r0					//Low
		
	jmp		bitrateL2_lsfEnd	
bitrateL2_lsf	
	eld		rp3		,#tbl_bitrateLSF-1	
	ecld	a		,r0
	eadd	a		,rp3
//	eadd	a		,#y_base
	eld		rp3		,a
	eld		a		,@rp3
	ecld	r0		,a
	ecld	r1		,ah

	ldw		@[a13+Index_FrameBitRate]	,r0
	ldw		@[a10+Index_BitRateADM+0]	,r1					//High
	ldw		@[a10+Index_BitRateADM+2]	,r0					//Low	
bitrateL2_lsfEnd	
	eld		sa		,#2										;sampling freq.: 2-bit
	push	a14	
	jsr		GetNBitFromBitstreamOnlyMP3	
	pop		a14

	eld		a		,sg
	eld		rpd1.index_GOrgSampFreq	,a	
/////////////////////////////////////////////	
// Multi-CODEC //
//  MpegVersion 0 (11172 MP3)
//	44.1Khz 0	->	4
//	48Khz	1	->	3
//	32Khz	2	->	5
//  MpegVersion 1 (13818 LSF)
//	22.05Khz 0	->	7
//	24Khz	 1	->	6
//	16Khz	 2	->	8
//  MpegVersion 2 (Mpeg2.5)
//	11.025Khz 0	->	10
//	12Khz  	  1	->	 9
//	 8Khz	  2	->	11
/////////////////////////////////////////////	
	eld		a		,rpd1.index_Glsf
	ecld	r0		,a
	cmp		eq		,r0		,#1
	brt		LSF_samplingL2
	
	eld		a		,sg
	ld		r1		,#4	
	ld		r2		,#0xac44	
	ecld	r0		,a
	cmp		eq		,r0		,#0	
	brt		f10_bL2
	ld		r1		,#3
	ld		r2		,#0xbb80	
	cmp		eq		,r0		,#1
	brt		f10_bL2
	ld		r1		,#5	
	ld		r2		,#0x7d00	
f10_bL2		
	ldb		@[a13+Index_SamplingFreq]		,r1					;save sampling freq.
	ldw		@[a10+Index_SamplingRate+2]		,r2		
	jmp		Sampling_BranchL2	
LSF_samplingL2
	eld		a		,sg
	ld		r1		,#7	
	ld		r2		,#0x5622	
	ecld	r0		,a	
	cmp		eq		,r0		,#0
	brt		f20_bL2
	ld		r1		,#6
	ld		r2		,#0x5dc0
	cmp		eq		,r0		,#1
	brt		f20_bL2	
	ld		r1		,#8	
	ld		r2		,#0x3e80
f20_bL2		
	ldb		@[a13+Index_SamplingFreq]		,r1					;save sampling freq.
	ldw		@[a10+Index_SamplingRate+2]		,r2	
Sampling_BranchL2	

	eld		sa		,#1										;padding:1-bit	
	push	a14		
	jsr		GetNBitFromBitstreamOnlyMP3
	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_chL2
	eadd	a		,#1										;setting 2-channel
bra_chL2
	eld		rpd0.index_GPaddMode,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		a		,sg
	eld		rpd0.index_GmodeExt	,a							;save sg
															;sg[15:8]=null zero
															;sg[7:0]=mode_ext
	eld		sa		,#4
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch copyright,original/copy
	pop		a14
															;emphasis															

	eld		a		,si										;for checking CRC
///	bra		ec0		,ParsingHeaderNoCRCL2
	ecld	r4		,a
	cmp		eq		,r4		,#0
	brf		ParsingHeaderNoCRCL2

	eld		a		,#16
	eld		sa		,a										;	
	push	a14	
	jsr		GetNBitFromBitstreamOnlyMP3						;fetch CRC
	pop		a14	

	push	a14
	jsr		CheckCRCL2
	pop		a14

ParsingHeaderNoCRCL2
/*
///////////////////////////////////////////////////////////
//	read frame count
///////////////////////////////////////////////////////////
	ldw		r2		,@[a13+Index_FrameLength]				;r0<-frame length 

	ldw		r3		,@[a13+Index_InputBufferValidData]
	sub		r3		,r2
	ldw		@[a13+Index_InputBufferValidData]	,r3

	ldw		r3		,@[a13+Index_InputBufferRPointerL]		;source	
	add		r3		,r2
	
	and		r3		,#0x07ff
	or		r3		,#0x4000
	

	ldw		@[a13+Index_InputBufferRPointerL]	,r3			;source	
	ld		r3		,#0x20
	ldw		@[a13+Index_InputBufferRPointerH]	,r3			;source	
///////////////////////////////////////////////////////////
*/
	ld		r0		,#0
	ldb		@[a13+Index_FrameErrorFlag]		,r0				;indicates "TRUE"
	ldb		@[a10+Index_DecodeErrFlag]		,r0	
	ret

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

//////////////////////////////////////////////////////////////////////////////////
//
//	
//	rp0				valid data size
//	MA[47:24]		rp0's backup
//	P[47:24]		for MA++
//	x0				temporary buffer
//	y0				read buffer pointer
//
//////////////////////////////////////////////////////////////////////////////////
CheckSyncWordL2:
	ld		r3		,#1							;indicates "FALSE"
	eld		sd0		,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(1<<0)	;initialize post-modified value

	eld		rp2		,#tbl_FrameSizeL2

	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	
CheckSyncWordLoopL2
	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		CheckSyncWordValidEmptyL2			;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
SearchSyncWordLoopL2
	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		ec0		,ParsingHeaderDataL2		;ec0=z-flag

	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		CheckSyncWordValidEmptyL2

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

	jmp		SearchSyncWordLoopL2

ParsingHeaderDataL2
	eld		sa		,#1							
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3			;ID(0) LSF / ID(1) MP3
	pop		a14

	eld		a		,#0
	eld		rpd1.index_LMpegVersion		,a
	eld		rpd1.index_Glsf		,a				; MPEG1 MP3
	eld		rp2		,#tbl_FrameSizeL2
	eld		a		,sg
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brf		NoneLSFL2
	
	eld		a		,#1
	eld		rpd1.index_Glsf		,a				; MPEG2 LSF
	eld		rp2		,#tbl_FrameSizeLSFL2
	eld		rpd1.index_LMpegVersion		,a
NoneLSFL2												

	eld		sa		,#2							;Layer(01):2-bit
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3			;01
	pop		a14
	
	eld		a		,sg
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		ParsingHeaderLayerErrorL2
	
//	eld		a		,sg
	ecld	r5		,a
//////////////////////////////////////////////////
	cmp		eq		,r5		,#2
	brt		layer2_pass

	eld		a		,rpd1.index_Glsf	
	ecld	r4		,a
	cmp		eq		,r4		,#0
	brf		Lsf_LowLayerL2
	
	cmp		eq		,r5		,#1
	brf		Layer1_frameL2
	
	eld		rp2		,#tbl_mainDataSize
	jmp		layer2_pass
Layer1_frameL2
	eld		rp2		,#tbl_FrameSizeL1	

	jmp		layer2_pass
Lsf_LowLayerL2

	cmp		eq		,r5		,#1
	brf		Layer1_frameLsfL2
	
	eld		rp2		,#tbl_mainDataSizeLSF

	jmp		layer2_pass
Layer1_frameLsfL2
	eld		rp2		,#tbl_FrameSizeLSFL1
layer2_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		ParsingHeaderLayerErrorL2

	cmp		eq		,r0		,#15
	brt		ParsingHeaderLayerErrorL2	

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

	eld		a		,sg
	ecld	r0		,a
	cmp		eq		,r0		,#3
	brt		ParsingHeaderLayerErrorL2

	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	

//Mp3_FrameSize
	eld		a		,@rp3						;a<-(frame size-padding)
//Mp3_FrameSizeEnd
	eld		sa		,#1							;padding:1-bit	
	push	a14
	jsr		GetNBitFromBitstreamOnlyMP3	
	pop		a14
	eadd	a		,sg							;a<-frame size
	
	ecld	r0		,a
	ldw		@[a13+Index_FrameLength]	,r0		;frame size 
	
	cmp		eq		,r0		,#1728
	brt		CheckSyncWordHeaderGoodL2	
	
	eld		x0		,a							;x0:temporary buffer
// for invalid frame size
	cmp		gt		,r0		,#0x6c1
	brt		over_frame_sizeL2
		
	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		CheckSyncWordValidEmptyL2	
over_frame_sizeL2	
	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
	ecp		a		,sg
	enop
	bra		ec0		,CheckSyncWordHeaderGoodL2	;ec0=z-flag	
		
//	jmp		CheckSyncWordHeaderGoodL2	
ParsingHeaderLayerErrorL2
	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		CheckSyncWordLoopL2	
//Valid data in the input buffer are not enough to parse header or decode frame.
CheckSyncWordHeaderGoodL2
	ld		r3		,#0
/////////////////////////////////////////////////////
	cmp		eq		,r5		,#0001b
	jpt		Layer3SyncL2
	cmp		eq		,r5		,#0011b
	jpt		Layer1SyncL2	
//////////////////////////////////////////////////////	
CheckSyncWordValidEmptyL2
	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
	
	cmpu	ge		,r0		,#BitstreamEnd
	brf		buf_addr_passL2
	
	sub		r0		,#0x800	
buf_addr_passL2	

	ldw		@[a13+Index_InputBufferRPointerL]	,r0
	ld		r0		,#0x20
	ldw		@[a13+Index_InputBufferRPointerH]	,r0
CheckStartSyncWordValidEmptyL2	
	ld		r0		,r3							;return condition
	ret

Layer3SyncL2
	eld		a		,#0
	eld		GLayerDiff	,a
	ld		r0		,#1
	ret
Layer1SyncL2
	eld		a		,#2
	eld		GLayerDiff	,a
	ld		r0		,#1
	ret	
//////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////
SelectTableL2::
	eld		a		,rpd0.index_GPaddMode
	ecld	r0		,a
	srb		r0
	
	cmp		eq		,r0		,#3
	brf		next_condi1
	
	eld		a		,#1
	eld		rpd0.index_Gnch	,a

⌨️ 快捷键说明

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