<> <> <> <> <> DIRECTORY BasicTime USING [GMT, Now, Period], Commander USING [CommandProc, Register], CommandTool USING [ArgumentVector, CurrentWorkingDirectory, Parse], FS, IO, Rope, MicroDefs, MicroGlobalVars, MicroOps, MicroUtils USING [RestartBuiltins, RestartAcc]; MicroMainImpl: CEDAR MONITOR IMPORTS BasicTime, Commander, CommandTool, IO, Rope, MicroDefs, MicroGlobalVars, MicroOps, MicroUtils = BEGIN OPEN MicroDefs, MicroGlobalVars; StartMicro: ENTRY Commander.CommandProc = { ENABLE { UNWIND => NULL; Failure => { IF reportStrm#NIL THEN reportStrm.PutRope[explanation]; result _ $Failure; RESUME; }; }; wDir: ROPE _ CommandTool.CurrentWorkingDirectory[]; argv: CommandTool.ArgumentVector _ CommandTool.Parse[cmd]; cmdLine: ROPE = Rope.Concat["Micro", cmd.commandLine]; srcFileList: MicroDefs.SrcFile; ok: BOOL; start: BasicTime.GMT = BasicTime.Now[]; fileExtnMB: ROPE = "MB"; dumpSymStartIndex: INTEGER _ -1; [srcFileList, ok] _ MicroOps.InitMicroVars[cmdLine, wDir, argv]; MicroUtils.RestartAcc[]; MicroUtils.RestartBuiltins[]; IF ~ok THEN RETURN; IF restoreSymbolsFile = NIL THEN { MicroOps.InitSymbolTable[]; [] _ DefineBuiltIn[$BUILTIN, biBUILTIN]; [] _ DefineBuiltIn[$INSERT, biINSERT]; MicroOps.InitMacroOps[]; } ELSE { IF NOT MicroOps.RecoverSymbols[restoreSymbolsFile] THEN MicroOps.ReportError[msg: IO.PutFR["\n Can't recover symbols from %g\n", IO.rope[restoreSymbolsFile]], abort: TRUE]; restoreSymbolsFile _ NIL; }; MicroOps.InitAcc[]; MicroOps.InitIn[]; IF mbExtn = NIL THEN mbExtn _ fileExtnMB; -- MicroOps.InitOut[fileExtnMB]; FOR sfl: SrcFile _ srcFileList, sfl.next UNTIL sfl = NIL DO MicroOps.InitReadStmt[convertToUpperFlag OR sfl.upperCaseFlag]; IF ~MicroOps.InPush[sfl] THEN { MicroOps.ReportError[ IO.PutFR["\n Source file %g doesn't exist - continuing\n", IO.rope[sfl.fullName] ], FALSE]; LOOP; }; WHILE MicroOps.ReadStmt[] DO first: INTEGER = MicroOps.GetStmtInteger[1]; IF (first >= 0) AND (first < 256) AND (MicroOps.GetStmtChar[1] = ':) THEN { MicroOps.PutStmtChar[1, endc]; MicroOps.Assemble[]; -- ignore :, always process } ELSE IF ~ignore THEN MicroOps.Assemble[]; -- don't process if ignoring ENDLOOP; -- statement loop ENDLOOP; -- files loop IF symbolsFileRec # NIL THEN { [ , dumpSymStartIndex] _ MicroOps.DumpSymbols[symbolsFileRec]; symbolsFileRec.strm.Close[]; symbolsFileRec _ NIL; }; MicroOps.EndOutput[dumpSymStartIndex]; MicroOps.EndListing[expandedListingFlag]; BEGIN now: BasicTime.GMT = BasicTime.Now[]; secs: INT = BasicTime.Period[start, now]; reportStrm.PutF["Finished at %g, (%g seconds)\n", IO.time[now], IO.int[secs]]; reportStrm.PutF["There were %g error(s) and %g warning(s)\n", IO.int[errorCount], IO.int[warningCount] ]; IF errorFileRec.strm # NIL THEN errorFileRec.strm.PutF["There were %g error(s) and %g warning(s)\n", IO.int[errorCount], IO.int[warningCount] ]; IF errorCount#0 THEN result _ $Failure; END; IF errorFileRec.strm # NIL THEN { errorFileRec.strm.Close[]; errorFileRec.strm _ NIL; }; }; DefineBuiltIn: PROC[sym: ATOM, bsNum: INTEGER] = { <> symIndex: INTEGER; sObj: SymbolObj; [symIndex, sObj] _ MicroOps.PutInSymbol[sym, builtInType]; sObj.sMisc _ bsNum; }; Commander.Register["Micro", StartMicro, "Assembles microcode"]; END.