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

📄 mpa_layer2.s

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

.include	"mpa.h"
.include 	"mpa_reg.h"

.secFILE_mpa_layer2


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:::::::::::::::::::::::[  Layer II stuff  ]:::::::::::::::::::::::::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;

MPG_layer_II_decode::
				push		a10, a14

				eld			a, #3
				eld			rpd1.layer_I_frames, a


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::                                                                ::;
;::                    Decode bit allocations &                    ::;
;::               scalefactor selection information                ::;
;::                                                                ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;				index registers
;				@bank0
;						d1		d0		s1		s0
;				---------------------------------------
;				sd0: 	 x		 x		 0		 1
;				sd1: 	 x		 1		 x		 x
;
				er			xsd
				ebk			#0000b
				eld			sd0, #0x0001
				eld			sd1, #0x0100

				eld			rp0, #nbal_table
				eld			rp1, #bit_alloc				; L,R,L,R,L,R ...
				eld			a, rpd1.tbl_num				; select nbal table
				ecp			a, #1						; table number 0/1 or 2/3
				ebra		ec2, 4
				erpn		rp0, #9						; alloc_tbl 2,3 start offset

II_decode_bitalloc
				eld			a, rpd1.jsbound
				eld			b, rpd1.stereo
				ecld		r6, a
				ecld		r7, b
				dec			r6							; bound
				dec			r7							; nch
				ld			r1, r7

%0				eld			a, @rp0+s1
				jsr			getbits
				bnzd		r7,	%b0
				eld			@rp1+d0, d
				erps		rp0+s0
				bnzd		r6,	%b0
				ld			r7, r1

				eld			a, rpd1.jsbound
				eld			b, rpd1.sblimit
				ecld		r2, a						; jsbound
				ecld		r3, b						; sblimit

%1				cmp			ge, r2, r3
				brt			II_decode_scfsi
				eld			a, @rp0+s0
				jsr			getbits
				eld			@rp1+d0, d
				eld			@rp1+d0, d
				brad		%b1
				inc			r2

II_decode_scfsi
				eld			rp0, #bit_alloc
				eld			rp1, #scfsi
				inc			r1
				mul			uu, r3, r1					; sblimit x nch
				dec			r3
				ld			r6, r3

%2				eld			a, @rp0+s0
				ecp			a, #0
				ebrad		ec0, %f3
				eld			d, #4						; default 4
				eld			a, #2
				jsr			getbits
%3				bnzd		r6, %b2
				eld			@rp1+d0, d


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::                                                                ::;
;::                          CRC check                             ::;
;::                                                                ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
II_check_CRC_word
				eld			a, rpd0.protection_bit
				ecp			a, #ERROR_PROTECT_NONE
				ebra		ec0, II_decode_scalefactor

				jsr			MPG_II_CRC_calc
				eld			a, rpd0.crc_val
				ecp			a, c
				ebra		ec0, II_decode_scalefactor
.ifdef _DEBUG_
/** debug **/	bra			$
.endif
				eld			b, rpd1.error_count
				eadd		b, #1
				eld			rpd1.error_count, b

				jsr			recover_CRC_error
				brad		end_of_layer_II_decoding
				mRETURN		(_BASE_CRC_ERROR)



;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::                                                                ::;
;::                      Decode scalefactors                       ::;
;::                                                                ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;				index registers @bank0
;
;						d1		d0		s1		s0
;				---------------------------------------
;				sd0: 	 x		 x		 x		 1
;				sd1: 	 x		 x		 x		 1
;				sd2: 	 x		 1		 x		 x
;
II_decode_scalefactor
				er			xsd
				ebk			#0000b
				eld			sd0, #0x0001
				eld			sd1, #0x0001
				eld			sd2, #0x0100

				eld			rp0, #bit_alloc
				eld			rp1, #scfsi
				eld			rp2, #scale_index
				ld			r6, r3

decode_scalefactor
				eld			a, @rp0+s0						; bit_alloc[sb][ch]
				ecp			a, #0
				ebra		ec0, default_scalefactor

				eld			a, #6
				jsr			getbits
				eld			@rp2+d0, d						; scale_index[sb][ch][0]

				eld			b, @rp1+s0						; scfsi[sb][ch]
				ecp			b, #2
				ebrad		ec0, scale_one
				ecld		r3, b
				ecp			b, #0
				ebra		ec0, scale_all
				brad		scale_1_3
				ecld		r4, d

scale_one		brad		%f1
				eld			@rp2+d0, d

scale_all		eld			a, #6
				jsr			getbits
				eld			@rp2+d0, d
scale_1_3
scale_1_2		eld			a, #6
				jsr			getbits
				sr			r3
				brf			%f1
				sr			r3
				brf			%f0
				brad		%f1
				eld			@rp2+d0, d 	; scale_index[sb][ch][1] = scale_index[sb][ch][2]
%0				ecld		c, r4 		; scale_index[sb][ch][1] = scale_index[sb][ch][0]
				eld			@rp2+d0, c
%1				bnzd		r6, decode_scalefactor
				eld			@rp2+d0, d 				 		; scale_index[sb][ch][2]
				bra			II_decode_subband_sample
				
default_scalefactor
				erps		rp1+s0
				eld			d, #SCALE_RANGE-1
				eld			@rp2+d0, d
				brad		%b1
				eld			@rp2+d0, d



;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::                                                                ::;
;::                         Decode samples                         ::;
;::                                                                ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; fraction buffer structure
;	gr0 	ch0   0x2000	:<---  96  --->:
;			ch1   0x2060	:<---  96  --->:
;
;				index registers
;				@bank0
;						d1		d0		s1		s0
;				---------------------------------------
;				sd0:   +32		 1	   -96     -95
;				sd1: 	 x		 x		 x		 1
;				sd2: 	 x		 x		 0		 x
;
;				@bank1 (dequantize process)
;						d1		d0		s1		s0
;				---------------------------------------
;				sd3: 	 x		 x		 0		17
;
II_decode_subband_sample
				es			psh1
				es			usm
				es			op
				es			opm

				ebk			#1000b
				er			xsd
				eld			sd3, #0x0001
				es			xsd
				eld			sd3, #0x0001

				ebk			#0000b
				er			xsd
				eld			sd0, #0x0101
				es			xsd
				eld			sd0, #0x20aa
				eld			sd1, #0x0001
				eld			sd2, #0x0000

				eld			a, rpd1.jsbound
				eld			b, rpd1.stereo
				eld			c, rpd1.sblimit
				ecld		r6, a
				ecld		r7, b
				ecld		r4, c
				ld			r10, r6
				ld			r11, r7
				ld			r5, r7
				dec			r5
				ld			r8, #0						; granule count
				ld			r0, #0x80					; high word of -1.0
				eld			a, rpd1.alloc_tbl_ptr		; allocation table pointer
				eld			rpd1, a
				eld			rp0, #fraction

gr_loop_start
				eld			rp1, #bit_alloc
				eld			rp2, rpd1					; allocation_table# ptr
				ld			r6, #0						; jsbound
				ld			r7, #0						; nch
				ld			a13, #ch_loop_check

sb_loop_start
ch_loop_start
				eld			a, @rp1+s0					; bit_alloc[sb][ch]
				ecp			a, #0
				ebra		ec0, sample_not_transfered
				bsrd		MPG_II_decode_sample
				eld			mc0, rp2
				eld			rp2, mc0

ch_loop_check
				inc			r7
				cmp			ge, r7, r11
				brf			ch_loop_start

				erpn		rp2, #16
				erps		rp0+s0
				tst			r5, r5						; if T=1, mono
				brt			2
				erps		rp0+s1
sb_loop_check
				inc			r6
				cmp			ge, r6, r10
				brfd		sb_loop_start
				ld			r7, #0

; if joint stereo mode
				cmp			ge, r10, r4					; if (sblimit > jsbound)
				brt			rest_subband_sample
				ld			r9, r10
				ld			a13, #js_sample_none
				esd0		s1, #0x2
				esd1		s0, #2
				eld			a, @rp1+s0					; bit_alloc[sb][ch]
js_loop_start
				ecp			a, #0
				ebra		ec0, sample_not_transfered
				bsrd		MPG_II_decode_sample
				eld			mc0, rp2
				eld			rp2, mc0
				erpn		rp0, #-96
				eld			a, @rp0+s1
				eld			b, @rp0+s1
				eld			c, @rp0+s1
				eld			@rp0+d1, a
				eld			@rp0+d1, b
				brad		js_loop_check
				eld			@rp0+d1, c
js_sample_none
				eld			@rp0+d1, a
				eld			@rp0+d1, a
				eld			@rp0+d1, a
js_loop_check
				erpn		rp2, #16
				erpn		rp0, #-(0xc0-1)
				inc			r10
				cmp			ge, r10, r4
				brfd		js_loop_start
				eld			a, @rp1+s0					; bit_alloc[sb][ch]
				esd0		s1, #0xa
				esd1		s0, #1
				brad		rest_subband_sample
				ld			r10, r9

sample_not_transfered
				eld			@rp0+d1, a
				eld			@rp0+d1, a
				eld			@rp0+d1, a
				jmp			a13

rest_subband_sample
; remain subband samples are zero
				ld			r1, r11						; stereo
				ld			r2, r4						; sblimit
				ecld		a, r2
				ld			r6, #SBLIMIT-1
				sub			r6, r2
				ld			r2, r6
				ld			r7, #PARTS
				mul			uu, r7, r1
				dec			r7
				eld			d, #0
%0				bnzd		r6, $
				eld			@rp0+d0, d
				erpn		rp0, a
				bnzd		r7, %b0
				ld			r6, r2

gr_loop_check
				ld			r2, #MAX_CHANNEL
				sub			r2, r11
				ld			r1, #PARTS*SBLIMIT
				mul			uu, r2, r1
				sub			r2, r4
				ecld		a, r2
				erpn		rp0, a
				cmp			eq, r8, #GRANULES-1
				brfd		gr_loop_start
				inc			r8


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::                                                                ::;
;::                     Denormalize samples                        ::;
;::                                                                ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; multiply scalefactors
denormalize_sample
				eld			rpd1, #layer_info
				eld			a, rpd1.mpeg_version
				ecp			a, #_MPEG_1_AUDIO
				ebrad		ec1, end_of_layer_II_decoding
				mRETURN		(_DECODE_OK)

				jsr			MPG_II_denormalize_sample
				mRETURN		(_DECODE_OK)

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


/********************************************************************
 					END of MPG_layer_II_decode
********************************************************************/



/************ Subroutines of MPG_layer_II_decode part **************/


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

 Function:		MPG_II_decode_sample

 Description:	Decode subband sample code from bit stream and
 				degouping. When bit allocation is 3, 5 and 9, grouped
				sample. Lookup table at code memory by "ldc" must be
				under 64KB boundary.

 				1. Decode sample
 					-. Grouped sample: Used table method.

						for (i=0; i<3; i++) {
							s[i] = c % nlevels
							c = c / nlevels
						}

					-. Ungrouped sample:

						for (i=0; i<3; i++) {
							s[i] = getbits(bits)
						}

				2. Dequantize sample
   					Restore the compressed sample to a factional number.
   					first complement the MSB of the sample

   				   	for Layer II :
   						Use the formula s" = C * (s"' + D)

				   	where C and D at Table B.4 Layer II classes of
				   	quantization.

 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		 0		17

********************************************************************/
MPG_II_decode_sample::
				push		a14
				erpn		rp2, a
				eld			c, @rp2						; index 0 ... 16
				eld			rp2, #bits_table
				erpn		rp2, c
				ecld		r2, c						; if mode 1, enable
				eld			b, @rp2+s1					; bits
				eld			rp2, #II_MSB_position
				erpn		rp2, c
				eld			a, b
;				jsr			getbits
				GETBITS

				cmp			gt, r2, #1
				brf			grouped_sample
				cmp			eq, r2, #3
				brt			grouped_sample

ungrouped_sample
				ecld		r1, d
				eld			a, b
;				jsr			getbits
				GETBITS
				ecld		r2, d
				eld			a, b
;				jsr			getbits
				GETBITS
				ecld		r3, d

				ebk			#1000b
				eld			c, sr
				ecld		b, r1
				mDEQUANT_SAMPLE
				ecld		b, r2
				mDEQUANT_SAMPLE
				ecld		b, r3
				mDEQUANT_SAMPLE
				eld			sr, c
				ebk			#0000b
				pop			a14
				ret

grouped_sample	; bit allocation is 3, 5, 9 (index 0,1,3)
				ebk			#1000b
				eld			b, d
				eld			d, sr
				eld			rp3, #separate_codes		; separate_code table
				erpn		rp3, c
				eld			a, @rp3+s1
				eld			rp3, a
				esra		b
				erpn		rp3, b						; nlevels value
				etst		nc, ec3
				brad		ec3, %f1
				eld			sr, @rp3+s1					; code
				eld			a, #12						; lower code
				esft		sr, a
%1				eld			b, #4
				esft		sr, b
				eld			si, sr
				eld			b, sg
				mDEQUANT_SAMPLE
				eld			b, #4
				esft		si, b
				eld			si, sr
				eld			b, sg
				mDEQUANT_SAMPLE
				eld			b, #4
				esft		si, b
				eld			si, sr
				eld			b, sg
				mDEQUANT_SAMPLE
				eld			sr, d
				ebk			#0000b
				pop			a14
				ret



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

 Function:		MPG_II_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: 	 x		32	   -64		32
				sd1: 	 x		 x		 x		 3
				sd3: 	 x		 x		 x		 0

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

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

				eld			a, rpd1.sblimit
				eld			b, rpd1.stereo
				ecld		r6, a					; sblimit
				ecld		r7, b					; channels
				dec			r6
				dec			r7
				ld			r2, r6
				ld			r3, r7
				ld			r8, #0

				eld			rp0, #fraction
				eld			c, #scalefactor
				eld			d, #MAX_CHANNEL*PARTS*SBLIMIT
				esub		d, a
				eld			b, #-(PARTS*SBLIMIT*STEREO-1)
				cmp			eq, r3, #STEREO-1
				brt			denorm_gr_loop_start
				eld			b, #-(PARTS*SBLIMIT*MONO-1)

denorm_gr_loop_start
				ld			r1, r8					; No. granule
				sr			r1
				sr			r1
				ecld		a, r1
				eld			rp1, #scale_index
				erpn		rp1, a
denorm_sb_loop_start
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
;				esla		ma0
;				esla		ma1
				eld					@rp0+d0, ma0
				eld			ma0, p, @rp0+d0, ma1
;				esla		ma0
				bnzd		r7, denorm_ch_loop_start
				eld			        @rp0+d0, ma0
				erpn		rp0, b
				bnzd		r6, denorm_sb_loop_start
				ld			r7, r3
denorm_gr_loop_check
				erpn		rp0, d
				inc			r8
				cmp			eq, r8, #GRANULES
				brfd		denorm_gr_loop_start
				ld			r6, r2
				ebk			#0000b
				ret


.end

⌨️ 快捷键说明

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