EvalWindowMessage
		move.l	gadbase(pc),a6
		move.l	windowport(pc),a0
		LIBCALL	GT_GetIMsg
		tst.l	d0
		beq.s	.1
		move.l	d0,a1
		move.l	$14(a1),d4	;Class
		move.w	$18(a1),d5	;Code
		move.w	$1a(a1),d6	;Qualifier
		move.l	$1c(a1),a4	;IAddress
		LIBCALL	GT_ReplyIMsg
		tst.w	GUI_locknestcnt-j(a5)
		bne.s	.002
		bsr	ewm1
.002		tst.l	window-j(a5)
		bne.s	EvalWindowMessage
.1		rts

ewm1		cmp.l	#IDCMP_CLOSEWINDOW,d4
		beq	.HideWin
		cmp.l	#IDCMP_GADGETUP,d4
		beq	HandleGadgets
		cmp.l	#IDCMP_MOUSEBUTTONS,d4
		beq.s	.01
		cmp.l	#IDCMP_VANILLAKEY,d4
		beq.s	.Vanillakey
		cmp.l	#IDCMP_RAWKEY,d4
		beq.s	.RawKey
		rts

.01		btst	#IEQUALIFIERB_RBUTTON,d6
		beq.w	.00
		bra	ShowPictureScreen
.00		rts

.HideWin	tst.w	ok_freecx-j(a5)
		bne.s	.02
		st	w4mquitflag
.02		bra	HideWindow

.RawKey		lea	.rktab(pc),a0
		bra.s	.loop

.Vanillakey	lea	.tab(pc),a0

.loop		move.b	(a0),d0
		bmi.s	.ende
		cmp.b	d0,d5
		bne.s	.loopon
		lea	.tab(pc),a1
		add.w	2(a0),a1
		jmp	(a1)
.loopon		addq.l	#4,a0
		bra.s	.loop
.ende		rts

.tab		dc.b	"l",0
		dc.w	HG_load-.tab
		dc.b	"s",0
		dc.w	HG_save-.tab
		dc.b	"r",0
		dc.w	.range-.tab
		dc.b	"p",0
		dc.w	OpenPrefsWindow-.tab
		dc.b	"x",0
		dc.w	DoARexxWindow-.tab
		dc.b	13,0
		dc.w	ShowPictureScreen-.tab
		dc.b	"a",0
		dc.w	.incsave1-.tab
		dc.b	"A",0
		dc.w	.incsave2-.tab
		dc.b	"o",0
		dc.w	.inccols1-.tab
		dc.b	"O",0
		dc.w	.inccols2-.tab
		dc.b	-1,0

.rktab		dc.b	$4e,0
		dc.w	HG_next-.tab
		dc.b	-1,0

.range		tst.w	save_disabled-j(a5)
		bne.s	.e1
		move.l	intbase(pc),a6
		move.l	rangeX1gadget(pc),a0
		move.l	window(pc),a1
		sub.l	a2,a2
		LIBCALL	ActivateGadget
.e1		rts

.incsave1
		move.l	sfor1gadget(pc),a0
		lea	actsaveformat1(pc),a1
		moveq	#10,d0
		bra.s	DoCycInc

.incsave2
		move.l	sfor2gadget(pc),a0
		lea	actsaveformat2(pc),a1
		moveq	#2,d0
		bra.s	DoCycInc

.inccols1
		move.l	cfor1gadget(pc),a0
		lea	actcolsformat1(pc),a1
		moveq	#3,d0
		bra.s	DoCycInc

.inccols2
		move.l	cfor2gadget(pc),a0
		lea	actcolsformat2(pc),a1
		moveq	#7,d0

DoCycInc
		addq.w	#1,(a1)
		cmp.w	(a1),d0
		bne.s	.ok1
		clr.w	(a1)
.ok1		lea	.sgt(pc),a3
		move.w	(a1),6(a3)
		move.l	window(pc),a1
		sub.l	a2,a2
		move.l	gadbase(pc),a6
		LIBJMP	GT_SetGadgetAttrsA
