<> <> <> <<>> DIRECTORY PrincOps USING [ControlLink, FrameHandle, InterimPageState, PageCount--, PageNumber--], DiskFace USING [FileID, Type, DontCare, wordsPerPage]; BootFile: DEFINITIONS = BEGIN currentVersion: CARDINAL = 101; <> Location: TYPE = MACHINE DEPENDENT RECORD[ deviceType(0): DiskFace.Type, deviceOrdinal(1): CARDINAL, vp(2): SELECT OVERLAID * FROM disk => [ diskFileID(2): DiskFileID], ethernet => [bootFileNumber(2): CARDINAL, net(3), host(4): CARDINAL _ 0], any => [ a(2), b(3), c(4), d(5), e(6), f(7), g(10B), h(11B): UNSPECIFIED ], ENDCASE ]; DiskFileID: TYPE = MACHINE DEPENDENT RECORD[ <> fID: DiskFace.FileID,-- for disk label -- firstPage: INT,-- for disk label -- firstLink: DiskFace.DontCare--initial boot chain link-- ]; nullLink: DiskFace.DontCare = LOOPHOLE[LONG[0]]; <> <<>> <> <> <<>> <> <> <> <> <<>> <> <<>> <> <> Header: TYPE = MACHINE DEPENDENT RECORD [ -- first page of boot file version(0): CARDINAL _ currentVersion, creationDate(1): LONG CARDINAL, -- System.GreenwichMeanTime pStartListHeader(3): POINTER, -- when continuation kind=initial (relative to that mds) inLoadMode(4): InLoadMode, continuation(5): Continuation, countData(7): CARDINAL, -- number of nonvacant pages (not counting germ) entries(10B): ARRAY [0..0) OF Entry]; Trailer: TYPE = MACHINE DEPENDENT RECORD [ -- entry table after exhausting "Header" version(0): CARDINAL _ currentVersion, entries(1): ARRAY [0..0) OF Entry]; InLoadMode: TYPE = {load, restore}; Continuation: TYPE = MACHINE DEPENDENT RECORD [ vp(0): SELECT kind(0:0..7): ContinuationKind FROM initial => [ mdsi(0:8..15): MDSIndex, destination(1): PrincOps.ControlLink], resumptive => [ mdsi(0:8..15): MDSIndex -- for WriteMDS hack --, resumee(1): PrincOps.FrameHandle], ENDCASE]; ContinuationKind: TYPE = {initial, resumptive}; Entry: TYPE = MACHINE DEPENDENT RECORD [ page (0): CARDINAL--PrincOps.PageNumber--, value (1): PrincOps.InterimPageState]; MDSIndex: TYPE = RECORD [index: [0..256)]; -- high order bits of MDS base pointer MemorySizeToFileSize: PROCEDURE [countReal: PrincOps.PageCount] RETURNS [INT] = <> INLINE BEGIN RETURN[ countReal -- total data pages +1 -- header page +(MAX[countReal, maxEntriesPerHeader]-maxEntriesPerHeader+maxEntriesPerTrailer-1) /maxEntriesPerTrailer -- trailer pages ] END; maxEntriesPerHeader: CARDINAL = (DiskFace.wordsPerPage-SIZE[Header])/SIZE[Entry]; maxEntriesPerTrailer: CARDINAL = (DiskFace.wordsPerPage-SIZE[Trailer])/SIZE[Entry]; END.