supermario/base/SuperMarioProj.1994-02-09/Toolbox/DialogMgr/ModalDialogMenuExtensions.a
2019-06-29 23:17:50 +08:00

291 lines
11 KiB
Plaintext
Raw Permalink 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.

;
; File: ModalDialogMenuExtensions.a
;
; Contains: Assembly language portions of Modal Dialog Menu Access Facility
; used by both the ROM and System.
;
; Written by: Darin Adler, Kevin MacDonell, Roger Mann, and Jeff Miller
;
; Copyright: © 1990-1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <6> 12/17/92 JSM Remove TheFuture conditionals.
; <5> 12/9/92 DTY GetIsDialogState and SetIsDialogState are never used, so get rid
; of them. (Just so Jeff cant do it.)
; <4> 6/10/92 JSM Need to include DialogsPriv.a for ROM and future System builds.
; <3> 6/10/92 JSM Only include LinkedPatchMacros.a for non-ROM builds, add some
; more comments about why we can use peaOld here.
; <2> 6/10/92 JSM Moved some routines here from ModalDialogMenuPatches.a to factor
; out common code in both the ROM and the System. Added
; InitDialogMgrGlobals for ROM builds and future System builds so
; we dont have to keep our globals in code space, and change the
; Set/GetXXXRoutines to use ExpandMem for the ROM and the future.
; Changed MDJGNEFilter for ROM builds so it does the right thing.
; <1> 6/10/92 JSM first checked in
;
load 'StandardEqu.d'
IF NOT forROM THEN
include 'LinkedPatchMacros.a' ; To get peaOld macro for MDJGNEFilter
ENDIF
include 'BalloonsPriv.a' ; To get the _HMModalDialogMenuSetup macro
include 'ScriptPriv.a' ; To get the equates to call _KeyScript
include 'MenuMgrPriv.a' ; To get kApplicationMenuID
include 'DialogsPriv.a' ; To get DialogMgrGlobals definition
;————————————————————————————————————————————————————————————————————————————————————————————————————
; ModalDialogMenuSetup - implements _ModalDialogMenuSetup
;
; PROCEDURE ModalDialogMenuSetup(nowModal: BOOLEAN);
; nowModal: TRUE if set up for modal, FALSE if restore to normal
;
; Referenced by DispTable.a for the ROM and by a MakePatch macro in ModalDialogMenuPatches.a
; for the System.
;
ModalDialogMenuSetup Proc Export
SetupHelpMenu
subq #2,sp ; make space for the useless OsErr return
move.b 6(sp),-(sp) ; push the boolean
_HMModalDialogMenuSetup ; set up Help Mgr menu
addq #2,sp ; Dump result
SetupKeyScriptMenu
moveq #smKeyDisableAboutKybds,d0 ; Assume we are going modal
tst.b 4(sp) ; Are we going modal?
bne.s @doDisable
moveq #smKeyEnableAboutKybds,d0 ; Re-enable the KeyScript menu
@doDisable
move.w d0,-(sp) ; Pass opcode to KeyScript
_KeyScript
SetupApplicationMenu
subq #4,sp ; Make room to get menuhandle
move.w #kApplicationMenuID,-(sp) ; Push the menuID
_GetMHandle ; Look for the Application menu
move.l (sp)+,d0 ; Did we get it?
beq.s @done ; Nope
move.l d0,-(sp) ; Push the menuhandle
move.w #0,-(sp) ; Zero means whole menu
tst.b 10(sp) ; Are we going modal?
bne.s @doDisable ; Non-zero means modal
_EnableItem
bra.s @done ; GTFO
@doDisable
_DisableItem
@done
; Clean up the mess
move.l (sp)+,a0 ; Pull off the return address
addq #2,sp ; Dump the original boolean
jmp (a0) ; Return from whence we came
EndProc
;————————————————————————————————————————————————————————————————————————————————————————————————————
; MDJGNEFilter
;
; Pass each event through our filter
;
; Referenced by StartInit.a for the ROM and by a MakePatch macro in ModalDialogMenuPatches.a
; for the System.
;
; The ROM and System versions are packaged slightly differently. The ROM version just calls
; NMGNEFilter after its done, whereas the System calls through to whatever the old filter
; was at patch time.
;
MDJGNEFilter Proc Export
import FilterEvent ; from ModalDialogMenuExtensions.c
tst.b WWExist ; do nothing unless Window Mgr. is here
bnz.s @done
movem.l d0-d2/a0-a2,-(sp)
move.l a1,a2
move.l a1,-(sp) ; pass event record pointer
jsr FilterEvent ; call event filter
tst.w evtNum(a2) ; is it a null event?
bnz.s @notNull ; null events must return false
clr.w 6*4+4(sp) ; change result code to false
@notNull
movem.l (sp)+,d0-d2/a0-a2
IF forROM THEN
import NMGNEFilter ; from NotificationMgr.c
pea NMGNEFilter ; call NMGNEFilter
ELSE
peaOld ; call the old filter
; note: we can use peaOld here because
; the System references us with a MakePatch,
; if it jumped to MDJGNEFilter from a patch
; instead then peaOld wouldnt work
tst.l (sp) ; check if there was one
bnz.s @done ; yes, go do it
addq.l #4,sp ; no filter, dont call
ENDIF ; forROM
@done
rts
EndProc
;————————————————————————————————————————————————————————————————————————————————————————————————————
; InitDialogMgrGlobals — allocate and initialize globals stored in emDialogGlobals
;
; Called by StartBoot.a for the ROM, or by a MakeInstall macro in ModalDialogMenuPatches.a for the System.
;
InitDialogMgrGlobals Proc Export
with DialogMgrGlobals
; allocate mem & get ptr to it
move.l #DialogMgrGlobalsSize,D0 ; D0 = size of RAM we need
_NewPtr SYS,CLEAR ; Get RAM for variables
; set ptr in ExpandMemRec.emDialogGlobals
move.l ExpandMem,A1 ; A1 -> ExpandedMem
move.l A0,ExpandMemRec.emDialogGlobals(A1) ; store vars Pointer in ExpandMem
; initialize varibles
; no need to set the ones that are 0, NewPtr did that above, but Ill leave them here for clarity
; move.w #0, AnalyzedWindowState(A0) ; used in Set/GetAnalyzedWindowState proc
move.l #1, AnalyzedWindow(A0) ; used in Set/GetAnalyzedWindow proc
; move.l #0, SavedMenuState(A0) ; used in Set/GetSavedMenuState proc
endwith
rts
endproc
;————————————————————————————————————————————————————————————————————————————————————————————————————
; SetAnalyzedWindowState (GetAnalyzedWindowState)
; SetAnalyzedWindow (GetAnalyzedWindow)
; SetSavedMenuState (GetSavedMenuState)
; SetIsDialogState (GetIsDialogState)
;
; Routines to set and get globals used by the Dialog Mgr.
;
SetAnalyzedWindowState proc export
export GetAnalyzedWindowState
move.l (sp)+,a0
move.l ExpandMem,a1 ; A1 -> Expanded Low Memory
move.l ExpandMemRec.emDialogGlobals(a1),a1 ; A1-> ptr to globals
move.w (sp)+,DialogMgrGlobals.AnalyzedWindowState(a1) ; set new value
jmp (a0)
GetAnalyzedWindowState
move.l ExpandMem,a1 ; A1 -> Expanded Low Memory
move.l ExpandMemRec.emDialogGlobals(a1),a1 ; A1-> ptr to globals
move.w DialogMgrGlobals.AnalyzedWindowState(a1),4(sp) ; get return value
rts
endproc
;————————————————————————————————————————————————————————————————————————————————————————————————————
SetAnalyzedWindow proc export
export GetAnalyzedWindow
move.l (sp)+,a0
move.l ExpandMem,a1 ; A1 -> Expanded Low Memory
move.l ExpandMemRec.emDialogGlobals(a1),a1 ; A1-> ptr to globals
move.l (sp)+,DialogMgrGlobals.AnalyzedWindow(a1) ; set new value
jmp (a0)
GetAnalyzedWindow
move.l ExpandMem,a1 ; A1 -> Expanded Low Memory
move.l ExpandMemRec.emDialogGlobals(a1),a1 ; A1-> ptr to globals
move.l DialogMgrGlobals.AnalyzedWindow(a1),4(sp) ; get return value
rts
endproc
;————————————————————————————————————————————————————————————————————————————————————————————————————
SetSavedMenuState proc export
export GetSavedMenuState
move.l (sp)+,a0
move.l ExpandMem,a1 ; A1 -> Expanded Low Memory
move.l ExpandMemRec.emDialogGlobals(a1),a1 ; A1-> ptr to globals
move.l (sp)+,DialogMgrGlobals.SavedMenuState(a1) ; set new value
jmp (a0)
GetSavedMenuState
move.l ExpandMem,a1 ; A1 -> Expanded Low Memory
move.l ExpandMemRec.emDialogGlobals(a1),a1 ; A1-> ptr to globals
move.l DialogMgrGlobals.SavedMenuState(a1),4(sp) ; get return value
rts
endproc
;————————————————————————————————————————————————————————————————————————————————————————————————————
; PushMenuState: SavedHandle;
;
; savedMenus = 0;
; if (ActiveWindowNeedsHelp())
; savedMenus = SetSaveMenusEnableState();
;
; On entry: nothing
; On exit: stack has saved menu handle or NIL
PushMenuState Proc Export
import SetSaveMenusEnableState ; from ModalDialogMenuExtensions.c
import ActiveWindowNeedsHelp ; from ModalDialogMenuExtensions.c
clr.l -(sp) ; default result of function
subq #2,sp ; make room for result
jsr ActiveWindowNeedsHelp ; does this window need help?
jsr SetSaveMenusEnableState ; pass TAnalyzedWindowState info
@noHelpNeeded
move.l (sp)+,d0 ; get result
move.l (sp),a0 ; get return address
move.l d0,(sp) ; put result on stack
jmp (a0) ; return
endproc
;————————————————————————————————————————————————————————————————————————————————————————————————————
; PopMenuState
;
; if (savedMenus)
; RestoreMenusEnableState(savedMenus);
;
; On entry: stack has saved menu handle or NIL
; On exit: handle is popped off the stack
PopMenuState Proc Export
import RestoreMenusEnableState ; from ModalDialogMenuExtensions.c
move.l 4(sp),d0 ; check out the saved menu handle
beq.s @done ; NIL, do nothing
move.l d0,-(sp)
jsr RestoreMenusEnableState ; Restore the state
@done
move.l (sp)+,(sp) ; pop off the handle
rts
endproc
;————————————————————————————————————————————————————————————————————————————————————————————————————
end