-- DI.mesa  last edit, Bruce  October 25, 1980  9:02 PM

DIRECTORY
  DebugFormat USING [BitAddress, Foo],
  Inline USING [DIVMOD],
  MachineDefs USING [BYTE, ControlLink, WordLength],
  PrincOps USING [ControlLink],
  Symbols USING [
    ArraySEIndex, CSEIndex, CTXIndex, HTIndex, HTNull, IncludedCTXIndex, ISEIndex,
    MDIndex, RecordSEIndex, SEIndex, SERecord, TransferMode, TypeClass],
  Table USING [Base, Limit];

DI: DEFINITIONS IMPORTS Inline =
  BEGIN OPEN Symbols;

  Foo: TYPE = DebugFormat.Foo;
  BitAddress: TYPE = DebugFormat.BitAddress;
  CSEIndex: TYPE = Symbols.CSEIndex;
  CTXIndex: TYPE = Symbols.CTXIndex;
  HTIndex: TYPE = Symbols.HTIndex;
  RecordSEIndex: TYPE = Symbols.RecordSEIndex;
  SEIndex: TYPE = Symbols.SEIndex;
  ISEIndex: TYPE = Symbols.ISEIndex;

  EnumeratedSEIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO
    enumerated cons Symbols.SERecord;
  ArrayDescSEIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO
    arraydesc cons Symbols.SERecord;
  TransferSEIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO
    transfer cons Symbols.SERecord;
  UnionSEIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO
    union cons Symbols.SERecord;
  SubrangeSEIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO
    subrange cons Symbols.SERecord;
  LongSEIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO
    long cons Symbols.SERecord;
  SequenceSEIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO
    sequence cons Symbols.SERecord;

  ValFormat: TYPE = RECORD [
    SELECT tag: * FROM
      none => [],
      card => [],
      int => [],
      char => [],
      pointer => [],
      relative => [],
      string => [],
      enum => [esei: EnumeratedSEIndex],
      ENDCASE];

  NumberType: TYPE = {nogood, one, two};  -- ordered for Words
  Words: TYPE = ARRAY NumberType[nogood..two) OF WORD;

  Number: TYPE = RECORD [type: NumberType, pad: [0..37777B],
    body: SELECT OVERLAID * FROM
      integer => [i: INTEGER],
      cardinal => [c: CARDINAL],
      pointer => [p: POINTER],
      unspecified => [u: UNSPECIFIED],
      rep => [sign: BOOLEAN, fill1: [0..77777B)],
      longInt => [li: LONG INTEGER],
      longCard => [lc: LONG CARDINAL],
      longPoint => [lp: LONG POINTER],
      longUnspec => [lu: LONG UNSPECIFIED],
      longRep => [fill2: UNSPECIFIED, lsign: BOOLEAN, fill3: [0..77777B)],
      numArray => [w: Words],
      ENDCASE];

  NumAddr: TYPE = RECORD [SELECT OVERLAID * FROM
      int => [pi: LONG POINTER TO INTEGER],
      card => [pc: LONG POINTER TO CARDINAL],
      lInt => [pli: LONG POINTER TO LONG INTEGER],
      lCard => [plc: LONG POINTER TO LONG CARDINAL],
      ENDCASE];

  NumFormat: TYPE = RECORD [SELECT OVERLAID * FROM
      int => [i: INTEGER],
      card => [c: CARDINAL],
      bytes => [b1, b2: MachineDefs.BYTE],
      nibbles => [n1, n2, n3, n4: [0..16)],
      ENDCASE];

  LongNumFormat: TYPE = RECORD [ SELECT OVERLAID * FROM
      int => [i: LONG INTEGER],
      card => [c: LONG CARDINAL],
      words => [w1, w2: CARDINAL],
      bytes => [b1, b2, b3, b4: MachineDefs.BYTE],
      ENDCASE];

  Desc: TYPE = RECORD [base: POINTER, length: CARDINAL];
  LongDesc: TYPE = RECORD [base: LONG POINTER, length: CARDINAL];

  dereferenced: BOOLEAN;

  MakeLongType: PROC [rType: SEIndex] RETURNS [type: CSEIndex];
  GetNumber: PROC [f: Foo, code: Err ← invalidNumber] RETURNS [n: Number];
  Format: PROC [sei: SEIndex] RETURNS [vf: ValFormat, intSub: BOOLEAN];
  GetValue: PROC [f: Foo];
  PutValue: PROC [lhs: Foo, from: LONG POINTER];
  Normalize: PROC [bits: CARDINAL] RETURNS [word, offset: CARDINAL] =
    INLINE {[word, offset] ← Inline.DIVMOD[bits, MachineDefs.WordLength]};

  GetControlLink: PROC [Foo] RETURNS [PrincOps.ControlLink];
  DerefProcDesc: PROC [PrincOps.ControlLink] RETURNS [PrincOps.ControlLink];
  NotAProcedure: ERROR [cl: MachineDefs.ControlLink];

  GetDesc: PROC [Foo] RETURNS [LongDesc, ArraySEIndex];
  GetLongDesc: PROC [Foo] RETURNS [LongDesc, ArraySEIndex];
  NotAnArray: ERROR;
  NotHere: ERROR;
  SizeMismatch: ERROR;

  SetDefaultRadix: PROC [CARDINAL];
  CheckClass: PROC [tc: TypeClass, f: Foo] RETURNS [UNSPECIFIED];
  Pad: PROC [f: Foo, rsei: RecordSEIndex] RETURNS [pad: CARDINAL];
  MapCtx: PROC [MDIndex, CTXIndex] RETURNS [IncludedCTXIndex];
  SearchCtxList: PROC [hti: HTIndex, ctx: CTXIndex] RETURNS [sei: ISEIndex];
  SearchCtxForVal: PROC [
    val: UNSPECIFIED, ctx: CTXIndex, tm: TransferMode]
    RETURNS [sei: ISEIndex];
  SearchCtxForProc: PROC [val: UNSPECIFIED, ctx: CTXIndex]
    RETURNS [sei: ISEIndex];
  SearchCtxForSignal: PROC [val: UNSPECIFIED, ctx: CTXIndex]
    RETURNS [sei: ISEIndex];
  TypeForSe: PROC [sei: SEIndex] RETURNS [type: CSEIndex]; 
  FindField: PROC [f: Foo, pad: CARDINAL, isei: ISEIndex]
    RETURNS [field: Foo];
  TagIsei: PROC [f: Foo, pad: CARDINAL, usei: UnionSEIndex]
    RETURNS [isei: ISEIndex];

  VType: TYPE = {controlled, overlaid, computed};
  VariantType: PROC [UnionSEIndex] RETURNS [VType];

  ResetLongs: PROC;

  Err: TYPE = {callingInline, cantLengthen, constructor, indexTooBig, invalidAddress,
    invalidNumber, invalidPointer, invalidSubrange, nilChk, notFound, notProcDesc,
    notRelative, notType, notUniqueField, notValidField, overflow, relation, 
    sizeMismatch, tooManyArgs, typeMismatch, unknownVariant, wontDump, worryCall,
    wrongBase, wrongNumberArgs, wrongBrackets, 
    wrongDollar, notArray, spare1, spare2, spare3};
  
  AbortWithError: PROC [code: Err, hti: HTIndex ← Symbols.HTNull];
  Error: PROC [code: Err, hti: HTIndex ← Symbols.HTNull];
  
  END.