; AGAiff
; > load.s

SCRMINWIDTH	equ	320
SCRMINHEIGHT	equ	160

NOSHOWflag	dc.w	0

ANIMATIONflag	dc.w	0	;Animation-Mode=1 oder Single-Picture-Mode??
FASTMEMflag	dc.w	0	;RawMemoryFast=1 oder ChipMem?

load.ftestbuf	ds.b	12	;also used by anim.s
load.compression dc.b	0
load.MASKPLANE	dc.b	0
load.filehandle	dc.l	0
load.ifflength	dc.l	0
load.iffmem	dc.l	0
load.pagesize	dc.l	0
load.pagesizexorg dc.w	0
load.depth	dc.w	0
load.modeid	dc.l	0,0	;current , original (backup)
load.cmapchunk	dc.l	0
load.bodychunk	dc.l	0
load.rawmemory	dc.l	0
load.rawmemlen	dc.l	0

loadfile	move.l	dosbase(pc),a6
		move.l	#pathname,d1
		move.l	#MODE_OLDFILE,d2
		LIBCALL	Open
		move.l	d0,load.filehandle-j(a5)
		move.l	#nofiletext,op.RC
		move.l	d0,d7
		beq	.nofile

		move.l	d7,d1
		lea	load.ftestbuf(pc),a2
		move.l	a2,d2
		moveq	#12,d3
		LIBCALL	Read
		move.l	#falschelaenget,op.RC
		cmp.l	#12,d0
		bne	.noiff

		cmp.l	#"FORM",(a2)
		bne	loadfile.noiff
		cmp.l	#"ILBM",8(a2)
		bne	loadfile.noiff

		bsr	ClosePic
		bsr	DeallocPictureSpace

		move.l	4(a2),d3
		subq.l	#4,d3
		move.l	d3,load.ifflength-j(a5)
		move.l	d3,d0
		moveq	#0,d1
		move.l	4.w,a6
		LIBCALL	AllocVec
		move.l	#nomemtext,op.RC
		move.l	d0,load.iffmem-j(a5)
		beq	.noiff
		move.l	d0,a2

		move.l	d0,d2			* Load IFF file
		move.l	d7,d1
		move.l	dosbase(pc),a6
		LIBCALL	Read
		move.l	#falschelaenget,op.RC
		cmp.l	load.ifflength(pc),d0
		bne	.wronglen

		move.l	a2,a1			* Find chunks
		add.l	d3,a1
		move.l	a2,a0
		move.l	#"BMHD",d1
		bsr	FindChunk
		move.l	#missingchunkt,op.RC
		tst.l	d0
		beq	.wronglen

		move.l	d0,a0
		bsr	GetILBMData
		move.l	d0,load.pagesize-j(a5)
		move.w	d4,load.pagesizexorg-j(a5)
		move.w	d1,load.depth-j(a5)
		move.b	d2,load.MASKPLANE-j(a5)
		move.l	#unknowncompr,op.RC
		cmp.b	#1,d3
		bhi	.wronglen

		move.b	d3,load.compression-j(a5)
		move.l	#falschedepth,op.RC
		cmp.w	#8,d1
		bhi	.wronglen

		move.l	a2,a0
		move.l	#"BODY",d1
		bsr	FindChunk
		move.l	d0,load.bodychunk-j(a5)
		beq	.wronglen

		move.l	a2,a0
		move.l	#"CMAP",d1
		bsr	FindChunk
		move.l	d0,load.cmapchunk-j(a5)
		beq	.wronglen

		clr.l	load.modeid-j(a5)
		move.l	a2,a0
		move.l	#"CAMG",d1
		bsr	FindChunk
		tst.l	d0
		beq	.nocamg
		move.l	d0,a2
		move.l	8(a2),load.modeid-j(a5)

.nocamg		bsr	GetRawMemory
		move.l	#nomemtext,op.RC
		tst.l	d0
		beq	.wronglen

		move.l	load.bodychunk(pc),a0
		move.l	load.rawmemory(pc),a1
		move.l	a1,a2
		add.l	load.rawmemlen(pc),a2
		tst.b	load.compression-j(a5)
		beq.s	.0
		bsr	DecrunchBODY
		bra.s	.decok
.0		move.l	#ftype_ilbm0,current_ftype-j(a5)
		addq.l	#8,a0
.1		move.b	(a0)+,(a1)+
		cmp.l	a2,a1
		bne.s	.1

.decok		bsr	ClearRightBorder

		move.b	load.MASKPLANE(pc),d0	* Remove mask plane
		beq.s	.nomask
		move.l	#nofuckt,op.RC
		cmp.b	#1,d0
		bne.s	.nofuck
		bsr	FuckMaskPlane
		tst.w	d0
		beq.s	.nofuck

.nomask		move.l	load.cmapchunk(pc),a1	* Create color table
		move.l	4(a1),d0
		addq.w	#8,a1
		divu	#3,d0
		moveq	#0,d2
		bsr	MakeColorTable
		move.l	#nomemtext,op.RC
		move.l	d0,colortable-j(a5)
		beq.s	.nofuck
		move.l	d1,colortablelength-j(a5)

.coltabok	bsr	DoPicturePreps

		clr.l	op.RC
		bra.s	.wronglen

.nofuck		move.l	load.rawmemory(pc),a1
		move.l	4.w,a6
		LIBCALL	FreeVec
		clr.l	load.rawmemory

.wronglen	move.l	4.w,a6
		move.l	load.iffmem(pc),a1
		LIBCALL	FreeVec

.noiff		move.l	dosbase(pc),a6
		move.l	load.filehandle(pc),d1
		LIBCALL	Close

.nofile		move.l	op.RC(pc),d0
		beq.s	.okay
		move.l	d0,a0
		bsr	type
		moveq	#5,d0
.okay		rts

GetRawMemory	clr.w	FASTMEMflag-j(a5)
		move.w	load.pagesize(pc),d1
		lsr.w	#3,d1
		move.w	load.depth(pc),d0
		add.b	load.MASKPLANE(pc),d0
		mulu.w	load.pagesize+2(pc),d0
		ext.l	d1
		mulu.l	d1,d0
		move.l	d0,load.rawmemlen-j(a5)
		move.l	4.w,a6
		move.l	#MEMF_CHIP|MEMF_PUBLIC,d1
		LIBCALL	AllocVec
		move.l	d0,load.rawmemory-j(a5)
		bne.s	.ende

		st	FASTMEMflag-j(a5)	* (Try a FastMem buffer)
		move.l	load.rawmemlen(pc),d0
		moveq	#MEMF_PUBLIC,d1
		LIBCALL	AllocVec
		move.l	d0,load.rawmemory-j(a5)
.ende		rts

*
* Try to load animation
*

loadfile.noiff
		cmp.l	#"ANIM",8(a2)
		bne	loadfile.dt

		bsr	ClosePic
		bsr	DeallocPictureSpace

		lea	analt(pc),a0
		bsr	type

		clr.w	FASTMEMflag-j(a5)
		bsr	AnimInitLoad
		move.l	d0,load.rawmemory-j(a5)
		beq.s	.err

		move.w	#1,ANIMATIONflag-j(a5)

		lea	animlstruct(pc),a0
		move.l	als_pagesize(a0),load.pagesize-j(a5)
		move.l	als_modeid(a0),load.modeid-j(a5)
		move.w	als_depth(a0),load.depth-j(a5)
		move.l	als_coltab(a0),d0
		move.l	d0,colortable-j(a5)
		move.l	als_coltablen(a0),colortablelength-j(a5)

		bsr	DoPicturePreps
		bsr	EnableAnimGadgets

		clr.l	op.RC

.err		move.l	op.RC(pc),d0
		beq.s	.okay
		move.l	d0,a0
		bsr	type
		moveq	#5,d0
.okay		rts

*
* Try to load via DataTypes
*

loadfile.dt	move.l	dosbase(pc),a6
		move.l	load.filehandle(pc),d1
		LIBCALL	Close

		move.l	#noifftext,op.RC
		move.l	dtbase(pc),a6
		beq	.nodt

		lea	loadingdtt(pc),a0
		bsr	type

		move.l	#pathname,d0
		lea	.newobject_tags(pc),a0
		LIBCALL	NewDTObjectA
		move.l	d0,.dto
		bne.s	.dtokay
		move.l	dosbase(pc),a6
		LIBCALL	IoErr
		cmp.l	#ERROR_OBJECT_WRONG_TYPE,d0
		beq	.nodt
		move.l	#nomemtext,op.RC
		cmp.l	#ERROR_NO_FREE_STORE,d0
		beq	.nodt
		move.l	#dterrt,op.RC
		bra	.nodt

.dtokay		lea	.frameinfo(pc),a0	* Clear FrameInfo structure
		move.w	#.frameinfol-1,d0
.clearfri	clr.b	(a0)+
		dbra	d0,.clearfri

		move.l	.dto(pc),a0		* Get BMHD
		lea	.getdtattrs1_tags(pc),a2
		LIBCALL	GetDTAttrsA

		move.l	#dterrt,op.RC
		move.l	.bmhdpt(pc),d0
		beq	.nobmhd

		bsr	ClosePic
		bsr	DeallocPictureSpace

		move.l	.bmhdpt(pc),a0
		subq.l	#8,a0
		bsr	GetILBMData
		move.l	d0,load.pagesize-j(a5)
		move.w	d4,load.pagesizexorg-j(a5)
		move.w	d1,load.depth-j(a5)
		move.b	d2,load.MASKPLANE-j(a5)

		move.l	#falschedepth,op.RC
		cmp.w	#8,load.depth
		bhi	.nobmhd

		lea	.frameinfo(pc),a1
		move.w	d4,14(a1)
		move.w	d0,18(a1)

		move.l	.dto(pc),a0
		sub.l	a1,a1
		sub.l	a2,a2
		lea	.dtframebox(pc),a3
		move.l	dtbase(pc),a6
		LIBCALL	DoDTMethodA		* Specify Frame Box

		move.l	.dto(pc),a0
		sub.l	a1,a1
		sub.l	a2,a2
		lea	.proclayout(pc),a3
		LIBCALL	DoDTMethodA		* DTM_PROCLAYOUT

		move.l	.dto(pc),a0		* Get BMHD and BITMAP !!!!!
		lea	.getdtattrs2_tags(pc),a2
		LIBCALL	GetDTAttrsA

		move.l	#dterrt,op.RC
		tst.l	.bitmappt
		beq	.nobmhd
		tst.l	load.cmapchunk
		beq	.nobmhd

		* Now we have the bitmap - make a copy!
		move.l	gfxbase(pc),a6
		move.l	.bitmappt(pc),a2
		move.l	a2,a0
		moveq	#BMA_FLAGS,d1
		LIBCALL	GetBitMapAttr
		move.l	d0,d3
		btst	#BMB_STANDARD,d3
		beq	.nobmhd
		move.l	a2,a0
		moveq	#BMA_WIDTH,d1
		LIBCALL	GetBitMapAttr
		move.l	d0,d6
		lsr.l	#3,d6

		move.l	load.cmapchunk(pc),a1
		move.l	.numcolors(pc),d0
		moveq	#1,d2
		bsr	MakeColorTable
		move.l	#nomemtext,op.RC
		move.l	d0,colortable
		beq	.nobmhd
		move.l	d1,colortablelength

		bsr	GetRawMemory
		tst.l	d0
		beq	.norawmem

		move.l	load.rawmemory(pc),a1
		lea	bm_Planes(a2),a2
		move.w	load.depth(pc),d2
		subq.w	#1,d2
		move.w	load.pagesize(pc),d5
		lsr.w	#3,d5
		sub.w	d5,d6
		move.w	load.pagesize+2(pc),d4

		btst	#BMB_INTERLEAVED,d3
		bne.s	.interleaved

		move.w	d2,d3			* Copy from non-interleaved to
		mulu.w	d5,d3			* interleaved
		add.l	d6,d3
		subq.w	#1,d4
.copylooppl	move.l	(a2)+,a0
		move.l	a1,a4
		move.w	d4,d0
.copyloopy	move.w	d5,d7
		subq.w	#1,d7
.copyloopx	move.b	(a0)+,(a4)+
		dbra	d7,.copyloopx
		add.l	d3,a4
		dbra	d0,.copyloopy
		add.w	d5,a1
		dbra	d2,.copylooppl
		bra.s	.copied

.interleaved	mulu.w	load.depth(pc),d4	* Copy from interleaved to
		move.l	(a2),a2			* interleaved
.copyiline	move.w	d5,d7
		subq.w	#1,d7
.copyilinel	move.b	(a2)+,(a1)+		; I would have used OS functions, but
		dbra	d7,.copyilinel		; they wouldn't like rawmemory being in
		add.l	d6,a2			; FastMem.
		subq.l	#1,d4
		bne.s	.copyiline

.copied		bsr	ClearRightBorder

		move.l	.dtn(pc),a0		* Get base name
		move.l	dtn_Header(a0),a0
		move.l	dth_BaseName(a0),a0
		lea	.ftype(pc),a1
		move.l	a1,current_ftype
		moveq	#6,d0
.cftype		move.b	(a0)+,(a1)+
		dbeq	d0,.cftype

		bsr	DoPicturePreps

		clr.l	op.RC
		bra.s	.nobmhd

.norawmem	bsr	FreeColorTable

.nobmhd		move.l	dtbase(pc),a6
		move.l	.dto(pc),a0
		LIBCALL	DisposeDTObject

.nodt		move.l	op.RC(pc),d0
		beq.s	.okay
		move.l	d0,a0
		bsr	type
		moveq	#5,d0
.okay		rts

.newobject_tags	dc.l	DTA_GroupID, GID_PICTURE
		dc.l	PDTA_Remap, 0
		dc.l	PDTA_FreeSourceBitMap, 1
		dc.l	TAG_DONE
.dto		dc.l	0

.getdtattrs1_tags
		dc.l	PDTA_BitMapHeader, .bmhdpt
		dc.l	TAG_DONE

.getdtattrs2_tags
		dc.l	PDTA_DestBitMap, .bitmappt
		dc.l	PDTA_CRegs, load.cmapchunk
		dc.l	PDTA_NumColors, .numcolors
		dc.l	PDTA_ModeID, load.modeid
		dc.l	DTA_DataType, .dtn
		dc.l	TAG_DONE
.frameinfo	dc.l	0
		dc.w	0,0
		dc.b	0,0,0,0
		dc.l	0,0,0
		dc.l	0
		dc.l	0
		dc.l	0
.frameinfol	equ	*-.frameinfo

.bmhdpt		dc.l	0
.bitmappt	dc.l	0
.numcolors	dc.l	0
.dtn		dc.l	0
.ftype		dc.l	0,0

.dtframebox	dc.l	DTM_FRAMEBOX
		dc.l	0,.frameinfo,.frameinfo,.frameinfol,FRAMEF_SPECIFY

.proclayout	dc.l	DTM_PROCLAYOUT
		dc.l	0,1

*******************************************************************
*******************************************************************

OpenPic		movem.l	d2-d7/a2-a6,-(sp)

		moveq	#0,d7
		tst.l	window-j(a5)
		beq	.ende

		tst.w	noshow_global-j(a5)
		bne	.ende

		tst.w	NOSHOWflag-j(a5)
		bne	.ende

		tst.l	load.rawmemory-j(a5)
		beq	.ende

		move.l	#fastbuffert,d7
		tst.w	FASTMEMflag-j(a5)
		bne	.ende

		bsr	ClosePic

		* Init screen size (and take care of minimum size)
		move.l	load.pagesize(pc),shownewscreen+4-j(a5)
		move.l	wbscreen(pc),a0		
		moveq	#0,d0
		move.b	sc_BarHeight(a0),d0
		addq.w	#2,d0
		move.w	d0,showwindowpicy-j(a5)
		add.w	d0,shownewscreen+6-j(a5)
		addq.w	#3,shownewscreen+6-j(a5)
		move.w	load.depth(pc),shownewscreen+8-j(a5)
		move.w	#SCRMINWIDTH,d2
		move.w	shownewscreen+4(pc),d0
		cmp.w	d2,d0
		bcc.s	.03
		move.w	d2,shownewscreen+4-j(a5)
.03		move.w	#SCRMINHEIGHT,d2
		move.w	shownewscreen+6(pc),d0
		cmp.w	d2,d0
		bcc.s	.04
		move.w	d2,shownewscreen+6-j(a5)
.04
		move.l	gfxbase(pc),a6		* Make place for coords screen
		sub.l	a0,a0
		lea	buf1,a1
		moveq	#dim_SIZEOF,d0
		move.l	#DTAG_DIMS,d1
		move.l	load.modeid(pc),d2
		LIBCALL	GetDisplayInfoData
		move.l	#nodimsinfot,d7
		tst.l	d0
		beq	.ende

		move.w	buf1+dim_MaxDepth,d0
		move.l	#depthoverflowt,d7
		cmp.w	load.depth(pc),d0
		bcs	.ende

		movem.w	buf1+dim_Nominal,d0-d3
		tst.w	show_coords-j(a5)
		beq.s	.010
		sub.w	#15,d3
.010		movem.w	d0-d3,showscreendisprect-j(a5)

		move.l	intbase(pc),a6
		lea	shownewscreen(pc),a0
		lea	shownewscreentags(pc),a1
		move.l	load.modeid(pc),4(a1)
		move.l	colortable(pc),12(a1)
		LIBCALL	OpenScreenTagList
		move.l	#noscreent,d7
		move.l	d0,showscreen-j(a5)
		beq	.ende
		move.l	d0,a0
		move.l	sc_RastPort+rp_BitMap(a0),showscreenbitmap-j(a5)

		move.l	intbase(pc),a6
		sub.l	a0,a0
		lea	shownewwindowtags(pc),a1
		move.l	showscreen(pc),0*8+4(a1)
		move.w	shownewscreen+4(pc),1*8+6(a1)
		move.w	shownewscreen+6(pc),2*8+6(a1)
		LIBCALL	OpenWindowTagList
		move.l	d0,showwindowa-j(a5)
		beq	.nowin
		move.l	d0,a0
		LIBCALL	ActivateWindow

		move.l	showwindowa(pc),a0
		move.l	wd_RPort(a0),showwindowrastport-j(a5)
		move.l	wd_UserPort(a0),a0
		move.l	a0,showwindowport-j(a5)
		move.b	MP_SIGBIT(a0),Signal.showwin-j(a5)

		bsr	BlitImageToScreen
		bsr	DrawRange
		moveq	#0,d7

		tst.w	show_coords-j(a5)
		beq	.ende
		move.l	load.modeid(pc),coordsnewscreentags+4-j(a5)
		move.w	showscreendisprect+6(pc),d0
		add.w	#5,d0
		move.w	d0,coordsnewscreen+2-j(a5)
		move.w	showscreendisprect+4(pc),d0
		sub.w	showscreendisprect(pc),d0
		addq.w	#1,d0
		move.w	d0,coordsnewscreen+4-j(a5)
		move.l	intbase(pc),a6
		lea	coordsnewscreen(pc),a0
		lea	coordsnewscreentags(pc),a1
		LIBCALL	OpenScreenTagList
		move.l	d0,coordsscreen-j(a5)
		beq.s	.ende
		move.l	gfxbase(pc),a6
		move.l	d0,a4
		lea	sc_RastPort(a4),a4
		move.l	a4,a1
		moveq	#0,d0
		LIBCALL	SetAPen
		move.l	a4,a1
		moveq	#RP_JAM2,d0
		LIBCALL	SetDrMd
		move.l	a4,a1
		moveq	#1,d0
		moveq	#1,d1
		movem.w	coordsnewscreen+4(pc),d2/d3
		subq.w	#2,d2
		subq.w	#2,d3
		LIBCALL	RectFill
		move.l	a4,a1
		moveq	#1,d0
		LIBCALL	SetAPen
		bra.s	.ende

