📄 mp3decnew.s
字号:
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; function: reconstruct variables in order to use 1024-buffer
; rp0: the current pointer for scalefactor and huffman code+etc
; si/a: the previous rest value resulting from shift
; because data is aligned byte, but fetched by word.
; rpd0 rpdi.adr[4:0]
; the base address of global variable for MPEG process
; rpd1 rpdi.addr[4:0] / rpd1.adr[3:0]
; the base address of global variable for MPEG process
; especially, rpd0/rpd1 is not varied throughout routines
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
RestoreForDecoding::
eld c ,rpd1.index_GcopyRp1 ;recover rp1
eld rp1 ,c
eld b ,rpd1.index_GcopySr
eld sr ,b ;recover SI register
eld b ,rpd1.index_GcopyB ;recover B register
ret
StoreForNextDecoding::
eld rpd1.index_GcopyB, b ;store B register
eld b ,rp1
eld rpd1.index_GcopyRp1, b ;store rp1 register
eld b ,sr
eld rpd1.index_GcopySr, b ;store SI register
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; rp0 scalefactor pointer
; idl1 scalefac_compress table pointer(for temp job)
; idh the pointer of ptr_mpegInformation
; bank 1's mal is used for checking USED_BITS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
GetScalefactor:
eld sd0 ,#((-1&0fh)<<12)|(1<<8)|((6&0fh)<<4)|(5<<0)
eld rp0 ,#Area_Scalefactor ;scalefactor pointer
ldb r0 ,@[a13+Index_Mode] //2002 insert
cmp eq ,r0 ,#const_mono //2002 insert
brt Mono_channel //2002 insert
ldb r0 ,@[a13+Index_ChannelLoop]
cmp eq ,r0 ,#0
brf pass_channel
erpn rp0 ,#SizeOfScalefactor
eld a ,rpd1.index_Gscfi
eld sg ,a
enmsk sg ,#4
jmp pass_channelEnd
Mono_channel //2002 insert
erpn rp0 ,#SizeOfScalefactor //2002 insert
pass_channel
eld a ,rpd1.index_Gscfi
esra a
esra a
esra a
esra a
eld sg ,a
pass_channelEnd
eld a ,rpd0.index_scalefacCompress
;a[23:16]=global_gain
;a[15:8]=scalefac_compress
;a[7:0]=scalefac_compress
; 0x221638(tbl_scalefacCompress)
ecld r0 ,a
eld a ,#tbl_scalefacCompress
efz8 a
esub a ,#0x8000
esla a
ecld r1 ,a
add r0 ,r1 //#0x1638
ld r3 ,#0x22
ld e12 ,r3
ld r12 ,r0
;compression table
ldb r1 ,@[a12+0]
add r12 ,#16
efz16 a
ecld a ,r1
eld sa ,a ;sa<-slen1
ldb r2 ,@[a12+0]
ecld a ,r2
eld si ,a ;si<-slen2
eld a ,rpd1.index_GranuleLoop
ecld r2 ,a
xor r2 ,#01
es me1
ecr ma0 ;Clear USED_BITS
eld a ,rpd0.index_blockType ;a[23:16]<-windowSwitchingFlag
;a[15:8]<-blockType
;a[7:0]<-mixedBlockFlag
esra a
etst nc ,t ;c<-mixedBlockFlag
efs8 a
ecp a ,#((1<<16)|(const_shortBlock<<8))>>1 ;short&switching
enop
bra ec0 ,GetScalefactorLongBlock ;ec0:nz
ld r6 ,#5 ;short sfb(0 to 5)loop
bra ec2 ,GetScalefactorShortBlock
ld r6 ,#7 ;long sfb(0 to 7)loop
ScalefactorMixedLongLoop
push a14
jsr GetNBitFromBitstreamMP3
pop a14
bnzd r6 ,ScalefactorMixedLongLoop
eld @rp0+d0 ,sg
ld r6 ,#2 ;short sfb(3 to 5)loop
GetScalefactorShortBlock
ScalefactorMixedShortSlen1Loop
push a14
jsr GetNBitFromBitstreamMP3
pop a14
eld @rp0+d0 ,sg
push a14
jsr GetNBitFromBitstreamMP3
pop a14
eld @rp0+d0 ,sg
push a14
jsr GetNBitFromBitstreamMP3
pop a14
bnzd r6 ,ScalefactorMixedShortSlen1Loop
eld @rp0+d0 ,sg
eld sa ,si ;sa<-slen2
ld r6 ,#5 ;short sfb(6 to 11)loop
ScalefactorMixedShortSlen2Loop
push a14
jsr GetNBitFromBitstreamMP3
pop a14
eld @rp0+d0 ,sg
push a14
jsr GetNBitFromBitstreamMP3
pop a14
eld @rp0+d0 ,sg
push a14
jsr GetNBitFromBitstreamMP3
pop a14
bnzd r6 ,ScalefactorMixedShortSlen2Loop
eld @rp0+d0 ,sg
eld a ,#0
eld @rp0+d0 ,a ;fill a last sfb'scalefactor[0] with zero
eld @rp0+d0 ,a ;fill a last sfb'scalefactor[1] with zero
eld @rp0+d0 ,a ;fill a last sfb'scalefactor[2] with zero
ret
/*
GetScalefactorLongBlock
eld a ,rpd1.index_Gscfi
ecld r3 ,a ;r3<-scfi
and r3 ,#0xff
sl r3 ;c<-scfi[0]
cmpu ge ,r3 ,#0x100
brf Longscfi2Ext
cmp eq ,r2 ,#0
brf GetScalefactorLongscfi2 ;scfi[0]|gr=0,ugt=C&~Z
Longscfi2Ext
ld r6 ,#5 ;0,1,2,3,4,5
ScalefactorLongscfi1Loop
push a14
jsr GetNBitFromBitstreamMP3
pop a14
bnzd r6 ,ScalefactorLongscfi1Loop
eld @rp0+d0 ,sg
jmp Longscfi2Skip
GetScalefactorLongscfi2
erps rp0+s1 ;rp0+=6
Longscfi2Skip
and r3 ,#0xff
sl r3 ;c<-scfi[1]
cmpu ge ,r3 ,#0x100
brf Longscfi3Ext
cmp eq ,r2 ,#0
brf GetScalefactorLongscfi3 ;;scfi[1]|gr=0,ugt=C&~Z
Longscfi3Ext
ld r6 ,#4 ;6,7,8,9,10
ScalefactorLongscfi2Loop
push a14
jsr GetNBitFromBitstreamMP3
pop a14
bnzd r6 ,ScalefactorLongscfi2Loop
eld @rp0+d0 ,sg
jmp Longscfi3Skip
GetScalefactorLongscfi3
erps rp0+s0 ;rp0+=5
Longscfi3Skip
eld sa ,si ;sa<-slen2
and r3 ,#0xff ;c<-scfi[2]
sl r3
cmpu ge ,r3 ,#0x100
brf Longscfi4Ext
cmp eq ,r2 ,#0
brf GetScalefactorLongscfi4 ;;scfi[2]|gr=0,ugt=C&~Z
Longscfi4Ext
ld r6 ,#4 ;11,12,13,14,15
ScalefactorLongscfi3Loop
push a14
jsr GetNBitFromBitstreamMP3
pop a14
bnzd r6 ,ScalefactorLongscfi3Loop
eld @rp0+d0 ,sg
jmp Longscfi4Skip
GetScalefactorLongscfi4
erps rp0+s0 ;rp0+=5
Longscfi4Skip
eld sa ,si ;sa<-slen2
and r3 ,#0xff ;c<-scfi[3]
sl r3
cmpu ge ,r3 ,#0x100
brf Longscfi4ExtP
cmp eq ,r2 ,#0
brf GetScalefactorLongscfi4Pass ;;scfi[3]|gr=0,ugt=C&~Z
Longscfi4ExtP
ld r6 ,#4 ;16,17,18,19,20
ScalefactorLongscfi4Loop
push a14
jsr GetNBitFromBitstreamMP3
pop a14
bnzd r6 ,ScalefactorLongscfi4Loop
eld @rp0+d0,sg
jmp Longscfi4PassSkip
GetScalefactorLongscfi4Pass
erps rp0+s0 ;rp0+=5
Longscfi4PassSkip
eld a ,#0
eld @rp0+d0 ,a ;save last scalefactor[i+1] with zero
xor r2 ,#0x01
cmp eq ,r2 ,#0
brf GetScalefactorRet
and r3 ,#0xff
ecld a ,r3
eld rpd1.index_Gscfi, a
GetScalefactorRet
ret
*/
///////////////////////////////////////////////////////////////////////////////
GetScalefactorLongBlock
eld a ,sg
ecld r0 ,a ;r3<-scfi
and r0 ,#0xff
ld r3 ,r0
and r3 ,#0x08
cmp eq ,r3 ,#0x08
brf Longscfi1Loop ;scfi[0]|gr=0,ugt=C&~Z
cmp eq ,r2 ,#0 ;G_mpegGranuleLoop=1,for gr=0
brt Longscfi1Loop
jmp GetScalefactorLongscfi2
Longscfi1Loop ;scfi[0]|gr=0,ugt=C&~Z
ld r6 ,#5 ;0,1,2,3,4,5
ScalefactorLongscfi1Loop
push a14
jsr GetNBitFromBitstreamMP3
pop a14
bnzd r6 ,ScalefactorLongscfi1Loop
eld @rp0+d0,sg
jmp Longscfi2Skip
GetScalefactorLongscfi2
erps rp0+s1 ;rp0+=6
Longscfi2Skip
ld r3 ,r0
and r3 ,#0x04
cmp eq ,r3 ,#0x04
brf Longscfi2Loop ;scfi[0]|gr=0,ugt=C&~Z
cmp eq ,r2 ,#0 ;G_mpegGranuleLoop=1,for gr=0
brt Longscfi2Loop ;;scfi[1]|gr=0,ugt=C&~Z
jmp GetScalefactorLongscfi3
Longscfi2Loop
ld r6 ,#4 ;6,7,8,9,10
ScalefactorLongscfi2Loop
push a14
jsr GetNBitFromBitstreamMP3
pop a14
bnzd r6 ,ScalefactorLongscfi2Loop
eld @rp0+d0 ,sg
jmp Longscfi3Skip
GetScalefactorLongscfi3
erps rp0+s0 ;rp0+=5
Longscfi3Skip
eld sa ,si ;sa<-slen2
ld r3 ,r0
and r3 ,#0x02
cmp eq ,r3 ,#0x02
brf Longscfi3Loop
cmp eq ,r2 ,#0 ;G_mpegGranuleLoop=1,for gr=0
brt Longscfi3Loop ;;scfi[2]|gr=0,ugt=C&~Z
jmp GetScalefactorLongscfi4
Longscfi3Loop
ld r6 ,#4 ;11,12,13,14,15
ScalefactorLongscfi3Loop
push a14
jsr GetNBitFromBitstreamMP3
pop a14
bnzd r6 ,ScalefactorLongscfi3Loop
eld @rp0+d0,sg
jmp Longscfi4Skip
GetScalefactorLongscfi4
erps rp0+s0 ;rp0+=5
Longscfi4Skip
eld sa ,si ;sa<-slen2
ld r3 ,r0
and r3 ,#0x01
cmp eq ,r3 ,#0x01
brf Longscfi4Loop
cmp eq ,r2 ,#0 ;G_mpegGranuleLoop=1,for gr=0
brt Longscfi4Loop ;;scfi[3]|gr=0,ugt=C&~Z
jmp GetScalefactorLongscfi4Pass
Longscfi4Loop
ld r6 ,#4 ;16,17,18,19,20
ScalefactorLongscfi4Loop
push a14
jsr GetNBitFromBitstreamMP3
pop a14
bnzd r6 ,ScalefactorLongscfi4Loop
eld @rp0+d0 ,sg
jmp Longscfi4PassSkip
GetScalefactorLongscfi4Pass
erps rp0+s0 ;rp0+=5
Longscfi4PassSkip
eld a ,#0
eld @rp0+d0 ,a ;save last scalefactor[i+1] with zero
GetScalefactorRet
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; rp0 scalefactor pointer
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*
GetScalefactorLSF:
es me1
eld sd0 ,#((-1&0fh)<<12)|(1<<8)|((6&0fh)<<4)|(5<<0)
esd2 d0 ,#1
esd2 s0 ,#1
esd3 s0 ,#1
eld rp0 ,#Area_Scalefactor ;scalefactor pointer
ldb r0 ,@[a13+Index_ChannelLoop]
// jr nz, $+3
cmp eq ,r0 ,#0
brf scalefactor_ch
erpn rp0, #SizeOfScalefactor
scalefactor_ch
eld a, rpd0.index_scalefacCompress
;a[23:16]=global_gain
;a[15:8]=scalefac_compress
;a[7:0]=scalefac_compress
efz8 a
eld rpd1.index_LlsfBackA ,a
eld rpd1.index_GcopyB ,b ;store B register
esec2 #4
eld rp2 ,#Area_new_slen
//
eld x0 ,#0 ;x0 -> blocktypenumber
eld a ,rpd0.index_blockType
ecld r1 ,a
srb r1
cmp eq ,r1 ,#2
brf n_zero
eld x0 ,#1
ecld r1 ,a
and r1 ,#0xff
cmp eq ,r1 ,#0
brt n_zero
eld x0 ,#2
n_zero
cmp eq ,r0 ,#1
brt bit_rev
ld r0 ,#1
jmp bit_revEnd
bit_rev
ld r0 ,#0
bit_revEnd
eld a ,rpd1.index_GmpegModeExt
ecld r1 ,a
and r1 ,#0xff
cmp eq ,r1 ,#1
brf modeExtNotOr
modeExtOr
cmp eq ,r0 ,#1
brf split_ch
eld a ,rpd1.index_LlsfBackA
esra a
ecp a ,#180
bra ec2 ,else_comp1
eld b ,#36
push a14
jsr ScaleDiv24
pop a14
eld @rp2+d0 ,a
eld a ,b
eld b ,#6
push a14
jsr ScaleDiv24
pop a14
eld @rp2+d0 ,a
eld @rp2+d0 ,b
eld a ,#0
eld @rp2+d0 ,a
/// ld r2 ,#0
eld a ,rpd0.index_preFlag
ecld r2 ,a
and r2 ,#0xff00
ecld a ,r2
eld rpd0.index_preFlag ,a
eld y0 ,#3 ;blocknumber
jmp split_chEnd
else_comp1
/// ecp a ,#244
/// bra ec2 ,else_comp2
ecld r5 ,a
cmpu ge ,r5 ,#244
brt else_comp2
esub a ,#180
eld x1 ,a
eld b ,#64
push a14
jsr ScaleDiv24
pop a14
esra b
esra b
esra b
esra b
eld @rp2+d0 ,b
eld a ,x1
eld b ,#16
push a14
jsr ScaleDiv24
pop a14
esra b
esra b
eld @rp2+d0 ,b
eld a ,x1
eld b ,#4
push a14
jsr ScaleDiv24
pop a14
eld @rp2+d0 ,b
eld a ,#0
eld @rp2+d0 ,a
eld a ,rpd0.index_preFlag
ecld r2 ,a
and r2 ,#0xff00
ecld a ,r2
eld rpd0.index_preFlag ,a
eld y0 ,#4 ;blocknumber
jmp split_chEnd
else_comp2
ecp a ,#255
bra ec2 ,else_comp3
esub a ,#244
eld b ,#3
push a14
jsr ScaleDiv24
pop a14
eld @rp2+d0 ,a
eld @rp2+d0 ,b
eld a ,#0
eld @rp2+d0 ,a
eld @rp2+d0 ,a
eld a ,rpd0.index_preFlag
ecld r2 ,a
and r2 ,#0xff00
ecld a ,r2
eld rpd0.index_preFlag ,a
eld y0 ,#5 ;blocknumber
else_comp3
jmp split_chEnd
modeExtNotOr
cmp eq ,r1 ,#3
brt modeExtOr
split_ch
eld a ,rpd1.index_LlsfBackA
/// ecp a ,#400
/// bra ec2 ,else_comp11
ecld r5 ,a
cmpu ge ,r5 ,#400
brt else_comp11
esra a
esra a
esra a
esra a
eld b ,#5
push a14
jsr ScaleDiv24
pop a14
eld @rp2+d0 ,a
eld @rp2+d0 ,b
eld a ,rpd1.index_LlsfBackA
eld b ,#16
push a14
jsr ScaleDiv24
pop a14
esra b
esra b
eld @rp2+d0 ,b
eld a ,rpd1.index_LlsfBackA
eld b ,#4
push a14
jsr ScaleDiv24
pop a14
eld @rp2+d0 ,b
eld a ,rpd0.index_preFlag
ecld r2 ,a
and r2 ,#0xff00
ecld a ,r2
eld rp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -