mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-26 16:49:18 +00:00
633 lines
25 KiB
Plaintext
633 lines
25 KiB
Plaintext
;
|
||
; File: GetMgr.a
|
||
;
|
||
; Contains: This file contains a collection of simple resource interface routines for the Mac
|
||
; toolBox to provide a simple way to use common system resources. These include:
|
||
; GetPattern, GetCursor, GetString, GetIcon, GetPicture, GetNewWindow, GetNewCWindow
|
||
; GetNewControl, GetMenu, and GetNewMBar.
|
||
;
|
||
; Written by: Andy Hertzfeld 29-Dec-82
|
||
;
|
||
; Copyright: © 1981-1992 by Apple Computer, Inc. All rights reserved.
|
||
;
|
||
; Change History (most recent first):
|
||
;
|
||
; <SM6> 11/20/92 RB Patterns should be looked for in ROM first. The Control Panel
|
||
; actually makes a copy of them before they are modified by the
|
||
; user and then saved with a special id as the pattern of choice.
|
||
; <SM5> 10/29/92 SWC Changed PaletteEqu.a->Palettes.a.
|
||
; <SM4> 10/22/92 CSS Change some short branches to word branches.
|
||
; <SM3> 6/23/92 PN Clean up patchGetResource in GetNewWindow
|
||
; <SM2> 4/2/92 PN Roll in patchGetResource from WindowMgrPatches.a into
|
||
; GetNewwindow
|
||
; <5> 2/10/92 JSM Moved this file to GetMgr folder, keeping all the old revisions.
|
||
; <4> 9/27/91 JSM Cleanup header, don’t use hasCQD conditional since all future
|
||
; ROMs will have color QuickDraw.
|
||
; <3> 5/21/91 gbm Nail a couple of warnings
|
||
; <2> 1/19/90 DVB Include PalettePriv.a
|
||
; <1.5> 11/13/89 KON Changed GetNewCWindow to load a palette with the same ID as the
|
||
; window if the palette exists in the resource file.
|
||
; <1.4> 8/22/89 SES Removed references to nFiles.
|
||
; <1.3> 7/15/89 CSL Added missing line of code from ages back into GetMenu to set
|
||
; ROMMapInsert true before calling _GetResInfo.
|
||
; <1.2> 3/31/89 MSH Get cursor goes the rom for the resource first.
|
||
; <1.1> 11/10/88 CCH Fixed Header.
|
||
; <1.0> 11/9/88 CCH Adding to EASE.
|
||
; <1.2> 11/2/88 GGD Got rid of machine specific conditionals in favor of feature
|
||
; based conditionals.
|
||
; <•1.1> 9/23/88 CCH Got rid of inc.sum.d and empty nFiles
|
||
; <1.0> 2/11/88 BBM Adding file for the first time into EASE…
|
||
; <C914> 10/29/87 rwh Port to Modern Victorian
|
||
; <C862> 7/27/87 rwh merged in DAF's <24Apr87> change from a wayward version of the
|
||
; source. His comment read "Fixed stack frame to be even-sized in
|
||
; GetNewControl"
|
||
; <C702> 1/27/87 FJL Make changes to GetRMenu based on code review
|
||
; <C687> 1/25/87 DAF Moved C678 change to WindowMgr3.a (SetWinColor) to make it
|
||
; easier to use
|
||
; <C678> 1/23/87 DAF Made all GetCWindows with wctb's force window's backColor to
|
||
; contentColor
|
||
; <C666> 1/22/87 DAF Evened out stack frame in GetNewWindow
|
||
; <C645> 1/15/87 DAF Unlocked and purged WINDs and CNTLs
|
||
; <C575> 12/30/86 DAF GetNewWindow now posts activate events if the new window is the
|
||
; frontmost window.
|
||
; <C491> 12/8/86 DAF Cleanup from code review. Set windows/controls visible before
|
||
; doing DrawXXX on nuMac. Removed ReleaseResources from windows,
|
||
; controls, and menubars.
|
||
; <C460> 11/24/86 DAF fixed some incorrect stack frame offsets in GetNewControl
|
||
; <C417> 11/17/86 FJL Changed bsr GetMenu to _GetRMenu, added color support to GetMenu
|
||
; <C407> 11/13/86 DAF fixed GetNewControl to confirm cctb handle before detaching
|
||
; <A353> 11/5/86 DAF corrected small errors in GetNewWindow introduced in C314
|
||
; <C314> 10/31/86 DAF corrected resource usage in GetNewWindow/GetNewControl Adjusted
|
||
; GetNewWindow to eliminate color flash.
|
||
; <C241> 10/17/86 DAF Changed color toolbox resource types ('WCTB'/'CCTB') to lower
|
||
; case, as recommended by JTC.
|
||
; <C206> 10/9/86 bbm Modified to mpw aincludes.
|
||
; <C203> 10/6/86 DAF Modified GetNewWindow/GetNewCWindow/GetControl to load color
|
||
; information, if present, on nuMac.
|
||
; <C169> 9/23/86 JTC Change BSET to HLock in 2 cases.
|
||
; <C146> 9/8/86 BBM added colorequ.a
|
||
; <C106> 8/5/86 EHB Added routine GetNewCWindow
|
||
; 2/19/86 BBM Made some modifications to work under MPW
|
||
; 7/10/85 EHB Load MDEF from ROM map in GetMenu
|
||
; 4/22/85 EHB Restored CalcMenuSize to make Draw work (lisa strikes again!)
|
||
; 4/15/85 EHB Made GetMenu check for existing resource.
|
||
; 4/11/85 EHB Eliminated CalcMenuSize by dirtying the size instead.
|
||
; 1/23/85 LAK Adapted for new equate files.
|
||
; 2/2/83 AJH Made GetMenu measure the menu
|
||
; 1/2/83 AJH Added icons and pictures, GetMenuBar
|
||
;
|
||
|
||
BLANKS ON
|
||
STRING ASIS
|
||
|
||
LOAD 'StandardEqu.d'
|
||
INCLUDE 'ColorEqu.a'
|
||
INCLUDE 'palettes.a'
|
||
INCLUDE 'palettePriv.a'
|
||
|
||
GMGR PROC EXPORT
|
||
|
||
;
|
||
; routines defined in the "Get" manager
|
||
;
|
||
EXPORT GetPattern
|
||
EXPORT GetCursor
|
||
EXPORT GetString
|
||
EXPORT GetIcon
|
||
EXPORT GetPicture
|
||
EXPORT GetNewWindow
|
||
EXPORT GetNewControl
|
||
EXPORT GetMenu
|
||
EXPORT GetNewMBar
|
||
EXPORT GetMgrEnd
|
||
|
||
EXPORT GetNewCWindow
|
||
|
||
;
|
||
; FUNCTION GetPattern(patID: INTEGER): PatHandle;
|
||
;
|
||
; GetPattern returns a pattern handle when given a pattern ID
|
||
;
|
||
GetPattern
|
||
MOVE.L #'PAT ',D0 ;remember the resource type
|
||
MOVE.W #MAPTrue,ROMMapInsert ; go to the rom for it <SM6> rb
|
||
GetCommon
|
||
SUBQ #4,SP ;make room for function result
|
||
MOVE.L D0,-(SP) ;push the resource type
|
||
MOVE.W 12(SP),-(SP) ;push the ID
|
||
_GetResource ;get the handle
|
||
MOVE.L (SP)+,D0 ;keep it in D0
|
||
|
||
MOVE.L (SP)+,A0 ;get the return address
|
||
ADDQ #2,SP ;strip the parameter
|
||
MOVE.L D0,(SP) ;move in the result
|
||
JMP (A0) ;return to the caller
|
||
|
||
;
|
||
; FUNCTION GetCursor(cursorID: INTEGER): CursorHandle;
|
||
;
|
||
; GetCursor returns a cursor handle given a cursor ID. It shares a lot
|
||
; of code with GetPattern.
|
||
;
|
||
GetCursor
|
||
MOVE.L #'CURS',D0 ;get the resource type
|
||
MOVE.W #MAPTrue,ROMMapInsert ; go to the rom for it
|
||
BRA.S GetCommon ;let common code do the rest
|
||
|
||
;
|
||
; FUNCTION GetString(StringID: INTEGER): StringHandle;
|
||
;
|
||
; GetString returns a string handle given a string ID. It shares a lot
|
||
; of code with GetPattern.
|
||
;
|
||
GetString
|
||
MOVE.L #'STR ',D0 ;get the resource type
|
||
BRA.S GetCommon ;let common code do the rest
|
||
|
||
;
|
||
; FUNCTION GetIcon(IconID: INTEGER): IconHandle;
|
||
;
|
||
; GetIcon returns a iconHandle given an icon ID. It shares a lot
|
||
; of code with GetPattern.
|
||
;
|
||
GetIcon
|
||
MOVE.L #'ICON',D0 ;get the resource type
|
||
BRA.S GetCommon ;let common code do the rest
|
||
|
||
;
|
||
; FUNCTION GetPicture(PictureID: INTEGER): PicHandle;
|
||
;
|
||
; GetPicture returns a picture handle given a picture ID. It shares a lot
|
||
; of code with GetPattern.
|
||
;
|
||
GetPicture
|
||
MOVE.L #'PICT',D0 ;get the resource type
|
||
BRA.S GetCommon ;let common code do the rest
|
||
|
||
|
||
;
|
||
; FUNCTION GetNewWindow(windowID: INTEGER; wStorage: Ptr; behind: windowPtr):windowPtr;
|
||
;
|
||
; GetNewWindow allocates a new window using the parameters contained
|
||
; in the "WIND" resource specified by the windowID
|
||
;
|
||
|
||
result EQU 18 ; parameter equates
|
||
winID EQU 16
|
||
wStor EQU 12
|
||
behind EQU 8
|
||
|
||
VisState EQU -1 ; flag for resource's vis state <C314/31Oct86> DAF
|
||
Align EQU -2 ; another byte to re-align stack frame <C666/22Jan87> DAF
|
||
IsACPort EQU -4 ; flag for color port
|
||
|
||
GetNewCWindow LINK A6,#IsACPort ; build stack frame <C106 EHB>
|
||
MOVE #-1,IsACPort(A6) ; flag the color port <C106 EHB>
|
||
BRA.S GNWShare ; =>dive into common code <C106 EHB>
|
||
|
||
GetNewWindow LINK A6,#IsACPort ; build stack frame
|
||
CLR IsACPort(A6) ; flag black and white port <C106 EHB>
|
||
GNWShare MOVE.L A3,-(SP) ; preserve a work register
|
||
CLR.L result(A6) ; set result to NIL
|
||
|
||
SUBQ #4,SP ; make space for result
|
||
MOVE.L #'WIND',-(SP) ; push resource class "WIND"
|
||
MOVE.W winID(A6),-(SP) ; push window ID
|
||
|
||
;;;; _GetResource ; get the resource
|
||
;Roll in patchGetResource from WindowMgrPatches <SM2> <PN>
|
||
MOVEM.L D7/A3/A4/A6, -(SP) ; Save some regs for temps <SM2> <PN>
|
||
MOVEA.L A7, A6 ; Save the current stack pointer <SM2> <PN>
|
||
SUBQ.L #$4, A7 ; Make some space for return value from GetResource <SM2> <PN>
|
||
MOVE.L 18(A6), -(SP) ; Re-push the arguments <SM2> <PN>
|
||
MOVE.W 16(A6), -(SP)
|
||
_GetResource
|
||
MOVEA.L (SP), A3 ; Save the Handle in a temp <SM2> <PN>
|
||
TST.L (SP)+ ; check the return value <SM2> <PN>
|
||
BEQ leavePatch ; If the Handle is NULL, run away <SM2> <PN> <SM4> CSS
|
||
MOVEA.L (A3), A4 ; Store the pointer in another temp <SM2> <PN>
|
||
CMPI.W #$7FFC, (A4) ; Check if this template has already been fixed <SM2> <PN>
|
||
BEQ leavePatch ; If it has then return it undisturbed. <SM2> <PN> <SM4> CSS
|
||
|
||
; Check the size of the dialog
|
||
|
||
MOVEA.L A3, A0 ; Get Ready for a call to GetHandleSize <SM2> <PN>
|
||
_GetHandleSize ; put handle size in D0 for size check of template <SM2> <PN>
|
||
MOVE.L D0, D7 ; Save the value for later <SM2> <PN>
|
||
CMP.L #'ALRT', 18(A6) ; if its an alert,..<SM2> <PN>
|
||
BNE.S checkDLOG
|
||
SUB.L #$C, D0 ; ... subtract the old alert size from the handle size <SM2> <PN>
|
||
BRA.S checkSize ; <SM2> <PN>
|
||
checkDLOG MOVEQ.L #0, D1
|
||
CMP.L #'DLOG', 18(A6) ; if its a dialog,..<SM2> <PN>
|
||
BNE.S doWIND ; <SM2> <PN>
|
||
SUB.L #$15, D0 ; ... subrtact out the old DLOG size (0x14) plus length byte <SM2> <PN>
|
||
MOVE.B $0014(A4), D1 ; get the length of a dialog's title <SM2> <PN>
|
||
BRA.S subtractString
|
||
doWIND SUB.L #$13, D0 ; it must be a WIND so subtract out WIND size (0x12) plus length byte <SM2> <PN>
|
||
MOVE.B $0012(A4), D1 ; get the length of a window's title <SM2> <PN>
|
||
subtractString SUB.L D1, D0 ; subtract the title length from the handle size <SM2> <PN>
|
||
checkSize CMPI #2, D0 ; If the template is old, D0 will be 0, If it is new,... <SM2> <PN>
|
||
BLT.S leavePatch ; ...it will be 2 (or more if an app is monkeying with the new template) <SM2> <PN>
|
||
SUB.L D0, D7 ; subract the size of the extra stuff from the length of the template <SM2> <PN>
|
||
BTST #0, D7 ; If this value is odd, it means that the string was of <SM2> <PN>
|
||
BEQ.S addToAddr ; such a size as to require a byte filler for alignment <SM2> <PN>
|
||
ADDQ.L #1, D7 ; so we add one to D7 to allow for this <SM2> <PN>
|
||
addToAddr ADDA.L D7, A4 ; Advance the pointer to where the positioning word should be (will be even) <SM2> <PN>
|
||
MOVE.W (A4), D1 ; move the position word into D1 (D1's upper word is already zeroed) <SM2> <PN>
|
||
ANDI.W #$7FF, D1 ; get the position word's lower 11 bits. <SM2> <PN>
|
||
MOVEQ #$A, D0 ; move the signature into D0 <SM2> <PN>
|
||
CMP.W D0, D1 ; compare the signature to the lower 11 bits of positioning data <SM2> <PN>
|
||
BNE.S leavePatch ; If they are not zero, this is someone's old-style, non-standard template. <SM2> <PN>
|
||
|
||
; We've decided that this is a good, automatically-positioned template.
|
||
; Now we're going to doctor it for NameAndPositionWindow.
|
||
|
||
MOVEA.L (A3), A0 ; Get a pointer to the template data. <SM2> <PN>
|
||
|
||
MOVE.W (A0), D0 ; put height into template.bounds.bottom <SM2> <PN>
|
||
SUB.W D0, 4(A0) ; <SM2> <PN>
|
||
|
||
MOVE.W 2(A0), D0 ; put width into template.bounds.right <SM2> <PN>
|
||
SUB.W D0, 6(A0) ; <SM2> <PN>
|
||
|
||
MOVE.W #$7FFC, (A0) ; Move "Magic Cookie" into template.bounds.top <SM2> <PN>
|
||
MOVE.W (A4), 2(A0) ; Move position information into template.bounds.left <SM2> <PN>
|
||
|
||
leavePatch MOVE.L A3, 22(A6) ; return the handle to the (possibly doctored) template <SM2> <PN>
|
||
MOVEM.L (SP)+, D7/A3/A4/A6 ; restore temps <SM2> <PN>
|
||
ADDQ.L #6, SP ; Adjust stackpointer <SM2> <PN>
|
||
; end roll in <SM2> <PN>
|
||
|
||
MOVE.L (SP)+,A3 ; keep handle in A3
|
||
MOVE.L A3,D0 ; did we get one?
|
||
BEQ NoGetNew1 ; if not, don't allocate one
|
||
|
||
MOVE.L (A3),A0 ; keep pointer in A0
|
||
;
|
||
; OK, we got the parameter block so call NewWindow to allocate the window
|
||
;
|
||
SUBQ #4,SP ; make space for result
|
||
MOVE.L wStor(A6),-(SP) ; push wStorage
|
||
MOVE.L A0,-(SP) ; push pointer to boundsRect
|
||
PEA 18(A0) ; push pointer to title
|
||
|
||
MOVE.B 10(A0),VisState(A6) ; keep original vis state <A353/05Nov86> DAF
|
||
CLR.W -(SP) ; push vis FALSE <A353/05Nov86> DAF
|
||
MOVE.W 8(A0),-(SP) ; push procID <A353/05Nov86> DAF
|
||
MOVE.L behind(A6),-(SP) ; push "behind"
|
||
MOVE.W 12(A0),-(SP) ; push GoAway flag
|
||
MOVE.L 14(A0),-(SP) ; push the refCon
|
||
|
||
MOVEA.L A3,A0 ; handle <C169>
|
||
_HLock ; trash D0 <C169>
|
||
|
||
TST IsACPort(A6) ; is it a color port? <C106 EHB>
|
||
BEQ.S BWWin ; =>no, do it the old way <C106 EHB>
|
||
_NewCWindow ; allocate a color window <C106 EHB>
|
||
|
||
;------ start of 10Nov89 addition by KON ---------------------
|
||
clr.l -(sp) ; make room for palette handle <erich>
|
||
move winID(a6),-(SP) ; push window ID <erich>
|
||
_GetNewPalette ; fetchez la palette <erich>
|
||
move.l (sp)+,d0 ; well? <erich>
|
||
|
||
Beq.S NoWindowPltt ; sorry, no automatic palette today AWC.PB459
|
||
Move.L D0,A0 ; get the palette AWC.PB459
|
||
Move.L (A0),A0 ; dereference it AWC.PB459
|
||
Move PmPrivate(A0),D1 ; grab the update bits AWC.PB459
|
||
Lsr #1,D1 ; put them in position AWC.PB459
|
||
BSet #NNewBit,D1 ; use the new CUpdates format AWC.PB459
|
||
BSet #DisposeBit,PmPrivate(A0) ; set for automatic disposal AWC.PB459
|
||
|
||
move.l (sp),-(sp) ; push the window <erich>
|
||
move.l d0,-(sp) ; push the palette <erich>
|
||
move D1,-(sp) ; push cUpdates AWC.PB459
|
||
_SetPalette ; <erich>
|
||
|
||
NoWindowPltt ; AWC.PB459
|
||
;------ end of10Nov89 addition by KON ---------------------
|
||
|
||
BRA.S GetWDone ; window ptr on top of stack
|
||
|
||
BWWin _NewWindow ; allocate a regular window
|
||
|
||
GetWDone MOVE.L (SP)+,result(A6) ; update function result
|
||
|
||
; removed _ReleaseResource <C491/08Dec86> DAF
|
||
MOVE.L A3,A0 ; get WIND handle <C645/15Jan87>
|
||
_HUnlock ; unlock the handle <C645/15Jan87>
|
||
_HPurge ; and make it purgeable <C645/15Jan87>
|
||
|
||
GetWCTB ; get the auxilliary color table, if present
|
||
SUBQ #4,SP ; make space for result
|
||
MOVE.L #'wctb',-(SP) ; push resType (Window Color TaBle) <C214/17Oct86> DAF
|
||
MOVE.W winID(A6),-(SP) ; WCTB's resID is the same as window's
|
||
_GetResource ; get the resource
|
||
MOVE.L (SP)+,D0 ; get the resHandle
|
||
BEQ.S ShowIt ; no res present, so continue
|
||
|
||
MOVE.L result(A6),-(SP) ; push windowPtr (from result field) for upcoming SetWinColor <C678/23Jan87> DAF
|
||
MOVE.L D0,-(SP) ; push cTabHndl from resource <C491/08Dec86> DAF
|
||
_SetWinColor ; set it
|
||
ShowIt
|
||
TST.B VisState(A6) ; was the window supposed to be visible?<C314/31Oct86> DAF
|
||
BEQ.S @1 ; no, so skip <C314/31Oct86> DAF
|
||
MOVE.L result(A6),-(SP) ; push windowPtr <C491/08Dec86> DAF
|
||
CMP.L #-1,behind(A6) ; if = -1 then do SelectWindow to post activate events <C575/30Dec86> DAF
|
||
BEQ.S @0 ; <C575/30Dec86> DAF
|
||
MOVE.B #1,-(SP) ; set visible true <C491/08Dec86> DAF
|
||
_ShowHide ; show it <C314/31Oct86> DAF
|
||
BRA.S @1 ; and continue <C575/30Dec86> DAF
|
||
@0 _ShowWindow ; make it the highlighted front window <C575/30Dec86> DAF
|
||
@1
|
||
|
||
NoGetNew1
|
||
MOVE.L (SP)+,A3 ; restore work register
|
||
UNLK A6 ; unbuild stack frame
|
||
MOVE.L (SP)+,A0 ; get return address
|
||
ADD #10,SP ; strip parameters
|
||
JMP (A0) ; return to caller
|
||
|
||
;
|
||
; FUNCTION GetNewControl(controlID: INTEGER; owner: windowPtr): ControlHandle;
|
||
;
|
||
; GetNewcontrol allocates a new control using the parameters contained
|
||
; in the "CTRL" resource specified by the controlID. It associates
|
||
; the control with the owning window that is specified as a parameter.
|
||
;
|
||
GetNewControl
|
||
|
||
VizState EQU -2 ; control's vis state here <24Apr87> DAF <C862>
|
||
GNCLinkSz EQU VizState ; stack frame size
|
||
|
||
LINK A6,#GNCLinkSz ;build stack frame <C460/24Nov86> DAF
|
||
MOVE.L A3,-(SP) ;preserve a work register
|
||
CLR.L 14(A6) ;return NIL
|
||
|
||
SUBQ #4,SP ;make space for result
|
||
MOVE.L #'CNTL',-(SP) ;push resource class "CNTL"
|
||
MOVE.W 12(A6),-(SP) ;push control ID
|
||
_GetResource ;get the resource
|
||
|
||
MOVE.L (SP)+,A3 ;keep handle in A3
|
||
MOVE.L A3,D0 ;did we get one?
|
||
BEQ.S NoNew2 ;if not, don't allocate
|
||
|
||
MOVE.L (A3),A0 ;keep pointer in A0
|
||
;
|
||
; OK, we got the parameter block so call NewControl to allocate the control
|
||
;
|
||
SUBQ #4,SP ;make space for result
|
||
MOVE.L 8(A6),-(SP) ;push owning window
|
||
MOVE.L A0,-(SP) ;push pointer to boundsRect
|
||
PEA 22(A0) ;push ptr to title
|
||
|
||
LEA 8(A0),A1 ;get pointer to params
|
||
|
||
MOVE.B 2(A1),VizState(A6) ;get visFlag boolean <C491/08Dec86> DAF
|
||
CLR.B -(SP) ;push vis FALSE <C491/08Dec86> DAF
|
||
MOVE.W (A1),-(SP) ;push ctlValue <C491/08Dec86> DAF
|
||
ADDQ #4,A1 ;move to next field <C491/08Dec86> DAF
|
||
MOVE.L (A1)+,-(SP) ;push min,max
|
||
MOVE.W (A1)+,-(SP) ;push procID
|
||
MOVE.L (A1)+,-(SP) ;push refCon
|
||
|
||
MOVEA.L A3,A0 ; handle <C169>
|
||
_HLock ; <C169>
|
||
|
||
_NewControl ;allocate the control
|
||
|
||
MOVE.L (SP)+,14(A6) ;update function result
|
||
|
||
; removed _ReleaseResource <C491/08Dec86> DAF
|
||
|
||
MOVE.L A3,A0 ; get CNTL handle <C645/15Jan87>
|
||
_HUnlock ; unlock the handle <C645/15Jan87>
|
||
_HPurge ; and make it purgeable <C645/15Jan87>
|
||
|
||
GetCCTB ; get the auxilliary color table, if present
|
||
SUBQ #4,SP ; make space for result
|
||
MOVE.L #'cctb',-(SP) ; push resType (Control Color TaBle) <C241/17Oct86> DAF
|
||
MOVE.W 12(A6),-(SP) ; CCTB's resID is the same as controls's <C460/24Nov86> DAF
|
||
_GetResource ; get the resource
|
||
MOVE.L (SP)+,D0 ; get the resHandle
|
||
BEQ.S CtlViz ; no res present, so continue
|
||
MOVE.L 14(A6),-(SP) ; push controlHandle (from result field) <C460/24Nov86> DAF
|
||
MOVE.L D0,-(SP) ; push cTabHndl from resource
|
||
_SetCtlColor ; set it
|
||
CtlViz
|
||
TST.B VizState(A6) ; was it visible? <C460/24Nov86> DAF
|
||
BEQ.S @1 ; no, so skip <C460/24Nov86> DAF
|
||
MOVE.L 14(A6),-(SP) ; push control handle <C491/08Dec86> DAF
|
||
_ShowControl ; <C460/24Nov86> DAF
|
||
@1
|
||
|
||
NoNew2
|
||
|
||
MOVE.L (SP)+,A3 ;restore work register
|
||
UNLK A6 ;unbuild stack frame
|
||
MOVE.L (SP)+,A0 ;get return address
|
||
ADDQ #6,SP ;strip parameters
|
||
JMP (A0) ;return to caller
|
||
|
||
|
||
;
|
||
; FUNCTION GetMenu(menuID): menuHandle
|
||
;
|
||
; GetMenu returns a menuHandle given a menuID. If the menu cannot be loaded,
|
||
; it returns a NIL handle.
|
||
|
||
; Unlike GetNewWindow and
|
||
; GetNewControl, which allocate things, GetMenu is a "pure" resource
|
||
; in that it only allocates the handle the first time its called; subsequent
|
||
; calls will return the same handle.
|
||
|
||
; At great expense, this routine now check to see if it being called for a menu that
|
||
; has already been loaded.
|
||
|
||
; If the MENU is not found, return a NIL handle
|
||
;
|
||
; Try to load a menu color table ('mctb') with the same ID and if so add its entries <FJL C408/C417>
|
||
; to the grand menu color table. <FJL C408/C417>
|
||
|
||
GetMenu
|
||
LINK A6,#0 ; build stack frame
|
||
MOVE.L A3,-(SP) ; preserve work registers
|
||
|
||
MOVE.W ResLoad,-(SP) ; save resLoad on stack <EHB 15-Apr-85>
|
||
|
||
MOVEQ #0,D0 ; set resLoad False <EHB 15-Apr-85>
|
||
BSR DoTheGet ; is the resource loaded yet? <EHB 15-Apr-85>
|
||
BEQ GetMDone ; => couldn't find it, punt <EHB 15-Apr-85>
|
||
|
||
MOVE.L (A3),D0 ; is handle currently loaded? <EHB 18-Apr-85>
|
||
BEQ.S LoadMenu ; => no, load it in <EHB 18-Apr-85>
|
||
|
||
; now check for menu that was preloaded, but hasn't been initialized yet <EHB 29-Apr-85>
|
||
|
||
CLR.L -(SP) ; make room for VAR theType
|
||
MOVE.L (A3),A0 ; get menu pointer
|
||
MOVE.L MenuDefHandle(A0),-(SP) ; assume it has a handle to an 'MDEF'
|
||
CLR.L -(SP) ; pass it a wildcard ID
|
||
PEA 8(SP) ; point to VAR theType
|
||
CLR.L -(SP) ; pass it a wildcard name
|
||
MOVE.W #MapTRUE,ROMMapInsert ; link in the rom map <1.3><Cxxx FJL 22jan87>
|
||
_GetResInfo
|
||
MOVE.L (SP)+,D0 ; get the returned type
|
||
CMP.L #'MDEF',D0 ; was it 'MDEF'?
|
||
BEQ.S GetMDone ; => yes, menuDef already loaded
|
||
BRA.S LoadMDEF ; => else go load 'MDEF'
|
||
|
||
; load the menu for the first (and final) time
|
||
|
||
LoadMenu
|
||
MOVEQ #1,D0 ; set resLoad True <EHB 15-Apr-85>
|
||
BSR.S DoTheGet ; load resource (handle in A3) <EHB 15-Apr-85>
|
||
BEQ.S GetMDone ; => couldn't load it, punt <EHB 15-Apr-85>
|
||
|
||
; all right, we have a virgin menu. Now we have to install a menuDefHandle <EHB 29-Apr-85>
|
||
|
||
LoadMDEF
|
||
SUBQ #4,SP ; make room for function result
|
||
MOVE.L #'MDEF',-(SP) ; push the resource class "MDEF"
|
||
MOVE.L (A3),A0 ; get ptr to menu
|
||
MOVE.W MenuDefHandle(A0),-(SP) ; push definition proc ID
|
||
MOVE.W #MapTRUE,ROMMapInsert ; get the MDEF from the ROM map <EHB 10 Jul 85>
|
||
_GetResource ; get it!
|
||
|
||
MOVE.L (A3),A0 ; get pointer to menu
|
||
MOVE.L (SP)+,MenuDefHandle(A0) ; install the defProc handle (which may be NIL)
|
||
|
||
MOVE.L A3,-(SP) ; push the menu handle
|
||
_CalcMenuSize ; calculate the size of the menu
|
||
|
||
;
|
||
; Now try to load a menu color table with the same ID as the menu's <FJL C408/C417>
|
||
;
|
||
move.b #1, -(sp) ; force Resource Load to true
|
||
_SetResLoad
|
||
|
||
subq #4, sp ; make room for the result
|
||
move.l #'mctb', -(sp) ; push resource type
|
||
move.w 8(a6), -(sp) ; push menuID
|
||
_GetResource ; get the resource
|
||
move.l (sp)+, a3 ; get the handle and save it in a3
|
||
move.l a3, d0 ; set z-flag
|
||
beq.s GetMDone ; handle is nil, so no color table
|
||
|
||
move.l a3, a0 ; get current state of resource <FJL C702>
|
||
_HGetState
|
||
move.b d0, -(sp) ; store state on the stack
|
||
_HLock ; lock it down temporarily
|
||
|
||
move.l (a3), a0 ; get ptr to resource
|
||
move (a0), -(sp) ; push number of table entries
|
||
addq #2, a0 ; move past number of entries
|
||
move.l a0, -(sp) ; push base address of table
|
||
_SetMCEntries ; call trap
|
||
|
||
move.l a3, a0 ; put handle in a0 <FJL C702>
|
||
move.b (sp)+, d0 ; get previous state in d0
|
||
_HSetState ; set previous state
|
||
|
||
GetMDone
|
||
_SetResLoad ; old state on stack <EHB 15-Apr-85>
|
||
|
||
MOVE.L (SP)+,A3 ; restore work register
|
||
UNLK A6 ; unbuild stack frame
|
||
MOVE.L (SP)+,A0 ; get return address
|
||
ADDQ #2,SP ; strip parameters
|
||
JMP (A0) ; return to caller
|
||
;
|
||
; Utility DoTheGet
|
||
;
|
||
; DoTheGet loads the specified menu ID if ResLoad is TRUE.
|
||
; The desired state of ResLoad is in D0.
|
||
|
||
DoTheGet ; <EHB 15-Apr-85>
|
||
MOVE.B D0,-(SP) ; push resLoad state
|
||
_SetResLoad
|
||
|
||
SUBQ #4,SP ; make space for result
|
||
MOVE.L #'MENU',-(SP) ; push resource type "MENU"
|
||
MOVE.W 8(A6),-(SP) ; push menu ID
|
||
_GetResource ; get the resource
|
||
MOVE.L (SP)+,A3 ; keep it in a register
|
||
MOVE.L A3,10(A6) ; also return it as the result
|
||
RTS ; EQ if resource not found
|
||
|
||
;
|
||
; FUNCTION GetNewMBar(menuBarID: INTEGER): MBarHandle;
|
||
;
|
||
; GetNewMBar returns a menuBarHandle given a menuBarID.
|
||
;
|
||
GetNewMBar
|
||
LINK A6,#0 ;set up a stack frame
|
||
MOVEM.L D3/A3,-(SP) ;save some work registers
|
||
CLR.L 10(A6) ;return NIL as default
|
||
|
||
SUBQ #4,SP ;make room for result
|
||
_GetMenuBar ;remember the current menuBar
|
||
_ClearMenuBar ;NIL out the current menuBar
|
||
|
||
SUBQ #4,SP ;make room for result
|
||
MOVE.L #'MBAR',-(SP) ;push the resource type
|
||
MOVE.W 8(A6),-(SP) ;push the parameter
|
||
_GetResource ;get the mBar definition
|
||
MOVE.L (SP)+,A3 ;keep it in A3
|
||
|
||
MOVE.L A3,D0 ;got it?
|
||
BEQ.S DoneGetMBar ;if not, skip
|
||
|
||
MOVEQ #0,D3 ;start with menu index 0
|
||
|
||
; loop, getting and inserting one menu at a time
|
||
|
||
GetMBLoop
|
||
SUBQ #4,SP ;make room for result
|
||
MOVE.L (A3),A0 ;get pointer to mBarDef
|
||
MOVE D3,D0 ;copy current index
|
||
ADD D0,D0 ;double for word index
|
||
MOVE.W 2(A0,D0),-(SP) ;push menu ID
|
||
_GetRMenu ;get the menu <FJL C417>
|
||
|
||
CLR.W -(SP) ;insert at end of menuBar
|
||
_InsertMenu
|
||
|
||
MOVE.L (A3),A0 ;get ptr to mBarDef
|
||
ADDQ #1,D3 ;bump to next menu
|
||
CMP (A0),D3 ;done yet
|
||
BLT.S GetMBLoop ;loop until done
|
||
|
||
; we successfully read in the whole menuBar so return the current menuBar as
|
||
; the result
|
||
|
||
SUBQ #4,SP ;make room
|
||
_GetMenuBar ;get new menuBar
|
||
MOVE.L (SP)+,10(A6) ;return it as the result
|
||
|
||
; removed _ReleaseResource <C491/08Dec86> DAF
|
||
|
||
; all done so restore the original menu bar
|
||
|
||
DoneGetMBar
|
||
MOVE.L (SP),-(SP) ;copy the menuBar handle
|
||
_SetMenuBar ;restore original menu bar
|
||
|
||
MOVE.L (SP)+,A0 ;get handle
|
||
_DisposHandle ;de-allocate it
|
||
|
||
; restore registers and return
|
||
|
||
MOVEM.L (SP)+,D3/A3 ;restore registers
|
||
UNLK A6 ;unbuild stack frame
|
||
MOVE.L (SP)+,A0 ;get return address
|
||
ADDQ #2,SP ;strip parameter
|
||
JMP (A0) ;return to caller
|
||
|
||
GetMgrEnd
|
||
END
|
||
|
||
|