mirror of
https://github.com/elliotnunn/sys7.1-doc-wip.git
synced 2024-12-12 04:29:09 +00:00
1022 lines
33 KiB
Plaintext
1022 lines
33 KiB
Plaintext
;
|
||
; Hacks to match MacOS (most recent first):
|
||
;
|
||
; <Sys7.1> 8/3/92 Elliot make this change
|
||
; 9/2/94 SuperMario ROM source dump (header preserved below)
|
||
;
|
||
|
||
;
|
||
; File: UserAlerts.a
|
||
;
|
||
; Contains: deep shit alerts (for after booting)
|
||
;
|
||
; Copyright: © 1984-1991, 1993 by Apple Computer, Inc., all rights reserved.
|
||
;
|
||
; This file is used in these builds: BigBang
|
||
;
|
||
; Change History (most recent first):
|
||
;
|
||
; <18> 6/12/91 LN removed #include 'HardwareEqu.a'
|
||
; <17> 3/4/91 dba dty: get rid of SysVers conditionals
|
||
; <16> 2/7/91 dnf kst, #79676: Use dsRecoverVCBPtr to draw the name of the volume
|
||
; that we're attempting disk recovery on.
|
||
; <15> 1/14/91 stb & mda; Add culprit name to generic crash dialog
|
||
; <14> 1/14/91 stb & PKE; tweak error messages; restore A5, SR, and SP for forced
|
||
; exits and clear MacJmp to prevent reentrancy <dfh>
|
||
; <13> 12/15/90 stb & KSM; improve the dsBufPtrTooLow message. add a <dfh> change to
|
||
; DoExitToShell to clear debugger flag. add a template for
|
||
; dsMemFullErr which show INIT or app name.
|
||
; <12> 11/21/90 csd & gbm; Remove the conditionals around the non-Shutdown manager
|
||
; code because we still need it for errors that happen before the
|
||
; Shutdown Manager is installed.
|
||
; <11> 11/15/90 stb & JDR; add alert for dsBufPtrTooLow
|
||
; <10> 9/6/90 DTY changed the wording of the shutdown messages. The old message
|
||
; seemed to imply that there was a safe and an unsafe way to turn
|
||
; off a Macintosh.
|
||
; <9> 6/11/90 DDG NEEDED FOR SIXPACK: Fixed previous comment.
|
||
; <8> 6/11/90 DDG NEEDED FOR SIXPACK: Fixed the dsNoFPU error to not spill over the
|
||
; end of the dialog.
|
||
; <7> 6/1/90 PKE DARIN IS A BAD DOG. In <5>, he changed the symbol name
|
||
; UImpTrapNumber to UnimplementedTrapNumber, but didn’t change the
|
||
; reference to it, thus breaking the SixPack build. Fixed it.
|
||
; <6> 5/31/90 DDG Added a generic system error (dsNoFPU) for ericksons and elsies
|
||
; that don’t have floating point chips.
|
||
; <5> 5/30/90 dba add alert for forced quit
|
||
; <4> 1/30/90 dba get rid of warnings when assembling; put in fancier messages;
|
||
; fix bug #34819 by reaching down the stack to restore the value
|
||
; of CurMap for the convenience of applications with ResumeProcs
|
||
; <3> 1/12/90 CCH added include of “HardwarePrivateEqu.a”
|
||
; <2> 12/28/89 dba changed PROC to MAIN so we get dead code stripping; got rid of
|
||
; the grayed resume button
|
||
; <1.4> 10/11/89 dba reformatted file; added new ShutDown Manager “user choice”
|
||
; alerts; improved icons
|
||
; <1.3> 8/15/89 dba OK FOR 6.0.4: get rid of Resume button in “can’t load the
|
||
; application: Finder”
|
||
; <1.2> 8/11/89 dba NEEDED FOR 6.0.4: changed text for alerts; improved ShutDown
|
||
; code used when ShutDown Manager is not present; added duplicate
|
||
; button lists to handle case where ResumeProc is not NIL; added
|
||
; system version to text of some alerts
|
||
; <1.1> 5/15/89 CCH Added alert for memory parity error. (#101)
|
||
; <1.0> 11/16/88 CCH Added to EASE.
|
||
; 8/16/88 dba changed procs 98 and 99 to avoid collision with errors 98 and 99
|
||
; proc 98 is now proc 1098; proc 99 is now proc 1099 this caused a
|
||
; crash after “force-launching” a document from the Finder
|
||
; 3/20/88 EKH Added SysErr #98 (dsNoPatch) for RomNoPatch, so it has it's very
|
||
; own SysErr number.
|
||
; 1/7/88 EKH Added Alert for "needed resource can't be loaded" error at boot
|
||
; time (SysErr #99). This error is generated by PTCH id -1, and
|
||
; anyone else who can not load a "do or die" resource from the
|
||
; system file. <S355 EKH>
|
||
; 3/30/87 jdt Moved HD20 startup alert here from the boot alert table.
|
||
; 3/5/87 LAK <S088> Launch errors (System Error ID 26) modified to explain
|
||
; that the application could not be opened and allow return to
|
||
; Finder. Specifically, added Alert 26, Text 47, Icon 39, Procs
|
||
; 98-99, Button List 74, and String 81. Changed ShutDown alert
|
||
; text from “power off your machine” to “turn off your Macintosh”;
|
||
; it now shares icon 39 with launch fail alert. This file may now
|
||
; be built as an INIT 31 file for testing (see below for sample
|
||
; build code).
|
||
; 12/1/86 jdt Removed the installation code as this is now a DSAT resource.
|
||
; 9/9/86 DLD Changed the PowerOff Icon's bits.
|
||
; 9/3/86 DLD Made Reset call ShutDown if Possible.
|
||
; 9/3/86 DLD Added the ShutDown Alert
|
||
; 9/2/86 DLD Added Align 0 before ResumeString to avoid word alignment on new
|
||
; assembler.
|
||
; 8/4/86 DLD Converted source to MPW.
|
||
; 4/14/84 SC mercilessly chopped out stuff, added RESET
|
||
; 2/23/84 AJH tweaked disk switch alert
|
||
;
|
||
; NOTE: UserAlerts is loaded before PTCHs on Mac Plus and SE ROMs ($75 and $276).
|
||
; (BootAlerts is active while PTCHs are loaded on all other ROMs.)
|
||
;
|
||
|
||
string asis
|
||
|
||
load 'StandardEqu.d'
|
||
include 'ShutDownEqu.a'
|
||
include 'HardwarePrivateEqu.a'
|
||
include 'GestaltEqu.a' ; <14>
|
||
include 'FileMgrPrivate.a'
|
||
|
||
ShutDownTrapNumber equ $95 ; _ShutDown
|
||
UnimplementedTrapNumber equ $9F ; _Unimplemented
|
||
|
||
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
||
|
||
UserAlerts main export
|
||
|
||
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
||
;
|
||
; Icon numbering:
|
||
;
|
||
; The internal icon numbers are also used as resource IDs for color icons,
|
||
; so they must be assigned like all other reserved resource IDs.
|
||
; Also, like all the other numbers below, they must steer clear of system errors.
|
||
; For this reason we use negative numbers lower than -10000.
|
||
|
||
dsiBomb equ -16397
|
||
dsiStop equ -16400
|
||
|
||
dsiDiskSwap equ -16398
|
||
dsiNote equ -16399
|
||
dsiInsertDisk equ -16398 ; <SM1> <BH 25Aug93> yes, this is the same as dsiDiskSwap
|
||
dsiRemoveDisk equ -16401 ; <SM1> <BH 25Aug93>
|
||
|
||
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
||
;
|
||
; Numbering scheme:
|
||
;
|
||
; These IDs must not conflict with actual system errors.
|
||
; For this reason, we use negative numbers lower than -10000 (we start at -20000).
|
||
|
||
; for text
|
||
|
||
dstMissingPatch equ -20000
|
||
dstParityError equ -20001
|
||
dstSystemDamaged equ -20002
|
||
dstSCSIWarn equ -20003
|
||
|
||
dstApplicationBusy equ -20100
|
||
dstFinderMissing equ -20101
|
||
dstGeneralError equ -20102
|
||
dstInsertDisk equ -20103
|
||
dstShutDownOrRestart equ -20104
|
||
dstSwitchOff equ -20105
|
||
dstSwitchOffOrRestart equ -20106
|
||
dstForcedQuit equ -20107
|
||
dstMemFullErr equ -20108
|
||
dstRemoveDisk equ -20109 ; <SM1> <BH 25Aug93>
|
||
dstDirtyDisk equ -20110 ; <SM1> <BH 25Aug93>
|
||
|
||
; for procedures
|
||
|
||
dspRestart equ -21000
|
||
|
||
dspDrawApplicationName equ -21100
|
||
dspDrawDiskName equ -21101
|
||
dspExitToShell equ -21102
|
||
dspGeneralError equ -21103
|
||
dspResume equ -21104
|
||
dspShutDown equ -21105
|
||
dspStackSniffError equ -21106
|
||
dspDrawForcedQuitMessage equ -21107
|
||
dspDrawCurrentName equ -21108
|
||
dspDrawRmvDsk equ -21109 ; <SM1> <BH 25Aug93>
|
||
dspDrawDirtyDsk equ -21110 ; <SM1> <BH 25Aug93>
|
||
dspDrawNameStr equ -21111 ; <SM1> <BH 25Aug93>
|
||
|
||
; for button lists
|
||
|
||
dsbRestart equ -22001 ; also uses -22000
|
||
|
||
dsbFinder equ -22101 ; also uses -22100
|
||
dsbRestartResume equ -22103 ; also uses -22102
|
||
dsbShutDownOrRestart equ -22105 ; also uses -22104
|
||
dsbCancelOrQuit equ -22107 ; also uses -22106
|
||
|
||
; for button strings
|
||
|
||
dssRestart equ -23000
|
||
|
||
dssFinder equ -23100
|
||
dssResume equ -23101
|
||
dssShutDown equ -23102
|
||
dssQuit equ -23103
|
||
dssCancel equ -23104
|
||
|
||
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
||
;
|
||
; Entry count: bump 1 for each new item.
|
||
|
||
NumEntries: set 49
|
||
; 12 alerts
|
||
; 11 texts
|
||
; 4 icons
|
||
; 8 button lists
|
||
; 5 button strings
|
||
; 9 procs
|
||
|
||
dc.w NumEntries
|
||
|
||
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
||
;
|
||
; Alert definitions.
|
||
;
|
||
; (word) error ID
|
||
; (word) 10 (length of remaining items)
|
||
; (word) primary text definition ID
|
||
; (word) secondary text definition ID
|
||
; (word) icon definition ID
|
||
; (word) procedure definition ID
|
||
; (word) button definition ID
|
||
|
||
; system error (handles cases not covered below)
|
||
|
||
dc.w dsSysErr,10,dstGeneralError,0,dsiBomb,dspGeneralError,dsbRestartResume
|
||
|
||
; other errors
|
||
|
||
dc.w dsReinsert,10,dstInsertDisk,0,dsiDiskSwap,dspDrawDiskName,0
|
||
dc.w dsStknHeap,10,dstGeneralError,0,dsiBomb,dspStackSniffError,dsbRestartResume
|
||
|
||
; Startup, INITs, or apps ate too much of BufPtr space or the current heap
|
||
|
||
dc.w dsMemFullErr,10,dstMemFullErr,0,dsiBomb,dspDrawCurrentName,dsbShutDownOrRestart
|
||
|
||
; ShutDown Manager support
|
||
|
||
dc.w shutDownAlert,10,dstSwitchOff,0,dsiNote,0,dsbRestart
|
||
dc.w dsShutDownOrRestart,10,dstShutDownOrRestart,0,dsiNote,0,dsbShutDownOrRestart
|
||
dc.w dsSwitchOffOrRestart,10,dstSwitchOffOrRestart,0,dsiNote,0,dsbRestart
|
||
|
||
; Forced Quit for MultiFinder
|
||
|
||
dc.w dsForcedQuit,10,dstForcedQuit,0,dsiStop,dspDrawForcedQuitMessage,dsbCancelOrQuit
|
||
|
||
; errors in both BootAlerts and UserAlerts
|
||
|
||
dc.w dsBadPatch,10,dstSystemDamaged,0,dsiStop,0,dsbRestart
|
||
dc.w dsNoPatch,10,dstMissingPatch,0,dsiStop,0,dsbRestart
|
||
dc.w dsParityErr,10,dstParityError,0,dsiBomb,0,dsbRestart
|
||
|
||
; SCSI Disk Mode
|
||
|
||
dc.w dsSCSIWarn,10,dstSCSIWarn,0,dsiStop,0,0
|
||
|
||
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
||
;
|
||
; Text definitions.
|
||
;
|
||
; (word) text definition ID
|
||
; (word) length of rest of definition
|
||
; (long) location (point) - global coordinates
|
||
; (??) ASCII text
|
||
; (byte) null character
|
||
|
||
GeneralErrorMessage
|
||
dc.w dstGeneralError,@end-@rest
|
||
@rest
|
||
dc.w 94,114
|
||
DC.B 'Sorry, a system error occurred.'
|
||
DC.B 0
|
||
align
|
||
@end
|
||
|
||
InsertDiskMessage
|
||
dc.w dstInsertDisk,@end-@rest
|
||
@rest
|
||
dc.w 30,75
|
||
DC.B 'Please insert the disk:'
|
||
DC.B 0
|
||
align
|
||
@end
|
||
|
||
SwitchOffMessage
|
||
dc.w dstSwitchOff,@end-@rest
|
||
@rest
|
||
dc.w 94,114
|
||
DC.B 'It is now safe to switch off your Macintosh.'
|
||
DC.B 0
|
||
align
|
||
@end
|
||
|
||
SwitchOffOrRestartMessage
|
||
dc.w dstSwitchOffOrRestart,@end-@rest
|
||
@rest
|
||
dc.w 94,114
|
||
dc.b 'It is now safe to switch off your Macintosh./'
|
||
dc.b 'If you wish to continue using your Macintosh,/'
|
||
dc.b 'press Restart.'
|
||
dc.b 0
|
||
align
|
||
@end
|
||
|
||
ShutDownOrRestartMessage
|
||
dc.w dstShutDownOrRestart,@end-@rest
|
||
@rest
|
||
dc.w 94,114
|
||
dc.b 'If you wish to continue using your Macintosh,/'
|
||
dc.b 'press Restart. If not, press Shut Down.'
|
||
dc.b 0
|
||
align
|
||
@end
|
||
|
||
SystemDamagedMessage
|
||
dc.w dstSystemDamaged,@end-@rest
|
||
@rest
|
||
dc.w 94,114
|
||
DC.B 'The “System” file on this startup disk may be/'
|
||
dc.b 'damaged. The Installer can be used to repair this/'
|
||
dc.b 'disk.'
|
||
DC.B 0
|
||
align
|
||
@end
|
||
|
||
MissingPatchMessage
|
||
dc.w dstMissingPatch,@end-@rest
|
||
@rest
|
||
dc.w 94,114
|
||
DC.B 'This startup disk was created with “Minimal”/'
|
||
dc.b 'software and will not work on this Macintosh/'
|
||
dc.b 'model. Use the Installer to update this disk for/'
|
||
dc.b 'this model.'
|
||
DC.B 0
|
||
align
|
||
@end
|
||
|
||
ParityErrorMessage
|
||
dc.w dstParityError,@end-@rest
|
||
@rest
|
||
dc.w 94,114
|
||
DC.B 'Sorry, a system error occurred./'
|
||
DC.B '/'
|
||
DC.B ' RAM parity'
|
||
DC.B 0
|
||
align
|
||
@end
|
||
|
||
ForcedQuitMessage
|
||
dc.w dstForcedQuit,@end-@rest
|
||
@rest
|
||
dc.w 94+14,114
|
||
dc.b 'Unsaved changes will be lost./'
|
||
dc.b 0
|
||
align
|
||
@end
|
||
|
||
SomebodyAteAlltheRAMMessage
|
||
dc.w dstMemFullErr,@end-@rest
|
||
@rest
|
||
dc.w 94,114
|
||
dc.b 'Not enough memory is available while using/'
|
||
dc.b 0
|
||
align
|
||
@end
|
||
|
||
CableRemovedMessage
|
||
dc.w dstSCSIWarn,@end-@rest
|
||
@rest
|
||
dc.w 88,114
|
||
dc.b '/'
|
||
dc.b 'Hard Disk Cable Warning/'
|
||
dc.b '/'
|
||
dc.b 'You must first shutdown the Macintosh before/'
|
||
dc.b 'attaching any SCSI hard disk cables. Disconnect/'
|
||
dc.b 'the cable from the back of the machine right now./'
|
||
dc.b 0
|
||
align
|
||
@end
|
||
|
||
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
||
;
|
||
; icon definitions
|
||
;
|
||
; (word) icon definition ID (used as resource ID for cicn)
|
||
; (word) length of rest of definition
|
||
; (8 bytes) location (rectangle) - global coordinates
|
||
; (128 bytes) icon data
|
||
|
||
; Susan’s bomb icon
|
||
|
||
BombIcon
|
||
dc.w dsiBomb,@end-@rest
|
||
@rest
|
||
dc.w 81,60,113,92
|
||
dc.l $00000808, $00000010, $00000420, $00008040
|
||
dc.l $00002200, $00000800, $001F002A, $0020C700
|
||
dc.l $00403800, $00400020, $00400910, $03F81008
|
||
dc.l $03F82104, $03F80000, $0FFE0100, $3FFF8000
|
||
dc.l $3FFF8000, $7FFFC000, $7FFFC000, $FFFDE000
|
||
dc.l $FFFFE000, $FFFEE000, $FFFEE000, $FFFEE000
|
||
dc.l $FFFFE000, $FFFDE000, $7FFFC000, $7FF7C000
|
||
dc.l $3FFF8000, $3FFF8000, $0FFE0000, $03F80000
|
||
@end
|
||
|
||
; disk-switched icon
|
||
|
||
; The disk-switch icon for manual-eject systems is different
|
||
DiskSwapIcon
|
||
dc.w dsiDiskSwap,@end-@rest
|
||
@rest
|
||
dc.w 20,24,52,56
|
||
dc.l $002ADE00, $00800100, $00000080, $01000080
|
||
dc.l $000003E0, $010001C0, $00000080, $00000000
|
||
dc.l $FFF83FFC, $88A44452, $88A24451, $88224411
|
||
dc.l $8FE247F1, $80024001, $80024001, $9FF24FF9
|
||
dc.l $A00A5005, $A00A5005, $A00A5005, $A00A5005
|
||
dc.l $A00A5005, $A00A5005, $FFFE7FFF, $00000000
|
||
dc.l $01000000, $03800080, $07C00000, $01000080
|
||
dc.l $01000000, $00800100, $007B5400, $00000000
|
||
@end
|
||
|
||
; stop icon
|
||
|
||
DSStopIcon
|
||
dc.w dsiStop,@end-@rest
|
||
@rest
|
||
dc.w 81,60,113,92
|
||
dc.l $00FFFF00, $01FFFF80, $03FFFFC0, $07FEFFE0
|
||
dc.l $0FFC7FF0, $1FEC67F8, $3FC447FC, $7FC447FE
|
||
dc.l $FF4447FF, $FE4447FF, $FE4447FF, $FE4447FF
|
||
dc.l $FE4447FF, $FE4447FF, $FE40071F, $FE00061F
|
||
dc.l $FE00061F, $FE00043F, $FE00003F, $FE00007F
|
||
dc.l $FE00007F, $FE0000FF, $FE0000FF, $FE0001FF
|
||
dc.l $FE0001FF, $7E0403FE, $3F0207FC, $1FFFFFF8
|
||
dc.l $0FFFFFF0, $07FFFFE0, $03FFFFC0, $01FFFF80
|
||
@end
|
||
|
||
; note icon
|
||
|
||
DSNoteIcon
|
||
dc.w dsiNote,@end-@rest
|
||
@rest
|
||
dc.w 81,60,113,92
|
||
dc.l $FFFFFFFF, $807FFFFF, $807FFFFF, $807FFFFF
|
||
dc.l $807FFFFF, $807FC0FF, $887F003F, $887E001F
|
||
dc.l $887C000F, $80780007, $80780007, $80700003
|
||
dc.l $8071DDC3, $80700003, $80700003, $8071DD43
|
||
dc.l $80700003, $80700003, $8071D703, $80700003
|
||
dc.l $87F00003, $81F1EEC3, $81F00007, $81F00007
|
||
dc.l $81F0000F, $81E0001F, $8F80007F, $81FFFFFF
|
||
dc.l $81FFFFFF, $81FFFFFF, $81FFFFFF, $FFFFFFFF
|
||
@end
|
||
|
||
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
||
;
|
||
; button lists
|
||
;
|
||
; (word) button definition ID
|
||
; (word) length of rest of definition
|
||
; (word) number of buttons
|
||
; (word) string ID
|
||
; (4 words) button location (rectangle)
|
||
; (word) procedure definition ID
|
||
;
|
||
|
||
; Restart button list
|
||
; this is the copy used if there is no ResumeProc
|
||
; note that these two are identical
|
||
|
||
RestartButtons1
|
||
dc.w dsbRestart,@end-@rest
|
||
@rest
|
||
dc.w 1
|
||
dc.w dssRestart,154,404,174,463,dspRestart
|
||
@end
|
||
|
||
; Restart button list
|
||
; this is the copy used if there is a ResumeProc
|
||
; note that these two are identical
|
||
|
||
RestartButtons2
|
||
dc.w dsbRestart+1,@end-@rest
|
||
@rest
|
||
dc.w 1
|
||
dc.w dssRestart,154,404,174,463,dspRestart
|
||
@end
|
||
|
||
; Restart/Resume button list
|
||
; this is the copy used if there is no ResumeProc
|
||
|
||
RestartResumeButtons1
|
||
dc.w dsbRestartResume,@end-@rest
|
||
@rest
|
||
dc.w 1
|
||
dc.w dssRestart,154,404,174,463,dspRestart
|
||
@end
|
||
|
||
; Restart/Resume button list
|
||
; this is the copy used if there is a ResumeProc
|
||
; it includes a Resume button
|
||
|
||
RestartResumeButtons2
|
||
dc.w dsbRestartResume+1,@end-@rest
|
||
@rest
|
||
dc.w 2
|
||
dc.w dssRestart,154,404,174,463,dspRestart
|
||
dc.w dssResume,154,325,174,392,dspResume
|
||
@end
|
||
|
||
; ShutDown button list
|
||
; This is the copy used if there is no ResumeProc.
|
||
; Note that these two are identical.
|
||
|
||
ShutDownOrRestartButtons1
|
||
dc.w dsbShutDownOrRestart,@end-@rest
|
||
@rest
|
||
dc.w 2 ; 2 buttons
|
||
dc.w dssShutDown,154,384,174,463,dspShutDown ; Shut Down button
|
||
dc.w dssRestart,154,313,174,372,dspRestart ; Restart button
|
||
@end
|
||
|
||
; ShutDown button list
|
||
; This is the copy used if there is a ResumeProc.
|
||
; Note that these two are identical.
|
||
|
||
ShutDownOrRestartButtons2
|
||
dc.w dsbShutDownOrRestart+1,@end-@rest
|
||
@rest
|
||
dc.w 2 ; 2 buttons
|
||
dc.w dssShutDown,154,384,174,463,dspShutDown ; Shut Down button
|
||
dc.w dssRestart,154,313,174,372,dspRestart ; Restart button
|
||
@end
|
||
|
||
; Cancel or Quit button list
|
||
; This is the copy used if there is no ResumeProc.
|
||
; Note that these two are identical.
|
||
|
||
CancelOrQuitButtons1
|
||
dc.w dsbCancelOrQuit,@end-@rest
|
||
@rest
|
||
dc.w 2 ; 2 buttons
|
||
dc.w dssCancel,154,411,174,463,0 ; Cancel button
|
||
dc.w dssQuit,154,324,174,399,dspExitToShell ; Quit button
|
||
@end
|
||
|
||
; Cancel or Quit button list
|
||
; This is the copy used if there is a ResumeProc.
|
||
; Note that these two are identical.
|
||
|
||
CancelOrQuitButtons2
|
||
dc.w dsbCancelOrQuit+1,@end-@rest
|
||
@rest
|
||
dc.w 2 ; 2 buttons
|
||
dc.w dssCancel,154,411,174,463,0 ; Cancel button
|
||
dc.w dssQuit,154,324,174,399,dspExitToShell ; Quit button
|
||
@end
|
||
|
||
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
||
;
|
||
; button strings
|
||
;
|
||
; (word) string ID
|
||
; (word) length of string (rounded to next word)
|
||
; (??) ASCII characters
|
||
;
|
||
; strings must be padded to even lengths with spaces since they are drawn
|
||
|
||
dc.w dssRestart,8
|
||
DC.B 'Restart '
|
||
|
||
dc.w dssResume,8
|
||
DC.B 'Continue'
|
||
|
||
dc.w dssShutDown,10
|
||
dc.b 'Shut Down '
|
||
|
||
dc.w dssCancel,6
|
||
dc.b 'Cancel'
|
||
|
||
dc.w dssQuit,10
|
||
dc.b 'Force Quit'
|
||
|
||
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
||
;
|
||
; Procedures.
|
||
;
|
||
; (word) Procedure definition id
|
||
; (word) length of rest of definition
|
||
; (??) procedure code.
|
||
|
||
; —————————————————————————————————————————————————
|
||
;
|
||
; DoRestart is used to restart.
|
||
|
||
dc.w dspRestart,EndDoRestart-DoRestart
|
||
|
||
DoRestart
|
||
|
||
; restart the machine, first try to use the shutdown manager, then do our own restart
|
||
; on machines with a boot 2 resource, we always have a ShutDown Manager before UserAlerts is active
|
||
|
||
bsr.s ShutDownManagerInstalled ; is there a ShutDown Manager?
|
||
bz.s @noShutDownManager
|
||
|
||
_SDRestart ; use the ShutDown Manager
|
||
|
||
; This code is executed on machines without ShutDown Managers.
|
||
|
||
@noShutDownManager
|
||
bsr.s DoUnmount ; unmount all of the volumes
|
||
|
||
Move.L ROMBase,a0 ; point to the ROM
|
||
Lea ROMHeader.ReStart(a0),a0 ; point to the restart routine
|
||
|
||
btst #6,ROM85 ; old machines only need reset
|
||
bz.s @tooNewForReset
|
||
reset
|
||
@tooNewForReset
|
||
|
||
Jmp (a0) ; exit thru the restart routine
|
||
|
||
; ShutDownManagerInstalled
|
||
;
|
||
; This determines if the ShutDown Manager is installed.
|
||
; It returns NZ if there is a ShutDown Manager and Z if there is not.
|
||
|
||
ShutDownManagerInstalled
|
||
Move.W #UnimplementedTrapNumber, D0 ; get UnImpCore
|
||
_GetTrapAddress
|
||
Move.L A0, A1 ; saves result
|
||
Move.W #ShutDownTrapNumber, D0 ; get ShutDown
|
||
_GetTrapAddress
|
||
Cmp.L A0, A1 ; compares the two
|
||
rts
|
||
|
||
; The following routines (DoUnmount and ZapVCBQueue) are copied from the ShutDown Manager:
|
||
;
|
||
; DoUnmount - Unmount all of the Volumes on line, so the disks will be
|
||
; updated before our power off.
|
||
;
|
||
; Entry: No parameters.
|
||
|
||
DoUnmount
|
||
Sub #IOQElSize,SP ; allocate pBlock
|
||
|
||
; Go through the VCB Queue to Flush and eject all volumes.
|
||
|
||
Move.L SP,A0 ; point to the parameter block.
|
||
Clr.L ioVNPtr(A0)
|
||
Clr.W ioRefNum(A0)
|
||
Move.L VCBQHdr+QHead,A1 ; get the queue header
|
||
Move.L VCBQHdr+QTail,D2 ; get the tail too.
|
||
Beq.S @AllFlushed
|
||
Bsr.S ZapVCBQueue ; wipe out the whole Queue
|
||
|
||
@AllFlushed
|
||
Add #IOQElSize,SP ; deallocate pBlock
|
||
Rts
|
||
|
||
; ZapVCBQueue - This ReEntrant routine goes through the VCB Queue, and calls
|
||
; UnmountVol for each entry.
|
||
; Entry: A0 - IOParam Block
|
||
; A1 - Pointer to current Entry
|
||
; D2 - Tail entry Pointer.
|
||
; Exit: A1 - Pointer to next Entry.
|
||
; D1 - Preserved.
|
||
|
||
ZapVCBQueue
|
||
Move.W D1,-(SP) ; save for re-entrancy.
|
||
|
||
Move.W vcbVRefNum(A1),D1 ; get a VRefNum
|
||
Move.L QLink(A1),-(SP) ; go on to the next VCB
|
||
Cmp.L D2,A1
|
||
Move.L (SP)+,A1
|
||
Beq.S @FlushTime ; have we reached the end?
|
||
Bsr.S ZapVCBQueue ; not yet, save the VRefNum, call self.
|
||
@FlushTime
|
||
Move.W D1,ioVRefNum(A0) ; set up the refNum in the PBlock.
|
||
_Eject
|
||
_HUnmountVol ; shut the volume down.
|
||
Move.W (SP)+,D1 ; restore crucial VRefNum
|
||
Rts ; for reentrancy.
|
||
|
||
EndDoRestart
|
||
|
||
; —————————————————————————————————————————————————
|
||
;
|
||
; DoResume is used for Resume.
|
||
|
||
dc.w dspResume,EndDoResume-DoResume
|
||
|
||
DoResume
|
||
move.l GrafSize+140(sp),CurMap ; restore top resource map (see StartAlert.a)
|
||
MOVE.L CurrentA5,a5 ; restore A5
|
||
MOVE.L CurStackBase,sp ; restore stack
|
||
MOVE.L ResumeProc,a0 ; call that resume proc
|
||
JMP (a0)
|
||
EndDoResume
|
||
|
||
; —————————————————————————————————————————————————
|
||
;
|
||
; DoStackSniffButtons is used for the stack overflow case.
|
||
; Otherwise it is like DoSystemErrorButtons.
|
||
|
||
dc.w dspStackSniffError,EndDoStackSniffButtons-DoStackSniffButtons
|
||
|
||
DoStackSniffButtons
|
||
MOVE.L (SP)+,A0 ; get return address
|
||
MOVE.L CurStackBase,SP ; reset the stack
|
||
MOVE.L A0,-(SP) ; restore return address
|
||
BRA.S DoSystemErrorButtons ; go print the ID
|
||
EndDoStackSniffButtons
|
||
|
||
; —————————————————————————————————————————————————
|
||
;
|
||
; DoSystemErrorButtons is used for system errors.
|
||
; It prints the ID of the DS alert.
|
||
|
||
dc.w dspGeneralError,EndDoSystemErrorButtons-DoSystemErrorButtons
|
||
|
||
DoSystemErrorButtons
|
||
moveq #0,d3
|
||
move.w DSErrCode,d3 ; get the error code
|
||
cmp.w #100,d3 ; is it too high to display?
|
||
bhs.s @done
|
||
|
||
bsr DrawCurrentName ; draw the current name and the optional extensions msg <15>
|
||
|
||
MOVE.L #((94+28)<<16)+130,-(SP) ; push location of third line
|
||
_MoveTo ;move the pen
|
||
|
||
moveq #0,d0
|
||
lea MessagesTable,a0 ; point to the table of messages
|
||
@next
|
||
tst.b (a0) ; end of table?
|
||
bz.s @doNumberedMessage
|
||
cmp.b (a0)+,d3 ; is this the message?
|
||
beq.s @foundMessage
|
||
move.b (a0)+,d0 ; get length byte of string
|
||
add.w d0,a0 ; advance to next message in table
|
||
bra.s @next
|
||
|
||
@drawDigit
|
||
or.w #$30,d3 ; turn into ASCII
|
||
move.w d3,-(SP) ; push it
|
||
_DrawChar
|
||
rts
|
||
|
||
@foundMessage
|
||
move.l a0,-(sp) ; display the message
|
||
_DrawString
|
||
bra.s @done
|
||
|
||
@doNumberedMessage
|
||
pea NumberedMessage ; display the message
|
||
_DrawString
|
||
divu #10,d3 ; divide by 10
|
||
bz.s @oneDigit
|
||
bsr.s @drawDigit
|
||
@oneDigit
|
||
swap d3 ; get remainder
|
||
bsr.s @drawDigit
|
||
|
||
@done
|
||
RTS
|
||
|
||
string pascal
|
||
|
||
NumberedMessage
|
||
dc.b 'error type '
|
||
align
|
||
MessagesTable
|
||
dc.b 1,'bus error'
|
||
dc.b 2,'address error'
|
||
dc.b 3,'illegal instruction'
|
||
dc.b 4,'divide by zero'
|
||
dc.b 5,'CHK error'
|
||
dc.b 6,'numeric overflow'
|
||
dc.b 10,'bad F-Line instruction' ; <14>
|
||
dc.b 12,'unimplemented trap'
|
||
dc.b 13,'unserviceable interrupt'
|
||
dc.b 14,'Device Manager error'
|
||
dc.b 15,'Segment Loader error'
|
||
dc.b 16,'SANE error'
|
||
dc.b 17,'List Manager not present'
|
||
dc.b 18,'BitEdit not present'
|
||
dc.b 19,'Disk Initialization package not present'
|
||
dc.b 20,'Standard File not present'
|
||
dc.b 21,'SANE not present'
|
||
dc.b 22,'SANE transcendental functions not present'
|
||
dc.b 23,'International Utilities not present'
|
||
dc.b 24,'Binary-Decimal Conversion package not present'
|
||
dc.b 27,'file system map inconsistent'
|
||
dc.b 28,'stack collision with heap'
|
||
dc.b 33,'Memory Manager error'
|
||
dc.b 51,'unserviceable slot interrupt'
|
||
dc.b 81,'bad SANE opcode'
|
||
dc.b 84,'menu purged while in use'
|
||
dc.b 85,'couldn’t load MBDF'
|
||
dc.b 86,'couldn’t find hierarchical menu’s parent'
|
||
dc.b 87,'couldn’t load WDEF'
|
||
dc.b 88,'couldn’t load CDEF'
|
||
dc.b 90,'floating point coprocessor not installed'
|
||
dc.b 0
|
||
align
|
||
|
||
string asis
|
||
|
||
EndDoSystemErrorButtons
|
||
|
||
; —————————————————————————————————————————————————
|
||
;
|
||
; DrawDiskName is used to by the disk switch alert
|
||
; to draw the name of the volume needed.
|
||
|
||
dc.w dspDrawDiskName,EndDrawDiskName-DrawDiskName
|
||
|
||
DrawDiskName
|
||
MOVE.L #$0033004B,-(SP) ;push pen position
|
||
_MoveTo ;position the pen
|
||
|
||
movea.l FSVarsPtr,a1 ;get address of HFS variable area <16>
|
||
move.l FSVars.dsRecoverNamePtr(a1), -(sp) ;grab our target volume's name <16>
|
||
_DrawString
|
||
|
||
rts
|
||
EndDrawDiskName
|
||
|
||
; —————————————————————————————————————————————————
|
||
;
|
||
; DrawCurrentName is used to draw the name of the INIT or application which ate up too much memory.
|
||
|
||
; Use the INIT name pointed to by CurApName+4 if we’re at INIT time. Otherwise, use CurApName.
|
||
; If the name looks bogus, don’t draw a name.
|
||
;
|
||
; If we’re at INIT time, also draw the disableExtensionMsg
|
||
|
||
|
||
dc.w dspDrawCurrentName,EndDrawCurrentName-DrawCurrentName
|
||
|
||
DrawCurrentName
|
||
MOVE.L #((94+28-14)<<16)+114,-(SP) ; push location of second line
|
||
_MoveTo ; position the pen
|
||
|
||
tst.b CurApName ; are we at boot time?
|
||
bmi.s @getINITName ; negative could never be right if an application name was here
|
||
@getApplicationName
|
||
lea CurApName,a2 ; push ptr to application name
|
||
bra.s @drawString
|
||
|
||
@getINITName
|
||
move.l CurApName+4,d0 ; go get the pointer to the INIT name
|
||
bmi.s @noName ; negative? Not valid.
|
||
|
||
btst #0,d0 ; is it odd?
|
||
bne.s @noName ; Not valid
|
||
|
||
move.l MemTop,d1 ; is it below the top of the boot globals (barrier)?
|
||
lsr.l #1,d1 ; MemTop/2
|
||
add.w #1024,d1 ; + 1K
|
||
cmp.l d0,d1 ; namePtr < barrier ?
|
||
bls.s @noName ; no? Not valid.
|
||
|
||
move.l d0,a2 ; namePtr
|
||
|
||
@drawString ; namePtr in a0
|
||
cmp.b #32,(a2) ; StringLength(namePtr^) < 32?
|
||
bhs.s @noName ; no? Not valid.
|
||
|
||
pea @prefix ; <15>
|
||
_DrawString ; <15>
|
||
|
||
move.l a2,-(sp) ; push the INIT name pointer
|
||
|
||
_DrawString ; draw it on second line
|
||
|
||
pea @suffix
|
||
_DrawString
|
||
|
||
@noName ; <15>
|
||
tst.b CurApName ; are we at boot time?
|
||
bpl.s @allDone ; not, so leave
|
||
|
||
MOVE.L #((94+28+14)<<16)+114,-(SP) ; push location of fourth line
|
||
_MoveTo ; position the pen
|
||
pea @disableExtensionMsg1
|
||
_DrawString
|
||
MOVE.L #((94+28+28)<<16)+114,-(SP) ; push location of fourth line
|
||
_MoveTo ; position the pen
|
||
pea @disableExtensionMsg2
|
||
_DrawString
|
||
|
||
@allDone
|
||
RTS
|
||
|
||
string pascal
|
||
|
||
@prefix dc.b '“'
|
||
@suffix dc.b '”'
|
||
align
|
||
@disableExtensionMsg1
|
||
dc.b 'To temporarily turn off extensions, restart and'
|
||
align
|
||
@disableExtensionMsg2
|
||
dc.b 'hold down the shift key.'
|
||
align
|
||
|
||
string asis
|
||
|
||
EndDrawCurrentName
|
||
|
||
|
||
; —————————————————————————————————————————————————
|
||
;
|
||
; DoExitToShell is used to return to the Finder and/or kill an application.
|
||
|
||
dc.w dspExitToShell,EndExitToShell-DoExitToShell
|
||
|
||
DoExitToShell
|
||
|
||
; Clear MacJmp flag that is used to detect reentrancy, since no one else will do it <14>
|
||
move.b MacJmpFlag,d0 ; get possible debugger flag word
|
||
cmp.b #-1,d0 ; is this an implemented flag byte?
|
||
bne.s UseMacJmpFlag ; if so, use it
|
||
bclr #7,MacJmp ; NOT in debugger any longer
|
||
bra.s MacJmpOK ; rejoin
|
||
UseMacJmpFlag
|
||
bclr #7,MacJmpFlag ; NOT in debugger any longer
|
||
MacJmpOK
|
||
|
||
; This is for boneheads who patch ExitToShell and expect A5 to have something meaningful in it <14>
|
||
; (e.g. all apps built with Think C)
|
||
move.l CurrentA5,A5 ; set a5 to the application's value of it
|
||
|
||
; With VM on, there is only a single, limited supervisor stack and it is not what we normally want <14>
|
||
; to use as a stack. The ExitToShell is a transition from the world of interrupt and error handling
|
||
; back to the normal world of applications. Therefore, we need to switch back to user mode and the
|
||
; user stack.
|
||
; NOTE: The Process Manager switches to its own stack (but doesn't switch modes). Application patches
|
||
; to ExitToShell, though, may use the stack extensively (e.g. to close windows) before calling through.
|
||
; The order here is important. We don’t want to set the Supervisor stack pointer to CurStackBase. That
|
||
; would be interesting, but not right. So we must clear Supervisor mode first, then set the stack.
|
||
|
||
move.l #gestaltVMAttr,d0 ; pass selector for VM attributes
|
||
_Gestalt ; ask system about VM
|
||
tst.w d0
|
||
bne.s @stackAndModeOK ; if there was an error, forget it
|
||
move.l a0,d0
|
||
btst #gestaltVMPresent,d0
|
||
beq.s @stackAndModeOK ; if VM isn’t present, we shouldn't change mode/stacks
|
||
andi #$DFFF,SR ; turn off Supervisor mode. Do this first, or we’ll reset
|
||
; the wrong stack pointer. This is ~(1<<13)
|
||
move.l CurStackBase,sp ; reset the stack to a safe place so we can bail out cleanly
|
||
@stackAndModeOK
|
||
|
||
_ExitToShell ; terminate this application (finally!)
|
||
EndExitToShell
|
||
|
||
; —————————————————————————————————————————————————
|
||
;
|
||
; ShutDown is used by the ShutDown Manager’s “user choice” alert to turn off the machine.
|
||
|
||
dc.w dspShutDown,EndDoShutDown-DoShutDown
|
||
|
||
DoShutDown
|
||
bsr.s ShutDownManagerInstalled ; is there a ShutDown Manager? <14>
|
||
bz.s @noShutDownManager ; <14>
|
||
|
||
; *** Figure out why we have to do this! <14>
|
||
clr.l DSErrCode ; Voodoo black magic <14>
|
||
_SDPowerOff
|
||
|
||
@noShutDownManager ; <14>
|
||
moveq #shutDownAlert,d0 ; <14>
|
||
clr.l ResumeProc ; don’t show resume button <14>
|
||
_SysError ; <14>
|
||
|
||
EndDoShutDown
|
||
|
||
; —————————————————————————————————————————————————
|
||
;
|
||
; DrawForcedQuitMessage is used to draw the message for dsForcedQuit, since the message needs
|
||
; to include the name of the application. It also forces the Window Mgr. to update the screen
|
||
; where the forced quit alert appears by accumulating the rectangle of the alert into the
|
||
; SysErrorUpdateRect. This is required, since otherwise no one will erase the alert.
|
||
|
||
dc.w dspDrawForcedQuitMessage,EndDrawForcedQuitMessage-DrawForcedQuitMessage
|
||
|
||
DrawForcedQuitMessage
|
||
move.l #(94<<16)+114,-(SP) ; push location of third line
|
||
_MoveTo ; position the pen
|
||
|
||
pea @prefix
|
||
_DrawString
|
||
|
||
PEA CurApName ; push ptr to application name
|
||
_DrawString ; draw it on second line
|
||
|
||
pea @suffix
|
||
_DrawString
|
||
|
||
; now accumulate into the SysErrorUpdateRect
|
||
|
||
move.l DSAlertRect+botRight,-(sp) ; move the rect onto the stack
|
||
move.l DSAlertRect+topLeft,-(sp)
|
||
|
||
and.w #$7FFF,top(sp) ; clear the high bit of top (which is usually set)
|
||
|
||
move.l sp,-(sp) ; union this into the SysErrorUpdateRect
|
||
move.l ExpandMem,a0
|
||
pea ExpandMemRec.SysErrorUpdateRect(a0) ; into this rect
|
||
move.l (sp),-(sp) ; same rect is destination
|
||
_UnionRect
|
||
|
||
addq #8,sp ; get rid of the rect from the stack
|
||
|
||
rts
|
||
|
||
string pascal
|
||
|
||
@prefix dc.b 'Force “'
|
||
@suffix dc.b '” to quit?'
|
||
align
|
||
|
||
string asis
|
||
|
||
EndDrawForcedQuitMessage
|
||
|
||
; ——————————————————————————————————————————————————————————————————————————————————————————————————
|
||
|
||
end
|