alloc_save
	move.l	#(40*200)*8,d0
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,save_edit
	tst.l	d0
	rts

free_save
	move.l	save_edit,a1
	tst.l	a1
	beq.s	.out
	move.l	#(40*200)*8,d0
	LIB	freemem,exec
.out	rts
;---------------------------------------------
save_lbm_file
	bsr	do_icon
	lea	savelbmtxt,a0
	lea	do_save_lbm,a1
	lea	lbmonlytxt,a2
	bsr	save_file
	rts

do_save_lbm
	rts
;---------------------------------------------
save_iff_file
	bsr	do_icon
	lea	saveifftxt,a0
	lea	do_save_iff,a1
	lea	iff2onlytxt,a2
	bsr	save_file
	rts

do_save_iff
	bsr	alloc_save
	move.l	editscreenB,a1
	bsr	code_save_ifflbm

	move.l	saveiffsize,bodysize
	move.l	saveiffsize,d0
	add.l	#iffheadsize-iffhead,d0
	sub.l	#8,d0
	btst	#0,d0
	beq.s	.a
	addq.l	#1,d0
.a	move.l	d0,iffsize
	lea	buffer_palette,a0
	lea	iffcolours,a1
	move.l	#$300-1,d7
.loop	move.b	(a0)+,(a1)+
	dbra	d7,.loop

	move.l	#iffheadsize-iffhead,file_length
	move.l	#iffhead,file_address
	bsr	write_stuff
	
	move.l	save_edit,file_address
	move.l	saveiffsize,d0
	btst	#0,d0
	beq.s	.a1
	addq.l	#1,d0
.a1	move.l	d0,file_length	
	bsr	write_stuff

.out	bsr	free_save
	rts
;---------------------------------------------
code_save_ifflbm
	move.l	save_edit,a0
	moveq.l	#0,d4		; size of packed iff chunk
	move.l	#(200*8)-1,d3	; main pack loop
.loop	move.l	#40-1,d1		; pack 40 bytes
	bsr	.packiff		; pack them
	add.l	#40,a1		; get next source destination
	dbra	d3,.loop		; do main pack loop
	rts
;---------------------------------------------
.packiff
	movem.l	d0-d3/a1-a3,-(sp)		; store regs
	moveq.l	#0,d3
	tst.l	d1		; test pack counter
	beq	.a9
	lea	1(a1),a2		; source +1 for check
.a1	moveq.l	#0,d0
	move.l	d0,d2

.a2	move.b	(a2,d2.w),d3		; get next byte 
	cmp.b	(a1,d2.w),d3		; compare with prev byte
	beq	.a4		
	addq.l	#1,d0
	addq.l	#1,d2
	subq.l	#1,d1
	bne.s	.a2
	move.b	d0,(a0)+
	addq.l	#1,d4
.a3	move.b	(a1)+,(a0)+
	addq.l	#1,d4
	dbra	d0,.a3
	bra	.a9

.a4	tst.l	d0
	beq.s	.a6
	subq.l	#1,d0
	move.b	d0,(a0)+
	addq.l	#1,d4
.a5	move.b	(a1)+,(a0)+
	addq.l	#1,d4
	dbra	d0,.a5
	lea	1(a1),a2

.a6	moveq.l	#0,d2
	move.l	d2,d0

.a7	move.b	(a2,d2.w),d3
	cmp.b	(a1,d2.w),d3
	bne.s	.a8
	addq.l	#1,d2
	addq.l	#1,d0
	subq.l	#1,d1
	bne.s	.a7
	neg.b	d0
	move.b	d0,(a0)+
	move.b	(a1),(a0)+
	addq.l	#2,d4
	bra	.a9

.a8	neg.b	d0
	move.b	d0,(a0)+
	move.b	(a1),(a0)+
	addq.l	#2,d4
	addq.l	#1,d2
	add.l	d2,a1
	add.l	d2,a2
	subq.l	#1,d1
	bne.s	.a1

	move.b	#0,(a0)+
	move.b	(a1),(a0)+
	addq.l	#2,d4

.a9	move.l	d4,saveiffsize
	movem.l	(sp)+,d0-d3/a1-a3
	rts
;---------------------------------------------
save_amiga_interleaved_format
	move.l	#4,file_length
	move.l	#interleaved_header_txt,file_address
	bsr	write_stuff
	move.l	#2,file_length
	move.l	#sprite_amount,file_address
	bsr	write_stuff
	bsr	create_interleaved_header
	bsr	save_interleaved_sprites
	rts

interleaved_header_txt	dc.b	'AIKM'

create_interleaved_header
	bsr	alloc_spriteheader_size
;---------------------------------------------
	move.l	sprite_list,a6
	move.l	sprite_header_address,a2
	move.w	sprite_amount,d7
	subq.w	#1,d7
.loop	cmp.l	#-1,(a6)
	beq	.out
	move.l	(a6)+,a1
	bsr	create_sprite_size		; create info
;---------------------------------------------
	move.l	sprite_offset,(a2)+		; offset		0
	move.w	spr_x(a1),(a2)+		; width pixels		4
	move.w	spr_y(a1),(a2)+		; height pixels		6
	move.b	spr_depth+1(a1),(a2)+	; depth	 		8
	move.b	spr_palette+1(a1),(a2)+	; palette		9
	move.b	maskmode+1,(a2)+		; mask 			10
	move.b	#0,(a2)+			; null			11
	move.w	sprite_width_size,(a2)+	; width in bytes 	12
	move.w	sprite_width_size,(a2)+	; offset to next plane  14	
;---------------------------------------------
	move.l	sprite_offset,d0
	add.l	sprite_gfx_size,d0
	move.l	d0,sprite_offset	
	dbra	d7,.loop
;---------------------------------------------
.out	move.l	sprite_header_size,file_length
	move.l	sprite_header_address,file_address
	bsr	write_stuff
	bsr	free_spriteheader_size
	rts
;---------------------------------------------
save_interleaved_sprites
	move.l	sprite_list,a6
	move.w	sprite_amount,d7
	subq.w	#1,d7
.loop	cmp.l	#-1,(a6)
	beq	.out
	move.l	(a6)+,a1
	move.l	a6,-(sp)
	move.w	spr_x(a1),plotW
	move.w	spr_y(a1),plotH
	move.w	spr_depth(a1),plotD
	move.w	maskmode,plotMask	
	lea	spr_varsize(a1),a0
	move.l	a0,plotA
	bsr	create_sprite_size
	bsr	alloc_planes_size
	bsr	create_interleaved

	move.l	sprite_gfx_size,file_length
	move.l	sprite_planes_address,file_address
	bsr	write_stuff	
	bsr	free_planes_size
	move.l	(sp)+,a6
	bra.s	.loop
.out	rts
;---------------------------------------------
create_interleaved
	moveq.l	#0,d0
	move.w	sprite_width_size,d0
	move.l	d0,plotP
	move.w	plotD,d0
	tst.w	plotmask
	beq.s	.ass
	addq.w	#1,d0
.ass	move.w	sprite_width_size,d1
	mulu	d1,d0
	move.w	d0,plotN

	move.l	sprite_planes_address,a0
	cmp.w	#0,plotmask
	beq.s	.a
	cmp.w	#1,plotmask
	bne.s	.a1
	move.l	a0,sprite_planes_mask
	add.w	sprite_width_size,a0
	bra.s	.a
.a1	moveq.l	#0,d0
	move.w	plotD,d0
	mulu	sprite_width_size,d0	
	add.l	a0,d0
	move.l	d0,sprite_planes_mask

.a	move.l	a0,sprite_planes_gfx
	move.l	sprite_planes_gfx,a1
	move.l	sprite_planes_mask,a4
	move.l	plotA,a0
	moveq.l	#0,d1
	move.w	plotH,d7
	subq.w	#1,d7
.Yloop	moveq.l	#0,d0
	move.w	plotW,d6
	subq.w	#1,d6
.Xloop	bsr	plotpixel
	addq.l	#1,a0
	addq.l	#1,d0
	dbra	d6,.xloop
	addq.l	#1,d1	
	dbra	d7,.Yloop
	rts
;---------------------------------------------
save_amiga_copper_format
	move.l	#4,file_length
	move.l	#copper_header_txt,file_address
	bsr	write_stuff
	move.l	#2,file_length
	move.l	#sprite_amount,file_address
	bsr	write_stuff
	bsr	create_copper_header
	bsr	save_copper_sprites
	rts

copper_header_txt		dc.b	'ACKM'
;---------------------------------------------
create_copper_header
	move.w	sprite_amount,d0		; get size of header 
	lsl.w	#3,d0
	ext.l	d0			; and allocate memory
	move.l	d0,gen_header_size
	move.l	d0,gen_offset
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,gen_header_address
	add.l	#6,gen_offset
	move.l	gen_header_address,a6
	move.l	sprite_list,a5
.loop	cmp.l	#-1,(a5)
	beq.s	.out
	move.l	(a5)+,a1
	move.w	spr_x(a1),plotW
	move.w	spr_Y(a1),plotH
	
	move.l	gen_offset,(a6)+
	move.w	plotW,(a6)+
	move.w	plotH,(a6)+

	move.w	plotH,d1
	moveq.l	#0,d0
	move.w	plotW,d0
	add.w	d0,d0
	mulu	d1,d0
	move.l	gen_offset,d2
	add.l	d0,d2
	move.l	d2,gen_offset
	bra	.loop
.out
	move.l	gen_header_address,file_address
	move.l	gen_header_size,file_length
	bsr	write_stuff
	move.l	gen_header_address,a1
	move.l	gen_header_size,d0
	LIB	freemem,exec
	rts
;---------------------------------------------
save_copper_sprites
	move.l	sprite_list,a6
.loop	cmp.l	#-1,(a6)
	beq	.out
	move.l	(a6)+,a1
	moveq.l	#0,d0
	move.w	spr_x(a1),d0
	move.w	spr_y(a1),d1
	move.w	spr_palette(a1),copper_ptr
	lea	spr_varsize(a1),a1
	move.l	a1,gen_space
	move.w	d0,plotW
	move.w	d1,plotH
	add.w	d0,d0
	mulu	d1,d0
	move.l	d0,gen_header_size
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,gen_header_address
	bsr	create_sprite_palette
	bsr	create_copper_sprite
	move.l	gen_header_address,file_address
	move.l	gen_header_size,file_length
	bsr	write_stuff
	move.l	gen_header_address,a1
	move.l	gen_header_size,d0
	LIB	freemem,exec
	bra	.loop
.out	rts
;---------------------------------------------
create_copper_sprite
	move.l	gen_space,a0
	move.l	gen_header_address,a1
	move.w	plotH,d7
	subq.w	#1,d7
.Yloop	move.w	plotW,d6
	subq.w	#1,d6
.Xloop	move.b	(a0)+,d0
	lea	sprite_copper_palette,a2
	move.w	(a2,d0.w*2),(a1)+
	dbra	d6,.xloop
	dbra	d7,.yloop
	rts
;---------------------------------------------
create_sprite_palette
	lea	buffer_palette,a0
	move.w	copper_ptr,d0
	cmp.w	#-1,d0
	beq.s	.a
	move.l	palette_list,a0
	move.l	(a0,d0.w*4),a0
.a	lea	sprite_copper_palette,a1
	move.l	#256-1,d7
.loop	bsr	make_colour
	move.w	d0,(a1)+
	dbra	d7,.loop
	rts
;---------------------------------------------
save_bytepixel_format
	move.l	#4,file_length
	move.l	#byte_header_txt,file_address
	bsr	write_stuff
	move.l	#2,file_length
	move.l	#sprite_amount,file_address
	bsr	write_stuff
	bsr	create_byte_header
	bsr	save_byte_sprites
	rts

byte_header_txt		dc.b	'BPKM'
;---------------------------------------------
create_byte_header
	move.w	sprite_amount,d0		; get size of header 
	lsl.w	#3,d0
	ext.l	d0			; and allocate memory
	move.l	d0,gen_header_size
	move.l	d0,gen_offset
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,gen_header_address
	add.l	#6,gen_offset
	move.l	gen_header_address,a6
	move.l	sprite_list,a5
.loop	cmp.l	#-1,(a5)
	beq.s	.out
	move.l	(a5)+,a1
	move.w	spr_x(a1),plotW
	move.w	spr_Y(a1),plotH
	move.l	spr_size(a1),d0
	sub.l	#spr_varsize,d0
	
	move.l	gen_offset,(a6)+
	move.w	plotW,(a6)+
	move.w	plotH,(a6)+

	move.l	gen_offset,d2
	add.l	d0,d2
	move.l	d2,gen_offset
	bra	.loop
.out
	move.l	gen_header_address,file_address
	move.l	gen_header_size,file_length
	bsr	write_stuff
	move.l	gen_header_address,a1
	move.l	gen_header_size,d0
	LIB	freemem,exec
	rts
;---------------------------------------------
save_byte_sprites
	move.l	sprite_list,a6
.loop	cmp.l	#-1,(a6)
	beq	.out
	move.l	(a6)+,a1
	move.l	spr_size(a1),d0
	sub.l	#spr_varsize,d0	
	lea	spr_varsize(a1),a1
	move.l	a1,file_address
	move.l	d0,file_length
	bsr	write_stuff
	bra	.loop
.out	rts
;---------------------------------------------
save_amiga_plane_format
	move.l	#4,file_length
	move.l	#plane_header_txt,file_address
	bsr	write_stuff
	move.l	#2,file_length
	move.l	#sprite_amount,file_address
	bsr	write_stuff
	bsr	create_planes_header
	bsr	save_planes_sprites
	rts

