mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2025-01-01 11:29:27 +00:00
0ba83392d4
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
334 lines
14 KiB
Plaintext
334 lines
14 KiB
Plaintext
;
|
|
; File: ToolboxEventMgrPatches.a
|
|
;
|
|
; Contains: linked patches for the Toolbox Event Manager
|
|
;
|
|
; Copyright: © 1990, 1992 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <3> 3/27/92 JSM Moved this file to ToolboxEventMgr folder, keeping all the old
|
|
; revisions, to reflect current Reality structure.
|
|
; <2> 3/3/92 PN Roll in DoSysErrorUpdates
|
|
; <12> 4/2/91 DFH dba, #86111: Added using32BitHeaps to the FixCheckActivate
|
|
; patch, so that apps (like MacWrite 5.0) that depend on the
|
|
; undocumented sys-vs-user-window event modifier will work, at
|
|
; least in 24-bit mode.
|
|
; <11> 1/14/91 DC rlc - Honor ScrDmpEnb on all machines. Currently implemented on
|
|
; the Plus. Fix Patches to SE and II. Add Patches for Portable and
|
|
; IIci.
|
|
; <10> 12/20/90 DFH (dba) Changed GetNextEvent and EventAvail to look for highlevel
|
|
; events (with a higher priority than updates).
|
|
; <9> 11/20/90 JSM <dba> Add come-from patches on _GetResource inside
|
|
; GetNextEvent() for the Plus (to disable FKEYs from GNE) and the
|
|
; II and SE (to disable FKEYs from the keypad). Moved here from
|
|
; Patch[PlusSEII]ROM.a.
|
|
; <8> 11/4/90 dba save the port around the call to PaintBehind
|
|
; <7> 10/23/90 dba (with csd) fix patch to OSEventAvail; it does the wrong things
|
|
; with the stack
|
|
; <6> 9/22/90 dba Ed Tecot meant well when he told us to do a PaintOne(RootLayer),
|
|
; but he really meant PaintBehind(RootLayer).
|
|
; <5> 8/1/90 dba put in a hack to make the old DSWndUpdate thing work
|
|
; <4> 7/2/90 stb Font fix
|
|
; <3> 6/24/90 DTY Added come-from patch to _GetMouse, which sets the current port
|
|
; to the Window Manager port before calling _GetMouse. This keeps
|
|
; the journal driver happy.
|
|
; <2> 4/26/90 dba add patch to GetNextEvent and EventAvail on the IIci to fix a
|
|
; 32-bit deactivation bug
|
|
; <1> 4/20/90 dba first checked in
|
|
;
|
|
; NOTE: These patches must be loaded *after* the Layer Mgr. since they call GetRootLayer.
|
|
;
|
|
|
|
load 'StandardEqu.d'
|
|
include 'LinkedPatchMacros.a'
|
|
include 'LayerEqu.a'
|
|
include 'GestaltEqu.a'
|
|
include 'MFPrivate.a'
|
|
|
|
AfterGetMouseInGetNextEvent ROMBind (Plus,$11136),(SE,$B724),(II,$F2E6),(Portable,$10224),(IIci,$15C04)
|
|
AfterOSEventAvailInCheckActivate ROMBind (IIci,$15C28)
|
|
AfterSystemUserWindowInCheckActivate ROMBind (IIci,$15C4A)
|
|
AfterGetResourceInTryFKey ROMBind (Plus,$110F8),(SE,$B6B8),(II,$F27A),(Portable,$101B8),(IIci,$15B98) ; <9> <11>
|
|
DoneGNE ROMBind (Plus,$1112C) ; <9>
|
|
TrySysEvent ROMBind (SE,$B6EA),(II,$F2AC) ; <9>
|
|
AfterOSEventAvailInGetNextEvent ROMBind (Plus,$1108A),(SE,$B656),(II,$F218),(Portable,$10144),(IIci,$15B2A)
|
|
AfterGetOSEventInGetNextEvent ROMBind (Plus,$1108E),(SE,$B65A),(II,$F21C),(Portable,$10148),(IIci,$15B2E)
|
|
|
|
;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
; GetNextEvent Ñ update windows when a disk switch dialog or other system error trashed the screen
|
|
|
|
; There is some code (in all of our ROMs) that causes an update when a disk switch dialog has
|
|
; appeared, but there was not enough room on the stack to save the bits behind the dialog.
|
|
; There is a bug in this code (the high bit of the top coordinate was set, so we always painted
|
|
; too much). Also, I needed the same mechanism to erase the space under the Òforced quitÓ system
|
|
; error dialog. In order to fix the bug and add a new feature, I introduced a new global (off of
|
|
; ExpandMem) to contain a rectangle that needs to be updated. Anyone (in system software) can union
|
|
; a rectangle into this global (even when the Memory Manager cannot be used) and the next
|
|
; GetNextEvent call will take care of the updating. Patches to the file systemÕs disk switch
|
|
; dialog code in FileSystemPatches.a cause it to union with this rectangle, so that it participates
|
|
; in this scheme.
|
|
|
|
; *** This does not take care of the case when the bits are scrolled or otherwise moved before
|
|
; GetNextEvent is called, but neither did the old code, and I donÕt have any ideas.
|
|
|
|
DoSysErrorUpdates patchproc _GetNextEvent,(Plus,SE,II,Portable,IIci)
|
|
|
|
import ClearSysErrorUpdateRect
|
|
|
|
BSET #7,DSWndUpdate ; check if someone is trying to use the old update mechanism
|
|
bnz.s @noUpdateNeeded
|
|
|
|
move.l DSAlertRect+4,-(sp)
|
|
move.l DSAlertRect,-(sp)
|
|
bclr #7,(sp) ; clear the bit that is sometimes set here
|
|
move.l sp,-(sp) ; copy of DSAlertRect without the high bit
|
|
move.l ExpandMem,a0
|
|
pea ExpandMemRec.SysErrorUpdateRect(a0)
|
|
move.l (sp),-(sp)
|
|
_UnionRect
|
|
add #8,sp ; get rid of the rectangle on the stack
|
|
@noUpdateNeeded
|
|
|
|
TST.B WWExist ; does a window world exist?
|
|
BNE.S @noWindowMgr ; no, one less world to worry about
|
|
|
|
subq #2,sp ; make room for result
|
|
move.l ExpandMem,a0
|
|
pea ExpandMemRec.SysErrorUpdateRect(a0)
|
|
_EmptyRect
|
|
tst.b (sp)+ ; is it empty?
|
|
bnz.s @rectIsEmpty
|
|
|
|
subq #4,sp ; make room for saved port
|
|
move.l sp,-(sp)
|
|
_GetPort
|
|
|
|
SUBQ #4,SP ; get a region for PaintBehind
|
|
_NewRgn
|
|
MOVE.L (SP),-(sp) ; and set region to the deep squid window
|
|
move.l ExpandMem,a0
|
|
pea ExpandMemRec.SysErrorUpdateRect(a0)
|
|
_RectRgn
|
|
subq #4,sp ; make room for root layer
|
|
_GetRootLayer
|
|
MOVE.L 4(sp),-(SP) ; clobber the whole region, from WindowList down!
|
|
_PaintBehind
|
|
_DisposRgn ; and then throw away the clobbered region
|
|
|
|
_SetPort ; restore the port
|
|
|
|
jsr ClearSysErrorUpdateRect ; no more rectangle
|
|
|
|
@rectIsEmpty
|
|
@noWindowMgr
|
|
if forROM then
|
|
import GetNextEvent
|
|
jmp GetNextEvent
|
|
else
|
|
jmpOld
|
|
endif
|
|
endproc
|
|
|
|
ClearSysErrorUpdateRect installproc (Plus,SE,II,Portable,IIci)
|
|
|
|
; Empty out the sysErrorUpdateRect, and make the coordinates such that UnionRect with any
|
|
; rectangle will return that rectangle. UnionRect will do this if top and left are maximum
|
|
; and bottom and right are minimum.
|
|
|
|
move.l ExpandMem,a0
|
|
move.l #$7FFF7FFF,ExpandMemRec.SysErrorUpdateRect+topLeft(a0) ; highest numbers
|
|
move.l #$80008000,ExpandMemRec.SysErrorUpdateRect+botRight(a0) ; lowest numbers
|
|
rts
|
|
|
|
endproc
|
|
|
|
if not forROM then
|
|
;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
; GetNextEvent/EventAvail Ñ fix 32-bit activation bug
|
|
|
|
; A bug occurs in the IIci ROM under 32-bit mode. The high bit of CurActivate and CurDeactivate
|
|
; are used as flags to indicate that the events have already been sent. (0 in either also means that
|
|
; the event was sent.) The problem is that the ROM code (written for 24-bit machines) refers to the
|
|
; windowKind field without stripping off this high bit. Under some circumstances, this would cause
|
|
; a bus error. Since the code that checks the window is only used to set the system/application bit
|
|
; in the modifiers of the activate/deactivate event, and that bit was never documented in a released
|
|
; version of Inside Mac. (and no one uses it), we can fix the bug by getting rid of the code that
|
|
; sets the system/application bit. This patch to CheckActivate eliminates the code to set the
|
|
; system/application bit.
|
|
|
|
FixCheckActivate comefrompatchproc _OSEventAvail,AfterOSEventAvailInCheckActivate,(IIci,using32BitHeaps)
|
|
|
|
lea ComeBackHere,a1 ; after doing the OSEventAvail, come back here
|
|
move.l a1,ReturnAddressDepth(sp) ; jam in that return address
|
|
jmpOld ; go do the OSEventAvail
|
|
|
|
ComeBackHere
|
|
MOVE.W #activateEvt,(A0)+ ; flag it as (de)activate event
|
|
MOVE.L D1,(A0) ; the windowPtr is the message
|
|
|
|
jmpROM AfterSystemUserWindowInCheckActivate
|
|
|
|
endproc
|
|
endif
|
|
;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
; GetNextEvent - Make sure current port is valid before calling _GetMouse
|
|
|
|
; This is mostly for the sake of the journalling driver. Before _GetNextEvent calls _GetMouse, check
|
|
; to see if the Window Manager exists by checking WWExist. (QDExist is also checked in the process, but
|
|
; thatÕs fine.) If the Window Manager exists, set the port to the Window Manager port before calling
|
|
; _GetMouse. If thereÕs no Window Manager, the call to _GetMouse is skipped.
|
|
|
|
SetWindowMgrPort ComeFromPatchProc _GetMouse,AfterGetMouseInGetNextEvent,(Plus,SE,II,Portable,IIci)
|
|
|
|
tst.w WWExist ; See if the Window Manager & QuickDraw exist
|
|
bne.s @backToGetNextEvent ; If WMgr isnÕt there, donÕt call _GetMouse
|
|
|
|
; Window Mananger exists. Set the port to the Window ManagerÕs port before calling _GetMouse
|
|
|
|
sub.w #4,sp
|
|
move.l sp,-(sp)
|
|
_GetPort ; Save the current port on the stack
|
|
|
|
move.l WMgrPort,-(sp)
|
|
_SetPort ; Set the port to the Window ManagerÕs port
|
|
move.l 8(sp),-(sp) ; Copy the original _GetMouse parameter
|
|
jsrOld ; Call _GetMouse
|
|
|
|
_SetPort ; Old port is already on the stack.
|
|
|
|
@backToGetNextEvent
|
|
add.w #8,sp ; Remove return address and parameter from stack
|
|
jmpROM AfterGetMouseInGetNextEvent
|
|
ENDPROC
|
|
|
|
;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
; Come-from patch on _GetResource inside GetNextEvent to ignore FKEYs on the Mac Plus <9>
|
|
|
|
; If called from GetNextEvent trying to load an FKEY, abort out so that the
|
|
; event record is passed to the application. FKEYs are handled by SystemEvent on the Plus.
|
|
|
|
; Note that this FKEY patch is rarely invoked, and only in bizarre circumstances.
|
|
; Due to a bug in the Mac Plus ROM, a valid FKEY event always fails the range check (it
|
|
; compares ASCII 0 through 9 (i.e. $30 to $39) to decimal 0 through 9), and GetNextEvent
|
|
; never tries to invoke the FKEY. However, it may try to load an FKEY when an invalid key
|
|
; combination is held down. For example, shift-cmd-enter is really shift-cmd-$03, which because
|
|
; of the range checking problem causes FKEY 3 to be loaded. Someday we may want to reassess whether
|
|
; this patch is more trouble than it's worth.
|
|
|
|
LoadFKEYInGetNextEvent ComeFromPatchProc _GetResource,AfterGetResourceInTryFKey,(Plus)
|
|
|
|
LEA 14(SP), SP ; Clean off the stack
|
|
jmpROM DoneGNE ; Go where we are supposed to
|
|
|
|
endproc
|
|
|
|
;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
; Come-from patch on _GetResource inside GetNextEvent to disable FKEYs from the keypad <9>
|
|
|
|
; Note that even though this is a come-from on the same label as LoadFKEYInGetNextEvent on
|
|
; the Plus, it's doing different things. On the Plus, FKEY handling was moved into SystemEvent.
|
|
; On the SE and II, it was moved back out so that FKEY's are handled before calling SystemEvent.
|
|
; So, it's valid for GetNextEvent to get an FKEY on the SE and II where it wasn't valid on the
|
|
; Plus.
|
|
|
|
KeypadFKEYInGetNextEvent ComeFromPatchProc _GetResource,AfterGetResourceInTryFKey,(SE,II)
|
|
|
|
TST.B ScrDmpEnb ; Check the ScrDmpEnb flag <11>
|
|
BNE.S moreChecks ; if it is not false, do some more checks <11>
|
|
MOVE.L (SP)+, A0 ; otherwise, return NIL. <11>
|
|
ADDQ.L #6, SP ; <11>
|
|
CLR.L (SP) ; <11>
|
|
JMP (A0) ; <11>
|
|
|
|
moreChecks ; <11>
|
|
MOVE.B evtMessage+2(A3), D0 ; Get the raw keycode
|
|
CMP.B #$3F, D0 ; Keyboard or Keypad?
|
|
blsOld ; Keyboard -- execute normally
|
|
|
|
LEA 14(SP), SP ; Clean off the stack
|
|
jmpROM TrySysEvent ; Go where we are suppossed to
|
|
|
|
endproc
|
|
|
|
;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
; Come-from patch on _GetResource inside GetNextEvent to honor ScrDmpEnb <11>
|
|
|
|
; The portable and IIci ROMS are fixed to do most of what KeypadFKEYInGetNextEvent does. They only
|
|
; require a fix to honor the ScrDmpEnable BOOLEAN in low-memory.
|
|
|
|
CheckInhibitFKEYInGetNextEvent ComeFromPatchProc _GetResource,AfterGetResourceInTryFKey,(Portable,IIci)
|
|
|
|
TST.B ScrDmpEnb ; Check the ScrDmpEnb flag
|
|
bneOld ; if it is not false, try to get the FKEY
|
|
MOVE.L (SP)+, A0 ; otherwise, return NIL.
|
|
ADDQ.L #6, SP
|
|
CLR.L (SP)
|
|
JMP (A0)
|
|
|
|
endproc
|
|
|
|
;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
; GetOSEvent/OSEventAvail -- change ROM GetNextEvent to look for high level (PPC) events.
|
|
; This code should be rolled inline into GetNextEvent. We use comefrom patches for
|
|
; convenience only.
|
|
|
|
HLEAvail ComeFromPatchProc _OSEventAvail,AfterOSEventAvailInGetNextEvent,(Plus,SE,II,Portable,IIci)
|
|
import shareHLEPatch:CODE
|
|
|
|
; must look for OS events before we waste any more time
|
|
jsrOld ; call through
|
|
jmp shareHLEPatch ; go share code
|
|
|
|
EndProc ; HLEAvail
|
|
|
|
GetNextHLE ComeFromPatchProc _GetOSEvent,AfterGetOSEventInGetNextEvent,(Plus,SE,II,Portable,IIci)
|
|
entry shareHLEPatch:CODE
|
|
|
|
; must try to get OS events before we waste any more time
|
|
jsrOld ; call through
|
|
|
|
shareHLEPatch
|
|
tst.w EvtNum(a3) ; find something?
|
|
bne.s Return ; if so, get out without further ado
|
|
|
|
; no OS events. Should we look for high-level events?
|
|
move.w 12(a6),d0 ; get the caller's event mask
|
|
btst #highLevelEvtBit,d0 ; high-level events requested?
|
|
beq.s ReturnFalse ; if not, just go on
|
|
move.w WeKnowProcMgrExists,d0 ; do we know whether OSDispatch is OK?
|
|
bne.s CallGetHLEvent ; if so, go do it right now
|
|
|
|
; We need to check for high level events. Determine whether Process Mgr is around yet.
|
|
move.l #gestaltOSAttr,d0 ; Gestalt implemented by Process Mgr
|
|
_Gestalt ; ask about Process Mgr
|
|
blt.s ReturnFalse ; exit now if we're still too early
|
|
lea WeKnowProcMgrExists,a0 ; get address of cheater flag
|
|
st (a0) ; remember not to check again
|
|
|
|
; Ask the Process Mgr for a high level event.
|
|
CallGetHLEvent
|
|
clr.w -(sp) ; allocate result storage
|
|
move.w 12(a6),-(sp) ; pass event mask
|
|
move.l a3,-(sp) ; pass address of event record
|
|
tst.w d3 ; EventAvail or GetNextEvent?
|
|
seq -(sp) ; pass Boolean: GNE - true, EA - false
|
|
_GetNextHighLevelEvent ; call Processs Mgr
|
|
move.w (sp)+,d0 ; pop result
|
|
Return
|
|
rts
|
|
|
|
; Exit where we have to restore d0 to say ÒfalseÓ
|
|
ReturnFalse
|
|
moveq #0,d0 ; say false
|
|
bra.s Return ; joint exit
|
|
|
|
; Flag whether we know Process Mgr exists
|
|
WeKnowProcMgrExists dc.w 0
|
|
|
|
EndProc ; GetNextHLE
|
|
|
|
;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
|
|
end
|