-- JaMInterrupt.mesa -- Written by John Warnock, April 10, 1979 -- Last changed by Doug Wyatt, June 5, 1981 3:53 PM DIRECTORY JaMInterruptDefs, JaMExecDefs USING [SetWakeUp], FrameDefs USING [GlobalFrame, MakeCodeResident, UnlockCode], Inline USING [BITAND, BITNOT, BITOR, BITSHIFT], KeyDefs USING [Keys], Process USING [DisableTimeout, GetPriority, Priority, SetPriority], ProcessDefs USING [CV, DIW, InterruptLevel]; JaMInterrupt: MONITOR IMPORTS JaMExecDefs,FrameDefs,Inline,Process EXPORTS JaMInterruptDefs = BEGIN level: ProcessDefs.InterruptLevel = 11; mask: CARDINAL = Inline.BITSHIFT[1,level]; Keywakeup: CONDITION; DCBHead: POINTER TO CARDINAL = LOOPHOLE[420B]; dcbChain: CARDINAL _ 0; displayOn: BOOLEAN_TRUE; prevwakeup: BOOLEAN_FALSE; prevtoggle: BOOLEAN_FALSE; stop: BOOLEAN _ FALSE; JaMBreak: ENTRY PROCEDURE = BEGIN wakeup,toggle: BOOLEAN; originalPriority: Process.Priority _ Process.GetPriority[]; Process.SetPriority[originalPriority+1]; DO IF stop THEN EXIT; WAIT Keywakeup; -- RightShift-Swat means break wakeup_(KeyDefs.Keys.Spare3=down AND KeyDefs.Keys.RightShift=down); IF wakeup AND ~prevwakeup THEN JaMExecDefs.SetWakeUp[TRUE]; prevwakeup_wakeup; -- RightShift-Spare2 means toggle display toggle_(KeyDefs.Keys.Spare2=down AND KeyDefs.Keys.RightShift=down); IF toggle AND ~prevtoggle THEN displayOn_~displayOn; prevtoggle_toggle; -- fix display state IF displayOn#(dcbChain=0) THEN BEGIN IF dcbChain=0 THEN BEGIN --turn off display dcbChain _ DCBHead^; DCBHead^ _ 0; END ELSE BEGIN --turn on display DCBHead^ _ dcbChain; dcbChain _ 0; END; END ENDLOOP; Process.SetPriority[originalPriority]; END; SetDisplayOn: PUBLIC ENTRY PROCEDURE[on: BOOLEAN] = BEGIN displayOn_on END; breakProcess: PROCESS _ NIL; InitJaMBreak: PUBLIC PROCEDURE = BEGIN FrameDefs.MakeCodeResident[FrameDefs.GlobalFrame[JaMBreak]]; Process.DisableTimeout[@Keywakeup]; ProcessDefs.CV[level] _ @Keywakeup; ProcessDefs.DIW^ _ Inline.BITOR[ProcessDefs.DIW^,mask]; breakProcess _ FORK JaMBreak[]; END; KillJaMBreak: PUBLIC PROCEDURE = BEGIN stop _ TRUE; JOIN breakProcess; breakProcess _ NIL; ProcessDefs.DIW^ _ Inline.BITAND[ProcessDefs.DIW^,Inline.BITNOT[mask]]; ProcessDefs.CV[level] _ NIL; FrameDefs.UnlockCode[FrameDefs.GlobalFrame[JaMBreak]]; END; END. DKW March 25, 1980 1:34 PM added SetDisplayState DKW April 7, 1980 9:44 AM pressing the interrupt key combination now causes just one wakeup DKW September 29, 1980 12:00 PM WakeUp[] changed to SetWakeUp[TRUE] DKW December 8, 1980 5:46 PM uses new interfaces Inline, Process DKW June 5, 1981 3:54 PM add KillJaMBreak (635)\812b8B867b13B97b12B261b12B