
/************************************************************************/
/*									*/
/*			Bit Pointer Implementation			*/
/*									*/
/*			SFR bits can not be accessed !			*/
/*									*/
/*		Author: Peter Dannegger					*/
/*									*/
/************************************************************************/
#pragma cd

typedef unsigned char uchar;
typedef unsigned int uint;


#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;
}