.sgt		dc.l	GTCY_Active,0
		dc.l	TAG_DONE

ShowPictureScreen
		move.l	intbase(pc),a6
		move.l	showscreen(pc),d0
		beq.s	.00
		move.l	d0,a0
		LIBCALL	ScreenToFront
		move.l	showwindowa(pc),a0
		LIBCALL	ActivateWindow
		move.l	coordsscreen(pc),d0
		beq.s	.00
		move.l	d0,a0
		LIBCALL	ScreenToFront
.00		rts

HandleGadgets	sub.l	a0,a0
		bsr	type
		move.w	38(a4),d0
		lea	HGjumps(pc),a0
		add.w	(a0,d0.w*2),a0
		jmp	(a0)

HGjumps		dc.w	HG_listview-HGjumps
		dc.w	HG_savefI-HGjumps
		dc.w	HG_savefII-HGjumps
		dc.w	HG_colsI-HGjumps
		dc.w	HG_colsII-HGjumps
		dc.w	HG_load-HGjumps
		dc.w	HG_save-HGjumps
		dc.w	QuitAll-HGjumps
		dc.w	HG_rangeX1-HGjumps
		dc.w	HG_rangeY1-HGjumps
		dc.w	HG_rangeX2-HGjumps
		dc.w	HG_rangeY2-HGjumps
		dc.w	OpenPresetsWindow-HGjumps
		dc.w	DoARexxWindow-HGjumps
		dc.w	HG_reshow-HGjumps
		dc.w	HG_restore-HGjumps
		dc.w	OpenPrefsWindow-HGjumps
		dc.w	HG_next-HGjumps

HG_listview	lea	DispModeList+LH_HEAD(pc),a0
.find		move.l	(a0),a0
		dbra	d5,.find		
		move.l	LN_SIZE+32(a0),d0
		move.l	load.modeid(pc),d1
		and.l	#EXTRAHALFBRITE_KEY|HAM_KEY,d1
		or.l	d1,d0
		bra	SetModeID

HG_savefI	move.w	d5,actsaveformat1-j(a5)
		rts

HG_savefII	move.w	d5,actsaveformat2-j(a5)
		rts

HG_colsI	move.w	d5,actcolsformat1-j(a5)
		rts

HG_colsII	move.w	d5,actcolsformat2-j(a5)
		rts

HG_load		move.l	window(pc),aslloadtags+4-j(a5)
		clr.w	NOSHOWflag-j(a5)
		move.l	aslbase-j(a5),a6
		move.l	aslfilerequest(pc),d7
		move.l	d7,a0
		lea	aslloadtags-j(a5),a1
		LIBCALL	AslRequest
		tst.l	d0
		bne.s	.001
		rts
.001		move.l	d7,a0
		move.l	4(a0),d2
		move.l	8(a0),a0
		lea	pathname,a1
		move.w	#199,d0
.1		move.b	(a0)+,d1
		move.b	d1,(a1)+
		dbeq	d0,.1
		move.l	#pathname,d1
		move.l	#200,d3
		move.l	dosbase(pc),a6
		LIBCALL	AddPart
		move.l	d7,a0
		move.l	4(a0),a0
		lea	snstitlemod(pc),a1
		moveq	#28,d0
.666		move.b	(a0)+,(a1)+
		dbra	d0,.666
		clr.b	(a1)+
LOADentry	move.l	window(pc),a0
		bsr	LockWindow
		bsr	loadfile
		move.l	d0,-(sp)
		tst.w	GUI_locknestcnt
		bne.s	.00
		move.l	window(pc),a0
		bsr	UnlockWindow
.00		move.l	(sp)+,d0
		rts

