<<>> <> <> <> <> <> DIRECTORY Basics, CirioNubAccess, Rope; CirioMemory: CEDAR DEFINITIONS = BEGIN ROPE: TYPE ~ Rope.ROPE; <> <> <<>> BitAddr: TYPE ~ RECORD [aus: CARD, bits: INT]; <> zeroBA: BitAddr ~ [0, 0]; unspecdBA: BitAddr ~ [CARD.LAST, INT.LAST]; <> bitsPerAu: NAT ~ 8; bitsPerPtr: NAT ~ 32; BaCons: PROC [aus: CARD, bits: INT] RETURNS [BitAddr] ~ INLINE {IF bits/bitsPerAu >= 0 OR aus > ABS[bits/bitsPerAu] THEN RETURN[[aus+bits/bitsPerAu, bits MOD bitsPerAu]] ELSE RETURN[[0, aus*bitsPerAu+bits]]}; BaAsAbs: PROC [ba: BitAddr] RETURNS [BitAddr]; <> BaAdd: PROC [a, b: BitAddr] RETURNS [BitAddr] ~ INLINE {RETURN BaCons[a.aus+b.aus, a.bits+b.bits]}; BaAddOffset: PROC [ba: BitAddr, bits: INT] RETURNS [BitAddr] ~ INLINE {RETURN BaCons[ba.aus, ba.bits+bits]}; BaSub: PROC [a, b: BitAddr] RETURNS [BitAddr] ~ INLINE {RETURN BaCons[a.aus-b.aus, a.bits-b.bits]}; BaMul: PROC [ba: BitAddr, by: CARD] RETURNS [BitAddr] ~ INLINE {RETURN BaCons[ba.aus*by, ba.bits*by]}; BaCompare: PROC [a, b: BitAddr] RETURNS [Basics.Comparison]; BitsToBa: PROC [bits: INT] RETURNS [BitAddr] ~ INLINE {RETURN BaCons[0, bits]}; BaToBits: PROC [ba: BitAddr] RETURNS [CARD] ~ INLINE {RETURN[ba.aus*bitsPerAu + ba.bits]}; AusToBa: PROC [aus: CARD] RETURNS [BitAddr] ~ INLINE {RETURN[[aus, 0]]}; BaToAus: PROC [ba: BitAddr] RETURNS [CARD] ~ INLINE {IF ba.bits#0 THEN ERROR; RETURN[ba.aus]}; PtrToBa: PROC [ptr: CARD] RETURNS [BitAddr] ~ INLINE {RETURN[[LOOPHOLE[ptr], 0]]}; BaToPtr: PROC [ba: BitAddr] RETURNS [CARD] ~ INLINE {IF ba.bits#0 THEN ERROR; RETURN[LOOPHOLE[ba.aus]]}; BitStretch: TYPE ~ RECORD [start, size: BitAddr]; <> unspecdBS: BitStretch ~ [unspecdBA, unspecdBA]; BsCompose: PROC [main, inner: BitStretch] RETURNS [within: BOOL, compd: BitStretch]; <> <> <> <<>> Mem: TYPE = RECORD[class: MemClass, data: REF ANY]; noMem: Mem = [NIL, NIL]; MemClass: TYPE ~ REF MemClassPrivate; MemClassPrivate: TYPE ~ RECORD [ <> CreateSimple: PROC [data: REF ANY, stretch: BitStretch, keepFrame: BOOL] RETURNS [Mem], <> <> Subfield: PROC [data: REF ANY, rel: BitStretch] RETURNS [Mem], <> Shift: PROC [data: REF ANY, offset: BitAddr] RETURNS [Mem], <> GetStretch: PROC [data: REF ANY] RETURNS [BitStretch], Read: PROC [data: REF ANY, bitSize: CARD, offset: BitAddr] RETURNS [CARD], Write: PROC [data: REF ANY, bits: CARD, bitSize: CARD, offset: BitAddr], <> ReadPtrReg: PROC [data: REF ANY, ptrReg: PtrReg] RETURNS [BitStretch], ReadSegmentReg: PROC [data: REF ANY, segName: ROPE, segNum: INT] RETURNS [BitStretch], <> SetPtrReg: PROC [data: REF ANY, ptrReg: PtrReg, val: BitStretch] <> ]; PtrReg: TYPE ~ { fp --frame pointer--, sp --stack pointer--, fe --frame extension pointer-- }; Error: ERROR [msg: ROPE]; MemSubfield: PROC [mem: Mem, rel: BitStretch] RETURNS [Mem] ~ INLINE {RETURN mem.class.Subfield[mem.data, rel]}; MemShift: PROC [mem: Mem, offset: BitAddr] RETURNS [Mem] ~ INLINE {RETURN mem.class.Shift[mem.data, offset]}; MemIndirect: PROC [mem: Mem, size: BitAddr _ unspecdBA, offset: BitAddr _ zeroBA] RETURNS [Mem]; MemGetStretch: PROC [mem: Mem] RETURNS [BitStretch] ~ INLINE {RETURN mem.class.GetStretch[mem.data]}; MemGetSize: PROC [mem: Mem] RETURNS [BitAddr] ~ INLINE {RETURN [mem.class.GetStretch[mem.data].size]}; MemGetStart: PROC [mem: Mem] RETURNS [BitAddr] ~ INLINE {RETURN [mem.class.GetStretch[mem.data].start]}; MemRead: PROC [mem: Mem, bitSize: CARD, offset: BitAddr] RETURNS [CARD] ~ INLINE {RETURN mem.class.Read[mem.data, bitSize, offset]}; MemWrite: PROC [mem: Mem, bits: CARD, bitSize: CARD, offset: BitAddr] ~ INLINE {mem.class.Write[mem.data, bits, bitSize, offset]}; MemPtrRegIndirect: PROC [mem: Mem, ptrReg: PtrReg, size, offset: BitAddr, keepFrame: BOOL] RETURNS [Mem]; MemReadPtrReg: PROC [mem: Mem, ptrReg: PtrReg] RETURNS [BitStretch] ~ INLINE {RETURN mem.class.ReadPtrReg[mem.data, ptrReg]}; MemReadSegReg: PROC [mem: Mem, segName: ROPE, segNum: INT] RETURNS [BitStretch] ~ INLINE {RETURN mem.class.ReadSegmentReg[mem.data, segName, segNum]}; MemSelectSegment: PROC [mem: Mem, segName: ROPE, segNum: INT, keepFrame: BOOL] RETURNS [Mem]; CreateSimpleMem: PROC[addr: CirioNubAccess.RemoteAddress, size: BitAddr _ unspecdBA] RETURNS[Mem]; <> MakeDualMem: PROC [nub: CirioNubAccess.Handle, fp, sp: CARD _ invalidPtr, text, data, bss, fep, simple: BitStretch _ unspecdBS] RETURNS [mem: Mem]; <> invalidPtr: CARD = CARD.LAST; END.