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

📄 pscon.s

📁 samsung 9908DVD源代码,
💻 S
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
* Copyright (c) 2004 VOISO Semiconductor co.,Ltd. All Rights Reserved.
*
* VOISO Semiconductor has intellectual property rights on the PITCH &
* SPEED CONTROL algorithm.
*
* DESCRIPTION
*
* @module  : ASM Code for Pitch & Speed Control
* @author1 : Jae-Hoe Yang (+82-51-510-2173, jhyang@voiso.com)
* @author2
* @version : 2.1
* @log
*   - 2004.04.02 : insert compile options & implement high quality (ver 2.1)
*   - 2004.03.20 : code size down & mips up<quality up(a little)> (ver 2.0)
*   - 2004.02.10 : add 'PSconFunc' function (ver 1.2)
*   - 2004.02.04 : revision (ver 1.1)
*   - 2003.10.11 : complete (ver 1.0)
*   - 2003.09.20 : start code generation
* @mips (ref. Fs=44.1kHz, STEREO, about 288000-samples Tested) : data dependent
*  --> For more details, refer to "code_summary.txt" file.
*      (High-Quality option & Worst Case Condition)
*  <1> Pitch Control
*      --> about  MP3-14.5 / MPG-16.1 / WMA-13.8  MIPS
*  <2> Speed Control : final mips = result(mips)/rate(fast or slow)
*      --> about  MP3-24.1 / MPG-27.6 / WMA-22.5  MIPS
*  <3> Pitch & Speed Control : final mips = result(mips)/rate(fast or slow)
*      --> about  MP3-37.3 / MPG-42.2 / WMA-34.8  MIPS
******************************************************************************/

.include "config_pscon.h"
.include "pscon_sub.h"



//---------------------------------------------------------//
// Variables
//---------------------------------------------------------//
//( RAM )
.extern   PtBuff1, PtBuff0, PdwBuf, cBuff_L, cBuff_R
.extern   StBuff1, StBuff0, SdwBuf
.extern   pstBuf1, pstBuf0, psdwBuf
// Pitch
.extern   MP3PdBuff_L, MP3PsBuff_L, MP3PdBuff_R, MP3PsBuff_R
.extern   MPGPdBuff_L, MPGPsBuff_L, MPGPdBuff_R, MPGPsBuff_R
.extern   WMAPdBuff_L, WMAPsBuff_L, WMAPdBuff_R, WMAPsBuff_R
// Speed
.extern   MP3SdBuff_L, MP3SsBuff_L, MP3SdBuff_R, MP3SsBuff_R
.extern   MPGSdBuff_L, MPGSsBuff_L, MPGSdBuff_R, MPGSsBuff_R
.extern   WMASdBuff_L, WMASsBuff_L, WMASdBuff_R, WMASsBuff_R
// Speed & Pitch
.extern   MP3psdBuf_L, MP3pssBuf_L, MP3psdBuf_R, MP3pssBuf_R
.extern   MPGpsdBuf_L, MPGpssBuf_L, MPGpsdBuf_R, MPGpssBuf_R
.extern   WMApsdBuf_L, WMApssBuf_L, WMApsdBuf_R, WMApssBuf_R

//( ROM )
.extern   SemiToneTab, PitchTable, SpeedTable,UserEQ_Tbl

//( C-main )
.extern   _PostCodecShared
.extern   _pscon_mode

//( IMAGE )
.extern   |PSCON_TABLE$$SemiToneTable$$START|

.extern   |PSCON_TABLE$$PSconMP3HiTab$$START|
.extern   |PSCON_TABLE$$PSconMPGHiTab$$START|
.extern   |PSCON_TABLE$$PSconWMAHiTab$$START|

.extern   |PSCON_TABLE$$PSconMP3LoTab$$START|
.extern   |PSCON_TABLE$$PSconMPGLoTab$$START|
.extern   |PSCON_TABLE$$PSconWMALoTab$$START|

.extern   _s0_base_ptr_pscon, _s1_base_ptr_pscon, _temp_cnt_pscon, _LastSidx, Fade_coeff_pscon
.extern   Flag_fade_out_pscon, Flag_fade_in_pscon, _Flag_fade_out_pscon, _Flag_fade_in_pscon


PSConCodeSection     SECTION     CODE
            PSConCodeSection

;//============================================================================
;  void  PSControl( PostCodecShared_t * )
;
;   o INPUT
;     - A10 : PostCodecShared
;
;   o OUTPUT
;     - None
;------------------------------------------------------------------------------

_PSControl::


	push	A14
	push	R0, R1
	push	R2, R3
	push	R4, R5
	push	R6, R7
	push	A8, A9
	push	A10, A12
	push	a11

.if 0
	ld		r7, #20
%2:	
	ld		r6, #1300	
%1:	
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	dt		r6
	brf		%b1
	
	dt		r7
	brf		%b2
	
	bra		End_PSControl
.endif	

	ldw		A9, @[A10+pParameter]			; 4B

.if (MONO_MODE)	
	ld		r0, #MONO
	ldb		@[A9+PSC_Chidx], r0
.endif

	jsr		_set_mode    ;setting frame_no, repeat_no 

	/* Setting SB0,1  */
	ld		a8, #ADM_BASE
	ldw		r0, @[a8+rCONFIG0]
	and		r0, #0xff
	ld		r4, #SBF0_R16lsb_s + SBF1_W16lsb
	or		r0, r4
	ldw		@[a8+rCONFIG0], r0

	ldw		r3, @[a10+InputBufferOffset]
	ldw		r4, @[a10+InputBufferOffset+2]
	ldw		@[a8+rSB0OFF_L+2], r3
	ldw		@[a8+rSB0OFF_L], r4

	ldw		r3, @[a10+OutputBufferOffset]
	ldw		r4, @[a10+OutputBufferOffset+2]
	ldw		@[a8+rSB1OFF_L+2], r3
	ldw		@[a8+rSB1OFF_L], r4

	ld		r0, #SBF0_FILL
	ldw		@[a8+rSBFCON], r0

	

	ld		r5, #0   ;sample number after SPcontrol
	
	ldw		R0, @[A10+CodecStartFlag]		; 2B
	cmp		EQ, R0, #TRUE
	brt		%f1
	ld		r11, #1
%1:

	
	eld		MSR0, #0x0000
	eld		MSR1, #0x0020					;PSH1=1
	
	
;-----------[ PITCH CONTROL ONLY ]----------

	jsr		Pitch_Fnct


	ldw		r3, @[a9+PSC_Samples]
	add		r5, r3
	
	dt		r11
	brf		%b1
	
	ld		a8, #ADM_BASE
	ld		r0, #SBF1_FLUSH
	ldw		@[a8+rSBFCON], r0

	ldw		@[a9+PSC_Samples], r5

End_PSControl
	
	pop		a11
	pop		A12, A10
	pop		A9, A8
	pop		R7, R6
	pop		R5, R4
	pop		R3, R2
	pop		R1, R0
	pop		A14
	
	ret

;//============================================================================
;------------------------------------------------------------------------------
;  (1) ADDRESS 
;      - External Address : A12 ( |xxxTable$$LOAD| )
;      - Internal Address : RP0 ( MAC-Addr )
;  (2) SIZE  :  R6 ( |xxxTable$$SIZE|/2 - 1 ) (LWORD Number)
;------------------------------------------------------------------------------
Tab2Ymem::
    PUSH    R0, R1

Ext2Idm_Loop
    LDC     R0, @A12
    ADD     A12, #2
    ECLD    A, R0
    ESLA8   A
    LDC     R0, @A12
    ADD     A12, #2
    LD      R1, R0
    SRB     R0
    EFZ8    B
    ECLD    B, R0
    EADD    A, B
    ECLD    BH, R1
    LDC     R0, @A12
    ADD     A12, #2
    ECLD    B, R0
	ELD		@RP0+D1, A
	BNZD    R6, Ext2Idm_Loop
	ELD		@RP0+D1, B
	
	POP     R1, R0
	RET


;//============================================================================

DIV_24::
	
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
DIV_16::
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	edivq	MA0, P
	
	ret


.if OS_MODE!=S_ONLY
;==========================================================================
; void Pcon_Init(void)
;==========================================================================
Pcon_Init::
	
	push	A14
	
	ebk		#1111b
	eld		SD0, #0x1010
	eld		SD1, #0x1010
	eld		SD2, #0x1010
	eld		SD3, #0x1010
	
	
	ld		R6, #(2-1)
	eld		A, #0
	eld		RP1, #cBuff_L
	eld		RP2, #cBuff_R
%1
	eld		@RP1+D1, A
	bnzd	R6, %b1
	eld		@RP2+D1, A
	
	;-------[ TABLE LOAD 1 ]----------------
	ld		A12, #|PSCON_TABLE$$SemiToneTable$$START|
	eld     RP0, #StartAddress_Ymem_Mac
    ld      R6, #PitchTab_SIZE
    sr      R6
    sub     R6, #1
	jsr		Tab2Ymem
	
	;-------[ for TABLE LOAD 2 ]------------
	eld     RP0, #(StartAddress_Ymem_Mac+PitchTab_SIZE)
    ld      R6, #SpeedTab_SIZE
    sr      R6
    sub     R6, #1
    ;---------------------------------------

	ldb		R0, @[A9+PSC_FrameNo]
	cmp		EQ, R0, #FN_384
	brf		LoadPTab_MP3_HiF_HiQ

	es		XSD
	eld		SD0, #0x0000
	eld		SD3, #0x0000
	er		XSD
	eld		SD0, #0x101C
	eld		SD3, #0x101C

	ld		A12, #|PSCON_TABLE$$PSconMPGLoTab$$START|
	jsr		Tab2Ymem
	
	eld		A, #PitchTable
	eld		B, #31
	eld		D, #FRAME_MPG_LO
	bra		%f99

	;--------------------------------------------------------------------------    

LoadPTab_MP3_HiF_HiQ
	es		XSD
	eld		SD0, #0x0001
	eld		SD3, #0x0001
	er		XSD
	eld		SD0, #0x1018
	eld		SD3, #0x1018

	ld		A12, #|PSCON_TABLE$$PSconMP3HiTab$$START|
	jsr		Tab2Ymem
	
	eld		A, #PitchTable
	eld		B, #24
	eld		D, #FRAME_MP3_HI
	bra		%f99

	;--------------------------------------------------------------------------    

%99
	jsr		Init_Sub
	
	pop		A14
	ret

.endif ;OS=!SONLY
;------------------------------------------------------------------------------



;==========================================================================
; void Init_Sub(void)
;==========================================================================
Init_Sub::
	push	A14
	
	eld		RPD1.SpeedTab1, A
	eld		RPD1.LoopCnt, B
	eld		RPD0.OneFrame, D
	ecld	R5, D
	eld		A, D
	esla	D
	eld		RPD0.TwoFrame, D
	eadd	D, A
	eld		RPD0.TriFrame, D
	
	
	ld		R6, R5
	sl		R6
	sub		R6, #1
	eld		RP0, RPD1.b00_0
	eld		RP1, RPD1.b00_1
	eld		A, #0
%1
	eld		@RP0+D1, A
	bnzd	R6, %b1
	eld		@RP1+D1, A


	ld		R6, R5
	sl		R6
	add		R6, R5
	add		R6, #(50-1)
	eld		RP3, RPD1.b00_3
	eld		RP2, RPD1.b00_2
%1
	eld		@RP3+D1, A
	bnzd	R6, %b1
	eld		@RP2+D1, A
	
	
	eld		A, #FALSE
	eld		RPD1.Sinit, A
	eld		RPD1.Pfrac, A
	
	ebk		#1111b
	es		XSD
	eld		RPD1.b00_12, SD0_1
	eld		RPD1.b00_15, SD3_1
	er		XSD
	eld		RPD1.b00_8, SD0_0
	eld		RPD1.b00_11, SD3_0
	
	pop		A14
	ret



.if OS_MODE!=S_ONLY
;==========================================================================
; void PitchModule(void)
;==========================================================================
PitchModule::
	push	A14
	
	er		XSD
	ebk		#0000b
	eld		A, #0x1f1f
	eld		SD0, A
	eld		SD1, A
	eld		SD2, A
	eld		SD3, A
	
//ldy
	esd2	d1, #0		
	
	eld		A, RPD0.SynLen
	ecld	R6, A
	
	eld		A, RPD1.onesamp
	ecld	R0, A
	cmp		EQ, R0, #TRUE
	brf		%f1
	sub		R6, #1
%1
	esec1	#FLTB
	esec2	#FGEB
	
	
	;--------------------------------------------------------------------------
	; OutputBuffer(Ring Buffer) Setting for Pitch-Only or PS-Both
	;
/*	ldw		A8, @[A10+OutputBufferWPointer]
	ldw		R2, @[A10+OutputBufferEnd+2]
	ldw		R3, @[A10+OutputBufferPointer+2]
*/	
	ld		R4, #0							;NumberOfSample
	;--------------------------------------------------------------------------
	
	eld		rp2, #0x7fff    ;ldy
	
	eld		A, RPD1.PSboth
	ecld	R0, A
	cmp		EQ, R0, #1
	brf		%f1

	ldw		R4, @[A9+PSC_Samples]
	
%1

	eld		A, RPD1.Pvalue
	eld		SI, A
	eld		A, RPD1.Pfrac
	ldb		R0, @[A9+PSC_Chidx]

	jsr		Pitch_Sub1
	
	ldb		R0, @[A9+PSC_FrameNo]
	
	jsr		Pitch_Sub2
	
	cmp		EQ, R0, #0x20
	brt		%f15
	
	ldb		R0, @[A9+PSC_Chidx]
	jsr		Pitch_Sub3
	
