
#define CALL(addr)      (((void(*)(void))(char code *)addr)())


void emergency_exit(void)
{
  unsigned char i;

  for( i = 1; i; ){             // 8 consecutive zeros = run Philips bootloader
    i += i;
    if( P3_7 && P3_6 )
      i++;
    if( i == 0xFF )             // 8 consecutive ones = run user bootloader
      return;
  }

  EA = 0;

  SP = 7 - 2;                   // Stackpointer = reset value !!!

  AUXR1 |= AUXR1_ENBOOT;        // enable boot
  CALL( 0xFC00 );               // invoke Philips bootloader
}
