;
; Some practical assembler utility routines. See sutils.h for corresponding C prototypes
; They correspond to functions defined in util.c
;
; Michael Rausch  16-2-94  1:05:00
;

	SECTION	text,CODE

ER	EQU	-1

END_OF_BLOCK EQU 62
ESCAPE	EQU	61

RUN_MASK EQU	$fc00
RUN_SHIFT EQU	10

LEVEL_MASK EQU	$03f0
LEVEL_SHIFT EQU	4

NUM_MASK EQU	$000f


	XREF	@correct_underflow
	XREF	_bitBuffer
	XREF	_bufLength
	XREF	_bitBuffer
	XREF	_bitOffset
;	XREF	_bitCount	; ANALYSIS
;	XREF	_mbCoeffPtr	; ANALYSIS

	XREF	_dct_coeff_first
	XREF	_dct_coeff_next
	XREF	_dct_coeff_tbl_0
	XREF	_dct_coeff_tbl_1
	XREF	_dct_coeff_tbl_2
	XREF	_dct_coeff_tbl_3

	XREF	_zigzag_direct

	XDEF	_dummy_public
_dummy_public:
	nop


; ***************************************************************

; Fills in the data if a new quantization matrix is encountered in the stream.
; In addition, it creates the qscale multiplication tables.

	XDEF	@new_matrix
@new_matrix:
	movem.l	d2-d4/a2-a3,-(sp)
	move.l	a0,a2

	moveq	#16,d1
	cmp.l	_bufLength(a4),d1
	ble.s	nm_nc
	bsr	@correct_underflow
nm_nc:

	move.l	a2,a1

	move.l	_bitOffset(a4),d1
	move.l	_bitBuffer(a4),a0

	moveq	#8,d3
	moveq	#32,d2

	moveq	#63,d4
get64bytesfromstream:

	bfextu	(a0){d1:d3},d0
	move.w	d0,(a1)+		; was indexed via zigzag_direct, but changed in utilisation as well

	add.l	d3,d1
	cmp.l	d2,d1
	blt.s	nmxw
	sub.l	d2,d1
	addq.l	#4,a0
	subq.l	#1,_bufLength(a4)
nmxw:
	dbra	d4,get64bytesfromstream

;	add.l	#64*8,_bitCount(a4)	; ANALYSIS
	move.l	a0,_bitBuffer(a4)
	move.l	d1,_bitOffset(a4)


	move.l	a2,a3			; last scale
	moveq	#29,d0
allqscales:
	move.l	a2,a0			; first scale
	moveq	#15,d1
qscaletab:
	rept 2
	move.l	(a0)+,d2		; get first qscale
	add.l	(a3)+,d2		; add last qscale
	move.l	d2,(a1)+		; is new qscale	
	endr
	dbra	d1,qscaletab
	dbra	d0,allqscales


	movem.l	(sp)+,d2-d4/a2-a3
	rts


; ***************************************************************

process_intra MACRO (label, sparereg)

	bfextu	(a1){d7:d6},d0

	move.l	d0,d1
	rol.l	#8,d1			; only .b-tests are valid!

	cmp.b	#3,d1
	bls	.adcd_others

	and.w	#$ff,d1
	moveq	#0,d5
	move.w	(a2,d1.w*2),d5		; value

	move.l	d5,d3
	lsr.w	#RUN_SHIFT-8,d3		; run
	lsr.w	#8,d3
	cmp.w	#END_OF_BLOCK,d3
	beq	\1			; reci_ready
	cmp.w	#ESCAPE,d3
	beq.s	.aescape

.astd_handle:

	move.w	d5,d4			; flushed
	and.w	#NUM_MASK,d4
	addq.w	#2,d4

	and.w	#LEVEL_MASK,d5
	lsr.w	#LEVEL_SHIFT,d5		; level

	moveq.l	#32,d1
	sub.w	d4,d1
	btst	d1,d0
	beq	.aoutblockescape
	neg.l	d5
	bra	.aoutblockescape		; fertig
.aescape:

	move.w	d5,d4			; flushed
	and.w	#NUM_MASK,d4
	add.w	#1+22,d4

	moveq	#18+22-8,d1
	sub.w	d4,d1
	move.l	d0,d3
	lsr.l	d1,d3			; temp

	move.w	d3,d5			; ?!??
	lsr.l	#8,d3

	and.w	#$3fff,d3		; run/level

	tst.b	d3
	beq.s	.aoutblockescape3

	cmp.b	#128,d3
	beq.s	.ais128
	move.b	d3,d5
	subq.w	#8,d4
	bra.s	.aoutblockescape3

.ais128:
	sub.w	#256,d5
	ext.l	d5
	bra.s	.aoutblockescape2


.adcd_others:
	beq.s	.adc3			; cmp #3 from above
	tst.b	d1
	bne.s	.adc1
	moveq	#16,d1
	move.l	#255,d3
	lea	_dct_coeff_tbl_0(a4),\2
	bra.s	.adcdo_gotval
.adc1:	subq.b	#1,d1
	bne.s	.adc2
	moveq	#20,d1
	moveq	#15,d3
	lea	_dct_coeff_tbl_1(a4),\2
	bra.s	.adcdo_gotval
.adc2:	lea	_dct_coeff_tbl_2(a4),\2
	bra.s	.adc32
.adc3:	lea	_dct_coeff_tbl_3(a4),\2
.adc32:	moveq	#22,d1
	moveq	#3,d3

.adcdo_gotval:
	move.l	d0,d5
	lsr.l	d1,d5
	and.l	d3,d5
	move.w	(\2,d5.w*2),d5	; value

	move.l	d5,d3
	lsr.w	#RUN_SHIFT-8,d3	; run
	lsr.w	#8,d3

	bra	.astd_handle


.aoutblockescape3:
	extb.l	d5
.aoutblockescape2:
	lsr.w	#8,d3
.aoutblockescape:

;	ext.l	d4
;	add.l	d4,_bitCount(a4)	; ANALYSIS
	add.w	d4,d7
	cmp.l	d6,d7
	blt.s	.adcds	;endofblock
	sub.l	d6,d7
	addq.l	#4,a1
	subq.l	#1,_bufLength(a4)
.adcds:			;endofblock:
	endm

; *******************


	XDEF	_recon_nonintra
_recon_nonintra:
rni_regs REG	d2-d7/a2-a3/a5-a6
	movem.l	rni_regs,-(sp)

	swap	d0
	move.l	d0,-(sp)			; qscale
	move.l	a1,a6

	lea	_zigzag_direct(a4),a3
	lsl.l	#2,d1				; i, index to zigzag
	add.l	d1,a3

	lea	_dct_coeff_next(a4),a2

	move.l	_bitBuffer(a4),a1
	move.l	_bitOffset(a4),d7
	moveq	#32,d6

rneci_loop1:
	process_intra	rneci_ready,a0

	addq.l	#1,d3
	add.l	d3,d3
	add.l	d3,d3
	add.l	d3,a3				; i+= run+1  (implicit zigzag)
	move.l	(a3),d1				; pos
	muls.w	(sp),d5				; qscale
	asr.w	#3,d5
	move.w	d5,(a6,d1.l*2)
	bra	rneci_loop1

rneci_ready:
	move.l	a1,_bitBuffer(a4)
	move.l 	d7,_bitOffset(a4)



; this won't work anymore ... take a3 instead!
; 	addq.l	#1,([_mbCoeffPtr,a4],d1.l*4)	; ANALYSIS

	addq.l	#4,sp
	movem.l	(sp)+,rni_regs
	rts




; ***********************

	XDEF	@recon_non2intra
@recon_non2intra:
ri_regs REG	d2-d7/a2-a3/a5-a6
	movem.l	ri_regs,-(sp)
	move.l	a0,a5

	lea	_zigzag_direct(a4),a3
	add.l	d0,d0
	add.l	d0,a5
	add.l	d0,d0
	add.l	d0,a3				; i+= run

	bra	r2ni_entry

	XDEF	@recon_intra
@recon_intra:
	movem.l	ri_regs,-(sp)
	move.l	a0,a5

	lea	_zigzag_direct(a4),a3

r2ni_entry:
	move.l	a1,a6
	lea	_dct_coeff_next(a4),a2

	move.l	_bitBuffer(a4),a1
	move.l	_bitOffset(a4),d7
	moveq	#32,d6

reci_loop1:
	process_intra	reci_ready,a0

	addq.l	#1,d3
	add.l	d3,d3
	add.l	d3,a5
	add.l	d3,d3
	add.l	d3,a3				; i+= run+1  (implicit zigzag)
	move.l	(a3),d1				; pos
	muls.w	(a5),d5
	asr.w	#3,d5
; das vorzeichen von (a5) wird benutzt, um d5 mittels lsb auf/abrunden
; ...
	move.w	d5,(a6,d1.l*2)
	bra	reci_loop1

reci_ready:
	move.l	a1,_bitBuffer(a4)
	move.l 	d7,_bitOffset(a4)


; this won't work anymore ... reference a3 instead!
; 	addq.l	#1,([_mbCoeffPtr,a4],d1.l*4)	; ANALYSIS

	movem.l	(sp)+,ri_regs
	rts





; ***************************************************************

bgsh_x:	move.l	a0,-(sp)
	move.l	d0,-(sp)
	move.l	a1,-(sp)
	bsr	@correct_underflow
	move.l	(sp)+,a1
	move.l	(sp)+,d0
	bra.s	bsngsh

	XDEF	@s_get_bits_huff
@s_get_bits_huff:
	moveq	#2,d1
	cmp.l	_bufLength(a4),d1
	bgt.s	bgsh_x

	XDEF	@sn_get_bits_huff
@sn_get_bits_huff:
	move.l	a0,-(sp)
bsngsh:

	move.l	_bitOffset(a4),d1
	move.l	_bitBuffer(a4),a0
	bfextu	(a0){d1:d0},d2

	move.l	(sp)+,a0

	move.w	(a1,d2.w*2),d0
	bmi.s	gbh_error

	moveq	#0,d2
	move.b	d0,d2

;	add.l	d2,_bitCount(a4)	; ANALYSIS

	add.l	d1,d2
	moveq	#32,d1
	cmp.l	d1,d2
	blt.s	bsgdhw
	sub.l	d1,d2
	addq.l	#4,_bitBuffer(a4)
	subq.l	#1,_bufLength(a4)
bsgdhw:
	move.l	d2,_bitOffset(a4)

	lsr.w	#8,d0
	moveq	#0,d1
	lsr.w	#1,d0
	addx.w	d1,d1
	move.l	d1,(a0)			; save intra
	rts

gbh_error:
	moveq	#1,d0
	move.l	d0,(a0)
	rts



; ***************************************************************


	XDEF	@s_DecodeCBP
@s_DecodeCBP:
	moveq	#9,d0
	lea	_coded_block_pattern,a0
	bra.s	@s_get_byte_huff

	XDEF	@sn_DecodeCBP
@sn_DecodeCBP:
	moveq	#9,d0
	lea	_coded_block_pattern,a0
	bra.s	@sn_get_byte_huff


gsh_x:	move.l	d2,-(sp)
	move.l	a0,-(sp)
	move.l	d0,d2
	bsr	@correct_underflow
	move.l	d2,d0
	move.l	(sp)+,a0
	bra.s	sngsh

	XDEF	@s_get_byte_huff
@s_get_byte_huff:
	moveq	#2,d1
	cmp.l	_bufLength(a4),d1
	bgt.s	gsh_x

	XDEF	@sn_get_byte_huff
@sn_get_byte_huff:
	move.l	d2,-(sp)
sngsh:

	move.l	_bitOffset(a4),d1
	move.l	_bitBuffer(a4),a1
	bfextu	(a1){d1:d0},d2

	move.w	(a0,d2.w*2),d0

	moveq	#0,d2
	move.b	d0,d2

;	add.l	d2,_bitCount(a4)	; ANALYSIS

	add.l	d1,d2
	moveq	#32,d1
	cmp.l	d1,d2
	blt.s	sgdhw
	sub.l	d1,d2
	addq.l	#4,_bitBuffer(a4)
	subq.l	#1,_bufLength(a4)
sgdhw:
	move.l	d2,_bitOffset(a4)

	lsr.w	#8,d0
	extb.l	d0

	move.l	(sp)+,d2
	rts


; ***************************************************************

	XDEF	_s_DecodeDCTCoeff
_s_DecodeDCTCoeff:
dcdregs	REG	d2-d7
	movem.l	dcdregs,-(sp)

	move.l	_bitBuffer(a4),a1
	move.l	_bitOffset(a4),d7
	moveq	#32,d6

	process_intra	endofblock,a2

	move.l	a1,_bitBuffer(a4)
	move.l 	d7,_bitOffset(a4)

	move.l	d5,(a0)		; int *level


endofblock:
	move.w	d3,d0		; run = return value!
	ext.l	d0

	movem.l	(sp)+,dcdregs
	rts



; ***************************************************************

	XDEF	@s_DecodeDCTDCSizeLum
@s_DecodeDCTDCSizeLum:
	moveq	#7,d1
	lea	_dct_dc_size_luminance,a1
	bra.s	sdlc

	XDEF	@s_DecodeDCTDCSizeChrom
@s_DecodeDCTDCSizeChrom:
	moveq	#8,d1
	lea	_dct_dc_size_chrominance,a1
sdlc:	move.l	d2,-(sp)
	move.l	d3,-(sp)

	move.l	_bitOffset(a4),d0
	move.l	_bitBuffer(a4),a0
	moveq	#16,d3
	bfextu	(a0){d0:d3},d2

	move.l	d2,d0
	sub.l	d1,d3
	lsr.l	d3,d0
	move.w	(a1,d0.w*2),d0		; macroval

	move.b	d0,d3			; flushed.l
	lsl.w	d3,d2
	lsr.w	d3,d2			; mask off the header

	lsr.w	#8,d0			; size
	tst.w	d0			; necessary ?
	beq.s	cdlflush

	add.w	d0,d3
	moveq	#16,d1
	sub.l	d3,d1
	lsr.l	d1,d2			; trash unused lower bits

	subq.l	#1,d0			; MPEG has some really strange sign extension, just like JPEG! Weirdo!
	btst	d0,d2
	bne	cdlsign
	moveq	#-2,d1
	lsl.l	d0,d1
	or.l	d1,d2
	addq.l	#1,d2
cdlsign: move.l	d2,d0			; the desired result
cdlflush:

;	add.l	d3,_bitCount(a4)	; ANALYSIS

	add.l	_bitOffset(a4),d3
	moveq	#32,d1
	cmp.l	d1,d3
	blt.s	cdlXw
	sub.l	d1,d3
	addq.l	#4,_bitBuffer(a4)
	subq.l	#1,_bufLength(a4)
cdlXw:
	move.l	d3,_bitOffset(a4)
	move.l	(sp)+,d3
	move.l	(sp)+,d2
	rts


; ***************************************************************

sgb1:	bsr	@correct_underflow
	bra.s	@sn_get_bits1

	XDEF	@s_get_bits1
@s_get_bits1:
	moveq	#2,d1
	cmp.l	_bufLength(a4),d1
	bgt.s	sgb1

	XDEF	@sn_get_bits1
