-- file: OpNames.mesa, edited by Bruce, 20-Jun-81 16:55:14

DIRECTORY
  Environment USING [Byte],
  MopcodeNames USING [],
  OpTableDefs USING [],
  Runtime USING [GetTableBase, GlobalFrame],
  Strings USING [AppendSubString, EquivalentSubStrings, SubString, SubStringDescriptor];

OpNames: PROGRAM
  IMPORTS MopcodeNames, Runtime, Strings EXPORTS OpTableDefs =
  BEGIN
  
  CompStringDesc: TYPE = RECORD [offset, length: CARDINAL];
  
  Names: LONG POINTER TO RECORD [
    base: CARDINAL, mnemonic: ARRAY Environment.Byte OF CompStringDesc];
  
  s: STRING ← [16];
  ss: Strings.SubStringDescriptor;
  
  InstName: PUBLIC PROCEDURE [op: Environment.Byte] RETURNS [STRING] =
    BEGIN
    [ss.offset, ss.length] ← Names.mnemonic[op];
    s.length ← 0;
    Strings.AppendSubString[s, @ss];
    RETURN[s]
    END;
    
  UnknownInstruction: PUBLIC SIGNAL [name: STRING] = CODE;
  
  InstCode: PUBLIC PROCEDURE [name: STRING] RETURNS [i: Environment.Byte] =
    BEGIN
    s: Strings.SubString ← @ss;
    ssname: Strings.SubStringDescriptor ← [name, 0, name.length];
    sname: Strings.SubString ← @ssname;
    FOR i IN Environment.Byte DO
      [s.offset, s.length] ← Names.mnemonic[i];
      IF Strings.EquivalentSubStrings[s, sname] THEN EXIT;
      REPEAT FINISHED => BEGIN i ← 0; SIGNAL UnknownInstruction[name] END;
      ENDLOOP;
    RETURN;
    END;
    
  Init: PROC = {
    Names ← Runtime.GetTableBase[Runtime.GlobalFrame[MopcodeNames]];
    ss.base ← Names.base + LOOPHOLE[Names, LONG STRING]};
    
  Init[];
  
  END.