/************************************************************************/ /* */ /* Bit Pointer Implementation */ /* */ /* SFR bits can not be accessed ! */ /* */ /************************************************************************/ #pragma cd #include #define BIT_START 0x20 static uint getibit( uchar bitptr ) { uchar code bitmask[] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 }; return (uint)bitmask[bitptr & 7] << 8 | // high byte = bit mask (uchar)(bitptr / 8 + BIT_START); // low byte = byte address } void setibit( uchar bitptr ) // *bitptr = 1; { uint mask_addr = getibit( bitptr ); *(uchar idata *)(mask_addr |= mask_addr >> 8; } void clribit( uchar bitptr ) // *bitptr = 0; { uint mask_addr = getibit( bitptr ); *(uchar idata *)mask_addr &= ~(mask_addr >> 8); } void cplibit( uchar bitptr ) // *bitptr ^= 1; { uint mask_addr = getibit( bitptr ); *(uchar idata *)mask_addr ^= ~(mask_addr >> 8); } void movibit( uchar bitptr, bit inbit ) // *bitptr = inbit; { inbit ? setibit( bitptr ) : clribit( bitptr ); } bit tstibit( uchar bitptr ) // return *bitptr; { uint mask_addr = getibit( bitptr ); return *(uchar idata *)mask_addr & mask_addr >> 8; }