-- SwapperOps.Mesa  Edited by Sandman on August 27, 1980  10:02 AM
-- Copyright  Xerox Corporation 1979, 1980

  AllocDefs USING [SwappingProcedure, SwapStrategy],
  AltoDefs USING [MaxMDSPage, PageCount, PageNumber],
  AltoFileDefs USING [vDC],
  Region USING [Count, Handle, Index, NodeObject, Object, Page, PageStatus],
  SegmentDefs USING [
    AccessOptions, AllocInfo, BankIndex, Banks, DataSegmentHandle, FileHandle,
    FileSegmentHandle, Frob, MemoryConfig, ObjectHandle, ObjectType,

SwapperOps: DEFINITIONS SHARES SegmentDefs =
  BEGIN OPEN AltoDefs, SegmentDefs;

  -- Boot Primative Objects

  BootDataSegment: PROCEDURE [base: PageNumber, pages: PageCount]
    RETURNS [seg: DataSegmentHandle];
  BootFileSegment: PROCEDURE [
    file: FileHandle, base: PageNumber, pages: PageCount, access: AccessOptions,
    addr: POINTER] RETURNS [seg: FileSegmentHandle];
  BootFile: PROCEDURE [access: AccessOptions] RETURNS [file: FileHandle];

  -- Primative Object Tables

  Table: TYPE = RECORD [free: Frob, link: TableHandle, seg: DataSegmentHandle];

  TableHandle: TYPE = POINTER TO Table;

  PageTable: TYPE = ARRAY [0..MaxMDSPage] OF SegmentHandle;
  PageMap: TYPE = POINTER TO PageTable;
  RegionTable: TYPE = ARRAY Region.Index OF Region.Handle;

  SystemTable: TYPE = RECORD [
    mdsMap: PageMap,
    table: TableHandle,
    memConfig: POINTER TO MemoryConfig,
    regions: POINTER TO RegionTable];

  systemTable: SystemTable;
  regions: RegionTable;

  -- MDS Region variables

  Page: TYPE = Region.Page;
  Count: TYPE = Region.Count;
  PageStatus: TYPE = Region.PageStatus;

  memConfig: MemoryConfig;
  ff, lf, rover: Region.Page;
  mdsIndex: Region.Index;
  mdsRegion: Region.Object;
  map: PageMap;
  mdsNodes: Region.NodeObject;
  strategyList: POINTER TO AllocDefs.SwapStrategy;
  Alloc: PROCEDURE [
    base: PageNumber, pages: Count, info: AllocInfo, anyWhere: BOOLEAN]
    RETURNS [success: BOOLEAN, page: Page];
  Update: PROCEDURE [
    base: Page, pages: Count, seg: SegmentHandle, simple: BOOLEAN];
  Available: PROCEDURE [page: Page, info: AllocInfo] RETURNS [BOOLEAN];
  Status: PROCEDURE [page: Page] RETURNS [seg: SegmentHandle, status: PageStatus];
  TrySwapping: AllocDefs.SwappingProcedure;
  InvalidNode: ERROR [node: UNSPECIFIED];

  -- Configuration Information

  InitMemoryConfig: PROCEDURE;
  ComputeRealMemory: PROC RETURNS [pages: CARDINAL, banks: Banks];
  initMemoryConfig: POINTER TO SegmentDefs.MemoryConfig = LOOPHOLE[3B];

  Direction: TYPE = {intoMDS, outofMDS};
  MoveCode: PROCEDURE [direction: Direction];
  EnableHyperspace, DisableHyperspace: PROCEDURE;
  EnableBank, DisableBank: PROCEDURE [bank: BankIndex];

  -- Object Management

  FreePage: SegmentHandle = LOOPHOLE[0];
  BusyPage: SegmentHandle = LOOPHOLE[1];

  InvalidObject: SIGNAL [object: POINTER];

  AllocateObject: PROCEDURE [CARDINAL] RETURNS [ObjectHandle];
  LiberateObject: PROCEDURE [ObjectHandle];
  ValidateObject: PROCEDURE [ObjectHandle];
  EnumerateObjects: PROCEDURE [
    type: ObjectType, proc: PROCEDURE [ObjectHandle] RETURNS [BOOLEAN]]
    RETURNS [ObjectHandle];

  -- Allocation Primatives

    base: PageNumber, pages: PageCount, info: AllocInfo, seg: SegmentHandle]
    RETURNS [PageNumber];
  UpdateVM: PROCEDURE [base: PageNumber, pages: PageCount, seg: SegmentHandle];
  SwapOutUnlocked: PROCEDURE [seg: FileSegmentHandle];
  SwapOutCodeSeg: PROCEDURE [seg: FileSegmentHandle];
  UpdateCodebases: PROCEDURE [seg: FileSegmentHandle];

  -- File Length Operations

  NormalizeFileIndex: PROCEDURE [page: PageNumber, byte: CARDINAL]
    RETURNS [PageNumber, CARDINAL];
  RoundFileIndex: PROCEDURE [page: PageNumber, byte: CARDINAL]
    RETURNS [PageNumber, CARDINAL];
  TruncateFileIndex: PROCEDURE [page: PageNumber, byte: CARDINAL]
    RETURNS [PageNumber, CARDINAL];

  -- File Segment Positioning

  FindSegHint: PROCEDURE [seg: FileSegmentHandle];
  PositionSeg: PROCEDURE [seg: FileSegmentHandle, useseg: BOOLEAN]

  MapVM: PROCEDURE [seg: FileSegmentHandle, dc: AltoFileDefs.vDC];

  -- Initialization

  MemInit, MDSRegion, Swapper: PROGRAM;
  InitMemory: PROCEDURE [ffvmp, lfvmp: CARDINAL];