file: OpNames.mesa, edited by Bruce, 20-Jun-81 16:55:14
Last Edited by: Maxwell, August 12, 1983 8:37 am
DIRECTORY
Basics USING [BYTE],
ConvertUnsafe USING [EqualSubStrings, SubString, SubStringToRope],
MopcodeNames USING [],
OpTableDefs USING [],
PrincOpsUtils USING [CodeBase, GlobalFrame],
Rope USING [Flatten, Length, ROPE];
OpNames: PROGRAM
IMPORTS ConvertUnsafe, MopcodeNames, PrincOpsUtils, Rope EXPORTS OpTableDefs =
BEGIN
CompStringDesc: TYPE = RECORD [offset, length: CARDINAL];
Names: LONG POINTER TO RECORD [
base: CARDINAL, mnemonic: ARRAY Basics.BYTE OF CompStringDesc];
base: LONG STRING;
InstName: PUBLIC PROCEDURE [op: Basics.BYTE] RETURNS [Rope.ROPE] =
BEGIN
ss: ConvertUnsafe.SubString;
ss.base ← base;
[ss.offset, ss.length] ← Names.mnemonic[op];
RETURN[ConvertUnsafe.SubStringToRope[ss]]
END;
UnknownInstruction: PUBLIC SIGNAL [name: Rope.ROPE] = CODE;
InstCode: PUBLIC PROCEDURE [name: Rope.ROPE] RETURNS [i: Basics.BYTE] =
BEGIN
sname, ss: ConvertUnsafe.SubString;
ss.base ← base;
sname.offset ← 0;
sname.length ← name.Length[];
sname.base ← LOOPHOLE[Rope.Flatten[name]];
FOR i IN Basics.BYTE DO
[ss.offset, ss.length] ← Names.mnemonic[i];
IF ConvertUnsafe.EqualSubStrings[ss, sname, FALSE] THEN EXIT;
REPEAT FINISHED => BEGIN i ← 0; SIGNAL UnknownInstruction[name] END;
ENDLOOP;
RETURN;
END;
Init: PROC = {
Names ← PrincOpsUtils.CodeBase[LOOPHOLE[PrincOpsUtils.GlobalFrame[MopcodeNames]]];
base ← Names.base + LOOPHOLE[Names, LONG STRING]};
Init[];
END.