-- MachineDefs.mesa last edit: Bruce, September 19, 1980 4:04 PM
DIRECTORY
AllocDefs USING [DefaultDataSegmentInfo, SwappingProcedure],
AltoDefs USING [
BYTE, BytesPerPage, CharsPerPage, PageCount, PageNumber, PageSize, wordlength],
AltoFileDefs USING [CFA, CFP, eofDA, FA, FH, fillinDA, FP, vDA],
ControlDefs USING [
ControlLink, ControlLinkTag, ControlModule, CSegPrefix, FieldDescriptor, Frame,
FrameCodeBase, FrameHandle, GFT, GFTHandle, GFTIndex, GFTItem,
GlobalFrame, GlobalFrameHandle, localbase, NullGlobalFrame, ProcDesc, SignalDesc,
StateVector, SVPointer, WordPC],
CoreSwapDefs,
DirectoryDefs USING [BadDirectory],
LoadStateFormat USING [ConfigIndex, NullConfig],
Mopcodes USING [zBLT],
PrincOps USING [BytePC],
ProcessDefs USING [Priority],
PSBDefs USING [ProcessHandle],
SegmentDefs USING [InsufficientVM],
Segments,
Streams USING [Handle],
Symbols USING [CTXIndex];
MachineDefs: DEFINITIONS IMPORTS DirectoryDefs, SegmentDefs, Segments SHARES Segments =
BEGIN
CoPilot: BOOLEAN = FALSE;
-- AllocDefs
SwappingProcedure: TYPE = AllocDefs.SwappingProcedure;
DefaultDataSegmentInfo: Segments.AllocInfo = AllocDefs.DefaultDataSegmentInfo;
-- AltoDefs
BYTE: TYPE = AltoDefs.BYTE;
BytesPerPage: CARDINAL = AltoDefs.BytesPerPage;
CharsPerPage: CARDINAL = AltoDefs.CharsPerPage;
PageCount: TYPE = AltoDefs.PageCount;
PageNumber: TYPE = AltoDefs.PageNumber;
PageSize: CARDINAL = AltoDefs.PageSize;
WordLength: CARDINAL = AltoDefs.wordlength;
-- AltoFileDefs
CFA: TYPE = AltoFileDefs.CFA;
CFP: TYPE = AltoFileDefs.CFP;
eofDA: vDA = AltoFileDefs.eofDA;
FileHint: TYPE = AltoFileDefs.FH;
fillinDA: vDA = AltoFileDefs.fillinDA;
FA: TYPE = AltoFileDefs.FA;
FP: TYPE = AltoFileDefs.FP;
vDA: TYPE = AltoFileDefs.vDA;
-- Compiler
MaxParmsInStack: CARDINAL = 5;
MLCtx: Symbols.CTXIndex = LOOPHOLE[10];
CVCtx: Symbols.CTXIndex = LOOPHOLE[12];
-- ControlDefs
ControlLink: TYPE = ControlDefs.ControlLink;
ControlModule: TYPE = ControlDefs.ControlModule;
CSegPrefix: TYPE = ControlDefs.CSegPrefix;
FHandle: TYPE = ControlDefs.FrameHandle;
FieldDescriptor: TYPE = ControlDefs.FieldDescriptor;
Frame: TYPE = ControlDefs.Frame;
FrameCodeBase: TYPE = ControlDefs.FrameCodeBase;
GFT: ControlDefs.GFTHandle = ControlDefs.GFT;
GFTIndex: TYPE = ControlDefs.GFTIndex;
GFTItem: TYPE = ControlDefs.GFTItem;
GFHandle: TYPE = ControlDefs.GlobalFrameHandle;
GlobalFrame: TYPE = ControlDefs.GlobalFrame;
localbase: CARDINAL = ControlDefs.localbase;
NullGF: GFHandle = ControlDefs.NullGlobalFrame;
NullOffset: CARDINAL = LAST[CARDINAL];
ProcDesc: TYPE = ControlDefs.ProcDesc;
SignalDesc: TYPE = ControlDefs.SignalDesc;
SVPointer: TYPE = ControlDefs.SVPointer;
StateVector: TYPE = ControlDefs.StateVector;
RealPC: TYPE = ControlDefs.WordPC;
ByteToRealPC: PROCEDURE [bpc: BytePC] RETURNS [wpc: RealPC] = INLINE {
wpc ← RealPC[bpc/2];
RETURN[IF bpc MOD 2 = 1 THEN RealPC[-wpc] ELSE wpc] };
RealToBytePC: PROCEDURE [wpc: RealPC] RETURNS [bpc: BytePC] = INLINE {
odd: BOOLEAN ← wpc < 0;
bpc ← [ABS[wpc]*2+LOOPHOLE[odd, INTEGER]] };
GfiToFrame: PROC [gfi: GFTIndex] RETURNS [GFHandle];
GfiToOffset: PROC [gfi: GFTIndex] RETURNS [CARDINAL];
LinkType: TYPE = ControlDefs.ControlLinkTag;
TypeOfLink: PROCEDURE [l: ControlLink] RETURNS [LinkType] = INLINE {
RETURN[l.tag]};
-- Inline
LCOPY: PROCEDURE [from: POINTER, nwords: CARDINAL, to: POINTER] =
MACHINE CODE BEGIN Mopcodes.zBLT END;
-- LoadStateFormat
ConfigIndex: TYPE = LoadStateFormat.ConfigIndex;
NullConfig: ConfigIndex = LoadStateFormat.NullConfig;
-- CoreSwapDefs
UBBPointer: TYPE = CoreSwapDefs.UBBPointer;
BBHandle: TYPE = CoreSwapDefs.BBHandle;
CallDP: TYPE = CoreSwapDefs.CallDP;
ExternalStateVector: TYPE = CoreSwapDefs.ExternalStateVector;
StartDP: TYPE = CoreSwapDefs.StartDP;
SwapReason: TYPE = CoreSwapDefs.SwapReason;
UserBreakBlock: TYPE = CoreSwapDefs.UserBreakBlock;
-- PrincOps
BytePC: TYPE = PrincOps.BytePC;
-- ProcessDefs
Priority: TYPE = ProcessDefs.Priority;
-- PSBDefs
PHandle: TYPE = PSBDefs.ProcessHandle;
nullPHandle: PHandle = NIL;
-- Segments
AccessOptions: TYPE = Segments.Access;
DefaultAccess: AccessOptions = Segments.DefaultAccess;
DefaultVersion: VersionOptions = Segments.DefaultVersion;
FileHandle: TYPE = Segments.FHandle;
FSHandle: TYPE = Segments.SHandle;
VersionOptions: TYPE = Segments.VersionOptions;
CacheNewFile: PROC [
name: STRING, access: AccessOptions ← DefaultAccess,
version: VersionOptions ← DefaultVersion]
RETURNS [FileHandle];
FileName: PROC [name: STRING, file: FileHandle] = INLINE {
Segments.NameForFile[name,file]};
ModifyFile: PROC [name: STRING] RETURNS [BOOLEAN] = INLINE {
RETURN[Segments.ModifyFile[name]]};
AddModifyProc: PROC [proc: PROC[STRING,FileHandle] RETURNS [BOOLEAN]] = INLINE {
Segments.AddModifyProc[proc]};
InvalidateFileCache: PROC = INLINE {Segments.InvalidateFileCache[]};
OutOfMemory: PROC RETURNS [SIGNAL[needed: PageCount]] = INLINE {
RETURN[LOOPHOLE[SegmentDefs.InsufficientVM]]};
Unknown: PROC RETURNS [SIGNAL] = INLINE {RETURN[LOOPHOLE[DirectoryDefs.BadDirectory]]};
-- StreamDefs
SHandle: TYPE = Streams.Handle;
DestroyStream: PROC [s: SHandle] = INLINE {s.destroy[s]};
END.