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

📄 mpa_crc.s

📁 samsung 9908DVD源代码,
💻 S
📖 第 1 页 / 共 2 页
字号:
				ecld		r3, a
				ecld		r4, b
				ecld		r5, d					; start_ch
				add			r4, r5					; channels
				ld			r7, r5					; ch count
				cmp			eq, r6, #TRUE
				brtd		crc_dyn_cross
				ld			r6, #0					; sb count

crc_no_dyn_cross
;if((sblimit < 12) || (ch != 2) || (center != 3))
				cmp			ge, r6, #12
				brf			%f8
				cmp			eq, r7, #2
				brf			%f8
				cmp			eq, r9, #PHANTOM_CENTER
				brf			%f8
				brtd		%f9
				erps		rp0+s0

%8				eld			d, @rp0+s0
				bsrd		update_CRC
				eld			b, @rp1+s1

%9				inc			r7
				cmp			eq, r7, r4
				brf			crc_no_dyn_cross
				erps		rp1+s0
				inc			r6
				cmp			eq, r6, r3
				brfd		crc_no_dyn_cross
				ld			r7, r5
				bra			crc_scfsi

crc_dyn_cross
				eld			mc0, #dyn_cross_mode
				eld			mc1, #sbgr_table
				eld			a, rpd1.dyn_cross_bits
				ecld		r0, a
				ld			r8, r0
				
crc_dyn_bitalloc_loop
; search the valid sbgr & dyn_cross_mode[sbgr]
				eld			rp2, mc1					; sbgr_table
				ecld		a, r6
				erpn		rp2, a
				eld			b, @rp2						; sbgr No.
				eld			rp2, mc0					; dyn_cross_mode
				erpn		rp2, b 
				eld			d, @rp2						; dyn_cross_mode[sbgr]
				ecp			d, #0
				ebra		ec0, _crc_dyn_cross_mode_0_
				cmp			eq, r8, #4
				brt			_crc_dyn_cross_bits_4_
				cmp			eq, r8, #3
				brt			_crc_dyn_cross_bits_3_
				cmp			eq, r8, #1
				brt			_crc_dyn_cross_bits_1_
.ifdef _DEBUG_
/** debug **/	bra			$
.endif

_crc_dyn_cross_mode_0_
				cmp			eq, r9, #PHANTOM_CENTER
				brf			%f0
				cmp			ge, r6, #12
				brf			%f0
				cmp			eq, r7, #2
				brt			%f3

%0				cmp			eq, r11, #SECOND_STEREO
				brf			%f2
				eld			rp2, #dyn_second_stereo
				erpn		rp2, b
				eld			b, @rp2
				ecp			b, #1
				ebra		ec1, %f2
				cmp			eq, r9, #CENTER_NONE
				brt			%f1
				cmp			eq, r7, #4
				brt			%f3
%1				cmp			eq, r9, #CENTER_NONE
				brf			%f2
				cmp			eq, r7, #3					; <=: ch != (ch_start+1)
				brt			%f3

%2				eld			b, @rp1+s1
				bsrd		update_CRC
%3				eld			d, @rp0+s0
				inc			r7
				cmp			eq, r7, r4
				brf			_crc_dyn_cross_mode_0_
				bra			crc_dyn_bitalloc_loop_check
				
_crc_dyn_cross_bits_4_
				ecld		r7, d
/* T2 */		cmp			eq, r9, #3
				brf			%f4
				cmp			ge, r6, #12
				brt			%f6
%4
				cmp			gt, r7, #2
				brf			%f5
				cmp			eq, r7, #4
				brt			%f5
				cmp			ge, r7, #8
				brf			%f6 
				cmp			gt, r7, #12
				brf			%f5
				cmp			eq, r7, #14
				brf			%f6 
%5				eld			b, @rp1+s1
				bsrd		update_CRC
%6 				eld			d, @rp0+s0
				
/* T3 */		cmp			eq, r7, #1
				brt			%f7 
				cmp			eq, r7, #3
				brt			%f7
				cmp			eq, r7, #5
				brt			%f7
				cmp			eq, r7, #8
				brt			%f7
				cmp			eq, r7, #10
				brt			%f7
				cmp			eq, r7, #13
				brf			%f8
%7 				eld			b, @rp1+s1
				bsrd		update_CRC
%8				eld			d, @rp0+s0

/* T4 */		cmp			eq, r7, #2
				brt			%f9
				cmp			eq, r7, #3
				brt			%f9
				cmp			eq, r7, #6
				brt			%f9
				cmp			eq, r7, #9
				brf			%f10
%9				eld			b, @rp1+s1
				bsrd		update_CRC
%10				eld			d, @rp0+s0
				bra			crc_dyn_bitalloc_loop_check

_crc_dyn_cross_bits_3_
				ecld		r7, d
				cmp			eq, r9, #3
				brf			%f12
				cmp			ge, r6, #12
				brt			%f14
%12				cmp			eq, r7, #1
				brt			%f13
				cmp			eq, r7, #4
				brf			%f14
%13				eld			b, @rp1+s1
				bsrd		update_CRC
%14				eld			d, @rp0+s0
				
				cmp			eq, r7, #2
				brfd		crc_dyn_bitalloc_loop_check
				eld			d, @rp0+s0
				bsrd		update_CRC
				eld			b, @rp1+s1
				bra			crc_dyn_bitalloc_loop_check			
				
_crc_dyn_cross_bits_1_
				cmp			eq, r11, #3
				brfd		crc_dyn_bitalloc_loop_check
				erps		rp0+s0
				eld			rp2, #dyn_second_stereo
				erpn		rp2, b
				eld			b, @rp1+s1
				bsrd		update_CRC
				eld			d, @rp0+s0
				eld			a, @rp2
				ecp			a, #0
				ebrad		ec1, crc_dyn_bitalloc_loop_check
				eld			d, @rp0+s0
				bsrd		update_CRC
				eld			b, @rp1+s1
								
crc_dyn_bitalloc_loop_check
				erps		rp1+s0
				inc			r6
				cmp			eq, r6, r3
				brfd		crc_dyn_bitalloc_loop
				ld			r7, r5


; 5. scalefactor selection information
crc_scfsi		eld			rp0, #bit_alloc+64
				eld			rp1, #scfsi
				sub			r4, r5
				mul			uu, r3, r4
				ld			r6, r3
				dec			r6
				eld			a, @rp0+s0
%0
				ecp			a, #0
				ebra		ec0, %f1
				eld			b, #2
				bsrd		update_CRC
%1				eld			d, @rp1+s0
				bnzd		r6, %b0
				eld			a, @rp0+s0				
				eld			sr, si						; restore bit_buffer				
				pop			a14
				ret				
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */



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

 Function:		AUG_error_check

 Description:	Check CRC of MC augmentation stream. 
 				This is mandatory option.
 
 Check item:	
				1. AUG composite status information
				2. bit allocation
				3. scalefactor selection information

********************************************************************/
.if( _DECODER_TYPE == MPEG_2_71CH )
AUG_error_check::
				push		a14
				eld			si, sr						; backup bit_buffer
				
; 1. AUG composite status information
				eld			c, #-1
				efz8		c

				eld			d, rpd1.aug_mtx_proc
				bsrd		update_CRC
				eld			b, #2

				eld			d, rpd1.aug_dyn_cross_on
				bsrd		update_CRC
				eld			b, #1

				eld			d, rpd1.aug_future_ext
				bsrd		update_CRC
				eld			b, #1
				
				eld			a, rpd1.aug_mtx_proc
				ecp			a, #0
				ebrad		ec0, %f1
				eld			b, #3
				ecp			a, #1
				ebrad		ec0, %f1				
				eld			b, #2
				bra			%f3
%1				eld			rp0, #aug_tc_alloc
				ld			r6, #GRANULES-1
				eld			x0, b
%2				bsrd		update_CRC
				eld			d, @rp0+s0
				bnzd		r6, %b2 
				eld			b, x0
%3				
				eld			a, rpd1.aug_dyn_cross_on
				ecp			a, #0
				ebra		ec0, %f5
				eld			rp1, #aug_dyn_cross_mode
				ld			r6, #GRANULES-1
				eld			b, #5
%4				bsrd		update_CRC
				eld			d, @rp1+s0
				bnzd		r6, %b4
				eld			b, #5

; 2. bit allocation
%5
				ld			r6, #0						; sb count
				eld			rp0, #bit_alloc+32*5
				eld			rp1, #nbal_table				
				eld			mc0, #aug_dyn_cross_mode
				eld			mc1, #sbgr_table
				eld			a, rpd1.sblimit_mc
				ecld		r4, a

crc_aug_bitalloc_loop
; search the valid sbgr & dyn_cross_mode[sbgr]
				eld			rp2, mc1					; sbgr_table
				ecld		a, r6
				erpn		rp2, a
				eld			b, @rp2						; sbgr No.
				eld			rp2, mc0					; dyn_cross_mode
				erpn		rp2, b 
				eld			a, @rp2						; dyn_cross_mode[sbgr]
				ecld		r3, a
				
%6				cmp			gt, r3, #4						; dyn_cross_mode[sbgr] = 0,1,2,3,4
				brt			%f7
				eld			d, @rp0+s0
				bsrd		update_CRC
				eld			b, @rp1+s1
				cmp			eq, r3, #0						; dyn_cross_mode[sbgr] = 0,1,2,3,4
				brfd		crc_aug_bitalloc_loop_check
				eld			d, @rp0+s0
				bsrd		update_CRC
				eld			b, @rp1+s1
				bra			crc_aug_bitalloc_loop_check
	
%7				cmp			eq, r3, #5						; dyn_cross_mode[sbgr] = 5,10,14
				brt			%f8
				cmp			eq, r3, #10
				brt			%f8
				cmp			eq, r3, #14
				brfd		%f9
%8				erps		rp0+s0
				eld			b, @rp1+s1
				bsrd		update_CRC
%9				eld			d, @rp0+s0
crc_aug_bitalloc_loop_check
				erps		rp1+s0
				inc			r6
				cmp			eq, r6, r4
				brf			crc_aug_bitalloc_loop

; 3. scalefactor selection information
				eld			rp0, #bit_alloc+32*5
				eld			rp1, #scfsi
				ld			r6, #STEREO
				mul			uu, r6, r4
				dec			r6
				eld			b, #2
				eld			a, @rp0+s0
%10
				ecp			a, #0
				ebra		ec0, %f11
				eld			b, #2
				bsrd		update_CRC
%11				eld			d, @rp1+s0
				bnzd		r6, %b10
				eld			a, @rp0+s0				
				eld			sr, si						; restore bit_buffer				
				pop			a14
				ret	
.endif /* .if( _DECODER_TYPE == MPEG_2_71CH ) */


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

 Function:		MC_EXT_error_check

 Description:	Check CRC of extension stream.
 				This is mandatory option.
 
 Arguments: 	a12: extension stream start point

 Check item:	
				1. Header
				   update_CRC (ext_length, 11, crc);
				   update_CRC (ext_ID, 1, crc);
				
				2. 128 bits of stream

********************************************************************/
.if( _DECODER_TYPE != MPEG_1_AUDIO )
MC_EXT_error_check::
				push		a14
				eld			si, sr					; backup bit_buffer
				ld			r4, #0
				eld			c, #-1
				efz8		c

				eld			d, rpd0.ext_length
				bsrd		update_CRC
				eld			b, #11

				eld			d, rpd0.ext_ID
				bsrd		update_CRC
				eld			b, #1
				
; ext_length * 8 - 28;
				eld			a, rpd0.ext_length
				esla		a
				esla		a
				esla		a
				esub		a, #28
; if (a > 128) a = 128;
				ecp			a, #128
				ebra		ec2, 4
				eld			a, #128
				
; la_bytes = (a - 12) / 8;
; la_bits  = (a - 12) % 8;
				esub		a, #12
				er			nq
				ecr			ma0
				eld			p, #8				; divisor
				eld			ma0l, a				; dividend
				esla		ma0
				ld			r7, #23
				bnzd		r7, $
				edivq		ma0, p
				eresr		ma0, p
				eld			a, ma0l				; quotient:= la_bytes
				esra		ma0
				eld			b, ma0				; remainder:= la_bits
				ecld		r6, a
				ecld		r7, b

				ld			r5, #0				; count la_bytes
%1				cmp			gt, r6, r5
				brf			%f2
				ldb			r3, @[a12+r4]
				inc			r4
				eld			b, #8
				bsrd		update_CRC
				ecld		d, r3
				brad		%b1
				inc			r5

%2				cmp			gt, r7, #0
				brf			end_ext_error_check
				ld			r5, r7
				sub			r7, #8
				com2		r7
				dec			r7
				ldb			r3, @[a12+r4]
				bnzd		r7, $
				sr			r3
				ecld		d, r3
				bsrd		update_CRC
				ecld		b, r5
				
end_ext_error_check
				eld			sr, si						; restore bit_buffer				
				pop			a14
				ret
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */



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

 Function:		recover_CRC_error

 Description:	Recover CRC error.

                In ISO/IEC 11172-3, to avoid annoying distortions, 
                application of a concealment technique, such as 
                muting of the actual frame or repetition of the 
                previous frame, is recommended.

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

recover_CRC_error::
				push		a14

				ldw			a9, @[a10+_pParameter]
				ldb			r4, @[a9+_CH_Mode]
				ldb			r5, @[a10+_OutPCMSize]				
				ldw			a9, @[a10+_OutputBufferOffset]
				ld			a11, #SB1_BASE+s1mem_PCM_BUF
				ld			a12, a11
				ld			r0, r11
				ld			r1, e11
				ld			r2, r9
				ld			r3, e9
				add			r0, r2
				adc			r1, r3
				ld			r11, r0
				ld			e11, r1
				
				ld			r6, #SAMPLES_PER_FRAME*8*2
				cmp			eq, r4, #_MPEG2_7CH
				brf			%f1
				ld			r6, #SAMPLES_PER_FRAME*10*2

%1				cmp			eq, r5, #PCM_SAMPLE_16BITS
				brt			%2
				sl			r6

%2				cmp			eq, a9, #0
				brf			%f3
				add			a12, r6

%3				sr			r6
				dec			r6
				eld			a, rpd1.error_count
				ecp			a, #1
				ebrad		ec1, mute_cur_frame
				ld			r3, #0

; 1. replicate previous error_free frame
copy_pre_frame
				ldw			r3, @[a12]
				add			a12, #2
				ldw			@[a11], r3
				bnzd		r6, copy_pre_frame
				add			a11, #2
				
				bra			end_recover_CRC_error
				
; 2. mute the frame
mute_cur_frame
				ldw			@[a11], r3
				bnzd		r6, mute_cur_frame
				add			a11, #2


end_recover_CRC_error
				pop			a14
				ret


.end

⌨️ 快捷键说明

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