;*****************************************************************************
;
;    DelfMPEG - MPEG audio player for Delfina DSP
;    Copyright (C) 1999-2001  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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
;   0 .. busy (Amiga read only, TRUE (NON-ZERO) if decoder is running)
;   1 .. forcemono (Amiga write)



	org	p:

;->prog
	jmp	init

;->prog+2

;*****************************************************************************
;
; **** MPEG1 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. 1788 bytes)
;
;
; based on the mp2 player for Atari Falcon by Fredrik Noring
; Delfina DSP programming 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)
; (Sun 28-Nov-1999) - little code optimizing and speedup
;                     (bfy1_loop, unscramble_loop to internal mem)
; (Sun 09-Jan-2000) - subband synthesis routine optimized
;                     (little speedup, slightly shorter code, now it needs
;                     about 24% DSP time on my Delfina1200 for 44.1kHz)
; (Wed 16-Feb-2000) - fixed the 'low-bitrate bug'
;                   - playback quality slightly improved
;                     (fixed the little known 'intermediate ZERO-bitalloc bug')
;                   - added DSP overload detection (y:busy)
; (Mon 03-Apr-2000) - added FORCEMONO feature (only left channel is decoded)
; (Wed 26-Apr-2000) - optimized synthesis routine (significant speedup!)
;
;*****************************************************************************


	move	x0,x:synth_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	a,y:busy		;set BUSY to non-zero

	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	x:channels,b
;>>> forcemono
	move	#>1,y0
	move	y:forcemono,a
	tst	a	x:channels,b
	tne	y0,b
;<<<
	move	#>2,y0
	move	#>$3ff,a
	cmp	y0,b	#>64,b
	teq	x0,a
	teq	x1,b
	move	a,x:synth_audio_mask
	move	b,x:synth_audio_delta

;	** calculate deltas for the cosine transform
	move	x:channels,a
	lsl	a	a,y0
	add	y0,a
	move	a,x:synth_imfct_delta

;	** clear fraction
	clr	a	#decoder_fraction,r0
	rep	#2*32*3
	move	a1,x:(r0)+

;	** reset getbits
	move	#getbits_temp,r0
	move	#inbuf,x0
	move	x0,x:getbits_stream_p
	move	#$800000,a1
	move	a1,x:(r0)	;initialize 'current bitstream word'






;******************************************************************
;decode_scales
;	** getbits_init
	move	x:getbits_stream_p,r7
	move	#getbits_temp,r6
	move	x:decoder_getbits_loop_p,r5

;	**
;	** fetch bit allocation table
;	**
	clr	b	x:channels,y0
	move	x:jsbound,y1
	move	x:decoder_nbals,r0
	move	#decoder_bitalloc,r1

;	** loop until jsbound
	move	y:(r0)+,n7		; nbal
	move	#>1,x1
	do	y1,sb_loop0	;jsbound
	do	y0,ch_loop0	;channels
	clr	a	b,x0		;save b
	move	x:(r6),b1		;current bitstream word
	jsr	(r5)			;-getbits- read nbal bits
	tfr	x0,b	b1,x:(r6)	;restore b
	add	x1,b	a,x:(r1)+	;b=b+1
ch_loop0
	move	y:(r0)+,n7		; nbal
sb_loop0
;	** loop until sblimit (for joint-stereo only)
	move	x:sblimit,a
	sub	y1,a	b,y0
	jle	sb_loop1		; not joint-stereo
	do	a,sb_loop1	;sblimit-jsbound
	clr	a	b,x0		;save b
	move	x:(r6),b1		;current bitstream word
	jsr	(r5)			;-getbits- read nbal bits
	tfr	x0,b	b1,x:(r6)	;restore b
	add	x1,b	a,x:(r1)+
	add	x1,b	y:(r0)+,n7		; nbal
	move		a,x:(r1)+	b,y0	;b=b+2
sb_loop1

	move	x:(r6),b1	;current bitstream word

;	**
;	** fetch scalefactor selection information
;	**
	move	#decoder_scfsi,r0
	move	#decoder_bitalloc,r4
	move	r4,r3
	move	#2,n7			; 2 bit scfsi
	do	y0,sf_loop0	;sblimit*channels
	move	x:(r3)+,a		;check bitalloc
	tst	a	#0,a
	jsne	(r5)			;-getbits-
	move	a,x:(r0)+
sf_loop0

;	**
;	** fetch scale factors
;	**
	move	#decoder_scfsi,r0
	move	#decoder_scalefactor,r1
	move	#6,n7			; 6 bit scalefactors
	do	y0,sf_loop1	;sblimit*channels

	clr	a	x:(r4)+,x0	;check bitalloc
	cmp	x0,a	x:(r0)+,x0
	jeq	sf_ba0

	cmp	x0,a	#>1,a
	jne	sf_c1
	clr	a
	jsr	(r5)			;-getbits- all three
	clr	a	a,x:(r1)+
	jsr	(r5)			;-getbits-
	clr	a	a,x:(r1)+
	jsr	(r5)			;-getbits-
	jmp	sf_resume

sf_c1	cmp	x0,a	#>2,a
	jne	sf_c2
	clr	a
	jsr	(r5)			;-getbits- 1 + 3
	move	a,x:(r1)+
	clr	a	a,x:(r1)+
	jsr	(r5)			;-getbits-
	jmp	sf_resume

sf_c2	cmp	x0,a	#0,a
	jne	sf_c3
	jsr	(r5)			;-getbits- just one
sf_ba0	move	a,x:(r1)+
	move	a,x:(r1)+
	jmp	sf_resume

sf_c3	jsr	(r5)			;-getbits- 1 + 2
	clr	a	a,x:(r1)+
	jsr	(r5)			;-getbits-
	move	a,x:(r1)+

sf_resume
	move	a,x:(r1)+
sf_loop1


	move	b1,x:(r6)

;	** 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


;	do	#500,overload0
;	do	#1000,overload1
;	nop
;overload1
;	nop
;overload0


;exit
	move	#0,x0
	move	x0,y:busy		;clear BUSY
	rts










;******************************************************************
decode_samples
	move	x0,x:decode_rts_p

;	** getbits_init
	move	x:getbits_stream_p,r7
	move	#getbits_temp,r6
	move	x:decoder_getbits_loop_p,r5



	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	x:channels,x0
	jmi	ds_sb_loop		;'low-bitrate bug' - jeq
	move	a,x:decode_ds_sblimit_count

	do	x0,ds_ch_loop		;channels

;	** 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)-n1
	jmp	ds_scalefactor_adjust

ds_samples
;	** check if joint-stereo applies
	move	x:decoder_old_samples_p,r4
	jclr	#23,b1,ds_no_joint
	jset	#0,b1,ds_no_joint

;	** copy old samples for joint-stereo
	move			y:(r4)+,a
	move	a,x:(r1)+	y:(r4)+,a
	move	a,x:(r1)+	y:(r4),a
	move	a,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),n7		; 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	x:decoder_table_xmdc_p,r3
	clr	a	a,n3
	jsr	(r5)			;-getbits-
	move	b1,x:(r6)
	move	(r3)+n3
	move	#3,n3

;	** 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)			;-getbits-
	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)			;-getbits-
	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)			;-getbits-

	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
	move	x:decoder_old_samples_p,r4
	move	x:(r3)+n3,n3
	move	r3,x:decoder_sfp
	move	#table_multiple,r3
	move		x:(r1)+,x0
	tfr	x0,a			y:(r3+n3),y1
	mpyr	x0,y1,b	x:(r1)-,x0	a,y:(r4)+	;old samples
	mpyr	x0,y1,a	b,x:(r1)+n1	x0,b
	move		x:(r1)-,x0	b,y:(r4)+	;old samples
	mpyr	x0,y1,b	a,x:(r1)+	x0,a
	move		b,x:(r1)+	a,y:(r4)	;old samples

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




;	move	x:decode_rts_p,r0
;	nop
;	jmp	(r0)			;'rts'-replacement



;******************************************************************
;subband synthesis

	move	#>decoder_fraction,x0
	move	x0,x:synth_imfct_fraction_p

	move	#3,n0
	move	n0,x:decode_tr3_count
synth_tr_loop_head

	move	x:synth_imfct_fraction_p,r0

	move	x:synth_pcm64_p,x0
	move	x0,x:synth_pcm_p

;;	move	x:channels,b			;1 or 2
;>>> forcemono
	move	#<0,x0		;#>1,x0
	move	y:forcemono,a
	tst	a	x:channels,b
	tne	x0,b
;<<<

synth_ch_loop_head
	lsr	b	x:synth_imfct_p,n7	;x:synth_imfct_p	!! n7
	move	b,x:decode_channels_count	;0 or 1

;	**
;	** perform inverse modified fast cosine transform
;	**


