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

📄 mpa_lfe.s

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

.if( _DECODER_TYPE != MPEG_1_AUDIO )

.secFILE_mpa_lfe


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

 Function:		MC_II_lfe_dequantize

 Description:	

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

				@bank1
						d1		d0		s1		s0
				---------------------------------------
				sd3:	 x		 x		 x		17

				audio buffer map (max 10 channels)

				<------------  sample per each channel ------------>
				+----+----+----+----+----+----+----+-----+----+----+
				| Lo |  L | Ls |  C | Lc | Ro |  R | Rs | LFE | Rc | 
				+----+----+----+----+----+----+----+-----+----+----+
				... 1152 th sample of channel 

********************************************************************/
MC_II_lfe_dequantize::
				es			psh1
				es			usm
				es			op
				es			opm

				ebk			#1000b
				er			xsd
				esd3		s0, #1
				es			xsd
				esd3		s0, #1
				eld			sd1, #0x0110
				
				eld			rp1, #lfe_fraction + 1
				ld			r6, #GRANULES-1

				eld			rpd1, #layer_info
				eld			a, rpd1.lfe_allocation
				ecp			a, #0
				ebra		ec0, no_lfe_dequant
				
				eld			b, rpd1.lfe_scalefactor
				eld			c, rpd1.alloc_tbl_ptr		; allocation table pointer
				eld			rp2, c
				erpn		rp2, a
				eld			d, @rp2						; index
				eld			rp2, #scalefactor
				erpn		rp2, b
				eld			x1, @rp2					; scale multiply factor
				eld			rp2, #II_MSB_position
				erpn		rp2, d
				eld			si, sr						; backup bit_buffer
				ld			r0, #0x80					; high word of -1.0
				
; invert most significant bit, extend sign, dequantize sample
; then scale to fixed format
dequantize_lfe_sample
				eld			rp3, rp2
				eld			a, @rp3+s0
				eld			b, @rp1+s0
				esft		b, a						; si: sample
				etst		c, ec3						; check msb is +/-
				brad		ec3, %f1
				eld			b, #0						;  0.0
				ecld		bh, r0						; -1.0				
%1				eld			a, #-1
				esft		sr, a
				eadd		b, sr						; 2's complement sample
; dequantize the sample, s" = C * (s"' + D)
				eld			ma0, @rp3+s0				; dequant_coeff_D
				eadd		b, ma0, y1, @rp3+s0			; dequant_coeff_C
				eld			x0, b
				emul		x0y1
				eld			y0, p
				emul		x1y0
				bnzd		r6, dequantize_lfe_sample
				eld			@rp1+d0, p					; dequantized sample[part]
				brad		end_lfe_dequantize
				eld			sr, si						; restore bit_buffer
				
no_lfe_dequant	
				bnzd		r6, $
				eld			@rp1+d0, a

end_lfe_dequantize
				ebk			#0000b
				er			xsd
				er			psh1
				er			usm
				er			op
				er			opm
				ret



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

 Function:		expand_lfe_sample

 Description:	expand 12 lfe samples to 1152 samples.

 Arguments:		
				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0:	 x		 1		 x		 x
				sd1:	 x		 x		 1		 x
				sd2:	 x		 1		 x		 x

********************************************************************/
expand_lfe_sample::
				es			op
				es			opm
				
				er			xsd
				eld			sd0, #0x0100
				eld			sd1, #0x0010
				eld			sd2, #0x0100

				ld			r4, #GRANULES
				ld			r5, #95 - 1
				ld			r7, r5
				esec0		#ECP_POS

				eld			rp0, #pcm_lfe_buffer
				eld			rp1, #lfe_fraction

%1				eld			rp2, #lfe_scale_factor
				ecr			ma1
				eld			ma1, @rp1+s1		; get previous sample
				eld			b, @rp1+s0			; get current sample
				eld			@rp0+d0, ma1
				
; calculate step value
				ld			r3, #0				; sign bit flag
				esub		b, ma1
				ebra		ec0, %f2
				ld			r3, #1
				eneg		b
%2				er			nq
				ecr			ma0
				eld			ma0l, b
				eld			p, #96
				esla		ma0
				ld			r6, #23
				bnzd		r6, $
				edivq		ma0, p
				eresr		ma0, p
				eld			ph, ma0l			; quotient
				esra		ma0
				eld			d, ma0				; remainder				
				erpn		rp2, d
				eld			pl, @rp2			; step value
				
%3				cmp			eq, r3, #0
				brt			%f4
				esub		ma1, p
				bra			%f5
%4				eadd		ma1, p
				ernd		ma1
%5				bnzd		r7, %b3
				eld			@rp0+d0, ma1
				dt			r4
				brfd		%b1
				ld			r7, r5

end_lfe_expansion
; store last sample to previous sample
				eld			a, @rp1+s0		; get last sample
				eld			rp1, #lfe_fraction
				eld			@rp1, a

				esec0		#ECP_Z
				er			op
				er			opm
				ret



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

 Function:		lfe_filter

 Description:	Low pass lfe filter, cutoff frequency is 125Hz,
                sampling frequency is 48kHz.
                This filtering is encoder isue. In decoder, not working
                
                Algorithm:
                
				for (i = 0; i < 1152; i++)
				{
					for(k = 0; k < 8; k++)
					{
						v0[k] = sambuf[i];
						sambuf[i] = v0[k] * a0[k] + 
						            v1[k] * a1[k] + 
						            v2[k] * a2[k] - 
							        w1[k] * b1[k] - 
							        w2[k] * b2[k];
						v2[k] = v1[k]; 
						v1[k] = v0[k];
						w2[k] = w1[k]; 
						w1[k] = sambuf[i];
					}
				}

 Arguments:		
				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0:	 x		 1		 x		 x
				sd1:	 x		 x		 1		 x
				sd2:	 x		 1		 x		 x

