/*******************************************/
/*   Modul : 16MHZ.C                       */
/* Aufgabe : Schaltet in 16MHZ-Modus mit   */
/*           eingeschaltetem Cache         */
/*******************************************/


# include <portab.h>
# include <stdio.h>
# include <string.h>
# include <tos.h>


typedef struct
{
	UBYTE  id[4];
	LONG   value;
} COOKIE_STRUCT;



/* Prototypen */
LONG SuperOn( VOID );
VOID SuperOff( LONG adr );
WORD FindCookie( UBYTE *id, LONG *value );




WORD main( VOID )
{
	LONG cvalue,
	     ret;


	/* COOKIE suchen */
	if( !FindCookie( "_MCH", &cvalue ) )
		return( -1 );


	/* Kein STE ?? */
	if( (WORD)(cvalue >> 16) != 1 )
		return( -2 );


	ret = SuperOn();

	/* Modus umschalten */
	*(BYTE *)0xFF8E21L = 3;

	SuperOff( ret );


	puts( "\n\033p            16MHz             \033q" );
	puts( "      by Markus H”vener \n\n" );


	return( 0 );
}


/********************************************/
/* Schaltet in den Supervisormode           */
/********************************************/
LONG SuperOn( VOID )
{
	return( Super( (VOID*)1L )
	        ? 0L
	        : Super( (VOID *)0L ) );
}


/********************************************/
/* Schaltet ihn wieder aus                  */
/********************************************/
VOID SuperOff( LONG adr )
{
	if( adr )
		Super( (VOID *)adr );
}


/********************************************/
/* Sucht einen COOKIE                       */
/********************************************/
WORD FindCookie( UBYTE *id, LONG *value )
{
	COOKIE_STRUCT  *jar;
	LONG           i = 0,
	               ret;


	/* Zeiger auf den Jar holen */
	ret = SuperOn();
	jar = (COOKIE_STRUCT *)(*((LONG **)0x5a0L));
	SuperOff( ret );


	/* Kein Jar vorhanden */
	if( !jar )
		return( 0 );



	/* Solange der NULL-Cookie nicht erreicht ist */
	while( *((LONG *)&jar[i]) )
		if( !strncmp( jar[i].id, id, 4L ) )
		{
			/* Wert des Cookies eintragen */
			if( value != NULL )
				*value = jar[i].value;
				
			return( 1 );
		}
		else
			++i;
		

	/* Nicht gefunden... */
	return( 0 );
}