<> <> <> <> <> <> DIRECTORY Basics USING [DivMod, HighHalf, LowHalf], Process USING [Milliseconds, Ticks]; Intime: DEFINITIONS IMPORTS Basics = BEGIN MsTicks: TYPE = Process.Milliseconds; -- expressed in milliseconds MSTicks: TYPE = LONG CARDINAL; -- long milliseconds DeltaTicks: TYPE = Process.Ticks; <> DeltaTime: TYPE = DeltaTicks [0..256); <> maxDeltaTime: DeltaTime = LAST[DeltaTime]; <> msPerDeltaTick: MsTicks; deltaTicksPerSecond: DeltaTicks; DeltaDeltaTime: TYPE = DeltaTime [0..16); -- must fit in Action first word maxDeltaDeltaTime: DeltaDeltaTime = LAST[DeltaDeltaTime]; Overlap: TYPE = {loShort, hiShort}; EventTime: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID Overlap FROM loShort => [lo: MsTicks, hi: LONG CARDINAL], hiShort => [lower: MSTicks, higher: CARDINAL], ENDCASE ]; <> ReadEventTime: PROC RETURNS [EventTime]; AdjustEventTime: PROC [initialize: BOOL _ FALSE]; BigDifference: PRIVATE PROC [t1, t2: LONG POINTER TO READONLY EventTime] RETURNS [MsTicks]; EventTimeDifference: PROC [t1, t2: LONG POINTER TO READONLY EventTime] RETURNS [MsTicks] = INLINE { RETURN[IF t1.hi = t2.hi THEN t1.lo - t2.lo ELSE BigDifference[t1, t2]] }; IsLaterTime: PROC [t1, t2: EventTime] RETURNS [BOOL] = INLINE { RETURN[IF t1.hi = t2.hi THEN t1.lo > t2.lo ELSE t1.hi > t2.hi] }; AddDeltaTimeToEventTime: PROC [eT: EventTime, dT: DeltaTime] RETURNS [rT: EventTime] = INLINE { lo: MSTicks _ LONG[eT.lo] + (dT*msPerDeltaTick); RETURN[[loShort[hi: eT.hi + Basics.HighHalf[lo], lo: Basics.LowHalf[lo]]]]; }; SubtractMsTicksFromEventTime: PROC [eT: LONG POINTER TO EventTime, ticks: MsTicks] = INLINE { IF ticks > eT.lower THEN eT.higher _ eT.higher - 1; eT.lower _ eT.lower - ticks; }; MsTicksToDeltaTime: PROC [s: MsTicks] RETURNS [dT: DeltaTicks, rem: MsTicks] = INLINE { [dT, rem] _ Basics.DivMod[s, msPerDeltaTick]; }; END. <> <> <> <> <> <> <> <> <> <> <> <<29-Jan-81 13:49:38, narrow DeltaDeltaTime to widen Action kind>>