; > PrivDoc.ScreenMode

Still to do on screen mode selection, as of 21-Jul-93:

Key:    +  Done and tested
        -  Done but not tested
        *  Still to do
        x  Not done for a good reason

 + Make OS_ReadModeVariable work with mode selectors
 + OS_ScreenMode(ReturnMode)
 + OS_ScreenMode(EnumerateModes)
     + Create variable holding video bandwidth
     + Add this reason code to just load up video bandwidth, VideoSize and issue service
 + Service_ModeExtension additions
     + Load up r4 and r5 with video bandwidth, VideoSize respectively
 + Change vdugrafg:SetUpSprModeData:04 to check for mode selector, and goto 10 if so
 + Check other occurrences of BranchIfKnownMode to look for similar bits
 + Put code to handle new sprite mode word into PushModeInfo (any monitor only?)
 + Remove new sprite mode word fudging in vdugrafg:SetupSprModeData and 
    vdugrafl:SwitchOutputToSprite
 + Make SwitchOutputToSprite(new format) set up ECFIndex (it doesn't at the moment!)
 + Make sure tests for equal mode numbers don't assume equal ptrs to mode selectors are equivalent
 + Modify NewModes module to respond to Service_EnumerateScreenModes, to test enumeration.
 + OS_ScreenMode(SetMonitorType)
     + Allocate soft copy for monitortype
     + Write routine to update soft copy from CMOS
     + Call this routine in initialisation
     + Make *Configure MonitorType update soft copy
     + Change ReadMonitorType to read from soft copy
     + Add this reason code to either store given value or update from CMOS
 + Make sprites which have mode selectors as their mode word illegal
     + Move conversion of mode selectors to new format sprite mode words
        into PreCreateHeader, rather than PostCreateHeader, so that it
        doesn't call SetupSprModeData with a (now illegal) mode selector
 -> MT ScreenModes module

 -> AG Make switch output to sprite for a new format sprite make mode selector for current mode?

 -> AG *ScreenSave in mode 50 seems to produce a sprite with a palette.

 -> NK Trying to set a WimpMode with XEigFactor=27 caused data abort.
       Investigate and/or range-limit values.

 -> AG Put in support for returning errors from PushModeInfo (for bad mode
       selectors and new format sprite mode words):
     + Make mode change routine check for error from PushModeInfo and FindOKMode
     + Make FindSubstitute check errors from PushModeInfo
     + Make FindOKMode check errors from FindSubstitute
     + Make CheckModeValid check errors from FindOKMode
     + Make SetupSprModeData capable of returning errors:
         + Ditto SpriteV handler (already OK)
         + Ditto PreCreateHeader
         + Ditto CreateHeader
         + Ditto GetSprite
     -> AG Make SwitchOutputToSprite/Mask check errors from PushModeInfo

 - Design and code algorithm for working out FIFO reload position for VIDC20
   (Still need explanation from ARM of why 7 quad-words doesn't always work)

 * OS_ScreenMode(SelectMode)
     + Make normal mode selection routine into a subroutine
     + Write veneers to put round call to this in OS_ScreenMode(SelectMode)
     * Change actual mode change code to cope with mode selectors
         + Prevent main routine looking at shadow bit in mode selector
         + Modify FindOKMode to cope with mode selector
         + Modify OS_CheckModeValid to cope with mode selector
         + Make all pushed mode variables into words (not bytes)
         + Modify PushModeInfo to cope with mode selector
         + Make YEigFactor default to 2 if yres < xres/2 (and change spec. to reflect that)
         + Make numbered modes work after loading mode file
         + Allocate space for OS copy of mode selector
         x Make OS mode selector part of saved VDU context
            (not needed since sprites can't have mode selectors as their mode)
         x Sort out internal mode variables PalIndex, ECFIndex wrt
            converting existing mode numbers into mode selectors (no need, still use old workspace-getting code)
         x Make mode selector blocks for all existing numbered modes
            (no need, constructed on fly since only needed during svc call)
         * Check that copying mode selector has no adverse effects
         * Sort out why issuing a mode change with invalid mode selector doesn't give error
         * Modify FindOKMode to cope with 16 and 32 bpp modes somehow

 * Prevent pointer position from going into the sync pulse (causes screen picture disruption)

 * Adjust borders on all modes, to cope with VIDC20 problem
   (Needs algorithm from ARM that works!)

 * Mode change happily passes round any old rubbish to Service_ModeExtension - it should:-
        * First check that value is word-aligned - if not it may be a new sprite mode word
        * Do a Validate_Address on fixed bit of block?

 * What should *ScreenLoad do with a new format sprite?