
unsigned char bdata ccon_hold; // assign CCON holder to bdata area for performance
sbit cf_hold = ccon_hold^7;
sbit ccf4_hold = ccon_hold^4;
sbit ccf3_hold = ccon_hold^3;
sbit ccf2_hold = ccon_hold^2;
sbit ccf1_hold = ccon_hold^1;
sbit ccf0_hold = ccon_hold^0;

void PCA_ISR(void) interrupt 6 using 1
{
   ccon_hold = CCON;        // hold flags
   if (ccf0_hold) {         // handle module 0
      PCA0Long.C[3] = CCAP0L;  // hold capture
      PCA0Long.C[2] = CCAP0H;
      PCA0Long.I[0] = PCA_Extension;
      if (cf_hold && (CCAP0H & 0x80) == 0) // rollover occurred before capture
         PCA0Long.I[0]++;
      CCF0 = 0;
   }
...
   if (cf_hold) {    // on rollover, increment extended byte(s) 
      PCA_Extension++;
      CF = 0;
   }
}