                                                                /* FRCBUG2.C
******************************************************************************
        Erroneous elimination of function calls at high optimization levels.

        SMALL memory model, OPTIMIZE level 5
*****************************************************************************/
#include        <reg515.h>

idata unsigned char CHKSUM, temp, a_b_code, n_r_code, DATA1, r_count;
idata unsigned char CUSTCODE=0x2C;

int send()
{       P1=0xFF;
        WDT=1;
        SWDT=1;
        temp=0;
        do {++temp; } while(temp < 50);
        do
        {}
        while(TI == 0);
        TB8=1;
        TI=0;
        SBUF=CUSTCODE; }

void setup()
{       PCON=0x80;
        ADCON=0x00;
        SCON=0xCB;
        TMOD=0x20;
        TCON=0x40;
        TH1=251;
        SWDT=1;
        WDT=1;
        a_b_code=0;
        temp=0; }

main()
{       setup();

        send();
LOOP:   CHKSUM=0;
        CHKSUM += CUSTCODE;
        temp=a_b_code;
        if(P5 == 0xFE) a_b_code=0x55;
        else if(P5 == 0xFD) a_b_code=0xAA;

        if(temp != a_b_code)
        {       CHKSUM += a_b_code;
                n_r_code=0xCC;
                CHKSUM += n_r_code;
                DATA1=0xFF;
                CHKSUM += DATA1;
                r_count=0;
                do
                {       ++r_count;
/*************
The call to send() is erroneously optimized away in the following line:
*************/
                        send(); }
                while(r_count<150); }
        else
        {       n_r_code=0x33;
                CHKSUM += a_b_code; }
        goto LOOP; }

