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

📄 mpa_layer2mc.s

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

%1				eld			rp2, #lfe_fraction + 1
				ebk			#0000b

				eld			a, rpd1.mc_channel
				eld			b, rpd1.sblimit_mc
				ecld		r7, a
				ecld		r6, b
				ld			r10, r6
				ld			r13, r7					; r13 => mc channels
				add			r7, #STEREO
				ld			r11, r7					; r11 => total channels
				dec			r11
				ld			r0, #0x80				; high word of -1.0 
				ld			r8, #0					; granule count				
				eld			a, rpd1.alloc_tbl_ptr	; allocation table pointer
				eld			rpd1, a
				eld			rp0, #fraction+96+96

mc_gr_loop_start		
				eld			rp1, #bit_alloc+64
				eld			rp2, rpd1
				ld			r6, #0					; subband count
				ld			r7, #STEREO				; start_ch

lfe_sample		
				eld			a, layer_info+lfe_allocation
				ecp			a, #0
				ebrad		ec0, save_lfe_spl
				eld			d, #0
				eadd		a, #1
				jsr			getbits
save_lfe_spl	ebk			#0100b
				eld			@rp2+d0, d
				ebk			#0000b				

mc_sb_loop_start
; search the valid transmission channel
				ebk			#1011b
				ecld		a, r6
				eld			rp3, #sbgr_table
				erpn		rp3, a
				eld			b, @rp3					; the number of sbgr.
				eld			rp3, #dyn_cross_mode
				erpn		rp3, b
				eld			c, @rp3					; dyn_cross_mode[sbgr]
				eld			rp0, rp1				; tc_table pointer
				erpn		rp0, c
				ebk			#0000b
mc_ch_loop_start
				eld			a, @rp1+s0				; bit_alloc[sb][ch]
				ecp			a, #0
				ebra		ec0, mc_ch_not_transmitted
				cmp			eq, r9, #TRUE			; if (dyn_cross_on == 1)
				brf			mc_decode_sample
dyn_mode_transmitted_ch
				ebk			#0001b
				eld			d, @rp0+s0				; tc_table[dyn_cross_mode[sbgr]]
				ecp			d, #5
				ebra		ec1, mc_channel_copied
				ebk			#0000b
mc_decode_sample
				bsrd		MPG_II_decode_sample
				eld			mc0, rp2
				eld			rp2, mc0

mc_ch_loop_check
				cmp			eq, r7, r11
				brfd		mc_ch_loop_start
				inc			r7
			
mc_sb_loop_check
				inc			r6						; sb increase
				erpn		rp2, #16				
				cmp			gt,	r13, #1
				brfd		%f1						; T bit = !flag
				erps		rp0+s0
				ld			r7, r13
				sub			r7, #2
				bnzd		r7, $
				erps		rp0+s1
%1				cmp			ge, r6, r10
				brfd		mc_sb_loop_start
				ld			r7, #STEREO

rest_subband_sample
; remain subband samples are zero in each granule
				ld			r2, r10					; mc_sblimit
				ld			r3, r13					; mc_channel
				ecld		a, r2
				ld			r6, #SBLIMIT-1
				sub			r6, r10
				ld			r2, r6
				ld			r7, #PARTS
				mul			uu, r7, r3
				dec			r7
				eld			d, #0
%2				bnzd		r6, $
				eld			@rp0+d0, d				
				erpn		rp0, a
				bnzd		r7, %b2
				ld			r6, r2
								
mc_gr_loop_check
				ld			r2, #MAX_CHANNEL
				sub			r2, r13					; MAX_CHANNEL-mc_channel
				ld			r1, #PARTS*SBLIMIT
				mul			uu, r2, r1
				sub			r2, r10
				ecld		a, r2	
				erpn		rp0, a
				cmp			eq, r8, #GRANULES-1
				brfd		mc_gr_loop_start
				inc			r8				

				bra			mc_denormalize_sample


mc_ch_not_transmitted
				eld			@rp0+d1, a
				eld			@rp0+d1, a
				eld			@rp0+d1, a
				ebk			#0001b
				erps		rp0+s0
				brad		mc_ch_loop_check
				ebk			#0000b

mc_channel_copied
				ebk			#1000b
				eld			rp3, rp0
				ecp			d, #0
				ebra		ec0, copy_from_T0
				ecp			d, #1
				ebra		ec0, copy_from_T1
				ecp			d, #2
				ebra		ec0, copy_from_T2
				ecp			d, #3
				ebra		ec0, copy_from_T3
				; if index is 4 or 6
				bra			copy_from_T01
								
