## Display Device Driver Reference for OS/2

[prev][next][parent][TOC]

### [SetMode]

This section lists the required execution steps for a successful mode set. There could be one SetMode section per MonitorModeInfo, or one per ModeInfo , or one that services multiple modes. The Interpreter tags all ModeInfo and MonitorModeInfo sections found between two SetMode sections and, later on, associates the last SetMode with all of them. Thus, SetMode services for all of the modes could be provided by a number of different functions ( if desired, a single function that serves as a router can be used). The SetMode section is also executed when Saving and Restoring the mode (see [ SaveRestore] in this chapter).

Any number of can be called from within the mode section. The SetMode section has to ensure that the adapter is programmed to reflect the run- time settings of the ModeInfo/MonitorModeInfo structure. These settings are passed in the VIDEO_ADAPTER.VIDEOMODEINFO structure at the The settings are also available as PMI keyvariables to the PMI language On dynamic Legacy and PnP hardware, or when a coprocessor co-resides with a VGA chip, the SetMode has to ensure that the setup is configured appropriately for the mode to be set. This should be facilitated by an embedded EnableController call, which is sensitive to the current Hardware PMI keyvariable values.

Vendors who provide the TuneDisplay section for sizing of the active display and the SetMonitorTimings section for manipulation of the timing PMI keyvariables should ensure that the SetMode section has the ability to set the run-time values for the timing PMI keyvariables. The easiest way to ensure this is by making the SetMode section use the SetMonitorTimings and TuneDisplay sections.

See Supported Modes and [EnableController] in this chapter for more information. VIDEOCFG.DLL Exported Functions for information on video configuration.

Here is a sample file for a Viper VLB card:

    [SetMode]
    SetP9000AccelMode;

    /*
    ** Set accelerated mode on P9000
    */
    [SetP9000AccelMode]
    EnableController;             //configure controller
    r0   = 0x00000000;            //set DAC
    r1   = 0x00000040;            //256 color 6:6:6
    if (BitsPerPixel != 16) goto DAC
    r1   = 0x00000030;            // 64K colors
    DAC:
    ProgramDAC;
    InitializeP9000;              //initialize P9000 registers
                                  //set sysconfig and clipping
    if (Xresolution != 640) goto not640
    r1  = 0x028001e0;             //640x480x8
    r0  = 0x00563000;
    if (BitsPerPixel == 8) goto domodeset
    r0  = 0x00683000;             //640x480x16 bits
    goto domodeset
    not640:
    if (Yresolution != 800) goto not800     //800x600x8
    r0  =  0x00587000;
    r1  =  0x03200258;
    goto domodeset
    not800:                       //must be 1024x760x8
    r0  =  0x00603000;
    r1  =  0x04000300;
    domodeset:
    writedw(sysconfig,r0);
    writedw(w_min,0x00000000);
    writedw(w_max,r1);            //program clipping
    SetMonitorTimings;            //program clock and timings. Calls TuneDisplay.
    writedw(srtctl,0x000001e5);   //enable