?? stereo.s
字號:
;-----------------------------------------------------------
; The following program will decoding MP3 bitstream
; by S/W Algorithm
; File Name: stereo_up.s
; copyright ji,Han 2000.11.28
;
;-----------------------------------------------------------
.include "mp3_def.h"
.include "mp3_ext.h"
MP3SteteoSection
DecodingStereoLSF::
ldb r0 ,@[a13+Index_Mode]
cmp eq ,r0 ,#const_jointStereo ;(01)
brt conti_st
ret
conti_st
eld sd0, #((-1&0fh)<<12)|(0<<8)|((-1&0fh)<<4)|(0<<0)
eld sd1, #((-1&0fh)<<12)|(0<<8)|((-1&0fh)<<4)|(0<<0)
eld sd2, #((1&0fh)<<12)|(0<<8)|((1&0fh)<<4)|(0<<0)
eld sd3, #((1&0fh)<<12)|(0<<8)|((1&0fh)<<4)|(0<<0)
eld b ,rpd1.index_GmpegModeExt ;b[23:8]<-Zero
;b[7:0]<-mode extension
eld sg ,b
enmsk sg ,#1
eld a ,sg
eld rpd1.index_LiStereo ,a
esra b
eld rpd1.index_LmsStereo ,b
eld a ,#576
eld rpd1.index_Lbound ,a
// intensity stereo
eld a ,rpd1.index_LiStereo
ecld r0 ,a
cmp eq ,r0 ,#0
brt NotiStereo
eld a ,d
eld rpd1.index_LsfbL ,a
eld c ,rpd1.index_GLongSfBandIndex
eadd a ,c
eld rp3 ,a
eld a ,@rp3
eld rpd1.index_Lbound ,a
eld a ,#0
eld rpd1.index_Lf ,a
eld rpd1.index_Lw ,a
eld rpd1.index_Ln ,a
eld a ,rpd0.index_scalefacCompress+8
eld sg ,a
enmsk sg ,#1
eld a ,sg
ecld r0 ,a
cmp eq ,r0 ,#0
brt io_type
eld a ,#tbl_stereoLsfTable2+3
eld rpd1.index_LstereoLeftRight ,a ;backup
jmp NonLSFStereo
io_type
eld a ,#tbl_stereoLsfTable2
eld rpd1.index_LstereoLeftRight ,a ;backup
NonLSFStereo
eld b ,rpd0.index_blockType
ecld r0 ,b
srb r0
cmp eq ,r0 ,#2
brt Short_Process
eld a ,#7
eld rpd1.index_LisPos ,a
esec0 #1
esec1 #3
esec2 #2
eld a ,rpd1.index_Lbound
eld rpd1.index_LloopCounti2 ,a
BoundForLoop
eld a ,rpd1.index_LloopCounti2
ecld r4 ,a
cmp ge ,r4 ,#576
brt BoundForLoopEnd
ecp a ,#576
enop
bra ec0 ,LoopPass
jmp BoundForLoopEnd
LoopPass
eld a ,rpd1.index_Lf
ecld r4 ,a
cmp eq ,r4 ,#0
brf fCount
// long blocks
eld b ,rpd1.index_Glsf
ecld r1 ,b
cmp eq ,r1 ,#0
brf LSFBitrate2
eld b ,rpd1.index_GOrgSampFreq
jmp LSFBitrateEnd2
LSFBitrate2
eld b ,rpd1.index_GOrgSampFreq
eadd b ,#3
LSFBitrateEnd2
eld x0 ,b
eld y0 ,#22
emul x0y0
eld b ,pl
esra b
eadd b ,#tbl_sfwidth_l
eld c ,rpd1.index_LsfbL
eadd b ,c
eld rp3 ,b
eld b ,@rp3+s0
// esub b ,#1
eld rpd1.index_Lf ,b
eld b ,rpd1.index_Glsf
ecld r0 ,b
cmp eq ,r0 ,#2
brf pass_mpeg25L2
eld b ,rpd1.index_GLongSfBandIndex
eld c ,rpd1.index_LsfbL
eadd b ,c
eadd b ,#1
eld rp0 ,b
eld b ,@rp0+s1
eld c ,@rp0+s0
esub b ,c
eld rpd1.index_Lf ,b
pass_mpeg25L2
eld b ,#Area_Scalefactor
eadd b ,#SizeOfScalefactor
eld c ,rpd1.index_LsfbL
eadd b ,c
eld rp3 ,b
eld b ,@rp3+s0
eld rpd1.index_LisPos ,b
eld b ,rpd1.index_LsfbL
eadd b ,#1
eld rpd1.index_LsfbL ,b
jmp fCountEnd
fCount
eld a ,rpd1.index_Lf
esub a ,#1
eld rpd1.index_Lf ,a
fCountEnd
eld b ,#Area_leftChannel
eld c ,rpd1.index_LloopCounti2
eadd b ,c
eld rp0 ,b
eld b ,#Area_rightChannel
eld c ,rpd1.index_LloopCounti2
eadd b ,c
eld rp1 ,b
eld a ,rpd1.index_LisPos
ecld r0 ,a
cmp ge ,r0 ,#7
brt isPosOver
eld c ,#tbl_isTable+6
eld rp2 ,c
eld x0 ,@rp0+s0
eld a ,rpd1.index_Glsf
ecld r0 ,a
cmp eq ,r0 ,#0
brt NonLsfStereo
eld a ,rpd1.index_LisPos
eld sr ,a
eld b ,sr
enop
bra ec0 ,PassIntensityUp ;ec0=nz
eld y0 ,@rp2+s0
emul x0y0
emld ma0 ,x0y0
ernd ma0
eld @rp0+d0 ,ma0
eld @rp1+d0 ,ma0
jmp NoneMSstereo
PassIntensityUp
eld sg ,sr
enmsk sg ,#1
eld b ,sg
enop
bra ec0 ,kr_intensityUp ;ec0=nz
eld b ,sr ;b<-is_pos[sfb]
// esub b ,#1
esra b
eld c ,rpd1.index_LstereoLeftRight
eadd b ,c ;b+=tbl_stereoLeftRight
eld rp3, b
eld y1 ,@rp3+s0
emul x0y1
emld ma0 ,x0y1
ernd ma0
eld @rp1+d0 ,ma0
eld y0 ,@rp2+s0
emul x0y0
emld ma0 ,x0y0
ernd ma0
eld @rp0+d0 ,ma0
jmp NoneMSstereo
kr_intensityUp
eld b ,sr ;b<-is_pos[sfb]
esub b ,#1
esra b
eld c ,rpd1.index_LstereoLeftRight ;b+=tbl_stereoLeftRight
eadd b ,c
eld rp3, b
eld y0 ,@rp3+s0
emul x0y0
emld ma0 ,x0y0
ernd ma0
eld @rp0+d0 ,ma0
eld y0 ,@rp2+s0
emul x0y0
emld ma0 ,x0y0
ernd ma0
eld @rp1+d0 ,ma0
jmp NoneMSstereo
NonLsfStereo
eld a ,rpd1.index_LisPos
eadd a ,#tbl_isTable
eld rp3 ,a
eld y0 ,@rp3+s0
eld b ,#6
eld c ,rpd1.index_LisPos
esub b ,c
eadd b ,#tbl_isTable
eld rp3 ,b
eld y1 ,@rp3+s0
emul x0y0
emld ma0 ,x0y0
ernd ma0
eld @rp0+d0 ,ma0
emul x0y1
emld ma0 ,x0y1
ernd ma0
eld @rp1+d0 ,ma0
jmp NoneMSstereo
NonLsfStereoEnd
isPosOver
eld b ,rpd1.index_LmsStereo
ecld r0 ,b
cmp eq ,r0 ,#0
brt NoneMSstereo
ld r0 ,#0x827a
ecld c ,r0
ld r0 ,#0x5a
ecld ch ,r0
eld y0 ,c
eld a ,@rp0+s0
eld c ,@rp1+s0
eadd a ,c
eld x0 ,a
eld a ,@rp0+s0
eld c ,@rp1+s0
esub a ,c
eld x1 ,a
emul x0y0
emld ma0 ,x1y0
ernd ma0
eld @rp0+d0 ,ma0
emld ma0 ,x1y0
ernd ma0
eld @rp1+d0 ,ma0
NoneMSstereo
eld a ,rpd1.index_LloopCounti2
eadd a ,#1
eld rpd1.index_LloopCounti2 ,a
jmp BoundForLoop
BoundForLoopEnd
NotiStereo
// middle/side stereo
eld a ,rpd1.index_LmsStereo
ecld r0 ,a
cmp eq ,r0 ,#0
brt NotmsStereo
esec0 #0
eld a ,rpd1.index_Lbound
eld rpd1.index_LloopCounti2 ,a
eld b ,#Area_leftChannel-1
eld c ,rpd1.index_LloopCounti2
eadd b ,c
eld rp0 ,b
eld b ,#Area_rightChannel-1
eld c ,rpd1.index_LloopCounti2
eadd b ,c
eld rp1 ,b
ld r0 ,#0x827a
ecld c ,r0
ld r0 ,#0x5a
ecld ch ,r0
eld y0 ,c
BoundWhileLoop
eld a ,rpd1.index_LloopCounti2
ecp a ,#0
enop
bra ec0 ,BoundWhileLoopEnd
eld a ,@rp0+s0
eld c ,@rp1+s0
eadd a ,c
eld x0 ,a
eld a ,@rp0+s0
eld c ,@rp1+s0
esub a ,c
eld x1 ,a
emul x0y0
emld ma0 ,x1y0
ernd ma0
eld @rp0+d1 ,ma0
emld ma0 ,x1y0
ernd ma0
eld @rp1+d1 ,ma0
eld a ,rpd1.index_LloopCounti2
esub a ,#1
eld rpd1.index_LloopCounti2 ,a
jmp BoundWhileLoop
BoundWhileLoopEnd
NotmsStereo
eld sd0 ,#((-2&0fh)<<12)|(2<<8)|((-1&0fh)<<4)|(1<<0)
eld sd1 ,#((-1&0fh)<<12)|(-2<<8)|((-1&0fh)<<4)|(1<<0)
eld sd2 ,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(0<<0)
eld sd3 ,#((-1&0fh)<<12)|(1<<8)|((-3&0fh)<<4)|(7<<0)
esec0 #1
esec1 #5
esec2 #0x0f
ret
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
Short_Process
esd0 d0 ,#1
esd1 d0 ,#1
esd0 d1 ,#1
esd1 d1 ,#1
esec0 #0
esec1 #1
esec2 #2
eld a ,#0
eld rpd1.index_Lf ,a
eld rpd1.index_Lw ,a
eld rpd1.index_Ln ,a
ShortWindowLoop
eld b ,rpd1.index_Lw
ecld r4 ,b
cmp eq ,r4 ,#3
brt ShortWindowLoopEnd
eld a ,rpd1.index_GZeroPart
ecld r0 ,a // each window bound sfb
and r0 ,#0xff // each window bound sfb
esra8 a
eld rpd1.index_GZeroPart,a
eld a ,#0
ecld a ,r0
eld rpd1.index_LsfbS ,a
eld rpd1.index_Ln ,a
ShortSfbLoop
eld a ,rpd1.index_LsfbS
ecld r4 ,a
cmp eq ,r4 ,#13 //11.29
brt ShortSfbLoopEnd
eld b ,#Area_Scalefactor
eadd b ,#SizeOfScalefactor
eld a ,rpd1.index_LsfbS
//
esub a ,#1
//
eld x0 ,a
eld y0 ,#3
emul x0y0
eld a ,pl
esra a
eadd b ,a
eld c ,rpd1.index_Lw // window
eadd b ,c
eld rp3 ,b
eld b ,@rp3+s0
eld rpd1.index_LisPos ,b
eld b ,rpd1.index_Glsf
ecld r1 ,b
cmp eq ,r1 ,#0
brf LSFBitrateS2S
eld b ,rpd1.index_GOrgSampFreq
jmp LSFBitrateEndS2S
LSFBitrateS2S
eld b ,rpd1.index_GOrgSampFreq
eadd b ,#3
LSFBitrateEndS2S
eld x0 ,b
eld y0 ,#13
emul x0y0
eld b ,pl
esra b
eadd b ,#tbl_sfwidth_s
eld c ,rpd1.index_LsfbS
eadd b ,c
eld rp3 ,b
eld b ,@rp3+s0
eld rpd1.index_Lf ,b //sb
eld b ,rpd1.index_Glsf
ecld r0 ,b
cmp eq ,r0 ,#2
brf pass_mpeg25S1
eld b ,rpd1.index_GShortSfBandIndex
eld c ,rpd1.index_LsfbS
eadd b ,c
eadd b ,#1
eld rp0 ,b
eld b ,@rp0+s1
eld c ,@rp0+s0
esub b ,c
eld rpd1.index_Lf ,b
pass_mpeg25S1
eld b ,rpd1.index_Lf
eld x0 ,b
eld b ,rpd1.index_Lw
eld y0 ,b
emul x0y0
eld b ,pl
esra b
eld a ,rpd1.index_LsfbS
eld c ,rpd1.index_GShortSfBandIndex
eadd a ,c
eld rp3 ,a
eld a ,@rp3+s0
eld c ,@rp3+s0
eadd a ,c
eld c ,@rp3+s0
eadd a ,c
eadd a ,b
eld rpd1.index_LloopCounti2 ,a
eadd a ,#Area_leftChannel
eld rp0 ,a
eld a ,@rp3+s0
eld c ,@rp3+s0
eadd a ,c
eld c ,@rp3+s0
eadd a ,c
eadd a ,b
eadd a ,#Area_rightChannel
eld rp1 ,a
ShortSbLoop
eld a ,rpd1.index_Lf
ecld r0 ,a
cmp eq ,r0 ,#0
brt ShortSbLoopEnd
eld a ,rpd1.index_LisPos
// esec0 #3
ecld r0 ,a
cmp ge ,r0 ,#7
brt isPosOverS
eld rp2 ,#tbl_isTable+6
eld x0 ,@rp0+s0
eld a ,rpd1.index_Glsf
ecld r0 ,a
cmp eq ,r0 ,#0
brt NonLsfStereoS
eld a ,rpd1.index_LisPos
eld sr ,a
eld b ,sr
enop
bra ec1 ,PassIntensityUpS
eld y0 ,@rp2+s0
emul x0y0
emld ma0 ,x0y0
ernd ma0
eld @rp0+d0 ,ma0
eld @rp1+d0 ,ma0
jmp NoneMSstereoS
PassIntensityUpS
eld sg ,sr
enmsk sg ,#1
eld b ,sg
enop
bra ec1 ,kr_intensityUpS
eld b ,sr ;b<-is_pos[sfb]
// esub b ,#1
esra b
eld c ,rpd1.index_LstereoLeftRight
eadd b ,c ;b+=tbl_stereoLeftRight
eld rp3, b
eld y1 ,@rp3+s0
emul x0y1
emld ma0 ,x0y1
ernd ma0
eld @rp1+d0 ,ma0
eld y0 ,@rp2+s0
emul x0y0
emld ma0 ,x0y0
ernd ma0
eld @rp0+d0 ,ma0
jmp NoneMSstereoS
kr_intensityUpS
eld b ,sr ;b<-is_pos[sfb]
esub b ,#1
esra b
eld c ,rpd1.index_LstereoLeftRight ;b+=tbl_stereoLeftRight
eadd b ,c ;b+=tbl_stereoLeftRight
eld rp3, b
eld y0 ,@rp3+s0
emul x0y0
emld ma0 ,x0y0
ernd ma0
eld @rp0+d0 ,ma0
eld y0 ,@rp2+s0
emul x0y0
emld ma0 ,x0y0
ernd ma0
eld @rp1+d0 ,ma0
jmp NoneMSstereoS
NonLsfStereoS
eld a ,rpd1.index_LisPos
eadd a ,#tbl_isTable
eld rp3 ,a
eld y0 ,@rp3+s0
eld b ,#6
eld c ,rpd1.index_LisPos
esub b ,c
eadd b ,#tbl_isTable
eld rp3 ,b
eld y1 ,@rp3+s0
emul x0y0
emld ma0 ,x0y0
ernd ma0
eld @rp0+d0 ,ma0
emul x0y1
emld ma0 ,x0y1
ernd ma0
eld @rp1+d0 ,ma0
jmp NoneMSstereoS
NonLsfStereoEndS
isPosOverS
eld b ,rpd1.index_LmsStereo
ecld r0 ,b
cmp eq ,r0 ,#0
brt NoneMSstereoS
/// eld rp3 ,#tbl_overSquaRoot
/// eld y0 ,@rp3+s0
ld r0 ,#0x827a
ecld c ,r0
ld r0 ,#0x5a
ecld ch ,r0
eld y0 ,c
eld a ,@rp0+s0
eld c ,@rp1+s0
eadd a ,c
eld x0 ,a
eld a ,@rp0+s0
eld c ,@rp1+s0
esub a ,c
eld x1 ,a
emul x0y0
emld ma0 ,x1y0
ernd ma0
eld @rp0+d0 ,ma0
emld ma0 ,x1y0
ernd ma0
eld @rp1+d0 ,ma0
NoneMSstereoS
eld a ,rpd1.index_Lf
esub a ,#1
eld rpd1.index_Lf ,a
esec0 #0
jmp ShortSbLoop
ShortSbLoopEnd
eld a ,rpd1.index_LsfbS
eadd a ,#1
eld rpd1.index_LsfbS,a
jmp ShortSfbLoop
ShortSfbLoopEnd
///////////////////////////////////////////////////
// middle/side stereo
eld a ,rpd1.index_LmsStereo
ecld r0 ,a
cmp eq ,r0 ,#0
brt ShortSfbLoopMSEnd
eld a ,rpd1.index_Ln
ecld r0 ,a
cmp eq ,r0 ,#0
brt ShortSfbLoopMSEnd
esub a ,#1
eld rpd1.index_LsfbS,a
ShortSfbLoopMS
eld a ,rpd1.index_LsfbS
ecld r0 ,a
cmp ge ,r0 ,#0
brf ShortSfbLoopMSEnd
eld b ,rpd1.index_Glsf
ecld r1 ,b
cmp eq ,r1 ,#0
brf LSFBitrateS2MS
eld b ,rpd1.index_GOrgSampFreq
jmp LSFBitrateEndS2MS
LSFBitrateS2MS
eld b ,rpd1.index_GOrgSampFreq
eadd b ,#3
LSFBitrateEndS2MS
eld x0 ,b
eld y0 ,#13
emul x0y0
eld b ,pl
esra b
eadd b ,#tbl_sfwidth_s
eld c ,rpd1.index_LsfbS
eadd b ,c
eld rp3 ,b
eld b ,@rp3+s0
eld rpd1.index_Lf ,b //sb
eld b ,rpd1.index_Glsf
ecld r0 ,b
cmp eq ,r0 ,#2
brf pass_mpeg25S2
eld b ,rpd1.index_GShortSfBandIndex
eld c ,rpd1.index_LsfbS
eadd b ,c
eadd b ,#1
eld rp0 ,b
eld b ,@rp0+s1
eld c ,@rp0+s0
esub b ,c
eld rpd1.index_Lf ,b
pass_mpeg25S2
eld b ,rpd1.index_Lf
eld x0 ,b
eld b ,rpd1.index_Lw
eld y0 ,b
emul x0y0
eld b ,pl
esra b
eld a ,rpd1.index_LsfbS
eld c ,rpd1.index_GShortSfBandIndex
eadd a ,c
eld rp3 ,a
eld a ,@rp3+s0
eld c ,@rp3+s0
eadd a ,c
eld c ,@rp3+s0
eadd a ,c
eadd a ,#Area_leftChannel
eadd a ,b
eld rp0 ,a
eld a ,@rp3+s0
eld c ,@rp3+s0
eadd a ,c
eld c ,@rp3+s0
eadd a ,c
eadd a ,#Area_rightChannel
eadd a ,b
eld rp1 ,a
/// eld rp3 ,#tbl_overSquaRoot
/// eld y0 ,@rp3+s0
ld r0 ,#0x827a
ecld c ,r0
ld r0 ,#0x5a
ecld ch ,r0
eld y0 ,c
ShortSbLoopMS
eld a ,rpd1.index_Lf
enop
bra ec0 ,ShortSbLoopMSEnd
eld a ,@rp0+s0
eld c ,@rp1+s0
eadd a ,c
eld x0 ,a
eld a ,@rp0+s0
eld c ,@rp1+s0
esub a ,c
eld x1 ,a
emul x0y0
emld ma0 ,x1y0
ernd ma0
eld @rp0+d1 ,ma0
emld ma0 ,x1y0
ernd ma0
eld @rp1+d1 ,ma0
eld a ,rpd1.index_Lf
esub a ,#1
eld rpd1.index_Lf ,a
jmp ShortSbLoopMS
ShortSbLoopMSEnd
eld a ,rpd1.index_LsfbS
esub a ,#1
eld rpd1.index_LsfbS,a
jmp ShortSfbLoopMS
ShortSfbLoopMSEnd
eld a ,rpd1.index_Lw
eadd a ,#1
eld rpd1.index_Lw ,a
jmp ShortWindowLoop
ShortWindowLoopEnd
jmp NotmsStereo
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -