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.MOD
< prev
next >
Wrap
Text File
|
2000-06-30
|
2KB
|
114 lines
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.