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

📄 mpa_synth.s

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

.include	"mpa.h"

.secFILE_mpa_synth


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

 Function:		MPG_synthesis_subband

 Description:

   Filtering is a two-level implementation of Lee's fast-DCT algorithm.

   The 32 input values are split in two 16-value vectors using an
   even butterfly and an odd butterfly. The odd values are taken
   through Lee's odd path using a 16x16 DCT matrix and appropriate
   scaling. The even values are further split into two 8-value
   vectors using even and odd butterflies into ee and eo.
   The ee values are fed through an 8x8 DCT matrix while the eo
   values are fed through the odd path using dct_even_odd_8x8.


 Arguments:
				rp0:	in  - synthesis buffer start pointer
				rp3:	in  - 32 fraction data buffer pointer
				rp1:	out - synthesis output buffer (pcm data)
				rp2:	out - dct output buffer

				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0:   -64		 1		32		1,-1,96
				sd1: 	 x		 1		 x		 x
				sd2: 	 2		 4		-1		 1
				sd3:	-2		-1		32		33

********************************************************************/
MPG_synthesis_subband::
				eld			d, rp0
				er			xsd
				esd0		s0, #1

; input butterflies - level 1
				ld			r6, #15
				eld			rp0, rp3
				erpn		rp3, #31
				eld			mc0, #(2<<10) | 15
				es			me0
level1			eld			p, @rp3+s1
				eld			ma0, p, a, @rp0+s1
				eadd		a, ma0, ma0, @rp0+s1
				esub		ma0, p, @rp0+d0, a		; even[i]
				bnzd		r6, level1
				eld			@rp3+d0, ma0			; odd[i]

; input butterflies - level 2
				ld			r6, #7
				eld			mc0, #(1<<10) | 7
level2			eld			p, @rp3+s1
				eld			ma0, p, a, @rp0+s1
				eadd		a, ma0, ma0, @rp0+s1
				esub		ma0, p, @rp0+d0, a		; ee[i]
				bnzd		r6, level2
				eld			@rp3+d0, ma0			; eo[i]

; dct 8: even-even part
				ld			r6, #7
				eld			rp2, #synth_dct32
				eld			rp3, #dct_even_even_8x8
				eld			mc1, #(3<<10) | 31
				es			me2
				eld			           x0, @rp0+s0, y0, @rp3+s0
				emul	         x0y0, x0, @rp0+s0, y0, @rp3+s0
even_even		emld		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				bnzd		r6, even_even
				eld			@rp2+d0, ma0			; out[i], i=0,4,8,12,16,20,24,28

; dct 8: even-odd part
				ld			r6, #7
				er			me0
				erpn		rp0, #13
				erpd		rp2+d1
				erpd		rp3+d1					; dct_even_odd_8x8
				esd0		s0, #-1
				es			me0
				eld			           x0, @rp0+s0, y0, @rp3+s0
				emul		     x0y0, x0, @rp0+s0, y0, @rp3+s0
even_odd		emld		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				bnzd		r6, even_odd
				eld			@rp2+d0, ma0			; out[i], i=2,6,10,14,18,22,26,30

; dct 16: odd part
				ld			r6, #15
				er			me0
				erpn		rp0, #18
				erpd		rp3+d1					; dct_odd_16x16
				erps		rp2+s1
				eld			mc0, #(2<<10) | 15		; modulo 16
				es			me0
				eld			           x0, @rp0+s0, y0, @rp3+s0
				emul		     x0y0, x0, @rp0+s0, y0, @rp3+s0
odd				emld		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
				bnzd		r6, odd
				eld			@rp2+d1, ma0			; out[i], i=1,3,5,...,31

; expansion 64 samples
				er			me0
				er			me2
				eld			rp0, d					; synthesis_buffer[ch][1024]
				erps		rp2+s1					; synth_dct32
				eld			rp3, rp0
				erpn		rp0, #48
				erpn		rp3, #47

				eld			a, @rp2+s0				; dct32[0]
				eneg		a
				eld			@rp0+d0, a				; out[48]

				ld			r6, #14
%1				eld			a, @rp2+s0				; dct32[1 ~ 15]
				eneg		a
				eld			@rp0+d0, a				; out[49 ~ 63]
				bnzd		r6, %b1
				eld			@rp3+d0, a				; out[47 ~ 33]

				eld			rp0, d
				ld			r6, #15
%2				eld			a, @rp2+s0
				eld			@rp0+d0, a				; out[0 ~ 15]
				eneg		a
				bnzd		r6, %b2
				eld			@rp3+d0, a				; out[32 ~ 17]

				eld			a, #0
				eld			@rp0+d0, a				; out[16]

; windowing and overlab add
				ld			r6, #31
				esd0		s0, #0
				es			xsd
				eld			rp0, d
				eld			rp3, #synthesis_window_Di
				eld			mc0, #(0<<10) | 1023
				eld			mc1, #(7<<10) | 511
				es			me0
				es			me3
				
				eld			           x0, @rp0+s0, y0, @rp3+s1
				emul		     x0y0, x0, @rp0+s1, y0, @rp3+s1
overlab_add		emld		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s1, y0, @rp3+s0
				erpd		rp0+d0
				emad		ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
				emad		ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1

; scale up by 2 and restore pcm data to fraction buffer for downmix
				esla		ma0
				esla		ma0
				bnzd		r6, overlab_add
				eld			@rp1+d0, ma0
				
				eld			rp0, d
				erpd		rp0+d1
				er			me0
				retd
				er			me3

.end

/*
.ifndef __FAST_SYNTHESIS
				esra8		a
				eincc		a

; 16-bit saturation
				ecp			a, #0x7fff
				etst		neg, ec3
				bra			ec3, output_pcm_sample
				eld			a, #0x7fff
.endif
*/

⌨️ 快捷键说明

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