-- DelayImpl.mesa            Last edit: KK          October 26, 1982 12:50 pm

DIRECTORY

      FileIO
         USING[Open],
      IO
         USING[card, Close, Handle, PutF],
      Process
         USING[priorityBackground, priorityNormal, SetPriority, Yield],
      Rope
	    USING[ROPE],
      System
	    USING[GetClockPulses, MicrosecondsToPulses, Pulses];


DelayImpl: PROGRAM
  IMPORTS FileIO, IO, Process, System =


BEGIN


   
DelayForNPages: PROCEDURE[nPages: CARDINAL] =
   BEGIN
   newPulseLimit, ending, desired, beginning: System.Pulses;
   actual: LONG CARDINAL;
   calc: LONG CARDINAL;
   desired ← System.MicrosecondsToPulses[LONG[4000]*LONG[nPages]];
   beginning ← System.GetClockPulses[];
   newPulseLimit ← [beginning + desired];
   Process.SetPriority[Process.priorityBackground];
   DO
   Process.Yield[];
   IF (ending ← System.GetClockPulses[]) >= newPulseLimit THEN EXIT;
   ENDLOOP;
   Process.SetPriority[Process.priorityNormal];
   actual ← ending - beginning;
   calc ← IF actual >= desired THEN actual - desired ELSE desired - actual;
   resultsStreamHandle.PutF["desired %g  actual %g off %g*n", IO.card[desired],
      IO.card[actual], IO.card[calc]];
   END;
   
   
   
Main: PROCEDURE =
   BEGIN -- set up to call from CoPilot for debugging.
   foo: CARDINAL ← 0;
   BEGIN
   ENABLE ANY => foo ← foo + 1; -- protect us from the tempcedarexec.
   resultsStreamHandle ← FileIO.Open["Delay.Results", overwrite, none];
   FOR nPages: CARDINAL IN [1..100)
     DO DelayForNPages[nPages];
     ENDLOOP;
   resultsStreamHandle.Close[];
   END;
   END;
   
   
   
   
-- main line code:


resultsStreamHandle: IO.Handle;



END.