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