ùúùú                                        	incdir	"include:"
	include	"exec/execbase.i"
	include	"libraries/gadtools.i"
	include	"libraries/gadutil.i"
	include	"libraries/gadutil_lib.i"
	include	"LVOs.i"

start:
	move.l	_AbsExecBase.w,a6
	lea.l	libdatas(pc),a2		; Open all needed libraries
	move.w	(a2)+,d2
.openlib:
	move.l	(a2),a1			; Get library name pointer
	moveq.l	#36,d0
	CallLib	OpenLibrary
	move.l	d0,(a2)+		; Save base address
	dbeq	d2,.openlib		; Continue until done or error
	beq.s	.closelibs

	bsr.w	TestProgram

.closelibs:
	lea.l	libdatas(pc),a2		; Close all opened libraries
	move.w	(a2)+,d2
.closelib:
	move.l	(a2)+,d0		; Get base address for library
	beq.s	.closedone
	move.l	d0,a1
	CallLib	CloseLibrary
	dbra	d2,.closelib
.closedone:
	moveq.l	#0,d0
	rts

;----------------------------- library data ----------------------------------
libdatas:	dc.w	5-1

dosbase:	dc.l	dosname
GUtilBase:	dc.l	gadutilname
GfxBase:	dc.l	gfxname
IntuiBase:	dc.l	intuiname
UtilBase:	dc.l	utilname

dosname:	dc.b	'dos.library',0
gadutilname:	dc.b	'gadutil.library',0
gfxname:	dc.b	'graphics.library',0
intuiname:	dc.b	'intuition.library',0
utilname:	dc.b	'utility.library',0
	even

;------------------------------ The test program -----------------------------
TestProgram:
	movem.l	d0-a6,-(sp)
;	move.l	LibList(a6),LVGTTags+4 ; Set list pointer for ListView gadget
	move.l	GUtilBase(pc),a6

	move.l	a6,a0			; Check for latest version of GadUtil
	moveq.l	#GADUTIL_VER,d0
	moveq.l	#GADUTIL_REV,d1
	CallLib	GU_CheckVersion
	beq.w	.wrongver
.verok:	
	lea.l	mybss,a5		; Get pointer to BSS
	suba.l	a0,a0			; Lock the default public screen
	CallLib	LockPubScreen,IntuiBase(pc)
	move.l	d0,screen(a5)
	beq.w	.noscreen

	lea.l	glist(pc),a0		; Pointer to gadget list pointer
	lea.l	gadgets(pc),a1		; LayoutGadget structures
	move.l	d0,a2			; Screen pointer
	lea.l	LayoutTags(pc),a3	; Tags for LayoutGadgetsA

	move.l	sc_Font(a2),textattr	; Use the screen's font
	move.l	GUtilBase(pc),a6
	CallLib	GU_LayoutGadgetsA	; Lay out the gadgets
	move.l	a0,priv_info(a5)	; Save pointer to PrivateInfo
	beq.w	.unlocksc

	lea.l	window_tags(pc),a1	; Get window tags

	move.l	screen(a5),a0		; WA_Top = screen->Font->ta_YSize + 3
	move.l	sc_Font(a0),a0
	moveq.l	#0,d0
	move.w	ta_YSize(a0),d0
	addq.w	#3,d0
	move.l	d0,WinTop(a1)
	
	move.l	farright(pc),d0		; WA_InnerWidth = farright+LEFT_OFFSET
	addq.l	#LEFT_OFFSET,d0
	move.l	d0,InnerWidth(a1)

	move.l	farbottom(pc),d0	; WA_InnerHeight = farbotton+TOP_OFFSET
	addq.l	#TOP_OFFSET*2,d0
	move.l	d0,InnerHeight(a1)

	suba.l	a0,a0			; Open the window
	CallLib	OpenWindowTagList,IntuiBase(pc)
	move.l	d0,main_win(a5)
	beq.s	.freegads		; Error opening the window

	move.l	d0,a0			; Refresh everything in the window
	move.l	priv_info(a5),a1
	CallLib	GU_RefreshWindow,GUtilBase(pc)

	move.l	main_win(a5),a0
	bsr.w	process_window_events	; Wait for and process all events
	
;------------------------------- Exit routines -------------------------------
.closewin:
	move.l	main_win(a5),a0
	CallLib	CloseWindow,IntuiBase(pc)	
.freegads:
	move.l	priv_info(a5),a0	; Free all gadgets
	move.l	GUtilBase(pc),a6
	CallLib	GU_FreeLayoutGadgets
.unlocksc:
	suba.l	a0,a0			; No name pointer
	move.l	screen(a5),a1		; Pointer to the locked screen
	CallLib	UnlockPubScreen,IntuiBase(pc)
.noscreen:
.wrongver:
	movem.l	(sp)+,d0-a6
	rts

;------------------ Wait for and process window events -----------------------
; Inputs: A0 - Window pointer
;
process_window_events:
	movem.l	d0-a6,-(sp)
.WaitEvent:
	move.l	_AbsExecBase.w,a6
	move.l	32(sp),a0		; Get pointer to window
	move.l	wd_UserPort(a0),a0	; Get UserPort
	CallLib	WaitPort		; Wait for a message
.GetEvent:
	move.l	32(sp),a0		; Get window pointer
	bsr.w	GetIMessage		; Get the message and process REFRESH
	bmi.s	.GetEvent		; Get next event if IDCMP_REFRESHWIN
	beq.s	.WaitEvent		; Continue waiting if no message

.checkgadup:
	cmp.l	#IDCMP_GADGETUP,d3	; Any gadget released ?
	bne.w	.CheckClose		; Nope!
	move.w	gg_GadgetID(a2),d1	; Get GadgetID
	bchg	#1,$bfe001
.nogadget:
	bra.w	.GetEvent

.CheckClose:
	cmp.l	#IDCMP_CLOSEWINDOW,d3	; Close gadget pressed ?
	bne.w	.GetEvent		; Nope! Get next message
.Exit
	movem.l	(sp)+,d0-a6
	rts

;---------------------- Get a message from the window ------------------------
; Input:
;	A0 = pointer to window
; Output:
;	A2 = Message IAddress
;	D2 = Message Code
;	D3 = Message Class
; Flags:
;	 Z =  1 for no message (use BEQ)
;	 Z =  0 for a valid message other than IDCMP_REFRESHWINDOW
;	 N =  1 for a IDCMP_REFRESHWINDOW message (use BMI)
;
;------------------------------------------------------------------------------
GetIMessage:
	move.l	a0,-(sp)		; Save window pointer
	move.l	wd_UserPort(a0),a0	; Get UserPort

	CallLib	GU_GetIMsg,GUtilBase(pc)
	beq.s	.NoMessage		; No message - return
	move.l	d0,a1
	move.l	im_IAddress(a1),a2	; IAddress to A2
	moveq.l	#0,d2			; Clear code longword
	move.w	im_Code(a1),d2		; Code to D2
	move.l	im_Class(a1),d3		; Class to D3
	move.l	im_MouseX(a1),msgcoords(a5)
	CallLib	GU_ReplyIMsg		; Reply the message

	cmp.l	#IDCMP_REFRESHWINDOW,d3	; Do window need to be refreshed ?
	bne.b	.NoMessage		; Nope! Check next message!
	move.l	(sp),a0
	CallLib	GU_BeginRefresh		; Start refreshing window

	move.l	(sp),a0
	move.l	priv_info(a5),a1
	CallLib	GU_RefreshBoxes

	move.l	(sp),a0
	moveq.l	#TRUE,d0
	CallLib	GU_EndRefresh		; Refreshing done
	moveq.l	#-1,d0			; Set N flag
.NoMessage:
	move.l	(sp)+,a0
	rts

;------------------------ Datas for LayoutGadgetsA ---------------------------
LayoutTags:
	dc.l	GU_RightExtreme,	farright
	dc.l	GU_LowerExtreme,	farbottom
	dc.l	GU_MinimumIDCMP,	MinimumIDCMP
ta:	dc.l	GU_DefTextAttr,		0
	dc.l	TAG_DONE

textattr:	equ	ta+4	

farright:	dc.l	0
farbottom:	dc.l	0

;------------------------------- Window datas --------------------------------

INTUIIDCMP:	equ	IDCMP_REFRESHWINDOW!IDCMP_CLOSEWINDOW
WINGADS:	equ	WFLG_DRAGBAR!WFLG_DEPTHGADGET!WFLG_CLOSEGADGET

window_tags:
	dc.l	WA_Left,	0,	WA_Top
WinTop:	equ	*-window_tags
	dc.l	0,		WA_InnerWidth
InnerWidth:EQU	*-window_tags
	dc.l	0,		WA_InnerHeight
InnerHeight:EQU	*-window_tags
	dc.l	0,		WA_IDCMP,INTUIIDCMP
MinimumIDCMP:	equ	*-4
	dc.l	WA_Flags,	WINGADS!WFLG_ACTIVATE!WFLG_SMART_REFRESH!WFLG_REPORTMOUSE
	dc.l	WA_RMBTrap,	TRUE
	dc.l	WA_Zoom,	win_zoomsize
	dc.l	WA_Gadgets
glist:	dc.l	0
	dc.l	WA_Title,WinTitle
emptytag:
	dc.l	TAG_DONE

mytextattr:	dc.l	fontname
		dc.w	8
		dc.b	0
		dc.b	FPF_DISKFONT

win_zoomsize:	dc.w	0,14,100,14

WinTitle:	dc.b	"         Programs written by me :-)   v0.01ß",0
fontname:	dc.b	"mini6.font",0

;		GadUtil			
; 60A Player	AIS		CalClock
; CDPD3Fix	CheckMsg	DiskReset
; FloppTest	IconShow	IntroMaker
; MemDisplay	MemoryX		MemTest
; NullTest	TDCarEd		VXLShell
; IncludeGuide	StructureGuide	LVOs

but01txt:	dc.b	"GadUtil",0
but02txt:	dc.b	"60A Player",0
but03txt:	dc.b	"AIS",0
but04txt:	dc.b	"CalClock",0
but05txt:	dc.b	"CDPD3Fix",0
but06txt:	dc.b	"CheckMsg",0
but07txt:	dc.b	"DiskReset",0
but08txt:	dc.b	"FloppTest",0
but09txt:	dc.b	"IconShow",0
but10txt:	dc.b	"IntroMaker",0
but11txt:	dc.b	"MemDisplay",0
but12txt:	dc.b	"MemoryX",0
but13txt:	dc.b	"MemTest",0
but14txt:	dc.b	"NullTest",0
but15txt:	dc.b	"TDCarEd",0
but16txt:	dc.b	"VXLShell",0
but17txt:	dc.b	"IncludeGuide",0
but18txt:	dc.b	"StructureGuide",0
but19txt:	dc.b	"LVOs",0
titletxt:	dc.b	"Programs written by me!",0
infotxt:	dc.b	"Created with GadUtil 37.4",0
but20txt:	dc.b	"Asm Source",0
line1txt:	dc.b	"Released programs",0
line2txt:	dc.b	"Documents",0
	even

;----------------------------- Gadget datas ----------------------------------
LEFT_OFFSET:	equ	6
TOP_OFFSET:	equ	3

BBOX1:	equ	0
GAD01:	equ	1
GAD02:	equ	2
GAD03:	equ	3
GAD04:	equ	4
GAD05:	equ	5
GAD06:	equ	6
GAD07:	equ	7
GAD08:	equ	8
GAD09:	equ	9
GAD10:	equ	10
GAD11:	equ	11
GAD12:	equ	12
GAD13:	equ	13
GAD14:	equ	14
GAD15:	equ	15
GAD16:	equ	16
GAD17:	equ	17
GAD18:	equ	18
GAD19:	equ	19
LINE1:	equ	20
LINE2:	equ	21
TEXT1:	equ	22
GAD20:	equ	23

StdGTTags:
	dc.l	GT_Underscore,	'_',		TAG_DONE
	
BBox1:	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_Left,	LEFT_OFFSET
	dc.l	GU_Top,		TOP_OFFSET,	GU_GadgetText,	titletxt
	dc.l	GU_AdjustTop,	-4
	dc.l	GU_AlignRight,	GAD01,		GU_AddWidth,	8
	dc.l	GU_AlignBottom,	GAD19,		GU_AddHeight,	INTERHEIGHT
;	dc.l	GU_Height,	100
	
	dc.l	GUBB_Flags,	BB_TEXT_IN!BB_3DTEXT!BB_SHADOW_DR
	dc.l	GUBB_TextPen,	SHINEPEN
	dc.l	GUBB_FrameType,	BFT_RIDGE,	GUBB_Recessed,	TRUE
	dc.l	TAG_DONE

Gad01:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but01txt
	dc.l	GU_AddLeft,	INTERWIDTH,	GU_AdjustTop,	0
	dc.l	GU_AutoHeight,	4,		GU_Columns,	60
StdButtonTags:
	dc.l	GU_Flags,	PLACETEXT_IN
StdGadTags:
	dc.l	GU_LabelHotkey,	TRUE		GU_TextAttr,	mytextattr
	dc.l	TAG_DONE

Line1:	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	line1txt
	dc.l	GU_AlignLeft,	GAD01,		GU_DupeWidth,	GAD01
	dc.l	GU_Height,	2,		GUBB_TextPen,	SHINEPEN
	dc.l	GU_TopRel,	GAD01,		GU_AddTop,	INTERHEIGHT
	dc.l	GUBB_FrameType,	BFT_HORIZBAR
	dc.l	GUBB_Flags,	BB_3DTEXT!BB_SHADOW_DR!BB_TEXT_IN
	dc.l	TAG_DONE
	
Gad02:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but02txt
	dc.l	GU_AlignLeft,	GAD01,		GU_TopRel,	LINE1
	dc.l	GU_AddTop,	INTERHEIGHT+2
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags
	
Gad03:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but03txt
	dc.l	GU_LeftRel,	GAD02,		GU_AlignTop,	GAD02
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad04:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but04txt
	dc.l	GU_LeftRel,	GAD03,		GU_AlignTop,	GAD02
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad05:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but05txt
	dc.l	GU_AlignLeft,	GAD01,		GU_TopRel,	GAD02
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad06:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but06txt
	dc.l	GU_LeftRel,	GAD05,		GU_AlignTop,	GAD05
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad07:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but07txt
	dc.l	GU_LeftRel,	GAD06,		GU_AlignTop,	GAD05
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad08:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but08txt
	dc.l	GU_AlignLeft,	GAD01,		GU_TopRel,	GAD05
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad09:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but09txt
	dc.l	GU_LeftRel,	GAD08,		GU_AlignTop,	GAD08
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad10:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but10txt
	dc.l	GU_LeftRel,	GAD09,		GU_AlignTop,	GAD08
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad11:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but11txt
	dc.l	GU_AlignLeft,	GAD01,		GU_TopRel,	GAD08
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad12:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but12txt
	dc.l	GU_LeftRel,	GAD11,		GU_AlignTop,	GAD11
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad13:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but13txt
	dc.l	GU_LeftRel,	GAD12,		GU_AlignTop,	GAD11
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad14:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but14txt
	dc.l	GU_AlignLeft,	GAD01,		GU_TopRel,	GAD11
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad15:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but15txt
	dc.l	GU_LeftRel,	GAD14,		GU_AlignTop,	GAD14
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad16:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but16txt
	dc.l	GU_LeftRel,	GAD15,		GU_AlignTop,	GAD14
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Line2:	dc.l	GU_GadgetKind,	BEVELBOX_KIND,	GU_GadgetText,	line2txt
	dc.l	GU_AlignLeft,	GAD01,		GU_DupeWidth,	GAD01
	dc.l	GU_Height,	2,		GUBB_TextPen,	SHINEPEN
	dc.l	GU_TopRel,	GAD16,		GU_AddTop,	INTERHEIGHT
	dc.l	GUBB_FrameType,	BFT_HORIZBAR
	dc.l	GUBB_Flags,	BB_3DTEXT!BB_SHADOW_DR!BB_TEXT_IN
	dc.l	TAG_DONE

Gad17:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but17txt
	dc.l	GU_AlignLeft,	GAD01,		GU_TopRel,	LINE2
	dc.l	GU_AddTop,	INTERHEIGHT+2
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad18:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but18txt
	dc.l	GU_AlignLeft,	GAD03,		GU_AlignTop,	GAD17
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags

Gad19:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but19txt
	dc.l	GU_LeftRel,	GAD18,		GU_AlignTop,	GAD17
	dc.l	GU_AutoHeight,	4,		GU_Columns,	20
	dc.l	TAG_MORE,	StdButtonTags
	
Text1:	dc.l	GU_GadgetKind,	LABEL_KIND,	GU_GadgetText,	infotxt
	dc.l	GU_TopRel,	GAD19,		GU_AddTop,	INTERHEIGHT*2
	dc.l	GU_AlignLeft,	GAD01,		GU_AlignRight,	GAD03
	dc.l	GULB_Flags,	LB_3DTEXT!LB_SHADOW_DR!LB_TEXT_MIDDLE_CENTER
	dc.l	GULB_TextPen,	SHINEPEN
	dc.l	TAG_DONE
	
Gad20:	dc.l	GU_GadgetKind,	BUTTON_KIND,	GU_GadgetText,	but20txt
	dc.l	GU_LeftRel,	TEXT1,		GU_AlignTop,	TEXT1
	dc.l	GU_AutoHeight,	4,		GU_AlignRight,	GAD04
	dc.l	TAG_MORE,	StdButtonTags

gadgets:
	GADGET	BBOX1,	BBox1,	NULL
	GADGET	GAD01,	Gad01,	StdGTTags
	GADGET	LINE1,	Line1,	NULL
	GADGET	GAD02,	Gad02,	StdGTTags
	GADGET	GAD03,	Gad03,	StdGTTags
	GADGET	GAD04,	Gad04,	StdGTTags
	GADGET	GAD05,	Gad05,	StdGTTags
	GADGET	GAD06,	Gad06,	StdGTTags
	GADGET	GAD07,	Gad07,	StdGTTags
	GADGET	GAD08,	Gad08,	StdGTTags
	GADGET	GAD09,	Gad09,	StdGTTags
	GADGET	GAD10,	Gad10,	StdGTTags
	GADGET	GAD11,	Gad11,	StdGTTags
	GADGET	GAD12,	Gad12,	StdGTTags
	GADGET	GAD13,	Gad13,	StdGTTags
	GADGET	GAD14,	Gad14,	StdGTTags
	GADGET	GAD15,	Gad15,	StdGTTags
	GADGET	GAD16,	Gad16,	StdGTTags
	GADGET	LINE2,	Line2,	NULL
	GADGET	GAD17,	Gad17,	StdGTTags
	GADGET	GAD18,	Gad18,	StdGTTags
	GADGET	GAD19,	Gad19,	StdGTTags
	GADGET	TEXT1,	Text1,	NULL
	GADGET	GAD20,	Gad20,	StdGTTags
	GADGET	-1,	NULL,	NULL

;------------------------------- BSS ----------------------------

	STRUCTURE	MyBSS,0
		LONG	screen
		LONG	main_win
		LONG	priv_info
		LONG	menustrip
		LONG	msgcoords
	LABEL	MyBSS_SIZEOF

	SECTION	TestProg,BSS
mybss:	ds.b	MyBSS_SIZEOF

