/*
**	Start.c
**
**	The program entry point
**
**	Copyright © 1990-1996 by Olaf `Olsen' Barthel
**		All Rights Reserved
**
**	:ts=4
*/

#include <intuition/intuitionbase.h>
#include <workbench/workbench.h>
#include <exec/execbase.h>
#include <dos/dosextens.h>

#include <clib/intuition_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>

#include <pragmas/intuition_pragmas.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/dos_pragmas.h>

#include <string.h>

	/* Standard topaz.font/8. */

extern struct TextAttr	 DefaultFont;

	/* exec.library base pointer. */

extern struct ExecBase	*SysBase;

	/* The appropriate machine type check. */

#if defined(CPU_ANY) || defined(CPU_any)
#define MACHINE_OKAY (1)
#endif

#if defined(CPU_68020) || defined(CPU_68030)
#define MACHINE_OKAY (SysBase->AttnFlags & AFF_68020)
#endif

#if defined(CPU_68040)
#define MACHINE_OKAY (SysBase->AttnFlags & AFF_68040)
#endif

	/* Start():
	 *
	 *	Program entry point, checks for the right CPU type and
	 *	runs the main program if possible.
	 */

LONG __saveds __stdargs
Start(VOID)
{
		/* Get SysBase. */

	SysBase = *(struct ExecBase **)4;

		/* Is the minimum required processor type and Kickstart 2.04 (or higher)
		 * available?
		 */

	if(MACHINE_OKAY && (SysBase->LibNode.lib_Version > 37 || (SysBase->LibNode.lib_Version == 37 && SysBase->SoftVer >= 175)))
	{
			// Without the typedef the syntax would make you go nuts...

		typedef LONG (* SPINY)(VOID);

		extern SPINY SpinyNorman(VOID);

		return((*SpinyNorman())());
	}
	else
	{
		struct Process *ThisProcess = (struct Process *)FindTask(NULL);

			/* Is a Shell window available? */

		if(ThisProcess->pr_CLI)
		{
			struct DosLibrary *DOSBase;

				/* Show the message. */

			if(DOSBase = (struct DosLibrary *)OpenLibrary("dos.library",0))
			{
				STRPTR String;

				if(MACHINE_OKAY)
					String = "Kickstart 2.04 or higher required.\a\n";
				else
					String = "MC68020 or higher required.\a\n";

				Write(Output(),String,strlen(String));

				CloseLibrary(DOSBase);
			}

			return(RETURN_FAIL);
		}
		else
		{
			struct IntuitionBase	*IntuitionBase;
			struct WBStartup		*WBenchMsg;

				/* Wait for startup message. */

			WaitPort(&ThisProcess->pr_MsgPort);

				/* Get the message. */

			WBenchMsg = (struct WBStartup *)GetMsg(&ThisProcess->pr_MsgPort);

				/* Show the message. */

			if(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0))
			{
				STATIC struct IntuiText SorryText = {0,1,JAM1,6,3,&DefaultFont,(STRPTR)"Sorry",NULL};

				struct IntuiText	*Body;
				LONG				 Width;

				if(MACHINE_OKAY)
				{
					STATIC struct IntuiText BodyText = {0,1,JAM1,5,3,&DefaultFont,(STRPTR)"Kickstart 2.04 or higher required.",NULL};

					Body	= &BodyText;
					Width	= 309;
				}
				else
				{
					STATIC struct IntuiText BodyText = {0,1,JAM1,5,3,&DefaultFont,(STRPTR)"MC68020 or higher required.",NULL};

					Body	= &BodyText;
					Width	= 253;
				}

				AutoRequest(NULL,Body,NULL,&SorryText,NULL,NULL,Width,46);

				CloseLibrary(IntuitionBase);
			}

				/* Return the startup message and exit. */

			Forbid();

			ReplyMsg((struct Message *)WBenchMsg);
		}
	}
}
