PROGRAM bit_map2;

(*

Original work by Steve Fox

Bit_Map2 modifications by W. Mabee, CRNA and H. Kaemerrer.

Demonstrates compression of 8 boolean variables into a single
byte. Anyone know if you can accomplish the same thing with
shl or shr.

*)

CONST
  header = 'Test < Bit Mapping Routine >';

VAR
  more,response : CHAR;
  ans           : ARRAY[1..8] OF BOOLEAN;
  hold          : BYTE;
  i             : INTEGER;

PROCEDURE set_bits(VAR flag : BYTE; a,b,c,d,e,f,g,h : BOOLEAN);
BEGIN
  flag := 0;
  IF a THEN flag := flag OR $80;
  IF b THEN flag := flag OR $40;
  IF c THEN flag := flag OR $20;
  IF d THEN flag := flag OR $10;
  IF e THEN flag := flag OR $08;
  IF f THEN flag := flag OR $04;
  IF g THEN flag := flag OR $02;
  IF h THEN flag := flag OR $01
END;

PROCEDURE get_bits(flag : BYTE; VAR a,b,c,d,e,f,g,h : BOOLEAN);
BEGIN
  a := (flag AND $80 <> 0);
  b := (flag AND $40 <> 0);
  c := (flag AND $20 <> 0);
  d := (flag AND $10 <> 0);
  e := (flag AND $08 <> 0);
  f := (flag AND $04 <> 0);
  g := (flag AND $02 <> 0);
  h := (flag AND $01 <> 0)
END;

PROCEDURE set_up_screen;
BEGIN
  CLRSCR; WRITELN; WRITELN(header); WRITELN;
END;

BEGIN
  REPEAT
    set_up_screen;
    FOR i := 1 TO 8 DO
    BEGIN
      WRITE('Question # ',i,' Answer Y/N : ');
      READ(KBD,response); WRITELN(UPCASE(response));
      ans[i] := (response IN ['Y','y'])
    END;
    set_bits(hold,ans[1],ans[2],ans[3],ans[4],ans[5],ans[6],ans[7],ans[8]);
    get_bits(hold,ans[1],ans[2],ans[3],ans[4],ans[5],ans[6],ans[7],ans[8]);
    WRITELN;
    FOR i := 1 TO 8 DO
    BEGIN
      WRITE('Bit # ',i);
      IF ans[i] = TRUE THEN WRITELN(' is true.') ELSE WRITELN(' is false.');
    END;
    WRITELN;
    WRITE('The byte has a value of ',hold,'. Want to run it again ? ');
    READ(KBD,more); more := UPCASE(more);
  UNTIL more <> 'Y';
END.
