home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / LANGUAGS / MODULA2 / BITWISE.MZD / BITWISE.MOD
Text File  |  2000-06-30  |  2KB  |  114 lines

  1. MODULE BitWise;
  2.  
  3. FROM SYSTEM   IMPORT WORD,
  4.                      ADDRESS;
  5.  
  6. FROM InOut    IMPORT Read,
  7.                      Write,
  8.                      WriteCard,
  9.                      WriteHex,
  10.                      WriteString,
  11.                      WriteLn;
  12.  
  13. PROCEDURE ShowBits(Data : ADDRESS);
  14.  
  15. VAR Bit:        INTEGER;
  16.     BsData:     BITSET;
  17.  
  18. BEGIN
  19.  
  20.   BsData := BITSET(Data);
  21.  
  22.   WriteHex(Data,4); Write(' ');
  23.  
  24.   FOR Bit := 15 TO 0 BY -1 DO  (* Please Note if Bit is CARDINAL *)
  25.       IF Bit IN BsData         (* Then the for loop is ignored   *)
  26.         THEN Write('1');
  27.         ELSE Write('0');
  28.       END;
  29.   END;
  30.  
  31.   WriteLn;
  32.  
  33. END ShowBits;
  34.  
  35. PROCEDURE BitShr(Data    : ADDRESS;
  36.                  NumBits : ADDRESS) : ADDRESS;
  37.  
  38. VAR I:           CARDINAL;
  39.     Shift:       CARDINAL;
  40.  
  41. BEGIN
  42.  
  43.   IF CARDINAL(NumBits) < 1
  44.     THEN RETURN Data;
  45.   END;
  46.  
  47.   IF CARDINAL(NumBits) > 15
  48.     THEN RETURN ADDRESS(0);
  49.   END;
  50.  
  51.   Shift := 1;
  52.  
  53.   FOR I := 1 TO CARDINAL(NumBits) DO
  54.       Shift := Shift * 2;
  55.   END;
  56.  
  57.   RETURN ADDRESS(CARDINAL(Data) DIV CARDINAL(Shift));
  58.  
  59. END BitShr;
  60.  
  61. PROCEDURE BitShl(Data    : ADDRESS;
  62.                  NumBits : ADDRESS) : ADDRESS;
  63.  
  64. VAR I:           CARDINAL;
  65.     Shift:       CARDINAL;
  66.  
  67. BEGIN
  68.  
  69.   IF CARDINAL(NumBits) < 1
  70.     THEN RETURN Data;
  71.   END;
  72.  
  73.   IF CARDINAL(NumBits) > 15
  74.     THEN RETURN ADDRESS(0);
  75.   END;
  76.  
  77.   Shift := 1;
  78.  
  79.   FOR I := 1 TO CARDINAL(NumBits) DO
  80.       Shift := Shift * 2;
  81.   END;
  82.  
  83.   RETURN ADDRESS(CARDINAL(Data) * CARDINAL(Shift));
  84.  
  85. END BitShl;
  86.  
  87. VAR
  88.   Adata,
  89.   Bdata,
  90.   Cdata:        WORD;
  91.   Count:        CARDINAL;
  92.   CReply:       CHAR;
  93.  
  94. BEGIN
  95.  
  96.   WriteLn;
  97.  
  98.   ShowBits(ADDRESS(1));
  99.   HALT;
  100.  
  101.   FOR Count := 0 TO 16 DO
  102.     ShowBits(BitShr(8000H,ADDRESS(Count)));
  103.   END;
  104.  
  105.   WriteString('Done with BitShr');WriteLn;
  106.  
  107.   FOR Count := 0 TO 16 DO
  108.     ShowBits(BitShl(ADDRESS(1),ADDRESS(Count)));
  109.   END;
  110.  
  111.   WriteString('Done');Read(CReply);
  112.  
  113. END BitWise.
  114.