.nowin		move.l	intbase(pc),a6
		move.l	showscreen(pc),a0
		LIBCALL	CloseScreen
		clr.l	showscreen

.ende		move.l	d7,d0
		beq.s	.end
		move.l	d0,a0
		bsr	type
		moveq	#-1,d0
.end		not.l	d0
		movem.l	(sp)+,d2-d7/a2-a6
		rts


ClosePic
		movem.l	d2-d7/a2-a6,-(sp)
		bsr	cr_Close
		move.l	intbase(pc),a6
		move.l	coordsscreen(pc),a0
		move.l	a0,d0
		beq.s	.01
		LIBCALL	CloseScreen
		clr.l	coordsscreen-j(a5)

.01		move.l	showwindowa(pc),a0
		move.l	a0,d0
		beq.s	.00
		LIBCALL	CloseWindow
		st	Signal.showwin-j(a5)
		clr.l	showwindowa-j(a5)

.00		move.l	showscreen(pc),a0
		move.l	a0,d0
		beq.s	.0
		LIBCALL	CloseScreen
		clr.l	showscreen-j(a5)
.0		moveq	#0,d0
		movem.l	(sp)+,d2-d7/a2-a6
		rts

DeallocPictureSpace
		movem.l	d2-d7/a2-a6,-(sp)
		bsr	DisableSaveGadgets
		bsr	DisableAnimGadgets

		tst.w	ANIMATIONflag-j(a5)
		bne.s	.anim
		move.l	4.w,a6
		move.l	load.rawmemory(pc),a1
		LIBCALL	FreeVec
		bsr	FreeColorTable
		bra.s	.cont

.anim		bsr	AnimClose
		clr.w	ANIMATIONflag-j(a5)

.cont		clr.l	current_ftype-j(a5)
		bsr	ActFrameNumber
		clr.l	load.rawmemory-j(a5)
		clr.l	load.rawmemlen-j(a5)
		clr.l	load.pagesize-j(a5)
		clr.w	load.pagesizexorg-j(a5)
		clr.w	load.depth-j(a5)
		clr.l	save.range-j(a5)
		clr.l	save.range+4-j(a5)
		clr.l	colortable-j(a5)
		clr.l	colortablelength-j(a5)
		clr.w	FASTMEMflag-j(a5)
		move.l	#INVALID_ID,d0
		bsr	SetModeID
		movem.l	(sp)+,d2-d7/a2-a6
		rts

FreeColorTable	move.l	4.w,a6
		move.l	colortable(pc),a1
		LIBCALL	FreeVec
		clr.l	colortable-j(a5)
		clr.l	colortablelength-j(a5)
		rts

shownewscreen	dc.w	0,0,0,0,0
		dc.b	-1,-1
		dc.w	0,$f
		dc.l	textattr,snstitle,0,0
