mac-rom/Toolbox/DisplayMgr/DisplayMgr.a
Elliot Nunn 0ba83392d4 Bring in CubeE sources
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.
2017-09-20 18:04:16 +08:00

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