RiscAssemblerDriver.Mesa
Copyright Ó 1987 by Xerox Corporation. All rights reserved.
Bill Jackson (bj) May 27, 1987 8:04:10 pm PDT
DIRECTORY
Commander USING [CommandProc, Register],
IO USING [int, PutF, rope],
OneCasabaParser USING [GetReportStream],
RedBlackTree USING [EachNode, EnumerateIncreasing, Table],
Rope USING [ROPE],
ThreeC4Support USING [GetReportStream],
RiscAssembler USING [EncodingSequence, LabelInstance],
RiscAssemblerATDef USING [ProgramNode],
RiscAssemblerParserDef USING [ParseOneStream];
RiscAssemblerDriver: CEDAR MONITOR
IMPORTS Commander, IO, OneCasabaParser, RedBlackTree, ThreeC4Support, RiscAssemblerParserDef ~ {
ROPE: TYPE ~ Rope.ROPE;
debugFlags: CARDINAL ← 0;
magicHook: RedBlackTree.Table ← NIL;
RiscAssemblerProc: Commander.CommandProc ~ {
ENABLE {
ThreeC4Support.GetReportStream => RESUME[cmd.out];
OneCasabaParser.GetReportStream => { result ← $Failure; RESUME[cmd.out] };
};
root: RiscAssemblerATDef.ProgramNode;
result ← $Success; -- bad assumption?
root ← NARROW[RiscAssemblerParserDef.ParseOneStream[cmd.in, debugFlags, cmd.out]];
IF ( result = $Failure )
THEN {
IO.PutF[cmd.out, "Syntax Errors Detected.\n"];
}
ELSE {
PrintEntry: RedBlackTree.EachNode ~ {
entry: RiscAssembler.LabelInstance ~ NARROW[data];
IO.PutF[cmd.out, "\t%g: %g (%g)\n",
IO.rope[entry.text],
IO.int[entry.address],
IO.int[entry.definedAt]
];
};
code: RiscAssembler.EncodingSequence; symbols: RedBlackTree.Table; next: INT;
IO.PutF[cmd.out, "No Syntax Errors Detected.\n"];
[code, symbols, next] ← root.procs.Assemble[root];
IO.PutF[cmd.out, "Number of Instructions: %g.\n", IO.int[(next - 1)]];
magicHook ← symbols;
RedBlackTree.EnumerateIncreasing[symbols, PrintEntry];
};
};
riscassemblerdoc: ROPE ~ " < file\n\tWhere the contents of file is assembly code for a 'Risc' machine";
Commander.Register["RiscAssembler", RiscAssemblerProc, riscassemblerdoc];
}...