snstitle	dc.b	"AGAiff:"
snstitlemod	ds.b	30
		even
shownewscreentags
		dc.l	SA_DisplayID,0
		dc.l	SA_Colors32,0
		dc.l	SA_Interleaved,1
		dc.l	SA_AutoScroll,1
		dc.l	SA_DClip,showscreendisprect
		dc.l	SA_Pens,snspens0
		dc.l	SA_MinimizeISG,1
		dc.l	TAG_DONE
showscreendisprect
		dc.w	0,0,0,0
snspens0	dc.l	-1
showscreen	dc.l	0
showscreenbitmap dc.l	0

shownewwindowtags
		dc.l	WA_CustomScreen, 0
		dc.l	WA_Width, 0
		dc.l	WA_Height, 0
		dc.l	WA_IDCMP,IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE|IDCMP_RAWKEY|IDCMP_REFRESHWINDOW
		dc.l	WA_Flags,WFLG_RMBTRAP|WFLG_BORDERLESS|WFLG_BACKDROP|WFLG_REPORTMOUSE|WFLG_SIMPLE_REFRESH
;		dc.l	WA_BackFill,LAYERS_NOBACKFILL
		dc.l	TAG_DONE

showwindowa	dc.l	0
showwindowport	dc.l	0
showwindowrastport
		dc.l	0
showwindowpicy	dc.w	0
coordsnewscreen	dc.w	0,0,0,11,1
		dc.b	-1,-1
		dc.w	0,$f
		dc.l	cnstextattr,0,0,0
coordsnewscreentags
		dc.l	SA_DisplayID,0
		dc.l	SA_Draggable,0
		dc.l	SA_Colors,coordscolors
		dc.l	SA_MinimizeISG,1
		dc.l	TAG_DONE
cnstextattr	dc.l	topazname
		dc.w	8,0
coordsscreen	dc.l	0
coordscolors	dc.w	0,0,0,0
		dc.w	1,$c,$c,$c
		dc.w	-1
colortable	dc.l	0
colortablelength dc.l	0

*
* Copy the frame onto the screen. This is a hack, but works
* with the current AmigaOS. (Who said there will be a future
* version, hmm?!?)
*

BlitImageToScreen
		tst.l	window-j(a5)
		beq.s	.not

		lea	buf1,a3
		movem.w	load.pagesize(pc),d0/d1
		move.w	load.depth(pc),d2
		move.w	d2,d3
		move.b	d2,bm_Depth(a3)
		lsr.w	#3,d0
		mulu.w	d0,d2
		move.w	d2,bm_BytesPerRow(a3)
		move.w	d1,bm_Rows(a3)
		clr.b	bm_Flags(a3)
		move.w	#$805c,bm_Pad(a3)		* dunno why -> OS does it this way!
		move.l	load.rawmemory(pc),a0
		subq.w	#1,d3
		lea	bm_Planes(a3),a1
.lp		move.l	a0,(a1)+
		add.w	d0,a0
		dbra	d3,.lp

		move.l	gfxbase(pc),a6
		move.l	a3,a0
		moveq	#0,d0
		moveq	#0,d1
		move.l	showwindowrastport(pc),a1
		moveq	#0,d2
		move.w	showwindowpicy(pc),d3
		movem.w	load.pagesize(pc),d4/d5
		move.b	#$c0,d6
		LIBCALL	BltBitMapRastPort
.not		rts

*
* Remove the mask plane from the picture
*

FuckMaskPlane
		move.w	load.pagesize(pc),d0
		lsr.w	#3,d0
		move.w	load.pagesize+2(pc),d1
		move.w	load.depth(pc),d2

		move.w	d1,d6
		mulu.w	d2,d6
		mulu.w	d0,d6
		move.l	d6,load.rawmemlen

		move.w	d0,d4
		lsr.w	#1,d4
		mulu.w	d2,d4
		subq.w	#1,d4

		move.l	load.rawmemory(pc),a0
		move.l	a0,a1

		subq.w	#1,d1