;	** first butterfly pass
	move	x:synth_imfct_delta,n0
	move	n7,r1				;x:synth_imfct_p
	move	n7,r5
	move	#0.70710678,y0			;cos(pi/4)
	move			x:(r0)+n0,x0
	do	#8,synth_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)+
synth_bfy1

;	** second butterfly pass
	move	n7,a				;x:synth_imfct_p
	move	#>16,x0
	add	x0,a	a,r0
	add	x0,a	a,r4
	add	x0,a	a,r6
	move		a,r5
	lua	(r0)+,r7
	move			x:(r0),b	y:(r4),y0
	do	#16,synth_bfy2
	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		x:(r7)+,b	b,y:(r0)	;!b
	move			a,x:(r0)+	y:(r4),y0	;!y0
synth_bfy2

;	** perform the rest of the butterfly passes
	move	x:synth_tab_rsincosx_p,n6	;x:synth_tab_rsincosx_p	!! n6
	move	n7,r0				;x:synth_imfct_p
	movec	#<64-1,m0			;modulo-64 addressing
	movec	#<64-1,m4			;modulo-64 addressing

;	** pass 3
	move	n6,r6				;x:synth_tab_rsincosx_p
	move	#<8,n0
	move	#<8,n4
	move	r0,r4
	do	#4,synth_grp3
	lua	(r0)+n0,r5
	move	r5,r2
	move			x:(r6),x0
	move			x:(r0),b	y:(r5),y1
	mac	-x0,y1,b	x:(r2)+,x1	y:(r6)+,y0
	do	#8,synth_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)+
synth_bfy3
	move			x:(r0)+n0,x0	y:(r4)+n4,y0	;update r0, r4
synth_grp3

	movec	#<64-1,m2			;modulo-64 addressing
	movec	#<64-1,m5			;modulo-64 addressing

;	** pass 4
	move	n6,r6				;x:synth_tab_rsincosx_p
	move	#<4+0,n0
	move	#<4+1,n2
	move	#<4+1,n4
	move	#<4+1,n5
	lua	(r0)+n0,r5
	move	r5,r2
	move			x:(r6),x0
	move			x:(r0),b	y:(r5),y1
	do	#8,synth_grp4
	mac	-x0,y1,b	x:(r2)+,x1	y:(r6)+,y0
	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)+
	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)+
	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)+n2,x1	a,y:(r5)+	;update r2
	macr	y0,x1,b		x:(r0),a
	subl	b,a		b,x:(r0)	y:(r4)+n4,b	;update r4
	mac	y0,y1,b		a,x:(r5)	y:(r2),y1	;!y1
	macr	x0,x1,b		x:(r6),x0	y:(r0),a	;!x0
	subl	b,a		x:(r4),b	b,y:(r0)+	;!b
	move			x:(r0)+n0,a	a,y:(r5)+n5	;update r0, r5
synth_grp4

;	** pass 5
	move	n6,r6				;x:synth_tab_rsincosx_p
	move	#<2+0,n0
	move	#<2+1,n2
	move	#<2+1,n4
	move	#<2+1,n5
	lua	(r0)+n0,r5
	move	r5,r2
	move			x:(r6),x0
	move			x:(r0),b	y:(r5),y1
	do	#16,synth_grp5
	mac	-x0,y1,b	x:(r2)+,x1	y:(r6)+,y0
	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)+n2,x1	a,y:(r5)+	;update r2
	macr	y0,x1,b		x:(r0),a
	subl	b,a		b,x:(r0)	y:(r4)+n4,b	;update r4
	mac	y0,y1,b		a,x:(r5)	y:(r2),y1	;!y1
	macr	x0,x1,b		x:(r6),x0	y:(r0),a	;!x0
	subl	b,a		x:(r4),b	b,y:(r0)+	;!b
	move			x:(r0)+n0,a	a,y:(r5)+n5	;update r0, r5
synth_grp5

;	** pass 6
	move	n6,r6				;x:synth_tab_rsincosx_p
	move	#<1+1,n2
	move	#<1+1,n4
	move	#<1+1,n5
	lua	(r0)+,r5
	move	r5,r2
	move			x:(r6),x0
	move			x:(r0),b	y:(r5),y1
	do	#32,synth_grp6
	mac	-x0,y1,b	x:(r2)+n2,x1	y:(r6)+,y0	;update r2
	macr	y0,x1,b		x:(r0),a
	subl	b,a		b,x:(r0)	y:(r4)+n4,b	;update r4
	mac	y0,y1,b		a,x:(r5)	y:(r2),y1	;!y1
	macr	x0,x1,b		x:(r6),x0	y:(r0),a	;!x0
	subl	b,a		x:(r4),b	b,y:(r0)+	;!b
	move			x:(r0)+,a	a,y:(r5)+n5	;update r0, r5
