; AGAiff
; > savechunky.s

saveChunkyRegs
		move.l	#nomemtext,op.RC
		movem.w	save.range(pc),d0-d3
		sub.w	d0,d2
		sub.w	d1,d3
		addq.w	#1,d2
		addq.w	#1,d3
		mulu.w	d2,d3
		move.l	d3,d0
		move.l	d3,scmemlen
		moveq	#0,d1
		move.l	4.w,a6
		LIBCALL	AllocVec
		move.l	d0,scmem
		beq	.nomem

		bsr	OpenSaveFile
		beq.s	.nofile

		movem.w	save.range(pc),d0-d3
		sub.w	d0,d2		; [d0] Start-XPos
		ext.l	d0
		sub.w	d1,d3		; [d3] Anzahl Zeilen - 1
		move.w	load.depth(pc),d4
		addq.w	#1,d1		; [d2] Anzahl Punkte(Breite) - 1
		mulu.w	d4,d1
		subq.w	#1,d1
		move.w	load.pagesize(pc),d4
		lsr.w	#3,d4
		mulu.w	d4,d1
		move.l	load.rawmemory(pc),a6
		add.l	d1,a6		; [a6] last plane of first line
		move.w	d4,a4		; [a4] Breite einer Planezeile
		move.l	scmem(pc),a1	; [a1] destmem

.yloop		move.w	d2,d1	;[d1] x-counter
		move.l	d0,d4	;[d4] X

.xloop		move.w	load.depth(pc),d7
		subq.w	#1,d7	;[d7] bplcounter
		move.l	a6,a0	;[a0] bplpointer
		moveq	#0,d5	;[d5] akku

.ploop		add.l	d5,d5
		bftst	(a0){d4:1}
		beq.s	.0
		addq.l	#1,d5
.0		sub.l	a4,a0
		dbra	d7,.ploop

		move.b	d5,(a1)+
		addq.l	#1,d4
		dbra	d1,.xloop

		move.w	a4,d5
		mulu.w	load.depth(pc),d5
		add.l	d5,a6
		dbra	d3,.yloop

		move.l	save.filehandle(pc),d1
		move.l	scmem(pc),d2
		move.l	scmemlen(pc),d3
		bsr	ExtWrite

		clr.l	op.RC

		bsr	CloseSaveFile

.nofile		move.l	scmem(pc),a1
		move.l	4.w,a6
		LIBCALL	FreeVec

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

scmem		dc.l	0
scmemlen	dc.l	0

saveChunkyCols
		move.l	#nomemtext,op.RC
		move.w	save.range+4(pc),d0
		sub.w	save.range(pc),d0
		addq.w	#1,d0
		mulu.w	#12,d0
		moveq	#0,d1
		move.l	4.w,a6
		LIBCALL	AllocVec
		move.l	d0,scmem-j(a5)
		beq	.nomem
		move.l	d0,a3

		bsr	OpenSaveFile
		beq	.nofile

		movem.w	save.range(pc),d0-d3
		sub.w	d0,d2		; [d0] Start-XPos
		sub.w	d1,d3		; [d3] Anzahl Zeilen - 1
					; [d2] Anzahl Punkte(Breite) - 1
		move.w	load.depth(pc),d4
		addq.w	#1,d1
		mulu.w	d1,d4
		subq.w	#1,d4
		move.w	load.pagesize(pc),d1
		lsr.w	#3,d1
		mulu.w	d1,d4
		move.l	load.rawmemory(pc),a6
		add.l	d4,a6		; [a6] last plane of first line

		move.w	load.pagesize(pc),d4
		lsr.w	#3,d4		; [d4] Breite einer Planezeile

		move.l	colortable(pc),a1
		addq.w	#4,a1		; [a1] ColorTable

	* [d5-d7] current RGB values

	* Workregister: d1/a2-a6

		move.l	load.modeid(pc),d1
		btst	#7,d1
		bne	.convertEHB
		btst	#11,d1
		bne	.convertHAM

.convertNORM	move.l	a3,a4
		movem.w	d0/d2/d3,-(sp)
.0loopx		move.l	a6,a2
		moveq	#0,d1		* Pixelnummer holen
		move.w	load.depth(pc),d3
		subq.w	#1,d3
.0loopxx	add.l	d1,d1
		bftst	(a2){d0:1}
		beq.s	.00
		addq.l	#1,d1
