DIRECTORY Basics; Basics16: CEDAR DEFINITIONS IMPORTS Basics ~ BEGIN 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]; 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]] }; 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] }; 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] }; 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]]] }; BITRSHIFT: PROC [value: WORD16, count: [0..bitsPerWord)] RETURNS [WORD16] ~ INLINE { RETURN[LOOPHOLE[Basics.BITRSHIFT[value, count]]] }; BITSHIFT: PROC [value: WORD16, count: INT] RETURNS [WORD16] ~ INLINE { RETURN[Basics.LowHalf[Basics.BITSHIFT[value, count]]] }; LowByte: PROC [n: CARD16] RETURNS [BYTE] ~ INLINE { RETURN[n MOD 2**8] }; HighByte: PROC [n: CARD16] RETURNS [BYTE] ~ INLINE { RETURN[n / 2**8] }; END. j 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. Commonly-used types and values Arithmetic utilities ... cheaply tests whether n is odd; equivalent to (but faster than) (n MOD 2)#0. Bounds checking Logic utilities ... left-shifts the value by the count. ... right-shifts the value by the 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 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. Κ¬–(cedarcode) style•NewlineDelimiter ™codešœ ™ KšΟb™Kšœ Οeœ=™HK™)K™?K™$K™+K™'K˜—K™:K˜KšΟk œ˜K™Kš ΟnœŸœŸ œŸœ Ÿ˜2head™Kšœ ŸœŸœŸœΟc˜3KšœŸœŸœŸœ˜"šœŸœ˜!K™—KšœŸœŸœ˜-KšœŸœŸœ˜/šœŸœ˜'K™—šœ ŸœŸœŸœŸœŸœŸœŸœŸœ˜BK™——šœ™šœ Ÿœ˜%K™—š  œŸœŸœŸœ ˜5KšœŸœŸœŸœŸœŸœŸœŸœ Ÿœ ˜JK˜—š  œŸœŸœŸœ ˜3KšœŸœŸœŸœŸœŸœŸœŸœ Ÿœ ˜JK˜—š  œŸœŸœŸœŸœ˜(Kš œŸœŸœŸœŸœ˜#KšœGŸœ™PK™—š  œŸœŸœŸœŸœ˜&KšœŸœŸœ Ÿœ˜+K˜—š  œŸœŸœŸœŸœ˜.Kš œŸœŸœŸœŸœ˜)K˜—š  œŸœŸœŸœŸœŸœ˜5KšœŸœŸœ˜K˜—š   œŸœŸœŸœŸœŸœ˜QKšœŸœŸœŸœ˜,K˜——™š   œŸœ ŸœŸœŸœ˜0KšœŸœŸœ ˜K˜—š   œŸœŸœŸœŸœ˜7Kš œŸœŸœŸœŸœ ˜JK™——šœ™š ΠbkœŸœŸœŸœŸœŸœ˜6Kš œŸœŸœŸœŸœ ˜5K˜—š ’œŸœŸœŸœŸœŸœ˜5Kš œŸœŸœŸœŸœ ˜4K˜—š ’œŸœŸœŸœŸœŸœ˜6Kš œŸœŸœŸœŸœ ˜5K˜—š ’œŸœŸœŸœŸœ˜)Kš œŸœŸœŸœŸœ˜%K˜—š ’ œŸœ ŸœŸœŸœ˜IKšœŸœŸœŸ œ˜DKšœ)™)K˜—š ’ œŸœ ŸœŸœŸœ˜IKš œŸœŸœŸœŸ œ˜>Kšœ)™)K™—š ’œŸœ Ÿœ ŸœŸœŸœ˜;KšœŸœŸœŸœ˜CKšœ…™…K™——™š  œŸœŸœŸœŸœ˜(KšœŸœŸœŸœ ˜ K˜—š  œŸœŸœŸœŸœ˜)KšœŸœŸœ ˜K˜——K™šŸœ˜™-K™"šœ ™ KšΟr œ*£œ£™UKš£ œ£œ£™BKš£ œ™#——K™™)Kš£&™&—™+Kšœ5£™6—K™™?K™!—K™™,K™L—K™™.K™a———…— 0