
#define CALL(addr)      (((void(*)(void))(char code *)addr)())


void emergency_exit(void)
{
  unsigned char i;

  for( i = 0x55; i; ){          // 8 consecutive zeros = run Philips bootloader
    i <<= 1;
    if( P3_7 && P3_6 )          // check /RD or /WR if pulled low
      i++;
    if( i == 0xFF )             // 8 consecutive ones = run user bootloader
      return;
  }

  EA = 0;
  AUXR1 |= 0x20;                // enable boot
  CALL( 0xFC00 );               // invoke Philips bootloader
}
