mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-26 01:49:19 +00:00
623 lines
22 KiB
Plaintext
623 lines
22 KiB
Plaintext
|
;
|
||
|
; File: DisplayMgr.a
|
||
|
;
|
||
|
; Contains: Display Manager Assembly Sources
|
||
|
;
|
||
|
; Written by: Ian Hendry
|
||
|
;
|
||
|
; Copyright: © 1993 by Apple Computer, Inc., all rights reserved.
|
||
|
;
|
||
|
; Change History (most recent first):
|
||
|
;
|
||
|
; <12> 11/5/93 IH Sync with Excelsior.
|
||
|
; <SM11> 10/10/93 IH Sync with Excelsior.
|
||
|
; <10> 9/10/93 IH Fix cursor bug in horror ROMs and SuperMario.
|
||
|
; <9> 8/16/93 IH #1099391 <KON>: Sync w/Reality. Fix support for apple event
|
||
|
; notification to procs ptrs.
|
||
|
; <SM8> 08-06-93 jmp Added more entries to the ROMTimingTables.
|
||
|
; <7> 8/4/93 IH #1101633,1098397,1101795,1101636,1102280 <KON>: Make
|
||
|
; DMGetROMMultiModeTable a trap (rather than a function call). Add
|
||
|
; private trap to begin configuring displays. Add Trap for
|
||
|
; animation. Temporarily set 2nd gestalt bit so Monitors CP can
|
||
|
; detect that calls take displayState (instead of "updateNow").
|
||
|
; <6> 6/22/93 IH Remove Debugger call.
|
||
|
; <5> 6/1/93 IH Add new calls for A1 feature complete
|
||
|
; <4> 5/28/93 IH #1081805,1086363: Fix App quickdraw globals to update screenBits
|
||
|
; bitmap (Finder uses this information to determine if an icon is
|
||
|
; off screen).
|
||
|
; <3> 4/8/93 IH Add support for mode switching.
|
||
|
; <2> 3/31/93 IH Clean up for SuperMario
|
||
|
; <1> 3/25/93 IH first checked in
|
||
|
; <9> 3/24/93 IH Support changing menu bar. Add RecalcMenuBar which calls
|
||
|
; _CalcMenuBar and if it gets a paramErr (selector not installed
|
||
|
; returns paramErr) then it tries to call the MBDF directly. In
|
||
|
; future systems When I am sure the trap is installed I can
|
||
|
; conditionalize the direct call to the MBDF to INITVERSION only.
|
||
|
; <8> 3/17/93 IH Adding patch to InitWindows to set up port. This is what
|
||
|
; LayerManager does to install DeskPort. What happens if
|
||
|
; InitWindows is called at init time? If portlist is cleared, this
|
||
|
; port will not get updated correctly when depths change etc.
|
||
|
; <7> 3/11/93 mgl Display Manager is now successfully installing its Gestalt
|
||
|
; selectors again, so I will reenable the call to SysError that I
|
||
|
; commented out earlier.
|
||
|
; <6> 3/10/93 JDR After checking in my fix <4> it occurred to me that the Gestalt
|
||
|
; proc should have been an LeaResident.
|
||
|
; <5> 3/10/93 mgl Gestalt was failing because the Gestalt proc was not in the
|
||
|
; System heap. Comment out the call to SysError until this is
|
||
|
; fixed.
|
||
|
; <4> 3/9/93 JDR Fixed the system build. Moved DMGestaltProc being imported to be
|
||
|
; outside of the for INITVERSION conditional.
|
||
|
; <3> 3/5/93 IH Add desk patches and gestalt procs
|
||
|
; <2> 2/25/93 IH Added new desktop routine dispatchers and added routine to draw
|
||
|
; desktop the old way.
|
||
|
; <1> 2/23/93 IH first checked in
|
||
|
;
|
||
|
;
|
||
|
|
||
|
|
||
|
LOAD 'StandardEqu.d'
|
||
|
INCLUDE 'InternalMacros.a'
|
||
|
INCLUDE 'GestaltEqu.a'
|
||
|
INCLUDE 'Video.a'
|
||
|
INCLUDE 'LinkedPatchMacros.a'
|
||
|
INCLUDE 'Displays.a'
|
||
|
INCLUDE 'DisplaysPriv.a'
|
||
|
INCLUDE 'MenuMgrPriv.a'
|
||
|
|
||
|
INCLUDE 'HardwarePrivateEqu.a'
|
||
|
INCLUDE 'DepVideoEqu.a'
|
||
|
INCLUDE 'TrapsPrivate.a'
|
||
|
|
||
|
;---------------------------------------------------------------------------------------
|
||
|
; Dispatcher for the Display Manager routines
|
||
|
;---------------------------------------------------------------------------------------
|
||
|
|
||
|
CASE OFF ; dispatch routines are Pascal
|
||
|
ROMs Plus,SE,II,Portable,IIci,SuperMario
|
||
|
|
||
|
DisplayDispatch BeginDispatcher _DisplayDispatch
|
||
|
DispatchSelectors DM_SetDisplayID = selectSetDisplayID
|
||
|
DispatchSelectors DM_RegisterExtendedNotifyProc = selectRegisterExtendedNotification
|
||
|
DispatchSelectors DM_MoveCursor = selectDMMoveCursor
|
||
|
DispatchSelectors DM_RemoveCurrentProcessProcs = selectRemoveCurrentProcessProcs
|
||
|
DispatchSelectors DM_PrivateBeginConfigureDisplays = selectPrivateBeginConfigureDisplays
|
||
|
DispatchSelectors DM_GetBestDepthModeInfo = selectGetBestDepthModeInfo
|
||
|
DispatchSelectors DM_GiveDeskTime = selectGiveDeskTime
|
||
|
DispatchSelectors DM_GetROMMultiModeTable = selectGetROMMultiModeTable
|
||
|
DispatchSelectors DM_DeskClick = selectDeskClick
|
||
|
DispatchSelectors DM_ChangedDesktopIconRgn = selectChangedDesktopIconRgn
|
||
|
DispatchSelectors DM_SetAnimateProcess = selectSetAnimateProcess
|
||
|
DispatchSelectors DM_NotifyAllProcesses = selectNotifyAllProcesses
|
||
|
DispatchSelectors DM_KeepWindowOnscreen = selectKeepWindowOnscreen
|
||
|
DispatchSelectors DM_GetDesktopIconRgn = selectGetDesktopIconRgn
|
||
|
DispatchSelectors DM_SetDesktopIconRgn = selectSetDesktopIconRgn
|
||
|
DispatchSelectors DM_KillDisplayManager = selectKillDisplayManager
|
||
|
DispatchSelectors DM_InitDisplayManager = selectInitDisplayManager
|
||
|
DispatchSelectors DM_InstallDisplayManager = selectInstallDisplayManager
|
||
|
|
||
|
DispatchSelectors DM_GetFirstScreenDevice = selectGetFirstScreenDevice
|
||
|
DispatchSelectors DM_GetNextScreenDevice = selectGetNextScreenDevice
|
||
|
|
||
|
DispatchSelectors DM_DrawDesktopRect = selectDrawDesktopRect
|
||
|
DispatchSelectors DM_DrawDesktopRegion = selectDrawDesktopRgn
|
||
|
|
||
|
DispatchSelectors DM_GetGDeviceTablecloth = selectGetGDeviceTablecloth
|
||
|
DispatchSelectors DM_SetGDeviceTablecloth = selectSetGDeviceTablecloth
|
||
|
|
||
|
DispatchSelectors DM_BeginConfigureDisplays = selectBeginConfigureDisplays
|
||
|
DispatchSelectors DM_EndConfigureDisplays = selectEndConfigureDisplays
|
||
|
|
||
|
DispatchSelectors DM_AddDisplay = selectAddDisplay
|
||
|
DispatchSelectors DM_MoveDisplay = selectMoveDisplay
|
||
|
DispatchSelectors DM_DisableDisplay = selectDisableDisplay
|
||
|
DispatchSelectors DM_EnableDisplay = selectEnableDisplay
|
||
|
DispatchSelectors DM_RemoveDisplay = selectRemoveDisplay
|
||
|
|
||
|
DispatchSelectors DM_GetComponentAnimateTicks = selectGetComponentAnimateTicks
|
||
|
DispatchSelectors DM_SetComponentAnimateTicks = selectSetComponentAnimateTicks
|
||
|
DispatchSelectors DM_GetNextAnimateTime = selectGetNextAnimateTime
|
||
|
|
||
|
DispatchSelectors DM_SetMainDisplay = selectSetMainDisplay
|
||
|
DispatchSelectors DM_SetDisplayMode = selectSetDisplayMode
|
||
|
DispatchSelectors DM_CheckDisplayMode = selectCheckDisplayMode
|
||
|
|
||
|
DispatchSelectors DM_GetDeskRegion = selectGetDeskRegion
|
||
|
DispatchSelectors DM_RegisterNotifyProc = selectRegisterNotifyProc
|
||
|
DispatchSelectors DM_RemoveNotifyProc = selectRemoveNotifyProc
|
||
|
|
||
|
DispatchSelectors DM_QDIsMirroringCapable = selectQDIsMirroringCapable
|
||
|
DispatchSelectors DM_CanMirrorNow = selectCanMirrorNow
|
||
|
DispatchSelectors DM_IsMirroringOn = selectIsMirroringOn
|
||
|
DispatchSelectors DM_MirrorDevices = selectMirrorDevices
|
||
|
DispatchSelectors DM_UnmirrorDevice = selectUnmirrorDevice
|
||
|
DispatchSelectors DM_GetNextMirroredDevice = selectGetNextMirroredDevice
|
||
|
DispatchSelectors DM_BlockMirroring = selectBlockMirroring
|
||
|
DispatchSelectors DM_UnblockMirroring = selectUnblockMirroring
|
||
|
|
||
|
DispatchSelectors DM_GetDisplayMgrA5World = selectGetDisplayMgrA5World
|
||
|
|
||
|
DispatchSelectors DM_GetDisplayIDByGDevice = selectGetDisplayIDByGDevice
|
||
|
DispatchSelectors DM_GetGDeviceByDisplayID = selectGetGDeviceByDisplayID
|
||
|
|
||
|
DispatchSelectors DM_SetDisplayComponent = selectSetDisplayComponent
|
||
|
DispatchSelectors DM_GetDisplayComponent = selectGetDisplayComponent
|
||
|
|
||
|
DispatchSelectors DM_NewDisplay = selectNewDisplay
|
||
|
DispatchSelectors DM_DisposeDisplay = selectDisposeDisplay
|
||
|
|
||
|
EndDispatcher
|
||
|
|
||
|
CASE OBJECT ; back to C conventions
|
||
|
|
||
|
;---------------------------------------------------------------------------------------
|
||
|
;DisplayMgrInstall
|
||
|
; Install the Display Manager when the linked patch gets run - this is done for the
|
||
|
; INIT version as well as for the system version of the Display Manager
|
||
|
;
|
||
|
DisplayMgrInstall InstallProc
|
||
|
IMPORT DM__GestaltProc : CODE
|
||
|
|
||
|
Tst.b $172 ; mouse down?
|
||
|
Bge.s @skipDebugger ; If so then do not install
|
||
|
Nop
|
||
|
; _Debugger
|
||
|
@skipDebugger
|
||
|
|
||
|
subq.l #2,sp ; make room for result
|
||
|
_DMInstallDisplayManager ; install ourselves
|
||
|
move.w (sp)+,d0 ; get result
|
||
|
Beq.s @DidInstall
|
||
|
|
||
|
Moveq #dsMemFullErr,D0
|
||
|
_SysError
|
||
|
|
||
|
@DidInstall Rts ; all done.
|
||
|
ENDPROC ; DisplayMgrInstall
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
;---------------------------------------------------------------------------------------
|
||
|
; Patches needed until Display Manager is part of a ROM or part of gibbly
|
||
|
;---------------------------------------------------------------------------------------
|
||
|
; IF ForROM THEN
|
||
|
; ENDIF
|
||
|
|
||
|
|
||
|
IF (&TYPE('INITVERSION') <> 'UNDEFINED') THEN
|
||
|
; pascal void InitMenus(void)
|
||
|
; Initialized drawing port. This is what Layer Manager does to install DeskPort.
|
||
|
; What happens if InitWindows is called at init time? If portlist is cleared after
|
||
|
; INIT time, then this port will not get updated when the depth changes (base address changes)
|
||
|
;
|
||
|
; In WindowMgr.a, InitMenus is called after the window manager port is allocated, but before the
|
||
|
; desktop is drawn. At this time I can open my port and take over drawing the desktop.
|
||
|
; On Machines that I am installed in the ROMs, I should make this call inline and
|
||
|
; call DMDrawDesktopRegion farther down.
|
||
|
;
|
||
|
PatchInitMenus PatchProc _InitMenus,(Plus,SE,II,Portable,IIci,SuperMario)
|
||
|
WITH DMGlobalsRec ; for referencing globals
|
||
|
|
||
|
subq.l #2,sp ; make room for result
|
||
|
_DMInitDisplayManager
|
||
|
move.w (sp)+,d0 ; get result
|
||
|
|
||
|
jmpOld ; Continue
|
||
|
|
||
|
ENDWITH
|
||
|
ENDPROC ;
|
||
|
ENDIF ; INITVERSION
|
||
|
|
||
|
|
||
|
IF (&TYPE('INITVERSION') <> 'UNDEFINED') THEN
|
||
|
;---------------------------------------------------------------------------------------
|
||
|
; pascal void FillRgn(RgnHandle deskRgnToFill,Pattern deskPattern)
|
||
|
; Draw the desktop using the desk pattern. This is when we are asked to
|
||
|
; do the drawing before the Display Manager is initialized (during development)
|
||
|
; and if there is no installed component
|
||
|
;
|
||
|
PatchFillRgn PatchProc _FillRgn,(Plus,SE,II,Portable,IIci,SuperMario)
|
||
|
WITH DMGlobalsRec ; for referencing globals
|
||
|
; InitWindows calls FillRgn or FillCRgn
|
||
|
; until that ROM is overridden, we need to patch FillRgn
|
||
|
;
|
||
|
; FillRgn(rgn, pat);
|
||
|
; 0(A7) Rts
|
||
|
; 4(A7) Pattern
|
||
|
; 8(A7) Region
|
||
|
|
||
|
Tst.b pCDeskPat ; test flag to see which to use
|
||
|
Blt.s @doOld ; if high bit set, then we have a color deskpat
|
||
|
|
||
|
Cmp.l #DeskPattern,4(A7) ; If not the Deskpattern
|
||
|
Bne.s @doOld ; The do the original fill
|
||
|
|
||
|
__GetDMGlobalsPtrInA0 ; Macro to get expandmem globals in A0
|
||
|
Move.l A0,D0 ; Have we been installed?
|
||
|
Beq.s @doOld
|
||
|
|
||
|
Move.b fDeskDrawNest(A0),D0 ; Is this a nested case?
|
||
|
Bne.s @doOld
|
||
|
Add.b #1,fDeskDrawNest(A0) ; Nest one more
|
||
|
|
||
|
Move.l A0,-(A7) ; Save Global Ptr
|
||
|
|
||
|
Subq.w #4,SP
|
||
|
Move.l SP,-(SP)
|
||
|
_GetPort
|
||
|
Move.l (SP)+,A1 ; The port
|
||
|
Move.l (SP),A0 ; Restore globals in A0
|
||
|
|
||
|
Move.l 4+8(A7),-(SP) ; Parameter Rgn
|
||
|
Move.l clipRgn(A1),-(SP) ; Clip is the desk to draw
|
||
|
Move.l fWorkingDeskRectRgn(A0),-(SP)
|
||
|
_SectRgn
|
||
|
Move.l (SP),A0 ; Restore globals in A0
|
||
|
|
||
|
; Is substituting the regions dangerous?
|
||
|
; Are there any wierd patches that look for the
|
||
|
; actual region that they passed? I have not
|
||
|
; see any problems.
|
||
|
|
||
|
Move.l fWorkingDeskRectRgn(A0),-(SP)
|
||
|
_DMDrawDesktopRegion
|
||
|
Move.l (A7)+,A0 ; Pop Global Pointer
|
||
|
Sub.b #1,fDeskDrawNest(A0) ; Nest one less
|
||
|
|
||
|
Move.l (A7)+,A0 ; Get Rts
|
||
|
Addq.w #8,A7 ; Release other bits
|
||
|
Jmp (A0) ; Go Home
|
||
|
|
||
|
@doOld jmpOld ; call the old InitApplication
|
||
|
|
||
|
ENDWITH
|
||
|
ENDPROC ; PatchFillRgn
|
||
|
ENDIF ; INITVERSION
|
||
|
|
||
|
|
||
|
IF (&TYPE('INITVERSION') <> 'UNDEFINED') THEN
|
||
|
;---------------------------------------------------------------------------------------
|
||
|
; pascal void FillCRgn(RgnHandle deskRgnToFill,PixPatHandle deskPattern)
|
||
|
; Draw the desktop using the desk pattern. This is when we are asked to
|
||
|
; do the drawing before the Display Manager is initialized (during development)
|
||
|
; and if there is no installed component
|
||
|
;
|
||
|
PatchFillCRgn PatchProc _FillCRgn,(II,IIci,SuperMario)
|
||
|
WITH DMGlobalsRec ; for referencing globals
|
||
|
; InitWindows calls FillRgn or FillCRgn
|
||
|
; until that ROM is overridden, we need to patch FillRgn
|
||
|
;
|
||
|
; FillCRgn(rgn, pp);
|
||
|
; 0(A7) Rts
|
||
|
; 4(A7) PixPatHandle
|
||
|
; 8(A7) Region
|
||
|
|
||
|
Tst.b pCDeskPat ; test flag to see which to use
|
||
|
Bpl.s @doOld ; if high bit clear, then we do not have a color deskpat
|
||
|
|
||
|
Move.l DeskCPat,D0
|
||
|
Cmp.l 4(A7),D0 ; If not the Deskpattern
|
||
|
Bne.s @doOld ; The do the original fill
|
||
|
|
||
|
; What should I do about the port?
|
||
|
; Should I set the port?
|
||
|
; Should I check the port?
|
||
|
|
||
|
__GetDMGlobalsPtrInA0 ; Macro to get expandmem globals in A0
|
||
|
Move.l A0,D0 ; Have we been installed?
|
||
|
Beq.s @doOld
|
||
|
|
||
|
Move.b fDeskDrawNest(A0),D0 ; Is this a nested case?
|
||
|
Bne.s @doOld
|
||
|
Add.b #1,fDeskDrawNest(A0) ; Nest one more
|
||
|
|
||
|
Move.l A0,-(A7) ; Save Global Ptr
|
||
|
|
||
|
Subq.w #4,SP
|
||
|
Move.l SP,-(SP)
|
||
|
_GetPort
|
||
|
Move.l (SP)+,A1 ; thePort
|
||
|
Move.l (SP),A0 ; Restore globals in A0
|
||
|
|
||
|
Move.l 4+8(A7),-(SP) ; Parameter Rgn
|
||
|
Move.l clipRgn(A1),-(SP) ; Clip is the desk to draw
|
||
|
Move.l fWorkingDeskRectRgn(A0),-(SP)
|
||
|
_SectRgn
|
||
|
Move.l (SP),A0 ; Restore globals in A0
|
||
|
|
||
|
Move.l fWorkingDeskRectRgn(A0),-(SP) ; Clip is the desk to draw
|
||
|
_DMDrawDesktopRegion
|
||
|
|
||
|
Move.l (A7)+,A0 ; Restore Global Pointer
|
||
|
Sub.b #1,fDeskDrawNest(A0) ; Nest one less
|
||
|
|
||
|
Move.l (A7)+,A0 ; Get Rts
|
||
|
Addq.w #8,A7 ; Release other bits
|
||
|
Jmp (A0) ; Go Home
|
||
|
|
||
|
@doOld jmpOld ; call the old InitApplication
|
||
|
|
||
|
ENDWITH
|
||
|
ENDPROC ;
|
||
|
ENDIF ; INITVERSION
|
||
|
|
||
|
;---------------------------------------------------------------------------------------
|
||
|
PatchCleanUpApp PatchProc _CleanupApplication,(Plus,SE,II,Portable,IIci,SuperMario)
|
||
|
|
||
|
Subq #2,A7
|
||
|
_DMRemoveCurrentProcessProcs ; Get rid of any procs tied to this process
|
||
|
Addq #2,A7
|
||
|
|
||
|
@doOld jmpOld ; call the old InitApplication
|
||
|
|
||
|
ENDPROC ;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
;---------------------------------------------------------------------------------------
|
||
|
; Utility Routines
|
||
|
;---------------------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
|
||
|
;---------------------------------------------------------------------------------------
|
||
|
; pascal void DrawDeskPattern(RgnHandle deskRgnToFill)
|
||
|
; Draw the desktop using the desk pattern. This is when we are asked to
|
||
|
; do the drawing before the Display Manager is initialized (during development)
|
||
|
; and if there is no installed component
|
||
|
;
|
||
|
CASE OFF ; Pascal Routine
|
||
|
DrawDeskPattern PROC EXPORT
|
||
|
CASE OBJECT ; back to C conventions
|
||
|
; Do the old fill
|
||
|
Link A6,#0
|
||
|
|
||
|
Tst.b pCDeskPat ; test flag to see which to use <C666/22Jan87> DAF
|
||
|
Bpl.s @noCPat ; if ≥, then use binary pat <C666/22Jan87> DAF
|
||
|
|
||
|
Move.l TheZone,-(A7)
|
||
|
Move.l SysZone,A0 ; use the system heap
|
||
|
_SetZone
|
||
|
|
||
|
; Port is already set up by caller
|
||
|
; Subq.w #4,A7
|
||
|
; Move.l A7,-(A7)
|
||
|
; _GetPort ; Get the port and leave it on the stack
|
||
|
|
||
|
; Subq.w #4,A7
|
||
|
; Move.l A7,-(A7)
|
||
|
; _GetCWMgrPort
|
||
|
; _SetPort
|
||
|
|
||
|
Move.l 8(A6),-(SP) ; PUSH THE update REGION <11/9/86 EHB>
|
||
|
Move.l DeskCPat,-(SP) ; push the desk ppat
|
||
|
_FillCRgn ; and fill
|
||
|
|
||
|
; _SetPort ; Restore the port
|
||
|
|
||
|
Move.l (A7)+,A0 ; Restore the zone
|
||
|
_SetZone
|
||
|
|
||
|
Bra.s @doneDraw
|
||
|
|
||
|
@noCPat Move.l 8(A6),-(SP) ; PUSH THE DESKTOP REGION <11/9/86 EHB>
|
||
|
Pea DeskPattern ; push the desk pattern
|
||
|
_FillRgn ; and paint the desktop
|
||
|
|
||
|
@doneDraw
|
||
|
Unlk A6
|
||
|
Move.l (A7)+,(A7) ; Get rid of paramter
|
||
|
Rts
|
||
|
|
||
|
ENDPROC ; DrawDeskPattern
|
||
|
|
||
|
;---------------------------------------------------------------------------------------
|
||
|
; pascal OSErr DM__GestaltProc(OSType selector, long* response)
|
||
|
; This is the gestalt for both Display Manager version and Display Manager Attributes
|
||
|
; I assume that attributes are called more that version (and is slightly faster).
|
||
|
;
|
||
|
; 0(A7) Rts
|
||
|
; 4(A7) response
|
||
|
; 8(A7) selector
|
||
|
;
|
||
|
|
||
|
CASE OFF ; Pascal Routine
|
||
|
DM__GestaltProc PROC EXPORT
|
||
|
CASE OBJECT ; back to C conventions
|
||
|
Move.l (SP)+,A0 ; RTS
|
||
|
Move.l (SP)+,A1 ; response
|
||
|
Move.l (SP)+,D0 ; selector
|
||
|
Move.l #(1<<gestaltDisplayMgrPresent)+2,(A1) ; Attributes
|
||
|
; DANGER: temp setting bit 1 to let monitors
|
||
|
; know that parameters to Move and SetMode calls is correct.
|
||
|
; I need to remove this bit when I am sure everyone has updated
|
||
|
; say around b2.
|
||
|
Cmp.l #gestaltDisplayMgrAttr,D0
|
||
|
Beq.s @WasAttributes
|
||
|
Move.l #gestaltDMLatestVersion,(A1) ; Correct to version
|
||
|
|
||
|
@WasAttributes
|
||
|
Clr.w (SP) ; Clear Result
|
||
|
Jmp (A0)
|
||
|
|
||
|
|
||
|
ENDPROC ; DM__GestaltProc
|
||
|
|
||
|
;-------------------------------------------------------------------------------------------
|
||
|
;
|
||
|
; Utility -- Create QuickDraw world
|
||
|
;
|
||
|
; Call InitGraf to create a quickdraw world.
|
||
|
;
|
||
|
; pascal void DM_InitQDWorld(DisplayManagerGlobalsPtr dmGlobals);
|
||
|
;
|
||
|
;-------------------------------------------------------------------------------------------
|
||
|
|
||
|
CASE OFF ; Pascal routine
|
||
|
DM_InitQDWorld PROC EXPORT
|
||
|
CASE OBJECT ; Back To C
|
||
|
Link A6,#0 ; Set up for paramters off A6
|
||
|
Move.b QDExist,-(A7) ; Save QDExist
|
||
|
Move.l CurrentA5,-(A7) ; Save CurrentA5
|
||
|
Move.l A5,-(A7) ; Save A5
|
||
|
|
||
|
Move.l 8(A6),A0 ; Get dmGlobals
|
||
|
Lea DMGlobalsRec.fQDA5World(A0),A5 ; Make A5 point at my A5 world
|
||
|
Move.l A5,CurrentA5 ; Stuff it in CurrentA5 just to be sure
|
||
|
|
||
|
Move.l DMGlobalsRec.fQDGlobals(A0),A0 ; Globals pointer
|
||
|
Pea grafSize-4(A0) ; Push Pointer to storage (at end of storage)
|
||
|
_InitGraf
|
||
|
|
||
|
Move.l 8(A6),A0 ; Get dmGlobals
|
||
|
Pea DMGlobalsRec.fPortStorage(A0) ; Push display manager port
|
||
|
_SetPort ; Set thePort to fDrawingPort for the QD world.
|
||
|
|
||
|
|
||
|
Move.l (A7)+,A5 ; Restore A5
|
||
|
Move.l (A7)+,CurrentA5 ; Restore CurrentA5
|
||
|
Move.b (A7)+,QDExist ; Restore QDExist
|
||
|
Unlk A6
|
||
|
Move.l (A7)+,(A7) ; Copy Rts over dmGlobals parameter
|
||
|
Rts ; Go Home
|
||
|
ENDPROC ; DM__GestaltProc
|
||
|
|
||
|
;-------------------------------------------------------------------------------------------
|
||
|
;
|
||
|
; Utility -- RecalcMenuBar
|
||
|
;
|
||
|
; Trys to use MenuMgr call to recalculate the menu bar, if this fails (ie not a valid trap)
|
||
|
; then it tries to call the MBDF directly. The code for calling the MBDF only be include
|
||
|
; in system builds until we are sure that the _MenuCalc is installed. The code will have
|
||
|
; to remain in this file for the initversion.
|
||
|
;
|
||
|
;-------------------------------------------------------------------------------------------
|
||
|
RecalcMenuBar PROC EXPORT
|
||
|
MBDFCalcMsg EQU 2
|
||
|
|
||
|
Clr.l -(SP) ; Result and clear all
|
||
|
_CalcMenuBar
|
||
|
move.w (sp)+,D0 ; get result
|
||
|
|
||
|
Cmp.w #paramErr,D0 ; If the trap is not implemented then try directly
|
||
|
Bne.s @Done ; This should eventually go away (when I am sure that _MenuCalc is available)
|
||
|
|
||
|
;
|
||
|
; Conditionally compile CallMBarProc and this code only for INITVERSION when I am sure that
|
||
|
; _CalcMenuBar is in the SYSTEM
|
||
|
;
|
||
|
; IF (&TYPE('INITVERSION') <> 'UNDEFINED') THEN
|
||
|
|
||
|
; D0 Contains selector and param1
|
||
|
; D1 Contains the 6 byte offset or 0 indicating calc all
|
||
|
Moveq #MBDFCalcMsg,D0
|
||
|
Moveq #0,D1 ; Calc all
|
||
|
CASE OFF ; dispatch routines are Pascal
|
||
|
IMPORT CallMBarProc
|
||
|
Jsr CallMBarProc
|
||
|
CASE OBJECT ; back to C conventions
|
||
|
|
||
|
@Done
|
||
|
;
|
||
|
; UNCOMMENT WHEN _MenuCalc is guaranteed to be in the system
|
||
|
;
|
||
|
;ENDIF ; INITVERSION
|
||
|
|
||
|
Rts
|
||
|
ENDPROC ;
|
||
|
|
||
|
;-------------------------------------------------------------------------------------------
|
||
|
;
|
||
|
; Utility -- UpdateScreenBits
|
||
|
;
|
||
|
; pascal void UpdateScreenBits(GDHandle newMainDevice);
|
||
|
;
|
||
|
; Call only where quickdraw has been initialized. Update Screenbits in quickdraw globals
|
||
|
; UpdateScreenBits assumes that low memory has be initialized for the current
|
||
|
; main device (see FixLowMem() in DisplayMgr.c). This means if I did something
|
||
|
; wrong, I only have to fix it there, not here.
|
||
|
;
|
||
|
; ISSUE:
|
||
|
; In resolution independent QD, do we want the pixmap bounds (ie at variable resolution)
|
||
|
; or do we want the globals bounds (ie at 72 dpi)? Currently I am using 72 dpi information
|
||
|
; because the only app I know about (Finder) uses this information to determine if an object
|
||
|
; is on screen. Putting in resolution information would mess up this calculation.
|
||
|
;
|
||
|
CASE OFF ; Pascal routine
|
||
|
UpdateScreenBits PROC EXPORT
|
||
|
CASE OBJECT ; Back To C
|
||
|
|
||
|
Move.l (SP)+,D0 ; Rts
|
||
|
Move.l (SP)+,A0 ; Get newMainDevice
|
||
|
Move.l (A0),A0 ; pointer to newMainDevice
|
||
|
|
||
|
Move.l (A5),A1 ; Get pointer to QD globals
|
||
|
Lea screenBits(A1),A1
|
||
|
Move.l ScrnBase,baseAddr(A1) ; Set up the quickdraw global screenBits
|
||
|
Move.w ScreenRow,rowBytes(A1)
|
||
|
Move.l gdRect(A0),bounds(A1)
|
||
|
Move.l gdRect+4(A0),bounds+4(A1)
|
||
|
|
||
|
Move.l D0,A0 ; Move return address to A0
|
||
|
Jmp (A0) ; and return
|
||
|
ENDPROC ; UpdateScreenBits
|
||
|
|
||
|
;-------------------------------------------------------------------------------------------
|
||
|
|
||
|
CASE OFF ; Pascal routine
|
||
|
DM_GetROMMultiModeTable PROC EXPORT
|
||
|
CASE OBJECT ; Back To C
|
||
|
Lea RomTimingTables,A1
|
||
|
Move.l (SP)+,D0 ; Rts
|
||
|
Move.l (SP)+,A0 ; Pointer to result
|
||
|
Move.l A1,(A0) ; return table
|
||
|
Clr.w (SP) ; return noErr
|
||
|
Move.l D0,A0
|
||
|
Jmp (A0)
|
||
|
|
||
|
RomTimingTables
|
||
|
Dc.w kMultiModeCRT1Connect, @MultiModeCRT1-RomTimingTables
|
||
|
Dc.w kMultiModeCRT2Connect, @MultiModeCRT2-RomTimingTables
|
||
|
Dc.w kMultiModeCRT3Connect, @MultiModeCRT3-RomTimingTables
|
||
|
Dc.w kFullPageConnect, @FullPage-ROMTimingTables
|
||
|
Dc.w kVGAConnect, @VGA-ROMTimingTables
|
||
|
Dc.w kNTSCConnect, @NTSC-ROMTimingTables
|
||
|
Dc.w kPALConnect, @PAL-ROMTimingTables
|
||
|
Dc.w kHRConnect, @HR-ROMTimingTables
|
||
|
Dc.w 0,0
|
||
|
|
||
|
@MultiModeCRT1 Dc.w timingApple13,3 ; Default
|
||
|
Dc.w timingApple16,1
|
||
|
Dc.w 0,0
|
||
|
|
||
|
@MultiModeCRT2 Dc.w timingApple13,1
|
||
|
Dc.w timingApple16,3 ; Default
|
||
|
Dc.w timingApple19,1
|
||
|
Dc.w 0,0
|
||
|
|
||
|
@MultiModeCRT3 Dc.w timingApple13,1
|
||
|
Dc.w timingApple16,1
|
||
|
Dc.w timingApple19,1
|
||
|
Dc.w timingApple21,3 ; Default
|
||
|
Dc.w 0,0
|
||
|
|
||
|
@FullPage Dc.w timingApple15, 3 ; Default
|
||
|
Dc.w timingApple15x,1
|
||
|
Dc.w 0,0
|
||
|
|
||
|
@VGA Dc.w timingAppleVGA,3 ; Default
|
||
|
Dc.w 0,0
|
||
|
|
||
|
@NTSC Dc.w timingAppleNTSC_ST,3 ; Default
|
||
|
Dc.w 0,0
|
||
|
|
||
|
@PAL Dc.w timingApplePAL_ST,3 ; Default
|
||
|
Dc.w 0,0
|
||
|
|
||
|
@HR Dc.w timingApple13, 3 ; Default
|
||
|
Dc.w timingApple13x,1 ;
|
||
|
Dc.w 0,0
|
||
|
|
||
|
|
||
|
END
|