-- SMLoad.Mesa
-- last edit by Schmidt, May 13, 1983 3:17 pm 
-- last edit by Satterthwaite, August 15, 1983 11:36 am 
-- the new modeller loader interface

DIRECTORY
  BcdDefs: TYPE USING [Link, NameRecord],
  BcdOps: TYPE USING [BcdBase, EXPHandle, MTHandle],
  File: TYPE USING [Capability],
  IO: TYPE USING [Handle],
  MiscAlpha: TYPE USING [alpha],
  Mopcodes: TYPE USING [zMISC],
  PilotLoaderOps: TYPE USING [FrameList],
  PilotLoadStateOps: TYPE USING [ConfigIndex, Map],
  PrincOps: TYPE USING [
    ControlLink, ControlModule, GFTIndex, GlobalFrameHandle, MaxNGfi,
    NullControl, NullLink],
  Rope: TYPE USING [Text],
  TimeStamp: TYPE USING [Null, Stamp];
			
			
SMLoad: DEFINITIONS ~ {

 -- this is an Interface Record in the usual parlance
 -- for procedures, this ControlLink is [procedure[gfi: gfi, ep: ep, tag: TRUE]
 -- for exported variables this is the absolute address of the variable
 -- for PROGRAM modules this is a GlobalFramePointer
  IR: TYPE~REF InterfaceRecordRep;
  InterfaceRecordRep: TYPE~RECORD[
    name: ATOM←NIL,	-- the interface (module) name (note that Tree.Name = ATOM)
    stamp: TimeStamp.Stamp←TimeStamp.Null,	-- func time stamp
    resolved: BOOL←FALSE,	-- all links have been filled in
    body: SEQUENCE size: NAT OF RECORD[
      link: PrincOps.ControlLink←PrincOps.NullLink]	-- the actual link
    ];

  LoadInfo: TYPE~REF LoadInfoRecord;
  LoadInfoRecord: TYPE~RECORD[
    bcdBase: BcdOps.BcdBase←NIL,	-- the in core bcd
    linksResolved: BOOL←FALSE,	-- => all links for these frames are resolved
    rtStarted: BOOL←FALSE,	-- => AcquireTypesAndLiterals has been called on this bcd
    cm: PrincOps.ControlModule←PrincOps.NullControl,	-- the control module to start
    gfiMap: GfiMap←NIL,		-- [0 to bcdbase.firstdummy+bcdbase.nDummies)
    imports: IRSeq←NIL,			-- [0 to bcdbase.nImports)
    exports: IRSeq←NIL,			-- export[0] is the global frame
    configGfi: PrincOps.GFTIndex←0,	-- dummy gfi in resulting loaded config
    map: PilotLoadStateOps.Map←NIL,	-- map for this bcd, not fake config
    frameList: PilotLoaderOps.FrameList←NIL,	-- ptrs to frames
    body: SEQUENCE size: NAT OF LoadRecord];	-- (> 1 only for configs)
  LoadRecord: TYPE~RECORD[
    frame: PrincOps.GlobalFrameHandle←NIL,	-- the gfh for module
    frameSize: CARDINAL←0,			-- shadows the mth.framesize
    nGfi: NAT←0];				-- shadows the mth.ngfi
	
 -- For gfiMap[0 .. bcdbase.firstdummy) this is the real gfi for the module.
 -- for gfiMap[bcdbase.firstdummy .. bcdbase.ndummies + bcdbase.firstdummy),
 -- this is the index into the ImportTable for the dummy gfi's
  GfiMap: TYPE~REF GfiMapSeq;
  GfiMapSeq: TYPE~RECORD[
    size: NAT←0,
    body: SEQUENCE maxsize: NAT OF RECORD[
      index: PrincOps.GFTIndex,
      whichOne: [0..PrincOps.MaxNGfi)]	-- this ranges between 0 and 3
    ];

 -- The ith element of this is the interface record associated with the ith import (zero origin).
 -- Import #3 has been matched up with InterfaceRecord import[3], etc.
  IRSeq: TYPE~REF IRSeqRecord;
  IRSeqRecord: TYPE~RECORD[
    body: SEQUENCE size: NAT OF IR];

  ReplaceResult: TYPE ~ {
    ok, configNotReplaceable, frameTooBig, ngfiTooBig, cantCopyOldBcd,
    checkForMRFailed, compilerSaysNo};

  InvalidFile: ERROR[File.Capability];	-- raised by LoadGlobalFrames and LoadIncremental

  LoadGlobalFrames: PROC[
	cap: File.Capability, config: PilotLoadStateOps.ConfigIndex,
	oldConfigGfi: PrincOps.GFTIndex, out: IO.Handle] 
    RETURNS[loadInfo: LoadInfo, newConfigGfi: PrincOps.GFTIndex];

 -- will read in bcd header and map code segments
  LoadIncremental: PROC[bcdcap: File.Capability, loadInfo: LoadInfo, out: IO.Handle]
    RETURNS[replaceResult: ReplaceResult];

  BuildInterface: PROC[loadInfo: LoadInfo, eth: BcdOps.EXPHandle] RETURNS[ir: IR];
  BuildFramePtrInterface: PROC[bcdBase: BcdOps.BcdBase, frame: PrincOps.GlobalFrameHandle]
    RETURNS[ir: IR];

  NSToRope: PROC[bcdBase: BcdOps.BcdBase, name: BcdDefs.NameRecord] RETURNS[Rope.Text];
  ConvertLink: PROC [bl: BcdDefs.Link] RETURNS [cl: PrincOps.ControlLink];

  aLongBlkZ: MiscAlpha.alpha = 102b;

  Zero: PROC[lp: LONG POINTER, nwords: CARDINAL] RETURNS[LONG POINTER] ~
    MACHINE CODE {Mopcodes.zMISC, aLongBlkZ};

 -- frame link space operations
  OpenLinkSpace: PROC [
  	frame: PrincOps.GlobalFrameHandle, mth: BcdOps.MTHandle, bcd: BcdOps.BcdBase←NIL]
    RETURNS[LONG POINTER];
  ReadLink: PROC[offset: CARDINAL] RETURNS[link: PrincOps.ControlLink];
  WriteLink: PROC[offset: CARDINAL, link: PrincOps.ControlLink];
  CloseLinkSpace: PROC[frame: PrincOps.GlobalFrameHandle];


 -- allocation/deallocation

  AllocateLoadInfo: PROC[bcdbase: BcdOps.BcdBase] RETURNS[LoadInfo];
  FreeLoadInfo: PROC[loadInfo: LoadInfo] RETURNS[LoadInfo];	-- always gives NIL

  AllocateIR: PROC[name: ATOM, size: NAT] RETURNS[IR];
  FreeIR: PROC[ir: IR] RETURNS[IR];	-- always gives NIL

  }.