plane_header_txt	dc.b	'APKM'
;---------------------------------------------
create_planes_header
	bsr	alloc_spriteheader_size
;---------------------------------------------
	move.l	sprite_list,a6
	move.l	sprite_header_address,a2
	move.w	sprite_amount,d7
	subq.w	#1,d7
.loop	cmp.l	#-1,(a6)
	beq	.out
	move.l	(a6)+,a1
	bsr	create_sprite_size		; create info
;---------------------------------------------
	move.l	sprite_offset,(a2)+		; offset		0
	move.w	spr_x(a1),(a2)+		; width pixels		4
	move.w	spr_y(a1),(a2)+		; height pixels		6
	move.b	spr_depth+1(a1),(a2)+	; depth	 		8
	move.b	spr_palette+1(a1),(a2)+	; palette		9
	move.b	maskmode+1,(a2)+		; mask 			10
	move.b	#0,(a2)+			; null			11
	move.w	sprite_width_size,(a2)+	; width in bytes 	12
	move.w	sprite_plane_size+2,(a2)+	; offset to next plane  14	
;---------------------------------------------
	move.l	sprite_offset,d0
	add.l	sprite_gfx_size,d0
	move.l	d0,sprite_offset	
	dbra	d7,.loop
;---------------------------------------------
.out	move.l	sprite_header_size,file_length
	move.l	sprite_header_address,file_address
	bsr	write_stuff
	bsr	free_spriteheader_size
	rts
;---------------------------------------------
alloc_spriteheader_size
	moveq.l	#0,d0
	move.w	sprite_amount,d0
	lsl.w	#4,d0
	move.l	d0,sprite_header_size
	move.l	d0,sprite_offset
	add.l	#6,sprite_offset
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,sprite_header_address
	rts	
;---------------------------------------------
free_spriteheader_size
	move.l	sprite_header_size,d0
	move.l	sprite_header_address,a1
	LIB	freemem,exec
	rts
;---------------------------------------------
create_sprite_size
	move.w	spr_x(a1),d0
	move.w	spr_y(a1),d1
	bsr	create_sprite_plane_size
	move.w	spr_depth(a1),d2
	tst.w	maskmode
	beq.s	.nomask
	addq.w	#1,d2
.nomask	ext.l	d2
	move.l	sprite_plane_size,d0
	mulu.l	d2,d0
	move.l	d0,sprite_gfx_size
	rts
;---------------------------------------------
create_sprite_plane_size
	ext.l	d0
	ext.l	d1
	add.l	#$0f,d0
	lsr.l	#4,d0
	add.l	d0,d0
	move.w	d0,sprite_width_size
	move.w	d0,plotN
	mulu.l	d1,d0
	move.l	d0,sprite_plane_size
	move.l	d0,plotP
	rts
;---------------------------------------------
alloc_planes_size
	move.l	sprite_gfx_size,d0
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,sprite_planes_address
	rts
;---------------------------------------------
free_planes_size
	move.l	sprite_planes_address,a1
	move.l	sprite_gfx_size,d0
	LIB	freemem,exec
	rts
;---------------------------------------------
save_planes_sprites
	move.l	sprite_list,a6
	move.w	sprite_amount,d7
	subq.w	#1,d7
.loop	cmp.l	#-1,(a6)
	beq	.out
	move.l	(a6)+,a1
	move.l	a6,-(sp)
	move.w	spr_x(a1),plotW
	move.w	spr_y(a1),plotH
	move.w	spr_depth(a1),plotD
	move.w	maskmode,plotMask	
	lea	spr_varsize(a1),a0
	move.l	a0,plotA
	bsr	create_sprite_size
	bsr	alloc_planes_size

	bsr	create_plane

	move.l	sprite_gfx_size,file_length
	move.l	sprite_planes_address,file_address
	bsr	write_stuff	
	bsr	free_planes_size
	move.l	(sp)+,a6
	bra.s	.loop
.out	rts
;---------------------------------------------
create_plane
	move.l	sprite_planes_address,a0
	cmp.w	#0,plotmask
	beq.s	.a
	cmp.w	#1,plotmask
	bne.s	.a1
	move.l	a0,sprite_planes_mask
	add.l	sprite_plane_size,a0
	bra.s	.a
.a1	moveq.l	#0,d0
	move.w	plotD,d0
	mulu.l	sprite_plane_size,d0	
	add.l	a0,d0
	move.l	d0,sprite_planes_mask

.a	move.l	a0,sprite_planes_gfx
	move.l	sprite_planes_gfx,a1
	move.l	sprite_planes_mask,a4
	move.l	plotA,a0
	moveq.l	#0,d1
	move.w	plotH,d7
	subq.w	#1,d7
.Yloop	moveq.l	#0,d0
	move.w	plotW,d6
	subq.w	#1,d6
.Xloop	bsr	plotpixel
	addq.l	#1,a0
	addq.l	#1,d0
	dbra	d6,.xloop
	addq.l	#1,d1	
	dbra	d7,.Yloop
	rts
;---------------------------------------------
plotpixel	movem.l	d0-d7,-(sp)
	move.l	a0,a2
	move.l	a1,a3
	move.l	a4,a5
	move.w	d0,d2
	and.b	#$07,d2

	lsr.w	#3,d0
	add.w	d0,a3
	add.w	d0,a5	; mask

	move.w	plotN,d4
	mulu	d4,d1
	add.w	d1,a3
	add.w	d1,a5	;.mask

	moveq.l	#7,d3
	sub.b	d2,d3

	move.w	plotD,d7
	subq.w	#1,d7
	moveq.l	#0,d6
	move.b	(a2),d5
.loop	btst	d6,d5
	beq.s	.a		
	bset	d3,(a3)
	tst.w	plotmask
	beq.s	.a
	bset	d3,(a5)
.a	addq.w	#1,d6
	add.l	plotP,a3
	dbra	d7,.loop
	movem.l	(sp)+,d0-d7
	rts
;---------------------------------------------
; GENESIS FORMAT
;---------------------------------------------
create_genesis_file_nocr
	move.w	sprite_amount,d0		; get size of header 
	lsl.w	#3,d0
	ext.l	d0			; and allocate memory
	move.l	d0,gen_header_size
	move.l	d0,gen_offset
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,gen_header_address
;---------------------------------------------
	move.l	gen_header_address,a6	; create header
	move.l	sprite_list,a5
	move.w	sprite_amount,d7		
	subq.w	#1,d7
.loop	move.l	(a5)+,a1
	move.w	spr_x(a1),d0
	move.w	spr_y(a1),d1
	move.w	d0,gen_x
	move.w	d1,gen_y
	lea	spr_varsize(a1),a1
	move.l	a1,gen_space
;---------------------------------------------
	movem.l	d0-d7/a0-a6,-(sp)
	bsr	get_genesis_sprite_size		
	bsr	alloc_genesis_sprite_memory
	bsr	convert_genesis_sprite
	bsr	free_genesis_sprite_memory
	movem.l	(sp)+,d0-d7/a0-a6
;---------------------------------------------
	move.w	gen_offset+2,(a6)+
	move.w	gen_sprite_type,(a6)+		; type of sprite
	move.b	#0,(a6)+
	move.b	gen_y+1,(a6)+			; pixel height

	move.l	gen_sprite_size,d0
	move.w	d0,(a6)+
	move.l	gen_offset,d1
	add.l	d0,d1		
	move.l	d1,gen_offset
	dbra	d7,.loop
;---------------------------------------------
	move.l	gen_header_address,file_address	; save header
	move.l	gen_header_size,file_length
	bsr	write_stuff
;---------------------------------------------
	move.l	gen_header_size,d0			; free header memory
	move.l	gen_header_address,a1
	LIB	freemem,exec
;---------------------------------------------
	move.w	sprite_amount,d7
	subq.w	#1,d7
	move.l	sprite_list,a5
.loop2	move.l	(a5)+,a1
	moveq.l	#0,d0
	moveq.l	#0,d1
	move.w	spr_x(a1),gen_x
	move.w	spr_y(a1),gen_y	
	move.w	gen_x,d0
	move.w	gen_y,d1
	lea	spr_varsize(a1),a1
	move.l	a1,gen_space
	movem.l	d0-d7/a0-a6,-(sp)

	bsr	get_genesis_sprite_size
	bsr	alloc_genesis_sprite_memory
	bsr	convert_genesis_sprite

	move.l	gen_sprite_size,file_length
	move.l	gen_sprite_address,file_address
	bsr	write_stuff		
	bsr	free_genesis_sprite_memory
	movem.l	(sp)+,d0-d7/a0-a6
	dbra	d7,.loop2
	rts
;---------------------------------------------
create_genesis_file
	move.w	sprite_amount,d0		; get size of header 
	lsl.w	#3,d0
	ext.l	d0			; and allocate memory
	move.l	d0,gen_header_size
	move.l	d0,gen_offset
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,gen_header_address
;---------------------------------------------
	move.l	gen_header_address,a6	; create header
	move.l	sprite_list,a5
	move.w	sprite_amount,d7		
	subq.w	#1,d7
.loop	move.l	(a5)+,a1
	move.w	spr_x(a1),d0
	move.w	spr_y(a1),d1
	move.w	d0,gen_x
	move.w	d1,gen_y
	lea	spr_varsize(a1),a1
	move.l	a1,gen_space
;---------------------------------------------
	movem.l	d0-d7/a0-a6,-(sp)
	bsr	get_genesis_sprite_size		
	bsr	alloc_genesis_sprite_memory
	bsr	convert_genesis_sprite
	bsr	get_genesis_decode_size
	bsr	free_genesis_sprite_memory
	movem.l	(sp)+,d0-d7/a0-a6
;---------------------------------------------
	move.w	gen_offset+2,(a6)+
	move.w	gen_sprite_type,(a6)+		; type of sprite
	move.b	gen_crunch_flag,(a6)+
	move.b	gen_y+1,(a6)+			; pixel height

	move.l	gen_sprite_size,d0
	tst.b	gen_crunch_flag
	beq.s	.nocr
	move.l	sprite_decode_size,d0
.nocr	move.w	d0,(a6)+
	tst.b	gen_crunch_flag
	beq.s	.nocr2
	btst	#0,d0
	beq.s	.nocr2
	addq.l	#1,d0
.nocr2	move.l	gen_offset,d1
	add.l	d0,d1		
	move.l	d1,gen_offset
	dbra	d7,.loop
;---------------------------------------------
	move.l	gen_header_address,file_address	; save header
	move.l	gen_header_size,file_length
	bsr	write_stuff
;---------------------------------------------
	move.l	gen_header_size,d0			; free header memory
	move.l	gen_header_address,a1
	LIB	freemem,exec
;---------------------------------------------
	move.w	sprite_amount,d7
	subq.w	#1,d7
	move.l	sprite_list,a5
.loop2	move.l	(a5)+,a1
	moveq.l	#0,d0
	moveq.l	#0,d1
	move.w	spr_x(a1),gen_x
	move.w	spr_y(a1),gen_y	
	move.w	gen_x,d0
	move.w	gen_y,d1
	lea	spr_varsize(a1),a1
	move.l	a1,gen_space
	movem.l	d0-d7/a0-a6,-(sp)

	bsr	get_genesis_sprite_size
	bsr	alloc_genesis_sprite_memory
	bsr	convert_genesis_sprite
	bsr	do_genesis_decode
	tst.b	gen_crunch_flag
	beq.s	.nocrunchy
	move.l	decode_buffer,file_address
	move.l	sprite_decode_size,d0
	btst	#0,d0
	beq.s	.nocrff
	addq.l	#1,d0
.nocrff	move.l	d0,file_length
	bra.s	.crunchy
;---------------------------------------------
.nocrunchy	move.l	gen_sprite_size,file_length
	move.l	gen_sprite_address,file_address
.crunchy	bsr	write_stuff		
	bsr	free_genesis_sprite_memory
	bsr	free_decode_buffer
	movem.l	(sp)+,d0-d7/a0-a6
	dbra	d7,.loop2
	rts
;---------------------------------------------
get_genesis_sprite_size
	move.w	d0,d2
	move.w	d1,d3
	addq.w	#7,d0
	addq.w	#7,d1
	lsr.w	#3,d0
	lsl.w	#2,d0
	lsr.w	#3,d1
	lsl.w	#3,d1
	mulu	d1,d0
	ext.l	d0
	move.l	d0,gen_sprite_size
	addq.w	#7,d2
	lsr.w	#3,d2
	subq.w	#1,d2
	lsl.w	#3,d2
	addq.w	#7,d3
	lsr.w	#3,d3
	subq.w	#1,d3
	lea	gen_spr_table,a0
	lea	(a0,d2.w),a0
	move.w	(a0,d3.w*2),gen_sprite_type
	rts

gen_spr_table	
	dc.w	spr_8x8,spr_8x16,spr_8x24,spr_8x32
	dc.w	spr_16x8,spr_16x16,spr_16x24,spr_16x32
	dc.w	spr_24x8,spr_24x16,spr_24x24,spr_24x32
	dc.w	spr_32x8,spr_32x16,spr_32x24,spr_32x32
;---------------------------------------------
get_genesis_decode_size
	movem.l	d0-d7/a0-a6,-(sp)
	bsr	alloc_decode_buffer
	move.l	gen_sprite_address,a0
	move.l	gen_sprite_size,sprite_real_size
	bsr	code_sprite
	move.l	sprite_decode_size,d0
	move.l	sprite_real_size,d1
	move.l	d1,d3
	lsr.l	#2,d3
	sub.l	d3,d1
	moveq.l	#0,d4
	cmp.l	d0,d1
	blt.s	.nocrunch
	moveq.l	#1,d4
.nocrunch	move.b	d4,gen_crunch_flag					
	bsr	free_decode_buffer
	movem.l	(sp)+,d0-d7/a0-a6
	rts
;---------------------------------------------
do_genesis_decode
	movem.l	d0-d7/a0-a6,-(sp)
	bsr	alloc_decode_buffer
	move.l	gen_sprite_address,a0
	move.l	gen_sprite_size,sprite_real_size
	bsr	code_sprite
	move.l	sprite_decode_size,d0
	move.l	sprite_real_size,d1
	move.l	d1,d3
	lsr.l	#2,d3
	sub.l	d3,d1
	moveq.l	#0,d4
	cmp.l	d0,d1
	blt.s	.nocrunch
	moveq.l	#1,d4
.nocrunch	move.b	d4,gen_crunch_flag					
	movem.l	(sp)+,d0-d7/a0-a6
	rts
;---------------------------------------------
alloc_genesis_sprite_memory
	move.l	gen_sprite_size,d0
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,gen_sprite_address
	rts
;---------------------------------------------
free_genesis_sprite_memory
	move.l	gen_sprite_size,d0
	move.l	gen_sprite_address,a1
	LIB	freemem,exec
	rts
;---------------------------------------------
convert_genesis_sprite
	move.l	gen_sprite_address,a2
	move.l	gen_space,a1
	move.w	gen_x,d7
	subq.w	#1,d7
	move.b	#0,d4
	move.l	a2,a4
	move.l	a1,a3
	moveq.l	#0,d5
;---------------------------------------------
.xloop	move.w	gen_y,d6
	subq.w	#1,d6
	eor.b	#4,d4
	move.l	a3,a1
	move.l	a4,a2
	tst.b	d4
	bne	.noadd
	addq.l	#1,a4
.noadd	addq.l	#1,a3
	
.yloop	move.b	(a1),d0
	and.b	#$0f,d0
	rol.b	d4,d0
	or.b	d0,(a2)
	add.w	gen_x,a1
	addq.l	#4,a2
	dbra	d6,.yloop
;---------------------------------------------
	addq.w	#1,d5
	btst	#3,d5
	beq	.past
	moveq.l	#0,d5
	move.w	gen_y,d0
	addq.w	#7,d0
	and.w	#$fff8,d0
	lsl.w	#2,d0
	subq.w	#4,d0
	lea	(a4,d0.w),a4
.past	dbra	d7,.xloop
	rts
;---------------------------------------------
code_sprite
	move.l	decode_buffer,a1		; buffer for sprite
	move.l	sprite_real_size,d7		; real size of sprite
;---------------------------------------------
	moveq.l	#0,d3			; sprite decode size
.loop	moveq.l	#0,d2
	moveq.l	#0,d1			; flag
	move.b	(a0)+,d0
	cmp.b	(a0),d0
	bne	.norun
.rloop	addq.l	#1,d1
	cmp.b	(a0),d0
	bne.s	.rend
	addq.l	#1,d2
	cmp.l	#126,d2
	beq.s	.rend
	addq.l	#1,a0
	subq.l	#1,d7
	bgt.s	.rloop
	neg	d1
	addq.w	#1,d1
	move.b	d1,(a1)+
	move.b	d0,(a1)+
	addq.l	#2,d3
	bra	.out
.rend	neg	d1
	addq.w	#1,d1
	move.b	d1,(a1)+
	move.b	d0,(a1)+
	addq.l	#2,d3
	subq.l	#1,d7
	bgt.s	.loop
	bra.s	.out
;---------------------------------------------
.norun	move.l	a1,a2		; store destination
	addq.l	#1,a2		; next one 
	move.b	d0,(a2)+		; copy byte	
	addq.l	#1,d3
	subq.l	#1,d7
.cloop	addq.l	#1,d1		; inc flag
	move.b	(a0)+,d0
	cmp.b	(a0),d0
	beq.s	.nocopy

	addq.l	#1,d2
	cmp.l	#126,d2
	beq.s	.nocopy

	move.b	d0,(a2)+		; copy
	addq.l	#1,d3		; decode size		
	subq.l	#1,d7		; dec size
	bgt.s	.cloop
	bra.s	.out

.nocopy	move.l	d1,d2
	subq.l	#1,d1
	move.b	d1,(a1)
	subq.l	#1,a0
	addq.l	#1,d3
	addq.l	#1,d2
	add.l	d2,a1
	bra.s	.loop	
.out	move.l	d3,sprite_decode_size
	rts
;---------------------------------------------
alloc_decode_buffer
	move.l	decode_buffer_size,d0
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,decode_buffer
	rts
;---------------------------------------------
free_decode_buffer
	move.l	decode_buffer_size,d0
	move.l	decode_buffer,a1
	LIB	freemem,exec
	rts	
;---------------------------------------------
; 0  Offset			; chars pos
; 4  Pixel Width
; 6  Pixel Height
; 8  SpriteSize    x/8+y
; 10 Gfx Mode
; 12 SpriteSize
;---------------------------------------------
Save_Saturn_256
	bsr	check_palettes
	tst.w	d7
	bne.s	.out
	move.w	#$ff,SendMode
	bsr	set_end_cc
	move.w	#4,SprMode
	bsr	Create_Sprite_Header_sat
	move.l	#256,satpp
	bsr	save_Saturn_palette
	move.w	#'S8',d0
	bsr	set_savename
	bsr	save_stuff_mode
	move.w	#$ff,andmode
	bsr	save_saturn_sprites

.out	rts
;---------------------------------------------
Save_Saturn_128
	bsr	check_palettes
	tst.w	d7
	bne.s	.out
	move.w	#$7f,SendMode
	bsr	set_end_cc
	move.w	#3,SprMode
	bsr	Create_Sprite_Header_sat
	move.l	#128,satpp
	bsr	save_Saturn_palette
	move.w	#'S8',d0
	bsr	set_savename
	bsr	save_stuff_mode
	move.w	#$7f,andmode
	bsr	save_saturn_sprites


.out	rts
;---------------------------------------------
Save_Saturn_64
	bsr	check_palettes
	tst.w	d7
	bne.s	.out
	move.w	#$3f,SendMode
	bsr	set_end_cc
	move.w	#2,SprMode
	bsr	Create_Sprite_Header_sat
	move.l	#64,satpp
	bsr	save_Saturn_palette
	move.w	#'S8',d0
	bsr	set_savename
	bsr	save_stuff_mode
	move.w	#$3f,andmode
	bsr	save_saturn_sprites

