📄 mp3decnew.s
字号:
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_ch
eadd a ,#1 ;setting 2-channel
bra_ch
eld @rp0+d0 ,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 @rp0+d0 ,sg ;save sg
;sg[15:8]=null zero
;sg[7:0]=mode_ext
eld sa ,#4
;emphasis
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch copyright,original/copy
pop a14
;emphasis
eld a ,si ;for checking CRC
enop
bra ec0 ,ParsingHeaderNoCRC
eld a ,#16
eld sa ,a ;
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch protection_bit
pop a14
push a14
jsr CheckCRC
pop a14
ParsingHeaderNoCRC
ld r0 ,#0
ldb @[a13+Index_FrameErrorFlag] ,r0 ;indicates "TRUE"
ldb @[a10+Index_DecodeErrFlag] ,r0
ret
ParsingHeaderSyncError
nop
ParsingHeaderFreqError
ld r0 ,#1
ldb @[a13+Index_FrameErrorFlag] ,r0 ;indicates "FALSE"
ldb @[a10+Index_DecodeErrFlag] ,r0
ret
//////////////////////////////////////////////////////////////////////////////////
; sg-register In CRC value
//////////////////////////////////////////////////////////////////////////////////
CheckCRC:
ret
//////////////////////////////////////////////////////////////////////////////////
;
; If a Sync and header data are valid, set the z-flag
; else clear the z-flag
;
; rp0 valid data size
; MA[47:24] rp0's backup
; P[47:24] for MA++
; x0 temporary buffer
; y0 read buffer pointer
;
//////////////////////////////////////////////////////////////////////////////////
CheckSyncWord:
esec2 #sec_z
ld r3 ,#1 ;indicates "FALSE"
eld c ,#tbl_mainDataSize
eld rp2 ,c
eld a ,rpd1.index_Glsf
ecld r0 ,a
cmp eq ,r0 ,#0
brt NoneLsfSize
eld c ,#tbl_mainDataSizeLSF
eld rp2 ,c
cmp eq ,r0 ,#1
brt NoneLsfSize
eld c ,#tbl_mainDataSizeLSF2
eld rp2 ,c
NoneLsfSize
eld sd0 ,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(1<<0) ;initialize post-modified value
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
CheckSyncWordLoop
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 CheckSyncWordValidEmpty ;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
SearchSyncWordLoop
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 ec2 ,ParsingHeaderData ;ec2=z-flag
ecld r0 ,a
cmp eq ,r0 ,#0xffe
brt ParsingHeaderData2_5
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 CheckSyncWordValidEmpty
eld a ,x0
ecld r0 ,a
cmpu ge ,r0 ,#0
brf CheckSyncWordValidEmpty
jmp SearchSyncWordLoop
ParsingHeaderData
eld rpd1.index_Lsync ,a
eld sa, #1
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;ID(0) LSF / ID(1) MP3
pop a14
eld a ,sg //1010
eld rpd1.index_LID ,a
eld a ,#0
eld rpd1.index_LMpegVersion ,a
eld rpd1.index_Glsf ,a ; MPEG1 MP3
eld c ,#tbl_mainDataSize
eld rp2 ,c
eld a ,sg
ecld r0 ,a
cmp eq ,r0 ,#0
brf NoneLSF
eld a ,#1
eld rpd1.index_Glsf ,a ; MPEG2 LSF
eld c ,#tbl_mainDataSizeLSF
eld rp2 ,c
eld rpd1.index_LMpegVersion ,a
NoneLSF
jmp Chk_IDEnd
ParsingHeaderData2_5
eld rpd1.index_Lsync ,a
eld sa, #1
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;ID(0) Mpeg 2.5
pop a14
eld a ,sg
eld rpd1.index_LID ,a
eld a ,#2
eld rpd1.index_Glsf ,a ; MPEG2 2.5
eld c ,#tbl_mainDataSizeLSF2
eld rp2 ,c
eld rpd1.index_LMpegVersion ,a
Chk_IDEnd
eld sa ,#2 ;Layer:2-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,sg
ecld r0 ,a
cmp eq ,r0 ,#0
brt ParsingHeaderLayerError
eld a ,sg
eld rpd1.index_Llayer ,a
ecld r5 ,a ;r5 -> layer
//////////////////////////////////////////////////
cmp eq ,r5 ,#1
brt layer3_pass
eld a ,rpd1.index_Glsf
ecld r4 ,a
cmp eq ,r4 ,#0
brf Lsf_LowLayer
cmp eq ,r5 ,#2
brf Layer1_frame
eld rp2 ,#tbl_FrameSizeL2
jmp layer3_pass
Layer1_frame
eld rp2 ,#tbl_FrameSizeL1
jmp layer3_pass
Lsf_LowLayer
cmp eq ,r5 ,#2
brf Layer1_frameLsf
eld rp2 ,#tbl_FrameSizeLSFL2
jmp layer3_pass
Layer1_frameLsf
eld rp2 ,#tbl_FrameSizeLSFL1
layer3_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 ParsingHeaderLayerError
cmp eq ,r0 ,#15
brt ParsingHeaderLayerError
eld si ,sg
eld sa ,#2 ;sampling freq.: 2-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,sg
eld rpd1.index_Lsamp ,a
ecld r0 ,a
cmp eq ,r0 ,#3
brt ParsingHeaderLayerError
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
eld a ,@rp3 ;a<-(frame size-padding)
eld sa ,#1 ;padding:1-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
//skip for license
cmp eq ,r5 ,#3
brf Layer1Padding4Byte
eld c ,sg
esla c
esla c
eadd a ,c
Layer1Padding4Byte
// eadd a ,sg ;a<-frame size
ecld r0 ,a
ldw @[a13+Index_FrameLength] ,r0 ;frame size
eld x0 ,a ;x0:temporary buffer
// for invalid frame size
// cmp gt ,r0 ,#0x5a0
// brt over_frame_size
push a14
jsr CheckFrameSize
pop a14
cmp eq ,r1 ,#0
brt over_frame_size
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 CheckSyncWordValidEmpty
// brf CheckSyncWordValidEmptyTest
over_frame_size
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
.if(1)
ecp a ,sg
enop
bra ec2 ,HeaderGoodJMP ;ec2=z-flag
eld a ,#0xffe
ecp a ,sg
enop
bra ec2 ,HeaderGoodJMP ;ec2=z-flag
jmp sec_padding_chk
HeaderGoodJMP
////////
// for Layer1
// cmp eq ,r5 ,#3
// brt CheckSyncWordHeaderGood
////////
enmsk sg ,#4
eld a ,sg
esla8 a
eld sa ,#8
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eadd a ,sg
eld c ,#0xfff
ecp a ,c
// bra ec2 ,padding_process ;ec2=z-flag
enop
bra ec2 ,rangeCoverPadd ;ec2=z-flag
eld c ,#0xffe
ecp a ,c
// bra ec2 ,padding_process ;ec2=z-flag
enop
bra ec2 ,rangeCoverPadd ;ec2=z-flag
/*
/////////////////////////
;ID(0) LSF / ID(1) MP3
ecld r1 ,a
ld r0 ,r1
srb r0
sr r0
sr r0
sr r0
eld c ,rpd1.index_LID
ecld r2 ,c
cmp eq ,r0 ,r2
brf ParsingHeaderLayerError
;Layer(01):2-bit
ld r0 ,r1
srb r0
sr r0
sr r0
and r0 ,#0x3
cmp eq ,r0 ,#0
brt ParsingHeaderLayerError
eld c ,rpd1.index_Llayer
ecld r2 ,c
cmp eq ,r0 ,r2
brf ParsingHeaderLayerError
;bitrate: 4-bit
ld r0 ,r1
sr r0
sr r0
sr r0
sr r0
and r0 ,#0xf
cmp eq ,r0 ,#0
brt ParsingHeaderLayerError
cmp eq ,r0 ,#15
brt ParsingHeaderLayerError
;sampling freq.: 2-bit
ld r0 ,r1
sr r0
sr r0
and r0 ,#0x3
cmp eq ,r0 ,#3
brt ParsingHeaderLayerError
eld c ,rpd1.index_Lsamp
ecld r2 ,c
cmp eq ,r0 ,r2
brf ParsingHeaderLayerError
///////////////////////
*/
cmp eq ,r5 ,#1
brf ParsingHeaderLayerError
// cmp eq ,r5 ,#3
// brt ParsingHeaderLayerError
// cmp eq ,r5 ,#2
// brt ParsingHeaderLayerError
jmp CheckSyncWordHeaderGood
rangeCoverPadd
jmp padding_process
sec_padding_chk
enmsk sg ,#4
eld a ,sg
esla8 a
eld sa ,#8
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eadd a ,sg
eld c ,#0xfff
ecp a ,c
enop
bra ec2 ,padding_process ;ec2=z-flag
eld c ,#0xffe
ecp a ,c
enop
bra ec2 ,padding_process ;ec2=z-flag
jmp ParsingHeaderLayerError
padding_process
// second sync verify
// eld a ,sg
// eld c ,rpd1.index_Lsync
// ecp a ,c
// bra ec0 ,ParsingHeaderLayerError
eld sa ,#1
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;ID(0) LSF / ID(1) MP3
pop a14
eld a ,sg
eld c ,rpd1.index_LID
ecp a ,c
enop
bra ec0 ,ParsingHeaderLayerError
eld sa ,#2 ;Layer(01):2-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;01
pop a14
eld a ,sg
enop
bra ec2 ,ParsingHeaderLayerError
eld c ,rpd1.index_Llayer
ecp a ,c
enop
bra ec0 ,ParsingHeaderLayerError
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
enop
bra ec2 ,ParsingHeaderLayerError
ecp a ,#15
enop
bra ec2 ,ParsingHeaderLayerError
eld sa ,#2 ;sampling freq.: 2-bit
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,sg
ecp a ,#3
enop
bra ec2 ,ParsingHeaderLayerError
eld c ,rpd1.index_Lsamp
ecp a ,c
enop
bra ec0 ,ParsingHeaderLayerError
/////////////////////////////////////////
ldw r0 ,@[a13+Index_FrameLength] ;frame size
add r0 ,#1
ldw @[a13+Index_FrameLength] ,r0
jmp CheckSyncWordHeaderGood
.endif
ParsingHeaderLayerError
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 CheckSyncWordLoop
//Valid data in the input buffer are not enough to parse header or decode frame.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -