<<>> <> <> <> <> <> <> <> <> <> 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]] }; <<... 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] }; <> 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]]] }; <<... 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.>> <<>> <> LowByte: PROC [n: CARD16] RETURNS [BYTE] ~ INLINE { RETURN[n MOD 2**8] }; HighByte: PROC [n: CARD16] RETURNS [BYTE] ~ INLINE { RETURN[n / 2**8] }; <<>> END. <> <> <> <> <> <> <<>> <> <> <> <> <<>> <> <> <<>> <> <> <<>> <> <>