
*
* This is by far the most ugly routine in this program, but
* I don't think I will ever optimize or update it. It's from 1993.
*

saveMask1pl
		clr.w	mwr_bigmask-j(a5)
		bra.s	saveMaske
saveMask
		st	mwr_bigmask-j(a5)
saveMaske
		move.l	#fastbuffert,op.RC
		tst.w	FASTMEMflag-j(a5)
		bne.s	.nostuff

		move.l	#blittert,op.RC
		tst.w	ECSBLITTERflag-j(a5)
		beq	.nostuff

		bsr	OpenSaveFile
		beq	.nostuff

		bsr	WriteMask

		bsr	CloseSaveFile

		clr.l	op.RC

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

mwr_bigmask	dc.w	0
; die WriteMask-Routine ist zu 90% von der WriteRange-Routine übernommen,
; beinhaltet jedoch keine blit-option und 'or't eben eine Plane nacheinander
; auf die gleiche Stelle ! (Kommentare hab' ich deshalb weggeschnitten)
mwr_FLECK	dc.w	0
WriteMask	clr.w	mwr_FLECK-j(a5)
	move.l	4.w,a6
	move.l	load.rawmemlen(pc),d0
	addq.l	#2,d0
	move.l	#MEMF_CLEAR!MEMF_CHIP,d1
	LIBCALL	AllocVec
	move.l	d0,save.tempmem-j(a5)
	bne.w	.001
	lea	nomemtext(pc),a0
	bsr	type
	moveq	#0,d0
	rts
.001	move.l	gfxbase(pc),a6
	LIBCALL	OwnBlitter
	LIBCALL	WaitBlit
	move.l	d0,a3
	movem.w	save.range(pc),d4-d7

	move.w	d7,d1
	sub.w	d5,d1
	addq.w	#1,d1
	mulu.w	load.depth(pc),d1
	move.w	d1,d3
	swap	d3
	move.w	d6,d0
	sub.w	d4,d0
	add.w	#16,d0
	lsr.w	#4,d0
	move.w	d6,d2
	add.w	#16,d2
	lsr.w	#4,d2
	move.w	d4,d3
	lsr.w	#4,d3
	sub.w	d3,d2
	cmp.w	d0,d2
	beq.s	.ok1
	addq.w	#1,d0
	st	mwr_FLECK-j(a5)
.ok1	move.w	d0,d3	; d3 bltsizv/h
	add.w	d0,d0
	mulu.w	d0,d1
	subq.l	#2,d1
	add.l	d1,a3	; a3 bltdpt

	move.w	d7,d1
	addq.w	#1,d1
	mulu.w	load.depth(pc),d1
	move.w	load.pagesize(pc),d2
	lsr.w	#3,d2
	mulu.w	d2,d1
	move.w	d6,d0
	lsr.w	#4,d0
	add.w	d0,d0
	sub.w	d0,d2
	ext.l	d2
	sub.l	d2,d1
	add.l	load.rawmemory(pc),d1	; d1 bltapt

	move.w	d6,d0
	and.w	#$f,d0
	move.w	#$8000,d2
	lsr.w	d0,d2
	neg.w	d2
	swap	d2
	clr.w	d2
	not.w	d2
	move.w	d4,d0
	and.w	#$f,d0
	lsr.w	d0,d2	; d2 bltaf/lwm
	
	move.w	d4,d0
	and.w	#$f,d0
	ror.w	#4,d0
	or.w	#$9f0,d0
	swap	d0
	move.w	#$0002,d0	; d0 bltcon0/1 (desc-mode!!)

	move.w	d3,d4
	add.w	d4,d4
	move.w	load.pagesize(pc),d5
	lsr.w	#3,d5
	sub.w	d4,d5
	swap	d5
	clr.w	d5	; d5 blta/dmod

; so, da man hier ja nicht groß optimieren sollte, hab' ich auch ein
; bißl geschlampt...
	and.l	#$f000ffff,d0
	or.l	#$0bfa0000,d0	; D = A or C
	lea	$dff000,a6
	move.l	d3,-(sp)
	move.w	load.depth(pc),d6
	swap	d3
	moveq	#0,d4
	move.w	d3,d4
	divu	d6,d4
	move.w	d4,d3
	swap	d3	; new blt¥size
	move.w	load.pagesize(pc),d4
	lsr.w	#3,d4	; sub-apt
	ext.l	d4
	move.w	d4,d5
	mulu	d6,d5
	move.w	d3,d7
	add.w	d7,d7
	sub.w	d7,d5
	swap	d5
	clr.w	d5	; a/dmod
	swap	d3
	mulu	d3,d7	; sub-dpt
	swap	d3
	subq.w	#1,d6
.normfloop	btst	#6,2(a6)
	bne.w	.normfloop
	move.l	d0,$40(a6)
	move.l	d5,$64(a6)
	move.w	d5,$60(a6)
	move.l	d2,$44(a6)
	move.l	d1,$50(a6)
	move.l	a3,$48(a6)
	move.l	a3,$54(a6)
	move.l	d3,$5c(a6)
;******	sub.l	d7,a3 nicht, weil ja immer wieder ge'or't wird
	sub.l	d4,d1
	dbra	d6,.normfloop
	move.l	(sp)+,d3

.ok	tst.w	mwr_FLECK-j(a5)
	beq.s	.ok2
.wbltFLECK	btst	#6,2(a6)
	bne.w	.wbltFLECK
	move.l	#$09f00000,$40(a6)
	move.l	#$ffffffff,$44(a6)
	move.l	save.tempmem(pc),d0
	move.l	d0,$50(a6)
	move.l	d0,$54(a6)
	move.l	#$00020000,$64(a6)
	subq.w	#1,d3	;einen schmaler
	move.l	d3,$5c(a6)

.ok2	;wenn nötig, hier die Plane auf alle Planes expandieren
	;(full mask)
	tst.w	mwr_bigmask-j(a5)
	beq.s	.ok3
	move.l	d3,-(sp)
	move.w	load.depth(pc),d1	;d1=Depth
	move.w	d3,d6
	swap	d3
	moveq	#0,d0
	move.w	d3,d0
	divu	d1,d0	;d0=Höhe der Mask
	add.w	d6,d6
	mulu	d3,d6
	divu	d1,d6	;d6=Größe einer Plane
	move.l	save.tempmem(pc),d2	;d2=Anfangsadresse
	move.l	d2,d4
	move.w	d1,d5
	subq.w	#2,d5
	bmi.s	.ok2.0
.ok2.1	add.l	d6,d4
	dbra	d5,.ok2.1	;d4=Anfang der alten Mask
.ok2.0	swap	d3
	add.w	d3,d3	;d3=Breite einer Zeile
	ext.l	d3
	subq.w	#1,d0 *äußere Schleife (Höhe)
.ok2.2	move.w	d1,d5
	subq.w	#1,d5 *innere Schleife (Depth)
.ok2.3	btst	#6,2(a6)
	bne.s	.ok2.3
	move.l	#$09f00000,$40(a6)
	move.l	#$ffffffff,$44(a6)
	move.l	d4,$50(a6)
	move.l	d2,$54(a6)
	move.l	#$00000000,$64(a6)
	moveq	#1,d7
	swap	d7
	move.w	d3,d7
	lsr.w	#1,d7
	move.l	d7,$5c(a6)
	add.l	d3,d2
	dbra	d5,.ok2.3
	add.l	d3,d4
	dbra	d0,.ok2.2
	move.l	(sp)+,d3

.ok3	move.l	gfxbase(pc),a6
	LIBCALL	WaitBlit
	move.l	#-1,$dff044
	LIBCALL	DisownBlitter

	move.l	save.filehandle(pc),d1
	move.l	save.tempmem(pc),d2
	move.w	d3,d0
	swap	d3
	add.w	d0,d0
	mulu.w	d0,d3
	tst.w	mwr_bigmask-j(a5)
	bne.s	.l00pend
	move.w	load.depth(pc),d0	;nur bei 1-pl Mask!
	divu	d0,d3
	subq.w	#2,d0
	bmi.s	.l00pend
.l00p	add.l	d3,d2
	dbra	d0,.l00p
.l00pend	bsr	ExtWrite

	move.l	4.w,a6
	move.l	save.tempmem(pc),a1
	LIBCALL	FreeVec
	moveq	#-1,d0
	rts
