-- Copyright (C) 1984, 1985 by Xerox Corporation. All rights reserved. -- GateParameterTajo.mesa, HGM, 5-Oct-85 20:07:40 DIRECTORY CmFile USING [Handle, TableError], Format USING [NetworkNumber], HeraldWindow USING [window], Process USING [Priority, priorityForeground], Put USING [NetworkNumber, Number, Text], Runtime USING [GetBuildTime], String USING [AppendChar, AppendDecimal, AppendNumber, AppendString], StringLookUp USING [noMatch, TableDesc], System USING [AdjustGreenwichMeanTime, GreenwichMeanTime, NetworkNumber, nullNetworkNumber], Time USING [Append, Packed, Unpack, Unpacked], Token USING [Boolean, Decimal, NetworkNumber, Octal], ToolWindow USING [Deactivate], Buffer USING [], BufferOps USING [Defaults, GetDefaults, SetDefaults], DriverTypes USING [DeviceType], Driver USING [GetDeviceChain, Network], Protocol1 USING [Family, GetContext, GetFamiltyUnit], PupDefs USING [PupPackageMake, SmashMyHostNumber], PupRouterDefs USING [NetworkContext], Router USING [SetNetworkID], RoutingTable USING [NetworkContext], GateDefs USING [typescript], Indirect USING [Close, NextValue, OpenSection], MicrocodeVersion USING [VERSION, VersionResult], PhoneCreate USING [CreateSimplePhoneNet], RoutingFudges USING [SetNSFudge, SetPupFudge], Trouble USING [Bug, WrapTypescriptFile]; GateParameterTajo: PROGRAM IMPORTS CmFile, Format, HeraldWindow, Put, Process, Runtime, String, System, Time, Token, ToolWindow, BufferOps, Driver, GateDefs, Indirect, Protocol1, PupDefs, Router, MicrocodeVersion, PhoneCreate, RoutingFudges, Trouble EXPORTS Buffer, GateDefs = BEGIN Network: PUBLIC TYPE = Driver.Network; PrintHost: PROCEDURE [ name: LONG STRING, board, pupNet: CARDINAL, nsNet: System.NetworkNumber] = BEGIN Put.Text[NIL, name]; IF board # LAST[CARDINAL] THEN BEGIN Put.Text[NIL, " number "L]; Put.Number[NIL, board, [8, FALSE, TRUE, 0] ]; END; Put.Text[NIL, " is Pup network "L]; Put.Number[NIL, pupNet, [8, FALSE, TRUE, 0] ]; Put.Text[NIL, " and NS network "L]; Put.NetworkNumber[NIL, nsNet, octal]; Put.Text[NIL, " ("L]; Put.NetworkNumber[NIL, nsNet, productSoftware]; Put.Text[NIL, ").\n"L]; END; ScanParameterFile: PUBLIC PROCEDURE RETURNS [ priority: Process.Priority ¬ Process.priorityForeground, disableNSRouting: BOOLEAN ¬ FALSE] = BEGIN cmFile: CmFile.Handle; Option: TYPE = MACHINE DEPENDENT{ ethernetOne(0), ethernet, leasedLine, pupHostNumber, buffers, priority, typescript, deactivateHerald, disableNSRouting, extraHops, noMatch(StringLookUp.noMatch)}; DefinedOption: TYPE = Option [ethernetOne..extraHops]; CheckType: PROCEDURE [h: CmFile.Handle, table: StringLookUp.TableDesc] RETURNS [index: CARDINAL] = Indirect.NextValue; MyNextValue: PROCEDURE [ h: CmFile.Handle, table: LONG DESCRIPTOR FOR ARRAY DefinedOption OF LONG STRING] RETURNS [index: Option] = LOOPHOLE[CheckType]; optionTable: ARRAY DefinedOption OF LONG STRING ¬ [ ethernetOne: "EthernetOne"L, ethernet: "Ethernet"L, leasedLine: "Leased Line"L, pupHostNumber: "Pup Host Number"L, buffers: "Buffers"L, priority: "Priority"L, typescript: "Typescript"L, deactivateHerald: "Deactivate Herald Window"L, disableNSRouting: "Disable NS Routing"L, extraHops: "Extra Hops"L]; leasedLines: CARDINAL ¬ 0; cmFile ¬ Indirect.OpenSection["Gateway"L]; IF cmFile = NIL THEN BEGIN Message["Can't find [Gateway] section in Parameter file"L]; RETURN; END; DO option: Option; option ¬ MyNextValue[cmFile, DESCRIPTOR[optionTable] ! CmFile.TableError => BEGIN IF name[0] # '; THEN Message["Unrecognized parameter: ", name]; RETRY; END]; SELECT option FROM noMatch => EXIT; ethernetOne => -- (octal) BEGIN board: CARDINAL ¬ Token.Decimal[cmFile]; pupNet: CARDINAL ¬ Token.Octal[cmFile]; nsNet: System.NetworkNumber ¬ Token.NetworkNumber[cmFile, octal]; MakeSurePupIsOn[]; SetPupNetworkID[board, ethernetOne, pupNet]; IF nsNet # System.nullNetworkNumber THEN BEGIN CheckNSNetworkID[board, ethernetOne, nsNet]; [] ¬ Router.SetNetworkID[board, ethernetOne, nsNet]; END; PrintHost["EthernetOne"L, board, pupNet, nsNet]; END; ethernet => -- (octal) BEGIN board: CARDINAL ¬ Token.Decimal[cmFile]; pupNet: CARDINAL ¬ Token.Octal[cmFile]; nsNet: System.NetworkNumber ¬ Token.NetworkNumber[cmFile, octal]; MakeSurePupIsOn[]; SetPupNetworkID[board, ethernet, pupNet]; IF nsNet # System.nullNetworkNumber THEN BEGIN CheckNSNetworkID[board, ethernet, nsNet]; [] ¬ Router.SetNetworkID[board, ethernet, nsNet]; END; PrintHost["Ethernet"L, board, pupNet, nsNet]; END; leasedLine => -- (octal) BEGIN line: WORD ¬ Token.Octal[cmFile]; pupNet: CARDINAL ¬ Token.Octal[cmFile]; nsNet: System.NetworkNumber ¬ Token.NetworkNumber[cmFile, octal]; MakeSurePupIsOn[]; leasedLines ¬ leasedLines + 1; PhoneCreate.CreateSimplePhoneNet[line, pupNet, nsNet]; SetPupNetworkID[leasedLines, phonenet, pupNet]; IF nsNet # System.nullNetworkNumber THEN BEGIN CheckNSNetworkID[leasedLines, phonenet, nsNet]; [] ¬ Router.SetNetworkID[leasedLines, phonenet, nsNet]; END; PrintHost["The Phone Line (NS Mode)"L, leasedLines, pupNet, nsNet]; END; pupHostNumber => BEGIN me: CARDINAL ¬ Token.Octal[cmFile]; PupDefs.SmashMyHostNumber[me]; MessageOctal["Set my Pup Host Number to "L, me]; END; buffers => -- (decimal) BEGIN defaults: ARRAY BufferOps.Defaults OF CARDINAL ¬ BufferOps.GetDefaults[]; buffers: CARDINAL ¬ Token.Decimal[cmFile]; defaults[bias] ¬ defaults[bias] + buffers; BufferOps.SetDefaults[defaults]; MessageDecimal["Set number of buffers to "L, buffers]; END; priority => -- (decimal) BEGIN priority ¬ Token.Decimal[cmFile]; MessageDecimal["Priority will be "L, priority]; END; typescript => -- BEGIN pages: CARDINAL ¬ Token.Decimal[cmFile]; Trouble.WrapTypescriptFile[GateDefs.typescript, pages]; MessageDecimal[ "Typescript file will be trimmed at "L, pages, " pages"L]; END; deactivateHerald => -- BEGIN IF Token.Boolean[cmFile] THEN BEGIN Message["Deactivating Herald Window"L]; [] ¬ ToolWindow.Deactivate[HeraldWindow.window]; END ELSE Message["Didn't deactivate Herald Window"L]; END; disableNSRouting => -- BEGIN IF Token.Boolean[cmFile] THEN BEGIN Message["Deactivating NS Router"L]; disableNSRouting ¬ TRUE; END ELSE Message["Didn't deactivate NS Router"L]; END; extraHops => -- BEGIN IF Token.Boolean[cmFile] THEN BEGIN Message["Adding Extra Hops"L]; RoutingFudges.SetPupFudge[1]; RoutingFudges.SetNSFudge[1]; END ELSE Message["Didn't add any Extra Hops"L]; END; ENDCASE => ERROR; ENDLOOP; Indirect.Close[cmFile]; END; MessageDecimal: PROCEDURE [ one: LONG STRING, num: CARDINAL, two, three: LONG STRING ¬ NIL] = BEGIN text: STRING = [100]; String.AppendString[text, one]; String.AppendDecimal[text, num]; IF two # NIL THEN String.AppendString[text, two]; IF three # NIL THEN String.AppendString[text, three]; String.AppendChar[text, '.]; String.AppendChar[text, '\n]; LogString[text]; END; MessageOctal: PROCEDURE [ one: LONG STRING, num: CARDINAL, two, three: LONG STRING ¬ NIL] = BEGIN text: STRING = [100]; String.AppendString[text, one]; String.AppendNumber[text, num, 8]; IF two # NIL THEN String.AppendString[text, two]; IF three # NIL THEN String.AppendString[text, three]; String.AppendChar[text, '.]; String.AppendChar[text, '\n]; LogString[text]; END; Message: PROCEDURE [one, two, three: LONG STRING ¬ NIL] = BEGIN text: STRING = [100]; String.AppendString[text, one]; IF two # NIL THEN String.AppendString[text, two]; IF three # NIL THEN String.AppendString[text, three]; String.AppendChar[text, '.]; String.AppendChar[text, '\n]; LogString[text]; END; LogString: PROCEDURE [text: LONG STRING] = BEGIN Put.Text[NIL, text]; END; PrintTajoVersion: PROCEDURE = BEGIN temp: STRING = [100]; packed: Time.Packed; unpacked: Time.Unpacked; String.AppendString[temp, "Running on Tajo of "L]; Time.Append[temp, Time.Unpack[Runtime.GetBuildTime[]], TRUE]; String.AppendString[temp, " = "L]; packed ¬ Runtime.GetBuildTime[]; unpacked ¬ Time.Unpack[packed, [useThese[[west, 0, 0, 366, 366]]]]; Time.Append[temp, unpacked, TRUE]; String.AppendString[temp, ".\n"L]; LogString[temp]; END; PrintMicrocodeInfo: PROCEDURE = BEGIN CatchKrock: PROCEDURE RETURNS [MicrocodeVersion.VersionResult] = BEGIN RETURN[MicrocodeVersion.VERSION[]]; END; temp: STRING = [200]; version: MicrocodeVersion.VersionResult ¬ CatchKrock[ ! ANY => GOTO NoVersion]; when: System.GreenwichMeanTime ¬ -- 0 => Jan 1, 1901 System.AdjustGreenwichMeanTime[[0], version.releaseDate*86400]; unpacked: Time.Unpacked; String.AppendString[temp, "This microcode was built on "L]; unpacked ¬ Time.Unpack[when, [useThese[[west, 0, 0, 366, 366]]]]; Time.Append[temp, unpacked, FALSE]; temp.length ¬ temp.length - 9; -- Discard time = " xx:xx:xx" String.AppendString[temp, ".\n"L]; String.AppendString[temp, "This machine is a "L]; String.AppendString[temp, SELECT version.machineType FROM dolphin => "Dolphin"L, dorado => "Dorado"L, dandelion => "Dandelion"L, dicentra => "Dicentra"L, ENDCASE => "??"L]; String.AppendString[temp, ". FloatintPoint = "L]; String.AppendString[temp, IF version.floatingPoint THEN "TRUE"L ELSE "FALSE"L]; String.AppendString[temp, ", Cedar = "L]; String.AppendString[temp, IF version.cedar THEN "TRUE"L ELSE "FALSE"L]; String.AppendString[temp, ".\n"L]; LogString[temp]; EXITS NoVersion => LogString["This microcode won't tell me when it was built.\n"]; END; turnedOnAlready: BOOL ¬ FALSE; MakeSurePupIsOn: PROCEDURE = BEGIN IF turnedOnAlready THEN RETURN; [] ¬ PupDefs.PupPackageMake[]; turnedOnAlready ¬ TRUE; END; SetPupNetworkID: PROCEDURE [ physicalOrder: CARDINAL, medium: DriverTypes.DeviceType, newNetID: CARDINAL] = BEGIN network: Driver.Network ¬ GetNthDevice[physicalOrder, medium]; context: PupRouterDefs.NetworkContext ¬ Protocol1.GetContext[network, pup]; family: Protocol1.Family ¬ Protocol1.GetFamiltyUnit[pup]; IF context.pupNetNumber # 0 AND context.pupNetNumber # newNetID THEN BEGIN text: STRING = [200]; String.AppendString[text, "Wrong Pup network number. Expected: "L]; String.AppendNumber[text, newNetID, 8]; String.AppendString[text, ", Found: "L]; String.AppendNumber[text, context.pupNetNumber, 8]; Trouble.Bug[text]; END; context.pupNetNumber ¬ newNetID; family.stateChanged[network, context, add]; END; CheckNSNetworkID: PROCEDURE [ physicalOrder: CARDINAL, medium: DriverTypes.DeviceType, newNetID: System.NetworkNumber] = BEGIN ENABLE UNWIND => NULL; network: Driver.Network ¬ GetNthDevice[physicalOrder, medium]; context: RoutingTable.NetworkContext ¬ Protocol1.GetContext[network, ns]; IF context.netNumber # System.nullNetworkNumber AND context.netNumber # newNetID THEN BEGIN text: STRING = [200]; String.AppendString[text, "Wrong NS network number. Expected: "L]; AppendNetNumbers[text, newNetID]; String.AppendString[text, ", Found: "L]; AppendNetNumbers[text, context.netNumber]; Trouble.Bug[text]; END; network ¬ NIL; -- Compiler and Debugger don't cooperate END; AppendNetNumbers: PROCEDURE [string: LONG STRING, net: System.NetworkNumber] = BEGIN words: RECORD [a, b: WORD] = LOOPHOLE[net]; AppendNetNumber[string, net]; IF words.b < 256 THEN BEGIN String.AppendString[string, " ("L]; AppendNetNumberOctal[string, net]; String.AppendString[string, ")"L]; END; END; AppendNetNumber: PROCEDURE [string: LONG STRING, net: System.NetworkNumber] = BEGIN Append: PROCEDURE [s: LONG STRING, clientData: LONG POINTER] = BEGIN String.AppendString[string, s]; END; Format.NetworkNumber[Append, net, productSoftware]; END; AppendNetNumberOctal: PROCEDURE [string: LONG STRING, net: System.NetworkNumber] = BEGIN Append: PROCEDURE [s: LONG STRING, clientData: LONG POINTER] = BEGIN String.AppendString[string, s]; END; Format.NetworkNumber[Append, net, octal]; END; GetNthDevice: PROCEDURE [ physicalOrder: CARDINAL, medium: DriverTypes.DeviceType] RETURNS [network: Driver.Network] = BEGIN i: CARDINAL ¬ 0; FOR network ¬ Driver.GetDeviceChain[], network.next UNTIL network = NIL DO IF network.device = medium THEN IF (i ¬ i + 1) = physicalOrder THEN RETURN; ENDLOOP; Trouble.Bug["Driver doesn't exist"L]; network ¬ NIL; -- Compiler and Debugger don't cooperate END; -- initialization PrintTajoVersion[]; PrintMicrocodeInfo[]; END.