Contributor: WILLIAM BARATH (*********************************************************************** BitFuncs: Bit manipulation TPU, (C) September 1994 by William Barath Free for use in commercial and non-commercial software. Compile with $s-,g+ and optional word alignment (**********************************************************************) Unit BitFuncs; Interface Const Bits:array[0..7] of Byte = ($1,$2,$4,$8,$10,$20,$40,$80); Procedure SetBitA(var a;Bit:Word); Procedure ClearBitA(var a;Bit:Word); Procedure InvertBitA(var a;Bit:Word); Function GetBitA(var a;Bit:Word):Boolean; Procedure SetBit(var a;Bit:Word); Procedure ClearBit(var a;Bit:Word); Procedure InvertBit(var a;Bit:Word); Function GetBit(a:Byte;Bit:Word):Boolean; Implementation Procedure SetBitA(var a;Bit:Word);assembler; asm Les di,a {get variable reference} Mov si,bit {get bit offset} Mov bx,si {index into memory with bit Div 8} And si,07h {and index into 'bits' with bit Mod 8} Shr bx,03h Mov al,Byte(Bits[si]) {get the bit mask} Or es:[di+bx],al {read, modify, and write back the data} end; Procedure ClearBitA(var a;Bit:Word);assembler; asm Les di,a Mov si,bit Mov bx,si And si,07h Shr bx,03h Mov al,Byte(Bits[si]) Not al {invert the bit mask} And es:[di+bx],al {mask off the selected bit} end; Procedure InvertBitA(var a;Bit:Word);assembler; asm Les di,a Mov si,bit Mov bx,si And si,07h Shr bx,03h Mov al,Byte(Bits[si]) Xor es:[di+bx],al {invert the selected bit} end; Function GetBitA(var a;Bit:Word):Boolean;assembler; asm Les di,a Mov si,bit Mov bx,si And si,07h Shr bx,03h Mov al,Byte(Bits[si]) And al,es:[di+bx] {return the selected bit without writing} end; Procedure SetBit(var a;Bit:Word);assembler; asm Les di,a {get variable reference} Mov si,bit {get bit offset} Mov al,Byte(Bits[si]) {get the bit mask} Or es:[di],al {read, modify, write...} end; Procedure ClearBit(var a;Bit:Word);assembler; asm Les di,a Mov si,bit Mov al,Byte(Bits[si]) Not al And es:[di],al end; Procedure InvertBit(var a;Bit:Word);assembler; asm Les di,a Mov si,bit Mov al,Byte(Bits[si]) Xor es:[di],al end; Function GetBit(a:byte;Bit:Word):Boolean;assembler; asm Mov al,a {expect the data on the stack} Mov si,bit {get the bit index} And al,Byte(Bits[si]) {mask data with bitmask and return it} end; end.