?? pscon.s
字號:
/******************************************************************************
* 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 + -