home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 6
/
AACD06.ISO
/
AACD
/
Sound
/
DelfMPEG
/
src
/
MP2.a56
< prev
next >
Wrap
Text File
|
1999-10-27
|
60KB
|
1,558 lines
;*****************************************************************************
;
; DelfMPEG - MPEG audio player for Delfina DSP
; Copyright (C) 1999 Michael Henke
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
;
;*****************************************************************************
;Delfina object DSP56K_MP2
;memory map (for Amiga access)
;
; prog
; 0 .. init (x1=mem_mp2, x0=mem_mp2p, y1=/, y0=/)
; +2 .. decode MP2 frame (x1=mono, x0=outbuf, y1=translate, y0=jsbound)
;
; xdata
; +2048 .. inbuf (Amiga write)
;
; ydata
; /
DELFINA_SAMPLES equ 1152
include 'delfequ.inc'
org p:
;->prog
jmp init
;->prog+2
;*****************************************************************************
;
; **** MPEG layer II frame decoder ****
;
; parameters
; x1 - mono (mono: not_zero, stereo: zero)
; x0 - output buffer (mono: x: only, stereo: x: left, y: right)
; y1 - translate (for sblimit, bitalloc, quantization)
; y0 - jsbound
;
; xdata+2048 - input buffer (frame data without header, max. 1800 bytes)
;
;
; based on the mp2 player for Atari Falcon by Fredrik Noring
;
; Delfina DSP coding by Smack/Infect!
;
;
; (Thu 07-Oct-1999) - first beta version, mono decoding doesn't work
; (Fri 15-Oct-1999) - code cleanup+optimizing, little speedup
; (getbits loop, rsinx_rcosx table to internal mem)
; fixed mono decoding (decode_subbands bug: #>2+3)
;
;*****************************************************************************
move x0,x:out_p ;store output pointer
tfr x1,a #>1,x0 ;a=mono
tst a #>2,a
tne x0,a
move a,x:channels ;store channels
move y1,n0 ;translate
move #table_translate_sblimit,r0
move y1,x:translate
move y0,x:jsbound ;store jsbound
move y:(r0+n0),y1
move #table_translate_alloc,r0
move y1,x:sblimit
move y:(r0+n0),y1
move #table_translate_quantizations,r0
move y1,x:decoder_nbals
move y:(r0+n0),y1
move y1,x:decoder_quantizations
; ** compute audio buffer modifiers
move #>$7ff,x0
move #>128,x1
move #>2,y0
move x:channels,b
move #>$3ff,a
cmp y0,b #>64,b
teq x0,a
teq x1,b
move a,x:decoder_audio_mask
move b,x:decoder_audio_delta
; ** calculate deltas for the cosine transform
move x:channels,a
lsl a a,y0
add y0,a
move a,x:decoder_imfct_delta
clr a #decoder_fraction,r0
do #2*32*3,clear_fraction
move a,x:(r0)+
clear_fraction
move x:getbits_temp_p,r0
move #inbuf,x0
move x0,x:getbits_stream_p
move a,x:(r0)+
move a,x:(r0) ;initialize 'current bitstream word'
;******************************************************************
;decode_scales
; ** getbits_init
move x:getbits_stream_p,r7
move x:getbits_temp_p,r6
move x:decoder_getbits_loop_p,r5
; **
; ** fetch bit allocation table
; **
clr b x:channels,y0 ; count scfsis
move x:decoder_nbals,r0
move #decoder_bitalloc,r1
; ** loop until jsbound
move y:(r0)+,x0 ; nbal
move x:jsbound,a
do a,sb_loop0
do y0,ch_loop0
clr a b1,x:(r6)+ ;save b1
move x:(r6),b1 ;current bitstream word
jsr (r5) ; read nbal bits
move b1,x:(r6)
move x:-(r6),b1 ;restore b1
move #>1,x1
add x1,b b,x1
tst a a,x:(r1)+
teq x1,b
ch_loop0
move y:(r0)+,x0 ; nbal
sb_loop0
; ** loop until sblimit (for joint-stereo only)
move x:sblimit,a
move x:jsbound,y0
sub y0,a
jeq sb_loop1 ; not joint-stereo
move #>2,x1
do a,sb_loop1
clr a b1,x:(r6)+ ;save b1
move x:(r6),b1 ;current bitstream word
jsr (r5) ; read nbal bits
move b1,x:(r6)
move x:-(r6),b1 ;restore b1
add x1,b a,x:(r1)+ b,y0
tst a a,x:(r1)+
teq y0,b
move y:(r0)+,x0 ; nbal
sb_loop1
tst b x:(r6)+,x0 b,y0 ;update r6 (getbits nosave b1)
jeq exit ;invalid frame!!!
; **
; ** fetch scalefactor selection information
; **
move #decoder_scfsi,r0
move #>2,x0 ; 2 bit scfsi
clr a x:(r6),b1 ;current bitstream word
do y0,sf_loop0
jsr (r5)
clr a a,x:(r0)+
sf_loop0
move b1,x:(r6)
; **
; ** fetch scale factors
; **
move #decoder_scfsi,r0
move #decoder_scalefactor,r1
move #>6,x0 ; 6 bit scalefactors
do y0,sf_loop1
clr a x:(r0)+,y0
cmp y0,a #>1,a
jne sf_c1
clr a x:(r6),b1 ;current bitstream word
jsr (r5) ; all three
clr a a,x:(r1)+
jsr (r5)
clr a a,x:(r1)+
jsr (r5)
move a,x:(r1)+
jmp sf_resume
sf_c1 cmp y0,a #>2,a
jne sf_c2
clr a x:(r6),b1 ;current bitstream word
jsr (r5) ; 1 + 3
move a,x:(r1)+
clr a a,x:(r1)+
jsr (r5)
move a,x:(r1)+
jmp sf_resume
sf_c2 cmp y0,a
jne sf_c3
clr a x:(r6),b1 ;current bitstream word
jsr (r5) ; just one
move a,x:(r1)+
move a,x:(r1)+
move a,x:(r1)+
jmp sf_resume
sf_c3
clr a x:(r6),b1 ;current bitstream word
jsr (r5) ; 1 + 2
clr a a,x:(r1)+
jsr (r5)
move a,x:(r1)+
move a,x:(r1)+
sf_resume
move b1,x:(r6)
sf_loop1
; ** getbits_exit
move r7,x:getbits_stream_p
move #decoder_scalefactor+0,x0
move x0,x:decoder_sf_granule
move #decode_return00,x0
jmp decode_samples ;avoid stack overflow!
decode_return00
move #decode_return01,x0
jmp decode_samples ;avoid stack overflow!
decode_return01
move #decode_return02,x0
jmp decode_samples ;avoid stack overflow!
decode_return02
move #decode_return03,x0
jmp decode_samples ;avoid stack overflow!
decode_return03
move #decoder_scalefactor+1,x0
move x0,x:decoder_sf_granule
move #decode_return10,x0
jmp decode_samples ;avoid stack overflow!
decode_return10
move #decode_return11,x0
jmp decode_samples ;avoid stack overflow!
decode_return11
move #decode_return12,x0
jmp decode_samples ;avoid stack overflow!
decode_return12
move #decode_return13,x0
jmp decode_samples ;avoid stack overflow!
decode_return13
move #decoder_scalefactor+2,x0
move x0,x:decoder_sf_granule
move #decode_return20,x0
jmp decode_samples ;avoid stack overflow!
decode_return20
move #decode_return21,x0
jmp decode_samples ;avoid stack overflow!
decode_return21
move #decode_return22,x0
jmp decode_samples ;avoid stack overflow!
decode_return22
move #decode_return23,x0
jmp decode_samples ;avoid stack overflow!
decode_return23
exit move #0,x0
rts
;******************************************************************
decode_samples
move x0,x:decode_rts_p
; ** getbits_init
move x:getbits_stream_p,r7
move x:getbits_temp_p,r6
move x:decoder_getbits_loop_p,r5
move (r6)+ ;update r6 (getbits nosave b1)
move #decoder_bitalloc,r0
move #decoder_fraction,r1
move #2,n1
move x:decoder_quantizations,r2
move #16,n2
move x:jsbound,a
lsl a x:decoder_sf_granule,x0
move x0,x:decoder_sfp
move a,x:decoder_joint_countdown
; **
; ** read+decode samples from bitstream
; **
move x:sblimit,x0
move x0,x:decode_ds_sblimit_count
ds_sb_loop_head
move x:decode_ds_sblimit_count,a
move #>1,x0
sub x0,a
jeq ds_sb_loop ;avoid stack overflow!
move a,x:decode_ds_sblimit_count
move x:channels,x0
do x0,ds_ch_loop
; ** update joint-stereo counter and check bitalloc
move #>1,x0
move x:decoder_joint_countdown,b
sub x0,b x:(r0)+,a
tst a b,x:decoder_joint_countdown
jne ds_samples
; ** fill with zeroes
move a,x:(r1)+
move a,x:(r1)+
move a,x:(r1)+
jmp ds_resume
ds_samples
; ** check if joint-stereo applies
move #decoder_old_samples,r3
jclr #23,b1,ds_no_joint
jset #0,b1,ds_no_joint
; ** copy old samples for joint-stereo
move x:(r3)+,x0
move x0,x:(r1)+
move x:(r3)+,x0
move x0,x:(r1)+
move x:(r3)+,x0
move x0,x:(r1)-n1
jmp ds_scalefactor_adjust
ds_no_joint
; ** decode samples
move a,n2
move #table_bits,r3
move y:(r2+n2),n3 ; quantization
move #16,n2
move y:(r3+n3),x0 ; bits
clr a n3,y0
cmp y0,a #>1,a
jeq ds_fetch_grouping
cmp y0,a #>3,a
jeq ds_fetch_grouping
cmp y0,a n3,a
jeq ds_fetch_grouping
; ** no grouping, fetch triplet
lsl a x:(r6),b1 ;current bitstream word
lsl a #table_xmdc,r3
clr a a,n3
jsr (r5)
move b1,x:(r6)
move (r3)+n3
move #3,n3
; ** 'do #3'-loop unrolled to avoid stack overflow!
; ** remove greatest bit and check
; ** if the accumulator should be 0.0 or -1.0
clr b a,x1 y:(r3)+,y0 ; x
and y0,a #-0.5,y1
cmp x1,a a,x1 y:(r3)+,y0 ; m
teq y1,b
; ** add constant `d', multiply with
; ** the inverse, thus normalize sample,
; ** and multiply with the constant `c'
mpy y0,x1,a y:(r3)+,y0 ; d
add y0,b a0,y1
add y1,b y:(r3)-n3,y0 ; c
move b,y1
macr y0,y1,b ; remember that c is subtracted by 1.0!
move b,x:(r1)+
clr a x:(r6),b1 ;current bitstream word
jsr (r5)
move b1,x:(r6)
; ** remove greatest bit and check
; ** if the accumulator should be 0.0 or -1.0
clr b a,x1 y:(r3)+,y0 ; x
and y0,a #-0.5,y1
cmp x1,a a,x1 y:(r3)+,y0 ; m
teq y1,b
; ** add constant `d', multiply with
; ** the inverse, thus normalize sample,
; ** and multiply with the constant `c'
mpy y0,x1,a y:(r3)+,y0 ; d
add y0,b a0,y1
add y1,b y:(r3)-n3,y0 ; c
move b,y1
macr y0,y1,b ; remember that c is subtracted by 1.0!
move b,x:(r1)+
clr a x:(r6),b1 ;current bitstream word
jsr (r5)
move b1,x:(r6)
; ** remove greatest bit and check
; ** if the accumulator should be 0.0 or -1.0
clr b a,x1 y:(r3)+,y0 ; x
and y0,a #-0.5,y1
cmp x1,a a,x1 y:(r3)+,y0 ; m
teq y1,b
; ** add constant `d', multiply with
; ** the inverse, thus normalize sample,
; ** and multiply with the constant `c'
mpy y0,x1,a y:(r3)+,y0 ; d
add y0,b a0,y1
add y1,b y:(r3)-n3,y0 ; c
move b,y1
macr y0,y1,b ; remember that c is subtracted by 1.0!
move b,x:(r1)-n1
jmp ds_scalefactor_adjust
ds_fetch_grouping
; ** fetch grouped triplet
move #table_grouping,r3
clr a x:(r6),b1 ;current bitstream word
jsr (r5)
lsl a a,x0
add x0,a y:(r3+n3),r4
move a,n4
move b1,x:(r6)
move (r4)+n4
move y:(r4)+,a
move a,x:(r1)+ y:(r4)+,a
move a,x:(r1)+ y:(r4)+,a
move a,x:(r1)-n1
ds_scalefactor_adjust
; ** multiply samples with the
; ** corresponding scalefactors
move x:decoder_sfp,r3
move #3,n3
nop
move x:(r3)+n3,n3
move r3,x:decoder_sfp
move #table_multiple,r3
move x:(r1)+,x1
move y:(r3+n3),y0
move #decoder_old_samples,r3
mpyr x1,y0,a x:(r1)-,x0
move x1,x:(r3)+ ; old samples
move x0,x:(r3)+ ; old samples
mpyr x0,y0,a a,x:(r1)+n1
move x:(r1)-,x0
move x0,x:(r3)+ ; old samples
mpyr x0,y0,a a,x:(r1)+
move a,x:(r1)+
ds_resume
nop
ds_ch_loop
move (r2)+n2 ; update next to quantization
jmp ds_sb_loop_head
ds_sb_loop
; ** getbits_exit
move r7,x:getbits_stream_p
;******************************************************************
;decode_subbands
move #decoder_fraction,x0
move x0,x:decoder_imfct_fractionp
move #>3,x0
move x0,x:decode_tr3_count
tr_loop_head
move x:decoder_imfct_fractionp,r0
move #decoder_pcm64,x0
move x0,x:decoder_pcmp
move x:channels,b ;1 or 2
ch_loop_head
lsr b
move b,x:decode_channels_count ;0 or 1
; **
; ** perform inverse modified fast cosine transform
; **
move x:decoder_imfct_delta,n0
; ** first butterfly pass
move x:decoder_imfct_p,r1
move r1,r5
move #0.7071067812,y0 ; cos(pi/4)
move x:(r0)+n0,x0
do #8,bfy1
mpyr x0,y0,a x:(r0)+n0,x0
mpyr -x0,y0,a a,x:(r1)+ a,y:(r5)+
move a,x:(r1)+
mpyr x0,y0,a x:(r0)+n0,x0
mpyr -x0,y0,a x:(r0)+n0,x0 a,y:(r5)+
mpyr x0,y0,a a,x:(r1)+ a,y:(r5)+
mpyr -x0,y0,a a,x:(r1)+
move x:(r0)+n0,x0 a,y:(r5)+
bfy1
; ** second butterfly pass
move x:decoder_imfct_p,r0
move x:decoder_imfct_p16,r4
move x:decoder_imfct_p32,r6
move x:decoder_imfct_p48,r5
do #16,bfy2
move x:(r0),b y:(r4),y0
add y0,b x:(r4),x1 y:(r0),a
sub x1,a b,x:(r5) y:(r0),b
add x1,b x:(r0),a a,y:(r5)+
sub y0,a x:(r0),b b,y:(r6)
sub x1,b a,x:(r6)+ y:(r0),a
sub y0,a b,x:(r4) y:(r0),b
add y0,b x:(r0),a a,y:(r4)+
add x1,a b,y:(r0)
move a,x:(r0)+
bfy2
; ** perform the rest of the butterfly passes
; ** 'do #4'-loop unrolled to avoid stack overflow!
; ** pass 3
move x:decoder_imfct_p,r0
move x:decoder_tab_rsincosx_p,r1
move r1,r6
move #8,n0
do #4,grp3
lua (r0)+n0,r5
move r0,r4
move r5,r2
move x:(r1)+,x0
move x:(r0),b y:(r5),y1
mac -x0,y1,b x:(r2)+,x1 y:(r6)+,y0
; ** butterfly kernel
do n0,bfy3
macr y0,x1,b x:(r0),a
subl b,a b,x:(r0) y:(r4)+,b
mac y0,y1,b a,x:(r5) y:(r2),y1
macr x0,x1,b y:(r0),a
subl b,a x:(r4),b b,y:(r0)+
mac -x0,y1,b x:(r2)+,x1 a,y:(r5)+
bfy3 move (r0)+n0
grp3
; ** pass 4
move x:decoder_imfct_p,r0
move x:decoder_tab_rsincosx_p,r1
move r1,r6
move #4,n0
do #8,grp4
lua (r0)+n0,r5
move r0,r4
move r5,r2
move x:(r1)+,x0
move x:(r0),b y:(r5),y1
mac -x0,y1,b x:(r2)+,x1 y:(r6)+,y0
; ** butterfly kernel
do n0,bfy4
macr y0,x1,b x:(r0),a
subl b,a b,x:(r0) y:(r4)+,b
mac y0,y1,b a,x:(r5) y:(r2),y1
macr x0,x1,b y:(r0),a
subl b,a x:(r4),b b,y:(r0)+
mac -x0,y1,b x:(r2)+,x1 a,y:(r5)+
bfy4 move (r0)+n0
grp4
; ** pass 5
move x:decoder_imfct_p,r0
move x:decoder_tab_rsincosx_p,r1
move r1,r6
move #2,n0
do #16,grp5
lua (r0)+n0,r5
move r0,r4
move r5,r2
move x:(r1)+,x0
move x:(r0),b y:(r5),y1
mac -x0,y1,b x:(r2)+,x1 y:(r6)+,y0
; ** butterfly kernel
do n0,bfy5
macr y0,x1,b x:(r0),a
subl b,a b,x:(r0) y:(r4)+,b
mac y0,y1,b a,x:(r5) y:(r2),y1
macr x0,x1,b y:(r0),a
subl b,a x:(r4),b b,y:(r0)+
mac -x0,y1,b x:(r2)+,x1 a,y:(r5)+
bfy5 move (r0)+n0
grp5
; ** pass 6
move x:decoder_imfct_p,r0
move x:decoder_tab_rsincosx_p,r1
move r1,r6
move #1,n0
do #32,grp6
lua (r0)+n0,r5
move r0,r4
move r5,r2
move x:(r1)+,x0
move x:(r0),b y:(r5),y1
mac -x0,y1,b x:(r2)+,x1 y:(r6)+,y0
; ** butterfly kernel
;;;;; do n0,bfy6
macr y0,x1,b x:(r0),a
subl b,a b,x:(r0) y:(r4)+,b
mac y0,y1,b a,x:(r5) y:(r2),y1
macr x0,x1,b y:(r0),a
subl b,a x:(r4),b b,y:(r0)+
mac -x0,y1,b x:(r2)+,x1 a,y:(r5)+
bfy6 move (r0)+n0
grp6
; ** unscrambling and final adjustments
move x:decoder_imfct_p,r0
move x:decoder_audiop,r1
move #table_cosx,r4
move #table_sinx,r6
movec #0,m0 ; bit-reversed addressing
move #64/2,n0
move x:(r0),x1 y:(r6)+,y0
move y:(r4)+,y1
do #64,unscramble_loop
mpy y1,x1,a y:(r0)+n0,y1
macr -y0,y1,a x:(r0),x1 y:(r6)+,y0
move a,x:(r1)+ y:(r4)+,y1
unscramble_loop
movec #$ffff,m0 ; linear addressing
; ** window audio data
move x:decoder_audiop,r0
move r0,r1
move x:decoder_pcmp,r5
movec x:decoder_audio_mask,m0
movec m0,m1
move #>32,x0
move x:decoder_audio_delta,a
add x0,a a,b
move a,n1
lsl b #table_window,r4
move (r1)+n1
move x:decoder_window_loop_p,r3
move b1,n0
move b1,n1
jsr (r3)
move r5,x:decoder_pcmp
movec #$ffff,m0 ; linear addressing
movec m0,m1
; ** update pointer to next channel
move #>3,x0
move x:decoder_imfct_fractionp,a
add x0,a #>64,y0
move a,r0
move x:decoder_audiop,a
add y0,a x:decode_channels_count,b
move a,x:decoder_audiop
tst b
jne ch_loop_head ;avoid stack overflow!
;ch_loop
; ** finally: write audio data to output buffer
move x:out_p,r4
move #decoder_pcm64,r0
move #decoder_pcm64+32,r1
move #>3,y1
do #32,out_loop
move x:(r0)+,x1
mpy x1,y1,b x:(r1)+,x1
mpy x1,y1,b b0,x:(r4)
move b0,y:(r4)+
out_loop
move r4,x:out_p
; ** fraction pointer to next triplet
; ** and update audio buffer pointers
move x:decoder_imfct_fractionp,a
move #>1,x0
move x:decoder_audiop,r0
add x0,a x:decoder_audio_delta,n0
move a,x:decoder_imfct_fractionp
move (r0)-n0
movec x:decoder_audio_mask,m0
move x:decode_tr3_count,a
sub x0,a (r0)-n0
move a,x:decode_tr3_count
movec #$ffff,m0
tst a r0,x:decoder_audiop
jne tr_loop_head ;avoid stack overflow!
;tr_loop
move x:decode_rts_p,r0
nop
jmp (r0) ;'rts'-replacement
window_loop_start
do #32,window_loop
move x:(r0)+n0,x0 y:(r4)+,y0
mpy x0,y0,a x:(r1)+n1,x0 y:(r4)+,y0
mac x0,y0,a x:(r0)+n0,x0 y:(r4)+,y0
mac x0,y0,a x:(r1)+n1,x0 y:(r4)+,y0
mac x0,y0,a x:(r0)+n0,x0 y:(r4)+,y0
mac x0,y0,a x:(r1)+n1,x0 y:(r4)+,y0
mac x0,y0,a x:(r0)+n0,x0 y:(r4)+,y0
mac x0,y0,a x:(r1)+n1,x0 y:(r4)+,y0
mac x0,y0,a x:(r0)+n0,x0 y:(r4)+,y0
mac x0,y0,a x:(r1)+n1,x0 y:(r4)+,y0
mac x0,y0,a x:(r0)+n0,x0 y:(r4)+,y0
mac x0,y0,a x:(r1)+n1,x0 y:(r4)+,y0
mac x0,y0,a x:(r0)+n0,x0 y:(r4)+,y0
mac x0,y0,a x:(r1)+n1,x0 y:(r4)+,y0
mac x0,y0,a x:(r0)+n0,x0 y:(r4)+,y0
mac x0,y0,a x:(r1)+n1,x0 y:(r4)+,y0
macr x0,y0,a (r0)+
move a,x:(r5)+ y:(r1)+,y0 ;update r1
window_loop
rts
window_loop_end
; ** 21 words
getbits_loop_start
do x0,getbits_loop
lsl b
jne getbits_ne ;(patch for short jump)
getbits_cp
move x:(r7)+,b1
lsl b
rol a
bset #0,b1 ;append -end- bit
ror a
getbits_ne
rol a
getbits_loop
rts
getbits_loop_end
; ** 12 words (11 words with 'jne' short jump)
;*** initialize ************************
; parameters
; x1 - mem_mp2 (96 words in INTERNAL L-memory)
; x0 - mem_mp2p (32 words in INTERNAL P-memory)
; y1 - /
; y0 - /
init
; ** fast L-data buffer for IMFCT routine
tfr x1,a #>16,x1
tst a
jeq init_no_lmem
add x1,a a,x:decoder_imfct_p
add x1,a a,x:decoder_imfct_p16
add x1,a a,x:decoder_imfct_p32
add x1,a a,x:decoder_imfct_p48
; ** rsinx_rcosx table to fast L-data memory
move a,x:decoder_tab_rsincosx_p
move #table_rsinx_rcosx,r0
move a,r4
move x:(r0),a
do #32,init_loop0
move a,x:(r4) y:(r0)+,a
move x:(r0),a a,y:(r4)+
init_loop0
init_no_lmem
tfr x0,a #window_loop_start,r0
tst a x0,r1
jeq init_no_pmem
; ** sample window loop to fast program memory
move x0,x:decoder_window_loop_p
move x0,r2
do #window_loop_end-window_loop_start,init_loop1
movem p:(r0)+,x1
movem x1,p:(r1)+
init_loop1
tfr x0,a (r2)+
move #>window_loop-window_loop_start-1,x0
add x0,a ;patch absolute address
movem a,p:(r2) ;in 'do'-instruction
; ** getbits loop to fast program memory
move #getbits_loop_start,r0
move r1,x:decoder_getbits_loop_p
move r1,a
move r1,b
movem p:(r0)+,x1
movem x1,p:(r1)+ ;copy first word of 'do'
move #>getbits_loop-getbits_loop_start-1-1,x0
add x0,a (r0)+
movem a,p:(r1)+ ;second word of 'do' (absolute address)
movem p:(r0)+,x1
movem x1,p:(r1)+ ;copy 'lsl b'
move #>getbits_ne-getbits_loop_start-1,x0
add x0,b (r0)+
move #$0e2000,x0
or x0,b (r0)+
movem b,p:(r1)+ ;short jump 'jne getbits_ne'
do #getbits_loop_end-getbits_cp,init_loop2
movem p:(r0)+,x1
movem x1,p:(r1)+ ;copy the rest
init_loop2
init_no_pmem
rts
org l:
align 64
decoder_imfct_slow ds 64
table_rsinx_rcosx
; ** x:rsinx y:rcosx
dcl 0.000000, 0.999999
dcl 0.999999, 0.000000
dcl 0.707107, 0.707107
dcl 0.707107, -0.707107
dcl 0.382683, 0.923880
dcl 0.923880, -0.382683
dcl 0.923880, 0.382683
dcl 0.382683, -0.923880
dcl 0.195090, 0.980785
dcl 0.980785, -0.195090
dcl 0.831470, 0.555570
dcl 0.555570, -0.831470
dcl 0.555570, 0.831470
dcl 0.831470, -0.555570
dcl 0.980785, 0.195090
dcl 0.195090, -0.980785
dcl 0.098017, 0.995185
dcl 0.995185, -0.098017
dcl 0.773010, 0.634393
dcl 0.634393, -0.773010
dcl 0.471397, 0.881921
dcl 0.881921, -0.471397
dcl 0.956940, 0.290285
dcl 0.290285, -0.956940
dcl 0.290285, 0.956940
dcl 0.956940, -0.290285
dcl 0.881921, 0.471397
dcl 0.471397, -0.881921
dcl 0.634393, 0.773010
dcl 0.773010, -0.634393
dcl 0.995185, 0.098017
dcl 0.098017, -0.995185
;;vars
org x:
align 2048
decoder_audio ds 2048
;->xdata+2048
inbuf ds 600 ;MPG_MAXFRAMESIZE=1792
channels ds 1
out_p ds 1
translate ds 1
sblimit ds 1
jsbound ds 1
getbits_stream_p ds 1
getbits_temp_p dc getbits_temp_slow
getbits_temp_slow ds 2
decode_rts_p ds 1
decode_ds_sblimit_count ds 1
decode_tr3_count ds 1
decode_channels_count ds 1
decoder_bitalloc ds 2*32
decoder_scfsi ds 2*32
decoder_scalefactor ds 2*32*3
decoder_fraction ds 2*32*3
decoder_old_samples ds 3
decoder_sfp ds 1
decoder_sf_granule ds 1
decoder_quantizations ds 1
decoder_nbals ds 1
decoder_joint_countdown ds 1
decoder_audiop dc decoder_audio
decoder_audio_mask ds 1
decoder_audio_delta ds 1
decoder_pcmp ds 1
decoder_imfct_p dc decoder_imfct_slow
decoder_imfct_p16 dc decoder_imfct_slow+16
decoder_imfct_p32 dc decoder_imfct_slow+32
decoder_imfct_p48 dc decoder_imfct_slow+48
decoder_window_loop_p dc window_loop_start
decoder_getbits_loop_p dc getbits_loop_start
decoder_tab_rsincosx_p dc table_rsinx_rcosx
decoder_imfct_fractionp ds 1
decoder_imfct_delta ds 1
decoder_pcm64 ds 64
org y:
table_window
dc $000000,$fff8c1,$003540,$ff8d41,$01fd40,$faf7c1,$066b80,$db63c1
dc $494780,$249c40,$066b80,$050840,$01fd40,$0072c0,$003540,$000740
dc $ffffc1,$fff841,$003680,$ff7e41,$01f400,$fa9cc1,$05d1c0,$d99601
dc $493c00,$22ce00,$06f780,$04ad00,$0203c0,$006440,$003400,$000680
dc $ffffc1,$fff741,$003780,$ff6ec1,$01e800,$fa4241,$052a00,$d7ca01
dc $491a00,$20ffc0,$077600,$045240,$020800,$0056c0,$003280,$000600
dc $ffffc1,$fff681,$003840,$ff5ec1,$01d940,$f9e8c1,$047440,$d60081
dc $48e180,$1f32c0,$07e700,$03f7c0,$0209c0,$004980,$003100,$000540
dc $ffffc1,$fff5c1,$0038c0,$ff4e41,$01c780,$f990c1,$03b000,$d43ac1
dc $489240,$1d6800,$084b00,$039e40,$020940,$003d00,$002f80,$0004c0
dc $ffffc1,$fff4c1,$003900,$ff3d41,$01b2c0,$f93a41,$02ddc0,$d279c1
dc $482d00,$1ba040,$08a200,$0345c0,$0206c0,$003140,$002dc0,$000440
dc $ffffc1,$fff3c1,$003900,$ff2c01,$019b00,$f8e641,$01fd40,$d0be81
dc $47b1c0,$19dc80,$08ecc0,$02ef00,$020240,$002640,$002c00,$000400
dc $ffff81,$fff2c1,$0038c0,$ff1a41,$017fc0,$f894c1,$010e80,$cf09c1
dc $4720c0,$181d80,$092b40,$0299c0,$01fc00,$001bc0,$002a40,$000380
dc $ffff81,$fff181,$003800,$ff0841,$016180,$f84681,$001180,$cd5cc1
dc $467a40,$166440,$095e00,$024680,$01f440,$001200,$002840,$000340
dc $ffff81,$fff041,$003740,$fef601,$014000,$f7fbc1,$ff0681,$cbb881
dc $45bf00,$14b140,$098580,$01f580,$01ea80,$000900,$002680,$0002c0
dc $ffff81,$ffef01,$0035c0,$fee3c1,$011ac0,$f7b541,$fded81,$ca1d81
dc $44ef80,$130580,$09a1c0,$01a700,$01dfc0,$000080,$0024c0,$000280
dc $ffff41,$ffedc1,$003400,$fed181,$00f280,$f77341,$fcc701,$c88d81
dc $440bc0,$1161c0,$09b3c0,$015b00,$01d380,$fff8c1,$0022c0,$000240
dc $ffff41,$ffec41,$003200,$febf41,$00c680,$f73681,$fb92c1,$c708c1
dc $431500,$0fc6c0,$09bb80,$0111c0,$01c640,$fff1c1,$002100,$000200
dc $ffff01,$ffeac1,$002f40,$fead01,$009740,$f6ff41,$fa5181,$c59081
dc $420b40,$0e3500,$09b9c0,$00cb80,$01b7c0,$ffeb41,$001f40,$0001c0
dc $ffff01,$ffe941,$002c40,$fe9b01,$006480,$f6ce01,$f90381,$c425c1
dc $40ef80,$0cad00,$09af00,$008840,$01a880,$ffe581,$001d40,$0001c0
dc $fffec1,$ffe7c1,$0028c0,$fe8981,$002e40,$f6a3c1,$f7a901,$c2c901
dc $3fc280,$0b2fc0,$099b80,$004800,$019880,$ffe041,$001bc0,$000180
dc $fffec1,$ffe601,$002480,$fe7841,$fff4c1,$f68041,$f64241,$c17b41
dc $3e84c0,$09bdc0,$097fc0,$000b40,$0187c0,$ffdb81,$001a00,$000140
dc $fffe81,$ffe441,$001fc0,$fe6781,$ffb801,$f66481,$f4d041,$c03d81
dc $3d3700,$085700,$095c40,$ffd1c1,$017680,$ffd741,$001840,$000140
dc $fffe41,$ffe2c1,$001a80,$fe5781,$ff77c1,$f65101,$f35301,$bf1081
dc $3bda40,$06fc80,$093200,$ff9b81,$016500,$ffd3c1,$0016c0,$000100
dc $fffe41,$ffe0c1,$0014c0,$fe4841,$ff3481,$f64641,$f1cb01,$bdf4c1
dc $3a6f80,$05ae80,$0900c0,$ff68c1,$015300,$ffd0c1,$001540,$000100
dc $fffe01,$ffdf01,$000e40,$fe39c1,$feee41,$f64481,$f03941,$bceb01
dc $38f740,$046d40,$08c980,$ff3981,$0140c0,$ffce01,$0013c0,$0000c0
dc $fffdc1,$ffdd41,$000740,$fe2c81,$fea501,$f64c41,$ee9e41,$bbf441
dc $377280,$033900,$088cc0,$ff0d81,$012e80,$ffcc01,$001240,$0000c0
dc $fffd81,$ffdb41,$ffff81,$fe2041,$fe5901,$f65e41,$ecfa81,$bb1081
dc $35e280,$021280,$084ac0,$fee541,$011c40,$ffca41,$001100,$000080
dc $fffd41,$ffd981,$fff701,$fe1581,$fe0a81,$f67a81,$eb4ec1,$ba4101
dc $344780,$00f980,$080440,$fec001,$010a00,$ffc8c1,$000fc0,$000080
dc $fffcc1,$ffd7c1,$ffee01,$fe0bc1,$fdb981,$f6a201,$e99bc1,$b985c1
dc $32a340,$ffee81,$07b980,$fe9e81,$00f7c0,$ffc801,$000e80,$000080
dc $fffc81,$ffd5c1,$ffe441,$fe0401,$fd6641,$f6d4c1,$e7e281,$b8df41
dc $30f640,$fef181,$076b40,$fe8041,$00e5c0,$ffc741,$000d40,$000080
dc $fffc01,$ffd401,$ffd9c1,$fdfdc1,$fd1101,$f71341,$e62381,$b84e41
dc $2f4180,$fe02c1,$0719c0,$fe6501,$00d400,$ffc701,$000c40,$000040
dc $fffbc1,$ffd241,$ffcec1,$fdf941,$fcba41,$f75e01,$e45fc1,$b7d301
dc $2d8640,$fd2241,$06c5c0,$fe4d41,$00c2c0,$ffc701,$000b40,$000040
dc $fffb41,$ffd081,$ffc301,$fdf6c1,$fc61c1,$f7b501,$e29801,$b76dc1
dc $2bc540,$fc5001,$066f40,$fe3881,$00b1c0,$ffc741,$000a40,$000040
dc $fffac1,$ffcf01,$ffb681,$fdf641,$fc0841,$f81901,$e0cd41,$b71e81
dc $29ff80,$fb8bc1,$061740,$fe26c1,$00a140,$ffc7c1,$000980,$000040
dc $fffa01,$ffcd81,$ffa941,$fdf801,$fbadc1,$f88a01,$df0041,$b6e601
dc $283600,$fad601,$05bdc0,$fe1801,$009140,$ffc881,$0008c0,$000040
dc $fff981,$ffcc01,$ff9bc1,$fdfc41,$fb5301,$f90881,$dd3201,$b6c401
dc $266a00,$fa2e41,$056340,$fe0c01,$0081c0,$ffc981,$0007c0,$000040
table_sinx
dc 0.000000,0.049068,0.098017,0.146730
dc 0.195090,0.242980,0.290285,0.336890
dc 0.382683,0.427555,0.471397,0.514103
dc 0.555570,0.595699,0.634393,0.671559
dc 0.707107,0.740951,0.773010,0.803208
dc 0.831470,0.857729,0.881921,0.903989
dc 0.923880,0.941544,0.956940,0.970031
dc 0.980785,0.989177,0.995185,0.998795
dc 0.999999,0.998795,0.995185,0.989177
dc 0.980785,0.970031,0.956940,0.941544
dc 0.923880,0.903989,0.881921,0.857729
dc 0.831470,0.803208,0.773010,0.740951
dc 0.707107,0.671559,0.634393,0.595699
dc 0.555570,0.514103,0.471397,0.427555
dc 0.382683,0.336890,0.290285,0.242980
dc 0.195090,0.146730,0.098017,0.049068
table_cosx
dc 0.999999,0.998795,0.995185,0.989177
dc 0.980785,0.970031,0.956940,0.941544
dc 0.923880,0.903989,0.881921,0.857729
dc 0.831470,0.803208,0.773010,0.740951
dc 0.707107,0.671559,0.634393,0.595699
dc 0.555570,0.514103,0.471397,0.427555
dc 0.382683,0.336890,0.290285,0.242980
dc 0.195090,0.146730,0.098017,0.049068
dc 0.000000,-0.049068,-0.098017,-0.146730
dc -0.195090,-0.242980,-0.290285,-0.336890
dc -0.382683,-0.427555,-0.471397,-0.514103
dc -0.555570,-0.595699,-0.634393,-0.671559
dc -0.707107,-0.740951,-0.773010,-0.803208
dc -0.831470,-0.857729,-0.881921,-0.903989
dc -0.923880,-0.941544,-0.956940,-0.970031
dc -0.980785,-0.989177,-0.995185,-0.998795
;; Sampling grouping tables.
table_grouping
dc table_quantization_group_0
dc table_quantization_group_1
dc 0
dc table_quantization_group_3
table_quantization_group_0
dc $d55557,$d55557,$d55557,$000000,$d55557,$d55557,$2aaaaa,$d55557,$d55557,$d55557,$000000,$d55557
dc $000000,$000000,$d55557,$2aaaaa,$000000,$d55557,$d55557,$2aaaaa,$d55557,$000000,$2aaaaa,$d55557
dc $2aaaaa,$2aaaaa,$d55557,$d55557,$d55557,$000000,$000000,$d55557,$000000,$2aaaaa,$d55557,$000000
dc $d55557,$000000,$000000,$000000,$000000,$000000,$2aaaaa,$000000,$000000,$d55557,$2aaaaa,$000000
dc $000000,$2aaaaa,$000000,$2aaaaa,$2aaaaa,$000000,$d55557,$d55557,$2aaaaa,$000000,$d55557,$2aaaaa
dc $2aaaaa,$d55557,$2aaaaa,$d55557,$000000,$2aaaaa,$000000,$000000,$2aaaaa,$2aaaaa,$000000,$2aaaaa
dc $d55557,$2aaaaa,$2aaaaa,$000000,$2aaaaa,$2aaaaa,$2aaaaa,$2aaaaa,$2aaaaa,$d55557,$d55557,$d55557
dc $000000,$d55557,$d55557,$2aaaaa,$d55557,$d55557,$d55557,$000000,$d55557,$000000,$000000,$d55557
table_quantization_group_1
dc $ccccce,$ccccce,$ccccce,$e66668,$ccccce,$ccccce,$000000,$ccccce,$ccccce,$199999,$ccccce,$ccccce
dc $333333,$ccccce,$ccccce,$ccccce,$e66668,$ccccce,$e66668,$e66668,$ccccce,$000000,$e66668,$ccccce
dc $199999,$e66668,$ccccce,$333333,$e66668,$ccccce,$ccccce,$000000,$ccccce,$e66668,$000000,$ccccce
dc $000000,$000000,$ccccce,$199999,$000000,$ccccce,$333333,$000000,$ccccce,$ccccce,$199999,$ccccce
dc $e66668,$199999,$ccccce,$000000,$199999,$ccccce,$199999,$199999,$ccccce,$333333,$199999,$ccccce
dc $ccccce,$333333,$ccccce,$e66668,$333333,$ccccce,$000000,$333333,$ccccce,$199999,$333333,$ccccce
dc $333333,$333333,$ccccce,$ccccce,$ccccce,$e66668,$e66668,$ccccce,$e66668,$000000,$ccccce,$e66668
dc $199999,$ccccce,$e66668,$333333,$ccccce,$e66668,$ccccce,$e66668,$e66668,$e66668,$e66668,$e66668
dc $000000,$e66668,$e66668,$199999,$e66668,$e66668,$333333,$e66668,$e66668,$ccccce,$000000,$e66668
dc $e66668,$000000,$e66668,$000000,$000000,$e66668,$199999,$000000,$e66668,$333333,$000000,$e66668
dc $ccccce,$199999,$e66668,$e66668,$199999,$e66668,$000000,$199999,$e66668,$199999,$199999,$e66668
dc $333333,$199999,$e66668,$ccccce,$333333,$e66668,$e66668,$333333,$e66668,$000000,$333333,$e66668
dc $199999,$333333,$e66668,$333333,$333333,$e66668,$ccccce,$ccccce,$000000,$e66668,$ccccce,$000000
dc $000000,$ccccce,$000000,$199999,$ccccce,$000000,$333333,$ccccce,$000000,$ccccce,$e66668,$000000
dc $e66668,$e66668,$000000,$000000,$e66668,$000000,$199999,$e66668,$000000,$333333,$e66668,$000000
dc $ccccce,$000000,$000000,$e66668,$000000,$000000,$000000,$000000,$000000,$199999,$000000,$000000
dc $333333,$000000,$000000,$ccccce,$199999,$000000,$e66668,$199999,$000000,$000000,$199999,$000000
dc $199999,$199999,$000000,$333333,$199999,$000000,$ccccce,$333333,$000000,$e66668,$333333,$000000
dc $000000,$333333,$000000,$199999,$333333,$000000,$333333,$333333,$000000,$ccccce,$ccccce,$199999
dc $e66668,$ccccce,$199999,$000000,$ccccce,$199999,$199999,$ccccce,$199999,$333333,$ccccce,$199999
dc $ccccce,$e66668,$199999,$e66668,$e66668,$199999,$000000,$e66668,$199999,$199999,$e66668,$199999
dc $333333,$e66668,$199999,$ccccce,$000000,$199999,$e66668,$000000,$199999,$000000,$000000,$199999
dc $199999,$000000,$199999,$333333,$000000,$199999,$ccccce,$199999,$199999,$e66668,$199999,$199999
dc $000000,$199999,$199999,$199999,$199999,$199999,$333333,$199999,$199999,$ccccce,$333333,$199999
dc $e66668,$333333,$199999,$000000,$333333,$199999,$199999,$333333,$199999,$333333,$333333,$199999
dc $ccccce,$ccccce,$333333,$e66668,$ccccce,$333333,$000000,$ccccce,$333333,$199999,$ccccce,$333333
dc $333333,$ccccce,$333333,$ccccce,$e66668,$333333,$e66668,$e66668,$333333,$000000,$e66668,$333333
dc $199999,$e66668,$333333,$333333,$e66668,$333333,$ccccce,$000000,$333333,$e66668,$000000,$333333
dc $000000,$000000,$333333,$199999,$000000,$333333,$333333,$000000,$333333,$ccccce,$199999,$333333
dc $e66668,$199999,$333333,$000000,$199999,$333333,$199999,$199999,$333333,$333333,$199999,$333333
dc $ccccce,$333333,$333333,$e66668,$333333,$333333,$000000,$333333,$333333,$199999,$333333,$333333
dc $333333,$333333,$333333,$ccccce,$ccccce,$ccccce,$e66668,$ccccce,$ccccce,$000000,$ccccce,$ccccce
table_quantization_group_3
dc $c71c73,$c71c73,$c71c73,$d55557,$c71c73,$c71c73,$e38e3a,$c71c73,$c71c73,$f1c71e,$c71c73,$c71c73
dc $000000,$c71c73,$c71c73,$0e38e3,$c71c73,$c71c73,$1c71c7,$c71c73,$c71c73,$2aaaaa,$c71c73,$c71c73
dc $38e38e,$c71c73,$c71c73,$c71c73,$d55557,$c71c73,$d55557,$d55557,$c71c73,$e38e3a,$d55557,$c71c73
dc $f1c71e,$d55557,$c71c73,$000000,$d55557,$c71c73,$0e38e3,$d55557,$c71c73,$1c71c7,$d55557,$c71c73
dc $2aaaaa,$d55557,$c71c73,$38e38e,$d55557,$c71c73,$c71c73,$e38e3a,$c71c73,$d55557,$e38e3a,$c71c73
dc $e38e3a,$e38e3a,$c71c73,$f1c71e,$e38e3a,$c71c73,$000000,$e38e3a,$c71c73,$0e38e3,$e38e3a,$c71c73
dc $1c71c7,$e38e3a,$c71c73,$2aaaaa,$e38e3a,$c71c73,$38e38e,$e38e3a,$c71c73,$c71c73,$f1c71e,$c71c73
dc $d55557,$f1c71e,$c71c73,$e38e3a,$f1c71e,$c71c73,$f1c71e,$f1c71e,$c71c73,$000000,$f1c71e,$c71c73
dc $0e38e3,$f1c71e,$c71c73,$1c71c7,$f1c71e,$c71c73,$2aaaaa,$f1c71e,$c71c73,$38e38e,$f1c71e,$c71c73
dc $c71c73,$000000,$c71c73,$d55557,$000000,$c71c73,$e38e3a,$000000,$c71c73,$f1c71e,$000000,$c71c73
dc $000000,$000000,$c71c73,$0e38e3,$000000,$c71c73,$1c71c7,$000000,$c71c73,$2aaaaa,$000000,$c71c73
dc $38e38e,$000000,$c71c73,$c71c73,$0e38e3,$c71c73,$d55557,$0e38e3,$c71c73,$e38e3a,$0e38e3,$c71c73
dc $f1c71e,$0e38e3,$c71c73,$000000,$0e38e3,$c71c73,$0e38e3,$0e38e3,$c71c73,$1c71c7,$0e38e3,$c71c73
dc $2aaaaa,$0e38e3,$c71c73,$38e38e,$0e38e3,$c71c73,$c71c73,$1c71c7,$c71c73,$d55557,$1c71c7,$c71c73
dc $e38e3a,$1c71c7,$c71c73,$f1c71e,$1c71c7,$c71c73,$000000,$1c71c7,$c71c73,$0e38e3,$1c71c7,$c71c73
dc $1c71c7,$1c71c7,$c71c73,$2aaaaa,$1c71c7,$c71c73,$38e38e,$1c71c7,$c71c73,$c71c73,$2aaaaa,$c71c73
dc $d55557,$2aaaaa,$c71c73,$e38e3a,$2aaaaa,$c71c73,$f1c71e,$2aaaaa,$c71c73,$000000,$2aaaaa,$c71c73
dc $0e38e3,$2aaaaa,$c71c73,$1c71c7,$2aaaaa,$c71c73,$2aaaaa,$2aaaaa,$c71c73,$38e38e,$2aaaaa,$c71c73
dc $c71c73,$38e38e,$c71c73,$d55557,$38e38e,$c71c73,$e38e3a,$38e38e,$c71c73,$f1c71e,$38e38e,$c71c73
dc $000000,$38e38e,$c71c73,$0e38e3,$38e38e,$c71c73,$1c71c7,$38e38e,$c71c73,$2aaaaa,$38e38e,$c71c73
dc $38e38e,$38e38e,$c71c73,$c71c73,$c71c73,$d55557,$d55557,$c71c73,$d55557,$e38e3a,$c71c73,$d55557
dc $f1c71e,$c71c73,$d55557,$000000,$c71c73,$d55557,$0e38e3,$c71c73,$d55557,$1c71c7,$c71c73,$d55557
dc $2aaaaa,$c71c73,$d55557,$38e38e,$c71c73,$d55557,$c71c73,$d55557,$d55557,$d55557,$d55557,$d55557
dc $e38e3a,$d55557,$d55557,$f1c71e,$d55557,$d55557,$000000,$d55557,$d55557,$0e38e3,$d55557,$d55557
dc $1c71c7,$d55557,$d55557,$2aaaaa,$d55557,$d55557,$38e38e,$d55557,$d55557,$c71c73,$e38e3a,$d55557
dc $d55557,$e38e3a,$d55557,$e38e3a,$e38e3a,$d55557,$f1c71e,$e38e3a,$d55557,$000000,$e38e3a,$d55557
dc $0e38e3,$e38e3a,$d55557,$1c71c7,$e38e3a,$d55557,$2aaaaa,$e38e3a,$d55557,$38e38e,$e38e3a,$d55557
dc $c71c73,$f1c71e,$d55557,$d55557,$f1c71e,$d55557,$e38e3a,$f1c71e,$d55557,$f1c71e,$f1c71e,$d55557
dc $000000,$f1c71e,$d55557,$0e38e3,$f1c71e,$d55557,$1c71c7,$f1c71e,$d55557,$2aaaaa,$f1c71e,$d55557
dc $38e38e,$f1c71e,$d55557,$c71c73,$000000,$d55557,$d55557,$000000,$d55557,$e38e3a,$000000,$d55557
dc $f1c71e,$000000,$d55557,$000000,$000000,$d55557,$0e38e3,$000000,$d55557,$1c71c7,$000000,$d55557
dc $2aaaaa,$000000,$d55557,$38e38e,$000000,$d55557,$c71c73,$0e38e3,$d55557,$d55557,$0e38e3,$d55557
dc $e38e3a,$0e38e3,$d55557,$f1c71e,$0e38e3,$d55557,$000000,$0e38e3,$d55557,$0e38e3,$0e38e3,$d55557
dc $1c71c7,$0e38e3,$d55557,$2aaaaa,$0e38e3,$d55557,$38e38e,$0e38e3,$d55557,$c71c73,$1c71c7,$d55557
dc $d55557,$1c71c7,$d55557,$e38e3a,$1c71c7,$d55557,$f1c71e,$1c71c7,$d55557,$000000,$1c71c7,$d55557
dc $0e38e3,$1c71c7,$d55557,$1c71c7,$1c71c7,$d55557,$2aaaaa,$1c71c7,$d55557,$38e38e,$1c71c7,$d55557
dc $c71c73,$2aaaaa,$d55557,$d55557,$2aaaaa,$d55557,$e38e3a,$2aaaaa,$d55557,$f1c71e,$2aaaaa,$d55557
dc $000000,$2aaaaa,$d55557,$0e38e3,$2aaaaa,$d55557,$1c71c7,$2aaaaa,$d55557,$2aaaaa,$2aaaaa,$d55557
dc $38e38e,$2aaaaa,$d55557,$c71c73,$38e38e,$d55557,$d55557,$38e38e,$d55557,$e38e3a,$38e38e,$d55557
dc $f1c71e,$38e38e,$d55557,$000000,$38e38e,$d55557,$0e38e3,$38e38e,$d55557,$1c71c7,$38e38e,$d55557
dc $2aaaaa,$38e38e,$d55557,$38e38e,$38e38e,$d55557,$c71c73,$c71c73,$e38e3a,$d55557,$c71c73,$e38e3a
dc $e38e3a,$c71c73,$e38e3a,$f1c71e,$c71c73,$e38e3a,$000000,$c71c73,$e38e3a,$0e38e3,$c71c73,$e38e3a
dc $1c71c7,$c71c73,$e38e3a,$2aaaaa,$c71c73,$e38e3a,$38e38e,$c71c73,$e38e3a,$c71c73,$d55557,$e38e3a
dc $d55557,$d55557,$e38e3a,$e38e3a,$d55557,$e38e3a,$f1c71e,$d55557,$e38e3a,$000000,$d55557,$e38e3a
dc $0e38e3,$d55557,$e38e3a,$1c71c7,$d55557,$e38e3a,$2aaaaa,$d55557,$e38e3a,$38e38e,$d55557,$e38e3a
dc $c71c73,$e38e3a,$e38e3a,$d55557,$e38e3a,$e38e3a,$e38e3a,$e38e3a,$e38e3a,$f1c71e,$e38e3a,$e38e3a
dc $000000,$e38e3a,$e38e3a,$0e38e3,$e38e3a,$e38e3a,$1c71c7,$e38e3a,$e38e3a,$2aaaaa,$e38e3a,$e38e3a
dc $38e38e,$e38e3a,$e38e3a,$c71c73,$f1c71e,$e38e3a,$d55557,$f1c71e,$e38e3a,$e38e3a,$f1c71e,$e38e3a
dc $f1c71e,$f1c71e,$e38e3a,$000000,$f1c71e,$e38e3a,$0e38e3,$f1c71e,$e38e3a,$1c71c7,$f1c71e,$e38e3a
dc $2aaaaa,$f1c71e,$e38e3a,$38e38e,$f1c71e,$e38e3a,$c71c73,$000000,$e38e3a,$d55557,$000000,$e38e3a
dc $e38e3a,$000000,$e38e3a,$f1c71e,$000000,$e38e3a,$000000,$000000,$e38e3a,$0e38e3,$000000,$e38e3a
dc $1c71c7,$000000,$e38e3a,$2aaaaa,$000000,$e38e3a,$38e38e,$000000,$e38e3a,$c71c73,$0e38e3,$e38e3a
dc $d55557,$0e38e3,$e38e3a,$e38e3a,$0e38e3,$e38e3a,$f1c71e,$0e38e3,$e38e3a,$000000,$0e38e3,$e38e3a
dc $0e38e3,$0e38e3,$e38e3a,$1c71c7,$0e38e3,$e38e3a,$2aaaaa,$0e38e3,$e38e3a,$38e38e,$0e38e3,$e38e3a
dc $c71c73,$1c71c7,$e38e3a,$d55557,$1c71c7,$e38e3a,$e38e3a,$1c71c7,$e38e3a,$f1c71e,$1c71c7,$e38e3a
dc $000000,$1c71c7,$e38e3a,$0e38e3,$1c71c7,$e38e3a,$1c71c7,$1c71c7,$e38e3a,$2aaaaa,$1c71c7,$e38e3a
dc $38e38e,$1c71c7,$e38e3a,$c71c73,$2aaaaa,$e38e3a,$d55557,$2aaaaa,$e38e3a,$e38e3a,$2aaaaa,$e38e3a
dc $f1c71e,$2aaaaa,$e38e3a,$000000,$2aaaaa,$e38e3a,$0e38e3,$2aaaaa,$e38e3a,$1c71c7,$2aaaaa,$e38e3a
dc $2aaaaa,$2aaaaa,$e38e3a,$38e38e,$2aaaaa,$e38e3a,$c71c73,$38e38e,$e38e3a,$d55557,$38e38e,$e38e3a
dc $e38e3a,$38e38e,$e38e3a,$f1c71e,$38e38e,$e38e3a,$000000,$38e38e,$e38e3a,$0e38e3,$38e38e,$e38e3a
dc $1c71c7,$38e38e,$e38e3a,$2aaaaa,$38e38e,$e38e3a,$38e38e,$38e38e,$e38e3a,$c71c73,$c71c73,$f1c71e
dc $d55557,$c71c73,$f1c71e,$e38e3a,$c71c73,$f1c71e,$f1c71e,$c71c73,$f1c71e,$000000,$c71c73,$f1c71e
dc $0e38e3,$c71c73,$f1c71e,$1c71c7,$c71c73,$f1c71e,$2aaaaa,$c71c73,$f1c71e,$38e38e,$c71c73,$f1c71e
dc $c71c73,$d55557,$f1c71e,$d55557,$d55557,$f1c71e,$e38e3a,$d55557,$f1c71e,$f1c71e,$d55557,$f1c71e
dc $000000,$d55557,$f1c71e,$0e38e3,$d55557,$f1c71e,$1c71c7,$d55557,$f1c71e,$2aaaaa,$d55557,$f1c71e
dc $38e38e,$d55557,$f1c71e,$c71c73,$e38e3a,$f1c71e,$d55557,$e38e3a,$f1c71e,$e38e3a,$e38e3a,$f1c71e
dc $f1c71e,$e38e3a,$f1c71e,$000000,$e38e3a,$f1c71e,$0e38e3,$e38e3a,$f1c71e,$1c71c7,$e38e3a,$f1c71e
dc $2aaaaa,$e38e3a,$f1c71e,$38e38e,$e38e3a,$f1c71e,$c71c73,$f1c71e,$f1c71e,$d55557,$f1c71e,$f1c71e
dc $e38e3a,$f1c71e,$f1c71e,$f1c71e,$f1c71e,$f1c71e,$000000,$f1c71e,$f1c71e,$0e38e3,$f1c71e,$f1c71e
dc $1c71c7,$f1c71e,$f1c71e,$2aaaaa,$f1c71e,$f1c71e,$38e38e,$f1c71e,$f1c71e,$c71c73,$000000,$f1c71e
dc $d55557,$000000,$f1c71e,$e38e3a,$000000,$f1c71e,$f1c71e,$000000,$f1c71e,$000000,$000000,$f1c71e
dc $0e38e3,$000000,$f1c71e,$1c71c7,$000000,$f1c71e,$2aaaaa,$000000,$f1c71e,$38e38e,$000000,$f1c71e
dc $c71c73,$0e38e3,$f1c71e,$d55557,$0e38e3,$f1c71e,$e38e3a,$0e38e3,$f1c71e,$f1c71e,$0e38e3,$f1c71e
dc $000000,$0e38e3,$f1c71e,$0e38e3,$0e38e3,$f1c71e,$1c71c7,$0e38e3,$f1c71e,$2aaaaa,$0e38e3,$f1c71e
dc $38e38e,$0e38e3,$f1c71e,$c71c73,$1c71c7,$f1c71e,$d55557,$1c71c7,$f1c71e,$e38e3a,$1c71c7,$f1c71e
dc $f1c71e,$1c71c7,$f1c71e,$000000,$1c71c7,$f1c71e,$0e38e3,$1c71c7,$f1c71e,$1c71c7,$1c71c7,$f1c71e
dc $2aaaaa,$1c71c7,$f1c71e,$38e38e,$1c71c7,$f1c71e,$c71c73,$2aaaaa,$f1c71e,$d55557,$2aaaaa,$f1c71e
dc $e38e3a,$2aaaaa,$f1c71e,$f1c71e,$2aaaaa,$f1c71e,$000000,$2aaaaa,$f1c71e,$0e38e3,$2aaaaa,$f1c71e
dc $1c71c7,$2aaaaa,$f1c71e,$2aaaaa,$2aaaaa,$f1c71e,$38e38e,$2aaaaa,$f1c71e,$c71c73,$38e38e,$f1c71e
dc $d55557,$38e38e,$f1c71e,$e38e3a,$38e38e,$f1c71e,$f1c71e,$38e38e,$f1c71e,$000000,$38e38e,$f1c71e
dc $0e38e3,$38e38e,$f1c71e,$1c71c7,$38e38e,$f1c71e,$2aaaaa,$38e38e,$f1c71e,$38e38e,$38e38e,$f1c71e
dc $c71c73,$c71c73,$000000,$d55557,$c71c73,$000000,$e38e3a,$c71c73,$000000,$f1c71e,$c71c73,$000000
dc $000000,$c71c73,$000000,$0e38e3,$c71c73,$000000,$1c71c7,$c71c73,$000000,$2aaaaa,$c71c73,$000000
dc $38e38e,$c71c73,$000000,$c71c73,$d55557,$000000,$d55557,$d55557,$000000,$e38e3a,$d55557,$000000
dc $f1c71e,$d55557,$000000,$000000,$d55557,$000000,$0e38e3,$d55557,$000000,$1c71c7,$d55557,$000000
dc $2aaaaa,$d55557,$000000,$38e38e,$d55557,$000000,$c71c73,$e38e3a,$000000,$d55557,$e38e3a,$000000
dc $e38e3a,$e38e3a,$000000,$f1c71e,$e38e3a,$000000,$000000,$e38e3a,$000000,$0e38e3,$e38e3a,$000000
dc $1c71c7,$e38e3a,$000000,$2aaaaa,$e38e3a,$000000,$38e38e,$e38e3a,$000000,$c71c73,$f1c71e,$000000
dc $d55557,$f1c71e,$000000,$e38e3a,$f1c71e,$000000,$f1c71e,$f1c71e,$000000,$000000,$f1c71e,$000000
dc $0e38e3,$f1c71e,$000000,$1c71c7,$f1c71e,$000000,$2aaaaa,$f1c71e,$000000,$38e38e,$f1c71e,$000000
dc $c71c73,$000000,$000000,$d55557,$000000,$000000,$e38e3a,$000000,$000000,$f1c71e,$000000,$000000
dc $000000,$000000,$000000,$0e38e3,$000000,$000000,$1c71c7,$000000,$000000,$2aaaaa,$000000,$000000
dc $38e38e,$000000,$000000,$c71c73,$0e38e3,$000000,$d55557,$0e38e3,$000000,$e38e3a,$0e38e3,$000000
dc $f1c71e,$0e38e3,$000000,$000000,$0e38e3,$000000,$0e38e3,$0e38e3,$000000,$1c71c7,$0e38e3,$000000
dc $2aaaaa,$0e38e3,$000000,$38e38e,$0e38e3,$000000,$c71c73,$1c71c7,$000000,$d55557,$1c71c7,$000000
dc $e38e3a,$1c71c7,$000000,$f1c71e,$1c71c7,$000000,$000000,$1c71c7,$000000,$0e38e3,$1c71c7,$000000
dc $1c71c7,$1c71c7,$000000,$2aaaaa,$1c71c7,$000000,$38e38e,$1c71c7,$000000,$c71c73,$2aaaaa,$000000
dc $d55557,$2aaaaa,$000000,$e38e3a,$2aaaaa,$000000,$f1c71e,$2aaaaa,$000000,$000000,$2aaaaa,$000000
dc $0e38e3,$2aaaaa,$000000,$1c71c7,$2aaaaa,$000000,$2aaaaa,$2aaaaa,$000000,$38e38e,$2aaaaa,$000000
dc $c71c73,$38e38e,$000000,$d55557,$38e38e,$000000,$e38e3a,$38e38e,$000000,$f1c71e,$38e38e,$000000
dc $000000,$38e38e,$000000,$0e38e3,$38e38e,$000000,$1c71c7,$38e38e,$000000,$2aaaaa,$38e38e,$000000
dc $38e38e,$38e38e,$000000,$c71c73,$c71c73,$0e38e3,$d55557,$c71c73,$0e38e3,$e38e3a,$c71c73,$0e38e3
dc $f1c71e,$c71c73,$0e38e3,$000000,$c71c73,$0e38e3,$0e38e3,$c71c73,$0e38e3,$1c71c7,$c71c73,$0e38e3
dc $2aaaaa,$c71c73,$0e38e3,$38e38e,$c71c73,$0e38e3,$c71c73,$d55557,$0e38e3,$d55557,$d55557,$0e38e3
dc $e38e3a,$d55557,$0e38e3,$f1c71e,$d55557,$0e38e3,$000000,$d55557,$0e38e3,$0e38e3,$d55557,$0e38e3
dc $1c71c7,$d55557,$0e38e3,$2aaaaa,$d55557,$0e38e3,$38e38e,$d55557,$0e38e3,$c71c73,$e38e3a,$0e38e3
dc $d55557,$e38e3a,$0e38e3,$e38e3a,$e38e3a,$0e38e3,$f1c71e,$e38e3a,$0e38e3,$000000,$e38e3a,$0e38e3
dc $0e38e3,$e38e3a,$0e38e3,$1c71c7,$e38e3a,$0e38e3,$2aaaaa,$e38e3a,$0e38e3,$38e38e,$e38e3a,$0e38e3
dc $c71c73,$f1c71e,$0e38e3,$d55557,$f1c71e,$0e38e3,$e38e3a,$f1c71e,$0e38e3,$f1c71e,$f1c71e,$0e38e3
dc $000000,$f1c71e,$0e38e3,$0e38e3,$f1c71e,$0e38e3,$1c71c7,$f1c71e,$0e38e3,$2aaaaa,$f1c71e,$0e38e3
dc $38e38e,$f1c71e,$0e38e3,$c71c73,$000000,$0e38e3,$d55557,$000000,$0e38e3,$e38e3a,$000000,$0e38e3
dc $f1c71e,$000000,$0e38e3,$000000,$000000,$0e38e3,$0e38e3,$000000,$0e38e3,$1c71c7,$000000,$0e38e3
dc $2aaaaa,$000000,$0e38e3,$38e38e,$000000,$0e38e3,$c71c73,$0e38e3,$0e38e3,$d55557,$0e38e3,$0e38e3
dc $e38e3a,$0e38e3,$0e38e3,$f1c71e,$0e38e3,$0e38e3,$000000,$0e38e3,$0e38e3,$0e38e3,$0e38e3,$0e38e3
dc $1c71c7,$0e38e3,$0e38e3,$2aaaaa,$0e38e3,$0e38e3,$38e38e,$0e38e3,$0e38e3,$c71c73,$1c71c7,$0e38e3
dc $d55557,$1c71c7,$0e38e3,$e38e3a,$1c71c7,$0e38e3,$f1c71e,$1c71c7,$0e38e3,$000000,$1c71c7,$0e38e3
dc $0e38e3,$1c71c7,$0e38e3,$1c71c7,$1c71c7,$0e38e3,$2aaaaa,$1c71c7,$0e38e3,$38e38e,$1c71c7,$0e38e3
dc $c71c73,$2aaaaa,$0e38e3,$d55557,$2aaaaa,$0e38e3,$e38e3a,$2aaaaa,$0e38e3,$f1c71e,$2aaaaa,$0e38e3
dc $000000,$2aaaaa,$0e38e3,$0e38e3,$2aaaaa,$0e38e3,$1c71c7,$2aaaaa,$0e38e3,$2aaaaa,$2aaaaa,$0e38e3
dc $38e38e,$2aaaaa,$0e38e3,$c71c73,$38e38e,$0e38e3,$d55557,$38e38e,$0e38e3,$e38e3a,$38e38e,$0e38e3
dc $f1c71e,$38e38e,$0e38e3,$000000,$38e38e,$0e38e3,$0e38e3,$38e38e,$0e38e3,$1c71c7,$38e38e,$0e38e3
dc $2aaaaa,$38e38e,$0e38e3,$38e38e,$38e38e,$0e38e3,$c71c73,$c71c73,$1c71c7,$d55557,$c71c73,$1c71c7
dc $e38e3a,$c71c73,$1c71c7,$f1c71e,$c71c73,$1c71c7,$000000,$c71c73,$1c71c7,$0e38e3,$c71c73,$1c71c7
dc $1c71c7,$c71c73,$1c71c7,$2aaaaa,$c71c73,$1c71c7,$38e38e,$c71c73,$1c71c7,$c71c73,$d55557,$1c71c7
dc $d55557,$d55557,$1c71c7,$e38e3a,$d55557,$1c71c7,$f1c71e,$d55557,$1c71c7,$000000,$d55557,$1c71c7
dc $0e38e3,$d55557,$1c71c7,$1c71c7,$d55557,$1c71c7,$2aaaaa,$d55557,$1c71c7,$38e38e,$d55557,$1c71c7
dc $c71c73,$e38e3a,$1c71c7,$d55557,$e38e3a,$1c71c7,$e38e3a,$e38e3a,$1c71c7,$f1c71e,$e38e3a,$1c71c7
dc $000000,$e38e3a,$1c71c7,$0e38e3,$e38e3a,$1c71c7,$1c71c7,$e38e3a,$1c71c7,$2aaaaa,$e38e3a,$1c71c7
dc $38e38e,$e38e3a,$1c71c7,$c71c73,$f1c71e,$1c71c7,$d55557,$f1c71e,$1c71c7,$e38e3a,$f1c71e,$1c71c7
dc $f1c71e,$f1c71e,$1c71c7,$000000,$f1c71e,$1c71c7,$0e38e3,$f1c71e,$1c71c7,$1c71c7,$f1c71e,$1c71c7
dc $2aaaaa,$f1c71e,$1c71c7,$38e38e,$f1c71e,$1c71c7,$c71c73,$000000,$1c71c7,$d55557,$000000,$1c71c7
dc $e38e3a,$000000,$1c71c7,$f1c71e,$000000,$1c71c7,$000000,$000000,$1c71c7,$0e38e3,$000000,$1c71c7
dc $1c71c7,$000000,$1c71c7,$2aaaaa,$000000,$1c71c7,$38e38e,$000000,$1c71c7,$c71c73,$0e38e3,$1c71c7
dc $d55557,$0e38e3,$1c71c7,$e38e3a,$0e38e3,$1c71c7,$f1c71e,$0e38e3,$1c71c7,$000000,$0e38e3,$1c71c7
dc $0e38e3,$0e38e3,$1c71c7,$1c71c7,$0e38e3,$1c71c7,$2aaaaa,$0e38e3,$1c71c7,$38e38e,$0e38e3,$1c71c7
dc $c71c73,$1c71c7,$1c71c7,$d55557,$1c71c7,$1c71c7,$e38e3a,$1c71c7,$1c71c7,$f1c71e,$1c71c7,$1c71c7
dc $000000,$1c71c7,$1c71c7,$0e38e3,$1c71c7,$1c71c7,$1c71c7,$1c71c7,$1c71c7,$2aaaaa,$1c71c7,$1c71c7
dc $38e38e,$1c71c7,$1c71c7,$c71c73,$2aaaaa,$1c71c7,$d55557,$2aaaaa,$1c71c7,$e38e3a,$2aaaaa,$1c71c7
dc $f1c71e,$2aaaaa,$1c71c7,$000000,$2aaaaa,$1c71c7,$0e38e3,$2aaaaa,$1c71c7,$1c71c7,$2aaaaa,$1c71c7
dc $2aaaaa,$2aaaaa,$1c71c7,$38e38e,$2aaaaa,$1c71c7,$c71c73,$38e38e,$1c71c7,$d55557,$38e38e,$1c71c7
dc $e38e3a,$38e38e,$1c71c7,$f1c71e,$38e38e,$1c71c7,$000000,$38e38e,$1c71c7,$0e38e3,$38e38e,$1c71c7
dc $1c71c7,$38e38e,$1c71c7,$2aaaaa,$38e38e,$1c71c7,$38e38e,$38e38e,$1c71c7,$c71c73,$c71c73,$2aaaaa
dc $d55557,$c71c73,$2aaaaa,$e38e3a,$c71c73,$2aaaaa,$f1c71e,$c71c73,$2aaaaa,$000000,$c71c73,$2aaaaa
dc $0e38e3,$c71c73,$2aaaaa,$1c71c7,$c71c73,$2aaaaa,$2aaaaa,$c71c73,$2aaaaa,$38e38e,$c71c73,$2aaaaa
dc $c71c73,$d55557,$2aaaaa,$d55557,$d55557,$2aaaaa,$e38e3a,$d55557,$2aaaaa,$f1c71e,$d55557,$2aaaaa
dc $000000,$d55557,$2aaaaa,$0e38e3,$d55557,$2aaaaa,$1c71c7,$d55557,$2aaaaa,$2aaaaa,$d55557,$2aaaaa
dc $38e38e,$d55557,$2aaaaa,$c71c73,$e38e3a,$2aaaaa,$d55557,$e38e3a,$2aaaaa,$e38e3a,$e38e3a,$2aaaaa
dc $f1c71e,$e38e3a,$2aaaaa,$000000,$e38e3a,$2aaaaa,$0e38e3,$e38e3a,$2aaaaa,$1c71c7,$e38e3a,$2aaaaa
dc $2aaaaa,$e38e3a,$2aaaaa,$38e38e,$e38e3a,$2aaaaa,$c71c73,$f1c71e,$2aaaaa,$d55557,$f1c71e,$2aaaaa
dc $e38e3a,$f1c71e,$2aaaaa,$f1c71e,$f1c71e,$2aaaaa,$000000,$f1c71e,$2aaaaa,$0e38e3,$f1c71e,$2aaaaa
dc $1c71c7,$f1c71e,$2aaaaa,$2aaaaa,$f1c71e,$2aaaaa,$38e38e,$f1c71e,$2aaaaa,$c71c73,$000000,$2aaaaa
dc $d55557,$000000,$2aaaaa,$e38e3a,$000000,$2aaaaa,$f1c71e,$000000,$2aaaaa,$000000,$000000,$2aaaaa
dc $0e38e3,$000000,$2aaaaa,$1c71c7,$000000,$2aaaaa,$2aaaaa,$000000,$2aaaaa,$38e38e,$000000,$2aaaaa
dc $c71c73,$0e38e3,$2aaaaa,$d55557,$0e38e3,$2aaaaa,$e38e3a,$0e38e3,$2aaaaa,$f1c71e,$0e38e3,$2aaaaa
dc $000000,$0e38e3,$2aaaaa,$0e38e3,$0e38e3,$2aaaaa,$1c71c7,$0e38e3,$2aaaaa,$2aaaaa,$0e38e3,$2aaaaa
dc $38e38e,$0e38e3,$2aaaaa,$c71c73,$1c71c7,$2aaaaa,$d55557,$1c71c7,$2aaaaa,$e38e3a,$1c71c7,$2aaaaa
dc $f1c71e,$1c71c7,$2aaaaa,$000000,$1c71c7,$2aaaaa,$0e38e3,$1c71c7,$2aaaaa,$1c71c7,$1c71c7,$2aaaaa
dc $2aaaaa,$1c71c7,$2aaaaa,$38e38e,$1c71c7,$2aaaaa,$c71c73,$2aaaaa,$2aaaaa,$d55557,$2aaaaa,$2aaaaa
dc $e38e3a,$2aaaaa,$2aaaaa,$f1c71e,$2aaaaa,$2aaaaa,$000000,$2aaaaa,$2aaaaa,$0e38e3,$2aaaaa,$2aaaaa
dc $1c71c7,$2aaaaa,$2aaaaa,$2aaaaa,$2aaaaa,$2aaaaa,$38e38e,$2aaaaa,$2aaaaa,$c71c73,$38e38e,$2aaaaa
dc $d55557,$38e38e,$2aaaaa,$e38e3a,$38e38e,$2aaaaa,$f1c71e,$38e38e,$2aaaaa,$000000,$38e38e,$2aaaaa
dc $0e38e3,$38e38e,$2aaaaa,$1c71c7,$38e38e,$2aaaaa,$2aaaaa,$38e38e,$2aaaaa,$38e38e,$38e38e,$2aaaaa
dc $c71c73,$c71c73,$38e38e,$d55557,$c71c73,$38e38e,$e38e3a,$c71c73,$38e38e,$f1c71e,$c71c73,$38e38e
dc $000000,$c71c73,$38e38e,$0e38e3,$c71c73,$38e38e,$1c71c7,$c71c73,$38e38e,$2aaaaa,$c71c73,$38e38e
dc $38e38e,$c71c73,$38e38e,$c71c73,$d55557,$38e38e,$d55557,$d55557,$38e38e,$e38e3a,$d55557,$38e38e
dc $f1c71e,$d55557,$38e38e,$000000,$d55557,$38e38e,$0e38e3,$d55557,$38e38e,$1c71c7,$d55557,$38e38e
dc $2aaaaa,$d55557,$38e38e,$38e38e,$d55557,$38e38e,$c71c73,$e38e3a,$38e38e,$d55557,$e38e3a,$38e38e
dc $e38e3a,$e38e3a,$38e38e,$f1c71e,$e38e3a,$38e38e,$000000,$e38e3a,$38e38e,$0e38e3,$e38e3a,$38e38e
dc $1c71c7,$e38e3a,$38e38e,$2aaaaa,$e38e3a,$38e38e,$38e38e,$e38e3a,$38e38e,$c71c73,$f1c71e,$38e38e
dc $d55557,$f1c71e,$38e38e,$e38e3a,$f1c71e,$38e38e,$f1c71e,$f1c71e,$38e38e,$000000,$f1c71e,$38e38e
dc $0e38e3,$f1c71e,$38e38e,$1c71c7,$f1c71e,$38e38e,$2aaaaa,$f1c71e,$38e38e,$38e38e,$f1c71e,$38e38e
dc $c71c73,$000000,$38e38e,$d55557,$000000,$38e38e,$e38e3a,$000000,$38e38e,$f1c71e,$000000,$38e38e
dc $000000,$000000,$38e38e,$0e38e3,$000000,$38e38e,$1c71c7,$000000,$38e38e,$2aaaaa,$000000,$38e38e
dc $38e38e,$000000,$38e38e,$c71c73,$0e38e3,$38e38e,$d55557,$0e38e3,$38e38e,$e38e3a,$0e38e3,$38e38e
dc $f1c71e,$0e38e3,$38e38e,$000000,$0e38e3,$38e38e,$0e38e3,$0e38e3,$38e38e,$1c71c7,$0e38e3,$38e38e
dc $2aaaaa,$0e38e3,$38e38e,$38e38e,$0e38e3,$38e38e,$c71c73,$1c71c7,$38e38e,$d55557,$1c71c7,$38e38e
dc $e38e3a,$1c71c7,$38e38e,$f1c71e,$1c71c7,$38e38e,$000000,$1c71c7,$38e38e,$0e38e3,$1c71c7,$38e38e
dc $1c71c7,$1c71c7,$38e38e,$2aaaaa,$1c71c7,$38e38e,$38e38e,$1c71c7,$38e38e,$c71c73,$2aaaaa,$38e38e
dc $d55557,$2aaaaa,$38e38e,$e38e3a,$2aaaaa,$38e38e,$f1c71e,$2aaaaa,$38e38e,$000000,$2aaaaa,$38e38e
dc $0e38e3,$2aaaaa,$38e38e,$1c71c7,$2aaaaa,$38e38e,$2aaaaa,$2aaaaa,$38e38e,$38e38e,$2aaaaa,$38e38e
dc $c71c73,$38e38e,$38e38e,$d55557,$38e38e,$38e38e,$e38e3a,$38e38e,$38e38e,$f1c71e,$38e38e,$38e38e
dc $000000,$38e38e,$38e38e,$0e38e3,$38e38e,$38e38e,$1c71c7,$38e38e,$38e38e,$2aaaaa,$38e38e,$38e38e
dc $38e38e,$38e38e,$38e38e,$c71c73,$c71c73,$c71c73,$d55557,$c71c73,$c71c73,$e38e3a,$c71c73,$c71c73
dc $f1c71e,$c71c73,$c71c73,$000000,$c71c73,$c71c73,$0e38e3,$c71c73,$c71c73,$1c71c7,$c71c73,$c71c73
dc $2aaaaa,$c71c73,$c71c73,$38e38e,$c71c73,$c71c73,$c71c73,$d55557,$c71c73,$d55557,$d55557,$c71c73
dc $e38e3a,$d55557,$c71c73,$f1c71e,$d55557,$c71c73,$000000,$d55557,$c71c73,$0e38e3,$d55557,$c71c73
dc $1c71c7,$d55557,$c71c73,$2aaaaa,$d55557,$c71c73,$38e38e,$d55557,$c71c73,$c71c73,$e38e3a,$c71c73
dc $d55557,$e38e3a,$c71c73,$e38e3a,$e38e3a,$c71c73,$f1c71e,$e38e3a,$c71c73,$000000,$e38e3a,$c71c73
dc $0e38e3,$e38e3a,$c71c73,$1c71c7,$e38e3a,$c71c73,$2aaaaa,$e38e3a,$c71c73,$38e38e,$e38e3a,$c71c73
dc $c71c73,$f1c71e,$c71c73,$d55557,$f1c71e,$c71c73,$e38e3a,$f1c71e,$c71c73,$f1c71e,$f1c71e,$c71c73
dc $000000,$f1c71e,$c71c73,$0e38e3,$f1c71e,$c71c73,$1c71c7,$f1c71e,$c71c73,$2aaaaa,$f1c71e,$c71c73
dc $38e38e,$f1c71e,$c71c73,$c71c73,$000000,$c71c73,$d55557,$000000,$c71c73,$e38e3a,$000000,$c71c73
dc $f1c71e,$000000,$c71c73,$000000,$000000,$c71c73,$0e38e3,$000000,$c71c73,$1c71c7,$000000,$c71c73
dc $2aaaaa,$000000,$c71c73,$38e38e,$000000,$c71c73,$c71c73,$0e38e3,$c71c73,$d55557,$0e38e3,$c71c73
dc $e38e3a,$0e38e3,$c71c73,$f1c71e,$0e38e3,$c71c73,$000000,$0e38e3,$c71c73,$0e38e3,$0e38e3,$c71c73
dc $1c71c7,$0e38e3,$c71c73,$2aaaaa,$0e38e3,$c71c73,$38e38e,$0e38e3,$c71c73,$c71c73,$1c71c7,$c71c73
dc $d55557,$1c71c7,$c71c73,$e38e3a,$1c71c7,$c71c73,$f1c71e,$1c71c7,$c71c73,$000000,$1c71c7,$c71c73
dc $0e38e3,$1c71c7,$c71c73,$1c71c7,$1c71c7,$c71c73,$2aaaaa,$1c71c7,$c71c73,$38e38e,$1c71c7,$c71c73
dc $c71c73,$2aaaaa,$c71c73,$d55557,$2aaaaa,$c71c73,$e38e3a,$2aaaaa,$c71c73,$f1c71e,$2aaaaa,$c71c73
dc $000000,$2aaaaa,$c71c73,$0e38e3,$2aaaaa,$c71c73,$1c71c7,$2aaaaa,$c71c73,$2aaaaa,$2aaaaa,$c71c73
dc $38e38e,$2aaaaa,$c71c73,$c71c73,$38e38e,$c71c73,$d55557,$38e38e,$c71c73,$e38e3a,$38e38e,$c71c73
dc $f1c71e,$38e38e,$c71c73,$000000,$38e38e,$c71c73,$0e38e3,$38e38e,$c71c73,$1c71c7,$38e38e,$c71c73
dc $2aaaaa,$38e38e,$c71c73,$38e38e,$38e38e,$c71c73,$c71c73,$c71c73,$d55557,$d55557,$c71c73,$d55557
dc $e38e3a,$c71c73,$d55557,$f1c71e,$c71c73,$d55557,$000000,$c71c73,$d55557,$0e38e3,$c71c73,$d55557
dc $1c71c7,$c71c73,$d55557,$2aaaaa,$c71c73,$d55557,$38e38e,$c71c73,$d55557,$c71c73,$d55557,$d55557
dc $d55557,$d55557,$d55557,$e38e3a,$d55557,$d55557,$f1c71e,$d55557,$d55557,$000000,$d55557,$d55557
dc $0e38e3,$d55557,$d55557,$1c71c7,$d55557,$d55557,$2aaaaa,$d55557,$d55557,$38e38e,$d55557,$d55557
dc $c71c73,$e38e3a,$d55557,$d55557,$e38e3a,$d55557,$e38e3a,$e38e3a,$d55557,$f1c71e,$e38e3a,$d55557
dc $000000,$e38e3a,$d55557,$0e38e3,$e38e3a,$d55557,$1c71c7,$e38e3a,$d55557,$2aaaaa,$e38e3a,$d55557
dc $38e38e,$e38e3a,$d55557,$c71c73,$f1c71e,$d55557,$d55557,$f1c71e,$d55557,$e38e3a,$f1c71e,$d55557
dc $f1c71e,$f1c71e,$d55557,$000000,$f1c71e,$d55557,$0e38e3,$f1c71e,$d55557,$1c71c7,$f1c71e,$d55557
dc $2aaaaa,$f1c71e,$d55557,$38e38e,$f1c71e,$d55557,$c71c73,$000000,$d55557,$d55557,$000000,$d55557
dc $e38e3a,$000000,$d55557,$f1c71e,$000000,$d55557,$000000,$000000,$d55557,$0e38e3,$000000,$d55557
dc $1c71c7,$000000,$d55557,$2aaaaa,$000000,$d55557,$38e38e,$000000,$d55557,$c71c73,$0e38e3,$d55557
dc $d55557,$0e38e3,$d55557,$e38e3a,$0e38e3,$d55557,$f1c71e,$0e38e3,$d55557,$000000,$0e38e3,$d55557
dc $0e38e3,$0e38e3,$d55557,$1c71c7,$0e38e3,$d55557,$2aaaaa,$0e38e3,$d55557,$38e38e,$0e38e3,$d55557
dc $c71c73,$1c71c7,$d55557,$d55557,$1c71c7,$d55557,$e38e3a,$1c71c7,$d55557,$f1c71e,$1c71c7,$d55557
dc $000000,$1c71c7,$d55557,$0e38e3,$1c71c7,$d55557,$1c71c7,$1c71c7,$d55557,$2aaaaa,$1c71c7,$d55557
dc $38e38e,$1c71c7,$d55557,$c71c73,$2aaaaa,$d55557,$d55557,$2aaaaa,$d55557,$e38e3a,$2aaaaa,$d55557
dc $f1c71e,$2aaaaa,$d55557,$000000,$2aaaaa,$d55557,$0e38e3,$2aaaaa,$d55557,$1c71c7,$2aaaaa,$d55557
dc $2aaaaa,$2aaaaa,$d55557,$38e38e,$2aaaaa,$d55557,$c71c73,$38e38e,$d55557,$d55557,$38e38e,$d55557
dc $e38e3a,$38e38e,$d55557,$f1c71e,$38e38e,$d55557,$000000,$38e38e,$d55557,$0e38e3,$38e38e,$d55557
dc $1c71c7,$38e38e,$d55557,$2aaaaa,$38e38e,$d55557,$38e38e,$38e38e,$d55557,$c71c73,$c71c73,$e38e3a
dc $d55557,$c71c73,$e38e3a,$e38e3a,$c71c73,$e38e3a,$f1c71e,$c71c73,$e38e3a,$000000,$c71c73,$e38e3a
dc $0e38e3,$c71c73,$e38e3a,$1c71c7,$c71c73,$e38e3a,$2aaaaa,$c71c73,$e38e3a,$38e38e,$c71c73,$e38e3a
dc $c71c73,$d55557,$e38e3a,$d55557,$d55557,$e38e3a,$e38e3a,$d55557,$e38e3a,$f1c71e,$d55557,$e38e3a
dc $000000,$d55557,$e38e3a,$0e38e3,$d55557,$e38e3a,$1c71c7,$d55557,$e38e3a,$2aaaaa,$d55557,$e38e3a
dc $38e38e,$d55557,$e38e3a,$c71c73,$e38e3a,$e38e3a,$d55557,$e38e3a,$e38e3a,$e38e3a,$e38e3a,$e38e3a
dc $f1c71e,$e38e3a,$e38e3a,$000000,$e38e3a,$e38e3a,$0e38e3,$e38e3a,$e38e3a,$1c71c7,$e38e3a,$e38e3a
dc $2aaaaa,$e38e3a,$e38e3a,$38e38e,$e38e3a,$e38e3a,$c71c73,$f1c71e,$e38e3a,$d55557,$f1c71e,$e38e3a
dc $e38e3a,$f1c71e,$e38e3a,$f1c71e,$f1c71e,$e38e3a,$000000,$f1c71e,$e38e3a,$0e38e3,$f1c71e,$e38e3a
dc $1c71c7,$f1c71e,$e38e3a,$2aaaaa,$f1c71e,$e38e3a,$38e38e,$f1c71e,$e38e3a,$c71c73,$000000,$e38e3a
dc $d55557,$000000,$e38e3a,$e38e3a,$000000,$e38e3a,$f1c71e,$000000,$e38e3a,$000000,$000000,$e38e3a
dc $0e38e3,$000000,$e38e3a,$1c71c7,$000000,$e38e3a,$2aaaaa,$000000,$e38e3a,$38e38e,$000000,$e38e3a
dc $c71c73,$0e38e3,$e38e3a,$d55557,$0e38e3,$e38e3a,$e38e3a,$0e38e3,$e38e3a,$f1c71e,$0e38e3,$e38e3a
dc $000000,$0e38e3,$e38e3a,$0e38e3,$0e38e3,$e38e3a,$1c71c7,$0e38e3,$e38e3a,$2aaaaa,$0e38e3,$e38e3a
dc $38e38e,$0e38e3,$e38e3a,$c71c73,$1c71c7,$e38e3a,$d55557,$1c71c7,$e38e3a,$e38e3a,$1c71c7,$e38e3a
dc $f1c71e,$1c71c7,$e38e3a,$000000,$1c71c7,$e38e3a,$0e38e3,$1c71c7,$e38e3a,$1c71c7,$1c71c7,$e38e3a
dc $2aaaaa,$1c71c7,$e38e3a,$38e38e,$1c71c7,$e38e3a,$c71c73,$2aaaaa,$e38e3a,$d55557,$2aaaaa,$e38e3a
dc $e38e3a,$2aaaaa,$e38e3a,$f1c71e,$2aaaaa,$e38e3a,$000000,$2aaaaa,$e38e3a,$0e38e3,$2aaaaa,$e38e3a
dc $1c71c7,$2aaaaa,$e38e3a,$2aaaaa,$2aaaaa,$e38e3a,$38e38e,$2aaaaa,$e38e3a,$c71c73,$38e38e,$e38e3a
dc $d55557,$38e38e,$e38e3a,$e38e3a,$38e38e,$e38e3a,$f1c71e,$38e38e,$e38e3a,$000000,$38e38e,$e38e3a
dc $0e38e3,$38e38e,$e38e3a,$1c71c7,$38e38e,$e38e3a,$2aaaaa,$38e38e,$e38e3a,$38e38e,$38e38e,$e38e3a
dc $c71c73,$c71c73,$f1c71e,$d55557,$c71c73,$f1c71e,$e38e3a,$c71c73,$f1c71e,$f1c71e,$c71c73,$f1c71e
dc $000000,$c71c73,$f1c71e,$0e38e3,$c71c73,$f1c71e,$1c71c7,$c71c73,$f1c71e,$2aaaaa,$c71c73,$f1c71e
dc $38e38e,$c71c73,$f1c71e,$c71c73,$d55557,$f1c71e,$d55557,$d55557,$f1c71e,$e38e3a,$d55557,$f1c71e
dc $f1c71e,$d55557,$f1c71e,$000000,$d55557,$f1c71e,$0e38e3,$d55557,$f1c71e,$1c71c7,$d55557,$f1c71e
dc $2aaaaa,$d55557,$f1c71e,$38e38e,$d55557,$f1c71e,$c71c73,$e38e3a,$f1c71e,$d55557,$e38e3a,$f1c71e
dc $e38e3a,$e38e3a,$f1c71e,$f1c71e,$e38e3a,$f1c71e,$000000,$e38e3a,$f1c71e,$0e38e3,$e38e3a,$f1c71e
dc $1c71c7,$e38e3a,$f1c71e,$2aaaaa,$e38e3a,$f1c71e,$38e38e,$e38e3a,$f1c71e,$c71c73,$f1c71e,$f1c71e
dc $d55557,$f1c71e,$f1c71e,$e38e3a,$f1c71e,$f1c71e,$f1c71e,$f1c71e,$f1c71e,$000000,$f1c71e,$f1c71e
dc $0e38e3,$f1c71e,$f1c71e,$1c71c7,$f1c71e,$f1c71e,$2aaaaa,$f1c71e,$f1c71e,$38e38e,$f1c71e,$f1c71e
dc $c71c73,$000000,$f1c71e,$d55557,$000000,$f1c71e,$e38e3a,$000000,$f1c71e,$f1c71e,$000000,$f1c71e
dc $000000,$000000,$f1c71e,$0e38e3,$000000,$f1c71e,$1c71c7,$000000,$f1c71e,$2aaaaa,$000000,$f1c71e
dc $38e38e,$000000,$f1c71e,$c71c73,$0e38e3,$f1c71e,$d55557,$0e38e3,$f1c71e,$e38e3a,$0e38e3,$f1c71e
dc $f1c71e,$0e38e3,$f1c71e,$000000,$0e38e3,$f1c71e,$0e38e3,$0e38e3,$f1c71e,$1c71c7,$0e38e3,$f1c71e
;; Sampling tables
table_quantizations_01
dc 00,00,01,03,04,05,06,07,08,09,10,11,12,13,14,15
dc 00,00,01,03,04,05,06,07,08,09,10,11,12,13,14,15
dc 00,00,01,03,04,05,06,07,00,00,00,00,00,00,00,00
dc 00,00,01,03,04,05,06,07,00,00,00,00,00,00,00,00
dc 00,00,01,03,04,05,06,07,00,00,00,00,00,00,00,00
dc 00,00,01,03,04,05,06,07,00,00,00,00,00,00,00,00
dc 00,00,01,03,04,05,06,07,00,00,00,00,00,00,00,00
dc 00,00,01,03,04,05,06,07,00,00,00,00,00,00,00,00
dc 00,00,01,03,04,05,06,07,00,00,00,00,00,00,00,00
dc 00,00,01,03,04,05,06,07,00,00,00,00,00,00,00,00
dc 00,00,01,03,04,05,06,07,00,00,00,00,00,00,00,00
dc 00,00,01,03,04,05,06,07,00,00,00,00,00,00,00,00
table_quantizations_23
dc 00,00,02,04,05,06,07,08,09,10,11,12,13,14,15,16
dc 00,00,02,04,05,06,07,08,09,10,11,12,13,14,15,16
dc 00,00,02,04,05,06,07,08,09,10,11,12,13,14,15,16
dc 00,00,01,02,03,04,05,06,07,08,09,10,11,12,13,16
dc 00,00,01,02,03,04,05,06,07,08,09,10,11,12,13,16
dc 00,00,01,02,03,04,05,06,07,08,09,10,11,12,13,16
dc 00,00,01,02,03,04,05,06,07,08,09,10,11,12,13,16
dc 00,00,01,02,03,04,05,06,07,08,09,10,11,12,13,16
dc 00,00,01,02,03,04,05,06,07,08,09,10,11,12,13,16
dc 00,00,01,02,03,04,05,06,07,08,09,10,11,12,13,16
dc 00,00,01,02,03,04,05,06,07,08,09,10,11,12,13,16
dc 00,00,01,02,03,04,05,16,00,00,00,00,00,00,00,00
dc 00,00,01,02,03,04,05,16,00,00,00,00,00,00,00,00
dc 00,00,01,02,03,04,05,16,00,00,00,00,00,00,00,00
dc 00,00,01,02,03,04,05,16,00,00,00,00,00,00,00,00
dc 00,00,01,02,03,04,05,16,00,00,00,00,00,00,00,00
dc 00,00,01,02,03,04,05,16,00,00,00,00,00,00,00,00
dc 00,00,01,02,03,04,05,16,00,00,00,00,00,00,00,00
dc 00,00,01,02,03,04,05,16,00,00,00,00,00,00,00,00
dc 00,00,01,02,03,04,05,16,00,00,00,00,00,00,00,00
dc 00,00,01,02,03,04,05,16,00,00,00,00,00,00,00,00
dc 00,00,01,02,03,04,05,16,00,00,00,00,00,00,00,00
dc 00,00,01,02,03,04,05,16,00,00,00,00,00,00,00,00
dc 00,00,01,16,00,00,00,00,00,00,00,00,00,00,00,00
dc 00,00,01,16,00,00,00,00,00,00,00,00,00,00,00,00
dc 00,00,01,16,00,00,00,00,00,00,00,00,00,00,00,00
dc 00,00,01,16,00,00,00,00,00,00,00,00,00,00,00,00
dc 00,00,01,16,00,00,00,00,00,00,00,00,00,00,00,00
dc 00,00,01,16,00,00,00,00,00,00,00,00,00,00,00,00
dc 00,00,01,16,00,00,00,00,00,00,00,00,00,00,00,00
;; A combination of the x, d and c tables. The `m' stands
;; for the multiplicator using 1.0/x. NOTE: Table c is
;; subtracted by 1.0.
table_xmdc
dc $000001,$100000,$200000,$2aaaab
dc $000003,$080000,$200000,$4ccccd
dc $000003,$080000,$100000,$124925
dc $000007,$040000,$200000,$638e39
dc $000007,$040000,$080000,$088889
dc $00000f,$020000,$040000,$042108
dc $00001f,$010000,$020000,$020821
dc $00003f,$008000,$010000,$010204
dc $00007f,$004000,$008000,$008081
dc $0000ff,$002000,$004000,$004020
dc $0001ff,$001000,$002000,$002008
dc $0003ff,$000800,$001000,$001002
dc $0007ff,$000400,$000800,$000801
dc $000fff,$000200,$000400,$000400
dc $001fff,$000100,$000200,$000200
dc $003fff,$000080,$000100,$000100
dc $007fff,$000040,$000080,$000080
;; The `multiply' table used in the last step of sample
;; requantization. NOTE: All values are divided by two.
table_multiple
dc $7fffff,$6597fb,$50a28c,$400000
dc $32cbfd,$285146,$200000,$1965ff
dc $1428a3,$100000,$0cb2ff,$0a1451
dc $080000,$065980,$050a29,$040000
dc $032cc0,$028514,$020000,$019660
dc $01428a,$010000,$00cb30,$00a145
dc $008000,$006598,$0050a3,$004000
dc $0032cc,$002851,$002000,$001966
dc $001429,$001000,$000cb3,$000a14
dc $000800,$000659,$00050a,$000400
dc $00032d,$000285,$000200,$000196
dc $000143,$000100,$0000cb,$0000a1
dc $000080,$000066,$000051,$000040
dc $000033,$000028,$000020,$000019
dc $000014,$000010,$00000d,$00000a
dc $000008,$000006,$000005,$000000
table_bits
dc 5,7,3,10,4,5,6,7,8,9
dc 10,11,12,13,14,15,16
table_translate_quantizations
dc table_quantizations_23
dc table_quantizations_23
dc table_quantizations_01
dc table_quantizations_01
table_translate_sblimit
dc 27,30,8,12
table_translate_alloc
dc alloc0_bits0
dc alloc1_bits0
dc alloc2_bits0
dc alloc3_bits0
alloc0_bits0 ;sblimit=27
alloc1_bits0 ;sblimit=30
dc 4,4,4,4,4,4,4,4,4,4,4 ; 11
dc 3,3,3,3,3,3,3,3,3,3,3,3 ;+12
dc 2,2,2,2 ;+04 = 27
dc 2,2,2 ;+03 = 30
alloc2_bits0 ;sblimit=08
alloc3_bits0 ;sblimit=12
dc 4,4 ; 02
dc 3,3,3,3,3,3 ;+06 = 08
dc 3,3,3,3 ;+04 = 12