%15

	ldw		@[A9+PSC_Samples], R4

	
	;--------------------------------------------------------------------------
	; Update OutputBufferWPointer
	;
;	ldw		@[A10+OutputBufferWPointer+2], R8
	;--------------------------------------------------------------------------
	
	
	pop		A14
	ret

.endif ;OS_MODE!=S_ONLY


;==========================================================================
; void SpeedModule(void)
;==========================================================================
SpeedModule::
	push	A14
	
	ebk		#1111b
	es		XSD
	eld		SD0_1, RPD1.b00_12
	eld		SD3_1, RPD1.b00_15
	er		XSD
	eld		A, #0x1f1f
	eld		SD1, A
	eld		SD2, A
	eld		SD0_0, RPD1.b00_8
	eld		SD3_0, RPD1.b00_11
	
	eld		MSR2, #0x0320					;Bank-0 / 2-GE / 1-LT / 0-EQ
	eld		A, #0x1010
	eld		SD0, A
	eld		SD1, A
	eld		SD2, A
	eld		SD3, A
	
	eld		B, RPD1.Svalue
	eld		RPD0.SynF1, B
	
	;---------------------------------------
	
	ld		R0, #FALSE
	eld		A, RPD0.SynBfo
	ecp		A, B
	nop
	bra		EC0, %f1						;EQ
	ld		R0, #TRUE
	eld		RPD0.SynBfo, B
%1
	cmp		EQ, R0, #TRUE
	brt		InnerSInit
	eld		A, RPD1.Sinit
	ecp		A, #TRUE
	nop
	bra		EC0, MainSLoop					;EQ
InnerSInit	
	eld		A, #TRUE
	eld		RPD1.Sinit, A
	eld		RPD0.SynLen, B
		
	eld		C, RPD0.OneFrame
	eld		D, C
	esub	D, B
	eld		RPD0.Kpnt, D
	eld		RPD0.Kbfo, D
	
	ecp		B, C
	nop
	bra		EC2, ISinitSlow					;GE
ISinitFast
	eld		A, #FAST
	eld		RPD1.Mode, A
	eld		A, #0
	eld		RPD0.Kmin, A
	
	eld		A, #50
	eadd	A, D
	eld		RPD0.OverlapLen, A
	eadd	A, D
	eld		RPD0.BndIdx, A
	brad	%f5
	eld		RPD0.Kmax, C
ISinitSlow
	eld		A, #SLOW
	eld		RPD1.Mode, A
	eneg	C
	eld		RPD0.Kmin, C
	eld		A, #0
	eld		RPD0.Kmax, A
	
	eld		A, #50
	eld		RPD0.BndIdx, A
	esub	A, D
	eld		RPD0.OverlapLen, A
%5
	eld		A, #1
	eld		RPD0.Engy1, A
	eld		RPD0.Engy2, A

MainSLoop
	eld		C, RPD0.Kbfo
	eld		RPD0.Kreg, C
	eld		RPD0.(Kreg+1), C
	
	;---------------------------------------
	eld		C, RPD0.BndIdx
	ecld	R6, C
	sub		R6, #1
	eld		RP3, RPD1.b00_3
	eld		RP0, RP3
	eld		B, RPD0.SynLen
	erpn	RP0, B
	eld		D, RPD0.TwoFrame

	;--------------------------------------------------------------------------
	; InputBuffer(Ring Buffer) Setting for Pitch-Only or Speed-Only
	;
/*	ldw		A8, @[A10+PSconIbufferRPointer]
	ldw		R2, @[A10+PSconIbufferEnd+2]
	ldw		R3, @[A10+PSconIbufferPointer+2]
*/	;--------------------------------------------------------------------------



	ldb		R0, @[A9+PSC_Chidx]
	cmp		EQ, R0, #MONO
	brf		StereoSMode
	
	;-------
%1
	eld		A, @RP0+S1						;[inc 1]
	bnzd	R6, %b1
	eld		@RP3+D1, A						;[inc 1]
	;-------
	eld		B, RPD0.OverlapLen
	eld		RP0, RPD1.b00_0
	erpn	RP0, B
	esub	D, B
	ecld	R6, D
	sub		R6, #1
	;-------
	eld		A, RPD1.Mode
	ecp		A, #FAST
	nop
	bra		EC0, %f22						;EQ
	;-------
%2
	eld		A, @RP0+S1						;[inc 1]
	bnzd	R6, %b2
	eld		@RP3+D1, A						;[inc 1]

⌨️ 快捷键说明

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