copy_from_T0	ld			r1, r7
				sub			r7, #1
				bnzd		r7, $
				erpd		rp3+d1
				brad		copy_sample
				ld			r7, r1

copy_from_T1	ld			r1, r7
				sub			r7, #2
				bnzd		r7, $
				erpd		rp3+d1
				brad		copy_sample
				ld			r7, r1

copy_from_T2	ld			r1, r7
				sub			r7, #3
				bnzd		r7, $
				erpd		rp3+d1
				brad		copy_sample
				ld			r7, r1
				
copy_from_T3	brad		copy_sample
				erpd		rp3+d1

copy_from_T01 	eld			b, layer_info+dyn_cross_bits
				ecld		r1, b

				eld			d, rp3
				ecld		b, r6
				eld			rp3, #sbgr_table
				erpn		rp3, b
				eld			b, @rp3					; the number of sbgr.
				eld			rp3, #dyn_cross_mode
				erpn		rp3, b
				eld			c, @rp3					; dyn_cross_mode[sbgr]
				eld			rp3, #tc_alloc
				erpn		rp3, b
				eld			si, @rp3					; tc_alloc[sbgr]
				ecld		r2, si
				eld			rp3, d

				cmp			eq, r1, #4
				brt			dyn_mode_4_bits
				cmp			eq, r1, #3
				brt			dyn_mode_3_bits
				cmp			eq, r1, #1
				brt			dyn_mode_1_bits
				cmp			eq, r1, #0
				brt			dyn_mode_0_bits
				
dyn_mode_4_bits
				cmp			eq, r2, #1
				brt			copy_from_T0
				cmp			eq, r2, #7
				brt			copy_from_T0
				cmp			eq, r2, #2
				brt			copy_from_T1
				cmp			eq, r2, #6
				brt			copy_from_T1
				eld			b, layer_info+dyn_cross_LR
				ecp			b, #1
				ebra		ec0, copy_from_T1
				bra			copy_from_T0
				
dyn_mode_3_bits
				eld			b, rpd0.surround
				ecld		r1, b
				
				ecp			c, #1
				ebra		ec0, _3bits_md1
				ecp			c, #2
				ebra		ec0, _3bits_md2
				ecp			c, #3
				ebra		ec0, _3bits_md3

_3bits_md1		
.ifdef _DEBUG_
				cmp			eq, r7, #3
/** debug **/	brf			$
.endif
				cmp			eq, r1, #STEREO_SURROUND
				brt			copy_from_T1
				cmp			eq, r2, #4
				brt			copy_from_T1
				cmp			eq, r2, #5
				brt			copy_from_T1
				cmp			eq, r2, #3
				brt			copy_from_T0
				eld			c, layer_info+dyn_cross_LR
				ecld		r1, c
				cmp			eq, r1, #1
				brt			copy_from_T1
				bra			copy_from_T0

_3bits_md2		
.ifdef _DEBUG_
				cmp			eq, r7, #2
/** debug **/	brf			$
.endif
				cmp			eq, r1, #STEREO_SURROUND
				brt			copy_from_T0
				cmp			eq, r2, #1
				brt			copy_from_T0
				cmp			eq, r2, #5
				brt			copy_from_T0
				cmp			eq, r2, #2
				brt			copy_from_T1
				eld			c, layer_info+dyn_cross_LR
				ecld		r1, c
				cmp			eq, r1, #0
				brt			copy_from_T0
				bra			copy_from_T1

_3bits_md3		cmp			eq, r7, #2
				brt			_3bits_md2
				cmp			eq, r7, #3
				brt			_3bits_md1

dyn_mode_1_bits
				cmp			eq, r7, #2
				brf			dyn_2nd_stereo
				ecp			c, #0
				ebra		ec0, transmitted_channel

_1bits_md1_tc0	cmp			eq, r2, #0
				brf			_1bits_md1_tc1
				eld			c, layer_info+dyn_cross_LR
				ecld		r1, c
				cmp			eq, r1, #1
				brt			copy_from_T1
				bra			copy_from_T0
_1bits_md1_tc1	cmp			eq, r2, #1
				brt			copy_from_T0
_1bits_md1_tc2	bra			copy_from_T1

dyn_2nd_stereo
				cmp			eq, r7, #3
				brt			transmitted_channel

				eld			d, rp2
				eld			rp2, #dyn_second_stereo
				erpn		rp2, b
				eld			c, @rp2
				eld			rp2, d
				ecld		r2, c
				cmp			eq, r2, #1
				brt			copy_from_T3
				bra			transmitted_channel				
				
dyn_mode_0_bits
				eld			c, rpd0.surround
				ecp			c, #SECOND_STEREO
				ebra		ec1, return_mc_ch_loop_check
				cmp			eq, r7, #2
				brt			transmitted_channel
				eld			d, rp2
				eld			rp2, #dyn_second_stereo
				erpn		rp2, b
				eld			c, @rp2
				eld			rp2, d
				ecld		r2, c
				cmp			eq, r2, #1
				brt			copy_from_T2
				bra			transmitted_channel				

transmitted_channel	
				brad		mc_decode_sample
				ebk			#0000b

copy_sample		
				eld			b, @rp3+s1				; PART 1
				eld			c, @rp3+s1				; PART 2
				eld			d, @rp3+s1				; PART 3
				eld			@rp0+d1, b
				eld			@rp0+d1, c
				eld			@rp0+d1, d
return_mc_ch_loop_check
				brad		mc_ch_loop_check
				ebk			#0000b



;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::                                                                ::;
;::                     Denormalize samples                        ::;
;::                                                                ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
mc_denormalize_sample
; multiply scalefactors
				eld			rpd1, #layer_info
				eld			a, rpd1.mpeg_version
				ecp			a, #_MPEG_2_AUG_AUDIO
				ebrad		ec0, end_of_mc_layer_II_decoding
				mRETURN		(_DECODE_OK)
				
				jsr			MC_II_denormalize_sample
				mRETURN		(_DECODE_OK)

end_of_mc_layer_II_decoding
				er			psh1
				er			usm
				er			xsd
				er			op
				er			opm
				pop			a14, a10
				ret


/********************************************************************
 					The end of MC_layer_II_decode
********************************************************************/



/************ Subroutines of MC_layer_II_decode part ***************/


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

 Function:		MC_II_dyncross_bitalloc

 Description:	Decode bit allocation of dynamic crosstalk mode.

 Arguments:		r0		- certer mode
 				r1		- surround mode
 				r5		- stereo
 				r8		- dyn_cross_bits value
 				r10		- sblimit value
 				r11		- mc channels
 				rp0		- bit_alloc[2][0] buffer pointer
 				rp1		- nbal_table pointer
 
				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0: 	 x		 1		 x		 x
				sd1: 	 x		 x		 0		 1
				sd2: 	 x		 x		 x		 0

				@bank1
						d1		d0		s1		s0
				---------------------------------------
				sd2: 	 x		 x	     2		 1

********************************************************************/
MC_II_dyncross_bitalloc:
				push		a14
				er			xsd
				ebk			#0100b
				eld			sd2, #0x0021
				eld			rp2, #bit_alloc
				ebk			#0000b
				eld			sd0, #0x0100
				eld			sd1, #0x0001
				eld			sd2, #0x0000

				eld			rp2, #dyn_cross_mode
				eld			mc0, rp2
				eld			rp2, #sbgr_table
				eld			mc1, rp2
				eld			a, rpd1.dyn_cross_bits
				ecld		r2, a
				ld			r7, #0
				
dyn_bitalloc_sb_loop_start
; search the valid sbgr & dyn_cross_mode[sbgr]
				eld			rp2, mc1					; sbgr_table
				ecld		a, r7
				erpn		rp2, a
				eld			b, @rp2						; sbgr No.
				eld			rp2, mc0					; dyn_cross_mode
				erpn		rp2, b 
				eld			c, @rp2						; dyn_cross_mode[sbgr]
				ecld		r3, c

				cmp			eq, r3, #0
				brt			__dyn_cross_mode_0__
				ebk			#0100b
				eld			y0, @rp2+s0					; T0: bit_alloc[0][sb]
				eld			y1, @rp2+s0					; T1: bit_alloc[1][sb]
				ebk			#0000b
				cmp			eq, r2, #4
				brt			__dyn_cross_bits_4__		; channel mode 3/2
				cmp			eq, r2, #3
				brt			__dyn_cross_bits_3__		; channel mode 3/1 and 2/2
				cmp			eq, r2, #1
				brt			__dyn_cross_bits_1__		; channel mode 3/0 and 2/1
.ifdef _DEBUG_
/** debug **/	bra			$
.endif
				
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;

⌨️ 快捷键说明

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