.yloop		move.w	d4,d3
.xloop		move.w	(a0)+,(a1)+
		dbra	d3,.xloop
		add.w	d0,a0
		dbra	d1,.yloop
		rts

*
* Clear the rightmost unused bits of the picture
*

ClearRightBorder
		move.w	load.pagesize(pc),d0
		move.w	load.pagesizexorg(pc),d1
		move.w	d0,d2
		sub.w	d1,d0
		beq.s	.not

		move.l	load.rawmemory(pc),a0
		lsr.w	#3,d2
		subq.l	#2,a0

		moveq	#1,d1
		lsl.l	d0,d1
		subq.l	#1,d1
		not.w	d1	;Bitmaske

		move.w	load.pagesize+2(pc),d3
		mulu.w	load.depth(pc),d3
		subq.w	#1,d3
.lp		add.w	d2,a0
		and.w	d1,(a0)
		dbra	d3,.lp
.not		rts

*
* Do the usual preparations, the same for ILBM, ANIM and DataTypes loader.
*

DoPicturePreps	move.w	load.pagesizexorg(pc),d6
		move.w	load.pagesize+2(pc),d7

		move.l	gadbase(pc),a6
		move.l	picygadget(pc),a0
		move.l	window(pc),a1
		sub.l	a2,a2
		move.l	#TAG_DONE,-(sp)
		ext.l	d7
		move.l	d7,-(sp)
		move.l	#GTNM_Number,-(sp)
		move.l	sp,a3
		LIBCALL	GT_SetGadgetAttrsA
		move.l	picxgadget(pc),a0
		move.l	window(pc),a1
		move.w	d6,6(a3)
		LIBCALL	GT_SetGadgetAttrsA
		add.w	#12,sp

		subq.w	#1,d7
		subq.w	#1,d6
		clr.w	d4
		clr.w	d5
		movem.w	d4-d7,save.range
		tst.w	range_locked
		beq.s	.nolock

		movem.w	save.rangelock(pc),d0-d3
		cmp.w	d6,d0
		bls.s	.1
		move.w	d6,d0
.1		cmp.w	d7,d1
		bls.s	.2
		move.w	d7,d1
.2		cmp.w	d6,d2
		bls.s	.3
		move.w	d6,d2
.3		cmp.w	d7,d3
		bls.s	.4
		move.w	d7,d3
.4		movem.w	d0-d3,save.range

.nolock		bsr	UpdateRangeGadgets

		* Now find the right Mode ID!
		move.l	sp,a4
		move.l	#TAG_DONE,-(sp)
		
		tst.w	promote_screen-j(a5)
		beq.s	.0
		move.l	promote_monitor(pc),-(sp)
		move.l	#BIDTAG_MonitorID,-(sp)

.0		move.l	load.modeid(pc),d0
		and.l	#~(MONITOR_ID_MASK|$4000),d0
		move.l	d0,-(sp)
		move.l	#BIDTAG_SourceID,-(sp)

		moveq	#0,d0
		move.w	load.pagesize(pc),d0
		move.l	d0,-(sp)
		move.l	#BIDTAG_DesiredWidth,-(sp)

		move.w	load.pagesize+2(pc),d0
		move.l	d0,-(sp)
		move.l	#BIDTAG_DesiredHeight,-(sp)

		move.w	load.depth(pc),d0
		move.l	d0,-(sp)
		move.l	#BIDTAG_Depth,-(sp)

		move.l	sp,a0
		move.l	gfxbase(pc),a6
		LIBCALL	BestModeIDA
		move.l	a4,sp

		bsr	SetModeID
		move.l	load.modeid(pc),load.modeid+4-j(a5)

		bsr	ActFrameNumber
		bsr	OpenPic
		bsr	EnableSaveGadgets
		rts