@sn_get_bits1:
;	addq.l	#1,_bitCount(a4)	; ANALYSIS
	move.l	_bitBuffer(a4),a0
	move.l	_bitOffset(a4),d1
	moveq	#1,d0			; hmm ?!
	bfextu	(a0){d1:d0},d0
	addq.l	#1,d1
	btst	#5,d1
	beq.s	gb1r
	addq.l	#4,a0
	moveq	#0,d1
	move.l	a0,_bitBuffer(a4)
	subq.l	#1,_bufLength(a4)
gb1r:	move.l	d1,_bitOffset(A4)
	rts



sgbX:	move.l	d0,-(sp)
	bsr	@correct_underflow
	move.l	(sp)+,d0
	bra.s	@sn_get_bitsX

	XDEF	@s_get_bitsX
@s_get_bitsX:
	moveq	#2,d1
	cmp.l	_bufLength(a4),d1
	bgt.s	sgbX

	XDEF	@sn_get_bitsX
@sn_get_bitsX:
;	add.l	d0,_bitCount(a4)	; ANALYSIS
	move.l	_bitOffset(a4),d1
	move.l	_bitBuffer(a4),a0
	move.l	d1,a1
	add.l	d0,a1
	bfextu	(a0){d1:d0},d0
	moveq	#32,d1
	cmp.l	d1,a1
	blt.s	gsbXw
	sub.l	d1,a1
	addq.l	#4,a0
	move.l	a0,_bitBuffer(a4)
	subq.l	#1,_bufLength(a4)
gsbXw:	move.l	a1,_bitOffset(a4)
	rts


; ***************************************************************

ssb32_ofoi:
	bsr	@correct_underflow		; ofoi OPT
	bra.s	@sn_show_bits32

	XDEF	@s_show_bits32
@s_show_bits32
	moveq	#2,d1
	cmp.l	_bufLength(a4),d1
	bgt.s	ssb32_ofoi

	XDEF	@sn_show_bits32
@sn_show_bits32:
	move.l	_bitBuffer(a4),a0
	move.l	_bitOffset(a4),d1
	moveq	#32,d0
	bfextu	(a0){d1:d0},d0
	rts


ssb_x:	move.l	d0,-(sp)
	bsr	@correct_underflow
	move.l	(sp)+,d0
	bra.s	@sn_show_bitsX

	XDEF	@s_show_bitsX
@s_show_bitsX
	moveq	#2,d1
	cmp.l	_bufLength(a4),d1
	bgt.s	ssb_x

	XDEF	@sn_show_bitsX
@sn_show_bitsX:
	move.l	_bitOffset(a4),d1
	move.l	_bitBuffer(a4),a0
	bfextu	(a0){d1:d0},d0
	rts



; ***************************************************************


sf32_ofoi:
	bsr	@correct_underflow	; moved away
	bra.s	@sn_flush_bits32

	XDEF @s_flush_bits32
@s_flush_bits32:
	moveq	#2,d1
	cmp.l	_bufLength(a4),d1
	bgt.s	sf32_ofoi

	XDEF @sn_flush_bits32
@sn_flush_bits32:
;	add.l	#32,_bitCount(a4)	; ANALYSIS
	addq.l	#4,_bitBuffer(a4)
	subq.l	#1,_bufLength(a4)
	rts


sf_outtafoi:
	move.l	d0,-(sp)
	bsr	@correct_underflow	; moved away, out of flow of instructions
	move.l	(sp)+,d0
	bra.s	@sn_flush_bits

	XDEF @s_flush_bits
@s_flush_bits:
	moveq	#2,d1
	cmp.l	_bufLength(a4),d1
	bgt.s	sf_outtafoi

	XDEF @sn_flush_bits
@sn_flush_bits:
;	add.l	d0,_bitCount(a4)	; ANALYSIS
	add.l	_bitOffset(a4),d0
	moveq	#32,d1
	cmp.l	d1,d0
	blt.s	sbf32
	sub.l	d1,d0
	addq.l	#4,_bitBuffer(a4)
	subq.l	#1,_bufLength(a4)
