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

📄 mpa_denorm.s

📁 samsung 9908DVD源代码,
💻 S
字号:
/*
 *  mpa_denorm.s
 *
 *  MPEG/audio multichannel decoder.
 *	Copyright (C) 2003 Optical Player P/J, Samsung Electronics.
 *
 */

.include	"mpa.h"

.secFILE_mpa_denorm

/********************************************************************

 Function:		MC_II_denormalizing

 Description:	De-normalisation procedure
 				In the MPEG/Audio decoder, the weighted signals 
 				Lw, Cw, Rw, LSw, RSw first have to be inverse 
 				weighted by multiplying the signals with the inverse 
 				weighting factors. Next, these signals can be 
 				multiplied by the de-normalisation factor to undo 
 				the attenuation, done at the encoder side to avoid 
 				overload when calculating the compatible signals.
 				
				1. procedure = 0, 2
					Lw, Rw  : 1 + sqrt(2)
					Cw	    : sqrt(2) * {1 + sqrt(2)}
					LSw, RSw: sqrt(2) * {1 + sqrt(2)}
 					
				2. procedure = 1
					Lw, Rw  : 1.5 + 0.5 * sqrt(2)
					Cw	    : sqrt(2) * {1.5 + 0.5 * sqrt(2)}
					LSw, RSw: 2 * {1.5 + 0.5 * sqrt(2)}
 				
				3. procedure = 3
					Lw, Rw, Cw, LSw, RSw: 1.0

 Arguments:		
				r0		procedure No.
				r1		surround mode
				r2		center present
				r3		mc channels

				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0: 	 x 		 x	     x       1
				sd1: 	 0		 1		 x		 x
				sd3:	 x		 x		 x	     1

********************************************************************/
.if( _DECODER_TYPE != MPEG_1_AUDIO )
MC_II_denormalizing:: 
				push		a14

				es			psh1
				es			usm					; x0 is signed, y1 is unsigned value
				es			op
				es			opm

				ebk			#0000b
				er			xsd
				eld			sd0, #0x0001
				eld			sd1, #0x0100
				eld			sd3, #0x0001
				
				eld			a, rpd0.dematrix_procedure
				eld			b, rpd0.surround
				eld			c, rpd0.center
				eld			d, rpd1.mc_channel
				ecld		r0, a
				ecld		r1, b
				ecld		r2, c
				ecld		r3, d

				cmp			eq, r0, #3
				brt			_end_denormalisation_

				eld			rp3, #denormalisation_factor
				cmp			eq, r0, #1
				brf			denormalize_base_channel
				eld			rp3, #denormalisation_factor+3



;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::                                                                ::;
;::                    Denormalize base channel                    ::;
;::                                                                ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;

denormalize_base_channel
				eld			a, #(MAX_CHANNEL-STEREO)*PARTS*SBLIMIT-2
				ld			r4, #STEREO*PARTS
				eld			rp0, #CH0_FRAC_BUFFER
				jsr			multiply_denorm_factor

				
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::                                                                ::;
;::                    Denormalize multi channel                   ::;
;::                                                                ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;

denormalize_multichannel				
				cmp			eq, r1, #SECOND_STEREO
				brt			denorm_2nd_stereo

				cmp			eq, r0, #1			; dematrix procedure 1
				brt			denorm_procedure_1

denorm_procedure_0_2
				ld			r4, #PARTS
				ld			r5, #SBLIMIT
				ld			r6, #MAX_CHANNEL
				sub			r6, r3
				mul			uu, r6, r4			; (MAX_CHANNEL-NMCH)*PARTS
				mul			uu, r4, r3			; NMCH*PARTS
				mul			uu, r5, r6
				sub			r5, #2				; NMCH*PARTS*SBLIMIT-2
				ecld		a, r5
				
				eld			rp0, #CH2_FRAC_BUFFER
				jsr			multiply_denorm_factor
				
				bra			_end_denormalisation_
				

denorm_procedure_1
				cmp			eq, r3, #3
				brt			mc_channels_3
				cmp			eq, r3, #2
				brt			mc_channels_2
				cmp			eq, r3, #1
				brt			mc_channels_1

mc_channels_3
; denormalize center channel 
				eld			a, #(MAX_CHANNEL-1)*PARTS*SBLIMIT-2
				ld			r4, #1*PARTS
				eld			rp0, #CH2_FRAC_BUFFER
				jsr			multiply_denorm_factor
				
; denormalize surround channel 
				eld			a, #(MAX_CHANNEL-2)*PARTS*SBLIMIT-2
				ld			r4, #2*PARTS
				eld			rp0, #CH3_FRAC_BUFFER
				jsr			multiply_denorm_factor
				bra			_end_denormalisation_				

mc_channels_2	
				cmp			eq, r1, #STEREO_SURROUND
				brt			ch_2_2

; denormalize 3/1 channel configuration
ch_3_1			eld			a, #(MAX_CHANNEL-1)*PARTS*SBLIMIT-2
				ld			r4, #1*PARTS
				eld			rp0, #CH2_FRAC_BUFFER
				jsr			multiply_denorm_factor
				
				eld			a, #(MAX_CHANNEL-1)*PARTS*SBLIMIT-2
				ld			r4, #1*PARTS
				eld			rp0, #CH3_FRAC_BUFFER
				jsr			multiply_denorm_factor
				bra			_end_denormalisation_				

; denormalize 2/2 channel configuration
ch_2_2			erps		rp3+s0
				eld			a, #(MAX_CHANNEL-2)*PARTS*SBLIMIT-2
				ld			r4, #2*PARTS
				eld			rp0, #CH2_FRAC_BUFFER
				jsr			multiply_denorm_factor
				bra			_end_denormalisation_				

