?? findis.s
字號:
;-----------------------------------------------------------
; The following program will decoding MP3 bitstream
; by S/W Algorithm
; File Name: find.s
; copyright jj,Park 1999.2.7
;
;-----------------------------------------------------------
.include "mp3_def.h"
.include "mp3_ext.h"
MP3FindisSection
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Function
; - Finds intensity-stereo mode's sfb,
; - Because of being difficult to find is'sfb using the results of requantizer
;; idl1 output maxLongSfb
; d output maxLongSfb
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
FindJointStereoSfb::
ldb r0 ,@[a13+Index_ChannelLoop]
inc r0
ldb r5 ,@[a13+Index_Mode] ;(G_mpegChannelLoop==0)&(G_mpegMode==01)
xor r0 ,r5
cmp eq ,r0 ,#0
brf FindJointStereoSfbRet
eld sd0 ,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(0<<0)
eld sd2 ,sd0
eld sd3 ,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(-3<<0)
eld b ,rpd0.index_blockType ;b[23:16]<-windowSwitchingFlag
;b[15:8]<-blockType
;b[7:0]<-mixedBlockFlag
esra b
etst nc ,t ;t<-!mixedBlockFlag
efs8 b
eld c ,#0x8100
efs8 c
ecld r0 ,b
ecld r1 ,c
cmp eq ,r0 ,r1
brf FindJSSfbLong
///caution
cmpu ge ,r0 ,r1
brt FindJSPureShortBlock
;-----------------------------In case of mixed_block ---------------------------------------
esec2 #sec_z ;ec2<-z-flag
ld r0 ,#0
ecld d ,r0
ld r6 ,#2 ;window size
FindJSSfbMixedLoop
eld rp3 ,#Area_Scalefactor+SizeOfScalefactor+8+10*3+2 ;last scalefactor pointer
eld c ,rpd1.index_GShortSfBandIndex ;The pointer of short band index
eld rp2 ,c
erpn rp2 ,#13 ;position-> [13]
ld r7 ,#12-3 ;sfb size(3,4,5,6,7,8,9,10,11,12)
push a14
jsr FindShortNonZeroSfb ;return r3
pop a14
inc r7
ecld r1 ,d ;idl1 is backup of
cmpu ge ,r7 ,r1
brt mixed_d
ecld d ,r7 ;update max_sfb
mixed_d
eld a ,rpd1.index_GZeroPart
esla8 a
ecld a ,r7
eld rpd1.index_GZeroPart ,a
eld c ,rpd1.index_GShortSfBandIndex ;The pointer of short band index
eld rp2 ,c
bnzd r6 ,FindJSSfbMixedLoop
nop
ecld r0 ,d ;max_sfb
cmp eq ,r0 ,#0
brf FindJSSfbMixedExit
esec1 #sec_c ;ec1=c
eld rp3 ,#Area_Scalefactor+SizeOfScalefactor+7 ;points the end_ptr of long_block
eld c ,rpd1.index_GLongSfBandIndex
eld rp2 ,c
erpn rp2 ,#7
ld r6 ,#7
jmp FindJSSfbLongCommon
;-----------------------------In case of pure short_block ---------------------------------------
FindJSPureShortBlock
esec2 #sec_z ;ec2<-z-flag
ld r6 ,#2 ;r2<-window loop
FindJSPureShortWindowLoop
eld rp3 ,#Area_Scalefactor+SizeOfScalefactor+13*3+2 ;last scalefactor pointer
eld c ,rpd1.index_GShortSfBandIndex ;The pointer of short band index
eld rp2 ,c
erpn rp2 ,#13
ld r7 ,#12 ;sfb size
push a14
jsr FindShortNonZeroSfbUp
pop a14
eld a ,rpd1.index_GZeroPart
esla8 a
ecld r4 ,a
and r4 ,#0xff00
or r7 ,r4
ecld a ,r7
bnzd r6 ,FindJSPureShortWindowLoop
eld rpd1.index_GZeroPart,a ;rpd1.index_LZeroPart[23:16]<-window2 state
;rpd1.index_LZeroPart[15:8]<-window1 state
;rpd1.index_LZeroPart[7:0]<-window0 state
FindJSSfbMixedExit
esec2 #sec_t ;ec2<-t-flag
ret
;-----------------------------In case of Long_block ---------------------------------------
FindJSSfbLong
eld rp3 ,#Area_Scalefactor+SizeOfScalefactor+21 ;points the end_ptr of long_block
eld c ,rpd1.index_GLongSfBandIndex
eld rp2 ,c
erpn rp2 ,#21
ld r2 ,#21
FindJSSfbLongCommon
esec2 #sec_z ;ec2<-z-flag
esec0 #sec_le ;ec1=c
esec1 #sec_nn
eld b ,#575 ;i
Sb_loop
eld a ,#Area_rightChannel
eadd a ,b
eld rp0 ,a
eld a ,@rp0
ecp a ,#0
enop
bra ec2 ,i_minus
jmp Sb_loopEnd
i_minus
esub b ,#1
ecp b ,#0
enop
bra ec1 ,Sb_loop
Sb_loopEnd
eld a ,b ;a->sb
ecld r6 ,b
// cmp eq ,r6 ,#0xffff
// brf pass_sfb2
// eld a ,#0
//pass_sfb2
eld b ,#0
eld si ,b
Sb_bands
eld b ,si
eld c ,rpd1.index_GLongSfBandIndex
eadd b ,c
eld rp2 ,b
eld b ,@rp2
ecp b ,a
enop
bra ec0 ,Sb_bandsMid
jmp Sb_bandsEnd
Sb_bandsMid
eld b ,si
eadd b ,#1
eld si ,b
jmp Sb_bands
Sb_bandsEnd
eld b ,si
ecld r6 ,b
eld d ,#0
ecld d ,r6
esec0 #sec_nz
esec1 #sec_nc ;ec1=c
esec2 #sec_t ;ec2<-t-flag
FindJointStereoSfbRet
ret
;---------------------------------------------------------------------
; r3 Out The starting sfb of intensity_stereo
;---------------------------------------------------------------------
FindShortNonZeroSfb:
eld b ,#7 ;for checking intensity mode
eld a ,@rp2+s1 ;rp2-=1
FindShortNonZeroSfbLoop
eld c ,@rp2+s0
esub a ,c ;a<-frequency lines number
ecld r1 ,a ;r1<-frequency lines number
dec r1
eld si ,a ;backup
eld a ,#0
ld r0 ,r6 ;r0<-window
win_loop
eadd a ,si
cmp eq ,r0 ,#0
brfd win_loop
dec r0
eld c ,@rp2+s0
eadd a ,c
esla a
eld c ,@rp2+s0
eadd a ,c
eadd a ,#Area_rightChannel-1
eld rp0 ,a ;rp0<-3*sfBandIndex[sfreq].s[sfb]+(win+1)*lines-1
eld c ,@rp3+s0
ecp b ,c ;rp3-=3
enop
bra ec2 ,FindShortNonZeroExit ;ec2=z
eld a ,@rp0+s1
FindShortNonZeroFreqLoop
enop
bra ec0 ,FindShortNonZeroExit ;ec0=nz
eld a, @rp0+s1 ;due to delay
cmp eq ,r1 ,#0
brfd FindShortNonZeroFreqLoop ;frequency line loop
dec r1
bnzd r7 ,FindShortNonZeroSfbLoop ;sfb loop
eld a ,@rp2+s1 ;due to delay
FindShortNonZeroExit
ret
FindShortNonZeroSfbUp:
esec0 #sec_n
ShortSfbLoop
eld a ,@rp2+s1 // a-> lines
eld c ,@rp2+s0
esub a ,c
eld si ,a ;backup
eld a ,#0
ld r0 ,r6 ;r0<-window
win_loop2
eadd a ,si //si->lines
cmp eq ,r0 ,#0
brfd win_loop2
dec r0
eld c ,@rp2+s0
eadd a ,c
eld c ,@rp2+s0
eadd a ,c
eld c ,@rp2+s0
eadd a ,c
esub a ,#1 //i
lines_loop
eld b ,si //lines
enop
bra ec0 ,lines_loopEnd
ecp b ,#0
enop
bra ec2 ,lines_loopEnd
eld b ,#Area_rightChannel
eadd b ,a
eld rp0 ,b
eld b ,@rp0
ecp b ,#0
enop
bra ec2 ,SfbLoopCnt
jmp lines_loopBreak
SfbLoopCnt
esub a ,#1
eld b ,si
esub b ,#1
eld si ,b
jmp lines_loop
lines_loopEnd
cmp eq ,r7 ,#0
brfd ShortSfbLoop
dec r7
//caution
// dec r7
//
lines_loopBreak
add r7 ,#1
esec0 #sec_nz
ret
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -