mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-29 05:49:19 +00:00
358 lines
11 KiB
Plaintext
358 lines
11 KiB
Plaintext
;
|
|
; File: BalloonExtensions.a
|
|
;
|
|
; Contains: Extensions to the Balloon Help Manager used by both the ROM and System.
|
|
;
|
|
; Written by: Randy Carr
|
|
;
|
|
; Copyright: © 1989-1990, 1992 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <SM4> 11/19/92 RB Set ROMMapInsert to MapTrue just before doing some GetResource
|
|
; calls so that we look in ROM first.
|
|
; <2> 7/8/92 JSM Move HelpMgrInstall, Pack14Entry, ptchHMUpdateHelpMenu,
|
|
; ptchHMGetHelpGlobal, ptchHMGetBalloons, and ptchHMSetHelpGlobal
|
|
; here from Balloonptch28.a.
|
|
; <1> 7/8/92 JSM first checked in
|
|
;
|
|
|
|
IF &TYPE('HelpMgrTesting')='UNDEFINED' THEN
|
|
HelpMgrTesting EQU 0
|
|
ENDIF
|
|
|
|
PRINT PUSH,OFF
|
|
|
|
LOAD 'StandardEqu.d'
|
|
INCLUDE 'LinkedPatchMacros.a' ; linked patch stuff
|
|
INCLUDE 'BalloonsPriv.a' ; my private help manager equates
|
|
INCLUDE 'IconUtilsPriv.a'
|
|
INCLUDE 'GestaltEqu.a'
|
|
|
|
|
|
PRINT POP
|
|
;
|
|
; Macro to put in debug symbols for MacsBug
|
|
;
|
|
IF HelpMgrTesting THEN
|
|
MACRO
|
|
DoDebugSymbols &name
|
|
DC.B $80 + &LEN(&name), '&name'
|
|
DC.W $0000
|
|
ENDM
|
|
ENDIF
|
|
|
|
ROMs Plus,SE,II,Portable,IIci
|
|
|
|
;__________________________________________________________________________________
|
|
;
|
|
; Routine: HelpMgrInstall
|
|
;
|
|
; Inputs: None
|
|
;
|
|
; Outputs: None
|
|
;
|
|
; Destroys: d0
|
|
;
|
|
; Function: This routine installs the linked patch for the Help Manager.
|
|
; Since this routine is NOT marked resident, it will be disposed of after
|
|
; it has been called.
|
|
;
|
|
;___________________________________________________________________________________
|
|
|
|
HelpMgrInstall InstallProc
|
|
IMPORT ptchHMBootInitHelpManager
|
|
IMPORT ptchHMGestaltIsThereHelp
|
|
|
|
SUBQ #2,sp ; Save room for OSErr
|
|
JSR ptchHMBootInitHelpManager ; Init help mgr
|
|
MOVE.W (sp)+,d0 ; if error occurs then
|
|
BEQ.S @NoProblem
|
|
PEA HMProblemMessage ; get error message
|
|
_DebugStr ; output error message
|
|
BRA.S @Done
|
|
@NoProblem ; else
|
|
MOVE.L #gestaltHelpMgrAttr,d0 ; get 'help'
|
|
leaResident ptchHMGestaltIsThereHelp,a0 ; get Gestalt function
|
|
_NewGestalt ; install Gestalt function
|
|
BEQ.S @Done ; if error occurs then
|
|
PEA HMProblemMessage ; get error message
|
|
_DebugStr ; output error message
|
|
@Done
|
|
RTS
|
|
|
|
STRING PASCAL
|
|
HMProblemMessage
|
|
DC.B 'Unable to init Help Manager'
|
|
|
|
STRING ASIS
|
|
ALIGN 2
|
|
|
|
ENDPROC
|
|
|
|
;__________________________________________________________________________________
|
|
;
|
|
; Routine: NewPack14 - patch for Help Manager package.
|
|
;
|
|
; Inputs: nothing
|
|
;
|
|
; Outputs: N/A jumps to PACK after loading
|
|
;
|
|
; Destroys: iff PACK can not be loaded then D0 & A0 are destroyed
|
|
;
|
|
; Function: This routine patches the PACKage dispatching in ROM. The reason this
|
|
; is done is that the ROM dispatcher will call _SysErr (can you say bomb)
|
|
; if the PACKage can not be loaded. This is punishment far in excess
|
|
; of the crime. Since all PACK=14 routines now have a return value and
|
|
; D0 specifies the amount of parameters on the stack, it is possible
|
|
; to remove the parameters and return gracefully with an OSErr.
|
|
;___________________________________________________________________________________
|
|
;___________________________________________________________________________________
|
|
;
|
|
; PACK 14 entry - Help Manager
|
|
;
|
|
;___________________________________________________________________________________
|
|
|
|
Pack14Entry PatchProc _Pack14
|
|
|
|
IMPORT ptchHMPascalGetBalloons
|
|
|
|
Pack14Handle EQU App2Packs+24
|
|
Pack14Globals EQU ExpandMemRec.emPack14Globals ; use count global for ProcHelper
|
|
|
|
CMP #kHMGetBalloons,D0 ; special case this call as we don't want
|
|
BEQ.S @WasGetBalloons ; to load package to check state, get it from our globals instead
|
|
|
|
CMP #kHMInitHelpMenu,D0 ; yet another special case
|
|
BEQ.S @BootHelpMgrSystemMenu ; initialize the helpmgr menu
|
|
;
|
|
; Set up for ProcHelper normally
|
|
;
|
|
MOVE.L Pack14Handle,A0 ; A0 = handle to PACK
|
|
MOVE.L ExpandMem, A1 ; A1 = expanded memory area
|
|
ADD.W #Pack14Globals,A1 ; A1 = pointer to PACK use count
|
|
_ProcHelper ; let ProcHelper take over
|
|
|
|
@WasGetBalloons
|
|
JMP ptchHMPascalGetBalloons ; what is the state of What Is? mode?
|
|
|
|
@BootHelpMgrSystemMenu
|
|
|
|
BSaveReg REG A3/A4
|
|
|
|
movem.l BSaveReg,-(sp)
|
|
|
|
subq #4,sp ; room for package
|
|
move.l #'PACK',-(sp) ; we want the package resource
|
|
move #14,-(sp) ; of ID = 14
|
|
MOVE.W #MapTrue,RomMapInsert ; look in ROM first <SM4> rb
|
|
_GetResource
|
|
move.l (sp)+,d0 ; did we get it?
|
|
beq.s done ; no, so exit w/o putting up icon
|
|
|
|
move.l d0,-(sp) ; toss it initially
|
|
_ReleaseResource ; we just wanted to see if it was around
|
|
|
|
subq #4,sp ; Make room for result
|
|
move.w #kHMHelpMenuID,-(sp) ; Push the balloon menu ID
|
|
_GetRMenu ; Go get it
|
|
move.l (sp)+,d0 ; Get the menu handle
|
|
beq.s done
|
|
move.l d0,a3 ; Save handle across get icon suite
|
|
|
|
subq #6,sp ; Make room for result+handle address
|
|
pea 2(sp) ; Handle return place
|
|
move.w #kHMHelpMenuID,-(sp) ; Push the balloon menu ID
|
|
move.l #svAllSmallData,-(sp) ; Push the selector to get all small icons
|
|
_GetIconSuite ; Go and get them
|
|
move.w (sp)+,d0 ; Did it work?
|
|
move.l (sp)+,a4 ; Did it work?
|
|
bne.s done ; Guess not
|
|
move.l a4,d0
|
|
beq.s done
|
|
|
|
bsr.s StuffSuiteIntoMenu ; a3=menuhandle, a4=suite
|
|
move.l a3,-(sp) ; Push the menuhandle
|
|
move.w #0,-(sp) ; Insert after everyone
|
|
_InsertMenu ; Blast it in
|
|
done
|
|
movem.l (sp)+,BSaveReg
|
|
rts
|
|
|
|
;
|
|
; StuffSuiteIntoMenu
|
|
;
|
|
; Stuffs the icon suitehandle in a4 into the title of the menuhandle in a3
|
|
; Enter: a3 = menuHandle
|
|
; a4 = icon suite handle
|
|
; Trashes: A0,D0
|
|
;
|
|
StuffSuiteIntoMenu
|
|
move.l (a3),a0 ; dereference menu handle
|
|
lea menudata(a0),a0 ; point to the menudata
|
|
cmp.b #5,(a0) ; is the length of the data OK
|
|
beq.s @readytostuff ; if ok, go ahead and stuff icon
|
|
|
|
bra.s @SysErr127 ; *** someday call the code below
|
|
|
|
; Bummer, the title area is not the right size to stuff the handle
|
|
; subq #4,sp ; Make room for munger result
|
|
; move.l a3,-(sp) ; Push menuhandle
|
|
; move.l #menudata,-(sp) ; Push offset to menudata
|
|
; clr.l -(sp) ; ptr1=nil -> replace offset,length
|
|
; move.l (a3),a0 ; dereference menuhandle
|
|
; moveq #0,d0 ; clear high bytes
|
|
; move.b menudata(a0),d0 ; get the length
|
|
; addq #1,d0 ; be sure and replace the length byte too
|
|
; move.l d0,-(sp) ; len1=title length + 1
|
|
; moveq #6,d0 ; new size of title string
|
|
; move.l d0,-(sp) ; ptr2=anything but nil and odd (replace)
|
|
; move.l d0,-(sp) ; len2=6 replacement size
|
|
; _Munger ; Munge in 6 bytes from address 6 as title
|
|
; addq #4,sp ; ignore result
|
|
; move.l (a3),a0 ; dereference menu handle
|
|
; lea menudata(a0),a0 ; point to the menudata
|
|
|
|
@readytostuff
|
|
move.w #$0501,(a0)+ ; Set the magic cookie
|
|
move.l a4, (a0) ; Stuff the icon
|
|
rts
|
|
@SysErr127
|
|
moveq #127,d0
|
|
_SysError
|
|
|
|
ENDPROC ; Pack14Entry
|
|
|
|
;
|
|
;
|
|
; PROCEDURE ptchHMUpdateHelpMenu;
|
|
;
|
|
; This code updates the text in the items of the help menu.
|
|
;
|
|
; Everytime _MenuSelect is called, this routine is called. Why? Because since there
|
|
; are multiple copies of the help menu in different heaps and we don't keep a list of
|
|
; those menus around, we just stuff the menu item text each time. It also doesn't help
|
|
; to remember what state balloons was in, because we would have to do a comparestring
|
|
; for the text of the menu, instead, we just restuff the text each time.
|
|
;
|
|
; The reason we don't need to keep a list of menus around is that a copy of the global
|
|
; system help menu is made each time someone calls _InsertMenu. We don't have to worry
|
|
; then about an application crashing with this menu, cuz the app heap just gets reinited
|
|
; and voila, the menu goes away.
|
|
;
|
|
; Destroys pascal register conventions
|
|
;
|
|
ptchHMUpdateHelpMenu PROC EXPORT
|
|
|
|
IMPORT ptchHMGetBalloons
|
|
|
|
MOVE.L D7,-(SP) ; save a work register
|
|
|
|
SUBQ #4,SP ; make some space
|
|
MOVE.W #kHMHelpMenuID,-(SP) ; we want our help menu handle
|
|
_GetMHandle ; get the handle
|
|
MOVE.L (SP)+,D0 ; pop the menu handle (if any) into D0
|
|
BEQ.S @MenuNotThere ; yikes! menu handle wasn't found
|
|
|
|
MOVE.L D0,-(SP) ; push the menu handle
|
|
MOVE.W #kHMShowBalloonsItem,-(SP) ; set item number #kHMShowBalloonsItem
|
|
|
|
MOVE #kHMBalloonHelpID,D0 ; start w/ this index
|
|
JSR ptchHMGetBalloons ; what is the state of What Is? mode?
|
|
BEQ.S @OffMenuString ; EQ means the mode was off
|
|
|
|
ADDQ #1,D0 ; convert Boolean result to 'STR ' res ID
|
|
@OffMenuString
|
|
SUBQ #4,SP ; room for string handle
|
|
MOVE D0,-(SP) ; push string res ID
|
|
_GetString ; get the string resource
|
|
MOVE.L (SP)+,D7 ; D7 = string handle
|
|
BEQ.S @noStringFound ; EQ means it was NIL so stuff a default string (*** for now)
|
|
|
|
MOVE.L D7,A0 ; A0 = string handle
|
|
_HLock ; always lock the string (it always gets purged!)
|
|
|
|
MOVE.L (A0),A0 ; deref to get pointer
|
|
BRA.S @gotTheMenuString ; go set the item with the string found
|
|
@noStringFound
|
|
LEA whatIsDefaultString,A0 ; use this default string instead
|
|
@gotTheMenuString
|
|
MOVE.L A0,-(SP)
|
|
_SetItem ; set the What Is? menu item with the Show/Hide string
|
|
|
|
MOVE.L D7,D0 ; test the contents of D7 (possibly a string handle)
|
|
BEQ.S @MenuNotThere ; EQ means NIL
|
|
|
|
MOVE.L D7,A0 ; put string handle in A0
|
|
_HUnlock ; and unlock it
|
|
@MenuNotThere
|
|
MOVE.L (SP)+,D7 ; restore the register
|
|
RTS ; return to caller
|
|
|
|
STRING PASCAL
|
|
ALIGN 0
|
|
whatIsDefaultString DC.B 'Show/Hide Balloons' ; this is the default text for the current menu item
|
|
ALIGN 2
|
|
STRING ASIS
|
|
|
|
IF HelpMgrTesting THEN
|
|
DoDebugSymbols ptchHMUpdateHelpMenu ; label for MacsBug
|
|
ENDIF
|
|
|
|
ENDP
|
|
|
|
;
|
|
; FUNCTION ptchHMGetHelpGlobal: HMGlobalPtr; ; we need this for pascal
|
|
;
|
|
; Returns our global ptr for the help manager globals
|
|
;
|
|
ptchHMGetHelpGlobal PROC EXPORT
|
|
MOVE.L ExpandMem,A0 ; point to the expand mem ptr
|
|
MOVE.L ExpandMemRec.emHelpGlobals(A0),4(SP) ; return the global ptr on the stack
|
|
RTS ; return to caller
|
|
|
|
IF HelpMgrTesting THEN
|
|
DoDebugSymbols ptchHMGetHelpGlobal ; label for MacsBug
|
|
ENDIF
|
|
|
|
ENDP
|
|
|
|
;
|
|
; ptchHMGetBalloons
|
|
;
|
|
; Returns with CCRs set (& flag in D0.B) if WhatIs mode is on (this routine is a speed/code saver 4 the ptch only)
|
|
;
|
|
; Preserves all registers except A0
|
|
;
|
|
ptchHMGetBalloons PROC EXPORT
|
|
MOVE.L ExpandMem,A0 ; point to the expand mem ptr
|
|
MOVE.L ExpandMemRec.emHelpGlobals(A0),A0 ; get the global ptr in A0
|
|
TST.B hmgWhatIs(A0)
|
|
RTS ; return to caller
|
|
|
|
IF HelpMgrTesting THEN
|
|
DoDebugSymbols ptchHMGetBalloons ; label for MacsBug
|
|
ENDIF
|
|
|
|
ENDP
|
|
|
|
;
|
|
;
|
|
; PROCEDURE ptchHMSetHelpGlobal(gp: HMGlobalPtr);
|
|
;
|
|
; Sets the help manager global ptr to the specified ptr
|
|
;
|
|
ptchHMSetHelpGlobal PROC EXPORT
|
|
MOVE.L (SP)+,D0 ; get return address
|
|
MOVE.L ExpandMem,A0 ; point to the expand mem ptr
|
|
MOVE.L (SP)+,ExpandMemRec.emHelpGlobals(A0) ; stuff the global ptr
|
|
MOVE.L D0,A0 ; put the return address in A0
|
|
JMP (A0) ; ok, jump to it!
|
|
|
|
IF HelpMgrTesting THEN
|
|
DoDebugSymbols ptchHMSetHelpGlobal ; label for MacsBug
|
|
ENDIF
|
|
|
|
ENDP
|
|
|
|
END |