aslloadtags	dc.l	ASL_Window,0
		dc.l	ASL_Hail,aslloadtitle
		dc.l	ASLFR_SleepWindow,1
		dc.l	ASLFR_RejectIcons,1
		dc.l	ASLFR_DoSaveMode,0
		dc.l	TAG_DONE
aslsavetags	dc.l	ASL_Window,0
		dc.l	ASL_Hail,aslsavetitle
		dc.l	ASLFR_DoSaveMode,1
		dc.l	ASLFR_SleepWindow,1
		dc.l	ASLFR_RejectIcons,1
		dc.l	TAG_DONE
aslloadtitle	dc.b	"Load Picture",0
aslsavetitle	dc.b	"Save Data",0
		even

save_disabled	dc.w	1
HG_save		tst.w	save_disabled-j(a5)
		bne.s	.ende
		move.l	window(pc),aslsavetags+4-j(a5)
		move.l	aslbase-j(a5),a6
		move.l	aslfilerequest2(pc),d7
		move.l	d7,a0
		lea	aslsavetags(pc),a1
		LIBCALL	AslRequest
		tst.l	d0
		bne.s	.001
.ende		rts
.001		move.l	d7,a0
		move.l	4(a0),d2
		move.l	8(a0),a0
		lea	savepathname,a1
		move.w	#199,d0
.1		move.b	(a0)+,d1
		move.b	d1,(a1)+
		dbeq	d0,.1
		move.l	#savepathname,d1
		move.l	#200,d3
		move.l	dosbase(pc),a6
		LIBCALL	AddPart
SAVEentry	move.l	window(pc),a0
		bsr	LockWindow
		move.w	actsaveformat1(pc),d0
		move.l	.table1(pc,d0.w*4),a0
		tst.w	save_close_pic-j(a5)
		beq.s	.0
		move.l	a0,-(sp)
		bsr	ClosePic
		move.l	(sp)+,a0
.0		jsr	(a0)
		move.w	d0,d4
		beq.s	.err
		tst.w	save_close_pic-j(a5)
		beq.s	.1
		bsr	OpenPic
.1		lea	savedt(pc),a0
		bsr	type
.err		tst.w	GUI_locknestcnt
		bne.s	.00
		move.l	window(pc),a0
		bsr	UnlockWindow
.00		move.w	d4,d0
		rts
.table1		dc.l	saveIFF,saveRAWn,saveRAWb,saveNoPic,saveCopper
		dc.l	saveSprite,saveMask,saveMask1pl
		dc.l	saveChunkyRegs,saveChunkyCols

OpenSaveFile
		move.l	dosbase(pc),a6
		move.l	#savepathname,d1
		move.l	#MODE_NEWFILE,d2
		LIBCALL	Open
		move.l	#nofiletext,op.RC
		move.l	d0,save.filehandle-j(a5)
		rts

CloseSaveFile
		move.l	dosbase(pc),a6
		move.l	save.filehandle(pc),d1
		LIBJMP	Close


HG_rangeX1	movem.w	save.range(pc),d0-d3
		move.l	gg_SpecialInfo(a4),a4
		move.w	si_LongInt+2(a4),d0
		movem.w	d0-d3,save.rangecopy-j(a5)
		bra	HandleRangeGadgets

HG_rangeY1	movem.w	save.range(pc),d0-d3
		move.l	gg_SpecialInfo(a4),a4
		move.w	si_LongInt+2(a4),d1
		movem.w	d0-d3,save.rangecopy-j(a5)
		bra	HandleRangeGadgets

HG_rangeX2	movem.w	save.range(pc),d0-d3
		move.l	gg_SpecialInfo(a4),a4
		move.w	si_LongInt+2(a4),d2
		tst.w	range_mode-j(a5)
		beq.s	.0
		add.w	save.range(pc),d2
		subq.w	#1,d2
.0		movem.w	d0-d3,save.rangecopy-j(a5)
		bra	HandleRangeGadgets

HG_rangeY2	movem.w	save.range(pc),d0-d3
		move.l	gg_SpecialInfo(a4),a4
		move.w	si_LongInt+2(a4),d3
		tst.w	range_mode-j(a5)
		beq.s	.0
		add.w	save.range+2(pc),d3
		subq.w	#1,d3
.0		movem.w	d0-d3,save.rangecopy-j(a5)
		bra	HandleRangeGadgets

HandleRangeGadgets
		bsr	DrawRange
		movem.w	save.rangecopy(pc),d4-d7
		cmp.w	load.pagesizexorg(pc),d4
		bcc	.error
		cmp.w	load.pagesize+2(pc),d5
		bcc	.error
		cmp.w	load.pagesizexorg(pc),d6
		bcc	.error
		cmp.w	load.pagesize+2(pc),d7	
		bcc	.error
		movem.w	d4-d7,save.range-j(a5)
.cont		bsr	DrawRange
		bsr	UpdateRangeGadgets
		rts
.error		lea	outarangetext(pc),a0
		bsr	type
		bra	.cont

HG_reshow	bsr	ClosePic
		clr.w	NOSHOWflag-j(a5)
		bsr	OpenPic
		rts

HG_restore
		move.l	load.modeid+4(pc),d0
		bsr	SetModeID
		bsr	ClosePic
		bra	OpenPic

type		movem.l	a2/a3/a6,-(sp)
		move.l	window(pc),d0
		beq.s	.nowindow
		lea	settexttags(pc),a3
		move.l	a0,4(a3)
		move.l	textgadget(pc),a0
		move.l	d0,a1
		sub.l	a2,a2
		move.l	gadbase(pc),a6
		LIBCALL	GT_SetGadgetAttrsA
.nowindow	movem.l	(sp)+,a2/a3/a6
		rts
settexttags	dc.l	GTTX_Text,0
		dc.l	TAG_DONE

HG_next
		tst.w	animlstruct-j(a5)
		beq	err10
		bsr	AnimNextPicture
		tst.l	d0
		beq	err10
		move.l	d0,load.rawmemory-j(a5)
		lea	animlstruct(pc),a0
		move.l	als_coltab(a0),d0
		move.l	d0,colortable-j(a5)
		move.l	als_coltablen(a0),colortablelength-j(a5)

		tst.l	showscreen-j(a5)
		beq.s	.nodisplay

		bsr	BlitImageToScreen
		bsr	DrawRange
		move.l	gfxbase(pc),a6
		move.l	showscreen(pc),a0
		lea	sc_ViewPort(a0),a0
		move.l	colortable(pc),a1
		LIBCALL	LoadRGB32

.nodisplay	bsr	ActFrameNumber
		moveq	#0,d0
		rts

*
* Set load.modeid to the one specified in d0. If it is illegal, keep
* the old value. Update the gadgets. INVALID_ID is accepted, which
* clears the gadgets (not yet).
*

SetModeID
		movem.l	d2-d7/a2-a4/a6,-(sp)
		move.l	d0,d2
		move.l	gfxbase(pc),a6
		LIBCALL	ModeNotAvailable
		tst.l	d0
		bne.s	.ende
		move.l	d2,load.modeid
.ende		bsr	UpdateModeID
		movem.l	(sp)+,d2-d7/a2-a4/a6
		rts

*
* Get load.modeid (which is guaranteed to contain an existing
* display mode ID) and update the corresponding main window gadgets.
*

UpdateModeID
		movem.l	d2-d7/a2-a4/a6,-(sp)
		tst.l	window
		beq	.ende

		move.l	load.modeid(pc),d5
		move.l	d5,d0
		and.l	#~(EXTRAHALFBRITE_KEY|HAM_KEY),d0
		move.l	DispModeList+LH_HEAD(pc),a4
		moveq	#0,d1
.find		tst.l	(a4)
		beq	.ende
		cmp.l	LN_SIZE+32(a4),d0
		beq.s	.found
		addq.w	#1,d1
		move.l	(a4),a4
		bra.s	.find

.found		move.l	listgadget(pc),a0
		move.l	window(pc),a1
		sub.l	a2,a2
		move.l	#TAG_DONE,-(sp)
		ext.l	d1
		move.l	d1,-(sp)
		move.l	#GTLV_Selected,-(sp)
		move.l	d1,-(sp)
		move.l	#GTLV_MakeVisible,-(sp)
		move.l	sp,a3
		move.l	gadbase(pc),a6
		LIBCALL	GT_SetGadgetAttrsA	;Set listview
		add.w	#20,sp

		move.w	LN_SIZE+32+4(a4),-(sp)
		move.w	load.depth(pc),-(sp)
		pea	.str(pc)
		move.l	depthgadget(pc),-(sp)
		bsr	PrintFGad
		add.w	#12,sp			;Set depth

		lea	modeIDtextmod(pc),a0
		moveq	#7,d1
		move.l	d5,d0
.1		rol.l	#4,d0
		move.b	d0,d2
		and.b	#$f,d2
		add.b	#48,d2
		cmp.b	#58,d2
		bcs.s	.2
		addq.b	#7,d2
.2		move.b	d2,(a0)+
		dbra	d1,.1

		lea	settexttags(pc),a3
		move.l	#modeIDtext2,4(a3)
		move.l	modeidtgadget(pc),a0
		move.l	window(pc),a1
		sub.l	a2,a2
		LIBCALL	GT_SetGadgetAttrsA	;Set ModeID

		lea	.strnormal(pc),a0
		btst	#7,d5
		beq.s	.10
		lea	.strehb(pc),a0
.10		btst	#11,d5
		beq.s	.11
		lea	.strham(pc),a0
.11		lea	settexttags(pc),a3
		move.l	a0,4(a3)
		move.l	modegadget(pc),a0
		move.l	window(pc),a1
		sub.l	a2,a2
		LIBCALL	GT_SetGadgetAttrsA	;Set Type

.ende		movem.l	(sp)+,d2-d7/a2-a4/a6
		rts
.str		dc.b	"%u of %u",0
.strnormal	dc.b	"Normal",0
.strham		dc.b	"HAM",0
.strehb		dc.b	"EHB",0
		even

*
* Update the save format cycle gadgets
*

UpdateFormatGadgets
		move.w	actsaveformat1(pc),d0
		move.l	sfor1gadget(pc),a0
		bsr	SetCycleGadget
		move.w	actsaveformat2(pc),d0
		move.l	sfor2gadget(pc),a0
		bsr	SetCycleGadget
		move.w	actcolsformat1(pc),d0
		move.l	cfor1gadget(pc),a0
		bsr	SetCycleGadget
		move.w	actcolsformat2(pc),d0
		move.l	cfor2gadget(pc),a0
		bra	SetCycleGadget

*
* Update the save range gadgets and normalize save range.
*

UpdateRangeGadgets
		movem.w	save.range(pc),d4-d7
		cmp.w	d4,d6
		bcc.s	.00
		exg	d4,d6
.00		cmp.w	d5,d7
		bcc.s	.01
		exg	d5,d7
.01		movem.w	d4-d7,save.range-j(a5)

		tst.w	range_mode-j(a5)
		beq.s	.0
		sub.w	d4,d6
		sub.w	d5,d7
		addq.w	#1,d6
		addq.w	#1,d7
.0
		move.l	rangeX1gadget(pc),a0
		moveq	#0,d0
		move.w	d4,d0
		bsr	SetIntGadget
		move.l	rangeY1gadget(pc),a0
		moveq	#0,d0
		move.w	d5,d0
		bsr	SetIntGadget
		move.l	rangeX2gadget(pc),a0
		moveq	#0,d0
		move.w	d6,d0
		bsr	SetIntGadget
		move.l	rangeY2gadget(pc),a0
		moveq	#0,d0
		move.w	d7,d0
		bra	SetIntGadget
