mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-29 20:49:19 +00:00
382 lines
16 KiB
Plaintext
382 lines
16 KiB
Plaintext
;
|
||
; File: ControlMgrPatches.a
|
||
;
|
||
; Contains: linked patches to the Control Mgr.
|
||
;
|
||
; Copyright: © 1989-1990, 1992 by Apple Computer, Inc., all rights reserved.
|
||
;
|
||
; Change History (most recent first):
|
||
;
|
||
; <9> 7/1/92 JSM Fix bug in one of the changes I made for TheFuture in the last
|
||
; revision, add comments about IIci patches that have been rolled
|
||
; into ControlMgr.a: FixNewControl32Bit,
|
||
; PatchDisposeControlForInvisibleControlsIIci,
|
||
; PatchDisposeControlForCorrectLayer, CheckMemErrInSetCTitle, and
|
||
; ThrottleScrollingSpeed.
|
||
; <8> 6/30/92 JSM Move patch on _TrackControl for scroll speed throttling here
|
||
; from ScrollSpeedFix.a, add a MakeInstall for TheFuture to
|
||
; allocate globals in ExpandMem for this patch.
|
||
; <7> 4/22/92 pvh Fix bug so that the right layer is switched in when we're
|
||
; disposing of a control (_DisposeControl patch). Added new patch
|
||
; to swap in the correct layer before calling real
|
||
; _DisposeControl.
|
||
; <6> 1/18/91 VL <jsm> DrawThumbOutline should check whether it is coming from
|
||
; DragControl also. Otherwise, we may be accessing bogus
|
||
; ControlRecord.
|
||
; <5> 1/13/91 VL <dba> Added a patch to FrameRect to draw a solid outline when
|
||
; dragging the thumb in 7.0 scroll bar (CDEF 1).
|
||
; <4> 11/8/90 dba & gbm; move patch that does a system error if we can’t load a
|
||
; CDEF here from PTCH files; move patch that disables Plus check
|
||
; for control visible (for MacExpress) here from PatchPlusROM
|
||
; <3> 10/24/90 KSM <dba>Fix SetCTitle to check if SetHandleSize failed.
|
||
; <2> 10/8/90 dba move the NewControl/contrlOwner bug fix here from
|
||
; WindowMgrPatches.a
|
||
; <1> 9/23/90 dba Created today with two patches; NewControl heap scramble bug in
|
||
; 32-bit mode, DisposeControl erasing invisible controls.
|
||
;
|
||
|
||
load 'StandardEqu.d'
|
||
include 'LinkedPatchMacros.a'
|
||
include 'LayerEqu.a'
|
||
include 'ControlPriv.a'
|
||
|
||
; NOTE: patches to SetCtlColor and GetAuxCtl are found in WindowMgrPatches.a
|
||
|
||
EraseControlInDisposeControl ROMBind (Plus,$12E9C),(SE,$D4A0),(II,$11DC4),(Portable,$1270E),(IIci,$15F00)
|
||
AfterEraseControlInDisposeControl ROMBind (Plus,$12E9E),(SE,$D4A2),(II,$11DC6),(Portable,$12710),(IIci,$15F02)
|
||
AfterSetCtlColorInNewControl ROMBind (II,$11C6A),(IIci,$15D84)
|
||
|
||
AfterSetHandleSizeInSetCTitle ROMBind (Plus,$13002),(SE,$D606),(II,$11F44),(IIci,$160C0),(Portable,$12874)
|
||
GoTstVisInSetCTitle ROMBind (Plus,$13010),(SE,$D614),(II,$11F52),(IIci,$160CE),(Portable,$12882)
|
||
|
||
AfterLoadResourceInCallControl ROMBind (Plus,$12E58),(SE,$0D45C),(II,$11D46)
|
||
AfterSectRectInCallControl ROMBind (Plus,$12E1E)
|
||
|
||
AfterFrameRectInFastPaint ROMBind (II,$105B4),(IIci,$19492)
|
||
GetCVariantInCallControl ROMBind (II,$11D2E),(IIci,$15E48)
|
||
OwnerPortInROM ROMBind (II,$12084),(IIci,$16218)
|
||
|
||
AfterDragTheRgnInDragControl ROMBind (II,$12044),(IIci,$161D8)
|
||
|
||
;————————————————————————————————————————————————————————————————————————————————————————————————————
|
||
; NewControl — also, SetCtlColor needs contrlOwner, so we need to set it up before calling
|
||
; fix bug where we have a dereferenced handle across SetCtlColor in 32-bit mode
|
||
;
|
||
; This patch has been rolled into ControlMgr.a.
|
||
;
|
||
|
||
FixNewControl32Bit ComeFromPatchProc _SetCtlColor,AfterSetCtlColorInNewControl,(II,IIci)
|
||
|
||
addq #4,sp ; get rid of the return address
|
||
move.l 30(a6),contrlOwner(a2) ; copy the owner into the field
|
||
jsrOld ; call SetCtlColor
|
||
move.l (a3),a2 ; re-dereference the control handle
|
||
jmpROM AfterSetCtlColorInNewControl
|
||
|
||
EndProc
|
||
|
||
;————————————————————————————————————————————————————————————————————————————————————————————————————
|
||
; DisposeControl — fix bug where we erase controls even if they are invisible
|
||
|
||
PatchDisposeControlForInvisibleControls PatchProc _DisposeControl,(Plus,SE,II,Portable)
|
||
|
||
; Here we check to see if the control is invisible, and rejoin the ROM just before the routine that
|
||
; does the erasing, if the control is visible, or just after if it is invisible.
|
||
|
||
MOVE.L A3,-(SP) ;preserve a work register
|
||
MOVE.L 8(SP),A3 ;get the control handle
|
||
|
||
move.l (a3),a0
|
||
tst.b contrlVis(A0) ;is the control visible?
|
||
beqROM AfterEraseControlInDisposeControl ; no, skip erasing
|
||
jmpROM EraseControlInDisposeControl ; yes, go erase
|
||
|
||
EndProc
|
||
|
||
PatchDisposeControlForInvisibleControlsIIci PatchProc _DisposeControl,(IIci)
|
||
|
||
; The IIci version of the control manager saves two registers instead of one.
|
||
;
|
||
; This patch has been rolled into ControlMgr.a.
|
||
;
|
||
|
||
MOVEM.L A2/A3,-(SP) ;preserve work registers
|
||
MOVE.L 12(SP),A3 ;get the control handle
|
||
|
||
move.l (a3),a0
|
||
tst.b contrlVis(A0) ;is the control visible?
|
||
beqROM AfterEraseControlInDisposeControl ; no, skip erasing
|
||
jmpROM EraseControlInDisposeControl ; yes, go erase
|
||
|
||
EndProc
|
||
|
||
|
||
;————————————————————————————————————————————————————————————————————————————————————————————————————
|
||
; DisposeControl — fix bug so that the current layer is switched in when disposing the control <7>
|
||
;
|
||
; This patch has been rolled into ControlMgr.a.
|
||
;
|
||
|
||
PatchDisposeControlForCorrectLayer PatchProc _DisposeControl,(Plus,SE,II,IIci,Portable) ; <7>
|
||
|
||
move.l 4(sp), d0 ; get the control handle <7>
|
||
move.l d0, a0
|
||
beq.s @failNil ; in case it's bogus <7>
|
||
move.l (a0), a0 ; get pointer <7>
|
||
subq.l #4, sp ; room for result <7>
|
||
subq.l #4, sp ; room for result for _SwapCurLayer <7>
|
||
move.l contrlOwner(a0), -(sp) ; setup for _GetParent <7>
|
||
_GetParent
|
||
_SwapCurLayer ; swap for parent, leaves original layer on stack <7>
|
||
move.l 8(sp), -(sp) ; repush control handle for old routine <7>
|
||
jsrOld ; call old <7>
|
||
_SetCurLayer ; original should be on stack waiting for us <7>
|
||
@failNil move.l (sp), a0 ; get return address <7>
|
||
addq.l #8, sp ; remove address and control handle <7>
|
||
jmp (a0) ; return from whence we came <7>
|
||
|
||
EndProc ; <7>
|
||
|
||
;————————————————————————————————————————————————————————————————————————————————————————————————————
|
||
; SetCTitle — Check MemError after SetHandleSize before BlockMoving new data
|
||
;
|
||
; This patch has been rolled into ControlMgr.a.
|
||
;
|
||
|
||
CheckMemErrInSetCTitle ComeFromPatchProc _SetHandleSize,AfterSetHandleSizeInSetCTitle,(Plus,SE,II,IIci,Portable)
|
||
|
||
LEA AfterOSDispatcher, A1 ; after doing the SetHandleSize, come back here
|
||
MOVE.L A1, ReturnAddressDepth(sp) ; jam in that return address
|
||
jmpOld ; go do the SetHandleSize
|
||
|
||
AfterOSDispatcher
|
||
beqROM AfterSetHandleSizeInSetCTitle
|
||
ADDQ.W #4, SP ; Pull the size off the stack
|
||
jmpROM GoTstVisInSetCTitle ; And skip over BlockMove call
|
||
|
||
EndProc
|
||
|
||
;————————————————————————————————————————————————————————————————————————————————————————————————————
|
||
; LoadResource — do a system error if we try to load a CDEF resource and fail
|
||
|
||
SysErrorIfNoCDEF ComeFromPatchProc _LoadResource,AfterLoadResourceInCallControl,(Plus,SE,II)
|
||
|
||
addq #4,sp ; get rid of the return address
|
||
jsrOld ; call LoadResource
|
||
tst.l (a0) ; is the handle we just tried to load still empty?
|
||
bnzROM AfterLoadResourceInCallControl ; no, go back to the ROM
|
||
moveq #dsCDEFNotFound,D0 ; get error code
|
||
_SysError
|
||
|
||
EndProc
|
||
|
||
;————————————————————————————————————————————————————————————————————————————————————————————————————
|
||
; drawing controls — always draw controls, even if there rectangles are outside the portRect
|
||
|
||
; The control manager on the Plus only drew controls whose rects lay within the portRect.
|
||
; Unfortunately MacExpress does some strange mapping of coordinates into its split
|
||
; view windows at the QuickDraw level (that is, after we have decided not to draw it).
|
||
; This patch ignores the SectRect completely and returns that it should always be drawn.
|
||
|
||
DontCheckControlRects ComeFromPatchProc _SectRect,AfterSectRectInCallControl,(Plus)
|
||
|
||
move.l (sp)+,a0 ; get return address
|
||
lea 12(sp),sp ; strip parameters
|
||
st (sp) ; return true
|
||
jmp (a0) ; and return to caller
|
||
|
||
EndProc
|
||
|
||
;————————————————————————————————————————————————————————————————————————————————————————————————————
|
||
; FrameRect in FastPaint
|
||
|
||
DrawThumbOutline ComeFromPatchProc _FrameRect,AfterFrameRectInFastPaint,(II,IIci)
|
||
|
||
tst.w DragFlag ; are we drawing the thumb outline?
|
||
beqOld ; no => do the old stuff
|
||
|
||
cmpROM AfterDragTheRgnInDragControl,4(a6) ; do we come from DragControl?
|
||
bneOld ; no => do the old stuff
|
||
|
||
move.l -48(a6),a0 ; get the control record
|
||
move.l (a0),a0 ; get the ptr to control record
|
||
move.l contrlDefHandle(a0),a0 ; get the CDEF handle
|
||
move.l (a0),a0 ; get the ptr to CDEF
|
||
cmp.l #'CDEF',4(a0) ; Is this a CDEF?
|
||
bneOld ; No => FrameRect
|
||
btst #0,3(a0) ; Can CDEF handle this message?
|
||
beqOld ; No => FrameRect
|
||
|
||
move.l a3,-(sp) ; save off a3
|
||
move.l -48(a6),a3 ; put the control record in a3 since ROM routines need it
|
||
pea comeBackHere ; push an artificial return address
|
||
jsrROM OwnerPortInROM ; get the old port
|
||
clr.l -(sp) ; result code
|
||
clr.w -(sp) ; varCode
|
||
move.l a3,-(sp) ; control handle
|
||
move.w #drawThumbOutlineMsg,-(sp) ; message
|
||
move.l 28(sp),-(sp) ; put rect into parameter
|
||
subq.l #2,sp ; room for results
|
||
move.l a3,-(sp) ; control handle
|
||
jmpROM GetCVariantInCallControl ; borrow CallControl from ROM to save code
|
||
comeBackHere
|
||
move.l (sp)+,a3 ; restore a3
|
||
|
||
tst.l d0 ; did CDEF handle the drawing?
|
||
beqOld ; No => FrameRect
|
||
move.l (sp)+,(sp) ; back from CallControl
|
||
rts ; return to DragControl
|
||
|
||
EndProc
|
||
|
||
IF TheFuture THEN ; don’t put data in code space in the future
|
||
|
||
;————————————————————————————————————————————————————————————————————————————————————————————————————
|
||
; InitScrollSpeedGlobals - defined in ControlMgrExtensions.a
|
||
;
|
||
; allocate and initialize globals stored in emScrollSpeedGlobals
|
||
;
|
||
|
||
import InitScrollSpeedGlobals
|
||
MakeInstall InitScrollSpeedGlobals,(Plus,SE,II,Portable,IIci)
|
||
|
||
ENDIF ; TheFuture
|
||
|
||
;————————————————————————————————————————————————————————————————————————————————————————————————————
|
||
; ThrottleScrollingSpeed - formerly in ScrollSpeedFix.a
|
||
;
|
||
; We patch TrackControl to substitute in our "special" action proc. In order to
|
||
; communicate the old action proc, we need to store it in a PC relative place.
|
||
; This makes TrackControl non-reentrant, but I don't think it ever was expected to be.
|
||
;
|
||
; This patch has been rolled into ControlMgr.a.
|
||
;
|
||
|
||
ThrottleScrollingSpeed PatchProc _TrackControl,(Plus,SE,II,Portable,IIci)
|
||
|
||
tcFrame RECORD 0
|
||
returnAddress DS.L 1
|
||
actionProc DS.L 1
|
||
startPoint DS.L 1
|
||
theControl DS.L 1
|
||
result DS.W 1
|
||
ENDR
|
||
|
||
WITH tcFrame
|
||
|
||
MOVE.L actionProc(SP), D0 ; Get the actionProc.
|
||
BEQ.S @noAction ; Skip patch if none.
|
||
BTST #0, D0 ; Is it odd?
|
||
BNE.S @noAction ; Skip patch if so.
|
||
|
||
IF TheFuture THEN
|
||
move.l ExpandMem,a0
|
||
move.l ExpandMemRec.emScrollSpeedGlobals(a0),a0
|
||
MOVE.L D0,ScrollSpeedGlobals.saveAction(A0) ; Save the old actionProc.
|
||
ELSE
|
||
LEA saveAction, A0
|
||
MOVE.L D0, (A0) ; Save the old actionProc.
|
||
ENDIF
|
||
|
||
LEA ScrollAction, A0
|
||
MOVE.L A0, actionProc(SP) ; And replace it with mine.
|
||
|
||
SUBQ.L #4, SP
|
||
_TickCount ; Get a time stamp.
|
||
|
||
IF TheFuture THEN
|
||
move.l ExpandMem,a0
|
||
move.l ExpandMemRec.emScrollSpeedGlobals(a0),a0
|
||
MOVE.L (SP)+,ScrollSpeedGlobals.startTicks(A0) ; And save it.
|
||
ELSE
|
||
LEA startTicks, A0
|
||
MOVE.L (SP)+, (A0) ; And save it.
|
||
ENDIF
|
||
|
||
@noAction
|
||
jmpOld ; Return to old _TrackControl
|
||
ENDWITH
|
||
|
||
IF NOT TheFuture THEN ; don’t put data in code space in the future
|
||
|
||
saveAction DS.L 1
|
||
startTicks DS.L 1
|
||
actionTicks DS.L 1
|
||
saveReturn DS.L 1 ; must follow actionTicks
|
||
|
||
ENDIF ; NOT TheFuture
|
||
|
||
ScrollAction
|
||
saFrame RECORD 0
|
||
returnAddress DS.L 1
|
||
partCode DS.W 1
|
||
theControl DS.L 1
|
||
ENDR
|
||
|
||
WITH saFrame
|
||
MOVE.W partCode(SP), D0 ; Get the part code
|
||
CMP.W #inUpButton, D0 ; < up button?
|
||
BLT.S @callAction ; Skip if so.
|
||
CMP.W #inPageDown, D0 ; > page down?
|
||
BGT.S @callAction ; Skip if so.
|
||
|
||
SUBQ.L #4, SP
|
||
_TickCount ; Get a time stamp.
|
||
|
||
IF TheFuture THEN
|
||
move.l ExpandMem,a0
|
||
move.l ExpandMemRec.emScrollSpeedGlobals(a0),a0
|
||
MOVE.L (SP)+,ScrollSpeedGlobals.actionTicks(A0) ; Save it
|
||
MOVE.L (SP)+,ScrollSpeedGlobals.saveReturn(A0) ; Copy the return address into a safe place.
|
||
ELSE
|
||
LEA actionTicks, A0
|
||
MOVE.L (SP)+, (A0)+ ; Save it and have A0 point to saveReturn
|
||
MOVE.L (SP)+, (A0) ; Copy the return address into a safe place.
|
||
ENDIF
|
||
|
||
BSR.S @callAction ; Call the old action procedure.
|
||
ENDWITH
|
||
|
||
SUBQ.L #2, SP ; Room for result.
|
||
|
||
IF TheFuture THEN
|
||
move.l ExpandMem,a0
|
||
move.l ExpandMemRec.emScrollSpeedGlobals(a0),a0
|
||
MOVE.L ScrollSpeedGlobals.startTicks(a0), -(SP)
|
||
MOVE.L ScrollSpeedGlobals.actionTicks(a0), -(SP)
|
||
ELSE
|
||
MOVE.L startTicks(PC), -(SP)
|
||
MOVE.L actionTicks(PC), -(SP)
|
||
ENDIF
|
||
|
||
CLR.W -(SP) ; itemsVisible is unknown.
|
||
_ScrollDelay
|
||
ADDQ.L #2, SP ; Toss result.
|
||
|
||
IF TheFuture THEN
|
||
move.l ExpandMem,a0
|
||
move.l ExpandMemRec.emScrollSpeedGlobals(a0),a0
|
||
move.l ScrollSpeedGlobals.saveReturn(a0),a0
|
||
ELSE
|
||
MOVE.L saveReturn(PC), A0
|
||
ENDIF
|
||
|
||
JMP (A0) ; And return.
|
||
|
||
@callAction
|
||
|
||
IF TheFuture THEN
|
||
move.l ExpandMem,a0
|
||
move.l ExpandMemRec.emScrollSpeedGlobals(a0),a0
|
||
move.l ScrollSpeedGlobals.saveAction(a0),a0
|
||
ELSE
|
||
MOVE.L saveAction(PC), A0
|
||
ENDIF
|
||
|
||
JMP (A0) ; Just call the action proc normally.
|
||
ENDPROC
|
||
|
||
;————————————————————————————————————————————————————————————————————————————————————————————————————
|
||
|
||
End
|