.00		sub.w	d4,a2
		dbra	d3,.0loopxx
		move.l	d1,d3
		add.l	d1,d1		;schnelles *12 !!
		add.l	d3,d1
		movem.l	(a1,d1.l*4),d5-d7
		movem.l	d5-d7,(a4)
		lea	12(a4),a4
		addq.l	#1,d0
		dbra	d2,.0loopx
		move.l	a3,a0		* speichern
		moveq	#0,d0
		move.w	save.range+4(pc),d0
		sub.w	save.range(pc),d0
		addq.w	#1,d0
		move.l	a1,-(sp)
		bsr	WriteColorTable
		move.l	(sp)+,a1
		movem.w	(sp)+,d0/d2/d3
		move.w	d4,d1
		mulu.w	load.depth(pc),d1
		add.w	d1,a6
		dbra	d3,.convertNORM
		bra	.convertENDE

.convertEHB	move.l	a3,a4
		movem.w	d0/d2/d3,-(sp)
.1loopx		move.l	a6,a2
		moveq	#0,d1		* Pixelnummer holen
		move.w	load.depth(pc),d3
		subq.w	#1,d3
.1loopxx	add.l	d1,d1
		bftst	(a2){d0:1}
		beq.s	.10
		addq.l	#1,d1
.10		sub.w	d4,a2
		dbra	d3,.1loopxx
		btst	#5,d1
		bne.s	.12
		move.l	d1,d3
		add.l	d1,d1		;schnelles *12 !!
		add.l	d3,d1
		movem.l	(a1,d1.l*4),d5-d7
		bra.s	.11
.12		bclr	#5,d1
		move.l	d1,d3
		add.l	d1,d1		;schnelles *12 !!
		add.l	d3,d1
		movem.l	(a1,d1.l*4),d5-d7
		lsr.l	#1,d5
		lsr.l	#1,d6
		lsr.l	#1,d7
.11		movem.l	d5-d7,(a4)
		lea	12(a4),a4
		addq.l	#1,d0
		dbra	d2,.1loopx
		move.l	a3,a0		* speichern
		moveq	#0,d0
		move.w	save.range+4(pc),d0
		sub.w	save.range(pc),d0
		addq.w	#1,d0
		move.l	a1,-(sp)
		bsr	WriteColorTable
		move.l	(sp)+,a1
		movem.w	(sp)+,d0/d2/d3
		move.w	d4,d1
		mulu.w	load.depth(pc),d1
		add.w	d1,a6
		dbra	d3,.convertEHB
		bra	.convertENDE

.convertHAM	move.w	load.depth(pc),d1
		cmp.w	#6,d1
		beq	.convertHAM6

.convertHAM8	move.l	a3,a4
		movem.w	d0/d2/d3,-(sp)
		moveq	#0,d5	;aktuelle RGB-Werte
		moveq	#0,d6
		moveq	#0,d7
		move.w	d0,d2
		moveq	#0,d0
		subq.w	#1,d2
		bmi.s	.21
.2loopx1	move.l	a6,a2	;Line von vorne bis zum Start des Ranges
		moveq	#0,d1	;durchgehen, um AnfangsRGB zu finden.
		moveq	#7,d3
.2loopx1x	add.l	d1,d1
		bftst	(a2){d0:1}
		beq.s	.20
		addq.l	#1,d1
.20		sub.w	d4,a2
		dbra	d3,.2loopx1x
		bsr.s	.convHAM8
		addq.l	#1,d0
		dbra	d2,.2loopx1

.21		movem.w	(sp),d0/d2/d3	;Range durchgehen, dabei
.2loopx2	move.l	a6,a2		;Farben merken.
		moveq	#0,d1
		moveq	#7,d3
.2loopx2x	add.l	d1,d1
		bftst	(a2){d0:1}
		beq.s	.22
		addq.l	#1,d1
.22		sub.w	d4,a2
		dbra	d3,.2loopx2x
		bsr.s	.convHAM8
		movem.l	d5-d7,(a4)
		lea	12(a4),a4
		addq.l	#1,d0
		dbra	d2,.2loopx2

		move.l	a3,a0
		moveq	#0,d0
		move.w	save.range+4(pc),d0
		sub.w	save.range(pc),d0
		addq.w	#1,d0
		move.l	a1,-(sp)
		bsr	WriteColorTable
		move.l	(sp)+,a1
		movem.w	(sp)+,d0/d2/d3
		move.w	d4,d1
		mulu.w	#8,d1
		add.w	d1,a6
		dbra	d3,.convertHAM8
		bra	.convertENDE

.convHAM8	btst	#7,d1
		beq.s	.HAM8nobit7
		btst	#6,d1
		beq.s	.HAM8nobit6.1
		bfins	d1,d6{0:6}		;Grün
		bfins	d1,d6{8:6}
		bfins	d1,d6{16:6}
		bfins	d1,d6{24:6}
		rts
.HAM8nobit6.1	bfins	d1,d5{0:6}		;Rot
		bfins	d1,d5{8:6}
		bfins	d1,d5{16:6}
		bfins	d1,d5{24:6}
		rts
.HAM8nobit7	btst	#6,d1
		beq.s	.HAM8nobit6.2
		bfins	d1,d7{0:6}		;Blau
		bfins	d1,d7{8:6}
		bfins	d1,d7{16:6}
		bfins	d1,d7{24:6}
		rts
.HAM8nobit6.2	move.w	d1,d3			;neuer Farbwert
		add.w	d1,d1
		add.w	d3,d1
		movem.l	(a1,d1.w*4),d5-d7
		rts

.convertHAM6	move.l	a3,a4
		movem.w	d0/d2/d3,-(sp)
		moveq	#0,d5
		moveq	#0,d6
		moveq	#0,d7
		move.w	d0,d2
		moveq	#0,d0
		subq.w	#1,d2
		bmi.s	.31
.3loopx1	move.l	a6,a2
		moveq	#0,d1
		moveq	#5,d3
.3loopx1x	add.l	d1,d1
		bftst	(a2){d0:1}
		beq.s	.30
		addq.l	#1,d1
.30		sub.w	d4,a2
		dbra	d3,.3loopx1x
		bsr.s	.convHAM6
		addq.l	#1,d0
		dbra	d2,.3loopx1

.31		movem.w	(sp),d0/d2/d3
.3loopx2	move.l	a6,a2
		moveq	#0,d1
		moveq	#5,d3
.3loopx2x	add.l	d1,d1
		bftst	(a2){d0:1}
		beq.s	.32
		addq.l	#1,d1
.32		sub.w	d4,a2
		dbra	d3,.3loopx2x
		bsr.s	.convHAM6
		movem.l	d5-d7,(a4)
		lea	12(a4),a4
		addq.l	#1,d0
		dbra	d2,.3loopx2

		move.l	a3,a0
		moveq	#0,d0
		move.w	save.range+4(pc),d0
		sub.w	save.range(pc),d0
		addq.w	#1,d0
		move.l	a1,-(sp)
		bsr	WriteColorTable
		move.l	(sp)+,a1
		movem.w	(sp)+,d0/d2/d3
		move.w	d4,d1
		mulu.w	#6,d1
		add.w	d1,a6
		dbra	d3,.convertHAM6
		bra	.convertENDE

.convHAM6	btst	#5,d1
		beq.s	.HAM6nobit7
		btst	#4,d1
		beq.s	.HAM6nobit6.1
		bfins	d1,d6{0:4}
		bfins	d1,d6{8:4}
		bfins	d1,d6{16:4}
		bfins	d1,d6{24:4}
		rts
.HAM6nobit6.1	bfins	d1,d5{0:4}
		bfins	d1,d5{8:4}
		bfins	d1,d5{16:4}
		bfins	d1,d5{24:4}
		rts
.HAM6nobit7	btst	#6,d1
		beq.s	.HAM6nobit6.2
		bfins	d1,d7{0:4}
		bfins	d1,d7{8:4}
		bfins	d1,d7{16:4}
		bfins	d1,d7{24:4}
		rts
.HAM6nobit6.2	move.w	d1,d3
		add.w	d1,d1
		add.w	d3,d1
		movem.l	(a1,d1.w*4),d5-d7
		rts

.convertENDE	clr.l	op.RC
		move.l	4.w,a6
		move.l	scmem(pc),a1
		LIBCALL	FreeVec
.nofile		bsr	CloseSaveFile
.nomem		move.l	op.RC(pc),d0
		beq.s	.ok
		move.l	d0,a0
		bsr	type
		moveq	#0,d0
		rts
.ok		moveq	#-1,d0
		rts