synth_grp6

	movec	m7,m2				;linear addressing
	movec	m7,m4				;linear addressing
	movec	m7,m5				;linear addressing

;	** unscrambling and final adjustments
	move	x:synth_audio_p,r5
	move	#>synth_tab_cosx,r4
	move	#>synth_tab_sinx,r6
	movec	#<0,m0				;bit-reverse addressing
	move	#<32,n0
	move			x:(r0),x1	y:(r4)+,y1
	mpy	y1,x1,a				y:(r6)+,y0
	move					y:(r0)+n0,y1
	macr	-y0,y1,a	x:(r0),x1	y:(r4)+,y1
	move					y:(r6)+,y0
synth_unscramble_start
;------	move	#synth_unscramble,r7
;------	jmp	<synth_unscramble_start
	do	#64-1,synth_unscramble
	mpy	y1,x1,a		a,x:(r5)+	y:(r0)+n0,y1
	macr	-y0,y1,a	x:(r0),x1	y:(r4)+,y1
	move					y:(r6)+,y0
synth_unscramble
;------	5+1 words, return: jmp (r7)
	move			a,x:(r5)+

;	** window audio data
	move	x:synth_audio_p,r0
	movec	x:synth_audio_mask,m0		;modulo addressing
	movec	m0,m1
	move	x:synth_audio_delta,a
	tfr	a,b		#>32,x0
	add	x0,a		x:synth_pcm_p,r5
	move	a,n0
	lsl	b		#synth_tab_window,r4
	lua	(r0)+n0,r1
	move	x:synth_window_p,r3
	move	b1,n0
	move	b1,n1
	jsr	(r3)
	move	r5,x:synth_pcm_p
	movec	m7,m0				;linear addressing
	movec	m0,m1
	
;	** update pointer to next channel
	move	#>3,x0
	move	x:synth_imfct_fraction_p,a
	add	x0,a		#>64,y0
	move	a,r0

	move	x:synth_audio_p,a
	add	y0,a		x:decode_channels_count,b
	tst	b		a,x:synth_audio_p
	jne	synth_ch_loop_head


;	** finally: write audio data to output buffer
	move	x:synth_out_p,r4
	move	x:synth_pcm64_p,r0
	move	#31,n0
	move	#>3,y1
	do	#32,synth_out_loop
	move	x:(r0)+,x1
	mpy	x1,y1,b		x:(r0+n0),x1
	mpy	x1,y1,b		b0,x:(r4)
	move	b0,y:(r4)+
synth_out_loop
	move	r4,x:synth_out_p

;	** fraction pointer to next triplet
;	** and update audio buffer pointers
	move	x:synth_imfct_fraction_p,a
	move	#>1,x0
	move	x:synth_audio_p,r0
	add	x0,a		x:synth_audio_delta,n0
	move	a,x:synth_imfct_fraction_p
	move	(r0)-n0
	movec	x:synth_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:synth_audio_p
	jne	synth_tr_loop_head



	move	x:decode_rts_p,r0
	nop
	jmp	(r0)			;'rts'-replacement











synth_window_start
	do	#32,synth_window
	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)+,a	;update r1
synth_window
	rts
synth_window_end
;		** 21 words


synth_bfy1_help
	jmp	(r7)
	move	#synth_bfy1,r7

synth_unscramble_help
	jmp	(r7)
	move	#synth_unscramble,r7



getbits_loop_start
	do	n7,getbits_loop
	lsl	b			;b1=b1<<1 (new CARRY bit)
	jne	getbits_ne		;(patch for short jump)
getbits_cp
	move	x:(r7)+,b1		;fetch next 24 bits
	rol	b			;b1=b1<<1, append end marker
getbits_ne
	rol	a			;get CARRY bit, set condition code ZERO
getbits_loop
	rts
getbits_loop_end
;		** 9 words (8 words with 'jne' short jump)













;*** initialize ************************
; parameters
;  x1 - mem_mp2 (64+32=96 words in INTERNAL L-memory)
;  x0 - mem_mp2p (21+6=27 words in INTERNAL P-memory)
;  y1 - /
;  y0 - /
init

