home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / Disk&HD / sleepr20.lha / Sleeper.mod < prev    next >
Encoding:
Text File  |  1994-08-21  |  14.1 KB  |  573 lines

  1. (*---------------------------------------------------------------------------
  2.     :Program.    Sleeper.mod
  3.     :Author.     Christoph Dworzak
  4.     :Address.    creaholic sa ; Molzgasse 10 ; 2502 BIEL ; Switzerland
  5.     :Phone.      [(++41|0)32] 50 19 11
  6.     :BBS/Fax.    [(++41|0)32] 50 19 15
  7.     :BBS/ISDN.   [(++41|0)32] 50 19 19
  8.     :Shortcut.   [CHD]
  9.     :Version.    2.0
  10.     :Date.       18.August 1994
  11.     :Copyright.  by Ch. Dworzak
  12.     :Language.   OBERON
  13.     :Translator. Amiga Oberon Compiler V3.11d
  14.     :Contents.   BeginIO patch of scsi.device to stop HD
  15.     :Remark.     I am a member of:  FAB (First Amigaholics Biel)
  16.     :Remark.     AUGS (Amiga User Group Switzerland)
  17.     :Remark.     UseNet: dworz@amazing.link-ch1.ch
  18.     :Remark.     SwissAmiNet: 44:8010/409.0
  19.     :Remark.     AmigaNet: 39:110/409.0
  20.  ---------------------------------------------------------------------------*)
  21.  
  22. MODULE Sleeper ;
  23.  
  24. (* $JOIN /txt/Sleeper.o *)
  25.  
  26.  
  27. IMPORT
  28.  e: Exec,
  29.  d: Dos,
  30.  kb: Keyboard,
  31.  r: Requests,
  32.  u: Utility,
  33.  NoGuruRq,
  34.  in: Intuition,
  35.  ti: Timer,
  36.  ic: Icon,
  37.  gt: GadTools,
  38.  wb: Workbench,
  39.  sys: SYSTEM,
  40.  scsi: SCSIDisk,
  41.  conv: Conversions,
  42.  sgt: SleeperGT ;
  43.  
  44.  
  45.  
  46. CONST
  47.   Version    = "$VER: Sleeper 2.0 by Ch.Dworzak (18.8.94)" ;
  48.   DefDevice  = "scsi.device" ;
  49.   DefTimeout = 15 ;
  50.   ColdReboot = -726 ;
  51.  
  52. TYPE
  53.  Unit = RECORD
  54.          timeout   : LONGINT ;
  55.          monitored : BOOLEAN ;
  56.          stopped   : BOOLEAN ;
  57.          exists    : BOOLEAN ;
  58.         END ;
  59.  
  60. VAR
  61.  oColdReboot["oColdReboot"],
  62.  oBeginIO["oBeginIO"]  : e.PROC ;
  63.  MyTask["MyTask"]      : e.TaskPtr ;
  64.  Semaphore["semaphore"]: ARRAY 8 OF e.SignalSemaphorePtr ;
  65.  ExecBase["ExecBase"]  : e.ExecBasePtr ;
  66.  U["unit"]             : ARRAY 8 OF e.UnitPtr ;
  67.  watchdog["watchdog"]  : ARRAY 8 OF LONGINT ;
  68.  InColdReboot["InColdReboot"],
  69.  InResetHandler["InResetHandler"]
  70.                        : LONGINT ;
  71.  sem                   : ARRAY 8 OF e.SignalSemaphore ;
  72.  timp, aimp, kbmp      : e.MsgPortPtr ;
  73.  kbior                 : e.IOStdReqPtr ;
  74.  ior                   : ARRAY 8 OF e.IOStdReqPtr ;
  75.  timer                 : ti.TimeRequestPtr ;
  76.  sc                    : scsi.SCSICmd ;
  77.  flags                 : LONGSET ;
  78.  newBeginIO, newColdReboot
  79.                        : e.PROC ;
  80.  scsiBase              : e.LibraryPtr ;
  81.  quit, TimerOpen,
  82.  iconOpen, KeyBoardOpen,
  83.  haveResetHandler,
  84.  iconified, windowOpen : BOOLEAN ;
  85.  i                     : LONGINT ;
  86.  unit                  : ARRAY 8 OF Unit ;
  87.  ver, IconName         : e.STRING ;
  88.  strptr                : e.STRPTR ;
  89.  Icon                  : wb.DiskObjectPtr ;
  90.  MyAppIcon             : wb.AppIconPtr ;
  91.  MyMsg                 : wb.AppMessagePtr ;
  92.  kbInt                 : e.InterruptPtr ;
  93.  
  94.  
  95. PROCEDURE MyBeginIO {"MyBeginIO"} () ;
  96.  
  97. PROCEDURE MyColdReboot {"MyColdReboot"} () ;
  98.  
  99. PROCEDURE MyResetHandler {"MyResetHandler"} () ;
  100.  
  101. PROCEDURE OffGadget (ID : LONGINT ; off : BOOLEAN) ;
  102. BEGIN
  103.  IF off THEN
  104.   gt.SetGadgetAttrs (sgt.SleeperGTGadgets[ID]^, sgt.SleeperGTWnd, NIL, in.gaDisabled, in.LTRUE, u.done) ;
  105.  ELSE
  106.   gt.SetGadgetAttrs (sgt.SleeperGTGadgets[ID]^, sgt.SleeperGTWnd, NIL, in.gaDisabled, in.LFALSE, u.done) ;
  107.  END ;
  108. END OffGadget ;
  109.  
  110.  
  111. PROCEDURE CheckGadget (ID : LONGINT ; check : BOOLEAN) ;
  112. BEGIN
  113.  IF check THEN
  114.   gt.SetGadgetAttrs (sgt.SleeperGTGadgets[ID]^, sgt.SleeperGTWnd, NIL, gt.cbChecked, in.LTRUE, u.done) ;
  115.  ELSE
  116.   gt.SetGadgetAttrs (sgt.SleeperGTGadgets[ID]^, sgt.SleeperGTWnd, NIL, gt.cbChecked, in.LFALSE, u.done) ;
  117.  END ;
  118. END CheckGadget ;
  119.  
  120.  
  121. PROCEDURE SetLevel (ID : LONGINT ; level : LONGINT) ;
  122. BEGIN
  123.  gt.SetGadgetAttrs (sgt.SleeperGTGadgets[ID]^, sgt.SleeperGTWnd, NIL, gt.slLevel, level, u.done) ;
  124. END SetLevel ;
  125.  
  126.  
  127. PROCEDURE Show (): BOOLEAN ;
  128. BEGIN
  129.  IF iconOpen THEN
  130.   IF wb.RemoveAppIcon (MyAppIcon) THEN END ;
  131.   iconOpen := FALSE ;
  132.  END ;
  133.  IF NOT (iconified) THEN
  134.   IF NOT (windowOpen) THEN
  135.    IF (sgt.SetupScreen() = 0) AND (sgt.OpenSleeperGTWindow() = 0) THEN
  136.     windowOpen := TRUE ;
  137.    ELSE
  138.     RETURN (FALSE) ;
  139.    END ;
  140.   END ;
  141.   FOR i := 0 TO 7 DO
  142.    SetLevel (3*i+sgt.GDSlid0, unit[i].timeout) ;
  143.    CheckGadget (3*i+sgt.GDStop0, unit[i].stopped) ;
  144.    CheckGadget (3*i+sgt.GDEn0, unit[i].monitored) ;
  145.    OffGadget (3*i+sgt.GDStop0, NOT (unit[i].monitored)) ;
  146.    OffGadget (3*i+sgt.GDSlid0, NOT (unit[i].monitored)) ;
  147.    OffGadget (3*i+sgt.GDEn0, NOT (unit[i].exists)) ;
  148.   END ;
  149.  ELSE
  150.   FOR i := 0 TO 7 DO
  151.    IF NOT (unit[i].exists) THEN
  152.     IconName[i] := '.' ;
  153.    ELSIF NOT (unit[i].monitored) THEN
  154.     IconName[i] := '=' ;
  155.    ELSIF NOT (unit[i].stopped) THEN
  156.     IconName[i] := '+' ;
  157.    ELSE
  158.     IconName[i] := '-' ;
  159.    END ;
  160.   END ;
  161.   IconName[8] := 00X ;
  162.   Icon^.type := 0 ;
  163.   MyAppIcon := wb.AddAppIcon (0, 0, IconName, aimp, NIL, Icon, u.done) ;
  164.   IF MyAppIcon = NIL THEN
  165.    RETURN (FALSE) ;
  166.   END ;
  167.   iconOpen := TRUE ;
  168.   IF windowOpen THEN
  169.    sgt.CloseSleeperGTWindow;
  170.    sgt.CloseDownScreen;
  171.    windowOpen := FALSE ;
  172.   END ;
  173.  END ;
  174.  RETURN (TRUE) ;
  175. END Show ;
  176.  
  177.  
  178. PROCEDURE HandleSleeperGT (): BOOLEAN ;
  179. VAR
  180.  imsg     : in.IntuiMessagePtr ;
  181.  Code     : INTEGER ;
  182.  Class    : LONGSET ;
  183.  IAddress : e.APTR ;
  184.  Gad      : in.GadgetPtr ;
  185.  item     : in.MenuItemPtr ;
  186.  repaint,
  187.  ok       : BOOLEAN ;
  188. BEGIN
  189.  ok := TRUE ;
  190.  repaint := FALSE ;
  191.  LOOP
  192.   imsg := gt.GetIMsg (sgt.SleeperGTWnd.userPort) ;
  193.   IF imsg = NIL THEN EXIT END ;
  194.   Class := imsg^.class ;
  195.   Code := imsg^.code ;
  196.   IAddress := imsg^.iAddress ;
  197.   gt.ReplyIMsg (imsg) ;
  198.   imsg := NIL ;
  199.  
  200.   IF in.closeWindow IN Class THEN
  201.    ok := FALSE ;
  202.   END;
  203.  
  204.   IF in.refreshWindow IN Class THEN
  205.    gt.BeginRefresh (sgt.SleeperGTWnd) ;
  206.    sgt.SleeperGTRender ;
  207.    gt.EndRefresh (sgt.SleeperGTWnd, in.LTRUE) ;
  208.   END ;
  209.  
  210.   IF in.gadgetUp IN Class THEN
  211.    Gad := sys.VAL(in.GadgetPtr, IAddress) ;
  212.    IF Gad^.gadgetID = sgt.GDiconify THEN
  213.     iconified := TRUE ;
  214.     repaint := TRUE ;
  215.    ELSIF Gad^.gadgetID = sgt.GDOn THEN
  216.     FOR i := 0 TO 7 DO
  217.      IF unit[i].exists AND unit[i].monitored AND unit[i].stopped THEN
  218.       watchdog[i] := 0 ;
  219.      END ;
  220.     END ;
  221.    ELSIF Gad^.gadgetID = sgt.GDOff THEN
  222.     FOR i := 0 TO 7 DO
  223.      IF unit[i].exists AND unit[i].monitored AND NOT (unit[i].stopped) THEN
  224.       watchdog[i] := unit[i].timeout*60 ;
  225.      END ;
  226.     END ;
  227.    ELSE
  228.     FOR i := 0 TO 7 DO
  229.      IF Gad^.gadgetID = i*3 + sgt.GDSlid0 THEN
  230.       unit[i].timeout := Code ;
  231.      ELSIF Gad^.gadgetID = i*3 + sgt.GDStop0 THEN
  232.       IF unit[i].stopped THEN
  233.        watchdog[i] := 0 ;
  234.       ELSE
  235.        watchdog[i] := unit[i].timeout*60 ;
  236.       END ;
  237.      ELSIF Gad^.gadgetID = i*3 + sgt.GDEn0 THEN
  238.       IF unit[i].monitored THEN
  239.        IF unit[i].stopped THEN
  240.         watchdog[i] := 0 ;
  241.        END ;
  242.       END ;
  243.       unit[i].monitored := NOT (unit[i].monitored) ;
  244.       repaint := TRUE ;
  245.      END ;
  246.     END ;
  247.    END ;
  248.   END ;
  249.  END ;
  250.  
  251.  IF repaint AND NOT (Show ()) THEN
  252.   ok := FALSE ;
  253.  END ;
  254.  
  255.  RETURN (ok) ;
  256. END HandleSleeperGT ;
  257.  
  258.  
  259. PROCEDURE StopUnit (stop : BOOLEAN ; number : LONGINT) ;
  260. VAR
  261.  command: ARRAY 6 OF SHORTINT ;
  262. BEGIN
  263.  IF unit[number].exists THEN
  264.  
  265.   IF stop THEN
  266.    e.ObtainSemaphore (sem[i]) ;
  267.    unit[i].stopped := TRUE ;
  268.   END ;
  269.  
  270.   command[0] := 1BH ; (* start/stop unit *)
  271.   command[1] := 0 ;   (* Bit1: immediate *)
  272.   command[2] := 0 ;
  273.   command[3] := 0 ;
  274.   command[4] := 1 ;   (* Bit1: start *)
  275.   command[5] := 0 ;
  276.   IF stop THEN
  277.    command[4] := 0 ;
  278.   END ;
  279.   sc.data     := NIL ;
  280.   sc.length   := 0 ;
  281.   sc.command  := sys.ADR (command) ;
  282.   sc.cmdLength:= SHORT (LEN (command)) ;
  283.   sc.flags    := SHORTSET {scsi.read} ;
  284.   ior[number].command := scsi.scsiCmd ;
  285.   ior[number].length  := SIZE (sc) ;
  286.   ior[number].data    := sys.ADR (sc);
  287.   IF e.DoIO( ior[number] ) # 0 THEN END ;
  288.   IF ior[number].error # 0 THEN
  289.   END ;
  290.  
  291.   IF NOT (stop) THEN
  292.    unit[i].stopped := FALSE ;
  293.    watchdog[i] := 0 ;
  294.    e.ReleaseSemaphore (sem[i]) ;
  295.   END ;
  296.  END ;
  297. END StopUnit ;
  298.  
  299.  
  300.  
  301. BEGIN
  302.  r.Assert (e.SysBase.libNode.version >= 37, "Sorry, need OS 2.0 or better !") ;
  303.  ExecBase := e.SysBase ;
  304.  
  305.  ver := Version ;
  306.  
  307.  kbmp := e.CreateMsgPort () ;
  308.  r.Assert (kbmp # NIL, "Sorry, could not CreateMsgPort for KeyBoard !") ;
  309.  kbior := e.CreateIORequest (kbmp, SIZE (kbior^)) ;
  310.  r.Assert (kbior # NIL, "Sorry, could not CreateIORequest for KeyBoard !") ;
  311.  r.Assert (e.OpenDevice (kb.keyboardName, 0, kbior, LONGSET{}) = 0,
  312.            "Sorry, could not OpenDevice KeyBoard !") ;
  313.  KeyBoardOpen := TRUE ;
  314.  
  315.  NEW (kbInt) ;
  316.  kbInt.node.name := sys.ADR(Version) ;
  317.  kbInt.node.pri  := 32 ;
  318.  kbInt.code      := MyResetHandler ;
  319.  
  320.  kbior.data    := kbInt ;
  321.  kbior.command := kb.addResetHandler ;
  322.  IF e.DoIO (kbior) # 0 THEN END ;
  323.  haveResetHandler := TRUE ;
  324.  
  325.  MyTask := e.FindTask(NIL) ;
  326.  
  327.  FOR i := 0 TO 7 DO
  328.   e.InitSemaphore (sem[i]) ;
  329.   Semaphore[i] := sys.ADR (sem[i]) ;
  330.  END ;
  331.  
  332.  timp := e.CreateMsgPort () ;
  333.  r.Assert (timp # NIL, "Sorry, could not CreateMsgPort for Timer !") ;
  334.  timer := e.CreateIORequest (timp, SIZE (timer^)) ;
  335.  r.Assert (timer # NIL, "Sorry, could not CreateIORequest for Timer !") ;
  336.  r.Assert (e.OpenDevice (ti.timerName, ti.vBlank, timer, LONGSET{}) = 0,
  337.            "Sorry, could not OpenDevice Timer !") ;
  338.  TimerOpen := TRUE ;
  339.  
  340.  FOR i := 0 TO 7 DO
  341.   unit[i].timeout   := DefTimeout ;
  342.   unit[i].monitored := TRUE ;
  343.   unit[i].stopped   := FALSE ;
  344.   unit[i].exists    := TRUE ;
  345.  END ;
  346.  
  347.  Icon := ic.GetDiskObject ("ProgDir:Sleeper") ;
  348.  r.Assert (Icon # NIL, "Sorry, can't find my Icon !") ;
  349.  
  350.  strptr := ic.FindToolType (Icon^.toolTypes, "Device") ;
  351.  
  352.  IF strptr = NIL THEN
  353.   strptr := sys.ADR (DefDevice) ;
  354.  END ;
  355.  
  356.  FOR i := 0 TO 7 DO
  357.   ior[i] := e.CreateIORequest (timp, SIZE(ior[i]^)) ;
  358.   IF (ior[i] # NIL) AND (e.OpenDevice (strptr^, i, ior[i], LONGSET{}) = 0) THEN
  359.    U[i] := ior[i]^.unit ;
  360.    scsiBase := ior[i].device ;
  361.   ELSE
  362.    e.DeleteIORequest (ior[i]) ;
  363.    ior[i] := NIL ;
  364.    unit[i].monitored := FALSE ;
  365.    unit[i].exists    := FALSE ;
  366.   END ;
  367.  END ;
  368.  r.Assert (scsiBase # NIL, "Sorry, could not open Device !") ;
  369.  
  370.  
  371.  FOR i := 0 TO 7 DO
  372.   IF unit[i].exists THEN
  373.    CASE i OF
  374.       0 : strptr := ic.FindToolType (Icon^.toolTypes, "Unit0")
  375.     | 1 : strptr := ic.FindToolType (Icon^.toolTypes, "Unit1")
  376.     | 2 : strptr := ic.FindToolType (Icon^.toolTypes, "Unit2")
  377.     | 3 : strptr := ic.FindToolType (Icon^.toolTypes, "Unit3")
  378.     | 4 : strptr := ic.FindToolType (Icon^.toolTypes, "Unit4")
  379.     | 5 : strptr := ic.FindToolType (Icon^.toolTypes, "Unit5")
  380.     | 6 : strptr := ic.FindToolType (Icon^.toolTypes, "Unit6")
  381.     | 7 : strptr := ic.FindToolType (Icon^.toolTypes, "Unit7")
  382.    END ;
  383.    IF (strptr = NIL) OR NOT (conv.StringToInt (strptr^, unit[i].timeout)) THEN
  384.     unit[i].monitored := FALSE ;
  385.     unit[i].timeout := DefTimeout ;
  386.    ELSE
  387.     unit[i].timeout := unit[i].timeout ;
  388.    END ;
  389.   END ;
  390.  END ;
  391.  
  392.  aimp := e.CreateMsgPort () ;
  393.  r.Assert (aimp # NIL, "Sorry, could not CreateMsgPort for AppIcon !") ;
  394.  
  395.  strptr := ic.FindToolType (Icon^.toolTypes, "Iconified") ;
  396.  iconified  := strptr # NIL ;
  397.  windowOpen := FALSE ;
  398.  iconOpen   := FALSE ;
  399.  r.Assert (Show (), "Sorry, could not open Window !") ;
  400.  
  401.  
  402.  oBeginIO    := e.SetFunction (scsiBase, e.beginIO, MyBeginIO) ;
  403.  
  404.  oColdReboot := e.SetFunction (ExecBase, ColdReboot, MyColdReboot) ;
  405.  
  406.  timer.node.command := ti.addRequest ;
  407.  timer.time.secs    := 1 ;
  408.  timer.time.micro   := 0 ;
  409.  flags := e.SetSignal (LONGSET {}, LONGSET {timp.sigBit}) ;
  410.  e.SendIO (timer) ;
  411.  
  412.  quit := FALSE ;
  413.  
  414.  REPEAT
  415.  
  416.   IF InColdReboot # 0 THEN
  417.    quit := TRUE ;
  418.   END ;
  419.  
  420.   IF InResetHandler # 0 THEN
  421.    quit := TRUE ;
  422.   END ;
  423.  
  424.   IF iconified THEN
  425.    flags := e.Wait (LONGSET {timp.sigBit, aimp.sigBit, d.ctrlC}) ;
  426.    IF aimp.sigBit IN flags THEN
  427.     iconified := FALSE ;
  428.     IF NOT (Show ()) THEN
  429.      quit := TRUE ;
  430.     END ;
  431.    END ;
  432.   ELSE
  433.    flags := e.Wait (LONGSET {timp.sigBit, sgt.SleeperGTWnd.userPort.sigBit, d.ctrlC}) ;
  434.    IF sgt.SleeperGTWnd.userPort.sigBit IN flags THEN
  435.     IF NOT (HandleSleeperGT ()) THEN
  436.      quit := TRUE ;
  437.     END ;
  438.    END ;
  439.   END ;
  440.  
  441.   IF d.ctrlC IN flags THEN
  442.    quit := TRUE ;
  443.   END ;
  444.  
  445.   IF timp.sigBit IN flags THEN
  446.    FOR i := 0 TO 7 DO
  447.     IF (unit[i].exists) THEN
  448.      IF (unit[i].stopped) THEN
  449.       IF  (watchdog[i] < (unit[i].timeout*60)) THEN
  450.        StopUnit (FALSE, i) ;
  451.        IF NOT (Show ()) THEN
  452.         quit := TRUE ;
  453.        END ;
  454.       END ;
  455.      ELSE
  456.       IF (unit[i].monitored) THEN
  457.        INC (watchdog[i]) ;
  458.        IF watchdog[i] >= (unit[i].timeout*60) THEN
  459.         StopUnit (TRUE, i) ;
  460.         IF NOT (Show ()) THEN
  461.          quit := TRUE ;
  462.         END ;
  463.        END ;
  464.       END ;
  465.      END ;
  466.     END ;
  467.    END ;
  468.  
  469.    IF e.WaitIO (timer) # 0 THEN END ;
  470.    timer.node.command := ti.addRequest ;
  471.    timer.time.secs    := 1 ;
  472.    timer.time.micro   := 0 ;
  473.    flags := e.SetSignal (LONGSET {}, LONGSET {timp.sigBit}) ;
  474.    e.SendIO (timer) ;
  475.   END ;
  476.  
  477.  UNTIL quit ;
  478.  
  479.  IF e.CheckIO (timer)=NIL THEN
  480.   e.AbortIO (timer) ;
  481.   IF e.WaitIO (timer) # 0 THEN END ;
  482.  END ;
  483.  
  484.  FOR i := 0 TO 7 DO
  485.   IF (unit[i].monitored) AND (unit[i].stopped) THEN
  486.    StopUnit (FALSE, i) ;
  487.   END ;
  488.  END ;
  489.  
  490.  newBeginIO := e.SetFunction (scsiBase, e.beginIO, oBeginIO) ;
  491.  IF newBeginIO # MyBeginIO THEN  (* trouble!!! *)
  492.   d.PrintF ("Cannot quit, someone else has patched the Device !\n") ;
  493.   flags := e.Wait (LONGSET {}) ;
  494.  END ;
  495.  
  496.  newColdReboot := e.SetFunction (ExecBase, ColdReboot, oColdReboot) ;
  497.  IF newColdReboot # MyColdReboot THEN  (* trouble!!! *)
  498.   d.PrintF ("Someone else has patched the ColdReboot !\n") ;
  499.   flags := e.Wait (LONGSET {}) ;
  500.  END ;
  501.  
  502.  IF InColdReboot # 0 THEN
  503.   e.ColdReboot () ;
  504.  END ;
  505.  
  506.  FOR i := 0 TO 7 DO
  507.   e.ObtainSemaphore (sem[i]) ;
  508.   e.ReleaseSemaphore (sem[i]) ;
  509.  END ;
  510.  
  511. CLOSE
  512.  
  513.  IF TimerOpen THEN
  514.   e.CloseDevice (timer) ;
  515.  END ;
  516.  
  517.  IF timer # NIL THEN
  518.   e.DeleteIORequest (timer) ;
  519.  END ;
  520.  
  521.  IF  timp # NIL THEN
  522.   e.DeleteMsgPort (timp) ;
  523.  END ;
  524.  
  525.  FOR i := 0 TO 7 DO
  526.   IF ior[i] # NIL THEN
  527.    e.CloseDevice (ior[i]) ;
  528.    e.DeleteIORequest (ior[i]) ;
  529.   END ;
  530.  END ;
  531.  
  532.  IF InResetHandler # 0 THEN
  533.   kbior.data    := kbInt ;
  534.   kbior.command := kb.resetHandlerDone ;
  535.   IF e.DoIO (kbior) # 0 THEN END ;
  536.  END ;
  537.  
  538.  IF haveResetHandler THEN
  539.   kbior.data    := kbInt ;
  540.   kbior.command := kb.remResetHandler ;
  541.   IF e.DoIO (kbior) # 0 THEN END ;
  542.  END ;
  543.  
  544.  IF KeyBoardOpen THEN
  545.   e.CloseDevice (kbior) ;
  546.  END ;
  547.  
  548.  IF kbior # NIL THEN
  549.   e.DeleteIORequest (kbior) ;
  550.  END ;
  551.  
  552.  IF  kbmp # NIL THEN
  553.   e.DeleteMsgPort (kbmp) ;
  554.  END ;
  555.  
  556.  IF windowOpen THEN
  557.   sgt.CloseSleeperGTWindow;
  558.   sgt.CloseDownScreen;
  559.  END ;
  560.  
  561.  IF  aimp # NIL THEN
  562.   e.DeleteMsgPort (aimp) ;
  563.  END ;
  564.  
  565.  IF iconOpen THEN
  566.   IF wb.RemoveAppIcon (MyAppIcon) THEN END ;
  567.  END ;
  568.  
  569.  IF Icon # NIL THEN
  570.   ic.FreeDiskObject (Icon) ;
  571.  END ;
  572. END Sleeper.
  573.