home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / hypercar / xcmd / shutdown.sit / shutdown_stack / card_3178.txt < prev    next >
Text File  |  1992-11-05  |  3KB  |  112 lines

  1. -- card: 3178 from stack: in
  2. -- bmap block id: 0
  3. -- flags: 0000
  4. -- background id: 2564
  5. -- name: Source
  6.  
  7.  
  8. -- part 1 (field)
  9. -- low flags: 00
  10. -- high flags: 0007
  11. -- rect: left=0 top=0 right=309 bottom=512
  12. -- title width / last selected line: 0
  13. -- icon id / first selected line: 0 / 0
  14. -- text alignment: 0
  15. -- font id: 4
  16. -- text size: 9
  17. -- style flags: 0
  18. -- line height: 12
  19. -- part name: 
  20.  
  21.  
  22. -- part contents for card part 1
  23. ----- text -----
  24. ; Safe shutdown and restart XCMDs for HyperCard.
  25. ; Earle R. Horton Sunday, October 8, 1989
  26. ;
  27. ; It is unsafe to shutdown or restart the machine from within an XCMD
  28. ; because HyperCard may have left a stack in an inconsistent state.
  29. ; (HyperCard updates the disk image of a stack at idle time.)
  30. ; These XCMDs work by patching _ExitToShell.  The idea is to call
  31. ; the XCMD from within a script, then to quit HyperCard right
  32. ; afterwards.  HyperCard flushes everything to disk, then
  33. ; calls the trap.  We wait for the trap call, then shutdown or
  34. ; restart the machine.
  35. ;
  36. ; As far as HyperCard and its stacks are concerned, everything is
  37. ; hunky-dory now.  This is not a perfect solution to the problem,
  38. ; since if MultiFinder is active, other processes get the rug pulled
  39. ; out from under them.
  40. ;
  41. ; This is the source to ShutdownRestart.a.
  42. ;
  43.     include 'ShutDownEqu.a'
  44.     include 'Traps.a'
  45. EXITTRAPNUM equ $01F4
  46.  
  47. ;
  48. ; This procedure patches _ExitToShell to shut down the Mac instead.
  49. ;
  50. ShutDownXCMD    proc    export
  51.     import  doShutdown,doShutdownEnd
  52.     movem.l a3-a4,-(sp)
  53.     link    a6,#0
  54.     lea doShutdownEnd-doShutdown,a4
  55.     move.l  a4,d0
  56.     beq     done
  57.     _NewPtr
  58.     move.l  a0,a3
  59.     move.l  a0,a1
  60.     move.l  a4,d0
  61.     lea     doShutdown,a0
  62.     _BlockMove
  63.     move.w  #EXITTRAPNUM,d0
  64.     move.l  a3,a0
  65.     _SetTrapAddress
  66. done
  67.     unlk    a6
  68.     movem.l (sp)+,a3-a4
  69.     move.l  (sp)+,a0
  70.     adda.l  #4,sp
  71.     jmp     (a0)
  72. ;
  73. ; Patch to _ExitToShell.  Shut down the machine.
  74. ;
  75. doShutdown  proc    export
  76.     export  doShutdownEnd
  77.     _SDPowerOff
  78.     rts
  79. doShutdownEnd
  80.     endp
  81. ;
  82. ; This is the same as the shutdown XCMD code, except it restarts the machine.
  83. RestartXCMD proc    export
  84.     import  doRestart,doRestartEnd
  85.     movem.l a3-a4,-(sp)
  86.     link    a6,#0
  87.     lea doRestartEnd-doRestart,a4
  88.     move.l  a4,d0
  89.     beq     done
  90.     _NewPtr
  91.     move.l  a0,a3
  92.     move.l  a0,a1
  93.     move.l  a4,d0
  94.     lea     doRestart,a0
  95.     _BlockMove
  96.     move.w  #EXITTRAPNUM,d0
  97.     move.l  a3,a0
  98.     _SetTrapAddress
  99. done
  100.     unlk    a6
  101.     movem.l (sp)+,a3-a4
  102.     move.l  (sp)+,a0
  103.     adda.l  #4,sp
  104.     jmp     (a0)
  105. doRestart   proc    export
  106.     export  doRestartEnd
  107.     _SDRestart
  108.     rts
  109. doRestartEnd
  110.     endp
  111.     end
  112.