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

📄 mpa_layer1.s

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

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

.secFILE_mpa_layer1


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::::::::::::::::::::::::[  Layer I stuff  ]:::::::::::::::::::::::::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;

MPG_layer_I_decode::
				push		a14
				eld			a, rpd1.mpeg_version
				ecp			a, #_MPEG_1_AUDIO
				ebrad		ec0, main_frames
				eld			a, #1
				eld			a, #3
main_frames		eld			rpd1.layer_I_frames, a

				eld			a, #0
				eld			rpd1.layer_I_parts, a

				eld			bs_status+I_mc_totbits, a
				eld			bs_status+I_frame_size, a

				eld			rpd1, #backup_register
				eld			rp1, #fraction
				eld			rpd1.area_backup, rp1

part_loop_start
				eld			rpd1, #layer_info

; mpeg-2 layer I stream is repeated 3 times by mpeg-1 layer I frame
; search sync word, header parsing in 2'nd audio data
				eld			a, rpd1.layer_I_parts
				ecp			a, #0
				ebra		ec0, I_decode_bitalloc
				
.if( _DEBUG_BITS == TRUE )
				ld			a11, #_bit_pos
				ld			r0, #0
				ldw			@[a11], r0
.endif
				jsr			MPG_seek_sync_base
				cmp			eq, r2, #_DECODE_OK
				brf 		end_of_layer_I_decoding
				
; header parsing
				jsr			MPG_parse_base_header

; check main audio data is present or not
				eld			a, rpd1.frame_size
				ecld		r0, a
				cmp			gt, r0, #BASE_HEADER_SIZE
				brfd		end_of_layer_I_decoding
				mRETURN		(_NO_MAIN_AUDIO_DATA)

; check protection and get CRC value if protection enable
				eld			a, rpd0.protection_bit
				ecp			a, #ERROR_PROTECT_NONE
				ebrad		ec0, %f1
				eld			d, #-1
				eld			a, #CRC_WORD_LENGTH
				jsr			getbits
%1				eld			rpd0.crc_val, d


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::                                                                ::;
;::           Decode bit allocations & scalefactor                 ::;
;::                                                                ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;				index registers
;				@bank0
;						d1		d0		s1		s0
;				---------------------------------------
;				sd0: 	64		 1		 0		 1
;				sd1: 	 3		 1		 x		 x
;
I_decode_bitalloc
				ebk			#0000b
				er			xsd
				eld			sd0, #0x0101
				eld			sd1, #0x3100
				es			xsd
				eld			sd0, #0x4000

				eld			a, rpd1.layer_I_parts
				eld			rp0, #bit_alloc				; part 'n' bit allocation
				ecp			a, #0
				ebra		ec0, %f1
				ecld		r7, a
				dec			r7
				bnzd		r7, $
				erpd		rp0+d1
%1
				ebk			#0010b						; for MPG_I_CRC_calc
				eld			rp1, rp0
				ebk			#0000b

				eld			a, rpd1.jsbound
				eld			b, rpd1.stereo
				ecld		r6, a
				ecld		r7, b
				ld			r11, #SBLIMIT
				ld			r12, r6						; jsbound
				ld			r13, r7						; stereo
				mul			uu, r6, r7
				dec			r6
%1				eld			a, #4
				jsr			getbits
				bnzd		r6,	%b1
				eld			@rp0+d0, d

				ld			r2, r12						; jsbound
				ld			r3, r11						; sblimit
				dec			r7
				ld			r1, r7
%2				cmp			ge, r2, r3
				brt			I_decode_scalefactor
				eld			a, #4
				jsr			getbits
				bnzd		r7, $
				eld			@rp0+d0, d
				inc			r2
				brad		%b2
				ld			r7, r1

I_decode_scalefactor
				eld			a, rpd1.layer_I_parts
				eld			rp0, #bit_alloc				; part 'n' bit allocation
				eld			rp1, #scale_index
				ecp			a, #0
				ebra		ec0, %f1
				ecld		r7, a
				dec			r7
				erpd		rp0+d1
				bnzd		r7, $-2
				erpd		rp1+d0
%1
				ld			r7, r13
				ld			r6, #SBLIMIT
				mul			uu, r6, r7
				dec			r6
				eld			p, #SCALE_RANGE-1
%2				eld			b, @rp0+s0
				eld			d, p
				ecp			b, #0
				ebra		ec0, %f3
				eld			a, #6
				jsr			getbits