.out	rts
;---------------------------------------------
Save_Saturn_16
	bsr	check_palettes
	tst.w	d7
	bne.s	.out
	move.w	#$0f,SendMode
	bsr	set_end_cc
	move.w	#0,SprMode
	bsr	Create_Sprite_Header_sat
	move.l	#16,satpp
	bsr	save_Saturn_palette

	move.w	#'S4',d0
	bsr	set_savename
	bsr	save_stuff_mode
	move.w	#$0f,andmode
	bsr	save_saturn_sprites4bit

.out	rts
;---------------------------------------------
Save_Saturn_BGR
	move.w	#$8000,colormode
	move.l	#256,satpp
	move.w	#5,SprMode
	bsr	Create_Sprite_Header_sat
	move.w	#'SR',d0
	bsr	set_savename
	bsr	save_stuff_mode
	bsr	Create_Sprite_BGR
	rts
;---------------------------------------------
Save_Saturn_Chr8
	bsr	check_palettes
	tst.w	d7
	bne	.out
	move.w	#$ff,SendMode

	move.l	Sprite_List,a6
	move.l	(a6),a1	
	move.w	spr_palette(a1),saturn_palette
	moveq.l	#0,d0
	moveq.l	#0,d1
	move.w	spr_x(a1),d0
	move.w	spr_y(a1),d1
	add.l	#7,d0
	add.l	#7,d1
	and.l	#$fffffff8,d0
	and.l	#$fffffff8,d1
	lsr.l	#3,d0			; bytes
	lsr.l	#3,d1
	move.l	d0,Pattern_Width
	move.l	d1,Pattern_Height
	lsl.l	#2,d0			; longwords	
	mulu	d1,d0			; full size
	bsr	Alloc_Pattern_Data
	bsr	Alloc_Block_data
	bsr	Create_Pattern_Table
	bsr	Free_Pattern_Data
	move.l	#256,satpp
	bsr	save_Saturn_palette
	move.w	#'C1',d0
	bsr	set_savename
	bsr	save_stuff_mode

	bsr	Close_Stuff
	bsr	Free_Block_Data
.out	rts
;---------------------------------------------
Save_Saturn_Chr16
	bsr	check_palettes
	tst.w	d7
	bne	.out
	move.w	#$ff,SendMode
	move.l	Sprite_List,a6
	move.l	(a6),a1	
	move.w	spr_palette(a1),saturn_palette
	moveq.l	#0,d0
	moveq.l	#0,d1
	move.w	spr_x(a1),d0
	move.w	spr_y(a1),d1
	add.l	#7,d0
	add.l	#7,d1
	and.l	#$fffffff8,d0
	and.l	#$fffffff8,d1
	lsr.l	#3,d0			; bytes
	lsr.l	#3,d1
	lsr.l	#1,d0			; 16 wide
	lsr.l	#1,d1			; 16 high
	move.l	d0,Pattern_Width
	move.l	d1,Pattern_Height
	lsl.l	#2,d0			; longwords	
	mulu	d1,d0			; full size
	bsr	Alloc_Pattern_Data
	bsr	Alloc_Block_data
	bsr	Create_Pattern_Table
	bsr	Free_Pattern_Data
	move.l	#256,satpp
	bsr	save_Saturn_palette
	move.w	#'C2',d0
	bsr	set_savename
	bsr	save_stuff_mode
	bsr	create_Blocks
	bsr	Close_Stuff
	bsr	free_Block_data
.out	rts
;---------------------------------------------
Alloc_Pattern_Data
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	d0,PatternSize
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,PatternAddress
	movem.l	(sp)+,d0-d7/a0-a6
	rts	
;---------------------------------------------
Free_Pattern_data
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	PatternSize,d0
	move.l	PatternAddress,a1
	LIB	freemem,exec
	movem.l	(sp)+,d0-d7/a0-a6
	rts
;---------------------------------------------
Alloc_Block_Data
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#16*16,d0
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,BlockAddress
	movem.l	(sp)+,d0-d7/a0-a6
	rts	
;---------------------------------------------
Free_Block_data
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#16*16,d0
	move.l	BlockAddress,a1
	LIB	freemem,exec
	movem.l	(sp)+,d0-d7/a0-a6
	rts
;---------------------------------------------
Create_Pattern_table
;	movem.l	(sp)+,d0-d7/a0-a6
	move.l	PatternAddress,a5
	move.l	PatternSize,d7
	lsr.l	#2,d7
	subq.l	#1,d7
	move.l	#0,d0
.loop	move.l	d0,(a5)+
	add.l	#4,d0
	dbra	d7,.loop
	move.w	#'PT',d0
	bsr	set_savename
	bsr	Save_Stuff_Mode
	move.l	PatternSize,File_Length
	move.l	PatternAddress,File_Address
	bsr	Write_Stuff
	bsr	close_stuff
;	movem.l	(sp)+,d0-d7/a0-a6
	rts	
;---------------------------------------------
Create_Blocks
	move.l	Sprite_List,a6
	move.l	(a6),a1
	lea	Spr_Varsize(a1),a1	

	move.l	Pattern_Height,d7	
	subq.l	#1,d7
	move.l	a1,a3
.yloop	move.l	Pattern_Width,d6
	subq.l	#1,d6
	move.l	a1,a2

.xloop	move.l	BlockAddress,a0
	move.l	a2,a4
	move.l	a2,a5

	move.l	Pattern_Width,d0
	lsl.l	#4,d0
	move.l	d0,d1
	mulu.l	#8,d0
	add.l	d0,a5

	moveq.l	#8-1,d5
.hloop	move.l	(a4),(a0)
	move.l	4(a4),4(a0)

	move.l	8(a4),64(a0)	
	move.l	12(a4),68(a0)

	move.l	(a5),128(a0)
	move.l	4(a5),132(a0)

	move.l	8(a5),192(a0)	
	move.l	12(a5),196(a0)

	add.l	d1,a4
	add.l	d1,a5				
	add.l	#8,a0
	dbra	d5,.hloop

	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#16*16,File_Length
	move.l	BlockAddress,File_Address
	bsr	Write_Stuff
	movem.l	(sp)+,d0-d7/a0-a6

	add.l	#16,a2				; next block
;;	move.l	a2,a1
	dbra	d6,.xloop

	move.l	Pattern_Width,d0
	lsl.l	#4,d0
	mulu.l	#16,d0
	add.l	d0,a3
	move.l	a3,a1
	dbra	d7,.yloop
	rts		
;---------------------------------------------
;---------------------------------------------
pattern_width		dc.l	0
pattern_height		dc.l	0
patternSize		dc.l	0
PatternAddress		dc.l	0
BlockAddress		dc.l	0
;---------------------------------------------
Check_Palettes
	moveq.l	#0,d7
	move.w	sprite_amount,d7
	subq.w	#1,d7
	move.l	sprite_list,a6
	cmp.l	#-1,(a6)
	beq.s	.out
	move.l	(a6)+,a1
	move.w	spr_palette(a1),d0	; start palette
	subq.w	#1,d7
