;---------------T----------T-----------------------T
; AGAiff
;
; Last Change > 1.2.1994
; Include > savecopper.s

saveCopper
		bsr	OpenSaveFile
		beq	.nofile

		lea	buf1+4,a4
		move.l	#$01060c40,-4(a4)
		move.l	colortable(pc),a3
		addq.w	#4,a3
		move.l	colortablelength(pc),d4
		subq.l	#8,d4
		divu	#12,d4
		ext.l	d4	; muß getrennt kommen !!!
		divu	#32,d4
		swap	d4	; d4 Anzahl 32er Blöcke
		move.w	d4,d5	; d5 Rest
		swap	d4

		tst.w	actcolsformat2-j(a5)
		beq.w	.save12bitcopper
.save24loop1	subq.w	#1,d4	; ganzen 32er-Block writen
		bmi.w	.save24loop2
		moveq	#1,d6
.save24loop1.01	move.l	a4,a0
		moveq	#31,d0
		move.w	#$0180,d1
.save24loop1.1	clr.w	d2
		clr.w	d3
		tst.w	d6
		beq.w	.save24.666
		move.b	(a3),d2
		lsl.w	#4,d2
		move.b	4(a3),d2
		and.b	#$f0,d2
		move.b	8(a3),d3
		lsr.b	#4,d3
		or.b	d3,d2
		bra.w	.save24.555
.save24.666	move.b	(a3),d2
		and.b	#$f,d2
		lsl.w	#8,d2
		move.b	4(a3),d2
		lsl.b	#4,d2
		move.b	8(a3),d3
		and.b	#$f,d3
		or.b	d3,d2
.save24.555	move.w	d1,(a0)+
		move.w	d2,(a0)+
		addq.w	#2,d1
		lea	12(a3),a3
		dbra	d0,.save24loop1.1
		move.l	save.filehandle(pc),d1
		lea	-4(a4),a0
		move.l	a0,d2
		moveq	#4,d3
		bsr	ExtWrite
		move.l	save.filehandle(pc),d1
		move.l	a4,d2
		move.l	#32*4,d3
		bsr	ExtWrite
		bchg.b	#1,-2(a4)
		lea	-12*32(a3),a3
		dbra	d6,.save24loop1.01
		bfextu	-2(a4){0:3},d0	; 0106-Register hochzählen
		addq.w	#1,d0
		bfins	d0,-2(a4){0:3}
		lea	12*32(a3),a3
		bra.w	.save24loop1
.save24loop2	subq.w	#1,d5	; Rest schreiben
		bmi.w	.saveclose
		move.w	d5,d7
		moveq	#1,d6
.save24loop2.01	move.l	a4,a0
		move.w	d7,d5
		move.w	d5,d4
		addq.w	#1,d4
		move.w	#$0180,d1
.save24loop2.1	clr.w	d2
		clr.w	d3
		tst.w	d6
		beq.w	.save24.6662
		move.b	(a3),d2
		lsl.w	#4,d2
		move.b	4(a3),d2
		and.b	#$f0,d2
		move.b	8(a3),d3
		lsr.b	#4,d3
		or.b	d3,d2
		bra.w	.save24.5552
.save24.6662	move.b	(a3),d2
		and.b	#$f,d2
		lsl.w	#8,d2
		move.b	4(a3),d2
		lsl.b	#4,d2
		move.b	8(a3),d3
		and.b	#$f,d3
		or.b	d3,d2
.save24.5552	move.w	d1,(a0)+
		move.w	d2,(a0)+
		addq.w	#2,d1
		lea	12(a3),a3
		dbra	d5,.save24loop2.1
		move.l	save.filehandle(pc),d1
		lea	-4(a4),a0
		move.l	a0,d2
		moveq	#4,d3
		bsr	ExtWrite
		move.l	save.filehandle(pc),d1
		move.l	a4,d2
		moveq	#0,d3
		move.w	d4,d3
		add.l	d3,d3
		add.l	d3,d3
		bsr	ExtWrite
		bchg.b	#1,-2(a4)
		mulu.w	#12,d4
		sub.w	d4,a3
		dbra	d6,.save24loop2.01
		bra.w	.saveclose

.save12bitcopper
.save12loop1	subq.w	#1,d4	; ganzen 32er-Block writen
		bmi.w	.save12loop2
		move.l	a4,a0
		moveq	#31,d0
		move.w	#$0180,d1
.save12loop1.1	clr.w	d2
		clr.w	d3
		move.b	(a3),d2
		lsl.w	#4,d2
		move.b	4(a3),d2
		and.b	#$f0,d2
		move.b	8(a3),d3
		lsr.b	#4,d3
		or.b	d3,d2
		move.w	d1,(a0)+
		move.w	d2,(a0)+
		addq.w	#2,d1
		lea	12(a3),a3
		dbra	d0,.save12loop1.1
		move.l	save.filehandle(pc),d1
		lea	-4(a4),a0
		move.l	a0,d2
		moveq	#4,d3
		bsr	ExtWrite
		move.l	save.filehandle(pc),d1
		move.l	a4,d2
		move.l	#32*4,d3
		bsr	ExtWrite
		bfextu	-2(a4){0:3},d0	; 0106-Register hochzählen
		addq.w	#1,d0
		bfins	d0,-2(a4){0:3}
		bra.w	.save12loop1

.save12loop2	subq.w	#1,d5	; Rest schreiben
		bmi.w	.saveclose
		move.l	a4,a0
		move.w	d5,d4
		addq.w	#1,d4
		move.w	#$0180,d1
.save12loop2.1	clr.w	d2
		clr.w	d3
		move.b	(a3),d2
		lsl.w	#4,d2
		move.b	4(a3),d2
		and.b	#$f0,d2
		move.b	8(a3),d3
		lsr.b	#4,d3
		or.b	d3,d2
		move.w	d1,(a0)+
		move.w	d2,(a0)+
		addq.w	#2,d1
		lea	12(a3),a3
		dbra	d5,.save12loop2.1
		move.l	save.filehandle(pc),d1
		lea	-4(a4),a0
		move.l	a0,d2
		moveq	#4,d3
		bsr	ExtWrite
		move.l	save.filehandle(pc),d1
		move.l	a4,d2
		moveq	#0,d3
		move.w	d4,d3
		add.l	d3,d3
		add.l	d3,d3
		bsr	ExtWrite

.saveclose	move.l	#$01060c40,-4(a4)
		move.l	save.filehandle(pc),d1
		lea	-4(a4),a0
		move.l	a0,d2
		moveq	#4,d3
		bsr	ExtWrite

		bsr	CloseSaveFile

		clr.l	op.RC

.nofile		move.l	op.RC(pc),d0
		beq.s	.ok
		move.l	d0,a0
		bsr	type
		moveq	#0,d0
		rts
.ok		moveq	#-1,d0
		rts
