////////////////////////////////////////////////////////////
//
//
// FUNCTION void EraseFlash (void)
//
// erase flash page
//

void EraseFlash (void)
{
U8 xdata *  EFLpag = 0;
U8          EFLbnk = 0;

  for ( EFLbnk = 2 ; EFLbnk != 4 ; EFLbnk++)
  {
    for (EFLpag = 0;  EFLpag != 0x8000;   EFLpag = EFLpag + 1024)
    {
      EraseFlashPage (EFLpag, EFLbnk);
    }
  }
}




////////////////////////////////////////////////////////////
//
//
// FUNCTION void EraseFlashPage (U8 xdata * EFLpage, U8 EFLbank)
//
// erase flash page
//

void EraseFlashPage (U8 xdata * EFLpage, U8 EFLbank)
{
U8 EFPintsav;

  EFLpage += 0x8000;

  EFPintsav   = SG_IE;
  SG_IE = 0;
  SG_SFRPAGE  = 0;
  SG_PSBANK   = (EFLbank << 4); 
  S0_FLSCL   |= 0x01     ; // flash access
  S0_PSCTL   |= 0x02     ; // erase flash      
  S0_PSCTL   |= 0x01     ; // erase flash      
  *EFLpage    =  0xff    ; //write a byte as page indicator
  S0_PSCTL   &= 0xfc     ; // restore     
  S0_FLSCL   &= 0xfe     ; // restore
  SG_PSBANK   = 0x10      ;
  SG_IE = EFPintsav;  
}