/* Program to hit GfxBase flags to force it into pal mode */

#define FAIL goto quit

struct IntuitionBase *IntuitionBase = NULL;
struct GfxBase *GfxBase = NULL;

struct Screen *(*OldOpenScreen)(struct NewScreen *);
struct MsgPort *myport = NULL;
struct Message dummy;

struct Screen *NewOpenScreen( struct NewScreen *ns );
#pragma regcall (NewOpenScrInterface( a0 ))
struct Screen *NewOpenScrInterface( struct NewScreen *ns );
#pragma regcall (NewOpenScrInterface( a0 ))
struct Screen *NormOpenScreen( struct NewScreen *ns );
#pragma regcall(NormOpenScreen( a0 ))

struct TagItem MyTags[] =
{
	{ SA_DisplayID, PAL_MONITOR_ID },
	{ TAG_END, 0 }
};

void main()
{
	GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",37);
	if(!GfxBase)
	{
		puts("Must be graphics.library v.37 or higher!");
		FAIL;
	}

	if((GfxBase->ChipRevBits0 & 3) != 3)
	{
		puts("Requires ECS Denise AND ECS Agnus!");
		FAIL;
	}

	IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",37);
	if(!IntuitionBase)
	{
		puts("Must be intuition.library v.37 or higher!");
		FAIL;
	}

	myport = FindPort("NiceScreens");
	if(myport)
	{
		PutMsg(myport,&dummy);
		myport = NULL;
		FAIL;
	}

	myport = CreatePort("NiceScreens",0);
	if(!myport)
	{
		puts("Error - Could not create NiceScreens port");
		FAIL;
	}

	OldOpenScreen = SetFunction((struct Library *)IntuitionBase,0xff3a,NewOpenScreen);
	Wait( 1 << myport->mp_SigBit );
	puts("Cleaning up NiceScreens");
	DeletePort(myport);
	SetFunction((struct Library *)IntuitionBase,0xff3a,OldOpenScreen);

quit:
	if(IntuitionBase) CloseLibrary((struct Library *)IntuitionBase );
}

#asm
_NewOpenScreen:
		xref	_geta4

		movem.l	a2-a5/d2-d7,-(sp)
		bsr		_NewOpenScrInterface
		movem.l	(sp)+,a2-a5/d2-d7
		rts

_NormOpenScreen:
		movea.l	_OldOpenScreen,a1
		jmp		(a1)
#endasm

struct Screen *OpenScreenTagList(struct NewScreen *,struct TagItem *);

#if 0
void DumpNewScreen( struct NewScreen *ns )
{
	KPrintF("LeftEdge = %ld\n",ns->LeftEdge);
	KPrintF("TopEdge = %ld\n",ns->TopEdge);
	KPrintF("Width = %ld\n",ns->Width);
	KPrintF("Height = %ld\n",ns->Height);
	KPrintF("Depth = %ld\n",ns->Depth);
	KPrintF("ViewModes = %lx\n",ns->ViewModes);
	KPrintF("Type = %lx\n",ns->Type);
	KPrintF("DefaultTitle = %s\n",ns->DefaultTitle);
}
#endif

struct Screen *NewOpenScrInterface( struct NewScreen *ns )
{
	struct Screen *sc;
	geta4();
/*	DumpNewScreen(ns); */
	MyTags[0].ti_Data = PAL_MONITOR_ID | (ns->ViewModes & 0x8464);
	if( ns->ViewModes & LACE )
		if( ns->Height < 432 )
			sc = NormOpenScreen(ns);
		else
			sc = OpenScreenTagList(ns,MyTags);
	else
		if( ns->Height < 216 )
			sc = NormOpenScreen(ns);
		else
			sc = OpenScreenTagList(ns,MyTags);
	return sc;
}
