DragOpsUtils.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Levin on September 20, 1983 10:57 am
Birrell, July 8, 1983 1:16 pm
Russ Atkinson (RRA) February 27, 1985 8:05:00 pm PST
Doug Wyatt, February 26, 1985 3:17:11 pm PST
Carl Hauser, November 6, 1986 3:56:24 pm PST
DIRECTORY
Basics,
DragOps;
Note to the casual reader: The definitions in this interface are primarily intended for use by wizards. General clients should probably look in the "Basics" interface for the operations they need before looking here.
DragOpsUtils: DEFINITIONS
IMPORTS Basics
= BEGIN OPEN DragOps;
Utilities for Basic Data Structures
Conversion among various memory size measures
PagesForWords: SAFE PROC [words: CARD] RETURNS [pages: PageCount]
= TRUSTED INLINE {
RETURN[Basics.ShiftRight[[int[int: words+(wordsPerPage-1)]], logWordsPerPage].int]
};
WordsForPages: SAFE PROC [pages: PageCount] RETURNS [words: CARD]
= TRUSTED INLINE {
RETURN[Basics.ShiftLeft[[int[int: pages]], logWordsPerPage].int]
};
PagesForBytes: SAFE PROC [bytes: CARD] RETURNS [pages: PageCount]
= TRUSTED INLINE {
RETURN[Basics.ShiftRight[[int[int: bytes+(bytesPerPage-1)]], logBytesPerPage].int]
};
BytesForPages: SAFE PROC [pages: PageCount] RETURNS [bytes: CARD]
= TRUSTED INLINE {
RETURN[Basics.ShiftLeft[[int[int: pages]], logBytesPerPage].int]
};
Conversion among various memory address measures
AddressForPageNumber: SAFE PROC [page: PageNumber] RETURNS [address: POINTER]
= TRUSTED INLINE {
RETURN[Basics.ShiftLeft[[int[int: page]], logWordsPerPage].ptr]
};
PageNumberForAddress: SAFE PROC [address: POINTER] RETURNS [page: PageNumber]
= TRUSTED INLINE {
RETURN[Basics.ShiftRight[ [ptr[address]], logWordsPerPage].int]
};
Block copying utilities - Moved to Basics
Long Pointer Manipulation - No longer needed
GetClockPulses: SAFE PROC RETURNS [CARD]
= TRUSTED MACHINE CODE {-- NYI[] -- };
VERSION: SAFE PROC RETURNS [VersionResult]
= TRUSTED MACHINE CODE {-- NYI[] -- };
Utilities for BitBlt and TextBlt (wizards only) - moved to basics
Utilities for Stack data structures (wizards only) -
To be replaced with things appropriate to Dragon: but don't put here
Control links
GetReturnLink: PROC RETURNS [ControlLink]
= MACHINE CODE {zLLB, returnOffset};
SetReturnLink: PROC [ControlLink]
= MACHINE CODE {zSLB, returnOffset};
IsBound: SAFE PROC [link: ControlLink] RETURNS [BOOL]
= TRUSTED INLINE {RETURN[link ~= UnboundLink AND link ~= NullLink]};
Local Frames
GetReturnFrame: PROC RETURNS [FrameHandle]
= LOOPHOLE[GetReturnLink];
SetReturnFrame: PROC [FrameHandle]
= LOOPHOLE[SetReturnLink];
MyLocalFrame: PROC RETURNS [FrameHandle]
= MACHINE CODE {zLADRB, 0};
MakeFsi: SAFE PROC [words: [0..MaxFrameSize]] RETURNS [fsi: FrameSizeIndex]
= TRUSTED INLINE {
FOR fsi IN [0..LastAVSlot) DO
IF FrameVec[fsi] >= words THEN RETURN;
ENDLOOP;
ERROR
};
FrameSize: SAFE PROC [fsi: FrameSizeIndex[0..LargeReturnSlot)]
RETURNS
[[0..MaxFrameSize]]
= TRUSTED INLINE {RETURN[FrameVec[fsi]]};
Global Frames
MyGlobalFrame: PROC RETURNS [GlobalFrameHandle]
= MACHINE CODE {zGADRB, 0};
GlobalFrame: SAFE PROC [link: ControlLink] RETURNS [GlobalFrameHandle];
GlobalFrameAndEntryPoint: SAFE PROC [link: ControlLink]
RETURNS
[gf: GlobalFrameHandle, ep: CARDINAL];
Code segments
Codebase: PROC [frame: GlobalFrameHandle] RETURNS [PrefixHandle]
= INLINE { c: FrameCodeBase ← frame.code; c.out ← FALSE; RETURN[c.cseg] };
Allocation Vector
Alloc: PROC [FrameSizeIndex] RETURNS [POINTER]
= MACHINE CODE {zALLOC};
Free: PROC [POINTER]
= MACHINE CODE {zFREE};
Utilities for Process data structures (wizards only) - moved to Process
Miscellaneous (wizards only) - anything to go here?
END.