DIRECTORY PrincOps USING [ zAND, zDCOMP, zDIV, zDUCOMP, zINC, zLDIV, zLIN1, zMUL, zOR, zPUSH, zSHIFT, zXOR]; Basics: CEDAR DEFINITIONS = BEGIN OPEN PrincOps; bytesPerWord, charsPerWord: NAT = 2; bitsPerByte, bitsPerChar: NAT = 8; bitsPerWord: NAT = bitsPerByte*bytesPerWord; logBitsPerByte, logBitsPerChar: NAT = --LogBase2[bitsPerByte]--3; logBytesPerWord, logCharsPerWord: NAT = --LogBase2[bytesPerWord]--1; logBitsPerWord: NAT = logBitsPerByte + logBytesPerWord; Byte, BYTE: TYPE = [0..377B]; Word: TYPE = WORD; LongNumber: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID * FROM lc => [lc: LONG CARDINAL], li => [li: INT], num => [lowbits, highbits: CARDINAL], bytes => [lh, ll, hh, hl: BYTE], ENDCASE]; BytePair: TYPE = MACHINE DEPENDENT RECORD [high, low: BYTE]; Comparison: TYPE = MACHINE DEPENDENT {less(0), equal(1), greater(2)}; RefSeq: TYPE = RECORD [length: NAT, elements: SEQUENCE maxLength: NAT OF REF ANY]; RawMemory: TYPE = RECORD [SEQUENCE COMPUTED CARDINAL OF WORD]; UnsafeBlock: TYPE = RECORD [ base: LONG POINTER TO PACKED ARRAY [0..0) OF CHAR _ NIL, startIndex: INT _ 0, count: INT _ 0 ]; CompareLC, CompareCard: PROC [a, b: LONG CARDINAL] RETURNS [Comparison] = TRUSTED MACHINE CODE {zDUCOMP; zINC}; CompareINT: PROC [a, b: INT] RETURNS [Comparison] = TRUSTED MACHINE CODE {zDCOMP; zINC}; DIVMOD: PROC [num, den: CARDINAL] RETURNS [quotient, remainder: CARDINAL] = TRUSTED MACHINE CODE {zDIV; zPUSH}; LDIVMOD: PROC [numlow: WORD, numhigh: CARDINAL, den: CARDINAL] RETURNS [quotient, remainder: CARDINAL] = TRUSTED MACHINE CODE {zLDIV; zPUSH}; LongMult: PROC [CARDINAL, CARDINAL] RETURNS [product: LONG CARDINAL] = TRUSTED MACHINE CODE {zMUL; zPUSH}; LongDiv: PROC [num: LONG CARDINAL, den: CARDINAL] RETURNS [CARDINAL] = TRUSTED MACHINE CODE {zLDIV}; LongDivMod: PROC [num: LONG CARDINAL, den: CARDINAL] RETURNS [quotient, remainder: CARDINAL] = TRUSTED MACHINE CODE {zLDIV; zPUSH}; BitOp: TYPE = SAFE PROC [CARDINAL, CARDINAL] RETURNS [CARDINAL]; BITAND: BitOp = TRUSTED MACHINE CODE {zAND}; BITOR: BitOp = TRUSTED MACHINE CODE {zOR}; BITXOR: BitOp = TRUSTED MACHINE CODE {zXOR}; BITNOT: SAFE PROC [CARDINAL] RETURNS [CARDINAL] = TRUSTED MACHINE CODE {zLIN1; zXOR}; BITSHIFT: SAFE PROC [value: CARDINAL, count: INTEGER] RETURNS [CARDINAL] = TRUSTED MACHINE CODE {zSHIFT}; LowHalf: PROC [n: LONG CARDINAL] RETURNS [CARDINAL] = TRUSTED INLINE {RETURN[LOOPHOLE[n, LongNumber].lowbits]}; HighHalf: PROC [n: LONG CARDINAL] RETURNS [CARDINAL] = TRUSTED INLINE {RETURN[LOOPHOLE[n, LongNumber].highbits]}; LowByte: PROC [n: CARDINAL] RETURNS [CARDINAL] = TRUSTED INLINE {RETURN[LOOPHOLE[n, BytePair].low]}; HighByte: PROC [n: CARDINAL] RETURNS [CARDINAL] = TRUSTED INLINE {RETURN[LOOPHOLE[n, BytePair].high]}; END. úBasics.mesa last edited by Levin on September 20, 1983 11:00 am Commonly-used types and values An UnsafeBlock describes the byte sequence [base[startIndex]..base[startIndex]+base[count]). Arithmetic utilities Logic utilities Field Extraction Ê_˜Jšœ ™ Jšœ3™3J˜šÏk ˜ šœ œ˜JšœQ˜Q——J˜Jšœœ˜J˜Jš˜J˜Jšœ ˜J˜J™˜Jšœœ˜$Jšœœ˜"Jšœ œ˜,J˜Jšœ œÏcœ˜AJšœ"œžœ˜DJšœœ$˜7J˜Jšœœœ ˜Jšœœœ˜J˜š œ œœ œœ˜-šœœ˜Jšœ œœ˜Jšœ œ˜Jšœœ˜%Jšœœ˜ Jšœ˜ ——Jš œ œœ œœ œ˜J˜šœ œœ˜Jšœœœœœœœœœ˜8Jšœ œ˜Jšœœ˜Jšœ˜Jšœ\™\—J˜—Jšœ™™š œ Ïn œœœœœ˜IJšœœœ˜%J˜—š Ÿ œœœœœœ˜HJ˜J˜—š œœ œœœ˜KJšœœœ˜#J˜—š œœ œ œœ˜>Jš œœœœœ˜NJ˜—šŸœœœœœ œœ˜FJšœœœ˜#J˜—šŸœœœœœœœ˜FJšœœœ ˜J˜—š Ÿ œœœœœ˜4Jš œœœœœ˜N—J˜—Jšœ™™JšŸœœœœœœœœ˜@J˜šœ ˜Jšœœœ˜J˜—šœ ˜Jšœœœ˜J˜—šœ ˜Jšœœœ˜J˜—š œœœœœœ˜1Jšœœœ˜#J˜—šœœœ œ œœœ˜JJšœœœ ˜—J˜—J™˜šŸœœœœœœœ˜DJšœœœ˜*J˜—šŸœœœœœœœ˜EJšœœœ˜+—J˜š Ÿœœœœœœ˜?Jšœœœ˜$J˜—š Ÿœœœœœœ˜@Jšœœœ˜%——J˜Jšœ˜—…— Î'