home *** CD-ROM | disk | FTP | other *** search
- MODULE BitWise;
-
- FROM SYSTEM IMPORT WORD,
- ADDRESS;
-
- FROM InOut IMPORT Read,
- Write,
- WriteCard,
- WriteHex,
- WriteString,
- WriteLn;
-
- PROCEDURE ShowBits(Data : ADDRESS);
-
- VAR Bit: INTEGER;
- BsData: BITSET;
-
- BEGIN
-
- BsData := BITSET(Data);
-
- WriteHex(Data,4); Write(' ');
-
- FOR Bit := 15 TO 0 BY -1 DO (* Please Note if Bit is CARDINAL *)
- IF Bit IN BsData (* Then the for loop is ignored *)
- THEN Write('1');
- ELSE Write('0');
- END;
- END;
-
- WriteLn;
-
- END ShowBits;
-
- PROCEDURE BitShr(Data : ADDRESS;
- NumBits : ADDRESS) : ADDRESS;
-
- VAR I: CARDINAL;
- Shift: CARDINAL;
-
- BEGIN
-
- IF CARDINAL(NumBits) < 1
- THEN RETURN Data;
- END;
-
- IF CARDINAL(NumBits) > 15
- THEN RETURN ADDRESS(0);
- END;
-
- Shift := 1;
-
- FOR I := 1 TO CARDINAL(NumBits) DO
- Shift := Shift * 2;
- END;
-
- RETURN ADDRESS(CARDINAL(Data) DIV CARDINAL(Shift));
-
- END BitShr;
-
- PROCEDURE BitShl(Data : ADDRESS;
- NumBits : ADDRESS) : ADDRESS;
-
- VAR I: CARDINAL;
- Shift: CARDINAL;
-
- BEGIN
-
- IF CARDINAL(NumBits) < 1
- THEN RETURN Data;
- END;
-
- IF CARDINAL(NumBits) > 15
- THEN RETURN ADDRESS(0);
- END;
-
- Shift := 1;
-
- FOR I := 1 TO CARDINAL(NumBits) DO
- Shift := Shift * 2;
- END;
-
- RETURN ADDRESS(CARDINAL(Data) * CARDINAL(Shift));
-
- END BitShl;
-
- VAR
- Adata,
- Bdata,
- Cdata: WORD;
- Count: CARDINAL;
- CReply: CHAR;
-
- BEGIN
-
- WriteLn;
-
- ShowBits(ADDRESS(1));
- HALT;
-
- FOR Count := 0 TO 16 DO
- ShowBits(BitShr(8000H,ADDRESS(Count)));
- END;
-
- WriteString('Done with BitShr');WriteLn;
-
- FOR Count := 0 TO 16 DO
- ShowBits(BitShl(ADDRESS(1),ADDRESS(Count)));
- END;
-
- WriteString('Done');Read(CReply);
-
- END BitWise.