'===========================================================================
' Subject: SET BIT                            Date: 01-25-97 (16:41)       
'  Author: Byron Smith                        Code: QB, QBasic, PDS        
'  Origin: unol@sat.net                     Packet: BINARY.ABC
'===========================================================================
DECLARE SUB BON (S%, O%, B%)
DECLARE SUB BOFF (S%, O%, B%)
DECLARE SUB TOGGLE (S%, O%, B%)
DECLARE FUNCTION BIT% (S%, O%, B%)
DIM A(0) AS DOUBLE
CLS
A(0) = CVD(STRING$(7, 170) + CHR$(126))
FOR X% = 63 TO 0 STEP -1
  PRINT USING "#"; BIT%(VARSEG(A(0)), VARPTR(A(0)), X%);
NEXT
PRINT

'Turn ON bit #2
BON VARSEG(A(0)), VARPTR(A(0)), 2

FOR X% = 63 TO 0 STEP -1
  PRINT USING "#"; BIT%(VARSEG(A(0)), VARPTR(A(0)), X%);
NEXT
PRINT

'Turn OFF bit #2
BOFF VARSEG(A(0)), VARPTR(A(0)), 2

FOR X% = 63 TO 0 STEP -1
  PRINT USING "#"; BIT%(VARSEG(A(0)), VARPTR(A(0)), X%);
NEXT
PRINT

FUNCTION BIT% (S%, O%, B%)
  DEF SEG = S%: BIT% = -((PEEK(O% + B% \ 8) AND 2 ^ (B% MOD 8)) > 0)
END FUNCTION

SUB BOFF (S%, O%, B%)
  DEF SEG = S%: POKE O% + B% \ 8, PEEK(O% + B% \ 8) AND 255 - 2 ^ (B% MOD 8)
END SUB

SUB BON (S%, O%, B%)
  DEF SEG = S%: POKE O% + B% \ 8, PEEK(O% + B% \ 8) OR 2 ^ (B% MOD 8)
END SUB

SUB TOGGLE (S%, O%, B%)
  DEF SEG = S%: POKE O% + B% \ 8, PEEK(O% + B% \ 8) XOR 2 ^ (B% MOD 8)
END SUB