%3				bnzd		r6, %b2
				eld			@rp1+d1, d

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::                                                                ::;
;::                          CRC check                             ::;
;::                                                                ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
I_check_CRC_word
				eld			a, rpd0.protection_bit
				ecp			a, #ERROR_PROTECT_NONE
				ebra		ec0, I_decode_subband_sample

				jsr			MPG_I_CRC_calc
				eld			a, rpd0.crc_val
				ecp			a, c
				ebra		ec0, I_decode_subband_sample
.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_I_decoding				
				mRETURN		(_BASE_CRC_ERROR)


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::                                                                ::;
;::                         Decode samples                         ::;
;::                                                                ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; fraction buffer structure
;	gr0 	ch0   0x2000	:<---  96  --->:
;			ch1   0x2060	:<---  96  --->:
;
;				index registers
;				@bank0
;						d1		d0		s1		s0
;				---------------------------------------
;				sd0:    96(64)	 1	   -96     -95
;				sd1: 	 x		 x		 x		 1
;
;				@bank1 (dequantize process)
;						d1		d0		s1		s0
;				---------------------------------------
;				sd3: 	 x		 x		 x		16
;
; decode sample and requantize
;
I_decode_subband_sample
				es			psh1
				es			usm
				es			op
				es			opm

				ebk			#1000b
				er			xsd
				eld			sd3, #0x0000
				es			xsd
				eld			sd3, #0x0001
				ebk			#0000b
				er			xsd
				eld			sd0, #0x0101
				es			xsd
				eld			sd0, #0x40aa
				eld			sd1, #0x0001

				eld			a, rpd1.layer_I_parts
				eld			rp0, #bit_alloc				; part 'n' bit allocation
				ecp			a, #0
				ebra		ec0, %f1
				ecld		r7, a
				dec			r7
				bnzd		r7, $
				erpd		rp0+d1
%1				eld			rp2, rp0

				eld			a, rpd1.jsbound
				eld			b, rpd1.stereo
				ecld		r4, a
				ecld		r5, b
				dec			r4
				dec			r5
				ld			r6, r4						; jsbound
				ld			r7, r5						; stereo
				ld			r3, #PARTS					; fraction buffer control

				eld			rpd1, #backup_register
				eld			rp1, rpd1.area_backup
				eld			rp0, rp1					; fraction
				esd0		d1, #6
				ld			r0, #0x80					; high word of -1.0
				ld			r8, #GRANULES				; granule loop count

granule_loop_start
				eld			rp1, rp2

sbband_loop_start
channel_loop_start
				eld			a, @rp1+s0
				ecp			a, #0
				ebrad		ec0, channel_loop_check	;smpl_not_transfered
				eld			p, a
				bsrd		MPG_I_decode_sample
				eadd		a, #1

channel_loop_check
				bnzd		r7, channel_loop_start
				eld			@rp0+d1, p					; dequantized sample[part]

				erps		rp0+s0
				tst			r5, r5						; if T=1, mono
				brt			2
				erps		rp0+s1

sbband_loop_check
				bnzd		r6, sbband_loop_start
				ld			r7, r5

; if joint stereo mode (jsbound < 32)
				cmp			ge, r12, #SBLIMIT
				brt			fraction_buffer_control
				ld			r9, r12
				esd0		s1, #6
				esd1		s0, #2
I_js_loop_start
				eld			a, @rp1+s0					; bit_alloc[sb][ch]
				ecp			a, #0
				ebrad		ec0, I_js_loop_check
				eld			p, a
				bsrd		MPG_I_decode_sample
				eadd		a, #1
I_js_loop_check
				eld			@rp0+d1, p					; dequantized sample[part]
				eld			@rp0+d1, p
				erpn		rp0, #-(0xc0-1)
				cmp			ge, r12, #SBLIMIT-1
				brfd		I_js_loop_start
				inc			r12
				esd0		s1, #0xa
				esd1		s0, #1
				ld			r12, r9

fraction_buffer_control
				dt			r3
				brf			granule_loop_check
				erpn		rp0, #(MAX_CHANNEL-1)*96
				ld			r3, #PARTS

granule_loop_check
				dt			r8
				brfd		granule_loop_start
				ld			r6, r4

				er			xsd
				er			psh1

; code for MPEG-2
				eld			rp1, rp0					; fraction
				eld			rpd1.area_backup, rp1

; if mpeg-2, parsing mc header
				eld			a, layer_info+mpeg_version
				ecld		r0, a
				cmp			eq, r0, #_MPEG_1_AUDIO
				brt			I_denormalize_sample


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;::::::::::::::::::::[  MPEG 2 part decoding  ]::::::::::::::::::::::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
.if( _DECODER_TYPE != MPEG_1_AUDIO )
I_mpeg2_mc_part
				er			xsd
				er			psh1
				er			usm
				er			op
				er			opm

				eld			rpd1, #layer_info
				eld			a, rpd1.layer_I_parts
				eadd		a, #1
				ecp			a, #1
				ebrad		ec1, I_mc_bs_paste
				eld			rpd1.layer_I_parts, a
				jsr			MC_parse_mc_header				; if mc_ext_data_part1

I_mc_bs_paste
				eld			a, bs_status+I_frame_size
				eld			b, rpd1.frame_size
				eadd		a, b
				eld			bs_status+I_frame_size, a

				ld			a8, #SFR_BASE
				ldw			a9, @[a8+rSBL0OFF]				
				ld			r1, e9
				ld			r0, r9
;				ld			r3, #^(BS_MAIN-SB0_BASE)
;				ld			r2, #>(BS_MAIN-SB0_BASE)
				push		a11
				ld			a11, #_buffer_ptr
				ldw			r3, @[a11+_BS_MAIN+0]
				ldw			r2, @[a11+_BS_MAIN+2]
				sub			r2, #>SB0_BASE
				sbc			r3, #^SB0_BASE
				pop			a11

				sub			r0, r2
				sbc			r1, r3

				ecld		r1, b
				sub			r1, r0
				ld			r0, #8
				mul			uu, r1, r0
				ecld		r0, sa
				add			r1, r0
				eld			d, rpd1.layer_I_parts
				ecp			d, #3
				ebra		ec0, chk_cont_bit
; remove continuous bit
				sub			r1, #1
chk_cont_bit	cmp			gt, r1, #0
				brf			part_loop_check

				jsr			I_paste_stream

; remove ancillary bits
				eld			c, bs_status+I_mc_totbits
				eld			a, rpd0.n_ad_bytes
				esla		a
				esla		a
				esla		a
				esub		c, a
				eld			bs_status+I_mc_totbits, c

part_loop_check
; read continuous bit
				eld			a, rpd1.layer_I_parts
				eld			b, rpd1.layer_I_frames
				ecld		r0, a
				ecld		r1, b
				ecp			a, #3
				ebra		ec0, %f4
				eld			a, #1				; read continuous bit
				jsr			getbits
%4				cmp			eq, r0, r1
				brf			part_loop_start

I_seek_ext_sync
				eld			a, rpd0.ext_stream_present
				ecld		r2, a
				cmp			eq, r2, #TRUE
				brf			mpeg2_bitalloc

; search extension frame header
				jsr			I_EXT_seek_sync_ext
				cmp			eq, r2, #_DECODE_OK
				brf 		end_of_layer_I_decoding

I_ext_bs_paste
; initialize ext bit buffer
				eld			sr, #0		/* bs_buffer */
				eld			sa, #0		/* bit_count */
				ld			a8, #SFR_BASE
;				ld			a9, #BS_EXTENSION-SB0_BASE
;				ldw			@[a8+rSBL0OFF], a9
				ld			a9, #_buffer_ptr
				ldw			r1, @[a9+_BS_EXTENSION+0]
				ldw			r0, @[a9+_BS_EXTENSION+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				

				eld			c, bs_status+I_mc_totbits
				eld			a, rpd0.ext_length
				esub		a, #EXT_HEADER_SIZE		; remove ext header
				eld			x0, a
				eld			y0, #8
				emul		x0y0
				eld			b, pl
				ecld		r1, b
				cmp			gt, r1, #0
				brf			mpeg2_bitalloc

				jsr			I_paste_stream

mpeg2_bitalloc
				esec2		#ECP_GT
				eld			sd0, #0x0100
				eld			sd1, #0x0001
				eld			sd2, sd1
				eld			sd3, sd1
				eld			rp0, #bit_alloc
				eld			rp1, #bit_alloc+SBLIMIT*2*PART0
				eld			rp2, #bit_alloc+SBLIMIT*2*PART1
				eld			rp3, #bit_alloc+SBLIMIT*2*PART2
				eld			b, rpd1.stereo
				ecld		r5, b
				ld			r6, #SBLIMIT
				mul			uu, r6, r5
				dec			r6

⌨️ 快捷键说明

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