Basics16.mesa
For Sun-3 and Sun-4
Copyright Ó 1985, 1988, 1991 by Xerox Corporation. All rights reserved.
Carl Hauser, July 11, 1988 3:30:21 pm PDT
Last tweaked by Mike Spreitzer on June 24, 1988 11:21:44 am PDT
Willie-s, August 5, 1991 5:04 pm PDT
Michael Plass, August 21, 1991 10:24 am PDT
Doug Wyatt, August 27, 1991 1:34 pm PDT
Basic declarations and operations for 16-bit (half-)words.
DIRECTORY Basics;
Basics16: CEDAR DEFINITIONS IMPORTS Basics ~ BEGIN
Commonly-used types and values
bitsPerWord: NAT ~ BITS[WORD16]; -- = 16, of course
bytesPerWord: NAT ~ BYTES[WORD16];
charsPerWord: NAT ~ bytesPerWord;
logBitsPerWord: NAT ~ BITS[[0..bitsPerWord)];
logBytesPerWord: NAT ~ BITS[[0..bytesPerWord)];
logCharsPerWord: NAT ~ logBytesPerWord;
RawWords: TYPE ~ RECORD [PACKED SEQUENCE COMPUTED CARD OF WORD16];
Arithmetic utilities
Comparison: TYPE ~ Basics.Comparison;
CompareCard: PROC [a, b: CARD16] RETURNS [Comparison]
~ INLINE { RETURN[IF a=b THEN equal ELSE IF a>b THEN greater ELSE less] };
CompareInt: PROC [a, b: INT16] RETURNS [Comparison]
~ INLINE { RETURN[IF a=b THEN equal ELSE IF a>b THEN greater ELSE less] };
OddCard: PROC [n: CARD16] RETURNS [BOOL]
~ INLINE { RETURN [VAL[n MOD 2]] };
... cheaply tests whether n is odd; equivalent to (but faster than) (n MOD 2)#0.
OddInt: PROC [n: INT16] RETURNS [BOOL]
~ INLINE { RETURN [OddCard[LOOPHOLE[n]]] };
LongMult: PROC [a, b: CARD16] RETURNS [CARD32]
~ INLINE { RETURN[CARD32[a]*CARD32[b]] };
LongDiv: PROC [a: CARD32, b: CARD16] RETURNS [CARD16]
~ INLINE { RETURN[a/b] };
LongDivMod: PROC [num: CARD32, den: CARD16] RETURNS [quotient, remainder: CARD16]
~ INLINE { RETURN[num / den, num MOD den] };
Bounds checking
NonNegative: PROC [value: INT16] RETURNS [NAT15]
~ INLINE { RETURN[value] };
BoundsCheck: PROC [arg, limit: WORD16] RETURNS [WORD16]
~ INLINE { IF arg >= limit THEN Basics.RaiseBoundsFault[]; RETURN [arg] };
Logic utilities
BITAND: PROC [w1: WORD16, w2: WORD16] RETURNS [WORD16]
~ INLINE { RETURN[LOOPHOLE[Basics.BITAND[w1, w2]]] };
BITOR: PROC [w1: WORD16, w2: WORD16] RETURNS [WORD16]
~ INLINE { RETURN[LOOPHOLE[Basics.BITOR[w1, w2]]] };
BITXOR: PROC [w1: WORD16, w2: WORD16] RETURNS [WORD16]
~ INLINE { RETURN[LOOPHOLE[Basics.BITXOR[w1, w2]]] };
BITNOT: PROC [w: WORD16] RETURNS [WORD16]
~ INLINE { RETURN[CARD16.LAST - w] };
BITLSHIFT: PROC [value: WORD16, count: [0..bitsPerWord)] RETURNS [WORD16]
~ INLINE { RETURN[Basics.LowHalf[Basics.BITLSHIFT[value, count]]] };
... left-shifts the value by the count.
BITRSHIFT: PROC [value: WORD16, count: [0..bitsPerWord)] RETURNS [WORD16]
~ INLINE { RETURN[LOOPHOLE[Basics.BITRSHIFT[value, count]]] };
... right-shifts the value by the count.
BITSHIFT: PROC [value: WORD16, count: INT] RETURNS [WORD16]
~ INLINE { RETURN[Basics.LowHalf[Basics.BITSHIFT[value, count]]] };
... shifts the value by the count. If count is positive, the shift is to the left. If count is negative, the shift is to the right.
Field extraction
LowByte: PROC [n: CARD16] RETURNS [BYTE]
~ INLINE { RETURN[n MOD 2**8] };
HighByte: PROC [n: CARD16] RETURNS [BYTE]
~ INLINE { RETURN[n / 2**8] };
END.
Carl Hauser, October 13, 1986 11:23:32 am PDT
Working on conversion for Dragon .
changes to:
LongNumber reordered contained words, bytes and bits; renamed the tags and subfields
ShortNumber retyped the subfields; renamed the tags and subfields
UnsafeBlock retyped the base field.
Carl Hauser, June 11, 1987 4:10:57 pm PDT
added the Endian types and operations.
Carl Hauser, March 24, 1988 11:07:21 am PST
Removed VM parameters. Get them from the VM interface.
Last tweaked by Mike Spreitzer on June 24, 1988 11:15:37 am PDT
Cloned PBasics to make PBasics16.
Willie Sue Orr, July 25, 1991 2:40:27 pm PDT
Changed name from PBasics16 to Basics16 and use Basics32 instead of PBasics.
Michael Plass, August 21, 1991 10:21:12 am PDT
Changed to depend on Basics rather than Basics32; eliminated some unnecessary masking operations.