📄 decl1lib.s
字号:
eld a ,sg
ecld r0 ,a
cmp eq ,r0 ,#3
brt ParsingHeaderLayerErrorL1
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
//skip for license
cmp eq ,r5 ,#3
brf Layer1Padding4ByteL1
eld c ,sg
esla c
esla c
eadd a ,c
Layer1Padding4ByteL1
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 ,#0x304
brt over_frame_sizeL1
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 CheckSyncWordValidEmptyL1
over_frame_sizeL1
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 ,CheckSyncWordHeaderGoodL1 ;ec0=z-flag
jmp CheckSyncWordHeaderGoodL1
/////////////////
ParsingHeaderLayerErrorL1
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 CheckSyncWordLoopL1
//Valid data in the input buffer are not enough to parse header or decode frame.
CheckSyncWordHeaderGoodL1
ld r3 ,#0
/////////////////////////////////////////////////////
cmp eq ,r5 ,#0001b
jpt Layer3SyncL1
cmp eq ,r5 ,#0010b
jpt Layer2SyncL1
//////////////////////////////////////////////////////
CheckSyncWordValidEmptyL1
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_passL1
sub r0 ,#0x800
buf_addr_passL1
ldw @[a13+Index_InputBufferRPointerL] ,r0
ld r0 ,#0x20
ldw @[a13+Index_InputBufferRPointerH] ,r0
CheckStartSyncWordValidEmptyL1
ld r0 ,r3 ;return condition
ret
Layer3SyncL1
eld a ,#0
eld GLayerDiff ,a
ld r0 ,#1
ret
Layer2SyncL1
eld a ,#1
eld GLayerDiff ,a
ld r0 ,#1
ret
//////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////
SelectTableL1::
eld a ,rpd0.index_GPaddMode
ecld r0 ,a
srb r0
cmp eq ,r0 ,#3
brf next_condi1L1
eld a ,#1
eld rpd0.index_Gnch ,a
eld a ,#32
eld rpd0.index_Gbound ,a
ldw r1 ,@[a13+Index_FrameBitRate] //1010
ecld a ,r1 //1010
efz8 a //1010
eld rpd0.index_Gbitrate ,a //1010
jmp condi_doneL1
next_condi1L1
cmp eq ,r0 ,#1
brf next_condi2L1
eld a ,#2
eld rpd0.index_Gnch ,a
eld a ,rpd0.index_GmodeExt
eadd a ,#1
esla a
esla a
eld rpd0.index_Gbound ,a
ldw r1 ,@[a13+Index_FrameBitRate]
ecld a ,r1
efz8 a
esra a
eld rpd0.index_Gbitrate ,a
jmp condi_doneL1
next_condi2L1
eld a ,#2
eld rpd0.index_Gnch ,a
eld a ,#32
eld rpd0.index_Gbound ,a
ldw r1 ,@[a13+Index_FrameBitRate]
ecld a ,r1
efz8 a
esra a
eld rpd0.index_Gbitrate ,a
condi_doneL1
eld d ,#32
eld rpd0.index_Gsblimit ,d
nop
ret
//////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////
BitAllocationL1::
eld rp0 ,#Area_bitalloc
eld sa ,#4
eld a ,rpd0.index_Gbound // normal
ecld r6 ,a
dec r6
BitAllocLoopInitL1
eld a ,rpd0.index_Gnch
ecld r7 ,a
ld r5 ,r7 // nch backup
dec r7
BitAllocLoopL1
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld @rp0+d0 ,sg // LRLRLR.....
bnzd r7 ,BitAllocLoopL1
nop
bnzd r6 ,BitAllocLoopInitL1
nop
eld a ,rpd0.index_Gbound // intensity
eld c ,rpd0.index_Gsblimit
ecld r0 ,a
ecld r1 ,c
AllocBound_chkL1
cmp eq ,r0 ,r1
brt none_intensityAllocL1
BitAllocIntensityLoopL1
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld @rp0+d0 ,sg // Left Channel
cmp eq ,r5 ,#2
brf mono_allocL1
eld @rp0+d0 ,sg // Right Channel
mono_allocL1
inc r0
bra AllocBound_chkL1
none_intensityAllocL1
ret
//////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////
ScalefactorsL1::
eld rp0 ,#Area_bitalloc
eld rp2 ,#Area_scalefactor0
eld a ,rpd0.index_Gnch
ecld r7 ,a
dec r7
eld sa ,#6
ScalefactorLoopInitL1
eld a ,rpd0.index_Gsblimit
ecld r6 ,a
dec r6
ScalefactorLoopL1
eld a ,@rp0+s0
ecld r1 ,a
cmp eq ,r1 ,#0
brt Scalefactor_zeroL1
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld a ,#tbl_scalefactor
efz8 a
eadd a ,sg
eld rp3 ,a
eld a ,@rp3
eld @rp2+d0 ,a
jmp Scalefactor_zeroEndL1
Scalefactor_zeroL1
eld a ,#0
eld @rp2+d0 ,a
Scalefactor_zeroEndL1
cmp eq ,r6 ,#0
brfd ScalefactorLoopL1
dec r6
cmp eq ,r7 ,#0
brfd ScalefactorLoopInitL1
dec r7
ret
//////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////
DequantizerL1::
eld rp0 ,#Area_bitalloc
eld rp2 ,#Area_scalefactor0
eld a ,rpd0.index_Ggr
eld x0 ,a
eld y0 ,#64
emul x0y0
eld a ,pl
esra a
eadd a ,#Area_fraction
eld rp3 ,a
eld a ,rpd0.index_Gnch
ecld r2 ,a
dec r2
DequantizerLoopInitL1
eld a ,rpd0.index_Gbound // normal
ecld r6 ,a
dec r6
DequantizerLoopL1
eld a ,@rp0+s0
ecld r0 ,a
cmp eq ,r0 ,#0
brt Dequantizer_zeroL1
push a14
jsr DequantizerL1_Sub
pop a14
jmp Dequantizer_zeroEndL1
Dequantizer_zeroL1
eld a ,#0
eld @rp3+d0 ,a
//
erps rp2+s0 // scalefactor address increase
//
Dequantizer_zeroEndL1
cmp eq ,r6 ,#0
brfd DequantizerLoopL1
dec r6
cmp eq ,r2 ,#0
brfd DequantizerLoopInitL1
dec r2
/////////////////////////////////////////////////////////////////
eld a ,rpd0.index_Gbound // intensity
eld c ,rpd0.index_Gsblimit
ecld r2 ,a
ecld r1 ,c
DequanBound_chkL1
cmp eq ,r2 ,r1
brt none_intensityDequanL1
DequanIntensityLoopL1
eld a ,@rp0+s1 // only Left
ecld r0 ,a
cmp eq ,r0 ,#0
brt DequanIntensity_zeroL1
push a14
jsr DequantizerL1_Sub
pop a14
//
erps rp2+s0 // scalefactor address increase
//
eld @rp3+d0 ,ma0 // R
jmp DequanIntensity_zeroEndL1
DequanIntensity_zeroL1
eld a ,#0
eld @rp3+d0 ,a // L
eld @rp3+d0 ,a // R
//
erps rp2+s1 // scalefactor address increase
//
DequanIntensity_zeroEndL1
inc r2
jmp DequanBound_chkL1
none_intensityDequanL1
ret
//////////////////////////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////////////////////////
DequantizerL1_Sub::
eadd a ,#1 // nb
eld sa ,a
esub a ,#1
push a14
jsr GetNBitFromBitstreamOnlyMP3
pop a14
eld rpd1.index_Grpi ,rp1
eld c ,sg // sample
eld x0 ,c
eld c ,#tbl_factor
eadd c ,a
eld rp1 ,c
eld y0 ,@rp1
emul x0y0
emld ma0 ,x0y0
eld d ,#tbl_offset
eadd d ,a
eld rp1 ,d
eld x0 ,@rp1
eld y0 ,#1
emul x0y0
eadd ma0 ,p
esra ma0
eld c ,ma0l
eld y0 ,@rp2+s0 // rp2 -> scalefactor
eld x0 ,c
emul x0y0
emld ma0 ,x0y0
esla ma0
ernd ma0
eld @rp3+d0 ,ma0
eld rp1 ,rpd1.index_Grpi
ret
//////////////////////////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////////////////////////
Separate_channelL1::
eld rp0 ,#Area_fraction
eld rp2 ,#Area_leftChannel
esd0 s0 ,#0
esd2 d0 ,#1
eld d ,#0
ld r7 ,#32-1
Separate_leftInitL1
eld c ,#Area_fraction
eadd c ,d
eld rp0 ,c
eadd d ,#2
ld r6 ,#12-1
Separate_leftL1
eld a ,@rp0+s0
erpn rp0 ,#64
bnzd r6 ,Separate_leftL1
eld @rp2+d0 ,a
bnzd r7 ,Separate_leftInitL1
nop
esd0 s0 ,#1
eld rp0 ,#Area_fraction
eld rp2 ,#Area_rightChannel
esd0 s0 ,#0
esd2 d0 ,#1
eld d ,#0
ld r7 ,#32-1
Separate_rightInitL1
eld c ,#Area_fraction+2
eadd c ,d
eld rp0 ,c
eadd d ,#2
ld r6 ,#12-1
Separate_rightL1
eld a ,@rp0+s0
erpn rp0 ,#64
bnzd r6 ,Separate_rightL1
eld @rp2+d0 ,a
bnzd r7 ,Separate_rightInitL1
nop
esd0 s0 ,#1
ret
//////////////////////////////////////////////////////
// YDMA Load (for mp1 table)
//////////////////////////////////////////////////////
// 0x9f00 (Y-memory block1 )
//////////////////////////////////////////////////////
Load_L1table::
/*
ld r0 ,#0x0
ld a12 ,#YDMACFG
ldb @[a12+0] ,r0
ld r0 ,#0x1d
ld a12 ,#YDMAIADRH
ldb @[a12+0] ,r0
ld r0 ,#0x00
ld a12 ,#YDMAIADRL
ldb @[a12+0] ,r0
ld r0 ,#0x00
ld a12 ,#YDMAEADRX
ldb @[a12+0] ,r0
ld r0 ,#0x6e
ld a12 ,#YDMAEADRH
ldb @[a12+0] ,r0
ld r0 ,#0x80
ld a12 ,#YDMAEADRL
ldb @[a12+0] ,r0
ld r0 ,#0x0
ld a12 ,#YDMANUMH
ldb @[a12+0] ,r0
ld r0 ,#0x6c+48
ld a12 ,#YDMANUML
ldb @[a12+0] ,r0
ld r0 ,#0x50 // block1
ld a12 ,#YDMACOM
ldb @[a12+0] ,r0
nop
nop
nop
%66
ldb r0 ,@[a12+0]
and r0 ,#3
cmp eq,r0 ,#0
brf %b66
*/
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -