/*    SCRAMmer V37.3b - 27th Aug 1992
**    -------------------------------
**
**		Copyright (c)		Giuliano C. Peritore
**								Via Amaseno, 6
**								04100 Latina
**								ITALY
**
**		Phone: (+39) 773 491692 Voice Only
**		EMAIL mc6040@mclink.it
*/

/*--- Include files ------------------------------------------------*/
#include	<lattice/string.h>
#include	<lattice/stdio.h>
#include	<exec/types.h>
#include	<exec/execbase.h>
#include	<exec/memory.h>
#include	<dos/dosextens.h>
#include	<dos/rdargs.h>
#include	<dos/dos.h>
#include	<graphics/gfxbase.h>
#include	<intuition/intuitionbase.h>
#include	<workbench/workbench.h>
#include	<workbench/startup.h>

#include	<clib/dos_protos.h>
#include	<clib/icon_protos.h>
#include	<clib/graphics_protos.h>
#include	<clib/gadtools_protos.h>
#include	<clib/timer_protos.h>
#include	<clib/exec_protos.h>
#include	<clib/intuition_protos.h>
#include	<clib/dos_protos.h>
#include	<clib/wb_protos.h>

#include	<pragma/wb_lib.pragma>
#include	<pragma/icon_lib.pragma>
#include	<pragma/dos_lib.pragma>
#include	<pragma/graphics_lib.pragma>
#include	<pragma/gadtools_lib.pragma>
#include	<pragma/timer_lib.pragma>
#include	<pragma/exec_lib.pragma>
#include	<pragma/intuition_lib.pragma>
#include	<pragma/dos_lib.pragma>

#define	STRINGARRAY
#include	"SCRAMmer.h"

/*--- Preprocessor definitions -------------------------------------*/
#ifdef LATTICE
	int CXBRK(void)		{return(0);}
	int chkabort(void)	{return(0);}

	LONG	_BackGroundIO=FALSE;
	LONG	_stack=8192;
	LONG	_priority=0;
	BYTE	*_procname="ETI020_SCRAMmer3";
#endif

#define	TEMPLATE	"\
DATACACHE/S,NODATACACHE/S,DATABURST/S,NODATABURST/S,DATAFREEZE/S,NODATAFREEZE/S,\
INSTCACHE/S,NOINSTCACHE/S,INSTBURST/S,NOINSTBURST/S,INSTFREEZE/S,NOINSTFREEZE/S,\
WRITEALLOCATE/S,NOWRITEALLOCATE/S,COPYBACK/S,NOCOPYBACK/S,\
PAGEDETECT/S,NOPAGEDETECT/S,BURST/S,NOBURST/S,WRAP/S,NOWRAP/S,\
VBRFAST/S,VBRCHIP/S,BERRTIMEOUT/S,DSACKTIMEOUT/S,\
KBRSTENON/S,KBRSTENOFF/S,NOGUI/S,ICONIFY/S,PUBSCREEN/K"

/*--- Global variables ---------------------------------------------*/
UBYTE		versiontag[]="\0$VER: SCRAMmer 37.3b (9.16.92)";
UBYTE		copyright[]="\0Copyright (c) 1992 G. C. Peritore";
UWORD		xfnt,yfnt,bfnt,xwin,ywin;
APTR		vi;
UBYTE		terminated=0;
char	*toolpubsc;
ULONG mainberr;

	struct	RDArgs			*myrda;
	LONG	result[32];

/*--- Global structures --------------------------------------------*/
IMPORT	struct	ExecBase		*SysBase;
IMPORT	struct	DosLibrary	*DOSBase;

IMPORT	struct	Window	*mother_win,		*system_ram_win,
									*scsi_win,			*test_win,	*ramgar_win,
									*cpu_win,			*battmem_win,
									*battclock_win,	*about_win;

IMPORT	ULONG	amigaguidesignal;

struct	IntuitionBase	*IntuitionBase =0;
struct	GfxBase			*GfxBase       =0;
struct	WorkbenchBase	*WorkbenchBase	=0;
struct	Library			*GadToolsBase  =0,
								*IconBase		=0,
							/*	*AslBase			=0,*/
								*LocaleBase    =0;
APTR		catalog;

struct	Window			*main_window	=0;
struct	TextFont			*tf=0;
struct	RastPort			*rp=0;
struct	Screen			*def_pub_scr;
struct	Gadget			*glist=0;
struct	MsgPort			*userport;

struct	TextAttr		ta;
struct	NewGadget	ng;

/*--- ASM Function prototypes --------------------------------------*/
VOID	SetBERR(VOID);
VOID	PageDetectOn(VOID);	/* 	Execute in Disable() */
VOID	PageDetectOff(VOID);	/* 	Execute in Disable() */
VOID	BurstOn(VOID);			/* 	Execute in Disable() */
VOID	BurstOff(VOID);		/* 	Execute in Disable() */
VOID	WrapOn(VOID);			/* 	Execute in Disable() */
VOID	WrapOff(VOID);			/* 	Execute in Disable() */
VOID	SetDSACK(VOID);
VOID	SetKBRSTEN(VOID);
VOID	UnsetKBRSTEN(VOID);

/*--- External C Function prototypes -------------------------------*/
/* Defined in: WinCPU.c */
VOID	process_cpu(struct Gadget *);
VOID	refresh_cpu(VOID);
VOID	open_cpu(VOID);
VOID	close_cpu(VOID);
VOID	VBRToFast(VOID);
VOID	VBRToChip(VOID);

/* Defined in: WinRamGar.c */
VOID	process_ramgar(struct Gadget *,struct IntuiMessage*);
VOID	refresh_ramgar(VOID);
VOID	open_ramgar(VOID);
VOID	close_ramgar(VOID);

/* Defined in: WinMotherboard.c */
VOID	refresh_mother(VOID);
VOID	open_mother(VOID);
VOID	close_mother(VOID);

/* Defined in: WinHelp.c */
VOID	open_help(VOID);
VOID	close_help(VOID);
VOID	process_help(VOID);

/* Defined in: WinBattMem.c */
VOID	process_battmem(struct Gadget*,struct IntuiMessage *);
VOID	refresh_battmem(VOID);
VOID	open_battmem(VOID);
VOID	close_battmem(VOID);

/* Defined in: WinBattClock.c */
VOID	process_battclock(struct Gadget*);
VOID	refresh_battclock(VOID);
VOID	open_battclock(VOID);
VOID	close_battclock(VOID);

/* Defined in: WinTest.c */
VOID	process_test(struct Gadget*);
VOID	refresh_test(VOID);
VOID	open_test(VOID);
VOID	close_test(VOID);

/* Defined in: WinAbout.c */
VOID	refresh_about(VOID);
VOID	open_about(VOID);
VOID	close_about(VOID);

/* Defined in: WinSystemRAM.c */
VOID	refresh_system_ram(VOID);
VOID	open_system_ram(VOID);
VOID	close_system_ram(VOID);

/* Defined in: WinSCSIInfo.c */
VOID	refresh_scsi(VOID);
VOID	open_scsi(VOID);
VOID	close_scsi(VOID);

VOID	StripIntuiMessages(struct MsgPort *,struct Window *);
VOID	CloseWindowSafely(struct Window *);
VOID	ShadowText(UWORD ,UWORD, struct RastPort *,char *msg);
VOID	NormalText(UWORD ,UWORD, struct RastPort *,char *msg);
LONG	request_user(struct Window *,char *, char *, char *);
VOID	set_wait_pointer (struct Window *);
VOID	set_default_pointer (struct Window *);
VOID	sleep_window(struct Window *);
VOID	wake_window(struct Window *);

/*--- C Function prototypes ----------------------------------------*/
BOOL	open_libraries(VOID);
VOID	close_libraries(VOID);
BOOL	get_default_font(VOID);
BOOL	get_font(VOID);
BOOL	get_pub_scr(VOID);
BOOL	build_window(VOID);
VOID	unbuild_window(VOID);
VOID	process_main_win(VOID);
BOOL	make_gadgets(VOID);

STRPTR	appname;

VOID	iconify(VOID)
{
	struct	DiskObject	*dobj;
	struct	AppIcon		*appicon;
	struct	AppMessage	*appmsg;
	BOOL	clicked;
	struct	MsgPort	*appport;

	if(appport=CreateMsgPort())
	{
		if(dobj=GetDiskObject(appname))
		{
			if(appicon=AddAppIcon(0,0,appname,appport,NULL,dobj,NULL))
			{
				clicked=FALSE;
				while(!clicked)
				{
					Wait(1<<appport->mp_SigBit);
					while(appmsg=(struct AppMessage*)GetMsg(appport))
					{
							if(appmsg->am_Type==8)
							if(appmsg->am_NumArgs==0)
								clicked=TRUE;
						ReplyMsg((struct Message*)appmsg);
					}
				}
				RemoveAppIcon(appicon);
			}
			else	request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOAPPICON),GetString(MSG_CANCEL));
			FreeDiskObject(dobj);
		}
		else	request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOICONINFO),GetString(MSG_CANCEL));
		DeleteMsgPort(appport);
	}
	else
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOMSGPORT),GetString(MSG_CANCEL));
	
}

VOID	get_parameters(int pargc,char **pargv)
{
	struct	DiskObject	*dobj;
	struct	WBStartup	*argmsg;
	struct	WBArg	*wb_arg;
	char	**toolarray;
	char	*s;

	if(pargc==0)
	{	/* WB */
		argmsg=(struct WBStartup *)pargv;
		wb_arg=argmsg->sm_ArgList;

		appname=wb_arg->wa_Name;
		if(dobj=GetDiskObject(appname))
		{
			toolarray=(char**)dobj->do_ToolTypes;
			if(s=(char*)FindToolType(toolarray,"NOGUI"))					terminated=1;
			if(s=(char*)FindToolType(toolarray,"DATACACHE"))			CacheControl(CACRF_EnableD,CACRF_EnableD);
			if(s=(char*)FindToolType(toolarray,"NODATACACHE"))			CacheControl(				 0,CACRF_EnableD);
			if(s=(char*)FindToolType(toolarray,"DATABURST"))			CacheControl(CACRF_DBE    ,CACRF_DBE    );
			if(s=(char*)FindToolType(toolarray,"NODATABURST"))			CacheControl(            0,CACRF_DBE    );
			if(s=(char*)FindToolType(toolarray,"DATAFREEZE"))			CacheControl(CACRF_FreezeD,CACRF_FreezeD);
			if(s=(char*)FindToolType(toolarray,"NODATAFREEZE"))		CacheControl(            0,CACRF_FreezeD);
			if(s=(char*)FindToolType(toolarray,"INSTCACHE"))			CacheControl(CACRF_EnableI,CACRF_EnableI);
			if(s=(char*)FindToolType(toolarray,"NOINSTCACHE"))			CacheControl(            0,CACRF_EnableI);
			if(s=(char*)FindToolType(toolarray,"INSTBURST"))			CacheControl(CACRF_IBE    ,CACRF_IBE    );
			if(s=(char*)FindToolType(toolarray,"NOINSTBURST"))			CacheControl(            0,CACRF_IBE    );
			if(s=(char*)FindToolType(toolarray,"INSTFREEZE"))			CacheControl(CACRF_FreezeI,CACRF_FreezeI);
			if(s=(char*)FindToolType(toolarray,"NOINSTFREEZE"))		CacheControl(            0,CACRF_FreezeI);	
			if(s=(char*)FindToolType(toolarray,"VBRFAST"))				VBRToFast();
			if(s=(char*)FindToolType(toolarray,"VBRCHIP"))				VBRToChip();
			if(s=(char*)FindToolType(toolarray,"COPYBACK"))				CacheControl(CACRF_CopyBack,CACRF_CopyBack);
			if(s=(char*)FindToolType(toolarray,"NOCOPYBACK"))			CacheControl(             0,CACRF_CopyBack);
			if(s=(char*)FindToolType(toolarray,"WRITEALLOCATE"))		CacheControl(CACRF_WriteAllocate,CACRF_WriteAllocate);		
			if(s=(char*)FindToolType(toolarray,"NOWRITEALLOCATE"))	CacheControl(            0,CACRF_WriteAllocate);		
			if(s=(char*)FindToolType(toolarray,"PAGEDETECT"))			{Disable(); PageDetectOn(); Enable();}
			if(s=(char*)FindToolType(toolarray,"NOPAGEDETECT"))		{Disable(); PageDetectOff(); Enable();}
			if(s=(char*)FindToolType(toolarray,"BURST"))					{Disable(); BurstOn(); Enable();}
			if(s=(char*)FindToolType(toolarray,"NOBURST"))				{Disable(); BurstOff(); Enable();}
			if(s=(char*)FindToolType(toolarray,"WRAP"))					{Disable(); WrapOn(); Enable();}
			if(s=(char*)FindToolType(toolarray,"NOWRAP"))				{Disable(); WrapOff(); Enable();}
			if(s=(char*)FindToolType(toolarray,"BERRTIMEOUT"))			{SetBERR(); mainberr=1;}
			if(s=(char*)FindToolType(toolarray,"DSACKTIMEOUT"))		{SetDSACK();mainberr=2;}
			if(s=(char*)FindToolType(toolarray,"KBRSTENON"))			UnsetKBRSTEN();
			if(s=(char*)FindToolType(toolarray,"KBRSTENOFF"))			SetKBRSTEN();
			if(s=(char*)FindToolType(toolarray,"ICONIFY"))				{iconify();terminated=0;}
			toolpubsc=(char*)FindToolType(toolarray,"PUBSCREEN");
			FreeDiskObject(dobj);
		}
		else	request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOICONINFO),GetString(MSG_CANCEL));
	}
	else
	{	/*CLI*/
		FPrintf(Output(),"SCRAMmer V37.3 - Copyright © 1992 Giuliano C. Peritore\n\n");
		appname=pargv[0];
		if(myrda=(struct RDArgs *)AllocDosObject(DOS_RDARGS,NULL))
		{
			myrda->RDA_Source.CS_Buffer=0;
			myrda->RDA_Source.CS_Length=0;
			myrda->RDA_ExtHelp="Aiuto\n";
			if(ReadArgs(TEMPLATE,result,myrda))
			{
				if(result[ 0])	CacheControl(CACRF_EnableD,CACRF_EnableD);
				if(result[ 1])	CacheControl(0,CACRF_EnableD);
				if(result[ 2])	CacheControl(CACRF_DBE,CACRF_DBE);
				if(result[ 3])	CacheControl(0,CACRF_DBE);
				if(result[ 4])	CacheControl(CACRF_FreezeD,CACRF_FreezeD);
				if(result[ 5])	CacheControl(0,CACRF_FreezeD);
				if(result[ 6])	CacheControl(CACRF_EnableI,CACRF_EnableI);
				if(result[ 7])	CacheControl(0,CACRF_EnableI);
				if(result[ 8])	CacheControl(CACRF_IBE,CACRF_IBE);
				if(result[ 9])	CacheControl(0,CACRF_IBE);
				if(result[10])	CacheControl(CACRF_FreezeI,CACRF_FreezeI);
				if(result[11])	CacheControl(0,CACRF_FreezeI);
				if(result[12])	CacheControl(CACRF_WriteAllocate,CACRF_WriteAllocate);
				if(result[13])	CacheControl(0,CACRF_WriteAllocate);
				if(result[14])	CacheControl(CACRF_CopyBack,CACRF_CopyBack);
				if(result[15])	CacheControl(0,CACRF_CopyBack);
				if(result[16])	{Disable();	PageDetectOn();	Enable();}
				if(result[17])	{Disable();	PageDetectOff();	Enable();}
				if(result[18])	{Disable();	BurstOn();			Enable();}
				if(result[19])	{Disable();	BurstOff();			Enable();}
				if(result[20])	{Disable();	WrapOn();			Enable();}
				if(result[21])	{Disable();	WrapOff();			Enable();}
				if(result[22])	VBRToFast();
				if(result[23])	VBRToChip();
				if(result[24])	{SetBERR();mainberr=1;}
				if(result[25])	{SetDSACK();mainberr=2;}
				if(result[26])	UnsetKBRSTEN();
				if(result[27])	SetKBRSTEN();
				if(result[28]) terminated=1;
				if(result[29]) {iconify();terminated=0;}
				if(result[30]) toolpubsc=(char*)result[28];
				FreeArgs(myrda);
			}
			else request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_ERRORCL),GetString(MSG_CANCEL));
		}
		else request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NORDARGS),GetString(MSG_CANCEL));
		FreeDosObject(DOS_RDARGS,myrda);
	}
}
/*--- Main program -------------------------------------------------*/
VOID 	main(int argc,char **argv)
{
	struct	Process	*this_process;
	APTR	default_req_window;
	SetBERR();
	mainberr=1;

	if(LocaleBase=OpenLibrary("locale.library",38))
		catalog=OpenCatalogA(NULL,"SCRAMmer.catalog",TAG_DONE);

	if(open_libraries())
	{
		if((SysBase->AttnFlags)&AFF_68030)
		{
			if(userport=CreateMsgPort())
			{
				get_parameters(argc,argv);
				while(terminated!=1)
				{
					if(build_window())
					{
						this_process=(struct Process*)FindTask(NULL);
						default_req_window=this_process->pr_WindowPtr;
						this_process->pr_WindowPtr=main_window;

						main_window->UserPort=userport;
						AddGList(main_window,glist,-1,-1,NULL);
						RefreshGList(glist,main_window,NULL,-1);
						GT_RefreshWindow(main_window,NULL);
						ModifyIDCMP(main_window,BUTTONIDCMP|IDCMP_GADGETUP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW);
						terminated=0;
						process_main_win();
						this_process->pr_WindowPtr=default_req_window;
					}
					unbuild_window();
					if(terminated==2)
						iconify();
				}
				DeleteMsgPort(userport);
			}
			else
				request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOMSGPORT),GetString(MSG_CANCEL));
		}
		else
			request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NO68030),GetString(MSG_CANCEL));
	}
	close_libraries();

	if(LocaleBase)
	{
		if(catalog)
			CloseCatalog(catalog);
		CloseLibrary(LocaleBase);
	}
}
/*------------------------------------------------------------------*/
VOID	process_main_win(VOID)
{
	struct	IntuiMessage	*imsg;
	ULONG	msgclass;
	struct Window *msgwin;
	struct	Gadget			*gad;
	ULONG	signal;

	while(!terminated)
	{
		signal=Wait(1<<main_window->UserPort->mp_SigBit|amigaguidesignal);

		if(signal==1<<main_window->UserPort->mp_SigBit)
		{
		while((!terminated) && (imsg=GT_GetIMsg(main_window->UserPort)))
		{
			msgclass=imsg->Class;
			msgwin=imsg->IDCMPWindow;
			switch(msgclass)
			{
				case	IDCMP_GADGETDOWN:
					gad=(struct Gadget*)imsg->IAddress;
					if(imsg->IDCMPWindow==battmem_win)	process_battmem(gad,imsg);
				break;
				case	IDCMP_GADGETUP:
					gad=(struct Gadget*)imsg->IAddress;
					if(imsg->IDCMPWindow==test_win)			process_test(gad);
					if(imsg->IDCMPWindow==cpu_win)			process_cpu(gad);
					if(imsg->IDCMPWindow==ramgar_win)		process_ramgar(gad,imsg);
					if(imsg->IDCMPWindow==battmem_win)		process_battmem(gad,imsg);
					if(imsg->IDCMPWindow==battclock_win)	process_battclock(gad);
					if(imsg->IDCMPWindow==main_window)
					{
						switch(gad->GadgetID)
						{
							case 1:
								if(mother_win)
								{	WindowToFront(mother_win);			ActivateWindow(mother_win);		}
								else	open_mother();
							break;
							case 2:
								if(system_ram_win)
								{	WindowToFront(system_ram_win);	ActivateWindow(system_ram_win);	}
								else	open_system_ram();
							break;
							case 3:
								if(scsi_win)
								{	WindowToFront(scsi_win);			ActivateWindow(scsi_win);			}
								else	open_scsi();
							break;
							case 4:
								if(test_win)
								{	WindowToFront(test_win);			ActivateWindow(test_win);			}
								else	open_test();
							break;
							case	5:
								open_help();
							break;
							case 6:
								if(ramgar_win)
								{	WindowToFront(ramgar_win);			ActivateWindow(ramgar_win);		}
								else	open_ramgar();
							break;
							case 7:
								if(cpu_win)
								{	WindowToFront(cpu_win);				ActivateWindow(cpu_win);			}
								else	open_cpu();
							break;
							case 8:
								if(battmem_win)
								{	WindowToFront(battmem_win);		ActivateWindow(battmem_win);		}
								else	open_battmem();
							break;
							case 9:
								if(battclock_win)
								{	WindowToFront(battclock_win);		ActivateWindow(battclock_win);	}
								else	open_battclock();
							break;
							case 10:
								if(about_win)
								{	WindowToFront(about_win);			ActivateWindow(about_win);			}
								else	open_about();
							break;
						}
					}
				break;

				case	IDCMP_CLOSEWINDOW:
					if(imsg->IDCMPWindow==main_window)
					{
						switch(request_user(main_window,GetString(MSG_SCRAMMER),GetString(MSG_REALLY),GetString(MSG_GADQIC)))
						{
							case	0:
							break;
							case	1:
								terminated=1;
							break;
							case	2:
								terminated=2;
							break;
						}
					}
					if(msgwin==mother_win)		{GT_ReplyIMsg(imsg);	close_mother(); }
					if(msgwin==system_ram_win)	{GT_ReplyIMsg(imsg);	close_system_ram(); }
					if(msgwin==scsi_win)			{GT_ReplyIMsg(imsg);	close_scsi(); }
					if(msgwin==test_win)			{GT_ReplyIMsg(imsg);	close_test(); }
					if(msgwin==ramgar_win)		{GT_ReplyIMsg(imsg);	close_ramgar(); }
					if(msgwin==cpu_win)			{GT_ReplyIMsg(imsg);	close_cpu(); }
					if(msgwin==battmem_win)		{GT_ReplyIMsg(imsg);	close_battmem(); }
					if(msgwin==battclock_win)	{GT_ReplyIMsg(imsg);	close_battclock(); }
					if(msgwin==about_win)			{GT_ReplyIMsg(imsg);	close_about(); }
				break;

				case	IDCMP_REFRESHWINDOW:
					GT_BeginRefresh(imsg->IDCMPWindow);
					if(imsg->IDCMPWindow==mother_win)		refresh_mother();
					if(imsg->IDCMPWindow==system_ram_win)	refresh_system_ram();
					if(imsg->IDCMPWindow==scsi_win)			refresh_scsi();
					if(imsg->IDCMPWindow==test_win)			refresh_test();
					if(imsg->IDCMPWindow==ramgar_win)		refresh_ramgar();
					if(imsg->IDCMPWindow==cpu_win)			refresh_cpu();
					if(imsg->IDCMPWindow==battmem_win)		refresh_battmem();
					if(imsg->IDCMPWindow==battclock_win)	refresh_battclock();
					if(imsg->IDCMPWindow==about_win)			refresh_about();
					GT_EndRefresh(imsg->IDCMPWindow,TRUE);
				break;
			}
			if((msgclass!=IDCMP_CLOSEWINDOW) || (msgwin==main_window))
				GT_ReplyIMsg(imsg);
		}
		}
		if(signal==amigaguidesignal)
		{
			process_help();
		}
	}
	close_mother();
	close_system_ram();
	close_scsi();
	close_test();
	close_help();
	close_ramgar();
	close_cpu();
	close_battmem();
	close_battclock();
	close_about();
}

/*--- Subroutines --------------------------------------------------*/
BOOL	open_libraries(VOID)
{
	UBYTE	*alertmessage="\0xintuition.library V37 or more is required\0\0";

	if(!(IntuitionBase=(struct IntuitionBase*)OpenLibrary("intuition.library",37L)))
	{
		if(IntuitionBase=(struct IntuitionBase*)OpenLibrary("intuition.library",0L))
		{
			DisplayAlert(RECOVERY_ALERT,alertmessage,32);
			CloseLibrary(IntuitionBase);
		}
		return(FALSE);
	}

	if(SysBase->LibNode.lib_Version < 37L)
	{
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOEXEC),GetString(MSG_CANCEL));
		return(FALSE);
	}

	if(DOSBase->dl_lib.lib_Version < 37L)
	{
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NODOS),GetString(MSG_CANCEL));
		return(FALSE);
	}

	if(!(GfxBase=(struct GfxBase*)OpenLibrary("graphics.library",37L)))
	{
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOGFX),GetString(MSG_CANCEL));
		return(FALSE);
	}

	if(!(GadToolsBase=OpenLibrary("gadtools.library",37L)))
	{
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOGADTOOLS),GetString(MSG_CANCEL));
		return(FALSE);
	}

	if(!(WorkbenchBase=(struct WorkbenchBase*)OpenLibrary("workbench.library",37L)))
	{
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOWORKBENCH),GetString(MSG_CANCEL));
		return(FALSE);
	}

	{
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOICON),GetString(MSG_CANCEL));
		return(FALSE);
	}

/*	if(!(AslBase=OpenLibrary("asl.library",37L)))
	{
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOASL),GetString(MSG_CANCEL));
		return(FALSE);
	}*/

	return(TRUE);
}

VOID	close_libraries(VOID)
{
/*	if(AslBase)
		CloseLibrary(AslBase);*/
	if(IconBase)
		CloseLibrary(IconBase);
	if(WorkbenchBase)
		CloseLibrary(WorkbenchBase);
	if(GadToolsBase)
		CloseLibrary(GadToolsBase);
	if(GfxBase)
		CloseLibrary(GfxBase);
	if(IntuitionBase)
		CloseLibrary(IntuitionBase);
}
/*------------------------------------------------------------------*/
BOOL	get_default_font(VOID)
{
	Forbid();
	ta.ta_Name =GfxBase->DefaultFont->tf_Message.mn_Node.ln_Name;
	ta.ta_YSize=GfxBase->DefaultFont->tf_YSize;
	ta.ta_Style=GfxBase->DefaultFont->tf_Style;
	ta.ta_Flags=GfxBase->DefaultFont->tf_Flags;
	Permit();

	if(!(tf=OpenFont(&ta)))
	{
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NODEFFONT),GetString(MSG_CANCEL));
		return(FALSE);
	}

	xfnt=tf->tf_XSize;
	bfnt=tf->tf_Baseline;
	yfnt=tf->tf_YSize;
	if(yfnt<11)		yfnt=11;
	if(xfnt<6)		xfnt=6;
	yfnt+=3;

	xwin=(X_SEP*2) + 41*xfnt + (def_pub_scr->WBorLeft) + (def_pub_scr->WBorRight);
	ywin=(Y_SEP*2) + 10*yfnt + (def_pub_scr->WBorBottom) + (def_pub_scr->WBorTop) + (def_pub_scr->Font->ta_YSize) + 1;

	if((xwin>def_pub_scr->Width)||(ywin>def_pub_scr->Height))
	{
		CloseFont(tf);
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_BIGDEFFONT),GetString(MSG_OKAY));
		return(FALSE);
	}
	return(TRUE);
}

BOOL	get_font(VOID)
{
	if(get_default_font())
	{
		return(TRUE);
	}
	else
	{
		ta.ta_Name ="topaz.font";
		ta.ta_YSize=8;
		ta.ta_Style=FS_NORMAL;
		ta.ta_Flags=FPF_ROMFONT;
	
		if(!(tf=OpenFont(&ta)))
		{
			request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOTOPFONT),GetString(MSG_CANCEL));
			return(FALSE);
		}
	
		xfnt=tf->tf_XSize;
		bfnt=tf->tf_Baseline;
		yfnt=tf->tf_YSize;
		if(yfnt<11)		yfnt=11;
		if(xfnt<6)		xfnt=6;
		yfnt+=3;
		return(TRUE);
	}
}
/*------------------------------------------------------------------*/
BOOL	get_pub_scr(VOID)
{
	if(def_pub_scr=LockPubScreen(toolpubsc))			/* Take default p.s. */
	{
		if((def_pub_scr->Width >= 640) && (def_pub_scr->Height >= 200))
		{
			return(TRUE);
		}
		UnlockPubScreen(0,def_pub_scr);
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_SMALLPUBS),GetString(MSG_OKAY));
	}

	if(def_pub_scr=LockPubScreen(NULL))			/* Take default p.s. */
	{
		if((def_pub_scr->Width >= 640) && (def_pub_scr->Height >= 200))
		{
			return(TRUE);
		}
		UnlockPubScreen(0,def_pub_scr);
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_SMALLPUBS),GetString(MSG_OKAY));
	}

	if(def_pub_scr=LockPubScreen("Workbench"))
	{
		return(TRUE);
	}

	request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOLOCKPS),GetString(MSG_CANCEL));
	return(FALSE);
}
/*------------------------------------------------------------------*/
BOOL	build_window(VOID)
{
	UWORD	w,h;
	if(get_pub_scr())
	{
		if(vi=GetVisualInfo(def_pub_scr,TAG_DONE))
		{
			if(get_font())
			{
				if(make_gadgets())
				{
					/*ScreenToFront(def_pub_scr);*/
					w=(X_SEP*3) + LIN_X*xfnt + (def_pub_scr->WBorLeft) + (def_pub_scr->WBorRight);
					h=(Y_SEP*6) + LIN_Y*yfnt + (def_pub_scr->WBorBottom) + (def_pub_scr->WBorTop) + (def_pub_scr->Font->ta_YSize) + 1;
					if(main_window=OpenWindowTags(NULL,
						WA_Left,		3*((def_pub_scr->Width-w)>>2),
						WA_Top,		(def_pub_scr->Height-h)>>2,
						WA_Width,	w,
						WA_Height,	h,
						WA_Flags,		WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_GIMMEZEROZERO,
						WA_AutoAdjust,	FALSE,
						WA_IDCMP,		NULL,
						WA_Title,		GetString(MSG_MAINWIN),
						WA_PubScreen,	def_pub_scr,
						TAG_END))
					{
						rp=main_window->RPort;
						SetFont(rp,tf);
						UnlockPubScreen(0,def_pub_scr);
						return(TRUE);
					}
				}
			}
			FreeVisualInfo(vi);
		}
		else	request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOVISINFO),GetString(MSG_CANCEL));
		UnlockPubScreen(0,def_pub_scr);
	}
	return(FALSE);
}

