``````{
Sean Palmer

> What if I want to just access a bit?  Say I have a Byte, to store
> Various access levels (if it does/doesn't have this, that, or the
> other).  How can I

> 1)  Access, say, bit 4?
> 2)  Give, say, bit 4, a value of 1?

> I have a simple routine that does "GetBit:= Value SHR 1;" to return
> a value, but how can I *SET* a value?  And is the above a good
> method? I only have TP5.5, so I can't do the Asm keyWord (yet..).

You COULD use TP sets to do it...
}

Type
tByte = set of 0..7;
Var
b : Byte;

{to get:
Write('Bit 0 is ',Boolean(0 in tByte(b)));

to set:
tByte(b):=tByte(b)+[1,3,4]-[0,2];
}

Type
bitNum = 0..7;
bit    = 0..1;

Function getBit(b : Byte; n : bitNum) : bit;
begin
getBit := bit(odd(b shr n));
end;

Function setBit( b : Byte; n : bitNum) : Byte;
begin
setBit := b or (1 shl n);
end;

Function clrBit(b : Byte; n : bitNum) : Byte;
begin
clrBit := b and hi(\$FEFF shl n);
end;

{
OR.....using Inline() code  (the fastest)
These are untested but I'm getting fairly good at assembling by hand...8)
}

Function getBit(b : Byte; n : bitNum) : bit;
Inline(
\$59/      {pop cx}
\$58/      {pop ax}
\$D2/\$E8/  {shr al,cl}
\$24/\$01); {and al,1}

Function setBit(b : Byte; n : bitNum) : Byte;
Inline(
\$59/      {pop cx}
\$58/      {pop ax}
\$B3/\$01/  {mov bl,1}
\$D2/\$E3/  {shl bl,cl}
\$0A/\$C3); {or al,bl}

Function clrBit(b : Byte; n : bitNum) : Byte;
Inline(
\$59/      {pop cx}
\$58/      {pop ax}
\$B3/\$FE/  {mov bl,\$FE}
\$D2/\$C3/  {rol bl,cl}
\$22/\$C3); {or al,bl}

``````