-- Copyright (C) 1984 by Xerox Corporation. All rights reserved. -- GMTUsingIntervalTimer.mesa, HGM, 17-Sep-84 20:05:14 DIRECTORY DeviceCleanup USING [Perform], PilotMP USING [cPowerOff], -- heads should have their own MP codes! Process USING [SecondsToTicks, Detach, Pause, Ticks], ProcessOperations USING [DisableInterrupts], ProcessorFace USING [ BootButton, GetClockPulses, gmtEpoch, GreenwichMeanTime, microsecondsPerHundredPulses, SetMP], TemporarySetGMT USING []; GMTUsingIntervalTimer: PROGRAM IMPORTS DeviceCleanup, Process, ProcessOperations, ProcessorFace EXPORTS ProcessorFace, TemporarySetGMT = BEGIN OPEN ProcessorFace; -- -- Simulate greenwich mean time and power control features of ProcessorFace using -- interval timer GetGreenwichMeanTime: PUBLIC PROC RETURNS [GreenwichMeanTime] = BEGIN newPulses, pulsesJumped, new100Seconds, leftoverSeconds: LONG CARDINAL; IF gmtSimulated = gmtEpoch THEN RETURN[gmtSimulated]; -- clock not set newPulses ← GetClockPulses[] - pulsesGmtSimulated; new100Seconds ← newPulses / pulsesPer100Seconds; pulsesJumped ← new100Seconds * pulsesPer100Seconds; pulsesGmtSimulated ← pulsesGmtSimulated + pulsesJumped; gmtSimulated ← gmtSimulated + new100Seconds * 100; leftoverSeconds ← ((newPulses - pulsesJumped) * 100) / pulsesPer100Seconds; RETURN[gmtSimulated + leftoverSeconds]; END; SetGreenwichMeanTime: PUBLIC PROC [gmt: GreenwichMeanTime] = BEGIN IF gmtSimulated = gmtEpoch THEN Process.Detach[FORK Ticker[]]; pulsesGmtSimulated ← GetClockPulses[]; gmtSimulated ← gmt; END; adjustableClockRate: PUBLIC BOOLEAN ← TRUE; SetClockRate: PUBLIC PROC [internal, external: LONG CARDINAL] = BEGIN diff: LONG INTEGER = external-internal; temp: LONG INTEGER; f: LONG CARDINAL ← 10*(1D9/microsecondsPerHundredPulses); temp ← f*diff/external; pulsesPer100Seconds ← f - temp; END; gmtSimulated: GreenwichMeanTime ← gmtEpoch; -- =gmtEpoch => not set pulsesGmtSimulated: LONG CARDINAL; -- interval timer value corresponding to gmtSimulated pulsesPer100Seconds: LONG CARDINAL ← 10*(1D9/microsecondsPerHundredPulses); PowerOff: PUBLIC PROC = BEGIN -- NOTE: This code depends on the greenwich mean time clock running with -- interrupts disabled and devices turned off. ProcessOperations.DisableInterrupts[]; DeviceCleanup.Perform[turnOff]; SetMP[PilotMP.cPowerOff]; DO -- forever IF GetGreenwichMeanTime[] - gmtEpoch >= gmtAutomaticPowerOn - gmtEpoch AND (~externalEventRequired OR ExternalEvent[]) THEN BootButton[] ENDLOOP END; gmtAutomaticPowerOn: GreenwichMeanTime; externalEventRequired: BOOLEAN; ExternalEvent: PROC RETURNS [BOOLEAN] = {RETURN[FALSE]}; SetAutomaticPowerOn: PUBLIC PROC [gmt: GreenwichMeanTime, externalEvent: BOOLEAN] = {gmtAutomaticPowerOn ← gmt; externalEventRequired ← externalEvent}; ResetAutomaticPowerOn: PUBLIC PROC = {gmtAutomaticPowerOn ← gmtEpoch - 1}; Ticker: PROC = BEGIN oneHour: Process.Ticks = Process.SecondsToTicks[60*60]; DO [] ← GetGreenwichMeanTime[]; Process.Pause[oneHour]; ENDLOOP; END; -- -- Initialization ResetAutomaticPowerOn[]; END.... LOG Time: February 4, 1980 10:36 AM By: McJones Action: Create file, borrowing code from SystemImpl Time: June 26, 1980 10:48 AM By: McJones Action: OISProcessorFace=>ProcessorFace Time: 7-Dec-81 15:32:28 By: Marzullo Action: added adjustableClockrate and SetClockRate Time: 20-Sep-82 18:13:12 By: Marzullo Action: fixed signed/unsigned problem with SetClockRate (fix courtesy HGM).