********************************************************************/
lfe_filter::
				es			psh1
				er			usm
				es			opm
				
				er			xsd
				eld			sd0, #0x8880
				eld			sd3, #0x0018
				es			xsd
				eld			sd0, #0xF000
				eld			sd3, #0x00E0
				eld			sd1, #0x0100
				eld			sd2, #0x0100

				ld			r6, #SAMPLES_PER_FRAME-1
				ld			r7, #7
				eld			a, #-7

				eld			rp2, #pcm_lfe_buffer

%1				eld			rp0, #v1
				eld			rp3, #lfe_filter_coef
				eld			ma0, @rp2+s0
				eld			x0, ma0				
				eld			y0, @rp3+s0
				emul		x0y0, x1, @rp0+s0, y0, @rp3+s0
				eld			ma0, p, @rp0+d0, ma0				
				emul		x1y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0
				eld			@rp0+d0, x1				
				eld			x0, @rp0+s1, y0, @rp3+s0
				emad		ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
				emsb		ma0, x1y0
				eld			@rp0+d1, x0
				esub		ma0, p
				eld			@rp0+d1, ma0
				erpn		rp0, a

				eld			x0, ma0				
				eld			y0, @rp3+s0
				emul		x0y0, x1, @rp0+s0, y0, @rp3+s0
				eld			ma0, p, @rp0+d0, ma0				
				emul		x1y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0
				eld			@rp0+d0, x1				
				eld			x0, @rp0+s1, y0, @rp3+s0
				emad		ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
				emsb		ma0, x1y0
				eld			@rp0+d1, x0
				esub		ma0, p
				eld			@rp0+d1, ma0
				erpn		rp0, a
				
				eld			x0, ma0				
				eld			y0, @rp3+s0
				emul		x0y0, x1, @rp0+s0, y0, @rp3+s0
				eld			ma0, p, @rp0+d0, ma0				
				emul		x1y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0
				eld			@rp0+d0, x1				
				eld			x0, @rp0+s1, y0, @rp3+s0
				emad		ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
				emsb		ma0, x1y0
				eld			@rp0+d1, x0
				esub		ma0, p
				eld			@rp0+d1, ma0
				erpn		rp0, a

				eld			x0, ma0				
				eld			y0, @rp3+s0
				emul		x0y0, x1, @rp0+s0, y0, @rp3+s0
				eld			ma0, p, @rp0+d0, ma0				
				emul		x1y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0
				eld			@rp0+d0, x1				
				eld			x0, @rp0+s1, y0, @rp3+s0
				emad		ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
				emsb		ma0, x1y0
				eld			@rp0+d1, x0
				esub		ma0, p
				eld			@rp0+d1, ma0
				erpn		rp0, a

				eld			x0, ma0				
				eld			y0, @rp3+s0
				emul		x0y0, x1, @rp0+s0, y0, @rp3+s0
				eld			ma0, p, @rp0+d0, ma0				
				emul		x1y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0
				eld			@rp0+d0, x1				
				eld			x0, @rp0+s1, y0, @rp3+s0
				emad		ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
				emsb		ma0, x1y0
				eld			@rp0+d1, x0
				esub		ma0, p
				eld			@rp0+d1, ma0
				erpn		rp0, a

				eld			x0, ma0				
				eld			y0, @rp3+s0
				emul		x0y0, x1, @rp0+s0, y0, @rp3+s0
				eld			ma0, p, @rp0+d0, ma0				
				emul		x1y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0
				eld			@rp0+d0, x1				
				eld			x0, @rp0+s1, y0, @rp3+s0
				emad		ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
				emsb		ma0, x1y0
				eld			@rp0+d1, x0
				esub		ma0, p
				eld			@rp0+d1, ma0
				erpn		rp0, a
				
				eld			x0, ma0				
				eld			y0, @rp3+s0
				emul		x0y0, x1, @rp0+s0, y0, @rp3+s0
				eld			ma0, p, @rp0+d0, ma0				
				emul		x1y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0
				eld			@rp0+d0, x1				
				eld			x0, @rp0+s1, y0, @rp3+s0
				emad		ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
				emsb		ma0, x1y0
				eld			@rp0+d1, x0
				esub		ma0, p
				eld			@rp0+d1, ma0
				erpn		rp0, a

				eld			x0, ma0				
				eld			y0, @rp3+s0
				emul		x0y0, x1, @rp0+s0, y0, @rp3+s0
				eld			ma0, p, @rp0+d0, ma0				
				emul		x1y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0
				eld			@rp0+d0, x1				
				eld			x0, @rp0+s1, y0, @rp3+s0
				emad		ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
				emsb		ma0, x1y0
				eld			@rp0+d1, x0
				esub		ma0, p
				eld			@rp0+d1, ma0
				erpn		rp0, a

				esla		ma0
				dt			r6
				brfd		%b1
				eld			@rp2+d0, ma0				

				er			psh1
				er			opm				
				ret
.endif

.end
				

⌨️ 快捷键说明

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