[Back to NUMBERS SWAG index] [Back to Main SWAG index] [Original]
(***********************************************************************
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.
[Back to NUMBERS SWAG index] [Back to Main SWAG index] [Original]