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

📄 mp3decnew.s

📁 samsung 9908DVD源代码,
💻 S
📖 第 1 页 / 共 5 页
字号:
	ld		a12		,#0x2c0000					//CONFIG0
	ldw		r0		,@[a12]
	and		r0,		#0xff
	
	ldb		r1		,@[a10+Index_OutPCMSize]	
	cmp		eq		,r1	,#24
	brt		PCM24L1
	
	or		r0		,#0x4600
	jmp		PCM24EndL1	

PCM24L1:
	or		r0		,#0x4000

PCM24EndL1:
	ldw		@[a12+0],r0					//SBF1 mac[23:0]->ext[31:0] & zero extension	
		
	ld		a12		,#0x2c0000	
	// 0ffset read
.ifdef PtrLongSize
	ldw		r0		,@[a10+Index_InputBufferOffset]
	ldw		@[a12+0x52],r0
	ldw		r0		,@[a10+Index_InputBufferOffset+2]
	ldw		@[a12+0x54],r0
.else
	ld		r0		,#0
	ldw		@[a12+0x52],r0	
	ldw		r0		,@[a10+Index_InputBufferOffset]
	ldw		@[a12+0x54],r0	
.endif
	ld		r0		,#0x1000					//SBFCON  SBF0 FILL COMMAND & SBF1 FLUSH COMMAND
	ldw		@[a12+0x4a],r0
////////////////////////////////////////
	jsr		InitalizeForL1Decoding		

	eld		a		,G_cnt
	eadd	a		,#1
	eld		G_cnt	,a

	jsr		Fill_bufferMP3

	jsr		ParsingHeaderL1							
///////////////////////////////////////////////////////////////
	eld		a		,GLayerDiff
	ecld	r1		,a
	ld		r2		,#0
	cmp		eq		,r1		,#2
	brt		Layer_selL1
	ldb		@[a13+Index_FrameStartFlag]	,r2	
	ldb		@[a13+Index_GL2Done]		,r2				// warning
	ldw		r0		,@[a10+Index_pParameterH]
	ld		e12		,r0
	ldw		r0		,@[a10+Index_pParameterL]
	ld		r12		,r0
	ldb		@[a12+Index_P_GL2Done]	,r2
	
	jmp		Mp3DecodingReturn
///////////////////////////////////////////////////////////////
Layer_selL1	
	cmp		eq		,r0		,#0
	jpf		Mp3DecodingReturn

	eld		sd0		,#((1&0fh)<<12)|(1<<8)|((2&0fh)<<4)|(1<<0)	
	eld		sd1		,#((1&0fh)<<12)|(1<<8)|((2&0fh)<<4)|(1<<0)	

	jsr		SelectTableL1
	jsr		BitAllocationL1
	jsr		ScalefactorsL1	
	jsr		FetchDequanData

	eld		c		,#0
	eld		rpd0.index_Ggr	,c
DequanGrLoopL1
	jsr		DequantizerL1

	eld		a		,rpd0.index_Ggr		
	eadd	a		,#1
	eld		rpd0.index_Ggr			,a
	ecp		a		,#12
	enop
	bra		ec2		,DequanGrLoopL1

	jsr		Separate_channel

	eld		a		,rpd0.index_Gnch
	esub	a		,#1
	ecld	r0		,a
	ldb		@[a13+Index_ChannelLoop]	,r0
	
	eld		a		,#Area_leftChannel	
L1DecodingChannelLoop2
	eld		rpd1.index_GptrCurrentDecodingData,	a	
		
	jsr		SynthesisPolyphase
	
	eld		a		,#Area_rightChannel
	ldb		r6		,@[a13+Index_ChannelLoop]
	dec		r6	
	ldb		@[a13+Index_ChannelLoop]	,r6
	
	cmp		eq		,r6		,#0
	brt		L1DecodingChannelLoop2
	
	esub	b		,#1024
	eld		rpd1.index_GptrSynPrevious,	b				;update the pointer of 	
		
	jsr 	ComposeStereoL12							//2002
	
	jmp		Mp3DecodingFrame	
//////////////////////////////////////////////////////////////////////////////////
;
;
//////////////////////////////////////////////////////////////////////////////////
BackupGPRSFR:
	nop
	nop

	push	r0
	push	r1
	push	r2
	push	r3	
	push	r4
	push	r5
	push	r6
	push	r7	
	
	push	a11
	push	a12
	push	a13

	ret

