?? dechuff.s
字號:
;---------------------------------------------------------------------------------
; The following program will decoding MP3 bitstream
; by S/W Algorithm
; File Name: dechuff.s
; copyright jj,Park 1999.2.7
;
; using from %9 to %14
; profile
; 1. 27/5//1999
; - For monitoring a starting frequency of zero-part,
; insert 'index_GzeroPartCh0/index_GzeroPartCh1 register'.
; These value are using to optimize looping counter
; 2. 2/11//1999
; - For having robustness against a bitstream error
; insert r2/r3 as protect loop-counter from overlooping
; 3. Change FillRestWithZero with DecodeOfCount1RET at CheckDismissStuffingBits
;---------------------------------------------------------------------------------
.include "mp3_def.h"
.include "mp3_ext.h"
MP3DechuffSection
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
; Method using a 1-bit search
;
; y0 esc value
; y1 Region2start
;
; table code x,y
; or v,w,x,y,0,0,0,0
;
; rp0 is modulo (1024-word)
; esd1 d0 1
; esd2 s0 1
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DecodingHuffman::
esec2 #sec_z ;ec2<-z-flag
eld sd0 ,#((-4&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(1<<0)
eld sd1 ,sd0
eld sd3 ,#0xF110
eld a ,#0
eld rpd1.index_LloopCounti, a
eld a ,#tbl_hcodeEsc
eld rpd1.index_ptrHEscTable,a
eld a ,#1
eld p ,a ;using for 1-bit fetch
eld sa ,#1 ;shift amount=1
ld r2 ,#0x1 ;high loop
ld r3 ,#0x1f ;low loop
eld a ,rpd1.index_GptrCurrentDecodingData ;output buffer pointer
eld rp0 ,a
eld a ,rpd0.index_blockType ;a[23:16]:windowSwitchFlag
ecld r0 ,ah
cmp eq ,r0 ,#1
brf DecodingHuffmanLong
ecld r0 ,a
srb r0
cmp eq ,r0 ,#2
brf DecodingHuffmanLong
eld x1 ,#(36/2) ;x1:Region1Start
eld y1 ,#(576/2) ;y1:Region2Start
ldb r0 ,@[a13+Index_SamplingFreq] // caution
cmp eq ,r0 ,#11
brf pass_8khzShort
eld x1 ,#(72/2) // for mpeg2.5 8Khz
pass_8khzShort
jmp AfterRegionSetting
DecodingHuffmanLong
eld a ,rpd0.index_region0Count ;a[23:16]:region0Count
;a[15:8]:region1Count
;a[7:0]:preFlag
esra8 a ;a>>=8
eld y1 ,a
esra8 a ;a>>=8
eld c ,rpd1.index_GLongSfBandIndex ;+frequency index
eadd a ,c
eadd a ,#1
eld rp3 ,a
eld a ,@rp3+s1 ;a:Region1Start
efz8 a
esra a
eld x1 ,a ;x1:Region1Start
eld a ,y1 ;a<-region1Count
efz16 a
eadd a ,rp3
eld rp3 ,a
eld a ,@rp3
efz8 a
esra a
eld y1 ,a ;y1:Region2Start
AfterRegionSetting
eld a ,rpd0.index_tableSelection0 ;a[23:16]:tableSelection0
;a[15:8]:tableSelection1
;a[7:0]:tableSelection2
esra8 a ;a>>=8
esra8 a ;a>>=8
jmp Region0Region1Region2
DecodeOfBigValueLoop1
ecp a ,x1 ;check whether region0 over
DecodeOfBigValueLoop2
enop
bra ec0 ,CheckRegion2 ;ec0:NZ= if a ==x1
eld a ,rpd0.index_tableSelection1 ;a[23:16]:tableSelection0
;a[15:8]:tableSelection1
;a[7:0]:tableSelection2
esra8 a ;a<-tableSelection1
jmp Region0Region1Region2
CheckRegion2
ecp a ,y1 ;check whether region1 over
enop
bra ec0 ,PassHuffmanInformation ;ec0:NZ flag
eld a ,rpd0.index_tableSelection2 ;a[23:16]:tableSelection0
;a[15:8]:tableSelection1
;a[7:0]:tableSelection2
Region0Region1Region2
efz16 a
eld rp3 ,a
eld c ,rpd1.index_ptrHEscTable
eadd a ,c
eld rp2 ,a
eld a ,@rp2 ;y0<-esc value
efz16 a
eld y0 ,a
erpn rp3 ,#tbl_ptrHcode ;hcode address
eld a ,@rp3
ecld r4 ,a
cmp eq ,r4 ,#0
brt GetHuffmanDecoderError
eld rp2 ,a ;rp2<-Huffman code table
PassHuffmanInformation
eld a ,rpd1.index_LloopCounti
eld c ,rpd0.index_bigValues ;check whether conversion end?
ecld r0 ,a
ecld r1 ,c
cmp eq ,r0 ,r1
brt BigValueExit
eld rp3 ,rp2 ;recover Huffman code table
ld r6 ,#19 ;r1<-level
eld a ,@rp3
BigValueHcodeLoop
ecld r0 ,a ;for checking high byte
srb r0
cmp eq ,r0 ,#0 ;ends?
brt BigValueEndHcode
esft sr ,sa
etst nc ,t
eadd b ,sa
enop
bra ec1 ,%f9 ;ec1 = nc
eld b ,#-16 ;indicates remained bit
eld c ,@rp1+s0 ;rp0 += 1
esla8 c
eld sr ,c
%9 esra8t a ;if t,a >>= 8;
efz16 a ;a[23:8] <- 0
eadd a ,rp3
eld rp3 ,a
bnzd r6 ,BigValueHcodeLoop ;r1;level check
eadd ma0 ,p ,a ,@rp3 ;USED_BIT += 1
;a<-next table entry value
jmp GetHuffmanDecoderError
BigValueEndHcode ;a[7:4]<-x, a[3:0]<-y
efz8 a ;for checking whether x&y are zero
ecld r0 ,a
cmp eq ,r0 ,#0
brt BigValueXYZero
ld r6 ,#1
eld sg ,a
enmsk sg ,#4 ;sg[15:4]<-0
eld si ,sg ;backup
esra a
esra a
esra a
esra a ;a<-x
BigvalueXYLoop
enop
bra ec2 ,BigValueOneZeroOfXY ;check if x==0
eld x0 ,a ;backup
ecp a ,#15
enop
bra ec0 ,BigvalueFetchSign ;check max
eld a ,y0 ;a<-esc
enop
bra ec2 ,BigvalueSkipEsc ;ec2:checking esc_value
esft sr ,a
eadd b ,a ;b:esc value
enop
bra ec1 ,%f10 ;ec1 = nc
eld c ,@rp1+s0 ;rp0 += 1
esla8 c
eld sr ,c
esftl sr ,b ;fetch esc value
eadd b ,#-16
%10 eadd a ,ma0 ;used_bit +=esc
eld ma0 ,a
eld a ,sg ;a<-esc_value
BigvalueSkipEsc
eadd a ,x0 ;a<-hcode+esc_value
BigvalueFetchSign
esft sr ,sa ;fetch sign bit
etst c ,t
eadd b ,sa
enop
bra ec1 ,%f11 ;ec1 = nc
eld b ,#-16 ;indicates remained bit
eld c ,@rp1+s0 ;rp1 += 1
esla8 c
eld sr ,c
%11 eadd ma0 ,p ;USED_BIT+=1
enegt a ;negative if C
BigValueOneZeroOfXY
eld @rp0+d0 ,a ;save
bnzd r6 ,BigvalueXYLoop
eld a ,si ;recover
jmp BigValueXYLoopCommon
BigValueXYZero
eld @rp0+d0 ,a ;save x
eld @rp0+d0 ,a ;save y
BigValueXYLoopCommon
eld a ,rpd1.index_LloopCounti
eadd a ,#1
eld rpd1.index_LloopCounti, a
cmp eq ,r3 ,#0
brfd DecodeOfBigValueLoop1
dec r3
ecp a ,x1 ;check whether region0 over
cmp eq ,r2 ,#0
brfd DecodeOfBigValueLoop2
dec r2
BigValueExit
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Count1 Part Decoding
; ec2: z-flag
; ma0 I USED_BIT(scalefactor+huffman code data)
; sa I 1
; rp2 U points hcode table A
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DecodeOfCount1:
eld a ,rpd1.index_GptrCurrentDecodingData
eadd a ,#575
eld x1 ,a
eld c ,#Tbl_hcode32 ;rp2<-the pointer of table A
eld rp2 ,c
eld a ,ma0 ;b<-USED_BIT
DecodeOfCount1Loop
esec1 #sec_c ;ec1=c
eld c ,rpd0.index_part23Lenght ;Compare USED_bit Vs.part23Lenght
esub a ,c
ecld r0 ,a
cmp ge ,r0 ,#0
brt CheckRewindNbits
esec1 #sec_nc
eld a ,x1
ecld r0 ,a
eld c ,rp0
ecld r1 ,c
cmpu ge ,r0 ,r1
brf CheckDismissStuffingBits
eld a ,rpd0.index_count1TableSelect ;a[23:16]=Null zero
;a[15:8]=scalefac_scale
;a[7:0]=count1table_select
efz16 a
ecld r0 ,a
cmp eq ,r0 ,#0
brt Count1TableSelect0
;Only inverter operation
eld a ,#4 ;a<-hcode length
esft sr ,a
eadd b ,a
enop
bra ec1 ,Count1Table1NonLink ;ec1 = nc
eld c ,@rp1+s0 ;rp0 += 1
esla8 c
eld sr ,c
esftl sr ,b
eadd b ,#-16
Count1Table1NonLink
eadd a ,ma0 ;USED_BIT += hcode
eld ma0 ,a
eld a ,sg ;0,0,0,0,v,w,x,y
esla a
Count1Table0Table1Common
eld rp3 ,a
erpr rp3 ;bit reverse
eld a ,rp3 ;a<-0,0,0,0,y,x,w,v
ecld r0 ,a
ld r6 ,#3
Count1Table1vwxyLoop
eld a ,#0
ld r2 ,r0
sr r0
and r2 ,#0x1
cmp eq ,r2 ,#1
brt Count1Table1PassSign
eld a ,#1 ;a<-1
esft sr ,sa ;fetch sign bit
etst c ,t
enegt a ;negative if c
eadd ma0 ,p ;USED_BIT+=1
eadd b ,sa
enop
bra ec1 ,Count1Table1PassSign ;ec1 = nc
eld b ,#-16 ;indicates remained bit
eld c ,@rp1+s0 ;rp1 += 1
esla8 c
eld sr ,c
Count1Table1PassSign
bnzd r6 ,Count1Table1vwxyLoop
eld @rp0+d0 ,a ;save
eld a ,ma0 ;b<-USED_BIT
jmp DecodeOfCount1Loop
Count1TableSelect0
ld r6 ,#6 ;for checking level
eld rp3 ,rp2 ;rp3<-table0 A
eld a ,@rp3
Count1Table0Loop
ecld r0 ,a ;for checking high byte
srb r0
cmp eq ,r0 ,#0
brt Count1Table0Table1Common ;check whether conversion
;ends?
esft sr ,sa
etst nc ,t
eadd b ,sa
enop
bra ec1 ,%f15 ;ec1 = nc
eld b ,#-16 ;indicates remained bit
eld c ,@rp1+s0 ;rp0 += 1
esla8 c
eld sr ,c
%15
esra8t a ;if t,a >>= 8;
efz16 a ;a[23:8] <- 0
eadd a ,rp3
eld rp3 ,a
bnzd r6 ,Count1Table0Loop ;r1;level
eadd ma0 ,p ,a ,@rp3 ;USED_BIT += 1
GetHuffmanDecoderError
ld r0 ,#1
ldb @[a13+Index_FrameErrorFlag] ,r0 ;indicates "FALSE"
ldb @[a10+Index_DecodeErrFlag] ,r0
esec2 #sec_t ;ec2<-t flag
er me1
ret
CheckDismissStuffingBits
eld x1 ,#16
eld a ,rpd0.index_part23Lenght
esub a ,ma0
eld sg ,a
esra a
esra a
esra a
esra a
ecld r6 ,a
//s
ld r6 ,r6
//
enmsk sg ,#4
eld a ,sg
DismissStuffingBitsLoop
esft sr ,a
eadd b ,a
enop
bra ec1 ,DismissStuffingNonLink ;ec1=nc=1,if -b<=sa
eld c ,@rp1+s0 ;rp1 += 1
esla8 c
eld sr ,c
esftl sr ,b
eadd b ,#-16
DismissStuffingNonLink
bnzd r6 ,DismissStuffingBitsLoop
eld a ,x1
jmp FillRestWithZero
CheckRewindNbits
;-------- CheckRewindNbits -------------
enop
bra ec2 ,FillRestWithZero ;ec1=nc=1,if -b<=sa
//////////////
// 2003.07.10 for only GOGO
eld y1 ,a
eld a ,rpd0.index_part23Lenght ;Compare USED_bit Vs.part23Lenght
ecp a ,#0
enop
bra ec2 ,GOGO_Enc
jmp GOGO_EncEnd
GOGO_Enc
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
eld a ,y1
jmp FillRestWithZero
GOGO_EncEnd
eld a ,y1
//////////////
erpd rp0+d1 ;rp0-=4
erps rp1+s1 ;adjust<-rp1--
esub b ,a
esub b ,#-16
enop
bra ec1 ,%f12 ;c=0,if rewind bits
;are at current pointer
eadd b ,#16
erps rp1+s1 ;back pointer
%12
eld c ,@rp1+s0
esla8 c
eld sr ,c
ecld r0 ,b
and r0 ,#0xf
eld c ,#0
ecld c ,r0
eld sa ,c
esft sr ,sa
eadd b ,#-16
FillRestWithZero
esec1 #sec_n
eld a ,rp0
eld c ,rpd1.index_GptrCurrentDecodingData
ecp a ,c
enop
bra ec1 ,UnderPtr
eld c ,rpd1.index_GptrCurrentDecodingData ;a<-non-zero frequency size
esub a ,c
jmp UnderPtrEnd
UnderPtr
eld a ,#0
UnderPtrEnd
esec1 #sec_nc
eld rpd1.index_GzeroPartCh1,a ;save Ch1's non-zero frequency size
ldb r0 ,@[a13+Index_ChannelLoop]
cmp eq ,r0 ,#0
brt %f13
eld rpd1.index_GzeroPartCh0,a ;save Ch0's non-zero frequency size
%13 eadd a ,#-576
enop
bra ec1 ,%f14 ;ec1=nc, conversion end
jmp DecodeOfCount1RET
%14 eld @rp0+d0 ,ma0l ;fill with MAL-zero
eadd a ,#1
enop
bra ec1 ,%b14 ;ec1:carry
DecodeOfCount1RET
esec2 #sec_t ;ec2<-t flag
er me1
ret
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -