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

📄 mpa_layer1.s

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

%1				eld			a, @rp1+s1
				ecp			a, #0
				ebra		ec2, %f2
				eld			a, @rp2+s1
				ecp			a, #0
				ebra		ec2, %f2
				eld			a, @rp3+s1
				ecp			a, #0
				ebra		ec2, %f2
				eld			a, #0
%2				erps		rp1+s0
				erps		rp2+s0
				erps		rp3+s0
				bnzd		r6, %b1
				eld			@rp0+d0, a
				esec2		#ECP_LE

; initialize mc bs buffer
				eld			sr, #0		/* bs_buffer */
				eld			sa, #0		/* bit_count */
				esd3		s0, #0
				eld			rp3, #SBF0_PTR
				ld			a8, #SFR_BASE
;				ld			a9, #BS_MULTICHANNEL-SB0_BASE
;				ldw			@[a8+rSBL0OFF], a9
				ld			a9, #_buffer_ptr
				ldw			r1, @[a9+_BS_MULTICHANNEL+0]
				ldw			r0, @[a9+_BS_MULTICHANNEL+2]
				sub			r1, #^SB0_BASE	;0x24
				ldw			@[a8+rSBL0OFF+0], r1
				ldw			@[a8+rSBL0OFF+2], r0

				ld			r1, #SB0_RD					/* fill command */
				ldw			@[a8+rSBFCON], r1				
				brad		end_of_layer_I_decoding
				mRETURN		(_DECODE_OK)
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */

; multiply scalefactors
I_denormalize_sample
				jsr			MPG_I_denormalize_sample
				brad		end_of_layer_I_decoding
				mRETURN		(_DECODE_OK)

end_of_layer_I_decoding
				pop			a14
				ret



.if( _DECODER_TYPE != MPEG_1_AUDIO )
/********************************************************************

 Function:		I_paste_stream

 Description:

 Arguments:		r1: Total bits of current main frame excluded 
 					continuous bit.

********************************************************************/
I_paste_stream:
; mask remain bits of the last byte mc bit stream and fill bits
				push		a14
				eld			c, bs_status+I_mc_totbits
				eld			a, c
				eld			b, #BITS_PER_WORD
				mDIVIDE		a, b
				esla		a
				ecld		r2, a				; position of last byte
				ecld		r3, b				; remain bits of the last byte
;				ld			a12, #BS_MULTICHANNEL
				ld			a12, #_buffer_ptr
				ldw			a12, @[a12+_BS_MULTICHANNEL]
				add			a12, r2
				ldw			r4, @[a12]
				ld			r5, #0xffff
%0				cmp			eq, r3, #0
				brt			%f1
				sr			r5
				brad		%b0
				dec			r3
%1				com			r5
				and			r4, r5

; paste ext bitstream to mc stream
				esub		b, #BITS_PER_WORD
				eneg		b
				eadd		c, b
				ecld		r5, b
				sub			r1, r5
				eld			a, b
				jsr			getbits
				ecld		r5, d
				or			r4, r5
				ldw			@[a12], r4
				add			a12, #2
%2				cmp			gt, r1, #BITS_PER_WORD-1
				brf			%f3
				eld			a, #BITS_PER_WORD
				eadd		c, a
				jsr			getbits
				ecld		r4, d
				ldw			@[a12], r4
				add			a12, #2
				brad		%b2
				sub			r1, #BITS_PER_WORD
%3				ecld		a, r1
				eadd		c, a
				jsr			getbits
				ecld		r4, d
				ld			r6, #BITS_PER_WORD
				sub			r6, r1
				cmp			eq, r6, #0
				brt			%f4
				dec			r6
				bnzd		r6, $
				sl			r4
%4				ldw			@[a12], r4
				eld			bs_status+I_mc_totbits, c
				pop			a14
				ret


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

 Function:		I_EXT_seek_sync_ext

 Description:	seek syncword of base bit stream.

********************************************************************/
I_EXT_seek_sync_ext::
				push		a14
				ldw			a11, @[a10+_ExtInputBufferOffset]
				ld			r0, e11
				add			r0, #^SB0_BASE
				ld			e11, r0
;				ld			a14, #EXT_BUF_LIMIT
				ld			a14, #_buffer_ptr
				ldw			a14, @[a14+_EXT_BUF_LIMIT]

; search mpg-1 sync word
_1_byte_ext		ldb			r0, @[a11]
				add			a11, #1
				cmp			eq, a11, a14
				brf			_2_byte_ext
;				ld			a11, #EXT_BUF_BASE
				ld			a11, #_buffer_ptr
				ldw			a11, @[a11+_EXT_BUF_BASE]

_2_byte_ext		ldb			r1, @[a11]
				add			a11, #1
				cmp			eq, a11, a14
				brf			check_ext_sync
;				ld			a11, #EXT_BUF_BASE
				ld			a11, #_buffer_ptr
				ldw			a11, @[a11+_EXT_BUF_BASE]

check_ext_sync
				slb			r0
				or			r0, r1
				and			r0, #0x7ff0
				cmp			eq, r0, #EXT_SYNC_WORD<<4
				brfd		I_end_seek_sync_ext
				mRETURN		(_EXT_SYNC_NOT_FOUND)

_3_byte_ext		ldb			r2, @[a11]
				add			a11, #1
				cmp			eq, a11, a14
				brf			_4_byte_ext
;				ld			a11, #EXT_BUF_BASE
				ld			a11, #_buffer_ptr
				ldw			a11, @[a11+_EXT_BUF_BASE]

_4_byte_ext		ldb			r3, @[a11]
				add			a11, #1
				cmp			eq, a11, a14
				brf			get_ext_crc
;				ld			a11, #EXT_BUF_BASE
				ld			a11, #_buffer_ptr
				ldw			a11, @[a11+_EXT_BUF_BASE]

get_ext_crc				
				slb			r1
				or			r1, r2
				sl			r1
				sl			r1
				sl			r1
				sl			r1
				ld			r6, r3
				sr			r3
				sr			r3
				sr			r3
				sr			r3
				or			r1, r3
				ecld		a, r1
				eld			rpd0.ext_crc_val, a				
				
_5_byte_ext		ldb			r1, @[a11]
				add			a11, #1
				cmp			eq, a11, a14
				brf			I_get_ext_length
;				ld			a11, #EXT_BUF_BASE
				ld			a11, #_buffer_ptr
				ldw			a11, @[a11+_EXT_BUF_BASE]

I_get_ext_length
				ld			r2, #0
				slb			r6
				or			r6, r1
				sr			r6
				incc		r2
				and			r6, #0x7ff
				ecld		a, r6
				ecld		b, r2
				eld			rpd0.ext_length, a
				eld			rpd0.ext_ID, b

; copy extension stream to BS_EXTENSION
				ecld		r7, a
				cmpu		gt, r7, #EXT_HEADER_SIZE
				brfd		I_end_seek_sync_ext
				mRETURN		(_DECODE_OK)

;				ld			a12, #BS_EXTENSION
				ld			a12, #_buffer_ptr
				ldw			a12, @[a12+_BS_EXTENSION]
				sub			r7, #EXT_HEADER_SIZE+1
%4				ldb			r0, @[a11]
				add			a11, #1
				ldb			@[a12], r0
				cmp			eq, a11, a14
				brf			%f5
;				ld			a11, #EXT_BUF_BASE
				ld			a11, #_buffer_ptr
				ldw			a11, @[a11+_EXT_BUF_BASE]

%5				bnzd		r7, %b4
				add			a12, #1

; mandatory extension CRC check
				eld			a, rpd1.mandatory_crc_check
				ecp			a, #TRUE
				ebra		ec1, I_end_seek_sync_ext
				
;				ld			a12, #BS_EXTENSION
				ld			a12, #_buffer_ptr
				ldw			a12, @[a12+_BS_EXTENSION]

				jsr			MC_EXT_error_check
				eld			a, rpd0.ext_crc_val
				ecp			c, a
				ebra		ec1, error_crc_ext

				mRETURN		(_DECODE_OK)
I_end_seek_sync_ext
				ld			r0, e11
				sub			r0, #^SB0_BASE	;#0x24
				ld			e11, r0
				ldw			@[a10+_ExtInputBufferOffset], a11
				pop			a14
				ret

;========================================================================; 
error_crc_ext:
.ifdef _DEBUG_
/** debug **/	bra			$
.endif
				eld			b, rpd1.error_count
				eadd		b, #1
				eld			rpd1.error_count, b
				brad		I_end_seek_sync_ext
				mRETURN		(_EXT_CRC_ERROR)
				
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */

/********************************************************************
 					END of MPG_layer_I_decode
********************************************************************/




/************ Subroutines of MPG_layer_I_decode part ***************/

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

 Function:		MPG_I_decode_sample

 Description:	Decode subband sample code from bit stream and degouping.

 				1. Decode sample

					bits = bit_alloc[sb][ch]
					sample = getbits(bits+1)

				2. Dequantize sample
   					The requantized value can be obtained by applying a
   					linear formula.

   				   	for Layer I :

   						        2^nb
   						s' = ------------ * (s" + 2^(-nb+1))
   						      2^nb - 1

				   	where s" is fractional number, s' is requantized
				   	value and nb is the number of bitalloc.

 Arguments:		rp0		sample buffer (fraction) pointer.
 				rp2		allocation table pointer of current sb.
 				a		bit_alloc[sb][ch]

				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0: 	32		 x		 x		 x
				sd2: 	 x		 x		 0		 x

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

********************************************************************/
MPG_I_decode_sample:
				push		a14
				ecld		r1, a
				jsr			getbits
				eld			b, d
;				mGETBITS

; invert most significant bit, extend sign, dequantize sample
; then scale to fixed format.
				ebk			#1000b
				eld			c, sr
				ecld		a, r1						; index
				eld			rp3, #I_MSB_position
				erpn		rp3, a
				eld			a, @rp3+s0
				esft		b, a						; b: 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
				eld			ma0, @rp3+s0				; I_dequant_coeff_1
				eadd		b, ma0, y1, @rp3+s0			; I_dequant_coeff_2
				eld			x0, b
				emul		x0y1
; 2002.09.26, move to upper loop for empty delay slot
;				eld			@rp0+d1, p					; dequantized sample[part]
				eld			sr, c
				ebk			#0000b
				pop			a14
				ret



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

 Function:		MPG_I_denormalize_sample

 Description:	Denormalize sample.
				The requantized values have to be rescaled.
				The multiplication factors in Table B.1 "Layer I,II
				scalefactors", ISO/IEC 11172-3: 1993

 				Next the dequantized values have to be rescaled

						s' = scalefactor * s"

				where s' is denormalized sample, s" is dequantized
				sample value.

 Arguments:		- rp0		fraction buffer pointer.
 				- rp1		scale_index buffer pointer.
 				- rp3		scalefactor table pointer

 NOTE!
	x0 (fraction -1 ~ 1, 1.23 integer format) is signed and
 	y1 (scalefactor 0 ~ 1, 0.24 integer format) is unsigned number.

 	xsd, psh1, usm flags must be set to 1.

				index registers:
				@bank1
						d1		d0		s1		s0
				---------------------------------------
				sd0:   -95		32	   -64		32
				sd1: 	 x		 x		 x		 3
				sd3: 	 x		 x		 x		 0

********************************************************************/
MPG_I_denormalize_sample:
				es			psh1
				er			usm
				es			opm

				ebk			#1011b
				er			xsd
				eld			sd0, #0x1000
				eld			sd3, #0x0000
				es			xsd
				eld			sd0, #0xa2c2
				eld			sd3, #0x0000
				eld			sd1, #0x0003

				eld			rpd1, #layer_info
				eld			a, rpd1.layer_I_frames
				esla		a
				esla		a
				ecld		r5, a

				eld			rp0, #fraction
				ld			r6, #SBLIMIT-1
				ld			r2, r6
				ld			r8, #0

				eld			b, rpd1.stereo
				ecld		r0, b
				eld			c, #scalefactor
				eld			d, #(MAX_CHANNEL*PARTS-1)*SBLIMIT
				eld			b, #-PARTS*SBLIMIT
				cmp			eq, r0, #STEREO
				brt			I_denorm_gr_loop_start
				eld			b, #0

I_denorm_gr_loop_start
				eld			rp1, #scale_index
I_denorm_sb_loop_start
				ld			r7, r0					; channels
				dec			r7
I_denorm_ch_loop_start
				eld			rp3, c
				eld			a, @rp1+s0				; scale_index[sb][ch][part]
				erpn		rp3, a
				eld			x0, @rp0+s0, y1, @rp3
				emul		x0y1, x0, @rp0+s0
				emld		ma0, x0y1, x0, @rp0+s1
				emld		ma1, x0y1
				eld			           @rp0+d0, ma0
				eld			ma0, p,    @rp0+d0, ma1
				bnzd		r7, I_denorm_ch_loop_start
				eld			           @rp0+d0, ma0

				erpd		rp0+d1
				bnzd		r6, I_denorm_sb_loop_start
				erpn		rp0, b

I_denorm_gr_loop_check
				erpn		rp0, d
				inc			r8
				cmp			eq, r8, r5	;#GRANULES
				brfd		I_denorm_gr_loop_start
				ld			r6, r2
				ebk			#0000b
				ret
.end

⌨️ 快捷键说明

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