.loop	cmp.l	#-1,(a6)
	beq.s	.out
	move.l	(a6)+,a1
	move.w	spr_palette(a1),d1
	cmp.w	d0,d1
	bne.s	.error
	dbra	d7,.loop
.out	moveq.l	#0,d7
	rts
.error	move.w	#26,status_mode
	moveq.l	#-1,d7
	rts
;---------------------------------------------
Create_Sprite_Header_sat
	bsr	alloc_Sprite_Header
	move.l	Sprite_List,a6
	move.l	Sprite_Header_Address,a2
	move.w	Sprite_Amount,d7
	subq.w	#1,d7
	move.l	(a6),a1
	move.w	spr_palette(a1),saturn_palette
.loop	cmp.l	#-1,(a6)
	beq	.out
	move.l	(a6)+,a1
	bsr	create_sprite_size_sat
	move.l	Sprite_Offset,(a2)+	; store offset		
	move.w	Spr_x(a1),(a2)+		; pixel width	
	move.w	Spr_y(a1),(a2)+		; pixel height
	move.w	SpriteCode,(a2)+	; saturn code size
	move.w	#%0000000010000000,d4	; endcode disble
	tst.w	Sendmode		; check if endcode is enabled???
	beq.s	.a			; nope????
	move.w	#0,d4			; endcode enable	
.a	move.w	SprMode,d3		; get sprmode
	lsl.w	#3,d3			; set bits for mode
	or.w	d4,d3			; set endcode
	move.w	d3,(a2)+		; Saturn GfxMode
	move.l	SpriteSize,(a2)+	; palette number
;;	move.w	#0,(a2)+		; NULL
	move.l	Sprite_Offset,d0
	add.l	SpriteSize,d0
	move.l	d0,Sprite_Offset
	dbra	d7,.loop
;---------------------------------------------
.out
	move.w	#'HD',d0
	bsr	set_savename
	bsr	Save_Stuff_Mode
	move.l	Sprite_Header_Size,File_Length
	move.l	Sprite_Header_Address,File_Address
	bsr	Write_Stuff
	bsr	close_stuff
	bsr	Free_Sprite_Header
	rts
;---------------------------------------------
Set_SaveName
	move.l	SaveChangePtr,a0
	move.w	d0,(a0)+
	move.b	#0,(a0)+
	rts	
;---------------------------------------------
Alloc_Sprite_Header
	moveq.l	#0,d0
	move.w	Sprite_Amount,d0
	lsl.w	#4,d0
	move.l	d0,Sprite_Header_Size
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,Sprite_Header_Address
	move.l	#0,Sprite_Offset
	rts	
;---------------------------------------------
Free_Sprite_Header
	move.l	sprite_header_size,d0
	move.l	sprite_header_address,a1
	LIB	freemem,exec
	rts

;Sprite_Offset		dc.l	0
;Sprite_Header_Address	dc.l	0
;Sprite_Header_Size	dc.l	0
;---------------------------------------------
Create_Sprite_Size_sat
	movem.l	d0-d7/a0-a6,-(sp)

	moveq.l	#0,d0
	moveq.l	#0,d1
	move.w	Spr_X(a1),d0
	move.w	Spr_Y(a1),d1
	add.w	#7,d0
	lsr.w	#3,d0
	move.b	d0,SpriteCode
	move.b	d1,SpriteCode+1
	
	lsl.l	#3,d0			; make pixel size
	move.l	d0,CodeX
	move.l	d1,CodeY
	mulu.l	d0,d1			; byte size
	cmp.w	#0,sprmode		; 4bit mode
	bne.s	.a
	lsr.l	#1,d1			; make 4bit size
	move.l	codex,d0
	lsr.l	#1,d0
	move.l	d0,codex

	bra.s	.set
.a	cmp.w	#5,sprmode		; bgr mode
	bne.s	.set
	lsl.l	#1,d1			; make bgr size		
.set	move.l	d1,SpriteSize
	movem.l	(sp)+,d0-d7/a0-a6
	rts

CodeX		dc.l	0
CodeY		dc.l	0
SprMode		dc.w	0
SpriteCode	dc.w	0
SpriteSize	dc.l	0
;---------------------------------------------
Create_Sprite_BGR
	move.l	Sprite_List,a6
	moveq.l	#0,d7
	move.w	Sprite_amount,d7
	subq.w	#1,d7
.loop	cmp.l	#-1,(a6)
	beq	.out
	move.l	(a6)+,a1
	movem.l	d7/a6,-(sp)
	bsr	create_sprite_size_sat
	bsr	create_Bgr
	movem.l	(sp)+,d7/a6
	dbra	d7,.loop
.out	
	bsr	close_stuff
	rts
;---------------------------------------------
Create_BGR
	move.w	spr_palette(a1),d0
	move.l	palette_list,a6
	move.l	(a6,d0.w*4),a6
	cmp.l	#-1,a6
	bne.s	.a
	lea	buffer_palette,a6
.a	bsr	convert_palette
	move.w	#$0,workpalette		; set color 0 to NULL
	
	bsr	alloc_Spritesize
	move.l	SpriteAddress,a4
	lea	workpalette,a3
	move.w	spr_x(a1),sprx
	move.w	spr_y(a1),spry
	lea	spr_varsize(a1),a5

	moveq.l	#0,d1
.clpy	moveq.l	#0,d0
	move.l	a4,a2
.clpx	moveq.l	#0,d2
	move.b	(a5)+,d2
	add.w	d2,d2
	move.w	(a3,d2.w),(a2)
	add.w	#2,a2
	add.w	#1,d0
	cmp.w	sprx,d0
	bne.s	.clpx
	add.l	CodeX,a4
	add.l	CodeX,a4
	addq.w	#1,d1
	cmp.w	spry,d1
	bne.s	.clpy

	move.l	SpriteSize,File_Length
	move.l	SpriteAddress,File_Address
	bsr	write_stuff

	bsr	Free_SpriteSize
	rts

sprx	dc.w	0
spry	dc.w	0
;---------------------------------------------
Convert_Palette
	movem.l	d0-d7/a0-a6,-(sp)
	lea	workpalette,a5
	move.l	satpp,d7
	subq.l	#1,d7
.ploop	moveq.l	#0,d0
	moveq.l	#0,d1
	moveq.l	#0,d2
	move.b	(a6)+,d0
	move.b	(a6)+,d1
	move.b	(a6)+,d2
	lsr.l	#3,d0
	lsr.l	#3,d1
	lsr.l	#3,d2
	lsl.l	#8,d2		; blue	
	lsl.l	#2,d2		
	lsl.l	#5,d1		; green
	move.w	colormode,d3
	or.w	d0,d3
	or.w	d1,d3
	or.w	d2,d3
	move.w	d3,(a5)+
	dbra	d7,.ploop
	movem.l	(sp)+,d0-d7/a0-a6

	move.w	colormode,workpalette	; set color 0 to NULL
	rts

