home *** CD-ROM | disk | FTP | other *** search
- {
- 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}