sbf32:	move.l 	d0,_bitOffset(a4)
	rts



locallevel:	ds.l	1

; ***************************************************************
;

	SECTION	data,DATA


;
; Decoding table for coded_block_pattern
;

;	XDEF	_coded_block_pattern

_coded_block_pattern:
	dc.b	ER, 0, ER, 0, 39, 9, 27, 9, 59, 9, 55, 9, 47, 9, 31, 9
	dc.b	58, 8, 58, 8, 54, 8, 54, 8, 46, 8, 46, 8, 30, 8, 30, 8
	dc.b	57, 8, 57, 8, 53, 8, 53, 8, 45, 8, 45, 8, 29, 8, 29, 8
	dc.b	38, 8, 38, 8, 26, 8, 26, 8, 37, 8, 37, 8, 25, 8, 25, 8
	dc.b	43, 8, 43, 8, 23, 8, 23, 8, 51, 8, 51, 8, 15, 8, 15, 8
	dc.b	42, 8, 42, 8, 22, 8, 22, 8, 50, 8, 50, 8, 14, 8, 14, 8
	dc.b	41, 8, 41, 8, 21, 8, 21, 8, 49, 8, 49, 8, 13, 8, 13, 8
	dc.b	35, 8, 35, 8, 19, 8, 19, 8, 11, 8, 11, 8,  7, 8,  7, 8
	dc.b	34, 7, 34, 7, 34, 7, 34, 7, 18, 7, 18, 7, 18, 7, 18, 7
	dc.b	10, 7, 10, 7, 10, 7, 10, 7,  6, 7,  6, 7,  6, 7,  6, 7
	dc.b	33, 7, 33, 7, 33, 7, 33, 7, 17, 7, 17, 7, 17, 7, 17, 7
	dc.b	 9, 7,  9, 7,  9, 7,  9, 7,  5, 7,  5, 7,  5, 7,  5, 7
	dc.b	63, 6, 63, 6, 63, 6, 63, 6, 63, 6, 63, 6, 63, 6, 63, 6
	dc.b	 3, 6,  3, 6,  3, 6,  3, 6,  3, 6,  3, 6,  3, 6,  3, 6
	dc.b	36, 6, 36, 6, 36, 6, 36, 6, 36, 6, 36, 6, 36, 6, 36, 6 
	dc.b	24, 6, 24, 6, 24, 6, 24, 6, 24, 6, 24, 6, 24, 6, 24, 6 
	dc.b	62, 5, 62, 5, 62, 5, 62, 5, 62, 5, 62, 5, 62, 5, 62, 5
	dc.b	62, 5, 62, 5, 62, 5, 62, 5, 62, 5, 62, 5, 62, 5, 62, 5
	dc.b	 2, 5,  2, 5,  2, 5,  2, 5,  2, 5,  2, 5,  2, 5,  2, 5
	dc.b	 2, 5,  2, 5,  2, 5,  2, 5,  2, 5,  2, 5,  2, 5,  2, 5 
	dc.b	61, 5, 61, 5, 61, 5, 61, 5, 61, 5, 61, 5, 61, 5, 61, 5
	dc.b	61, 5, 61, 5, 61, 5, 61, 5, 61, 5, 61, 5, 61, 5, 61, 5 
	dc.b	 1, 5,  1, 5,  1, 5,  1, 5,  1, 5,  1, 5,  1, 5,  1, 5
	dc.b	 1, 5,  1, 5,  1, 5,  1, 5,  1, 5,  1, 5,  1, 5,  1, 5 
	dc.b	56, 5, 56, 5, 56, 5, 56, 5, 56, 5, 56, 5, 56, 5, 56, 5
	dc.b	56, 5, 56, 5, 56, 5, 56, 5, 56, 5, 56, 5, 56, 5, 56, 5 
	dc.b	52, 5, 52, 5, 52, 5, 52, 5, 52, 5, 52, 5, 52, 5, 52, 5 
	dc.b	52, 5, 52, 5, 52, 5, 52, 5, 52, 5, 52, 5, 52, 5, 52, 5 
	dc.b	44, 5, 44, 5, 44, 5, 44, 5, 44, 5, 44, 5, 44, 5, 44, 5 
	dc.b	44, 5, 44, 5, 44, 5, 44, 5, 44, 5, 44, 5, 44, 5, 44, 5 
	dc.b	28, 5, 28, 5, 28, 5, 28, 5, 28, 5, 28, 5, 28, 5, 28, 5 
	dc.b	28, 5, 28, 5, 28, 5, 28, 5, 28, 5, 28, 5, 28, 5, 28, 5 
	dc.b	40, 5, 40, 5, 40, 5, 40, 5, 40, 5, 40, 5, 40, 5, 40, 5 
	dc.b	40, 5, 40, 5, 40, 5, 40, 5, 40, 5, 40, 5, 40, 5, 40, 5 
	dc.b	20, 5, 20, 5, 20, 5, 20, 5, 20, 5, 20, 5, 20, 5, 20, 5 
	dc.b	20, 5, 20, 5, 20, 5, 20, 5, 20, 5, 20, 5, 20, 5, 20, 5 
	dc.b	48, 5, 48, 5, 48, 5, 48, 5, 48, 5, 48, 5, 48, 5, 48, 5 
	dc.b	48, 5, 48, 5, 48, 5, 48, 5, 48, 5, 48, 5, 48, 5, 48, 5 
	dc.b	12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5 
	dc.b	12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5 
	dc.b	32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4 
	dc.b	32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4 
	dc.b	32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4 
	dc.b	32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4, 32, 4 
	dc.b	16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4 
	dc.b	16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4 
	dc.b	16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4 
	dc.b	16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4, 16, 4 
	dc.b	 8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4 
	dc.b	 8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4 
	dc.b	 8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4 
	dc.b	 8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4,  8, 4
	dc.b	 4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4
	dc.b	 4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4 
	dc.b	 4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4 
	dc.b	 4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4,  4, 4
	dc.b	60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
	dc.b	60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
	dc.b	60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
	dc.b	60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
	dc.b	60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
	dc.b	60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
	dc.b	60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3 
	dc.b	60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3




