📄 mp3decnew.s
字号:
ld a12 ,#0x2c0000 //CONFIG0
ldw r0 ,@[a12]
and r0, #0xff
ldb r1 ,@[a10+Index_OutPCMSize]
cmp eq ,r1 ,#24
brt PCM24L1
or r0 ,#0x4600
jmp PCM24EndL1
PCM24L1:
or r0 ,#0x4000
PCM24EndL1:
ldw @[a12+0],r0 //SBF1 mac[23:0]->ext[31:0] & zero extension
ld a12 ,#0x2c0000
// 0ffset read
.ifdef PtrLongSize
ldw r0 ,@[a10+Index_InputBufferOffset]
ldw @[a12+0x52],r0
ldw r0 ,@[a10+Index_InputBufferOffset+2]
ldw @[a12+0x54],r0
.else
ld r0 ,#0
ldw @[a12+0x52],r0
ldw r0 ,@[a10+Index_InputBufferOffset]
ldw @[a12+0x54],r0
.endif
ld r0 ,#0x1000 //SBFCON SBF0 FILL COMMAND & SBF1 FLUSH COMMAND
ldw @[a12+0x4a],r0
////////////////////////////////////////
jsr InitalizeForL1Decoding
eld a ,G_cnt
eadd a ,#1
eld G_cnt ,a
jsr Fill_bufferMP3
jsr ParsingHeaderL1
///////////////////////////////////////////////////////////////
eld a ,GLayerDiff
ecld r1 ,a
ld r2 ,#0
cmp eq ,r1 ,#2
brt Layer_selL1
ldb @[a13+Index_FrameStartFlag] ,r2
ldb @[a13+Index_GL2Done] ,r2 // warning
ldw r0 ,@[a10+Index_pParameterH]
ld e12 ,r0
ldw r0 ,@[a10+Index_pParameterL]
ld r12 ,r0
ldb @[a12+Index_P_GL2Done] ,r2
jmp Mp3DecodingReturn
///////////////////////////////////////////////////////////////
Layer_selL1
cmp eq ,r0 ,#0
jpf Mp3DecodingReturn
eld sd0 ,#((1&0fh)<<12)|(1<<8)|((2&0fh)<<4)|(1<<0)
eld sd1 ,#((1&0fh)<<12)|(1<<8)|((2&0fh)<<4)|(1<<0)
jsr SelectTableL1
jsr BitAllocationL1
jsr ScalefactorsL1
jsr FetchDequanData
eld c ,#0
eld rpd0.index_Ggr ,c
DequanGrLoopL1
jsr DequantizerL1
eld a ,rpd0.index_Ggr
eadd a ,#1
eld rpd0.index_Ggr ,a
ecp a ,#12
enop
bra ec2 ,DequanGrLoopL1
jsr Separate_channel
eld a ,rpd0.index_Gnch
esub a ,#1
ecld r0 ,a
ldb @[a13+Index_ChannelLoop] ,r0
eld a ,#Area_leftChannel
L1DecodingChannelLoop2
eld rpd1.index_GptrCurrentDecodingData, a
jsr SynthesisPolyphase
eld a ,#Area_rightChannel
ldb r6 ,@[a13+Index_ChannelLoop]
dec r6
ldb @[a13+Index_ChannelLoop] ,r6
cmp eq ,r6 ,#0
brt L1DecodingChannelLoop2
esub b ,#1024
eld rpd1.index_GptrSynPrevious, b ;update the pointer of
jsr ComposeStereoL12 //2002
jmp Mp3DecodingFrame
//////////////////////////////////////////////////////////////////////////////////
;
;
//////////////////////////////////////////////////////////////////////////////////
BackupGPRSFR:
nop
nop
push r0
push r1
push r2
push r3
push r4
push r5
push r6
push r7
push a11
push a12
push a13
ret
//////////////////////////////////////////////////////////////////////////////////
;
;
//////////////////////////////////////////////////////////////////////////////////
RestoreGPRSFR:
nop
nop
pop a13
pop a12
pop a11
pop r7
pop r6
pop r5
pop r4
pop r3
pop r2
pop r1
pop r0
ret
//////////////////////////////////////////////////////////////////////////////////
; rpd0 rpdi.adr[4:0]
; the base address of sideinformation for MPEG process
; rpd1 rpdi.addr[4:0] / rpd1.adr[3:0]
; the base address of global variable for MPEG process
; especially, rpd0/rpd1 must not be varied throughout all routines
//////////////////////////////////////////////////////////////////////////////////
InitalizeForDecoding:
eld a ,#Area_sideInformation ;because of MAC address
eld rpd0 ,a ;initialize MAC base ;address (rpd0)
eld a ,#Area_mpegVariables
eld rpd1 ,a ;initialize base address of MAC variables
eld a ,#0
eld msr0 ,a
eld a ,#0028h ;Enable Saturation/Fractional/Signed Mode/MA0
eld msr1 ,a
eld a ,#0f51h ;ec0=nz. ec1=nc, ec2=t
eld msr2 ,a ;initialize status 2
eld mc0 ,#1024-1
eld mc1 ,#(7<<10)|512-1 ;modulo rp2/rp3 (512),bit reverse [4:0]
eld a ,#CodecSharedMP3 ;+SharedOffsetAddress
esla a
ecld r0 ,a
ld r13 ,r0
ld r0 ,#0x20
ld e13 ,r0
//t ld a10 ,#_MainCodecShared
eld b ,#Area_pcmSamples
eld rpd1.index_GptrPcmSamples, b
ldw r0 ,@[a10+Index_pParameterH]
ld e12 ,r0
ldw r0 ,@[a10+Index_pParameterL]
ld r12 ,r0
ldb r0 ,@[a12+Index_P_GL2Done]
//h ldb r0 ,@[a13+Index_GL2Done]
cmp eq ,r0 ,#1
jpf L2Pass
jpt L2Decoding
L2Pass
ldb r0 ,@[a12+Index_P_GL2Done]
//h ldb r0 ,@[a13+Index_GL2Done]
cmp eq ,r0 ,#2
jpf L1Pass
jpt L1Decoding
L1Pass
// ldb r0 ,@[a13+Index_FrameStartFlag] ;r0<-FrameStartFlag
ldb r0 ,@[a10+Index_CodecStartFlag] ;r0<-FrameStartFlag
cmp eq ,r0 ,#0
jpf InitalizeForDecodingReturn
ld r0 ,#1
ldb @[a10+Index_CodecStartFlag] ,r0
// ldb @[a13+Index_FrameStartFlag] ,r0
ld a12 ,#0x2c0050
%1: ldw r2 ,@[a12]
and r2, #0x7000
cmp eq, r2, #(0x1<<12)
brt %b1
cmp eq, r2, #(0x2<<12)
brt %b1
esd0 d0 ,#1
eld a ,#0
eld rp0 ,#CodecSharedMP3
ld r6 ,#80-1
Var_init
bnzd r6 ,Var_init
eld @rp0+d0 ,a
eld rp0 ,#Area_mpegBitstream
ld r6 ,#1024-1
var_init2
bnzd r6 ,var_init2
eld @rp0+d0 ,a
// for TEST /////////////////////////////////////////////
// ld r0 ,#0x03
// ldb @[a10+Index_OptionalFunctionOnOff] ,r0
// ld r0 ,#8
// ld r0 ,#30
// ldb @[a10+Index_VolumeIndex] ,r0
// ld r0 ,#0x20
// ld r1 ,#0x6000
// ldw @[a10+Index_pSpectrumDisplay] ,r0
// ldw @[a10+Index_pSpectrumDisplay+2] ,r1
ld r0 ,#0x00
// ldb r0 ,@[a10+Index_OptionalFunctionOnOff]
ldb @[a13+Index_EQ_VolumeFlag] ,r0
// ld r0 ,#20
// ldb r0 ,@[a10+Index_VolumeIndex]
ld r0 ,#40
ldb @[a13+Index_VolumeControl] ,r0
/////////////////////////////////////////////////////////
eld a ,#1
eld rpd1.index_GranuleLoop ,a ;initialize granule
eld a ,#0
eld rpd1.index_Glsf ,a ;initialize MP3(default)
eld rpd1.index_LMpegVersion ,a
eld GLayerDiff ,a
eld G_cnt ,a
eld G_firFrame ,a
eld G_FillBuffFlag ,a
// ldb r0 ,@[a10+Index_VolumeIndex]
ldb r0 ,@[a13+Index_VolumeControl]
// ld r0 ,#0x19
ecld a ,r0
eld G_PrevVol,a
ld r0 ,#0x5a
ld r1 ,#0x6705 //+3dB>>2
ecld ah ,r0
ecld a ,r1
eld G_SubVolume ,a
ld r0 ,#0x16
ld r1 ,#0xc300 //15db
// ld r0 ,#0x15
// ld r1 ,#0x7d00 //15db
ecld ah ,r0
ecld a ,r1
eld G_CompVol ,a
ld r0 ,#0
ldb @[a13+Index_GL2Done] ,r0
ld r0 ,#0x20
ldw @[a13+Index_InputBufferPointerH] ,r0
ldw @[a13+Index_InputBufferRPointerH] ,r0
ldw @[a13+Index_InputBufferWPointerH] ,r0
ld r0 ,#Area_mpegDataInput
sl r0
ldw @[a13+Index_InputBufferPointerL] ,r0
ldw @[a13+Index_InputBufferRPointerL] ,r0
ldw @[a13+Index_InputBufferWPointerL] ,r0
ld r0 ,#0
ldw @[a13+Index_InputBufferValidData] ,r0
ld r0 ,#2048
ldw @[a13+Index_InputBufferLength] ,r0
ld r0 ,#Area_pcmSamples
sl r0
ldw @[a13+Index_OutputBufferPointerL] ,r0
ld r0 ,#0x20
ldw @[a13+Index_OutputBufferPointerH] ,r0
ld r0 ,#1152*4
ldw @[a13+Index_OutputBufferLength] ,r0
eld a ,#Area_pcmSamples
eld rpd1.index_GptrPcmSamples, a
eld a ,#Area_mpegBitstream
esla a ;because of Calm pointer
eld rpd1.index_GptrNextMainData,a
eld a ,#Area_synthesisBufferCh0
eld rpd1.index_GptrSynPrevious,a
eld b ,#Area_sideInformation+const_sideInformationSize
eld rpd1.index_GptrSideInformation, b
esd0 d0 ,#1
eld a ,#0
;Clear Synthesis 1024-word channel 0&1 buffer
eld rp0 ,#Area_synthesisBufferCh0
ld r6 ,#1024*2-1
sysnth_init
bnzd r6 ,sysnth_init
eld @rp0+d0 ,a
;Clear Imdct previous 512-word channel 0&1 buffer
eld rp0 ,#Area_imdctPrevCh0
ld r6 ,#576*2-1
imdct_init
bnzd r6 ,imdct_init
eld @rp0+d0 ,a
;Clear PCM Data 1152-word channel 0&1 buffer
eld rp0 ,#Area_pcmSamples
ld r6 ,#1152*2-1
pcm_init
bnzd r6 ,pcm_init
eld @rp0+d0 ,a
.ifdef TestMode
push a14
jsr Load_table ;Y-memory table load
pop a14
.endif
ld r0 ,#0 ;indicates initialization end
InitalizeForDecodingReturn
ret
//////////////////////////////////////////////////////////////////////////////////
; rp1 receiving bitstream pointer
//////////////////////////////////////////////////////////////////////////////////
ParsingHeader::
push a14
jsr CheckSyncWord
pop a14
cmp eq ,r0 ,#0
jpf ParsingHeaderSyncError
eld rp0 ,#Area_mpegVariables
ldw r0 ,@[a13+Index_InputBufferRPointerL]
ecld a ,r0
efz8 a
esra a ;set carry-flag
etst nc ,t
eld rp1 ,a
es me1 ;enable rp1 modulo
eld c ,@rp1+s0
esla8 c
eld sr ,c
eld b ,#-16
eld a ,#8
esra8t a
eadd b ,a
esft sr ,a ;align byte
;ID(1):1-bit
;Layer(01):2-bit
eld sa ,#15 ;Sync word(07ffh):11-bit
;ID(XX):2-bit
;Layer(01):2-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld sa ,#1 ;Protection(CRC): 1-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld @rp0+d0 ,sg ;save Protection(CRC)
eld si ,sg ;next using
eld sa ,#4 ;bitrate: 4-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,sg
ecld r0 ,a
/////////////////////////////////////////////
// Multi-CODEC //
// No need to change
/////////////////////////////////////////////
ldb @[a13+Index_BitRate] ,r0 ;save bitrate
eld a ,rpd1.index_Glsf
ecld r1 ,a
cmp eq ,r1 ,#0
brf bitrate_lsf
eld rp3 ,#tbl_bitrate-1
ecld a ,r0
eadd a ,rp3
eld rp3 ,a
eld a ,@rp3
ecld r0 ,a
ecld r1 ,ah
ldw @[a13+Index_FrameBitRate] ,r0
ldw @[a10+Index_BitRateADM+0] ,r1 //High
ldw @[a10+Index_BitRateADM+2] ,r0 //Low
jmp bitrate_lsfEnd
bitrate_lsf
eld rp3 ,#tbl_bitrateLSF-1
ecld a ,r0
eadd a ,rp3
eld rp3 ,a
eld a ,@rp3
ecld r0 ,a
ecld r1 ,ah
ldw @[a13+Index_FrameBitRate] ,r0
ldw @[a10+Index_BitRateADM+0] ,r1 //High
ldw @[a10+Index_BitRateADM+2] ,r0 //Low
bitrate_lsfEnd
eld sa ,#2 ;sampling freq.: 2-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,sg
eld rpd1.index_GOrgSampFreq ,a
/////////////////////////////////////////////
// Multi-CODEC //
// MpegVersion 0 (11172 MP3)
// 44.1Khz 0 -> 4
// 48Khz 1 -> 3
// 32Khz 2 -> 5
// MpegVersion 1 (13818 LSF)
// 22.05Khz 0 -> 7
// 24Khz 1 -> 6
// 16Khz 2 -> 8
// MpegVersion 2 (Mpeg2.5)
// 11.025Khz 0 -> 10
// 12Khz 1 -> 9
// 8Khz 2 -> 11
/////////////////////////////////////////////
eld a ,rpd1.index_LMpegVersion
ecld r0 ,a
cmp eq ,r0 ,#0
brf LSF_sampling
eld a ,sg
ld r1 ,#4
ld r2 ,#0xac44
ecld r0 ,a
cmp eq ,r0 ,#0
brt f10_b
ld r1 ,#3
ld r2 ,#0xbb80
cmp eq ,r0 ,#1
brt f10_b
ld r1 ,#5
ld r2 ,#0x7d00
f10_b
ldb @[a13+Index_SamplingFreq] ,r1 ;save sampling freq.
ldw @[a10+Index_SamplingRate+2] ,r2
jmp Sampling_Branch
LSF_sampling
ecld r0 ,a
cmp eq ,r0 ,#2
brt Mpeg25_sampling
eld a ,sg
ld r1 ,#7
ld r2 ,#0x5622
ecld r0 ,a
cmp eq ,r0 ,#0
brt f20_b
ld r1 ,#6
ld r2 ,#0x5dc0
cmp eq ,r0 ,#1
brt f20_b
ld r1 ,#8
ld r2 ,#0x3e80
f20_b
ldb @[a13+Index_SamplingFreq] ,r1 ;save sampling freq.
ldw @[a10+Index_SamplingRate+2] ,r2
jmp Sampling_Branch
Mpeg25_sampling
eld a ,sg
ld r1 ,#10
ld r2 ,#0x2b11
ecld r0 ,a
cmp eq ,r0 ,#0
brt f30_b
ld r1 ,#9
ld r2 ,#0x2ee0
cmp eq ,r0 ,#1
brt f30_b
ld r1 ,#11
ld r2 ,#0x1f40
f30_b
ldb @[a13+Index_SamplingFreq] ,r1
ldw @[a10+Index_SamplingRate+2] ,r2
Sampling_Branch
ld r2 ,#0
ldw @[a10+Index_SamplingRate] ,r2
eld a ,rpd1.index_Glsf
ecld r1 ,a
cmp eq ,r1 ,#0
brf SFBandLSF
eld a ,#tbl_scfbLong44_1
cmp eq ,r0 ,#0
brt ParsingHeaderPadding
eld a ,#tbl_scfbLong48
cmp eq ,r0 ,#1
brt ParsingHeaderPadding
cmp eq ,r0 ,#2
brf ParsingHeaderFreqError
eld a ,#tbl_scfbLong32
jmp SFBandLSFEnd
SFBandLSF
cmp eq ,r1 ,#2
brt SFBandLSF2_5
eld a ,#tbl_scfbLong22_0LSF
cmp eq ,r0 ,#0
brt ParsingHeaderPadding
eld a ,#tbl_scfbLong24LSF
cmp eq ,r0 ,#1
brt ParsingHeaderPadding
cmp eq ,r0 ,#2
brf ParsingHeaderFreqError
eld a ,#tbl_scfbLong16LSF
jmp SFBandLSFEnd
SFBandLSF2_5
eld a ,#tbl_scfbLong11_0LSF
cmp eq ,r0 ,#0
brt ParsingHeaderPadding
eld a ,#tbl_scfbLong12LSF
cmp eq ,r0 ,#1
brt ParsingHeaderPadding
cmp eq ,r0 ,#2
brf ParsingHeaderFreqError
eld a ,#tbl_scfbLong8LSF
SFBandLSFEnd
ParsingHeaderPadding
eld rpd1.index_GLongSfBandIndex, a
eadd a ,#SizeOfLongToShort+1
eld rpd1.index_GShortSfBandIndex, a
eld sa ,#1 ;padding:1-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -