mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-09-06 18:54:30 +00:00
352 lines
14 KiB
Plaintext
352 lines
14 KiB
Plaintext
|
;
|
|||
|
; File: MenuMgrPatch.a
|
|||
|
;
|
|||
|
; Contains: Patches to the Menu Manager.
|
|||
|
;
|
|||
|
; Written by: Ed Tecot
|
|||
|
;
|
|||
|
; Copyright: <09> 1987-1992 by Apple Computer, Inc., all rights reserved.
|
|||
|
;
|
|||
|
; Change History (most recent first):
|
|||
|
;
|
|||
|
; <16> 7/24/92 DTY #1034303 <gbm>: The Menu Manager calls the 'MDEF' with the
|
|||
|
; CallMDEF utility routine. This routine locks the 'MDEF', calls
|
|||
|
; it, unlocks it upon return, and returns to the caller.
|
|||
|
; CalcMenuSize is an example of such a routine. The problem is
|
|||
|
; that the 'MDEF' calls CalcMenuSize itself, which causes the
|
|||
|
; 'MDEF' to get unlocked while it<69>s still executing. If the 'MDEF'
|
|||
|
; handle get relocated by the Memory Manager, you<6F>ll crash.
|
|||
|
; Bracket calls to CalcMenuSize with code that saves and restores
|
|||
|
; the 'MDEF' handle state.
|
|||
|
; <15> 5/14/92 KSM #1028474,<DCC>: Update patch that calls SCUpperText to skip the
|
|||
|
; call when character is a one-byte null character for speed. Add
|
|||
|
; patch to DrawMenuBar to synchronize the Keyboard menu (new
|
|||
|
; KeyScript verb).
|
|||
|
; <14> 1/22/92 JSM Add comment to PatchInsMenuItem to never roll this patch into
|
|||
|
; ROM.
|
|||
|
; <13> 10/10/91 PKE #1012672, For Cube-E (and Bruges): Use new SCUpperText routine
|
|||
|
; in MenuKey instead of UpperText, so we are independent of any
|
|||
|
; grafPort font. Include ScriptPriv.a.
|
|||
|
; <12> 8/30/91 DTY Define hasCQD here since it<69>s no longer defined in BBSStartup.
|
|||
|
; Defining it to be 0 for the System build seems like the wrong
|
|||
|
; thing since some of these patches apply to the colour machines,
|
|||
|
; but that<61>s the way it used to be, so that<61>s the way it<69>ll stay.
|
|||
|
; <11> 8/22/91 KSM csd,#Bruges: New InsrtResMenu call to fix sorting problem with
|
|||
|
; FONTs & FONDs. Call _UpperText instead of _UprString, MARKS in
|
|||
|
; MenuKey.
|
|||
|
; <10> 7/10/91 dba end of the forPost70 conditional; we are post-7.0 for good
|
|||
|
; <9> 3/31/91 dba gbm: load the new version of DisposeMenu on the II, IIci, and
|
|||
|
; Portable as well, since they all need the bug fix to handle
|
|||
|
; purged menus; also implement MenuChoice on the Plus, SE, and
|
|||
|
; Portable (but only post-7.0)
|
|||
|
; <8> 12/14/90 bbm (djw) roll in linked comefrompatch from patchIIrom.a.
|
|||
|
; <7> 12/14/90 KSM <rlc>Fix bug in MenuKey (II,IIci,&Portable) where it is BTSTing
|
|||
|
; a register for each item, but when the item is greater than 31,
|
|||
|
; the BTST instruction wraps and we get flags for previous items.
|
|||
|
; <6> 9/28/90 KSM <dba> Guarantee A5 world for calls into MDEFs.
|
|||
|
; <5> 9/15/90 KSM Patch InsMenuItem to fix a PixelPaint bug!!*!
|
|||
|
; <4> 7/26/90 KSM use GetMenuBar on the Macintosh II as well
|
|||
|
; <3> 7/23/90 dba convert this into a linked patch
|
|||
|
; <2> 12/19/89 EMT Removed references to routines that haven't been altered. Use
|
|||
|
; PatchMacros.a.
|
|||
|
; <1.3> 8/28/89 SES Removed references to nFiles.
|
|||
|
; <1.2> 6/2/89 KSM Remove tear off menu support in this file. See MenuMgr_Patch.a
|
|||
|
; <1.1> 6/1/89 KSM Added MenuDispatch for BigBang.
|
|||
|
; <1.0> 11/16/88 CCH Added to EASE.
|
|||
|
;
|
|||
|
|
|||
|
;
|
|||
|
; <12> When hasCQD was defined in {AvailableFeatures} in BBSStartup, it was defined
|
|||
|
; to be 0 for System builds, so keep it that way for future System builds. This
|
|||
|
; file probably won<6F>t be used in ROM builds, but in case it ever is, define
|
|||
|
; hasCQD to be true for those builds.
|
|||
|
;
|
|||
|
|
|||
|
if (&type('hasCQD') = 'UNDEFINED') then ; <12>
|
|||
|
if forROM then ; <12>
|
|||
|
hasCQD: equ 1 ; <12>
|
|||
|
else ; <12>
|
|||
|
hasCQD: equ 0 ; <12>
|
|||
|
endif ; <12>
|
|||
|
endif ; <12>
|
|||
|
|
|||
|
load 'StandardEqu.d'
|
|||
|
include 'LinkedPatchMacros.a'
|
|||
|
include 'ScriptPriv.a' ; <13>
|
|||
|
|
|||
|
ROMs Plus,SE
|
|||
|
|
|||
|
MakePatch InitProcMenu,$A808
|
|||
|
MakePatch PopUpMenuSelect,$A80B
|
|||
|
MakePatch InsMenuItem,$A826
|
|||
|
MakePatch GetItemCmd,$A84E
|
|||
|
MakePatch SetItemCmd,$A84F
|
|||
|
MakePatch InitMenus,$A930
|
|||
|
MakePatch DisposeMenu,$A932,(Plus,SE,II,IIci,Portable)
|
|||
|
MakePatch AppendMenu,$A933
|
|||
|
MakePatch ClearMenuBar,$A934
|
|||
|
MakePatch InsertMenu,$A935
|
|||
|
MakePatch DeleteMenu,$A936
|
|||
|
MakePatch DrawMenuBar,$A937
|
|||
|
MakePatch HiliteMenu,$A938
|
|||
|
MakePatch EnableItem,$A939
|
|||
|
MakePatch DisableItem,$A93A
|
|||
|
MakePatch GetMenuBar,$A93B,(Plus,SE,II)
|
|||
|
MakePatch SetMenuBar,$A93C
|
|||
|
MakePatch MenuSelect,$A93D
|
|||
|
MakePatch MenuKey,$A93E
|
|||
|
MakePatch CalcMenuSize,$A948
|
|||
|
MakePatch GetMHandle,$A949
|
|||
|
MakePatch FlashMenuBar,$A94C
|
|||
|
MakePatch AddResMenu,$A94D,(Plus,SE,II,IIci,Portable)
|
|||
|
MakePatch InsrtResMenu,$A951,(Plus,SE,II,IIci,Portable)
|
|||
|
MakePatch DelMenuItem,$A952
|
|||
|
MakePatch MenuChoice,_MenuChoice,(Plus,SE,Portable)
|
|||
|
|
|||
|
include 'MenuMgr.a'
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; SetClipForCallDrawMDEF
|
|||
|
;
|
|||
|
; This fixes two bugs in CallDrawMDEF. First, Don't use intersection of menuRect and
|
|||
|
; portRect for clipping, just use menuRect instead. Second, Set low-memory global
|
|||
|
; TopMenuItem before calling MDEF.
|
|||
|
|
|||
|
AfterSectRectInCallDrawMDEF ROMBind (II,$11244)
|
|||
|
RTSInDrawTheMenu ROMBind (II,$11232)
|
|||
|
|
|||
|
SetClipForCallDrawMDEF ComeFromPatchProc _SectRect,AfterSectRectInCallDrawMDEF,(II)
|
|||
|
|
|||
|
cmpROM RTSInDrawTheMenu,18(sp) ; CallDrawMDEF is called by PopUpMenuSelect
|
|||
|
; which should NOT be patched, so check where
|
|||
|
; CallDrawMDEF was called from.
|
|||
|
bne.s @inPopUp ;
|
|||
|
|
|||
|
move menuRect+Top(a6),TopMenuItem ; tell MDEF to draw from top of menu
|
|||
|
@inPopUp
|
|||
|
MOVE.L 4(SP),A0 ; Get dstRect (tRect)
|
|||
|
MOVE.L 12(SP),A1 ; Get src1 (menuRect)
|
|||
|
MOVE.L (A1)+,(A0)+ ; Copy src1 to dstRect
|
|||
|
MOVE.L (A1)+,(A0)+
|
|||
|
MOVE.L (SP)+,A0 ; Get return address
|
|||
|
LEA 12(SP),SP ; Remove parameters
|
|||
|
JMP (A0) ; And return
|
|||
|
|
|||
|
ENDPROC
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; PatchInsMenuItem <20> Check for bogus data passed to this routine and ignore it to aid PixelPaint.
|
|||
|
; This code should never be rolled into ROM.
|
|||
|
; PROCEDURE InsMenuItem(menu, str, item);
|
|||
|
|
|||
|
PatchInsMenuItem PatchProc _InsMenuItem,(Portable,IIci)
|
|||
|
|
|||
|
; Stack frame offsets in memory
|
|||
|
retAddr EQU 0
|
|||
|
itemID EQU retAddr+4
|
|||
|
strPtr EQU itemID+2
|
|||
|
menuHdl EQU strPtr+4
|
|||
|
stackDepth EQU menuHdl+4
|
|||
|
|
|||
|
; Perform a sanity check on the Parameters
|
|||
|
move.l strPtr(sp),d0 ; Get a potentially offending param (stringPtr)
|
|||
|
beq.s @PixelPaintSuks ; EQ means the stringPtr is NIL!!
|
|||
|
|
|||
|
move.l menuHdl(sp),d0 ; Get a potentially offending param (menuHandle)
|
|||
|
beq.s @PixelPaintSuks ; Yep, they blew it
|
|||
|
btst #0,d0 ; Is it an odd address?
|
|||
|
beqOLD ; EQ means not ODD and param are all ok
|
|||
|
|
|||
|
@PixelPaintSuks
|
|||
|
move.l (sp),a0
|
|||
|
lea stackDepth(sp),sp
|
|||
|
jmp (a0)
|
|||
|
EndProc
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; <16> SaveMDEFHandleStateAroundCalcMenuSize
|
|||
|
;
|
|||
|
; A side effect of calling CalcMenuSize is that the 'MDEF' will be unlocked on return.
|
|||
|
; If the 'MDEF' itself calls CalcMenuSize, the world tends to blow up. Bracket calls to
|
|||
|
; CalcMenuSize with HGetState/HSetState of the 'MDEF'.
|
|||
|
;
|
|||
|
|
|||
|
SaveMDEFHandleStateAroundCalcMenuSize PatchProc _CalcMenuSize,(Plus,SE,II,IIci,Portable)
|
|||
|
move.l 4(sp),a0 ; Get menu handle
|
|||
|
subq #2,sp ; Save space for the handle state
|
|||
|
move.l a0,-(sp) ; Push menu handle again for call through to CalcMenuSize
|
|||
|
move.l (a0),a0
|
|||
|
move.l MenuDefHandle(a0),a0 ; Get menu<6E>s definition procedure
|
|||
|
_HGetState ; Get the handle<6C>s current state
|
|||
|
move.b d0,4(sp) ; Save the state in the space we allocated just now
|
|||
|
jsrOld ; Call CalcMenuSize
|
|||
|
move.b (sp)+,d0 ; Get the saved handle state
|
|||
|
move.l 4(sp),a0 ; Get the menu handle again
|
|||
|
move.l (a0),a0
|
|||
|
move.l MenuDefHandle(a0),a0 ; Get the menu<6E>s definition procedure
|
|||
|
_HSetState ; Restore the previous handle state
|
|||
|
move.l (sp)+,(sp) ; Bubble up the return address over the parameter
|
|||
|
rts
|
|||
|
EndProc
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; SaveA5AroundCallMDEFProc <20> Some MDEFs rely on current A5 (so hold their hand across the call)
|
|||
|
|
|||
|
AfterLoadResourceInCallMDEFProc ROMBind (Portable,$11D96),(IIci,$177AA)
|
|||
|
AfterCallToMDEFInCallMDEFProc ROMBind (Portable,$11D9C),(IIci,$177B0)
|
|||
|
|
|||
|
SaveA5AroundCallMDEFProc ComeFromPatchProc _LoadResource,AfterLoadResourceInCallMDEFProc,(Portable,IIci)
|
|||
|
|
|||
|
addq #4,sp ; get rid of the return address
|
|||
|
jsrOld ; call LoadResource
|
|||
|
|
|||
|
_HLock ; lock it the gentleman<61>s way
|
|||
|
MOVE.L (A0),A0 ; handle -> pointer
|
|||
|
|
|||
|
move.l a5,8(a6) ; store A5 over one of the (already copied) parameters
|
|||
|
move.l CurrentA5,a5 ; get the A5 he<68>s expecting
|
|||
|
|
|||
|
JSR (A0) ; call him
|
|||
|
|
|||
|
move.l 8(a6),a5 ; get our A5 back
|
|||
|
jmpROM AfterCallToMDEFInCallMDEFProc
|
|||
|
|
|||
|
EndProc
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; FixBTSTBugInMenuKey <20> MenuKey is BTSTing a register containing menu flags. When we get to
|
|||
|
; items > 31, the BTST wraps and we get bogus flag results.
|
|||
|
; An item > 31 is always enabled unless the entire menu is disabled.
|
|||
|
; FUNCTION MenuKey(CHAR): LongInt;
|
|||
|
|
|||
|
ROMUpChar ROMBind (II,$114A0),(IIci,$179D8),(Portable,$11F86)
|
|||
|
ROMGetA0List ROMBind (II,$10DB2),(IIci,$17162),(Portable,$11776)
|
|||
|
ROMGETMENUPTR ROMBind (II,$10DA4),(IIci,$17154),(Portable,$11768)
|
|||
|
ROMGETITEMRECORD ROMBind (II,$113F8),(IIci,$17928),(Portable,$11ED6)
|
|||
|
ROMGetHA0List ROMBind (II,$10DCE),(IIci,$1717E),(Portable,$11792)
|
|||
|
ROMGetHIndex ROMBind (II,$10BD2),(IIci,$16F68),(Portable,$11600)
|
|||
|
ROMKeyNotFound ROMBind (II,$116CE),(IIci,$17C06),(Portable,$12008)
|
|||
|
ROMGOTMKEY ROMBind (II,$116DC),(IIci,$17C14),(Portable,$12016)
|
|||
|
|
|||
|
FixBTSTBugInMenuKey PatchProc _MenuKey,(II,Portable,IIci)
|
|||
|
CmdChar EQU 9 ; command char is in lo-byte of param [byte/word]
|
|||
|
MenuResult EQU 10 ; menu ID part of result
|
|||
|
mItemResult EQU 12 ; Item part of result
|
|||
|
|
|||
|
searchMenu EQU -8 ; looking for the parent of...
|
|||
|
HorRMenus EQU searchMenu - 2 ; looking thru HMenus (=0), or Regular Menus (=1)
|
|||
|
KeyFrame EQU HorRMenus - 2
|
|||
|
|
|||
|
link a6, #KeyFrame ; set up stackframe
|
|||
|
MOVEM.L D3-D6/A3,-(SP) ;save work registers
|
|||
|
|
|||
|
move.b CmdChar(a6), d0 ; get character to search for
|
|||
|
jsrROM ROMUpChar ; upshift in D0
|
|||
|
MOVE.B D0,D4 ; and save in D4
|
|||
|
|
|||
|
jsrROM ROMGetA0List ; get menuList pointer into A0
|
|||
|
move lastMenu(a0), d5 ; go to last menu
|
|||
|
clr d6 ; zero flag == checking regular menus
|
|||
|
|
|||
|
; here is the outer loop where each menu in the menuList is considered
|
|||
|
|
|||
|
KEYBARLOOP jsrROM ROMGETMENUPTR ;get menu pointer in A0 from index in D5
|
|||
|
MOVE.L A0,A3 ;stash in A3 for safe keeping
|
|||
|
BTST #0,MENUENABLE+3(A3) ;is this menu enabled?
|
|||
|
BEQ.S NEXTBAR ;if not, skip it
|
|||
|
MOVEQ #1,D3 ;start with item number 1
|
|||
|
|
|||
|
; here is the inner loop where each item is considered
|
|||
|
|
|||
|
KEYITEMLOOP MOVE.L MENUENABLE(A3),D0 ;get enable flags
|
|||
|
BTST D3,D0 ;make sure this item is enabled
|
|||
|
BEQ.S KEYNEXTITEM ;if not, skip it
|
|||
|
|
|||
|
EnabledKeyItemLoop ; <10> Loops to here when item in D3 > 31
|
|||
|
MOVE.L A3,A0 ;get menuPtr in A0
|
|||
|
MOVE D3,D0 ;get item number in D0
|
|||
|
jsrROM ROMGETITEMRECORD ;search for item
|
|||
|
BEQ.S NEXTBAR ;if not, this menu is exhausted
|
|||
|
|
|||
|
MOVE.B ItemCmd(A1),D0 ;get the command char
|
|||
|
jsrROM ROMUpChar ; upshift it in D0
|
|||
|
|
|||
|
cmpi.b #FirstAltMenuCmd, d0 ; item between $1B and $1F?
|
|||
|
blt.s @DoCompare ; no, so continue
|
|||
|
cmpi.b #LastAltMenuCmd, d0
|
|||
|
bhi.s @DoCompare ; no, so continue
|
|||
|
bra.s KeyNextItem ; if here then cmdItem is between
|
|||
|
; $1B and $1F so skip comparison
|
|||
|
|
|||
|
@DoCompare CMP.B D0,D4 ;do they match?
|
|||
|
beqROM ROMGOTMKEY ;if they do, we<77>ve found it!
|
|||
|
|
|||
|
KEYNEXTITEM ADDQ #1,D3 ;bump to next item
|
|||
|
CMPI.W #31,D3 ;<10> items > 31 are always enabled
|
|||
|
BHI.S EnabledKeyItemLoop ;<10> so skip moving the flags and the btst
|
|||
|
BRA.S KEYITEMLOOP ;loop till we find it or no more
|
|||
|
|
|||
|
NEXTBAR subq #6, d5 ; bump to next item
|
|||
|
cmp d6, d5 ; have we reached the value in d6?
|
|||
|
bgt.s KeyBarLoop ; loop till we reach it
|
|||
|
|
|||
|
tst d6 ; does d6 have a value? <FJL C222>
|
|||
|
bneROM ROMKeyNotFound ; yes, so have checked regular AND HMenus <FJL C222>
|
|||
|
|
|||
|
; d6 was equal to zero, so now check thru the hierarchical menus
|
|||
|
|
|||
|
jsrROM ROMGetHA0List ; get HMenuList ptr in A0
|
|||
|
move lastHMenu(a0), d5 ; get #HMenus
|
|||
|
beqROM ROMKeyNotFound ; none, so don<6F>t check <20>em
|
|||
|
|
|||
|
; yes there are menus so check them backwards
|
|||
|
move.l MinusOne, d1 ; set up for GetHIndex call
|
|||
|
jsrROM ROMGetHIndex ; d0 now has ptr to HMenuList header info
|
|||
|
add d0, d5 ; d5 points at last HMenu
|
|||
|
move d0, d6 ; d6 points at HMenuList header
|
|||
|
bra.s KeyBarLoop ; and start checking
|
|||
|
|
|||
|
EndProc
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; UseUpperTextInMenuKey <20> MenuKey now uses the internationally friendly _UpperText.
|
|||
|
; <14>:
|
|||
|
; Since SCUpperText can be slow, skip calls when we're upper-casing the single byte NULL
|
|||
|
; which really means that there is no command-key equivalent for this item.
|
|||
|
; Note: This patch should never be rolled in, the main code has been fixed in a better way.
|
|||
|
|
|||
|
AfterUprStringInUpChar ROMBind (II,$114A8),(IIci,$179E0),(Portable,$11f8E)
|
|||
|
UseUpperTextInMenuKey ComeFromPatchProc _UprString,AfterUprStringInUpChar,(II,IIci,Portable)
|
|||
|
|
|||
|
tst.b (a0) ; Is the byte a zero? <14>
|
|||
|
bne.s mustUpper ; No? go upper case it <14>
|
|||
|
cmp.w #1,d0 ; Is the length 1? (to be sure) <14>
|
|||
|
beq.s canSkipUpper ; Upper casing zero is skipped <14>
|
|||
|
mustUpper ; <14>
|
|||
|
move.l a0,-(sp) ; push textPtr <13>
|
|||
|
move.w d0,-(sp) ; push length <13>
|
|||
|
move.w #smSystemScript,-(sp) ; use system script, ignore port <13>
|
|||
|
_SCUpperText ; (stack based!) <13>
|
|||
|
canSkipUpper ; <14>
|
|||
|
rts
|
|||
|
EndProc
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; <14>
|
|||
|
; SynchKeyboardMenuState <20> Make sure the keyboard menu state corresponds to the
|
|||
|
; application<6F>s desired setting (enable/disable) in the
|
|||
|
; application-specific global flag, scriptDisableKybds
|
|||
|
; Note: This patch should never be rolled in, this code should be in Process Manager.
|
|||
|
|
|||
|
SynchKeyboardMenuState PatchProc _DrawMenuBar,(Plus,SE,II,IIci,Portable)
|
|||
|
|
|||
|
moveq #smKeySynchKbdMenuState,d0 ; Set up the KeyScript verb
|
|||
|
move.w d0,-(sp) ; to just synchronize the keyboard menu
|
|||
|
_KeyScript ; Do it.
|
|||
|
jmpOld ; Continue with DrawMenuBar code
|
|||
|
EndProc
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
End
|