mc_channels_1				
				cmp			eq, r2, #CENTER_NONE
				brf			ch_3_0
				
; denormalize 2/1 channel configuration
ch_2_1			erps		rp3+s0

; denormalize 3/0 channel configuration
ch_3_0			eld			a, #(MAX_CHANNEL-1)*PARTS*SBLIMIT-2
				ld			r4, #MONO*PARTS
				eld			rp0, #CH2_FRAC_BUFFER
				jsr			multiply_denorm_factor
				bra			_end_denormalisation_				


denorm_2nd_stereo
				cmp			eq, r2, #CENTER_NONE
				brt			_end_denormalisation_
				eld			a, #(MAX_CHANNEL-1)*PARTS*SBLIMIT-2
				ld			r4, #MONO*PARTS
				eld			rp0, #CH2_FRAC_BUFFER
				jsr			multiply_denorm_factor
				
_end_denormalisation_				
				er			usm
				er			psh1
				er			op
				er			opm
				pop			a14
				ret
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */



/********************************************************************

 Function:		MC_AUG_denormalizing

 Description:	
 				
 Arguments:		
				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0: 	 x 		 x	     x       1
				sd1: 	 0		 1		 x		 x
				sd3:	 x		 x		 7	     1

********************************************************************/
.if( _DECODER_TYPE == MPEG_2_71CH )
MC_AUG_denormalizing::
				push		a14

				es			usm
				es			psh1
				es			op
				es			opm

				ebk			#0000b
				er			xsd
				eld			sd0, #0x0001
				eld			sd1, #0x0100
				eld			sd3, #0x0071
				
				eld			rp3, #aug_denormalisation_factor
				eld			a, rpd0.dematrix_procedure
				eld			b, rpd1.aug_mtx_proc
				esla		a
				esla		a
				esla		a
				esla		a
				eadd		a, b
				
				ecp			a, #0x00
				ebra		ec0, denormalize_all_channel
				ecp			a, #0x20
				ebra		ec0, denormalize_all_channel
				
				ecp			a, #0x10    
				ebrad		ec0, denormalize_all_channel
				erps		rp3+s1
				
				ecp			a, #0x30    
				ebrad		ec0, denormalize_all_channel
				erps		rp3+s1
				
				ecp			a, #0x01
				ebrad		ec0, denormalize_all_channel
				erps		rp3+s1
				ecp			a, #0x21
				ebra		ec0, denormalize_all_channel
				
				ecp			a, #0x11    
				ebrad		ec0, denormalize_all_channel
				erps		rp3+s1
				
				ecp			a, #0x31    
				ebrad		ec0, denormalize_all_channel
				erps		rp3+s1
				
				ecp			a, #0x03
				ebrad		ec0, denormalize_all_channel
				erps		rp3+s1
				ecp			a, #0x23
				ebra		ec0, denormalize_all_channel
				
				ecp			a, #0x13    
				ebrad		ec0, denormalize_all_channel
				erps		rp3+s1
				
				ecp			a, #0x33    
				;brad		ec0, denormalize_all_channel
				;erps		rp3+s1
				ebra		ec0, end_AUG_denormalize
				

denormalize_all_channel
				eld			a, #(MAX_CHANNEL-1)*PARTS*SBLIMIT-2
				ld			r4, #PARTS
				
				eld			rp0, #CH0_FRAC_BUFFER
				jsr			multiply_denorm_factor				; T0
				
				eld			rp0, #CH1_FRAC_BUFFER
				jsr			multiply_denorm_factor				; T1
				
				eld			rp0, #CH2_FRAC_BUFFER
				jsr			multiply_denorm_factor				; T2
				
				eld			rp0, #CH3_FRAC_BUFFER
				jsr			multiply_denorm_factor				; T3
				
				eld			rp0, #CH4_FRAC_BUFFER
				jsr			multiply_denorm_factor				; T4
				
				eld			rp0, #CH5_FRAC_BUFFER
				jsr			multiply_denorm_factor				; T5
				
				eld			rp0, #CH6_FRAC_BUFFER
				jsr			multiply_denorm_factor				; T6

end_AUG_denormalize
				er			usm
				er			psh1
				er			op
				er			opm
				pop			a14
				ret
.endif /* .if( _DECODER_TYPE == MPEG_2_71CH ) */


/********************************************************************

 Function:		multiply_denorm_factor

 Description:	
 				
 Arguments:		r4		inner loop count
 				r7		granule count
 				a		next granule offset
				rp0		fraction buffer pointer
				rp3		denormalisation factor table

 NOTE:			flags
				set		usm, psh1, opm
				
********************************************************************/

store			.macro	ma
.if 1
				eld			@rp1+d0, ma
.else
				eld			b, ma0rn
				eld			@rp1+d0, b
.endif
				.endm
				
multiply_denorm_factor:
				ld			r7, #GRANULES

				eld			y1, @rp3+s0
loop_1			ld			r6, r4
				eld			rp1, rp0
				eld			x0, @rp0+s0
				emul		x0y1, x0, @rp0+s0
loop_2			emld		ma0, x0y1, x0, @rp0+s0			; sb 0 ~ 7
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				
				emld		ma0, x0y1, x0, @rp0+s0			; sb 8 ~ 15
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				
				emld		ma0, x0y1, x0, @rp0+s0			; sb 16 ~ 23
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				
				emld		ma0, x0y1, x0, @rp0+s0			; sb 24 ~ 31
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				emld		ma0, x0y1, x0, @rp0+s0
				esla		ma0
				esla		ma0
				store		ma0
				
				dt			r6
				brf			loop_2
				dt			r7
				brfd		loop_1
				erpn		rp0, a
				ret
.end	

⌨️ 快捷键说明

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