//////////////////////////////////////////////////////////////////////////////////
;
;
//////////////////////////////////////////////////////////////////////////////////
RestoreGPRSFR:
	nop
	nop
	
	pop		a13	
	pop		a12
	pop		a11
	
	pop		r7	
	pop		r6	
	pop		r5	
	pop		r4	
	pop		r3	
	pop		r2	
	pop		r1	
	pop		r0	

	ret

//////////////////////////////////////////////////////////////////////////////////
;	rpd0	rpdi.adr[4:0]
;			the base address of sideinformation for MPEG process
;	rpd1	rpdi.addr[4:0] / rpd1.adr[3:0]
;			the base address of global variable for MPEG process
;	especially, rpd0/rpd1 must not be varied throughout all routines
//////////////////////////////////////////////////////////////////////////////////
InitalizeForDecoding:
	eld		a		,#Area_sideInformation						;because of MAC address
	eld		rpd0	,a											;initialize MAC base 																;address (rpd0)
	eld		a		,#Area_mpegVariables
	eld		rpd1	,a											;initialize base address of MAC variables 
	
	eld		a		,#0
	eld		msr0	,a
	eld		a		,#0028h										;Enable Saturation/Fractional/Signed Mode/MA0
	eld		msr1	,a
	eld		a		,#0f51h										;ec0=nz. ec1=nc, ec2=t
	eld		msr2	,a											;initialize status 2

	eld		mc0		,#1024-1
	eld		mc1		,#(7<<10)|512-1								;modulo rp2/rp3 (512),bit reverse [4:0]	

	eld		a		,#CodecSharedMP3							;+SharedOffsetAddress
	esla	a
	ecld	r0		,a
	ld		r13		,r0
	ld		r0		,#0x20
	ld		e13		,r0
//t	ld		a10		,#_MainCodecShared

	eld		b		,#Area_pcmSamples
	eld		rpd1.index_GptrPcmSamples,	b

	ldw		r0		,@[a10+Index_pParameterH]
	ld		e12		,r0
	ldw		r0		,@[a10+Index_pParameterL]
	ld		r12		,r0
	
	ldb		r0		,@[a12+Index_P_GL2Done]
//h	ldb		r0		,@[a13+Index_GL2Done]
	cmp		eq		,r0		,#1
	jpf		L2Pass
	
	jpt		L2Decoding
L2Pass	
	ldb		r0		,@[a12+Index_P_GL2Done]	
//h	ldb		r0		,@[a13+Index_GL2Done]
	cmp		eq		,r0		,#2
	jpf		L1Pass
	
	jpt		L1Decoding
L1Pass
//	ldb		r0		,@[a13+Index_FrameStartFlag]			;r0<-FrameStartFlag
	ldb		r0		,@[a10+Index_CodecStartFlag]			;r0<-FrameStartFlag
	cmp		eq		,r0		,#0
	jpf		InitalizeForDecodingReturn
	ld		r0		,#1
	ldb		@[a10+Index_CodecStartFlag]		,r0
//	ldb		@[a13+Index_FrameStartFlag]		,r0

	ld		a12		,#0x2c0050
%1:	ldw		r2		,@[a12]
	and		r2, 	#0x7000
	cmp		eq, 	r2, #(0x1<<12)
	brt		%b1
		
	cmp		eq,		r2, #(0x2<<12)
	brt		%b1

	esd0	d0		,#1	
	eld		a		,#0	
	eld		rp0		,#CodecSharedMP3
	ld		r6		,#80-1
Var_init
	bnzd	r6		,Var_init
	eld		@rp0+d0	,a

	eld		rp0		,#Area_mpegBitstream
	ld		r6		,#1024-1
var_init2	
	bnzd	r6		,var_init2
	eld		@rp0+d0	,a	

// for TEST	/////////////////////////////////////////////
//	ld		r0		,#0x03
//	ldb		@[a10+Index_OptionalFunctionOnOff]	,r0
//	ld		r0		,#8
//	ld		r0		,#30
//	ldb		@[a10+Index_VolumeIndex]	,r0

//	ld		r0		,#0x20
//	ld		r1		,#0x6000
//	ldw		@[a10+Index_pSpectrumDisplay]	,r0
//	ldw		@[a10+Index_pSpectrumDisplay+2]	,r1

	ld		r0		,#0x00
//	ldb		r0		,@[a10+Index_OptionalFunctionOnOff]	
	ldb		@[a13+Index_EQ_VolumeFlag]	,r0
//	ld		r0		,#20
//	ldb		r0		,@[a10+Index_VolumeIndex]	
	ld		r0		,#40
	ldb		@[a13+Index_VolumeControl]	,r0	
/////////////////////////////////////////////////////////
	eld		a		,#1
	eld		rpd1.index_GranuleLoop	,a						;initialize granule
	eld		a		,#0
	eld		rpd1.index_Glsf	,a								;initialize MP3(default)
	eld		rpd1.index_LMpegVersion	,a
	eld		GLayerDiff		,a
	eld		G_cnt			,a
	eld		G_firFrame		,a
	eld		G_FillBuffFlag	,a
	
//	ldb		r0		,@[a10+Index_VolumeIndex]
	ldb		r0		,@[a13+Index_VolumeControl]
//	ld		r0		,#0x19
	ecld	a		,r0
	eld		G_PrevVol,a

	ld		r0		,#0x5a
	ld		r1		,#0x6705	//+3dB>>2	
	ecld	ah		,r0
	ecld	a		,r1
	eld		G_SubVolume	,a
	
	ld		r0		,#0x16
	ld		r1		,#0xc300	//15db
//	ld		r0		,#0x15
//	ld		r1		,#0x7d00	//15db
	ecld	ah		,r0
	ecld	a		,r1
	eld		G_CompVol	,a
		
	ld		r0		,#0
	ldb		@[a13+Index_GL2Done]	,r0
			
	ld		r0		,#0x20
	ldw		@[a13+Index_InputBufferPointerH]	,r0
	ldw		@[a13+Index_InputBufferRPointerH]	,r0		
	ldw		@[a13+Index_InputBufferWPointerH]	,r0		
	
	ld		r0		,#Area_mpegDataInput	
	sl		r0		
	ldw		@[a13+Index_InputBufferPointerL]	,r0
	ldw		@[a13+Index_InputBufferRPointerL]	,r0		
	ldw		@[a13+Index_InputBufferWPointerL]	,r0		
	
	ld		r0		,#0
	ldw		@[a13+Index_InputBufferValidData]	,r0	
	
	ld		r0		,#2048
	ldw		@[a13+Index_InputBufferLength]	,r0
		
	ld		r0		,#Area_pcmSamples	
	sl		r0
	ldw		@[a13+Index_OutputBufferPointerL]	,r0
	ld		r0		,#0x20
	ldw		@[a13+Index_OutputBufferPointerH]	,r0
	
	ld		r0		,#1152*4	
	ldw		@[a13+Index_OutputBufferLength]		,r0		

	eld		a		,#Area_pcmSamples
	eld		rpd1.index_GptrPcmSamples,	a

	eld		a		,#Area_mpegBitstream
	esla	a													;because of Calm pointer
	eld		rpd1.index_GptrNextMainData,a						
	
	eld		a		,#Area_synthesisBufferCh0
	eld		rpd1.index_GptrSynPrevious,a	
	
	eld		b		,#Area_sideInformation+const_sideInformationSize
	eld		rpd1.index_GptrSideInformation,	b
	
	esd0	d0		,#1	
	eld		a		,#0		

;Clear Synthesis 1024-word channel 0&1 buffer
	eld		rp0		,#Area_synthesisBufferCh0
	ld		r6		,#1024*2-1	
sysnth_init	
	bnzd	r6		,sysnth_init
	eld		@rp0+d0	,a
;Clear Imdct previous 512-word channel 0&1 buffer	
	eld		rp0		,#Area_imdctPrevCh0
	ld		r6		,#576*2-1
imdct_init
	bnzd	r6		,imdct_init
	eld		@rp0+d0	,a
;Clear PCM Data 1152-word channel 0&1 buffer
	eld		rp0		,#Area_pcmSamples
	ld		r6		,#1152*2-1
pcm_init
	bnzd	r6		,pcm_init
	eld		@rp0+d0	,a

.ifdef TestMode
	push	a14
	jsr		Load_table							;Y-memory table load
	pop		a14
.endif
	
	ld		r0		,#0							;indicates initialization end
InitalizeForDecodingReturn	
	ret		
//////////////////////////////////////////////////////////////////////////////////
;		rp1			receiving bitstream pointer
//////////////////////////////////////////////////////////////////////////////////
ParsingHeader::
	push	a14
	jsr		CheckSyncWord
	pop		a14
	
	cmp		eq		,r0		,#0	
	jpf		ParsingHeaderSyncError
	eld		rp0		,#Area_mpegVariables
	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	
												;ID(1):1-bit
												;Layer(01):2-bit
	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		@rp0+d0	,sg											;save Protection(CRC)
	eld		si		,sg											;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		bitrate_lsf
	
	eld		rp3		,#tbl_bitrate-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		bitrate_lsfEnd	
bitrate_lsf	
	eld		rp3		,#tbl_bitrateLSF-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
	
bitrate_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_LMpegVersion	
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brf		LSF_sampling
	
	eld		a		,sg
	ld		r1		,#4	
	ld		r2		,#0xac44
	ecld	r0		,a
	cmp		eq		,r0		,#0	
	brt		f10_b
	ld		r1		,#3
	ld		r2		,#0xbb80
	cmp		eq		,r0		,#1
	brt		f10_b
	ld		r1		,#5	
	ld		r2		,#0x7d00
f10_b		
	ldb		@[a13+Index_SamplingFreq]		,r1					;save sampling freq.
	ldw		@[a10+Index_SamplingRate+2]		,r2	
	
	jmp		Sampling_Branch	
LSF_sampling
	ecld	r0		,a	
	cmp		eq		,r0		,#2
	brt		Mpeg25_sampling
	eld		a		,sg
	ld		r1		,#7	
	ld		r2		,#0x5622
	ecld	r0		,a	
	cmp		eq		,r0		,#0
	brt		f20_b
	ld		r1		,#6
	ld		r2		,#0x5dc0
	cmp		eq		,r0		,#1
	brt		f20_b	
	ld		r1		,#8	
	ld		r2		,#0x3e80
f20_b		
	ldb		@[a13+Index_SamplingFreq]		,r1					;save sampling freq.
	ldw		@[a10+Index_SamplingRate+2]		,r2	
	
	jmp		Sampling_Branch	
Mpeg25_sampling
	eld		a		,sg
	ld		r1		,#10	
	ld		r2		,#0x2b11
	ecld	r0		,a
	cmp		eq		,r0		,#0
	brt		f30_b	
	ld		r1		,#9
	ld		r2		,#0x2ee0
	cmp		eq		,r0		,#1
	brt		f30_b	
	ld		r1		,#11	
	ld		r2		,#0x1f40
f30_b		
	ldb		@[a13+Index_SamplingFreq]		,r1
	ldw		@[a10+Index_SamplingRate+2]		,r2		
Sampling_Branch
	ld		r2		,#0
	ldw		@[a10+Index_SamplingRate]		,r2	
	
	eld		a		,rpd1.index_Glsf
	ecld	r1		,a
	cmp		eq		,r1		,#0
	brf		SFBandLSF
	eld		a		,#tbl_scfbLong44_1	
	cmp		eq		,r0		,#0
	brt		ParsingHeaderPadding
	eld		a		,#tbl_scfbLong48	
	cmp		eq		,r0		,#1
	brt		ParsingHeaderPadding
	cmp		eq		,r0		,#2
	brf		ParsingHeaderFreqError
	eld		a		,#tbl_scfbLong32		
	jmp		SFBandLSFEnd
SFBandLSF
	cmp		eq		,r1		,#2
	brt		SFBandLSF2_5
	eld		a		,#tbl_scfbLong22_0LSF	
	cmp		eq		,r0		,#0
	brt		ParsingHeaderPadding
	eld		a		,#tbl_scfbLong24LSF	
	cmp		eq		,r0		,#1
	brt		ParsingHeaderPadding
	cmp		eq		,r0		,#2	
	brf		ParsingHeaderFreqError
	eld		a		,#tbl_scfbLong16LSF		
	jmp		SFBandLSFEnd
SFBandLSF2_5
	eld		a		,#tbl_scfbLong11_0LSF
	cmp		eq		,r0		,#0
	brt		ParsingHeaderPadding
	eld		a		,#tbl_scfbLong12LSF	
	cmp		eq		,r0		,#1
	brt		ParsingHeaderPadding
	cmp		eq		,r0		,#2
	brf		ParsingHeaderFreqError
	eld		a		,#tbl_scfbLong8LSF
SFBandLSFEnd

ParsingHeaderPadding
	eld		rpd1.index_GLongSfBandIndex,	a
	eadd	a		,#SizeOfLongToShort+1
	eld		rpd1.index_GShortSfBandIndex,	a
	
	eld		sa		,#1										;padding:1-bit	
	push	a14		
	jsr		GetNBitFromBitstreamOnlyMP3

⌨️ 快捷键说明

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