VOID	unbuild_window(VOID)
{
	if(main_window)
		CloseWindowSafely(main_window);
	FreeGadgets(glist);
	if(vi)
		FreeVisualInfo(vi);
	if(tf)
		CloseFont(tf);
}

BOOL	make_gadgets(VOID)
{
	struct	Gadget	*gad;

	gad=CreateContext(&glist);
	ng.ng_TextAttr=&ta;
	ng.ng_VisualInfo=vi;
	ng.ng_Flags=		PLACETEXT_IN;
	ng.ng_Width=		xfnt*18;
	ng.ng_Height=		yfnt;
	ng.ng_LeftEdge=	X_SEP;

	ng.ng_TopEdge=Y_SEP;					ng.ng_GadgetText=GetString(MSG_GAD1);		ng.ng_GadgetID=1;
	gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_DONE);
	ng.ng_TopEdge=(Y_SEP*2)+yfnt;		ng.ng_GadgetText=GetString(MSG_GAD2);		ng.ng_GadgetID=2;
	gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_DONE);
	ng.ng_TopEdge=(Y_SEP*3)+yfnt*2;	ng.ng_GadgetText=GetString(MSG_GAD3);		ng.ng_GadgetID=3;
	gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_DONE);
	ng.ng_TopEdge=(Y_SEP*4)+yfnt*3;	ng.ng_GadgetText=GetString(MSG_GAD4);		ng.ng_GadgetID=4;
	gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_DONE);
	ng.ng_TopEdge=(Y_SEP*5)+yfnt*4;	ng.ng_GadgetText=GetString(MSG_GAD5);		ng.ng_GadgetID=5;
	gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_DONE);

	ng.ng_LeftEdge=	(X_SEP<<1)+xfnt*18;

	ng.ng_TopEdge=Y_SEP;					ng.ng_GadgetText=GetString(MSG_GAD6);		ng.ng_GadgetID=6;
	gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_DONE);
	ng.ng_TopEdge=(Y_SEP*2)+yfnt;		ng.ng_GadgetText=GetString(MSG_GAD7);			ng.ng_GadgetID=7;
	gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_DONE);
	ng.ng_TopEdge=(Y_SEP*3)+yfnt*2;	ng.ng_GadgetText=GetString(MSG_GAD8);	ng.ng_GadgetID=8;
	gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_DONE);
	ng.ng_TopEdge=(Y_SEP*4)+yfnt*3;	ng.ng_GadgetText=GetString(MSG_GAD9);	ng.ng_GadgetID=9;
	gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_DONE);
	ng.ng_TopEdge=(Y_SEP*5)+yfnt*4;	ng.ng_GadgetText=GetString(MSG_GAD10);		ng.ng_GadgetID=10;
	gad=CreateGadget(BUTTON_KIND,gad,&ng,TAG_DONE);

	if(gad)
		return(TRUE);
	else	
	{
		FreeGadgets(glist);
		request_user(0,GetString(MSG_SCRAMMER),GetString(MSG_NOGADGETS),GetString(MSG_CANCEL));
		return(FALSE);
	}

}