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.