sys7.1-doc-wip/Tidbits/UserAlerts.a
2020-05-10 13:37:38 +08:00

1022 lines
33 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
; 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 didnt 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 dont 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 “cant 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
; Susans 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,'couldnt load MBDF'
dc.b 86,'couldnt find hierarchical menus parent'
dc.b 87,'couldnt load WDEF'
dc.b 88,'couldnt 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 were at INIT time. Otherwise, use CurApName.
; If the name looks bogus, dont draw a name.
;
; If were 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 dont 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 isnt present, we shouldn't change mode/stacks
andi #$DFFF,SR ; turn off Supervisor mode. Do this first, or well 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 Managers “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 ; dont 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