#define mc * 8/3

void delai(int compte)
{
	while(--compte);
}
/*********************************************************/
void shot(int d0, int d1, int d2)
{ 
	FEECTL|=ENPE;
	
	do delai(d1);
	while(--d0);
	
	FEECTL&=~ENPE;
	delai(d2);
}
/*********************************************************/
char efface_Flasha(void)
{
	char i, j,k;
	
	if( ! (FEECTL & SVFP) )
	return (0);
	
	FEECTL = ERAS + LAT;
	
	for(*(int *)0x800=j=1 ; (i=cleared())&&(j<=5);j++)
	shot(110,1000 mc,1000 mc);
	
	if(i)
	do shot(110,1000 mc,1000 mc);
	while(--j);
	
	i=cleared();
	
	FEECTL &= ~LAT;
	
	return i;
	
}

/*********************************************************/
unsigned char ecrire_Flash(int data, volatile int *address)
{

6564

	unsigned char i,j,k;
	
	FEECTL = LAT;
	*address = data;
	
	for(j=1; (i=*address!=data) && (j<=50); j++)
	shot(1,25 mc,10 mc);
	
	if(!i)
	do shot(1,25 mc,10 mc);
	while(--j);
	i=*address == data;
	FEECTL &=~LAT;
	return i;
	
	
}
/*********************************************************/
char cleared(void)
{
	for(int *a = (int *)0x8000; a< (int *)0xF800; )
	if(*a++ != 0xFFFF)
	return 0;
	return 1;
}
/*********************************************************/
void main(void)
{
	if( efface_Flash() )
	ecrire_Flash(0x1234, (int *)0x8000);
}
/*********************************************************/
