-- 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).