📄 mp3decnew.s
字号:
CheckSyncWordHeaderGood
ld r3 ,#0
/////////////////////////////////////////////////////
cmp eq ,r5 ,#0010b // layer2
jpt Layer2Sync
//////////////////////////////////////////////////////
cmp eq ,r5 ,#0011b // layer1
jpt Layer1Sync
//////////////////////////////////////////////////////
CheckSyncWordValidEmpty
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
ecld r1 ,ah
cmpu ge ,r0 ,#BitstreamEnd
brf buf_addr_pass
sub r0 ,#0x800
/*
ld e12 ,r1
ld r12 ,r0
//d and r0 ,#SyncMASK //0xf7ff
or r1 ,#0x20
cmp ge ,r1 ,#CBitstreamEnd>>16
brf buf_addr_pass
cmp ge ,r0 ,#CBitstreamEnd
brf buf_addr_pass
sub a12 ,#0x800
ld r0 ,r12
ld r1 ,e12
or r1 ,#0x20
buf_addr_pass
*/
buf_addr_pass
ldw @[a13+Index_InputBufferRPointerL] ,r0
ld r1 ,#0x20
ldw @[a13+Index_InputBufferRPointerH] ,r1
CheckStartSyncWordValidEmpty
eld a ,G_firFrame
ecld r1 ,a
cmp eq ,r1 ,#1
brt NoneFirstFrame
// push a14
// jsr Fill_bufferMP3
// pop a14
eld a ,#1
eld G_firFrame ,a
// jmp CheckSyncWord
NoneFirstFrame
ld r0 ,r3 ;return condition
esec2 #sec_t
ret
Layer2Sync
eld a ,#1
eld GLayerDiff ,a
ld r0 ,#1
esec2 #sec_t
ret
Layer1Sync
eld a ,#2
eld GLayerDiff ,a
ld r0 ,#1
esec2 #sec_t
ret
//CheckSyncWordValidEmptyTest
// jmp CheckSyncWordValidEmpty
//////////////////////////////////////////////////////////////////////////////////
; d In sideinformation save pointer
; rp1 In side_information fetch start pointer
;
//////////////////////////////////////////////////////////////////////////////////
GetSideInformation::
eld rp0 ,#Area_sideInformation+const_sideInformationSize
eld sa ,#9 ;fetch main_data_begin
eld a ,rpd1.index_Glsf
ecld r0 ,a
cmp eq ,r0 ,#0
brt Mp3MainData
eld sa ,#8 ;fetch LSF main_data_begin
Mp3MainData
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,sg
eld rpd1.index_LmainDataBegin, a ;store main_data_begin
eld a ,rpd1.index_GmpegChannel ;a[23:16]<-padding
;a[15:8]<-mode
;a[7:0]<-channel number
ecld r0 ,a
and r0 ,#0xff
cmp eq ,r0 ,#0
brt GetSideInformationSingleChannel
eld sa ,#3 ;fetch private bit for stereo
eld a ,rpd1.index_Glsf
ecld r0 ,a
cmp eq ,r0 ,#0
brt Mp3Private
eld sa ,#2 ;fetch LSF private bit for stereo
Mp3Private
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,rpd1.index_Glsf
ecld r0 ,a
cmp eq ,r0 ,#0
brf GetSideInformationGranule
eld sa ,#8 ;fetch scfi
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,sg
eld rpd1.index_Gscfi, a ;save scfi[7:0]
jmp GetSideInformationGranule
GetSideInformationSingleChannel
eld sa ,#5 ;fetch private bit for mono
eld a ,rpd1.index_Glsf
ecld r0 ,a
cmp eq ,r0 ,#0
brt Mp3PrivateMono
eld sa ,#1 ;fetch LSF private bit for mono
Mp3PrivateMono
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,rpd1.index_Glsf
ecld r0 ,a
cmp eq ,r0 ,#0
brf GetSideInformationGranule
eld sa ,#4 ;fetch scfi[3:0]
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,sg
esla a
esla a
esla a
esla a
eld rpd1.index_Gscfi, a
GetSideInformationGranule
ld r6 ,#01h
eld a ,rpd1.index_GmpegChannel ;a[23:16]<-padding
;a[15:8]<-mode
;a[7:0]<-channel number
eld sa ,#12 ;part2_3_length
ecld r7 ,a
and r7 ,#0xff
GetSideInformationChannelLoop
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch part2_3_length
pop a14
eld @rp0+d0 ,sg
eld sa ,#9 ;big_values
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch big_values
pop a14
eld @rp0+d0 ,sg ;save big_values
eld sa ,#8 ;global_gain
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch global_gain
pop a14
eld a ,sg
esla8 a
esla8 a
eld rpd1.index_LlsfBackA ,a
eld sa ,#4 ;scalefac_compress
eld a ,rpd1.index_Glsf
ecld r0 ,a
cmp eq ,r0 ,#0
brt Mp3Scalefac
eld sa ,#9 ;LSF scalefac_compress
Mp3Scalefac
eld a ,rpd1.index_LlsfBackA
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch scalefac_compress
pop a14
eadd a ,sg
eld @rp0+d0 ,a ;save a
;a[23:16]=global_gain
;a[15:8]=scalefac_compress
;a[7:0]=scalefac_compress
eld sa ,#1 ;window_switching_flag
esft sr ,sa ;fetch window_switching_flag
etst nc ,t
eadd b ,sa
enop
bra ec1 ,bra_bit1 ;ec1 = nc
eld b ,#-16
eld c ,@rp1+s0 ;rp1 += 1
esla8 c
eld sr ,c
bra_bit1
eld a ,sg
ecld r0 ,a
cmp eq ,r0 ,#0
brt GetSideInformationNotSwitching
esla8 a ;a<<=8
eld sa ,#2 ;block_type
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch block_type
pop a14
eadd a ,sg
esla8 a ;a<<=8
eld sa ,#1 ;mixed_block_flag
esft sr ,sa ;fetch mixed_block_flag
eadd b ,sa
enop
bra ec1 ,bra_bit2 ;ec1 = nc
eld b ,#-16
eld c ,@rp1+s0 ;refill sr
esla8 c
eld sr ,c
bra_bit2
eadd a ,sg
eld @rp0+d0 ,a ;save a
;a[23:16]=window_switching_flag
;a[15:8]=block_type
;a[7:0]=mixed_block_flag
ecld r0 ,a ;r0<-block type
srb r0
eld sa ,#5 ;table_select[0]
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch table_select[0]
pop a14
eld a ,sg
esla8 a ;a<<=8
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch table_select[1]
pop a14
eadd a ,sg
esla8 a
eld @rp0+d0 ,a ;save a
;a[23:16]=table_select[0]
;a[15:8]=table_select[1]
;a[7:0]=null zero
eld sa ,#3 ;subblock_gain
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch subblock_gain[0]
pop a14
eld a ,sg
esla8 a
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch subblock_gain[1]
pop a14
eadd a ,sg
esla8 a
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch subblock_gain[2]
pop a14
eadd a ,sg
eld @rp0+d0 ,a ;save a
;a[23:16]=subblock_gain[0]
;a[15:8]=subblock_gain[1]
;a[7:0]=subblock_gain[2]
eld a ,#8
cmp eq ,r0 ,#1
brt block_match
cmp eq ,r0 ,#3
brt block_match
jmp block_matchEnd
block_match
eld a ,#7
block_matchEnd
eld si ,a
esla8 a
eadd a ,#20
esub a ,si ;a<-region0Count|region1Count
jmp GetSideInformationPreflag
GetSideInformationNotSwitching
eld @rp0+d0 ,a ;save with a=0
;a[23:16]=window_switching_flag
;a[15:8]=block_type
;a[7:0]=mixedBlockFlag
eld sa ,#5 ;table_select[0,1,2]
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch table_select[0]
pop a14
eld a ,sg
esla8 a
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch table_select[1]
pop a14
eadd a ,sg
esla8 a
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch table_select[2]
pop a14
eadd a ,sg
eld @rp0+d0 ,a ;save a
;a[23:16]=table_select[0]
;a[15:8]=table_select[1]
;a[7:0]=table_select[2]
eld @rp0+d0 ,a ;save a
;a[23:16]=dummy(sub_block0)
;a[15:8]=dummy(sub_block1)
;a[7:0]=dummy(sub_block2)
eld sa ,#4 ;region0_count
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch region0_count
pop a14
eld a ,sg
esla8 a
eld sa ,#3 ;region1_count
push a14
jsr GetNBitFromBitstreamOnlyMP3 ;fetch region1_count
pop a14
eadd a ,sg
GetSideInformationPreflag
esla8 a ;a<<=8
eld rpd1.index_LlsfBackA ,a
eld a ,rpd1.index_Glsf
ecld r0 ,a
cmp eq ,r0 ,#0
brf LsfPreflag
eld sa ,#1 ;preflag
esft sr ,sa ;fetch preflag
eadd b ,sa
enop
bra ec1 ,bra_bit3 ;ec1 = nc
eld b ,#-16
eld c ,@rp1+s0 ;refill sr with 16-bit
esla8 c
eld sr ,c
bra_bit3
eld a ,rpd1.index_LlsfBackA
eadd a ,sg
eld @rp0+d0 ,a ;save
;a[23:16]=region0_count
;a[15:8]=region1_count
;a[7:0]=preflag
jmp LsfPreflagEnd
LsfPreflag
eld a ,rpd1.index_LlsfBackA
eld @rp0+d0 ,a ;save
;a[23:16]=region0_count
;a[15:8]=region1_count
;a[7:0]=None
LsfPreflagEnd
eld sa ,#1
esft sr ,sa
eadd b ,sa ;scalefac_scale
enop
bra ec1 ,bra_bit4 ;ec1 = nc
eld b ,#-16
eld c ,@rp1+s0 ;refill sr
esla8 c
eld sr ,c
bra_bit4
eld a ,sg
esla8 a ;a<<=8
esft sr ,sa
eadd b ,sa ;count1table_select
enop
bra ec1 ,bra_bit5 ;ec1 = nc
eld b ,#-16
eld c ,@rp1+s0 ;refill sr
esla8 c
eld sr ,c
bra_bit5
eadd a ,sg
eld @rp0+d0 ,a ;save a
;a[23:16]=Null zero
;a[15:8]=scalefac_scale
eld sa ,#12 ;part2_3_length
cmp eq ,r7 ,#0
brfd GetSideInformationChannelLoop
dec r7
eld a ,rpd1.index_Glsf
ecld r0 ,a
cmp eq ,r0 ,#0
brf OneGrannule
eld a ,rpd1.index_GmpegChannel
ecld r7 ,a
and r7 ,#0xff ;a[23:16]<-padding
;a[15:8]<-mode
;a[7:0]<-channel number
cmp eq ,r6 ,#0
brfd GetSideInformationChannelLoop
dec r6
OneGrannule
ret
//////////////////////////////////////////////////////////////////////////////////
;
; d the pointer for saving main data
; main data are modular buffer (1024-size)
; sd1 s1 -1
//////////////////////////////////////////////////////////////////////////////////
FetchMainData::
ecp b ,#-16 ;check whether SR-register is empty
etst z ,t ;next used t-flag
eld a ,rpd1.index_Glsf
ecld r1 ,a
ldw r0 ,@[a13+Index_FrameLength] ;r0<-frame length
ecld b ,r0
efz8 b ;a<-frame size
eld rp2 ,b ;backup-register
cmp eq ,r1 ,#0
brf SideInfoLSF
eld a ,rpd1.index_LmpegCrc ;a[7:0]<-CRC
esla a ;a*=2
eadd a ,#-2
eadd a ,#-(17+4)
ldb r0 ,@[a13+Index_Mode]
cmp eq ,r0 ,#3
brt double_size
eadd a ,#-(32-17)
double_size
eadd a ,b
jmp SideInfoLSFEnd
SideInfoLSF
eld a ,rpd1.index_LmpegCrc ;a[7:0]<-CRC
esla a ;a*=2
eadd a ,#-2 // Opt
eadd a ,#-(9+4)
ldb r0 ,@[a13+Index_Mode]
cmp eq ,r0 ,#3
brt single_ch
eadd a ,#-(17-9)
single_ch
eadd a ,b
SideInfoLSFEnd
eld b ,rp2 ;b<-frame size
eneg b
cmp eq ,r1 ,#0
brf LsfFrameSize
//////////////////////////////////
// 0822 HJI
esra b
//////////////////////////////////
LsfFrameSize
ecld r0 ,b
ldw r5 ,@[a13+Index_InputBufferValidData]
add r0 ,r5
ldw @[a13+Index_InputBufferValidData] ,r0
eld b ,rpd1.index_GptrNextMainData ;destination
ld r0 ,#0x20
ld e12 ,r0
ecld r5 ,b ;a12->destination
ld r12 ,r5
erps rp1+s1 //1999.12.1
er me1 ;disable rp1 modulo
eld b ,rp1
esla b ;because of CalmRISC address
enop
bra ec2 ,FetchMainDataEvenOdd
eadd b ,#1 ;if remained data exits
FetchMainDataEvenOdd
ld r0 ,#0x20 ;a11->source
ld e11 ,r0
ecld r5 ,b
ld r11 ,r5
;r3/idl1<-the pointer of previous bitstreams (scalefactor+huffman code) end per byte-length
;r2/idl0<-the pointer of current frame (header+scalefactor+huffman code), byte-aligned
esub a ,#1
ecld r6 ,a
FetchMainDataLoop
ldb r0 ,@[a11+0]
inc r11
cmp eq ,r11 ,#BitstreamEnd //0x4800
brf pass_src
ld r11 ,#BitstreamStart //0x4000
pass_src
ldb @[a12+0],r0
inc r12
cmp eq ,r12 ,#MainDataEnd //0x4000
brf pass_des
ld r12 ,#MainDataStart //0x3800
pass_des
bnzd r6 ,FetchMainDataLoop
nop
ldw @[a13+Index_InputBufferRPointerL] ,r11 ;source
ld r0 ,#0x20
ldw @[a13+Index_InputBufferRPointerH] ,r0 ;source
eld a ,rpd1.index_GptrNextMainData ;
efz8 b
ld r5 ,r12
ecld b ,r5 ;destination
eld rpd1.index_GptrNextMainData ,b
eld c ,rpd1.index_LmainDataBegin
esub a ,c
ecld r0 ,a
and r0 ,#FetchMASK //0x07ff
or r0 ,#MainDataStart //0x3800
ecld a ,r0
esra a ;c<-even or odd
eld rp1 ,a
es me1 ;enable rp1 modulo
eld c ,@rp1+s0
eld b ,#-16
eld sa ,#0
enop
bra ec1 ,byte_align
eld sa ,#8
byte_align
esla8 c
eld sr ,c
eadd b ,sa
esft sr ,sa
eld rpd1.index_GcopyB ,b ;store b register
eld c ,rp1 ;store rp1 register
eld rpd1.index_GcopyRp1 ,c
eld b ,sr
eld rpd1.index_GcopySr ,b ;store SR register
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CopySideInformation:
esd0 d0 ,#1
esd1 s0 ,#1
ld r6 ,#const_sideInformationSize-1
eld rp0 ,#Area_sideInformation
eld c ,rpd1.index_GptrSideInformation
eld rp1 ,c
sidei_copy
eld a ,@rp1+s0
bnzd r6 ,sidei_copy
eld @rp0+d0 ,a
eld c ,rp1
eld rpd1.index_GptrSideInformation ,c ;update sideInformation pointer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -