?? decl2lib.s
字號:
//////////////////////////////////////////////////////////////////////////////////
; The following program will decoding Layer2 bitstream
; by S/W Algorithm (for C-PAD3)
; File Name: DecL2lib.s
; copyright ji,Han 2001.8.7
;
; profile
//////////////////////////////////////////////////////////////////////////////////
.include "mp3_def.h"
.include "mp3_ext.h"
.include "mp12_def.h"
.include "mp12_ext.h"
//.include "t_mp12dec.h"
//.include "CPAD3.REG"
.extern GetNBitFromBitstreamOnlyMP3,tbl_bitrateLSF
.extern G_cnt
.extern primL2_cod,ancL2_cod,ancL1_cod
MP3DecL2libSection
//////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////
InitalizeForL2Decoding::
eld a ,#Area_L2Variables
eld rpd0 ,a
// eld a ,#Area_mpegVariables
// eld rpd1 ,a
eld a ,#0x0250
eld msr2 ,a
// eld a ,#1
// eld rpd1.index_GranuleLoop ,a
eld sd0 ,#((1&0fh)<<12)|(1<<8)|((2&0fh)<<4)|(1<<0)
eld sd1 ,#((1&0fh)<<12)|(1<<8)|((2&0fh)<<4)|(1<<0)
eld sd2 ,#((1&0fh)<<12)|(1<<8)|((2&0fh)<<4)|(1<<0)
eld sd3 ,#((1&0fh)<<12)|(1<<8)|((2&0fh)<<4)|(1<<0)
// eld a ,GL2Done
// ecp a ,#1
// bra ec0 ,InitalizeForL2DecodingReturn
//d ldb r0 ,@[a13+Index_GL2Done]
ldw r0 ,@[a10+Index_pParameterH]
ld e12 ,r0
ldw r0 ,@[a10+Index_pParameterL]
ld r12 ,r0
ldb r0 ,@[a12+Index_P_GL2Done]
cmp eq ,r0 ,#1
brt InitalizeForL2DecodingReturn
eld a ,#Area_pcmSamples
eld rpd1.index_GptrPcmSamples, a
eld a ,#Area_synthesisBufferCh0
eld rpd1.index_GptrSynPrevious,a
eld a ,#0
eld G_cnt ,a
ld r0 ,#1
//d ldb @[a13+Index_GL2Done] ,r0
ldb @[a12+Index_P_GL2Done] ,r0
ld r0 ,#0x7f
ld r1 ,#0xffff
ecld ah ,r0
ecld a ,r1
eld rpd0.index_Gp1 ,a
ld r0 ,#0x80
ld r1 ,#0x0000
ecld ah ,r0
ecld a ,r1
eld rpd0.index_Gm1 ,a
// push a14
// jsr Load_L2table
// pop a14
InitalizeForL2DecodingReturn
ret
//////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////
ParsingHeaderL2::
push a14
jsr CheckSyncWordL2
pop a14
cmp eq ,r0 ,#0
jpf ParsingHeaderSyncErrorL2
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
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 a ,sg
eld rpd0.index_GCRC ,a ;save Protection(CRC)
eld si ,a ;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 bitrateL2_lsf
eld rp3 ,#tbl_bitrateL2-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 bitrateL2_lsfEnd
bitrateL2_lsf
eld rp3 ,#tbl_bitrateLSF-1
ecld a ,r0
eadd a ,rp3
// eadd a ,#y_base
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
bitrateL2_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_Glsf
ecld r0 ,a
cmp eq ,r0 ,#1
brt LSF_samplingL2
eld a ,sg
ld r1 ,#4
ld r2 ,#0xac44
ecld r0 ,a
cmp eq ,r0 ,#0
brt f10_bL2
ld r1 ,#3
ld r2 ,#0xbb80
cmp eq ,r0 ,#1
brt f10_bL2
ld r1 ,#5
ld r2 ,#0x7d00
f10_bL2
ldb @[a13+Index_SamplingFreq] ,r1 ;save sampling freq.
ldw @[a10+Index_SamplingRate+2] ,r2
jmp Sampling_BranchL2
LSF_samplingL2
eld a ,sg
ld r1 ,#7
ld r2 ,#0x5622
ecld r0 ,a
cmp eq ,r0 ,#0
brt f20_bL2
ld r1 ,#6
ld r2 ,#0x5dc0
cmp eq ,r0 ,#1
brt f20_bL2
ld r1 ,#8
ld r2 ,#0x3e80
f20_bL2
ldb @[a13+Index_SamplingFreq] ,r1 ;save sampling freq.
ldw @[a10+Index_SamplingRate+2] ,r2
Sampling_BranchL2
eld sa ,#1 ;padding:1-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,sg
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch private_bit
pop a14
esla8 a
eld sa ,#2 ;mode: 2-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eadd a ,sg
esla8 a
ecld r0 ,a
srb r0
ldb @[a13+Index_Mode] ,r0
cmp eq ,r0 ,#const_mono ;check mode
brt bra_chL2
eadd a ,#1 ;setting 2-channel
bra_chL2
eld rpd0.index_GPaddMode,a ;save a
;a[23:16]=padding
;a[15:8]=mode
;a[7:0]=channel number
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch mode_ext
pop a14
eld a ,sg
eld rpd0.index_GmodeExt ,a ;save sg
;sg[15:8]=null zero
;sg[7:0]=mode_ext
eld sa ,#4
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch copyright,original/copy
pop a14
;emphasis
eld a ,si ;for checking CRC
/// bra ec0 ,ParsingHeaderNoCRCL2
ecld r4 ,a
cmp eq ,r4 ,#0
brf ParsingHeaderNoCRCL2
eld a ,#16
eld sa ,a ;
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch CRC
pop a14
push a14
jsr CheckCRCL2
pop a14
ParsingHeaderNoCRCL2
/*
///////////////////////////////////////////////////////////
// read frame count
///////////////////////////////////////////////////////////
ldw r2 ,@[a13+Index_FrameLength] ;r0<-frame length
ldw r3 ,@[a13+Index_InputBufferValidData]
sub r3 ,r2
ldw @[a13+Index_InputBufferValidData] ,r3
ldw r3 ,@[a13+Index_InputBufferRPointerL] ;source
add r3 ,r2
and r3 ,#0x07ff
or r3 ,#0x4000
ldw @[a13+Index_InputBufferRPointerL] ,r3 ;source
ld r3 ,#0x20
ldw @[a13+Index_InputBufferRPointerH] ,r3 ;source
///////////////////////////////////////////////////////////
*/
ld r0 ,#0
ldb @[a13+Index_FrameErrorFlag] ,r0 ;indicates "TRUE"
ldb @[a10+Index_DecodeErrFlag] ,r0
ret
ParsingHeaderSyncErrorL2
nop
ParsingHeaderFreqErrorL2
ld r0 ,#1
ldb @[a13+Index_FrameErrorFlag] ,r0 ;indicates "FALSE"
ldb @[a10+Index_DecodeErrFlag] ,r0
ret
//////////////////////////////////////////////////////////////////////////////////
; sg-register In CRC value
//////////////////////////////////////////////////////////////////////////////////
CheckCRCL2:
ret
//////////////////////////////////////////////////////////////////////////////////
//
//
// rp0 valid data size
// MA[47:24] rp0's backup
// P[47:24] for MA++
// x0 temporary buffer
// y0 read buffer pointer
//
//////////////////////////////////////////////////////////////////////////////////
CheckSyncWordL2:
ld r3 ,#1 ;indicates "FALSE"
eld sd0 ,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(1<<0) ;initialize post-modified value
eld rp2 ,#tbl_FrameSizeL2
eld sd1 ,sd0
eld a ,#1
eld p ,a
ldw r0 ,@[a13+Index_InputBufferValidData]
ecld a ,r0
efz8 a
eld rp0 ,a ;valid data size
eld ma0 ,a
ldw r0 ,@[a13+Index_InputBufferRPointerL]
ecld a ,r0
efz8 a
eld y0 ,a ;read pointer
CheckSyncWordLoopL2
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
eld a ,ma0
ecld r5 ,a
cmpu ge ,r5 ,#4
brf CheckSyncWordValidEmptyL2 ;ec1=nc,check if valid data>=4-byte(header size)
eld sa, #4 ;Sync word(0fffh):12-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld sa ,#8
eld a ,sg
SearchSyncWordLoopL2
esla8 a
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eadd a ,sg
eld sg ,a
enmsk sg, #12
eld a ,sg
ecp a, #0xfff ;compare A with Sync.word
enop
bra ec0 ,ParsingHeaderDataL2 ;ec0=z-flag
eld x0 ,a
esub ma0 ,p ;valid size--
eld a ,ma0 ;MAH<-the size of valid data
ecld r0 ,a
cmpu ge ,r0 ,#4
brf CheckSyncWordValidEmptyL2
eld a ,x0
ecld r0 ,a
cmpu ge ,r0 ,#0
brf CheckSyncWordValidEmptyL2
jmp SearchSyncWordLoopL2
ParsingHeaderDataL2
eld sa ,#1
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;ID(0) LSF / ID(1) MP3
pop a14
eld a ,#0
eld rpd1.index_LMpegVersion ,a
eld rpd1.index_Glsf ,a ; MPEG1 MP3
eld rp2 ,#tbl_FrameSizeL2
eld a ,sg
ecld r0 ,a
cmp eq ,r0 ,#0
brf NoneLSFL2
eld a ,#1
eld rpd1.index_Glsf ,a ; MPEG2 LSF
eld rp2 ,#tbl_FrameSizeLSFL2
eld rpd1.index_LMpegVersion ,a
NoneLSFL2
eld sa ,#2 ;Layer(01):2-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;01
pop a14
eld a ,sg
ecld r0 ,a
cmp eq ,r0 ,#0
brt ParsingHeaderLayerErrorL2
// eld a ,sg
ecld r5 ,a
//////////////////////////////////////////////////
cmp eq ,r5 ,#2
brt layer2_pass
eld a ,rpd1.index_Glsf
ecld r4 ,a
cmp eq ,r4 ,#0
brf Lsf_LowLayerL2
cmp eq ,r5 ,#1
brf Layer1_frameL2
eld rp2 ,#tbl_mainDataSize
jmp layer2_pass
Layer1_frameL2
eld rp2 ,#tbl_FrameSizeL1
jmp layer2_pass
Lsf_LowLayerL2
cmp eq ,r5 ,#1
brf Layer1_frameLsfL2
eld rp2 ,#tbl_mainDataSizeLSF
jmp layer2_pass
Layer1_frameLsfL2
eld rp2 ,#tbl_FrameSizeLSFL1
layer2_pass
//////////////////////////////////////////////////
eld sa ,#1 ;Protection(CRC): 1-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld sa ,#4 ;bitrate: 4-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,sg
ecld r0 ,a
cmp eq ,r0 ,#0
brt ParsingHeaderLayerErrorL2
cmp eq ,r0 ,#15
brt ParsingHeaderLayerErrorL2
eld si ,sg
eld sa ,#2 ;sampling freq.: 2-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,sg
ecld r0 ,a
cmp eq ,r0 ,#3
brt ParsingHeaderLayerErrorL2
esla a
esla a
esla a
esla a ;a*=4
eadd a ,si
eadd a ,rp2 ;rp2:table of main Data Size
eld rp3 ,a
//Mp3_FrameSize
eld a ,@rp3 ;a<-(frame size-padding)
//Mp3_FrameSizeEnd
eld sa ,#1 ;padding:1-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eadd a ,sg ;a<-frame size
ecld r0 ,a
ldw @[a13+Index_FrameLength] ,r0 ;frame size
cmp eq ,r0 ,#1728
brt CheckSyncWordHeaderGoodL2
eld x0 ,a ;x0:temporary buffer
// for invalid frame size
cmp gt ,r0 ,#0x6c1
brt over_frame_sizeL2
eld a ,ma0
esub a ,x0 ;a<-(valid data size)-(frame size)
esub a ,#3 ;a<-(valid data size)-(frame size)-3
ecld r0 ,ah
cmp ge ,r0 ,#0
brf CheckSyncWordValidEmptyL2
over_frame_sizeL2
eld a ,rp0 ;rp0:first read pointer
esub a ,ma0
eadd a ,y0 ;a<-next read pointer
eadd a ,x0
eld sg ,a
enmsk sg ,#11
eld a ,sg ;the content of A is modulo-value
eadd a ,#StartReadPointer ;Be causious !!!!
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
eld a ,#0xfff ;a<-y1(#0xfff)
eld sa ,#12 ;Sync word(0fffh):12-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
ecp a ,sg
enop
bra ec0 ,CheckSyncWordHeaderGoodL2 ;ec0=z-flag
// jmp CheckSyncWordHeaderGoodL2
ParsingHeaderLayerErrorL2
esub ma0 ,p
eld a ,rp0 ;rp0:first read pointer
esub a ,ma0
eadd a ,y0 ;a<-next read pointer
eld sg ,a
enmsk sg ,#11
eld a ,sg ;the content of A is modulo-value
eadd a ,#StartReadPointer ;Be causious !!!!
efz8 a
jmp CheckSyncWordLoopL2
//Valid data in the input buffer are not enough to parse header or decode frame.
CheckSyncWordHeaderGoodL2
ld r3 ,#0
/////////////////////////////////////////////////////
cmp eq ,r5 ,#0001b
jpt Layer3SyncL2
cmp eq ,r5 ,#0011b
jpt Layer1SyncL2
//////////////////////////////////////////////////////
CheckSyncWordValidEmptyL2
eld a ,ma0
ecld r0 ,a
ldw @[a13+Index_InputBufferValidData] ,r0
eneg a
eadd a ,rp0 ;a<-used data size
eadd a ,y0 ;a<-next read pointer
ecld r0 ,a
cmpu ge ,r0 ,#BitstreamEnd
brf buf_addr_passL2
sub r0 ,#0x800
buf_addr_passL2
ldw @[a13+Index_InputBufferRPointerL] ,r0
ld r0 ,#0x20
ldw @[a13+Index_InputBufferRPointerH] ,r0
CheckStartSyncWordValidEmptyL2
ld r0 ,r3 ;return condition
ret
Layer3SyncL2
eld a ,#0
eld GLayerDiff ,a
ld r0 ,#1
ret
Layer1SyncL2
eld a ,#2
eld GLayerDiff ,a
ld r0 ,#1
ret
//////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////
SelectTableL2::
eld a ,rpd0.index_GPaddMode
ecld r0 ,a
srb r0
cmp eq ,r0 ,#3
brf next_condi1
eld a ,#1
eld rpd0.index_Gnch ,a
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -