-- File: EiaKludge.mesa, Last Edit: HGM July 20, 1980 3:31 AM -- BEWARE: If the display is on while the XEOS EIA board is running the clock will drift. The problem is that the microcode can't process an interrupt within one scan line (38 microseconds) when the display uses too many cycles. It works ok when the display is off. DIRECTORY Process USING [Detach, SetTimeout, SecondsToTicks], UserTerminal USING [GetState], Trouble USING []; EiaKludge: MONITOR IMPORTS Process, UserTerminal EXPORTS Trouble = BEGIN onWarning, offWarning: PROCEDURE; once: BOOLEAN _ FALSE; SetDisplayOnOffProcs: PUBLIC ENTRY PROCEDURE [on, off: PROCEDURE] = BEGIN onWarning _ on; offWarning _ off; IF once THEN RETURN; once _ TRUE; Process.Detach[FORK DisplayWatcher[]]; END; DisplayWatcher: ENTRY PROCEDURE = BEGIN displayState: {unknown, on, off} _ unknown; pause: CONDITION; Process.SetTimeout[@pause, Process.SecondsToTicks[15]]; DO -- forever WAIT pause; SELECT UserTerminal.GetState[] FROM on => BEGIN IF displayState # on THEN BEGIN displayState _ on; onWarning[]; END; END; off, disconnected => BEGIN IF displayState # off THEN BEGIN displayState _ off; offWarning[]; END; END; ENDCASE => ERROR; ENDLOOP; END; -- initialization; END.