colormode	dc.w	0
;---------------------------------------------
Alloc_SpriteSize
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	spritesize,d0
	move.l	#$10001,d1
	LIB	allocmem,exec
	move.l	d0,SpriteAddress
	movem.l	(sp)+,d0-d7/a0-a6
	rts	
;---------------------------------------------
Free_SpriteSize
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	spritesize,d0
	move.l	spriteAddress,a1
	LIB	freemem,exec
	movem.l	(sp)+,d0-d7/a0-a6
	rts

SpriteAddress	dc.l	0
;---------------------------------------------
Save_Saturn_Palette
	move.w	Saturn_Palette,d0
	cmp.w	#-1,d0
	beq.s	.buffer
	move.l	palette_list,a6
	move.l	(a6,d0.w*4),a6
	bra.s	.conv	
.buffer	lea	buffer_palette,a6
.conv	bsr	convert_palette
	move.w	#'PP',d0
	bsr	set_savename
	bsr	save_stuff_mode
	move.l	satpp,d0
	lsl.l	#1,d0
	move.l	d0,file_length
	move.l	#workpalette,file_address
	bsr	write_stuff
	bsr	close_stuff
	rts
	
satpp		dc.l	0
Saturn_Palette	dc.w	0
;---------------------------------------------
set_end_cc
	move.w	maskmode,d0
	lea	satcodes,a0
	move.w	(a0,d0.w*4),colormode
	move.w	2(a0,d0.w*4),endcodemode
	rts

satcodes
	dc.w	$0000,$0000	; none
	dc.w	$0000,$0000	; first
	dc.w	$0000,$0000	; last
	dc.w	$8000,$0000	; col calc
	dc.w	$0000,$0001	; end code
	dc.w	$8000,$0001	; col calc + end code
;---------------------------------------------
Save_Saturn_Sprites
	move.l	Sprite_List,a6
	moveq.l	#0,d7
	move.w	Sprite_amount,d7
	subq.w	#1,d7
.loop	cmp.l	#-1,(a6)
	beq	.out
	move.l	(a6)+,a1
	movem.l	d7/a6,-(sp)
	bsr	create_sprite_size_sat
	bsr	create_sat_spr
	movem.l	(sp)+,d7/a6
	dbra	d7,.loop
.out
	bsr	close_stuff
	rts
;---------------------------------------------
create_Sat_Spr
	bsr	alloc_Spritesize

	move.l	SpriteAddress,a4
	move.w	spr_x(a1),sprx
	move.w	spr_y(a1),spry
	lea	spr_varsize(a1),a5
	moveq.l	#0,d1
.clpy	moveq.l	#0,d0
	move.l	a4,a2
.clpx	moveq.l	#0,d2
	move.b	(a5)+,d2
	and.w	andmode,d2
	move.b	d2,(a2)+
	add.w	#1,d0
	cmp.w	sprx,d0
	bne.s	.clpx
	add.l	CodeX,a4
	addq.w	#1,d1
	cmp.w	spry,d1
	bne.s	.clpy
	bsr	Do_EndCoding
	move.l	SpriteSize,File_Length
	move.l	SpriteAddress,File_Address
	bsr	write_stuff

	bsr	Free_SpriteSize
	rts
;---------------------------------------------
andmode		dc.w	0
endcodemode	dc.w	0
;---------------------------------------------
Save_Saturn_Sprites4bit
	move.l	Sprite_List,a6
	moveq.l	#0,d7
	move.w	Sprite_amount,d7
	subq.w	#1,d7
.loop	cmp.l	#-1,(a6)
	beq	.out
	move.l	(a6)+,a1
	movem.l	d7/a6,-(sp)
	bsr	create_sprite_size_sat
	bsr	create_sat_spr4bit
	movem.l	(sp)+,d7/a6
	dbra	d7,.loop
.out
	bsr	close_stuff
	rts
;---------------------------------------------
create_Sat_Spr4bit
	bsr	alloc_Spritesize

	move.l	SpriteAddress,a4
	move.w	spr_x(a1),sprx
	move.w	spr_y(a1),spry
	lea	spr_varsize(a1),a5
	moveq.l	#0,d1
.clpy	moveq.l	#0,d0
	move.l	a4,a2
	moveq.l	#0,d3
.clpx	moveq.l	#0,d2
	move.b	(a5)+,d2
	and.w	andmode,d2
	tst.w	d3
	bne.s	.a
	lsl.w	#4,d2
	move.b	d2,d4
	moveq.l	#1,d3
	move.b	d4,(a2)
	bra.s	.past	
.a	or.w	d2,d4		
	moveq.l	#0,d3
	move.b	d4,(a2)+
.past	add.w	#1,d0
	cmp.w	sprx,d0
	bne.s	.clpx
	add.l	CodeX,a4
	addq.w	#1,d1
	cmp.w	spry,d1
	bne.s	.clpy

	move.l	SpriteSize,File_Length
	move.l	SpriteAddress,File_Address
	bsr	write_stuff

	bsr	Free_SpriteSize
	rts
;---------------------------------------------
SendMode	dc.w	0

Do_EndCoding
	tst.w	EndCodeMode
	beq	.out
	move.l	SpriteAddress,a4
	moveq.l	#0,d1		
.yloop	move.l	a4,a2
	bsr	.findfill
	tst.w	d7
	bne.s	.out
	bsr	.findzero
	tst.w	d7
	bne.s	.out
	move.l	a2,a4
	add.l	CodeX,a4
	addq.l	#1,d1
	cmp.l	CodeY,d1
	bne.s	.Yloop
.out	rts
;---------------------------------------------
.findFill
	moveq.l	#0,d0
.loopX	move.b	(a2),d2
	cmp.b	#0,d2
	bne.s	.okay
	addq.l	#1,a2
	addq.l	#1,d0
	cmp.l	CodeX,d0
	bne.s	.loopx
	moveq.l	#-1,d7
	rts
.okay	move.w	Sendmode,d3
	sub.l	#1,a2
	move.b	d3,(a2)
	moveq.l	#0,d7
	rts
;---------------------------------------------
.findZero
.loopX1	move.b	(a2),d2
	cmp.b	#0,d2
	beq.s	.okay2
	addq.l	#1,a2
	addq.l	#1,d0
	cmp.l	CodeX,d0
	bne.s	.loopx1
	moveq.l	#-1,d7
	rts
.okay2	move.w	Sendmode,d3
	move.b	d3,(a2)
	moveq.l	#0,d7
	rts
;---------------------------------------------
