DEFINITION MODULE Bits;
  (*******************************************************************
    Module  Bits     (Version 1.0)
      Copyright (c) 1989-2006 by Olivier Roth and ETH Zurich.
    Purpose   Manipulations of bits in bytes (8b) or words (16b).
    Remarks   Machine dependent!
    Programming
      o Design
        Olivier Roth              18/02/1989
      o Implementation
        Olivier Roth              18/02/1989
    ETH Zurich
    Systems Ecology
    CHN E 35.1
    Universitaetstrasse 16
    8092 Zurich
    SWITZERLAND
    URLs:
        <mailto:RAMSES@env.ethz.ch>
        <http://www.sysecol.ethz.ch>
        <http://www.sysecol.ethz.ch/SimSoftware/RAMSES>
    Last revision of definition:  08/03/1989    OR
  *******************************************************************)
  FROM SYSTEM IMPORT BYTE, WORD;
  TYPE
    typeID = ( byt, chr, dec, int, set, wrd );
    WordTYPE = RECORD (* 16 bits *)
                 CASE : typeID OF
                   byt : b :  ARRAY[0..1] OF BYTE;
                 | chr : c :  ARRAY[0..1] OF CHAR;
                 | dec : d :  CARDINAL;
                 | int : i :  INTEGER;
                 | set : s :  BITSET;
                 | wrd : w :  WORD;
                 END(*CASE*);
               END(*RECORD*);
    ByteTYPE = RECORD (*  8 bits *)
                 CASE : typeID OF
                   byt : b :  BYTE;
                 | chr : c :  CHAR;
                 END(*CASE*);
               END(*RECORD*);
    BinSTR16 = ARRAY[0..15] OF CHAR;
    OctSTR6  = ARRAY[0.. 5] OF CHAR;
    HexSTR4  = ARRAY[0.. 3] OF CHAR;
    BinSTR8  = ARRAY[0.. 7] OF CHAR;
    OctSTR3  = ARRAY[0.. 2] OF CHAR;
    HexSTR2  = ARRAY[0.. 1] OF CHAR;
  VAR
    Pow2     : ARRAY[0..15] OF CARDINAL;
    HexDIGIT : ARRAY[0..15] OF CHAR;
(* ------------------------------------------------------------------- *)
(* Assignment and Conversion procedures for WordTYPE:  *)
  PROCEDURE WordToBinStr( a: WORD;  VAR BinStr: BinSTR16 );
  (* convert a two byte variable to an array of bits.      *)
  PROCEDURE BinStrToWord( BinStr: BinSTR16;  VAR a: WORD );
  (* convert an array of bits to a two byte variable.      *)
  PROCEDURE WordToOctStr( a: WORD;  VAR OctStr: OctSTR6 );
  (* convert a two byte variable to an array of OctDIGIT.  *)
  PROCEDURE OctStrToWord( OctStr: OctSTR6;  VAR a: WORD );
  (* convert an array of OctDIGIT to a two byte variable.  *)
  PROCEDURE WordToHexStr( a: WORD;  VAR HexStr: HexSTR4 );
  (* convert a two byte variable to an array of HexDIGIT.  *)
  PROCEDURE HexStrToWord( HexStr: HexSTR4;  VAR a: WORD );
  (* convert an array of HexDIGIT to a two byte variable.  *)
(* ------------------------------------------------------------------- *)
(* BitManipulations for WordTYPE: *)
  PROCEDURE ShiftLeftW( VAR a: WORD; n : CARDINAL );
  (* shifts all bits of a n places to the left. *)
  PROCEDURE CircShiftLeftW( VAR a: WORD; n : CARDINAL );
  (* shifts all bits of a n places to the left, overflowing bits
     are reentered at right. *)
  PROCEDURE ShiftRightW( VAR a: WORD; n : CARDINAL );
  (* shifts all bits of a n places to the right. *)
  PROCEDURE CircShiftRightW( VAR a: WORD; n : CARDINAL );
  (* shifts all bits of a n places to the right, overflowing bits
     are reentered at left. *)
(* BitOperations for WordTYPE: *)
  PROCEDURE NotW( a: WORD ) : WORD;
  (* sets all bits of a to the opposite state. *)
  PROCEDURE AndW( a, b : WORD ) : WORD;
  (* equals the logical operation AND on the two variables a and b. *)
  PROCEDURE OrW( a, b : WORD ) : WORD;
  (* equals the logical operation OR on the two variables a and b. *)
  PROCEDURE XorW( a, b : WORD ) : WORD;
  (* equals the logical operation XOR on the two variables a and b. *)
(* ------------------------------------------------------------------- *)
(* Assignment and Conversion procedures for ByteTYPE: *)
  PROCEDURE ByteToBinStr( a: BYTE;  VAR BinStr: BinSTR8 );
  (* convert a byte variable to an array of bits.      *)
  PROCEDURE BinStrToByte( BinStr: BinSTR8;  VAR a: BYTE );
  (* convert an array of bits to a byte variable.      *)
  PROCEDURE ByteToOctStr( a: BYTE;  VAR OctStr: OctSTR3 );
  (* convert a byte variable to an array of OctDIGIT.  *)
  PROCEDURE OctStrToByte( OctStr: OctSTR3;  VAR a: BYTE );
  (* convert an array of OctDIGIT to a byte variable.  *)
  PROCEDURE ByteToHexStr( a: BYTE;  VAR HexStr: HexSTR2 );
  (* convert a byte variable to an array of HexDIGIT.  *)
  PROCEDURE HexStrToByte( HexStr: HexSTR2;  VAR a: BYTE );
  (* convert an array of HexDIGIT to a byte variable.  *)
(* ------------------------------------------------------------------- *)
(* BitManipulations for ByteTYPE: *)
  PROCEDURE ShiftLeftB( VAR a: BYTE; n : CARDINAL );
  (* shifts all bits of a n places to the left. *)
  PROCEDURE CircShiftLeftB( VAR a: BYTE; n : CARDINAL );
  (* shifts all bits of a n places to the left, overflowing bits
     are reentered at right. *)
  PROCEDURE ShiftRightB( VAR a: BYTE; n : CARDINAL );
  (* shifts all bits of a n places to the right. *)
  PROCEDURE CircShiftRightB( VAR a: BYTE; n : CARDINAL );
  (* shifts all bits of a n places to the right, overflowing bits
     are reentered at left. *)
(* BitOperations for ByteTYPE: *)
  PROCEDURE NotB( a: BYTE ) : BYTE;
  (* sets all bits of a to the opposite state. *)
  PROCEDURE AndB( a, b : BYTE ) : BYTE;
  (* equals the logical operation AND on the two variables a and b. *)
  PROCEDURE OrB( a, b : BYTE ) : BYTE;
  (* equals the logical operation OR on the two variables a and b. *)
  PROCEDURE XorB( a, b : BYTE ) : BYTE;
  (* equals the logical operation XOR on the two variables a and b. *)
END Bits.