?? decpoly.s
字號:
;-----------------------------------------------------------
; The following program will decoding MP3 bitstream
; by S/W Algorithm
; File Name: decpoly.s
; copyright jj,Park 1999.2.7
;
; profile
; 1. 5/4//1999
; - Management for the pointer of 1024-buffer
; :insert index_GptrSynPrevious register
;
;-----------------------------------------------------------
.include "mp3_def.h"
.include "mp3_ext.h"
.extern GLayerDiff
MP3DecpolySection
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ptr_synthesisBuffer 1024 module size
; ptr_synthesisInputBuffer 576 size
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SynthesisPolyphase::
es op
eld mc1 ,#(7<<10)|512-1 ;modulo rp2/rp3 (512)
eld c ,rpd1.index_GptrCurrentDecodingData ;input buffer pointer
eld rp0 ,c
eld c ,rp0
eld rpd1.index_LRPxBackupBuffer ,c
eld a ,rpd1.index_GptrPcmSamples
eld b ,rpd1.index_GptrSynPrevious
ldb r0 ,@[a13+Index_ChannelLoop]
cmp eq ,r0 ,#0
brf Synth_ch
eadd b ,#1024 ;in case of two channel&ch0
eadd a ,#1
Synth_ch
eld rpd1.index_LptrPcmSamples ,a
;------------------fetch subband samples---------------------
;
;for i=0;i<16;++i
;{
; out[i] = in[i]+in[576-18*i]; //Even
; out[i+16] = in[18*i]-in[576-18*i]; //Odd
;}
;for i=0;i<8++i
;{
; temp = out[i]
; out[i] = out[i]+out[15-i];
; out[15-i]=temp-out[15-i];
;}
; d1 d0 s1 s0
; sd0 = xx | xx | xx | 18
; sd1 = -1 | 1 | -1 | 0
; sd2 = xx | 1 | xx | 0
; sd3 = xx | xx |-18 | xx
;
;------------------------------------------------------------
ld r1 ,#17
eld c ,rpd1.index_LRPxBackupBuffer
eld rp0 ,c
///////////////////////////////////////////////////////////////
eld a ,GLayerDiff
ecld r0 ,a
cmp eq ,r0 ,#2
brf pass_layer1
ld r1 ,#11
pass_layer1
//////////////////////////////////////////////////////////////
SynthesisPolyphaseLoop
er xsd ;disable rp0/rp3 extention
eld sd0 ,#((-1&0fh)<<12)|(1<<8)|((0&0fh)<<4)|((18&0fh)<<0)
eld sd1 ,#((-1&0fh)<<12)|(1<<8)|((-1&0fh)<<4)|(0<<0)
eld sd2 ,sd1
eld sd3 ,#((-1&0fh)<<12)|(1<<8)|((-18&0fh)<<4)|(1<<0)
es xsd ;enable rp0/rp3 extention
eld sd0 ,#(((-8&0f0h)>>4)<<12)|((1>>4)<<8)|(((0&0f0h)>>4)<<4)|(((18&0f0h)>>4)<<0) ;insert
eld sd3 ,#(((-1&0f0h)>>4)<<12)|((1>>4)<<8)|(((-18&0f0h)>>4)<<4)|((1>>4)<<0) ;insert
eld rp3 ,rp0
erpn rp3 ,#576-18
eld rp1 ,#Area_polyphaseTempBuffer1 ;even
eld rp2 ,#Area_polyphaseTempBuffer1+16 ;odd
ld r6 ,#15
SynthesisPolyphaseFetchLoop
eld p ,@rp3+s1 ;modify rp3-18
eld ma0 ,p ,a ,@rp0+s1
eadd a ,ma0 ,ma0 ,@rp0+s0 ;modify rp0+18
esub ma0 ,p ,@rp1+d0,a ;save even
bnzd r6 ,SynthesisPolyphaseFetchLoop
eld @rp2+d0 ,ma0 ;save odd
erps rp1+s1 ;Area_polyphaseTempBuffer1+15
eld rp2 ,#Area_polyphaseTempBuffer1
ld r6 ,#7
SynthesisPolyphaseMakeEvenLoop
eld p ,@rp1 ;modify rp3-18
eld ma0 ,p ,a ,@rp2
eadd a ,ma0 ,ma0 ,@rp2 ;modify rp0+18
esub ma0 ,p ,@rp2+d0,a ;save even
bnzd r6 ,SynthesisPolyphaseMakeEvenLoop
eld @rp1+d1 ,ma0
;----------------------odd-part------------------------------
;
;for i=0;i<16;++i
;{
; sum = 0;
; for j=0;j<16;j++
; sum += in[j]*dct16_16[i*16+j]; //dct16_16=G16*DCT16*H16
; out[i] = sum;
;}
; rp2 In ptr_imdctTempBuffer+9
;
; d1 d0 s1 s0
; sd0 = xx | xx | -15| 1
; sd1 = xx | xx | xx | xx
; sd2 = xx | 2 | xx | xx
; sd3 = xx | xx | xx | 1
;------------------------------------------------------------
eld sd0 ,#(((-1>>4)&0fh)<<12)|((1>>4)<<8)|(((-15&0f0h)>>4)<<4)|((1>>4)<<0) ;insert
er xsd ;disable rp0/rp3 extention
esd0 s0 ,#1
esd0 s1 ,#(-15&0xf)
esd2 d0 ,#2
es xsd ;enable rp0/rp3 extention
eld rp0 ,#Area_polyphaseTempBuffer1+16
eld rp3 ,#tbl_syndctOdd16x16
eld rp2 ,#Area_polyphaseTempBuffer2+1 ;correct 1999/7/1
ld r6 ,#15
eld x0 ,@rp0+s0,y0 ,@rp3+s0
emul x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;p = d(0)*c(0)
emld ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ; ma0= d(0)*c(0)
SynthesisPolyphaseOddLoop
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+ d(1)*c(1)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(2)*c(2)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(3)*c(3)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(4)*c(4)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(5)*c(5)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(6)*c(6)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(7)*c(7)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(8)*c(8)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(9)*c(9)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(10)*c(10)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(11)*c(11)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(12)*c(12)
emad ma0 ,x0y0 ,x0 ,@rp0+s1,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(13)*c(13)
;rp0-=15
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(14)*c(14)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(15)*c(15)
;p = d(0)*c(16)
ernd ma0
eld ma0 ,p ,@rp2+d0,ma0 ;ma0= d(0)*c(16), save ma0
bnzd r6 ,SynthesisPolyphaseOddLoop ;
emul x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;p = d(1)*c(17)
;----------------------Even-even part--------------------------
;
;for i=0;i<8;++i
;{
; sum = 0;
; for j=0;j<8;j++
; sum += in[j]*dct88[i*8+j];
; out[i] = sum;
;}
; d1 d0 s1 s0
; sd0 = xx | xx | -7 | 1
; sd1 = xx | xx | xx | xx
; sd2 = xx | 4 | xx | xx
; sd3 = xx | xx | xx | 1
;------------------------------------------------------------
er xsd ;disable rp0/rp3 extention
esd0 s1 ,#-7
esd2 d0 ,#4
eld rp0 ,#Area_polyphaseTempBuffer1
eld rp3 ,#tbl_syndctEvenEven8x8
eld rp2 ,#Area_polyphaseTempBuffer2
ld r6 ,#7
eld x0 ,@rp0+s0,y0 ,@rp3+s0
emul x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;p = d(0)*c(0)
emld ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ; ma0= d(0)*c(0)
SynthesisPolyphaseEvenEvenLoop
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+ d(1)*c(1)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(2)*c(2)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(3)*c(3)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(4)*c(4)
emad ma0 ,x0y0 ,x0 ,@rp0+s1,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(5)*c(5)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(6)*c(6)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(7)*c(7)
;p = d(0)*c(0)
ernd ma0
eld ma0 ,p ,@rp2+d0,ma0 ;ma0= d(0)*c(0), save ma0
bnzd r6, SynthesisPolyphaseEvenEvenLoop ;
emul x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;p = d(1)*c(1)
;----------------------Even-odd part--------------------------
;
;for i=0;i<8;++i
;{
; sum = 0;
; for j=0;j<8;j++
; sum += in[15-j]*dct88[i*8+j];
; out[i] = sum;
;}
; d1 d0 s1 s0
; sd0 = xx | xx | xx | -1
; sd1 = xx | xx | 7 | xx
; sd2 = xx | 4 | xx | xx
; sd3 = xx | xx | xx | 1
;------------------------------------------------------------
esd0 s0 ,#-1
esd0 s1 ,#7
eld rp0 ,#Area_polyphaseTempBuffer1+15
eld rp3 ,#tbl_syndctEvenOdd8x8
eld rp2 ,#Area_polyphaseTempBuffer2+2
ld r6 ,#7
eld x0 ,@rp0+s0,y0 ,@rp3+s0
emul x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;p = d(0)*c(0)
emld ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ; ma0= d(0)*c(0)
SynthesisPolyphaseEvenOddLoop
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+ d(1)*c(1)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(2)*c(2)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(3)*c(3)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(4)*c(4)
emad ma0 ,x0y0 ,x0 ,@rp0+s1,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(5)*c(5)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(6)*c(6)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= d(0)*c(0)+..+d(7)*c(7)
;p = d(0)*c(0)
ernd ma0
eld ma0 ,p ,@rp2+d0,ma0 ; ma0= d(0)*c(0), save ma0
bnzd r6 ,SynthesisPolyphaseEvenOddLoop
emul x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;p = d(1)*c(1)
;---------------------Expansion 64 samples-------------------
;
;for i=0;i<16;++i
;{
; out[i] = in[i+16];
; out[i+17] = -in[31-i];
; out[i+32] = -in[16-i];
; out[i+48] = -in[i];
;}
;out[16] = 0;
;
;
; d1 d0 s1 s0
; sd0 = -1 | 1 | xx | xx
; sd1 = 0 | 1 | xx | xx
; sd2 = xx | xx | -1 | 0
; sd3 = xx | xx | xx | xx
;
; rp0/rp1 is modified as 1024-modulo
;------------------------------------------------------------
eld rp2 ,#Area_polyphaseTempBuffer2+31
eld rp0 ,b
eld rp1 ,b
es me0 ;enable rp0 to modulo
es me1 ;enable rp1 to modulo
erpn rp0 ,#16
erpn rp1 ,#17
eld a ,#0
eld @rp0+d1 ,a ;out[16] = 0
; out[i] = in[i+16];
; out[i+17] = -in[31-i];
ld r6 ,#14
SynthesisPolyphaseExpansion1
eld a ,@rp2+s1
eld @rp0+d1 ,a ;out[15-i] = in[31-i]
eneg a
bnzd r6 ,SynthesisPolyphaseExpansion1
eld @rp1+d0 ,a ;out[i+17] = -in[31-i]
eld a ,@rp2+s1 ;a<-in[16]
eld @rp0+d0 ,a ;out[0]<-a
eneg a
eld @rp1+d0 ,a ;out[32]<- -a
;rp3 = xx+32
;rp1 = out[32]
;rp0 = out[1]
erpn rp0 ,#62
ld r6 ,#14
SynthesisPolyphaseExpansion2
eld a ,@rp2+s1 ;a<-in[15]
eneg a
eld @rp1+d0 ,a ;out[33+i]<-a
bnzd r6 ,SynthesisPolyphaseExpansion2
eld @rp0+d1 ,a ;out[63-i]< -a
eld a ,@rp2 ;a<-in[0]
eneg a
eld @rp1 ,a ;out[48]<- -a
;-------------Filter & Reconstruction to PCM samples---------
;
; Table Di must be aligned by 512-word
;for (i = 0;i<=31;++i)
;{
; k = i;
; n = i;
; for(j = 0; j < 8; j++)
; {
; sum += Di[n] * b[k];
; k = (k + 96) & 0x3ff;
; sum += Di[n+32] * b[k];
; k = (k + 32) & 0x3ff;
; n += 64;
; }
; *pcm_sample++ = sum;
;}
;
; d1 d0 s1 s0
; sd0 = 1 | 1 | 32 | 96
; sd1 = xx | xx | xx | xx
; sd2 = xx | 1 | xx | xx
; sd3 = xx | xx | 33 | 32
;------------------------------------------------------------
eld sd0 ,#((-64&0fh)<<12)|(1<<8)|((32&0fh)<<4)|((96&0fh)<<0) ;insert
eld sd3 ,#((-1&0fh)<<12)|(1<<8)|((33&0fh)<<4)|((32&0fh)<<0) ;insert
esd2 d0 ,#2 ;in case of stereo
es xsd ;enable rp0/rp3 extention
eld sd0 ,#(((-64>>4)&0fh)<<12)|(((1>>4)&0fh)<<8)|(((32>>4)&0fh)<<4)|(((96>>4)&0fh)<<0) ;insert
eld sd3 ,#(((-1>>4)&0fh)<<12)|(((0>>4)&0fh)<<8)|(((33>>4)&0fh)<<4)|(((32>>4)&0fh)<<0) ;insert
eld rp0 ,b
eld c ,rpd1.index_LptrPcmSamples
eld rp2 ,c
eld rp3 ,#tbl_synthesisDi
// eld mc1 ,#0x1de0
es me0 ;enable rp0 to modulo
// es me3 ;enable rp3 to modulo
ld r6 ,#31
ld r2 ,#0 //temp
eld x0 ,@rp0+s0,y0 ,@rp3+s0
emul x0y0 ,x0 ,@rp0+s1,y0 ,@rp3+s0 ;p = b(0)*d(0)
emld ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ; ma0= d(0)*c(0)
SynthesisPolyphaseWindowLoop
emad ma0 ,x0y0 ,x0 ,@rp0+s1,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+ b(96)*d(32)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(128)*d(64)
emad ma0 ,x0y0 ,x0 ,@rp0+s1,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(224)*d(96)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(256)*d(128)
emad ma0 ,x0y0 ,x0 ,@rp0+s1,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(352)*d(160)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(384)*d(192)
emad ma0 ,x0y0 ,x0 ,@rp0+s1,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(480)*d(224)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(512)*d(256)
emad ma0 ,x0y0 ,x0 ,@rp0+s1,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(608)*d(288)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(640)*d(320)
emad ma0 ,x0y0 ,x0 ,@rp0+s1,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(736)*d(352)
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(768)*d(384)
emad ma0 ,x0y0 ,x0 ,@rp0+s1,y0 ,@rp3+s1 ;ma0a= b(0)*d(0)+..+b(864)*d(416)
;rp0/rp3 is operated as modulo
;rp3 points d[1]
erpd rp0+d0 ;points rp0 to b(1)
// temp 0606
add r2 ,#1
eld rp3 ,#tbl_synthesisDi
eld c ,#0
ecld c ,r2
eadd c ,rp3
eld rp3 ,c
//
emad ma0 ,x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(896)*d(448)
emad ma0 ,x0y0 ,x0 ,@rp0+s1,y0 ,@rp3+s0 ;ma0a= b(0)*d(0)+..+b(992)*d(480)
/////////// 1017
eld a ,GLayerDiff
ecld r4 ,a
cmp eq ,r4 ,#0
brf pass_layer3
esla ma0 ;layer3 only
esla ma0
pass_layer3
esla ma0
eld a ,ma0rn ;round a<-ma0[51:24]+ma0[23]
esra8 a
eincc a ;rounding
ecp a ,#7fffh
etst neg ,t
enop
bra ec2 ,sat_16bit
eld a ,#7fffh
sat_16bit
eld ma0 ,p ,@rp2+d0,a ;save a(PCM Data),ma0= b(1)*d(1)
emul x0y0 ,x0 ,@rp0+s0,y0 ,@rp3+s0 ;p = b(1)*d(1)
cmp eq ,r6 ,#0
brfd SynthesisPolyphaseWindowLoop
dec r6
;b is used the pointer of each 1025-buffer
// eld mc1 ,#0x1dff
eld rp0 ,b
es me0 ;enable rp0 to modulo
erpd rp0+d1 ;-64,modulo modify (1024)
eld b ,rp0
eld c ,rp2
eld rpd1.index_LptrPcmSamples ,c
er me0
er me1
er me3
eld c ,rpd1.index_LRPxBackupBuffer
eld rp0 ,c
erpd rp0+d0
eld c ,rp0
eld rpd1.index_LRPxBackupBuffer ,c
cmp eq ,r1 ,#0
brfd SynthesisPolyphaseLoop
dec r1
er xsd ;disable rp0/rp3 extention
er op
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;x = &x[NUM_DCTBANDS];
;for(sb = 1; sb < NUM_SUBBANDS; sb += 2)
;{
; for(dct = 1; dct < NUM_DCTBANDS; dct += 2)
; x[dct] = -x[dct];
; x = &x[2 * NUM_DCTBANDS];
;}
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
InversionFreqLine::
er xsd ;disable rp0/rp3 extention
eld sd0 ,#((18&0fh)<<12)|(2<<8)|((19&0fh)<<4)|((0&0fh)<<0)
es xsd ;enable rp0/rp3 extention
eld sd0 ,#(((18&0f0h)>>4)<<12)|((2>>4)<<8)|(((19&0f0h)>>4)<<4)|(((0&0f0h)>>4)<<0) ;insert
eld c ,rpd1.index_GptrCurrentDecodingData ;input buffer pointer
eld rp0 ,c
erps rp0+s1 ;rp0+=19
ld r7 ,#15 ;sub band size
ld r6 ,#8 ;
InversionFreqLineSfbLoop
eld a ,@rp0+s0 ;a<-@rp0
eneg a
bnzd r6 ,InversionFreqLineSfbLoop
eld @rp0+d0 ,a ;a<-@rp0, rp0+=2
erpd rp0+d1 ;rp0+=18
bnzd r7 ,InversionFreqLineSfbLoop
ld r6 ,#8 ;
er xsd ;disable rp0/rp3 extention
ret
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -