-- File: PupTimeServerHot.mesa - last edit:
-- AOF 3-Feb-88 15:03:21
-- HGM 24-Sep-83 14:41:24
-- Copyright (C) 1983, 1988 by Xerox Corporation. All rights reserved.
DIRECTORY
Inline USING [LongDivMod, DIVMOD, LowHalf, HighHalf],
System USING [
GetGreenwichMeanTime, GetLocalTimeParameters, LocalTimeParameters],
Time USING [AppendCurrent],
PupDefs USING [
Body, PupBuffer, MoveStringBodyToPupBuffer, ReturnPup, ReturnBuffer],
PupTypes USING [allHosts, dateTextIs, dateTextRequest, fillInPupAddress, PupAddress],
PupWireFormat USING [MesaToBcplLongNumber],
Stats USING [StatCounterIndex, StatIncr, StatGetCounter],
PupTimeServerFormat USING [
PupTimeFormat, TimeStatsEntry, timeStatsRequest, timeStatsReply, version,
resetTimeRequest, resetTimeReply, lockTimeRequest, lockTimeReply],
PupTimeServerOps USING [statText, statTenex, statAlto];
PupTimeServerHot: PROGRAM
IMPORTS Inline, System, Time, PupTimeServerOps, PupWireFormat, Stats, PupDefs
EXPORTS PupTimeServerOps =
BEGIN OPEN Stats, PupDefs, PupTimeServerOps;
locked, parmsOk: PUBLIC BOOLEAN ← FALSE;
correction: PUBLIC INTEGER ← 0;
resetAddress: PUBLIC PupTypes.PupAddress ← PupTypes.fillInPupAddress;
PupTimeServer: PUBLIC PROCEDURE [b: PupBuffer] =
BEGIN
body: PupDefs.Body = b.pup;
IF body.dest.host = PupTypes.allHosts
AND (locked OR ~parmsOk)
AND (body.pupType = PupTypes.dateTextRequest
OR body.pupType = dateTenexRequest
OR body.pupType = dateAltoRequest) THEN
BEGIN PupDefs.ReturnBuffer[b]; RETURN; END;
SELECT body.pupType FROM
PupTypes.dateTextRequest =>
BEGIN
s: STRING = [30];
Time.AppendCurrent[s, TRUE];
MoveStringBodyToPupBuffer[b, s];
ReturnPup[b, PupTypes.dateTextIs, s.length];
StatIncr[statText];
END;
dateTenexRequest =>
BEGIN OPEN Inline;
now: LONG CARDINAL ← System.GetGreenwichMeanTime[];
days, seconds: LONG CARDINAL;
q1, q2, r1, r2: CARDINAL;
-- Q1, R1 ← AltoTime/43200, Q1 = halfDays, R1 = seconds
-- Q2, R2 ← Q1/2, Q2 = days, R2 = halfDays (0 or 1)
-- Days ← Q2 + 15385
-- Seconds ← R1 + R2*43200
[q1, r1] ← LongDivMod[now, 43200];
[q2, r2] ← DIVMOD[q1, 2];
days ← LOOPHOLE[LONG[q2] + LONG[15385]];
seconds ← LOOPHOLE[LONG[r1] + LONG[r2*43200]];
-- Yetch, I think this is what MAXC wants
body.pupWords[0] ← HighHalf[days]*256 + LowHalf[days]/256;
body.pupWords[1] ← LowHalf[days]*256 + HighHalf[seconds];
body.pupWords[2] ← LowHalf[seconds];
ReturnPup[b, dateTenexIs, 6];
StatIncr[statTenex];
END;
dateAltoRequest =>
BEGIN
parms: System.LocalTimeParameters ← System.GetLocalTimeParameters[];
LOOPHOLE[@body.pupWords,
LONG POINTER TO PupTimeServerFormat.PupTimeFormat]↑ ← [
time: PupWireFormat.MesaToBcplLongNumber[System.GetGreenwichMeanTime[]],
zoneS: IF parms.direction = west THEN west ELSE east, zoneH: parms.zone,
zoneM: parms.zoneMinutes, beginDST: parms.beginDST,
endDST: parms.endDST];
ReturnPup[b, dateAltoIs, 2*SIZE[PupTimeServerFormat.PupTimeFormat]];
StatIncr[statAlto];
END;
PupTimeServerFormat.timeStatsRequest =>
BEGIN
LOOPHOLE[@body.pupWords,
LONG POINTER TO PupTimeServerFormat.TimeStatsEntry]↑ ← [
version: PupTimeServerFormat.version,
tenexRequests: PupWireFormat.MesaToBcplLongNumber[
StatGetCounter[statTenex]],
stringRequests: PupWireFormat.MesaToBcplLongNumber[
StatGetCounter[statText]],
altoRequests: PupWireFormat.MesaToBcplLongNumber[
StatGetCounter[statAlto]], correction: correction,
resetAddress: resetAddress];
ReturnPup[
b, PupTimeServerFormat.timeStatsReply,
2*SIZE[PupTimeServerFormat.TimeStatsEntry]];
END;
PupTimeServerFormat.lockTimeRequest =>
{locked ← TRUE; ReturnPup[b, PupTimeServerFormat.lockTimeReply, 0]};
PupTimeServerFormat.resetTimeRequest =>
BEGIN
locked ← FALSE;
ReturnPup[b, PupTimeServerFormat.resetTimeReply, 0];
END;
ENDCASE => BEGIN PupDefs.ReturnBuffer[b]; END;
END;
END.