;********* subband synthesis: fast L-data buffer for IMFCT routine
;********* (64 words - major speedup!!)
	tfr	x1,a		#>64,x1
	tst	a		#synth_tab_rsinxrcosx,r0
	jeq	init_no_lmem
	add	x1,a		a,x:synth_imfct_p

;********* subband synthesis: rsinx_rcosx table to fast L-data memory
;********* (32 words - little speedup)
	move	a,x:synth_tab_rsincosx_p
	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		#synth_window_start,r0
	tst	a		x0,r1
	jeq	init_no_pmem

;********* subband synthesis: window loop to fast program memory
;********* (21 words - major speedup!!)
	move	x0,x:synth_window_p
	lua	(r1)+,r2
	do	#synth_window_end-synth_window_start,init_loop1
	movem	p:(r0)+,x1
	movem	x1,p:(r1)+
init_loop1
	tfr	x0,a		#>synth_window-synth_window_start-1,x0
	add	x0,a		#>synth_unscramble_start,r0
	movem	a,p:(r2)		;patch absolute address in 'do'


;********* subband synthesis: unscramble loop to fast program memory
;********* (6 words - tiny speedup)
	move	r1,a
	tfr	a,b		r0,r2
	movem	p:(r0)+,x1
	movem	x1,p:(r1)+		;copy first word of 'do'
	move	#>synth_unscramble-synth_unscramble_start-1,x0
	add	x0,a		(r0)+
	movem	a,p:(r1)+		;second word of 'do' (absolute address)
	do	#synth_unscramble-synth_unscramble_start-2,init_loop_p1
	movem	p:(r0)+,x1
	movem	x1,p:(r1)+		;copy the rest
init_loop_p1
	move	#>synth_unscramble_help,r3
	move	#>$0c0000,y0		;short jump 'jmp xxx'
	movem	p:(r3)+,x1
	movem	x1,p:(r1)+		;copy 'jmp (r7)'
	movem	p:(r3)+,x1
	movem	x1,p:(r2)+
	movem	p:(r3),x1
	movem	x1,p:(r2)+		;copy 'move #synth_unscramble,r7'
	or	y0,b
	movem	b,p:(r2)		;short jump 'jmp <synth_unscramble_start'



init_no_pmem
	rts







	org	l:
	align	64

synth_imfct_slow
	ds	64

synth_tab_rsinxrcosx
;	**	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

decoder_old_samples_slow
	ds	3






;;vars

	org	x:
	align	2048
synth_audio	ds	2048

;->xdata+2048
inbuf	ds	596	;MPG_MAXFRAMESIZE=1792-4


channels	ds	1
translate	ds	1
sblimit		ds	1
jsbound		ds	1

getbits_stream_p	ds	1
getbits_temp		ds	1
decoder_getbits_loop_p	dc	getbits_loop_start

decode_rts_p		ds	1
decode_ds_sblimit_count	ds	1
decode_tr3_count	ds	1
decode_channels_count	ds	1

;	dc	"######bitalloc ######"
decoder_bitalloc	ds	2*32
;	dc	"######scfsi    ######"
decoder_scfsi		ds	2*32
;	dc	"######scalefact######"
decoder_scalefactor	ds	2*32*3
;	dc	"######fraction ######"
decoder_fraction	ds	2*32*3
;	dc	"######"
decoder_old_samples_p	dc	decoder_old_samples_slow
decoder_table_xmdc_p	dc	table_xmdc

decoder_sfp		ds	1
decoder_sf_granule	ds	1
decoder_quantizations	ds	1
decoder_nbals		ds	1
decoder_joint_countdown	ds	1


synth_out_p		ds	1
synth_audio_p		dc	synth_audio
synth_audio_mask	ds	1
synth_audio_delta	ds	1
synth_pcm_p		ds	1
synth_imfct_p		dc	synth_imfct_slow
synth_window_p		dc	synth_window_start
synth_tab_rsincosx_p	dc	synth_tab_rsinxrcosx
synth_imfct_fraction_p	ds	1
synth_imfct_delta	ds	1
synth_pcm64_p		dc	synth_pcm64_slow
synth_pcm64_slow	ds	64





	org	y:
busy		dc	0
forcemono	dc	0

synth_tab_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
synth_tab_sinx
	dc	0.000000,0.049068,0.098017,0.146730	;sine only
	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
synth_tab_cosx
	dc	0.999999,0.998795,0.995185,0.989177	;sine and cosine
	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	;cosine only
	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