;	XDEF	_dct_dc_size_luminance
;	XDEF	_dct_dc_size_chrominance

_dct_dc_size_luminance:
	dc.b	1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
	dc.b	1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
	dc.b	1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
	dc.b	1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
	dc.b	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
	dc.b	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
	dc.b	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
	dc.b	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
	dc.b	0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3
	dc.b	0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3
	dc.b	3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
	dc.b	3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
	dc.b	4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3
	dc.b	4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3
	dc.b	5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4
	dc.b	6, 5, 6, 5, 6, 5, 6, 5, 7, 6, 7, 6, 8, 7, ER,0


_dct_dc_size_chrominance:
	dc.b	0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
	dc.b	0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
	dc.b	0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
	dc.b	0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
	dc.b	0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
	dc.b	0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
	dc.b	0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
	dc.b	0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 
	dc.b	1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
	dc.b	1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
	dc.b	1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
	dc.b	1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
	dc.b	1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
	dc.b	1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
	dc.b	1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
	dc.b	1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 
	dc.b	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
	dc.b	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
	dc.b	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
	dc.b	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
	dc.b	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
	dc.b	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
	dc.b	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
	dc.b	2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 
	dc.b	3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 
	dc.b	3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 
	dc.b	3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 
	dc.b	3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 
	dc.b	4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 
	dc.b	4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 
	dc.b	5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 
	dc.b	6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, ER,0


; ***************************************************************

	END
