?? dequanti.s
字號:
;-----------------------------------------------------------
; The following program will decoding MP3 bitstream
; by S/W Algorithm
; File Name: dequanti.s
; copyright jj,Park 1999.2.7
;-----------------------------------------------------------
.include "mp3_def.h"
.include "mp3_ext.h"
const_MaxScale equ 22
MP3DequantiSection
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
; d1 d0 s1 s0
; sd0 = -1 | 3 | -2 | 1
; sd1 = xx | xx | -1 | 2
; sd2 = xx | xx | xx | 1
; sd3 = xx | xx | xx | xx
;
; rp0 : used as the pointer of the current decoding pointer
; rp1 : used as the pointer of sfb's frequency
; rp2 : used as the pointer of scalefactor
; rp3 : used as a temporary pointer
; x0 u mantissa
; x1 u the table pointer of power2x
; y0 u pow(2,-(i%4))
; y1 u shift value
; si u the table pointer etbl_mantisaOfPow43Org
; sr u const_MaxScale
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DecodingDequantizer::
eld sd0 ,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(0<<0)
eld sd1 ,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(2<<0)
esd2 s0 ,#1
eld sd3 ,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(1<<0)
eld sa ,#-6 ;for newton polynominal
eld a ,#tbl_pretab
eld rpd1.index_LRPxBackupBuffer ,a
eld a ,#tbl_powerMask
eld rpd1.index_LbackupTable ,a ;backup
eld rp2 ,#Area_Scalefactor ;scalefactor pointer
ldb r0 ,@[a13+Index_ChannelLoop]
cmp eq ,r0 ,#0
brf decq_ch
erpn rp2 ,#SizeOfScalefactor
decq_ch
eld c ,rpd1.index_GptrCurrentDecodingData
eld rp0 ,c
eld a ,#tbl_power2x
eld x1 ,a ;x1<-tbl_power2x
eld a ,#tbl_mantisaOfPow43Org ;tbl_exponentOfPow43
eld si ,a
eld b ,rpd0.index_globalGain ;b[23:16]=global_gain
;b[15:8]=scalefac_compress
;b[7:0]=scalefac_compress
esra8 b ;b<-global_gain
esra8 b
efz16 b
esub b ,#210 ;b<-global_gain-210
eld rpd1.index_LglobalGain210 ,b
eld a ,rpd0.index_windowSwitchingFlag ;a[23:16]<-windowSwitchingFlag
;a[15:8]=blockType
;a[7:0]=mixedBlockFlag
esra a ;c<-mixedBlockFlag
etst nc ,t
efs8 a
// ecp a ,#((1<<16)|(const_shortBlock<<8))>>1 ;switching&short
eld c ,#((1<<16)|(const_shortBlock<<8))>>1
ecld r0 ,a
ecld r1 ,c
cmp eq ,r0 ,r1
brf LongBlock ;eq if pure short
cmpu ge ,r0 ,r1
brt ShortBlock ;eq if pure short
MixedBlock
esec2 #sec_z ;ec2<-z-flag
eld c ,rpd1.index_GLongSfBandIndex ;rp1:sfb band index
eld rp1 ,c
erpd rp1+d0 ;rp1<-rp1+1
ld r6 ,#7 ;sfb size
eld a ,@rp1+s1 ;a<-bands[i+1],rp1<-rp1-1
MixedBlockLongSfbLoop
eld c ,@rp1+s0
esub a ,c ;a<-bands[i+1]-bands[i],
;rp1<-rp1+2
eadd a ,#-1
ecld r2 ,a ;r2<-frequency lines
eld c ,rpd1.index_LRPxBackupBuffer
eld rp2 ,c
eld a ,@rp2+s0 ;a<-tbl_pretab[sfb]
eld c ,rp2
eld rpd1.index_LRPxBackupBuffer ,c
eld b ,rpd0.index_preFlag ;a[23:16]<-region0Count
;a[15:8]<-region1Count
;a[7:0]<-preFlag
efz16 b
etst z ,t
efz8t a
eld c ,@rp2+s0
eadd a ,c ;a<-_l[sfb]+tbl_pretab[sfb]
eld b ,rpd0.index_scalefacScale ;b[23:16]<-zero
;b[15:8]<-scalefacScale
;b[7:0]<-count1TableSelect
esra8 b
etst nz ,t
eslat a ;a *= 4 if scalefac_scale
esla a ;a *= 2 if !scalefac_scale
eld c ,rpd1.index_LglobalGain210
esub a ,c ;a<-scalefac_mul*(scalefac_l+preflag*pretab)
;-(global_gain-210)
push a14
jsr DecodingDequantizerCommon
pop a14
bnzd r6 ,MixedBlockLongSfbLoop
eld a ,@rp1+s1 ;a<-bands[i+1],rp1<-rp1-1
ld r6 ,#12-3 ;sfb size of short block
erpn rp1 ,#18 ;for pointing rp1 to band_s[3]
jmp ShortBlockCommon
ShortBlock
esec2 #sec_z ;ec2<-z-flag
eld c ,rpd1.index_GShortSfBandIndex ;rp1:sfb band index
eld rp1 ,c
erpd rp1+d0 ;rp1<-rp1+1
ld r6 ,#12 ;sfb size of short block
ShortBlockCommon
eld a ,@rp1+s1 ;a<-bands[i+1],rp1<-rp1-1
ShortBlockSfbLoop
eld c ,@rp1+s0
esub a ,c ;a<-bands[i+1]-bands[i],
;rp1<-rp1+2
eadd a ,#-1
ecld r2 ,a ;r1<-frequency lines in sfb
eld b ,@rp2+s0 ;b<-scalefac_s[][0]
esla8 b
eld c ,@rp2+s0
eadd b ,c ;b<-scalefac_s[][1]
esla8 b
eld c ,@rp2+s0
eadd b ,c ;b[23:16]<-scalefac_s[i]
;b[15:8]<-scalefac_s[i+1]
;b[7:0]<-scalefac_s[i+2]
eld a ,rpd0.index_scalefacScale ;b[23:16]<-zero
;b[15:8]<-scalefacScale
;b[7:0]<-count1TableSelect
esra8 a
etst nz ,t
eslat b ;b *= 4 if scalefac_scale
esla b ;b *= 2 if !scalefac_scale
eld a ,rpd0.index_subBlockGain0 ;a[23:16]<-subBlockGain0
;a[15:8]<-subBlockGain1
;a[7:0]<-subBlockGain2
esla a
esla a
esla a ;a=subBlockGain[0,1,2]*8
eadd a ,b ;a[23:16]<- subblock_gain0*8
;+scalefac_mutiplier*scalefac_s[i]*4
;a[15:8]<- subblock_gain1*8
;+scalefac_mutiplier*scalefac_s[i+1]*4
;a[7:0]<- subblock_gain2*8
;+scalefac_mutiplier*scalefac_s[i+2]*4
eld rpd1.index_LbackA ,a
esra8 a
esra8 a
eld c ,rpd1.index_LglobalGain210
esub a ,c ;a-=(global_gain-210)
ld r1 ,r2 ;backup
push a14
jsr DecodingDequantizerCommon ;window 0
pop a14
eld a ,rpd1.index_LbackA
esra8 a
efz16 a ;a<-subBlock1's value
eld c ,rpd1.index_LglobalGain210
esub a ,c ;a-=(global_gain-210)
ld r2 ,r1
push a14
jsr DecodingDequantizerCommon ;window 1
pop a14
eld a ,rpd1.index_LbackA
efz16 a ;a<-subBlock2's value
eld c ,rpd1.index_LglobalGain210
esub a ,c ;a-=(global_gain-210)
ld r2 ,r1 ;frequency lines
push a14
jsr DecodingDequantizerCommon ;window 2
pop a14
eld a ,@rp1+s1 ;a<-bands[i+1],rp1<-rp1-1
cmp eq ,r6 ,#0
brfd ShortBlockSfbLoop
dec r6
jmp DequantizerCommon
LongBlock
esec2 #sec_z ;ec2<-z-flag
eld c ,rpd1.index_GLongSfBandIndex ;rp1:sfb band index
eld rp1 ,c
erpd rp1+d0 ;rp1<-rp1+1
ld r6 ,#21
eld a ,@rp1+s1 ;a<-bands[i+1],rp1<-rp1-1
LongBlockSfbLoop
eld c ,@rp1+s0
esub a ,c ;a<-bands[i+1]-bands[i],
;rp1<-rp1+2
eadd a ,#-1
ecld r2 ,a ;r2<-frequency lines
eld a ,rpd1.index_LRPxBackupBuffer
eld rp3 ,a
eld a ,@rp3+s0 ;a<-tbl_pretab[sfb]
eld b ,rp3
eld rpd1.index_LRPxBackupBuffer ,b
eld b ,rpd0.index_preFlag ;a[23:16]<-region0Count
;a[15:8]<-region1Count
;a[7:0]<-preFlag
efz16 b
//Insert,1999.11.24
etst z ,t ;for preflag[gr]*pretab[sfb]
esra8t a ;a=0,if b==0
//Insert end,1999.11.24
eld c ,@rp2+s0
eadd a ,c ;a<-_l[sfb]+tbl_pretab[sfb]
eld b ,rpd0.index_scalefacScale
esra8 b
etst nz ,t
eslat a ;a *= 4 if scalefac_scale
esla a ;a *= 2 if !scalefac_scale
eld c ,rpd1.index_LglobalGain210
esub a ,c ;a<-scalefac_mul*(scalefac_l+preflag*pretab)
;-(global_gain-210)
push a14
jsr DecodingDequantizerCommon
pop a14
bnzd r6 ,LongBlockSfbLoop
eld a ,@rp1+s1 ;a<-bands[i+1],rp1<-rp1-1
DequantizerCommon
esec2 #sec_t ;ec2<-t flag
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; rp0 I the pointer of input buffer
; a I in case of short:(-(global_gain-210)+8*subblock_gain+
; scalefac_multiplier*scalefac_s*(2 or 4))
; in case of long: (-(global_gain-210)+scalefac_multiplier*
; (scalefac_s+preflag*pretab)*(2 or 4))
; a-register will be always positive or zero
; tbl_power2x pow (2,(0/4,1/4,2/4 or 3/4)
; xr = sign(isi)*|isi|-----
;
; a = 4*(scalefac_multiplier*(scalefac_l[sfb][ch][gr]+preflag[gr]*pretab[sfb]))-(global_gain[gr]-210)
; Generally A is positive.
; pow({is|,4/3)'exponent is the value =(real value+22)
; xr = sign(is) * [pow(|is|,4/3)'mantiss*(y1<<23)] >> (pow(|is|,4/3)'exponent+y0)
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DecodingDequantizerCommon:
eld sg ,a
esra a
esra a ;a<- a/4
enmsk sg ,#2 ;sg<-a%4
eld b ,sg
eadd b ,x1 ;x1:tbl_power2x
eld rp3 ,b
eld ma0 ,a ;mah<-scalefactor's shif value
eld y0 ,@rp3 ;y0<-pow(2,-i/4),i=0,1,2,3
DequantizerScaleLoop
eld b ,@rp0+s0 ;b<-
ecp b ,#0
enop
bra ec2 ,DequantizerMantissaZero2 ;if zero
etst neg ,t ;check sign flag
eld rpd1.index_LbackupB ,b
eabs b
eld a ,#1023
ecp a ,b
enop
bra ec1 ,NewtomMethod
eld rp3 ,b
erpn rp3 ,#tbl_exponentOfPow43Org //(0xAB86-0x4000) ;tbl_exponentOfPow43Org
eld a ,@rp3 ;a[23:16]<-exponent
esra8 a ;because of xdm
esra8 a ;a<-exponent
eadd b ,si ;b<-b+tbl_mantisaOfPow43Org
eld rp3 ,b
eadd a ,ma0 ,x0 ,@rp3 ;x0<-mantissa
DequantizerScaleCommon
ecp a ,#const_MaxScale
enop
bra ec1 ,DequantizerNonZero ;ec1=c if a>=22
eld b ,#0
DequantizerMantissaZero2
eld @rp0+d0 ,b ;dummy for delay, rp0+=1
cmp eq ,r2 ,#0
brfd DequantizerScaleLoop
dec r2
ret
DequantizerNonZero
eld c ,rpd1.index_LbackupTable ;a:shif+tbl_powerMask
eadd a ,c
eld rp3 ,a
emul x0y0 ,y1 ,@rp3 ;p<-mantisa*pow(2,-i/4)
;y1<-shift value
eld x0 ,p
emul x0y1 ;p<-(signed mantisa)*pow(2,-i/4)*shift
eld b ,p
enegt b
eld @rp0+d0,b ;dummy for delay, rp0+=1
cmp eq ,r2 ,#0
brfd DequantizerScaleLoop
dec r2
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; B In i
;
; Order = X0 X1 X X2
; f(X0) f(X1) f(X) f(X2)
; f(X) = f(X0) + (X-X0)[f(X1)-f(X0)] + (X-X0)(X-X1)[(f(X2)-f(X1))-(f(X1)-f(X0))]/2
; = f(X0) + (X-X0)[f(X1)-f(X0)][1-(X-X1)/2] + (X-X0)(X-X1)[f(X2)-f(X1)]/2
; = f(X0) + (X-X0)[[f(X1)-f(X0)][1-(X-X1)/2] + (X-X1)[f(X2)-f(X1)]/2]
;
; = f(X0) + [[f(X1)-f(X0)][1-(X-X1)/2] + (X-X1)[f(X2)-f(X1)]/2]
; +[[f(X1)-f(X0)][1-(X-X1)/2] + (X-X1)[f(X2)-f(X1)]/2]*(X-X0)'s fraction
; The result is based on f(X1)
;
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
NewtomMethod:
///caution
esft b ,sa ;sr<-i/64, sg<-i%64
eld a ,sr ;a<-i/64
eld rp3 ,a
///caution (esra8 a)
eld a ,sg
esra8 a
ecld r0 ,a
cmp eq ,r0 ,#0
brt NewtomMethodZero
eld ma1 ,ma0 ;backup
erpn rp3 ,#tbl_exponentOfPow43Org
eld a ,@rp3+s1 ;a<-f(X1)'s exponent
esra8 a ;because of in xdm area
esra8 a ;a<-exponent
eld x0 ,a
ecld r0 ,a ;backup
eld b ,@rp3+s0 ;b<-f(X0)'s exponent
esra8 b ;because of in xdm area
esra8 b ;b<-exponent
ecp a ,b
etst nz ,t
erps rp3+s0
eld b ,@rp3+s1 ;ma0<-f(X2)'s exponent
esra8 b ;because of in xdm area
esra8 b ;b<-exponent
eld ma0 ,b ;backup
;t<-nz
;---- Calculate f(X1)-f(X0)
;y1 <- f(X1)-f(X0)
eld b ,sr ;b<-i/64
eld rp3 ,b
erpn rp3 ,#tbl_mantisaOfPow43Org ;rp3<-tbl_mantisaOfPow43Org+i/64
eld a ,@rp3+s1 ;a<-f(X1)
eld b ,@rp3+s0 ;b<-f(X0)
esrat b ;b<-f(X0)/2 when exponents differ
esub a ,b ;a<-f(X1)-f(X0)
eld y1 ,a ;y1<-f(X1)-f(X0)
eld a ,x0
ecp a ,ma0 ;compare f(X1) vs. f(X2)'exponent
etst nz ,t ;t<-nz
eld ma0 ,b ;ma0<-f(X0)/2,conditionally
eld a ,sg ;a[15:0]<-(X-X1)
esra8 a
efz8 a ;a[23:16]<-0,c<-0
esrc a ;a[15:0]<-(X-X1)'s fraction
;because of sign bit
esrc a ;a[15:0]<-(X-X1)/2's fraction
eld b ,#0x8000
efz8 b
esub b ,a
esla8 b ;b<-[1-(X-X1)/2]
eld x0 ,b
emul x0y1 ;p<-[f(X1)-f(X0)][1-(X-X1)/2]
esla8 a ;a[23:0]<-(X-X1)/2's fraction
eld x0 ,a ;x0<-(X-X1)/2's fraction
;---- Calculate f(X2)-f(X1)
;
erps rp3+s0
eld b ,@rp3+s1 ;b<-f(X2)
eslat b ;b<-f(X2)*2 when exponents differ
eld c ,@rp3+s0
esub b ,c ;b<-f(X2)-f(X1)
eld y1 ,b
eld b ,ma0
emld ma0 ,x0y1 ;ma0<-[f(X1)-f(X0)][1-(X-X1)/2]
;p<-(X-X1)[f(X2)-f(X1)]/2
emad ma0 ,x0y1
eld x0 ,ma0 ;ma0<-[f(X1)-f(X0)][1-(X-X1)/2]
;+(X-X1)[f(X2)-f(X1)]/2
esla a
eld y1 ,a ;y1<-(X-X1)'s fraction
eld p ,ma0 ;p<-
eld ma0 ,b ;ma0<-f(X0)/2,conditionally
emad ma0 ,x0y1 ; ma0a<-
emad ma0 ,x0y1 ;forma0a+=p
eld x0 ,ma0
eld ma0 ,ma1
ecld a ,r0
efs16 a
eadd a ,#-8
eadd a ,ma0
eld b ,rpd1.index_LbackupB
//
eld b ,b
//
etst neg ,t
jmp DequantizerScaleCommon
NewtomMethodZero
erpn rp3 ,#tbl_exponentOfPow43Org
eld a ,@rp3+s1 ;a<-f(X1)'s exponent
esra8 a ;because of in xdm area
esra8 a ;a<-exponent
eadd a ,#-8
eadd a ,ma0
eld b ,sr
eadd b ,si
eld rp3 ,b ;tbl_mantisaOfPow43Org+i/64
eld x0 ,@rp3+s0
jmp DequantizerScaleCommon
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -