

  Video Electronics Standards Association               VBE/Core 2.0 Standard
  2150 North First Street, Suite 440
  San Jose, CA 95131-2029              
  Phone: (408) 435-0333
  FAX: (408) 435-8225


                          VESA BIOS EXTENSION (VBE)
                              Core Functions

                               Version: 2.0





     NOTE: This is _NOT_ an official version of the VBE/Core 2.0 standard,
           but is provided as is by SciTech Software until the official
           specification is made available electronically. This document
           contains a summary of the important portions of the standard
           related to developing working code for VBE 2.0.

           For more information on the official specification, please
           contact VESA at the address listed above.




     1.    Introduction

     This document contains the VESA BIOS Extension (VBE) specification for
     standard software access to graphics display controllers that support
     resolutions, color depths, and frame buffer organizations beyond the
     VGA hardware standard.  It is intended for use by both applications
     programmers and system software developers.

     System software developers may use this document to supplement the
     System and INT 10h ROM BIOS functions to provide the VBE services.
     Application developers can use this document as a guide to programming
     all VBE compatible devices.

     To understand the VBE specification, some knowledge of 80x86 assembly
     language and the VGA hardware registers may be required.  However,
     the services described in this specification may be called from any
     high-level programming language that provides a mechanism for
     generating software interrupts with the 80x86 registers set to user-
     specified values.

     In this specification, 'VBE' and 'VBE 2.0' are synonymous with 'VBE
     Core Functions version 2.0'.


     1.1. Scope of the VBE Standard

     The primary purpose of the VESA VBE  is to provide standard software
     support for the many unique implementations of Super VGA (SVGA)
     graphics controllers on the PC platform that provide features beyond
     the original VGA hardware standard.  This is to provide a feasible
     mechanism by which application developers can take advantage of this
     nonstandard hardware in graphics applications.

     The VBE specification offers an extensible software foundation which
     allows it to evolve as display and audio devices evolve over time,
     without sacrificing backward software compatibility with older
     implementations.  New application software should be able to work with
     older hardware, and application software that has already shipped
     should work correctly on new hardware devices.

     VBE services provide standard access to all resolutions and color
     depths provided on the display controller, and report the availability
     and details of all supported configurations to the application as
     necessary.

     VBE implementations facilitate the field support of audio and display
     hardware by providing the application software with the manufacturer's
     name and the product identification of the display hardware.

     Since graphics controller services on the PC are typically implemented
     in ROM, the VBE services are defined so that they should be
     implemented within the standard VGA ROM.  When ROM implementations of
     VBE are not possible, or when field software upgrades to the onboard
     ROM are necessary, the VBE implementation may be also offered as a
     device driver or DOS Terminate & Stay Resident (TSR) program.

     The standard VBE functions may be supplemented by OEM's as necessary
     to support custom or proprietary functions unique to the manufacturer.
     This mechanism enables the OEM to establish functions that may be
     standard to the product line, or provide access to special hardware

     enhancements.

     Although previous VBE standards assumed that the underlying graphics
     architecture was a VGA device, the display services described by VBE
     2.0 can be implemented on any frame buffer oriented graphics device.

     The majority of VBE services facilitate the setup and configuration of
     the hardware, allowing applications high performance, direct access to
     the configured device at runtime.  To further improve the performance
     of flat frame buffer display devices in extended resolutions, VBE 2.0
     provides new memory models that do not require the traditional frame
     buffer "banking" mechanisms.

     VBE is expected to work on all 80x86 platforms, in real and protected
     modes.

     Since some modern display devices are designed without any VGA
     support, two display controllers may be present in the system.  One
     display controller would be used for VGA compatibility, and the other
     used for graphic extensions to the basic VGA modes, resolutions, and
     frame buffer models.  Therefore, VBE must be able offer the
     application automatic access to the appropriate device based on the
     mode or resolution that is requested by the application.

     Currently beyond the scope of the VBE specification is the handling of
     hardware configuration and installation issues.  It was originally
     considered to become part of VBE 2.0, however we have deferred the
     issues to the Graphics Configuration Supplemental Specification.  In
     addition, it is also possible for an OEM to define their own
     extensions using the OEM Supplemental Specification if required.


     1.2. Backgrounder
                1
     The IBM VGA  has become a de facto standard in the PC graphics world.
     A multitude of different VGA offerings exist in the marketplace, each
     one providing BIOS or register compatibility with the IBM VGA. More
     and more of these VGA compatible products implement various supersets
     of the VGA standard. These extensions range from higher resolutions
     and more colors to improved performance and even some graphics
     processing capabilities. Intense competition has dramatically improved
     the price/performance ratio, to the benefit of the end user.

     However, several serious problems face a software developer who
     intends to take advantage of these "Super VGA"  environments. Because
     there is no standard hardware implementation, the developer is faced
     with widely disparate Super VGA hardware architecture. Lacking a
     common software interface, designing applications for these
     environments is costly and technically difficult. Except for
     applications supported by OEM-specific display drivers, very few
     software packages can take advantage of the power and capabilities of
     Super VGA products.

     The VBE standard was originally conceived to enable the development of
     applications that wished to take advantage of display resolutions and
     color depths beyond the VGA definition.  The need for an application
     or software standard was recognized by the developers of graphic
     hardware to encourage the use and acceptance of their rapidly
     advancing product families.  It became obvious that the majority of
     software application developers did not have the resources to develop
     and support custom device level software for the hundreds of display
     boards on the market.  Therefore the rich new features of these
     display devices were not being used outside of the relatively small
     CAD market, and only then after considerable effort.

     Indeed, the need for a standard for SVGA display adapters became so
     important that the VESA organization was formed to seek out a
     solution.  The original VBE standard was devised and agreed upon by
     each of the active display controller manufacturers, and has since
     been adopted by DOS application developers to enable use of non-VGA
     extended display modes.

     As time went along VBE 1.1 was created to add more video modes and
     increased logical line length/double buffering support.  VBE 1.2 was
     created to add modes and also added high color RAMDAC support.

     In the three years since VBE 1.2 was approved we have seen the
     standard become widely accepted and many successful programs have
     embraced VBE.  However, it has become obvious that the need for a more
     robust and extensible standard exists.  Early extensions to the VGA
     standard continued using all of the original VGA I/O ports and frame
     buffer address to communicate with the controller hardware.  As we've
     seen, the supported resolutions and color depths have grown,
     intelligent controllers with BITBLT and LineDraw Functions have become
     common, and new flat frame buffer memory models have appeared along
     with display controllers that are not based on VGA in any way.  VBE
     2.0 and future extensions will support non-VGA based controllers with
     new functions for reading and writing the palette and for access to
     the flat frame buffer models.

     VBE 2.0, as designed, offers the extensibility and the robustness that
     was lacking in the previous specifications, while at the same time
     offering backwards compatibility.

     In the future, we see the need for adding supplemental specifications
     for issues like Multimedia; Advanced Graphics Functions; and "Plug and
     Play" features.

     2.VBE Overview

     This chapter outlines the various features and limitations of the VBE
     standard.


     2.1. VBE  Features

       Standard application interface to Graphics Controllers (SVGA
       Devices)
       Standard method of identifying products and manufacturers.
       Provision for OEM extensions through Sub-function 14h
       Simple protected mode interface.
       Extensible interface through supplemental specifications.


     2.2. VBE Affected Devices

     All frame buffer-based devices in the IBM PC platform (with the
     exception of Hercules, Monochrome (MDA), CGA and EGA devices) are
     suitable for use within the VBE standard to enable access to the
     device by VBE-compliant applications.


     2.3. Providing Vendor Information

     The VGA specification does not provide a standard mechanism to
     determine what graphic hardware it is running on. Only by knowing OEM-
     specific features can an application determine the presence of a
     particular graphics controller or display board. This often involves
     reading and testing registers located at I/O addresses unique to each
     OEM. By not knowing what hardware an application is running on, few,
     if any, of the extended features of the underlying hardware can be
     used.

     The VESA BIOS Extension provides several functions to return
     information about the graphics environment. These functions return
     system level information as well as graphics mode specific details.
     Function 00h returns general system level information, including an
     OEM identification string. The function also returns a pointer to the
     supported VBE and OEM modes. Function 01h may be used by the
     application to obtain additional information about each supported
     mode. Function 03h returns the current VBE mode.

     3.VBE Mode Numbers

     Standard VGA mode numbers are 7 bits wide and presently range from 00h
     to 13h. OEMs have defined extended display modes in the range 14h to
     7Fh. Values in the range 80h to FFh cannot be used, since VGA BIOS
     Function 00h (Set video mode) interprets bit 7 as a flag to clear or
     preserve display memory.

     Due to the limitations of 7 bit mode numbers, the optional VBE mode
     numbers are 14 bits wide. To initialize a VBE mode, the mode number is
     passed in the BX register to VBE Function 02h (Set VBE mode).

     The format of VBE mode numbers is as follows:

          D0-D8     =    Mode number
                         If D8 == 0, this is not a VESA defined mode
                         If D8 == 1, this is a VESA defined mode
          D9-D13    =    Reserved by VESA for future expansion (= 0)
          D14       =    Linear/Flat Frame Buffer Select
                         If D14 == 0, Use VGA Frame Buffer
                         If D14 == 1, Use Linear/Flat Frame Buffer
          D15       =    Preserve Display Memory Select
                         If D15 == 0, Clear display memory
                         If D14 == 1, Preserve display memory

     Thus, VBE mode numbers begin at 100h. This mode numbering scheme
     implements standard 7-bit mode numbers for OEM-defined modes.
     Standard VGA modes may be initialized through VBE Function 02h (Set
     VBE mode) simply by placing the mode number in BL and clearing the
     upper byte (BH). 7-bit OEM-defined display modes may be initialized in
     the same way.  Note that modes may only be set if the mode exists in
     the Video Mode List returned in Function 0.

     Note: Starting with VBE version 2.0 VESA will no longer define new
     VESA mode numbers and it will not longer be mandatory to support these
     old mode numbers.  However, it is highly recommended that BIOS
     implementations continue to support these mode numbers for
     compatibility with old software.  VBE 2.0-aware applications should
     follow the guidelines in Appendix 5 - Application Programming
     Considerations - for setting a desired mode.

     Note:  Mode 81FFh is a special mode designed to preserve the current
     memory contents and to give access to the entire video memory.  This
     mode is especially useful for saving the entire video memory contents
     before going into a state that could lose the contents (e.g. set this
     mode to gain access to all video memory to save it before going into a
     volatile power down state).  This mode is required because the entire
     video memory contents are not always accessible in every mode.  It is
     recommended that this mode be packed pixel in format, and a
     ModeInfoBlock must be defined for it.  Look in the ModeInfoBlock to
     determine if paging is required and how paging is supported if it is.
     Also note that there are no implied resolutions or timings associated
     with this mode.

     Note:  Future display resolutions will be defined by VESA display
     vendors.  The color depths will not be specified and new mode numbers
     will not be assigned for these resolutions.  For example, if the VESA

     display vendors define 1600x1200 as a VESA resolution, application
     developers should target their display resolution for 1600x1200 rather
     than choosing an arbitrary resolution like 1550x1190.  The VBE
     implementation should be queried to get the available resolutions and
     color depths and the application should be flexible enough to work
     with this list.  Appendix 5 gives a detailed summary of the way an
     application should go about selecting and setting modes.

     4.VBE Functions

     This chapter describes in detail each of the functions defined by the
     VBE standard.  VBE functions are called using the INT 10h interrupt
     vector, passing arguments in the 80X86 registers.  The INT 10h
     interrupt handler first determines if a VBE function has been
     requested, and if so, processes that request.  Otherwise control is
     passed to the standard VGA BIOS for completion.

     All VBE functions are called with the AH register set to 4Fh to
     distinguish them from the standard VGA BIOS functions.  The AL
     register is used to indicate which VBE function is to be performed.
     For supplemental or extended functionality the BL register is used
     when appropriate to indicate a specific sub-function.

     Functions 00-0Fh have been reserved for Standard VBE function numbers;
     Functions 10-FFh are reserved for VBE Supplemental Specifications.

     In addition to the INT 10h interface, a Protected Mode Interface is
     available and is described below.


     4.1. VBE Return Status

     The AX register is used to indicate the completion status upon return
     from VBE functions.  If VBE support for the specified function is
     available, the 4Fh value passed in the AH register on entry is
     returned in the AL register.  If the VBE function completed
     successfully, 00h is returned in the AH register.  Otherwise the AH
     register is set to indicate the nature of the failure.

     VBE RETURN STATUS

          AL ==     4Fh: Function is supported
          AL !=     4Fh: Function is not supported
          AH ==     00h: Function call successful
          AH ==     01h: Function call failed
          AH ==     02h: Software supports this function, but the hardware
                         does not
          AH ==     03h: Function call invalid in current video mode

     Note: Applications should treat any non-zero value in the AH register
     as a general failure condition as later versions of the VBE may define
     additional error codes.


     4.2. Protected Mode considerations

     VBE services may be called directly from 32-bit Protected mode only.

     For 32 bit protected mode, 2 selector/segment descriptors for 32-bit
     code and the data segment are needed. These will be allocated and
     initialized by the caller. The segment limit fields will be set to
     64k. These selectors may either be in the GDT or LDT, but must be
     valid whenever the VBE is called in protected mode. The caller must
     supply a stack large enough for use by VBE and by potential interrupt
     handlers. The caller's stack will be active if or when interrupts are
     enabled in the VBE routine, since the VBE will not switch stacks when
     interrupts are enabled, including NMI interrupts. The 32-bit VBE
     interface requires a 32-bit stack.

     When the VBE services are called, the current I/O permission bit map
     must allow access to the I/O ports that the VBE may need to access.
     This can be found in the Sub-table (Ports and Memory) returned by VBE
     Function 0Ah.

     To summarize, it is the calling application's responsibility to ensure
     to that it has the appropriate I/O and memory privileges, a large
     enough stack and appropriate selectors allocated.  It is also the
     calling application's responsibility to preserve registers if it needs
     them.

     4.3. Function 00h - Return VBE Controller Information

     This required function returns the capabilities of the display
     controller, the revision level of the VBE implementation, and vendor
     specific information to assist in supporting all display controllers
     in the field.

     The purpose of this function is to provide information to the calling
     program about the general capabilities of the installed VBE software
     and hardware. This function fills an information block structure at
     the address specified by the caller. The VbeInfoBlock information
     block size is 256 bytes for VBE 1.x, and 512 bytes for VBE 2.0.

     Input:    AX   = 4F00h  Return VBE Controller Information
            ES:DI   =        Pointer to buffer in which to place
                             VbeInfoBlock structure
                             (VbeSignature should be set to 'VBE2' when
                             function is called to indicate VBE 2.0
                             information is desired and the information
                             block is 512 bytes in size.)

     Output:   AX   =         VBE Return Status  

     Note: All other registers are preserved.

     The information block has the following structure:

     VbeInfoBlock struc
     VbeSignature        db   'VESA'    ; VBE Signature
     VbeVersion          dw   0200h     ; VBE Version
     OemStringPtr        dd   ?         ; Pointer to OEM String
     Capabilities        db   4 dup (?) ; Capabilities of graphics cont.
     VideoModePtr        dd   ?         ; Pointer to Video Mode List
     TotalMemory         dw   ?         ; Number of 64kb memory blocks
                                        ; Added for VBE 2.0
     OemSoftwareRev      dw   ?         ; VBE implementation Software revision
     OemVendorNamePtr    dd   ?         ; Pointer to Vendor Name String
     OemProductNamePtr   dd   ?         ; Pointer to Product Name String
     OemProductRevPtr    dd   ?         ; Pointer to Product Revision String
     Reserved            db   222 dup (?); Reserved for VBE implementation
                                        ; scratch area
     OemData             db   256 dup (?); Data Area for OEM Strings
     VbeInfoBlock ends

     Note: All data in this structure is subject to change by the VBE
     implementation when VBE Function 00h is called.  Therefore, it should
     not be used by the application to store data of any kind.

     Description of the VbeInfoBlock structure fields:

     The VbeSignature field is filled with the ASCII characters 'VESA' by
     the VBE implementation.  VBE 2.0 applications should preset this field
     with the ASCII characters 'VBE2' to indicate to the VBE implementation
     that the VBE 2.0 extended information is desired, and the VbeInfoBlock
     is 512 bytes in size.  Upon return from VBE Function 00h, this field
     should always be set to 'VESA' by the VBE implementation.

     The VbeVersion is a BCD value which specifies what level of the VBE
     standard is implemented in the software. The higher byte specifies the
     major version number. The lower byte specifies the minor version
     number.

     Note:  The BCD value for VBE 2.0 is 0200h and the BCD value for VBE
     1.2 is 0102h. In the past we have had some applications
     misinterpreting these BCD values.  For example, BCD 0102h was
     interpreted as 1.02, which is incorrect.

     The OemStringPtr is a Real Mode far pointer to a null terminated OEM-
     defined string. This string may be used to identify the graphics
     controller chip or OEM product family for hardware specific display
     drivers. There are no restrictions on the format of the string.  This
     pointer may point into either ROM or RAM, depending on the specific
     implementation.  VBE 2.0 BIOS implementations must place this string
     in the OemData area within the VbeInfoBlock if 'VBE2' is preset in the
     VbeSignature field on entry to Function 00h.  This makes it possible
     to convert the RealMode address to an offset within the VbeInfoBlock
     for Protected mode applications.

     Note: The length of the OEMString is not defined, but for space
     considerations, we recommend a string length of less than 256 bytes.

     The Capabilities field indicates the support of specific features in
     the graphics environment. The bits are defined as follows:

     D0     = 0     DAC is fixed width, with 6 bits per primary color
            = 1     DAC width is switchable to 8 bits per primary color
     D1     = 0     Controller is VGA compatible
            = 1     Controller is not VGA compatible
     D2     = 0     Normal RAMDAC operation
            = 1     When programming large blocks of information to the
                    RAMDAC use blank bit in Function 09h. i.e. RAMDAC
                    recommends programming during blank period only.
     D3-31  = Reserved

     BIOS Implementation Note: The DAC must always be restored to 6 bits
     per primary as default upon a mode set.  If the DAC has been switched
     to 8 bits per primary, the mode set must restore the DAC to 6 bits per
     primary to ensure the application developer that he does not have to
     reset it.

     Application Developer's Note:  If a DAC is switchable, you can assume
     that the DAC will be restored to 6 bits per primary upon a mode set.
     For an application to use a DAC the application program is responsible
     for setting the DAC to 8 bits per primary mode using Function 08h.

     VGA compatibility is defined as supporting all standard IBM VGA modes,
     fonts and I/O ports; however, VGA compatibility doesn't guarantee that
     all modes which can be set are VGA compatible, or that the 8x14 font
     is available.

     The need for D2 = 1 "program the RAMDAC using the blank bit in
     Function 09h" is for older style RAMDAC's where programming the RAM
     values during display time causes a "snow-like" effect on the screen.
     Newer style RAMDAC's don't have this limitation and can easily be
     programmed at any time, but older RAMDAC's require the that they be
     blanked so as not to display the snow while values change during
     display time..  This bit informs the software that they should make
     the function call with 80h rather than 00h to ensure the minimization
     of the "snow-like" effect.

     The VideoModePtr points to a list of  mode numbers for all  display
     modes supported by the VBE implementation.  Each mode number occupies
     one word (16 bits). The list of mode numbers is terminated by a -1
     (0FFFFh).  The mode numbers in this list represent all of the
     potentially supported modes by the display controller.  Please refer
     to Chapter 3 for a description of VESA VBE mode numbers.  VBE 2.0 BIOS
     implementations must place this mode list in the Reserved area in the
     VbeInfoBlock or have it statically stored within the VBE
     implementation if 'VBE2' is preset in the VbeSignature field on entry
     to Function 00h.

     Note: It is the application's responsibility to verify the actual
     availability of any mode returned by this function through the Return
     VBE Mode Information (VBE Function 01h) call. Some of the returned
     modes may not be available due to the actual amount of memory
     physically installed on the display board or due to the capabilities
     of the attached monitor.

     Note: If a VideoModeList is found to contain no entries (starts with
     0FFFFh), it can be assumed that the VBE implementation is a "stub"
     implementation where only Function 00h is supported for diagnostic or
     "Plug and Play" reasons.  These stub implementations are not VBE 2.0
     compliant and should only be implemented in cases where no space is
     available to implement the whole VBE.

     The TotalMemory field indicates the maximum amount of memory
     physically installed and available to the frame buffer in 64KB units.
     (e.g. 256KB = 4, 512KB = 8)  Not all video modes can address all this
     memory, see the ModeInfoBlock for detailed information about the
     addressible memory for a given mode.

     The OemSoftwareRev field is a BCD value which specifies the OEM
     revision level of the VBE software.  The higher byte specifies the
     major version number. The lower byte specifies the minor version
     number.  This field can be used to identify the OEM's VBE software
     release.  This field is only filled in when 'VBE2' is preset in the
     VbeSignature field on entry to Function 00h.

     The OemVendorNamePtr is a pointer to  a null-terminated string
     containing the name of the vendor who produced the display controller
     board product.  (This string may be contained in the VbeInfoBlock or
     the VBE implementation.)  This field is only filled in when 'VBE2' is
     preset in the VbeSignature field on entry to Function 00h.  (Note:
     the length of the strings OemProductRev, OemProductName and
     OemVendorName (including terminators) summed, must fit within a 256
     byte buffer; this is to allow for return in the OemData field if
     necessary.)

     The OemProductNamePtr is a pointer to  a null-terminated string
     containing the product name of the display controller board.  (This
     string may be contained in the VbeInfoBlock or the VBE
     implementation.)  This field is only filled in when 'VBE2' is preset
     in the VbeSignature field on entry to Function 00h.  (Note:  the
     length of the strings OemProductRev, OemProductName and OemVendorName
     (including terminators) summed, must fit within a 256 byte buffer;
     this is to allow for return in the OemData field if necessary.)

     The OemProductRevPtr is a pointer to a null-terminated string
     containing the revision or manufacturing level of the display
     controller board product.  (This string may be contained in the
     VbeInfoBlock or the VBE implementation.)  This field can be used to
     determine which production revision of the display controller board is
     installed.  This field is only filled in when 'VBE2' is preset in the
     VbeSignature field on entry to Function 00h.  (Note:  the length of
     the strings OemProductRev, OemProductName and OemVendorName (including
     terminators) summed, must fit within a 256 byte buffer; this is to
     allow for return in the OemData field if necessary.)

     The Reserved field is a space reserved for dynamically building the
     VideoModeList if necessary if the VideoModeList is not statically
     stored within the VBE implementation.  This field should not be used
     for anything else, and may be reassigned in the future.  Application
     software should not assume that information in this field is valid.

     The OemData field is a 256 byte data area that is used to return OEM
     information returned by VBE Function 00h when 'VBE2' is preset in the
     VbeSignature field.  The OemVendorName string, OemProductName string
     and OemProductRev string are copied into this area by the VBE
     implementation.  This area will only be used by VBE implementations
     2.0 and above when 'VBE2' is preset in the VbeSignature field.
     4.4. Function 01h - Return VBE Mode Information

     This required function returns extended information about a specific
     VBE display mode from the mode list returned by VBE Function 00h.
     This function fills the mode information block, ModeInfoBlock,
     structure with technical details on the requested mode.  The
     ModeInfoBlock structure is provided by the application with a fixed
     size of 256 bytes.

     Information can be obtained for all listed modes in the Video Mode
     List returned in Function 00h.  If the requested mode cannot be used
     or is unavailable, a bit will be set in the ModeAttributes field to
     indicate that the mode is not supported in the current configuration.

     Input:    AX   = 4F01h   Return VBE mode information
               CX   =         Mode number
            ES:DI   =         Pointer to ModeInfoBlock structure

     Output:   AX   =         VBE Return Status

     Note: All other registers are preserved.

     The mode information block has the following structure:

     ModeInfoBlock   struc

     ; Mandatory information for all VBE revisions
     ModeAttributes      dw ?      ; mode attributes
     WinAAttributes      db ?      ; window A attributes
     WinBAttributes      db ?      ; window B attributes
     WinGranularity      dw ?      ; window granularity
     WinSize             dw ?      ; window size
     WinASegment         dw ?      ; window A start segment
     WinBSegment         dw ?      ; window B start segment
     WinFuncPtr          dd ?      ; pointer to window function
     BytesPerScanLine    dw ?      ; bytes per scan line

     ; Mandatory information for VBE 1.2 and above
     XResolution         dw ?      ; horizontal resolution in pixels or chars
     YResolution         dw ?      ; vertical resolution in pixels or chars
     XCharSize           db ?      ; character cell width in pixels
     YCharSize           db ?      ; character cell height in pixels
     NumberOfPlanes      db ?      ; number of memory planes
     BitsPerPixel        db ?      ; bits per pixel
     NumberOfBanks       db ?      ; number of banks
     MemoryModel         db ?      ; memory model type
     BankSize            db ?      ; bank size in KB
     NumberOfImagePages  db ?      ; number of images
     Reserved            db ?      ; reserved for page function

     ; Direct Color fields (required for direct/6 and YUV/7 memory models)
     RedMaskSize         db ?      ; size of direct color red mask in bits
     RedFieldPosition    db ?      ; bit position of lsb of red mask
     GreenMaskSize       db ?      ; size of direct color green mask in bits
     GreenFieldPosition  db ?      ; bit position of lsb of green mask
     BlueMaskSize        db ?      ; size of direct color blue mask in bits
     BlueFieldPosition   db ?      ; bit position of lsb of blue mask
     RsvdMaskSize        db ?      ; size of direct color reserved mask in bits
     RsvdFieldPosition   db ?      ; bit position of lsb of reserved mask
     DirectColorModeInfo db ?      ; direct color mode attributes

     ; Mandatory information for VBE 2.0 and above
     PhysBasePtr         dd ?      ; physical address for flat frame buffer
     OffScreenMemOffset  dd ?      ; pointer to start of off screen memory
     OffScreenMemSize    dw ?      ; amount of off screen memory in 1k units
     Reserved            db 206 dup (?)  ; remainder of ModeInfoBlock
     ModeInfoBlock ends

     The ModeAttributes field describes certain important characteristics
     of the graphics mode.

     The ModeAttributes field is defined as follows:

     D0   =    Mode supported by hardware configuration
          0 =  Mode not supported in hardware
          1 =  Mode supported in hardware
     D1   =    1 (Reserved)
     D2   =    TTY Output functions supported by BIOS
          0 =  TTY Output functions not supported by BIOS
          1 =  TTY Output functions supported by BIOS
     D3   =    Monochrome/color mode (see note below)
          0 =  Monochrome mode
          1 =   Color mode
     D4   =    Mode type
          0 =  Text mode
          1 =  Graphics mode
     D5   =    VGA compatible mode
          0 =  Yes
          1 =  No
     D6   =    VGA compatible windowed memory mode is available
          0 =  Yes
          1 =  No
     D7   =    Linear frame buffer mode is available
          0 =  No
          1 =  Yes
     D8-D15 =  Reserved

     Bit D0 is set to indicate that this mode can be initialized in the
     present hardware configuration. This bit is reset to indicate the
     unavailability of a graphics mode if it requires a certain monitor
     type, more memory than is physically installed, etc.

     Bit D1 was used by VBE 1.0 and 1.1 to indicate that the optional
     information following the BytesPerScanLine field were present in the
     data structure.  This information became mandatory with VBE version
     1.2 and above, so D1 is no longer used and should be set to 1.  The
     Direct Color fields are valid only if the MemoryModel field is set to
     a 6 (Direct Color) or 7 (YUV).

     Bit D2 indicates whether the video BIOS has support for output
     functions like TTY output, scroll, etc. in this mode.  TTY support is
     recommended but not required for all extended text and graphic modes.
     If bit D2 is set to 1, then the INT 10h BIOS must support all of the
     standard output functions listed below.

     All of the following TTY functions must be supported when this bit is
     set:

          01   Set Cursor Size
          02   Set Cursor Position
          06   Scroll TTY window up or Blank Window
          07   Scroll TTY window down or Blank Window
          09   Write character and attribute at cursor position
          0A   Write character only at cursor position
          0E   Write character and advance cursor  

     Bit D3 is set to indicate color modes, and cleared for monochrome
     modes.

     Bit D4 is set to indicate graphics modes, and cleared for text modes.

     Note: Monochrome modes map their CRTC address at 3B4h. Color modes map
     their CRTC address at 3D4h. Monochrome modes have attributes in which
     only bit 3 (video) and bit 4 (intensity) of the attribute controller
     output are significant. Therefore, monochrome text modes have
     attributes of off, video, high intensity, blink, etc. Monochrome
     graphics modes are two plane graphics modes and have attributes of
     off, video, high intensity, and blink. Extended two color modes that
     have their CRTC address at 3D4h, are color modes with one bit per
     pixel and one plane. The standard VGA modes, 06h and 11h would be
     classified as color modes, while the standard VGA modes 07h and 0Fh
     would be classified as monochrome modes.

     Bit D5 is used to indicate if the mode is compatible with the VGA
     hardware registers and I/O ports.  If this bit is set, then the mode
     is NOT VGA compatible and no assumptions should be made about the
     availability of any VGA registers.   If clear, then the standard VGA
     I/O ports and frame buffer address defined in WinASegment and/or
     WinBSegment can be assumed.

     Bit D6 is used to indicate if the mode provides Windowing or Banking
     of the frame buffer into the frame buffer memory region specified by
     WinASegment and WinBSegment.  If set, then Windowing of the frame
     buffer is NOT possible.  If clear, then the device is capable of
     mapping the frame buffer into the segment specified in WinASegment
     and/or WinBSegment.  (This bit is used in conjunction with bit D7, see
     table following D7 for usage)

     Bit D7 indicates the presence of a Linear Frame Buffer memory model.
     If this bit is set, the display controller can be put into a flat
     memory model by setting the mode (VBE Function 02h) with the Flat
     Memory Model bit set. (This bit is used in conjunction with bit D6,
     see following table for usage)

                      +-----------+-----+-----+
                      |           | D7  | D6  |
                      +-----------+-----+-----+
                      |  Windowed |  0  |  0  |
                      |   frame   |     |     |
                      |   buffer  |     |     |
                      |    only   |     |     |
                      +-----------+-----+-----+
                      |    n/a    |  0  |  1  |
                      +-----------+-----+-----+
                      |    Both   |  1  |  0  |
                      |  Windowed |     |     |
                      |    and 4  |     |     |
                      |  Linear   |     |     |
                      +-----------+-----+-----+
                      |   Linear  |  1  |  1  |
                      |   frame   |     |     |
                      |   buffer  |     |     |
                      |    only   |     |     |
                      +-----------+-----+-----+


     The BytesPerScanLine field specifies how many full bytes are in each
     logical scanline. The logical scanline could be equal to or larger
     than the displayed scanline.

     The WinAAttributes and WinBAttributes describe the characteristics of
     the CPU windowing scheme such as whether the windows exist and are
     read/writeable, as follows:

     D0    =    Relocatable window(s) supported
           0 =  Single non-relocatable window only
           1 =  Relocatable window(s) are supported
     D1    =    Window readable
           0 =  Window is not readable
           1 =  Window is readable
     D2    =    Window writeable
           0 =  Window is not writeable
           1 =  Window is writeable
     D3-D7 =    Reserved

     Even if windowing is not supported, (bit D0 = 0 for both Window A and
     Window B), then an application can assume that the display memory
     buffer resides at the location specified by WinASegment and/or
     WinBSegment.

     WinGranularity specifies the smallest boundary, in KB, on which the
     window can be placed in the frame buffer memory. The value of this
     field is undefined if Bit D0 of the appropriate WinAttributes field is
     not set.

     WinSize specifies the size of the window in KB.

     WinASegment and WinBSegment address specify the segment addresses
     where the windows are located in the CPU address space.

     Use D14 of the Mode Number to select the Linear Buffer on a mode set
     (Function 02h).

     WinFuncPtr specifies the segment:offset of the VBE memory windowing
     function. The windowing function can be invoked either through VBE
     Function 05h, or by calling the function directly. A direct call will
     provide faster access to the hardware paging registers than using VBE
     Function 05h, and is intended to be used by high performance
     applications. If this field is NULL, then VBE Function 05h must be
     used to set the memory window when paging is supported.  This direct
     call method uses the same parameters as VBE Function 05h including AX
     and for VBE 2.0 implementations will return the correct Return Status.
     VBE 1.2 implementations and earlier, did not require the Return Status
     information to be returned.  For more information on the direct call
     method, see the notes in VBE Function 05h and the sample code in
     Appendix 5.

     The XResolution and YResolution specify the width and height in pixel
     elements or characters for this display mode. In graphics modes, these
     fields indicate the number of horizontal and vertical pixels that may
     be displayed. In text modes, these fields indicate the number of
     horizontal and vertical character positions.  The number of pixel
     positions for text modes may be calculated by multiplying the returned
     XResolution and YResolution values by the character cell width and
     height indicated in the XCharSize and YCharSize fields described
     below.

     The XCharSize and YCharSize specify the size of the character cell in
     pixels.  (This value is not zero based)  e.g. XCharSize for Mode 3
     using the 9 point font will have a value of 9.

     The NumberOfPlanes field specifies the number of memory planes
     available to software in that mode. For standard 16-color VGA
     graphics, this would be set to 4. For standard packed pixel modes, the
     field would be set to 1.  For 256-color non-chain-4 modes, where you
     need to do banking to address all pixels this value should be set to
     the number of banks required to get to all the pixels (typically this
     will be 4 or 8).

     The BitsPerPixel field specifies the total number of bits allocated to
     one pixel. For example, a standard VGA 4 Plane 16-color graphics mode
     would have a 4 in this field and a packed pixel 256-color graphics
     mode would specify 8 in this field. The number of bits per pixel per
     plane can normally be derived by dividing the BitsPerPixel field by
     the NumberOfPlanes field.

     The MemoryModel field specifies the general type of memory
     organization used in this mode. The following models have been
     defined:

     00h  =    Text mode
     01h  =    CGA graphics
     02h  =    Hercules graphics
     03h  =    Planar
     04h  =    Packed pixel
     05h  =    Non-chain 4, 256 color
     06h  =    Direct Color
     07h  =    YUV
     08h-0Fh =      Reserved, to be defined by VESA
     10h-FFh =      To be defined by OEM

     VBE Version 1.1 and earlier defined Direct Color graphics modes with
     pixel formats 1:5:5:5, 8:8:8, and 8:8:8:8  as a Packed Pixel model
     with 16, 24, and 32 bits per pixel, respectively. In VBE Version 1.2

     and later, the Direct Color modes use the Direct Color memory model
     and use the MaskSize and FieldPosition fields of the ModeInfoBlock to
     describe the pixel format. BitsPerPixel is always defined to be the
     total memory size of the pixel, in bits.

     NumberOfBanks. This is the number of banks in which the scan lines are
     grouped. The quotient from dividing the scan line number by the number
     of banks is the bank that contains the scan line and the remainder is
     the scan line number within the bank. For example, CGA graphics modes
     have two banks and Hercules graphics mode has four banks. For modes
     that don't have scanline banks (such as VGA modes 0Dh-13h), this field
     should be set to 1.

     The BankSize field specifies the size of a bank (group of scan lines)
     in units of 1 KB. For CGA and Hercules graphics modes this is 8, as
     each bank is 8192 bytes in length. For modes that don't have scanline
     banks (such as VGA modes 0Dh-13h), this field should be set to 0.

     The NumberOfImagePages field specifies the "total number minus one (-
     1)"of complete display images that will fit into the frame buffer
     memory. The application may load more than one image into the frame
     buffer memory if this field is non-zero, and move the display window
     within each of those pages.  This should only be used for determining
     the additional display pages which are available to the application;
     to determine the available off screen memory, use the
     OffScreenMemOffset and OffScreenMemSize information.

     Note: If the ModeInfoBlock is for an IBM Standard VGA mode and the
     NumberOfImagePages field contains more pages than would be found in a
     256KB implementation, the TTY support described in the ModeAttributes
     must be accurate.  i.e. if the TTY functions are claimed to be
     supported, they must be supported in all pages, not just the pages
     normally found in the 256KB implementation.

     The Reserved field has been defined to support a future VBE feature
     and will always be set to one in this version.

     The RedMaskSize, GreenMaskSize, BlueMaskSize, and RsvdMaskSize fields
     define the size, in bits, of the red, green, and blue components of a
     direct color pixel. A bit mask can be constructed from the MaskSize
     fields using simple shift arithmetic. For example, the MaskSize values
     for a Direct Color 5:6:5 mode would be 5, 6, 5, and 0, for the red,
     green, blue, and reserved fields, respectively. Note that in the YUV
     MemoryModel, the red field is used for V, the green field is used for
     Y, and the blue field is used for U. The MaskSize fields should be set
     to 0 in modes using a memory model that does not have pixels with
     component fields.

     The RedFieldPosition, GreenFieldPosition, BlueFieldPosition, and
     RsvdFieldPosition fields define the bit position within the direct
     color pixel or YUV pixel of the least significant bit of the
     respective color component. A color value can be aligned with its
     pixel field by shifting the value left by the FieldPosition. For
     example, the FieldPosition values for a Direct Color 5:6:5 mode would
     be 11, 5, 0, and 0, for the red, green, blue, and reserved fields,
     respectively. Note that in the YUV MemoryModel, the red field is used
     for V, the green field is used for Y, and the blue field is used for
     U. The FieldPosition fields should be set to 0 in modes using a memory
     model that does not have pixels with component fields.

     The DirectColorModeInfo field describes important characteristics of

     direct color modes.  Bit D0 specifies whether the color ramp of the
     DAC is fixed or programmable. If the color ramp is fixed, then it can
     not be changed. If the color ramp is programmable, it is assumed that
     the red, green, and blue lookup tables can be loaded by using VBE
     Function 09h.  Bit D1 specifies whether the bits in the Rsvd field of
     the direct color pixel can be used by the application or are reserved,
     and thus unusable.

     D0   =    Color ramp is fixed/programmable
          0 =  Color ramp is fixed
          1 =  Color ramp is programmable
     D1   =    Bits in Rsvd field are usable/reserved
          0 =  Bits in Rsvd field are reserved
          1 =  Bits in Rsvd field are usable by the application

     The PhysBasePtr is a 32 bit physical address of the start of frame
     buffer memory when the controller is in flat frame buffer memory mode.
     If this mode is not available, then this field will be zero.

     The OffScreenMemOffset is a 32 bit offset from the start of the frame
     buffer memory.  Extra off-screen memory that is needed by the
     controller may be located either before or after this off screen
     memory, be sure to check OffScreenMemSize to determine the amount of
     off-screen memory which is available to the application.

     The OffScreenMemSize contains the amount of available, contiguous off-
     screen memory in 1k units, which can be used by the application.

     Note: Version 1.1 and later VBE will zero out all unused fields in the
     Mode Information Block, always returning exactly 256 bytes. This
     facilitates upward compatibility with future versions of the standard,
     as any newly added fields will be designed such that values of zero
     will indicate nominal defaults or non-implementation of optional
     features. (For example, a field containing a bit-mask of extended
     capabilities would reflect the absence of all such capabilities.)
     Applications that wish to be backwards compatible to Version 1.0 VBE
     should pre-initialize the 256 byte buffer before calling the Return
     VBE Mode Information function.

     4.5. Function 02h  - Set VBE Mode

     This required function initializes the controller and sets a VBE mode.
     The format of VESA VBE mode numbers is described earlier in this
     document. If the mode cannot be set, the BIOS should leave the
     graphics environment unchanged and return a failure error code.

     Input:    AX   = 4F02h     Set VBE Mode
               BX   =           Desired Mode to set
                    D0-D8  =    Mode number
                    D9-D13 =    Reserved (must be 0)
                    D14    = 0  Use windowed frame buffer model
                           = 1  Use linear/flat frame buffer model
                    D15    = 0  Clear display memory
                           = 1  Don't clear display memory

     Output:   AX   =           VBE Return Status

     Note: All other registers are preserved.

     If the requested mode number is not available, then the call will
     fail, returning AH=01h to indicate the failure to the application.

     If bit D14 is set, the mode will be initialized for use with a flat
     frame buffer model.  The base address of the frame buffer can be
     determined from the extended mode information returned by VBE Function
     01h.  If D14 is set, and a linear frame buffer model is not available
     then the call will fail, returning AH=01h to the application.

     If bit D15 is not set, all reported image pages, based on Function 00h
     returned information NumberOfImagePages, will be cleared to 00h in
     graphics mode, and 20 07 in text mode.  Memory over and above the
     reported image pages will not be changed.  If bit D15 is set, then the
     contents of the frame buffer after the mode change is undefined.
     Note, the 1-byte mode numbers used in Function 00h of an IBM VGA
     compatible BIOS use D7 to signify the same thing as D15 does in this
     function.  If D7 is set for an IBM compatible mode set using this
     Function (02), this mode set will fail.  VBE aware applications must
     use the memory clear bit in D15.

     Note: VBE BIOS 2.0 implementations should also update the BIOS Data
     Area 40:87 memory clear bit so that VBE Function 03h can return this
     flag. VBE BIOS 1.2 and earlier implementations ignore the memory clear
     bit.

     Note:  This call should not set modes not listed in the list of
     supported modes.  In addition all modes (including IBM standard VGA
     modes), if listed as supported, must have ModeInfoBlock structures
     associated with them.  Required ModeInfoBlock values for the IBM
     Standard Modes are listed in Appendix 2.

     Note: If there is a failure when selecting an unsupported D14 value,
     the error return should be 02h.

     4.6. Function 03h - Return current VBE Mode

     This required function returns the current VBE mode. The format of VBE
     mode numbers is described earlier in this document.

     Input:    AX   = 4F03h   Return current VBE Mode

     Output:   AX   =         VBE Return Status
               BX   =         Current VBE mode
                    D0-D13 =  Mode number
                    D14  = 0  Windowed frame buffer model
                         = 1  Linear/flat frame buffer model
                    D15  = 0  Memory cleared at last mode set
                         = 1  Memory not cleared at last mode set

     Note: All other registers are preserved.

     Version 1.x Note: In a standard VGA BIOS, Function 0Fh (Read current
     video state) returns the current graphics mode in the AL register. In
     D7 of AL, it also returns the status of the memory clear bit (D7 of
     40:87). This bit is set if the mode was set without clearing memory.
     In this VBE function, the memory clear bit will not be returned in BX
     since the purpose of the function is to return the video mode only. If
     an application wants to obtain the memory clear bit, it should call
     the standard VGA BIOS Function 0Fh.

     Version 2.x Note:  Unlike version 1.x VBE implementations, the memory
     clear flag will be returned.  The application should NOT call the
     standard VGA BIOS Function 0Fh if the mode was set with VBE Function
     02h.

     Note: The mode number returned must be the same mode number used in
     the VBE Function 02h mode set.

     Note: This function is not guaranteed to return an accurate mode value
     if the mode set was not done with VBE Function 02h.

     4.7. Function 04h  - Save/Restore state

     This required function provides a complete mechanism to save and
     restore the display controller hardware state. The functions are a
     superset of the three subfunctions under the standard VGA BIOS
     Function 1Ch (Save/restore state) which does not guarantee that the
     extended registers of the video device are saved or restored. The
     complete hardware state (except frame buffer memory) should be
     saveable/restorable by setting the requested states mask (in the CX
     register) to 000Fh.

     Input:    AX   = 4F04h   Save/Restore state
               DL   = 00h         Return save/restore state buffer size
                    = 01h         Save state
                    = 02h         Restore state
               CX   =         Requested states
                    D0=           Save/restore controller hardware state
                    D1=           Save/restore BIOS data state
                    D2=           Save/restore DAC state
                    D3=           Save/restore Register state
               ES:BX=         Pointer to buffer  (if DL <> 00h)

     Output:   AX   =         VBE Return Status
               BX   =         Number of 64-byte blocks to hold the state
                              buffer  (if DL=00h)

     Note: All other registers are preserved.

     4.8. Function 05h - Display Window Control

     This required function sets or gets the position of the specified
     display window or page in the frame buffer memory by adjusting the
     necessary hardware paging registers.  To use this function properly,
     the software should first use VBE Function 01h (Return VBE Mode
     information) to determine the size, location and granularity of the
     windows.

     For performance reasons, it may be more efficient to call this
     function directly, without incurring the INT 10h overhead.  VBE
     Function 01h returns the segment:offset of this windowing function
     that may be called directly for this reason.  Note that a different
     entry point may be returned based upon the selected mode.  Therefore,
     it is necessary to retrieve this segment:offset specifically for each
     desired mode.

     Input:    AX   = 4F05h   VBE Display Window Control
               BH   = 00h          Set memory window
                    = 01h          Get memory window
               BL   =         Window number
                    = 00h          Window A
                    = 01h          Window B
               DX   =         Window number in video memory in window
                              granularity units  (Set Memory Window only)

     Output:   AX   =         VBE Return Status
               DX   =         Window number in window granularity units
                                   (Get Memory Window only)

     Note: In VBE 1.2 implementations, the direct far call version returns
     no Return Status information to the application. Also, in the far call
     version, the AX and DX registers will be destroyed. Therefore if AX
     and/or DX must be preserved, the application must do so prior to
     making the far call.  The application must still load the input
     arguments in BH, BL, and DX (for Set Window).  In VBE 2.0
     implementations, the BIOS will return the correct Return Status, and
     therefore the application must assume that AX and DX will be
     destroyed.

     Application Developer's Note:  This function is not intended for use
     in a linear frame buffer mode, if this function is requested, the
     function call will fail with the VBE Completion code AH=03h.

     VBE BIOS Implementation Note:  If this function is called while in a
     linear frame buffer memory model, this function must fail with
     completion code AH=03h.

     4.9. Function 06h - Set/Get Logical Scan Line Length

     This required function sets or gets the length of a logical scan line.
     This allows an application to set up a logical display memory buffer
     that is wider than the displayed area. VBE Function 07h (Set/Get
     Display Start) then allows the application to set the starting
     position that is to be displayed.

     Input:    AX   = 4F06h   VBE Set/Get Logical Scan Line Length
               BL   = 00h          Set Scan Line Length in Pixels
                    = 01h          Get Scan Line Length
                    = 02h          Set Scan Line Length in Bytes
                    = 03h          Get Maximum Scan Line Length
               CX   =         If BL=00h  Desired Width in Pixels
                              If BL=02h  Desired Width in Bytes
                              (Ignored for Get Functions)

     Output:   AX   =         VBE Return Status
               BX   =         Bytes Per Scan Line
               CX   =         Actual Pixels Per Scan Line
                              (truncated to nearest complete pixel)
               DX   =         Maximum Number of Scan Lines

     Note: The desired width in pixels or bytes may not be achievable
     because of hardware considerations.  The next larger value will be
     selected that will accommodate the desired number of pixels or bytes,
     and the actual number of pixels will be returned in CX. BX returns a
     value that when added to a pointer into display memory will point to
     the next scan line. For example, in VGA mode 13h this would be 320,
     but in mode 12h this would be 80.  DX returns the number of logical
     scan lines based upon the new scan line length and the total memory
     installed and usable in this display mode.

     Note: This function is also valid in text modes.   In text modes the
     application should convert the character line length to pixel line
     length by getting the current character cell width through the
     XCharSize field returned in ModeInfoBlock, multiplying that times the
     desired number of characters per line, and passing that value in the
     CX register.  In addition, this function will only work if the line
     length is specified in character granularity.  i.e. in 8 dot modes
     only multiples of 8 will work.  Any value which is not in character
     granularity will result in a function call failure.

     Note: On a failure to set scan line length by setting a CX value too
     large, the function will fail with error code 02h.

     Note: The value returned when BL=03h is the lesser of either the
     maximum line length that the hardware can support, or the longest scan
     line length that would support the number of lines in the current
     video mode.

     4.10.     Function 07h - Set/Get Display Start

     This required function selects the pixel to be displayed in the upper
     left corner of the display.  This function can be used to pan and
     scroll around logical screens that are larger than the displayed
     screen.  This function can also be used to rapidly switch between two
     different displayed screens for double buffered animation effects.

     Input:    AX   = 4F07h   VBE Set/Get Display Start Control
               BH   = 00h          Reserved and must be 00h
               BL   = 00h          Set Display Start
                    = 01h          Get Display Start
                    = 80h          Set Display Start during Vertical
     Retrace
               CX   =         First Displayed Pixel In Scan Line
                              (Set Display Start only)
               DX   =         First Displayed Scan Line (Set Display Start
     only)

     Output:   AX   =         VBE Return Status
               BH   =         00h Reserved and will be 0 (Get Display Start
     only)
               CX   =         First Displayed Pixel In Scan Line (Get Display
                              Start only)
               DX   =         First Displayed Scan Line (Get Display
                              Start only)

     Note:  This function is also valid in text modes.  To use this
     function in text mode, the application should convert the character
     coordinates to pixel coordinates by using XCharSize and YCharSize
     returned in the ModeInfoBlock.  If the requested Display Start
     coordinates do not allow for a full page of video memory or the
     hardware does not support memory wrapping, the Function call should
     fail and no changes should be made.  As a general case, if a requested
     Display Start is not available, fail the Function call and make no
     changes.

     4.11.     Function 08h - Set/Get DAC Palette Format

     This required function manipulates the operating mode or format of the
     DAC palette. Some DACs are configurable to provide 6 bits, 8 bits, or
     more of color definition per red, green, and blue primary colors.
     The DAC palette width is assumed to be reset to the standard VGA value
     of 6 bits per primary color during any mode set

     Input:    AX   = 4F08h   VBE Set/Get Palette Format
               BL   = 00h          Set DAC Palette Format
                    = 01h          Get DAC Palette Format
               BH   =         Desired bits of color per primary
                              (Set DAC Palette Format only)

     Output:   AX   =         VBE Return Status
               BH   =         Current number of bits of color per primary

     An application can determine if DAC switching is available by querying
     Bit D0 of the Capabilities field of the VbeInfoBlock structure
     returned by VBE Function 00h (Return Controller Information). The
     application can then attempt to set the DAC palette width to the
     desired value. If the display controller hardware is not capable of
     selecting the requested palette width, then the next lower value that
     the hardware is capable of will be selected. The resulting palette
     width is returned.

     This function will return failure code AH=03h if called in a direct
     color or YUV mode.

     4.12.     Function 09h - Set/Get Palette Data

     This required function is very important for RAMDAC's which are larger
     than a standard VGA RAMDAC.  The standard INT 10h BIOS Palette
     function calls assume standard VGA ports and VGA palette widths.  This
     function offers a palette interface that is independent of the VGA
     assumptions.


     Input:    AX   = 4F09h   VBE Load/Unload Palette Data
               BL   = 00h          Set Palette Data
                    = 01h          Get Palette Data
                    = 02h          Set Secondary Palette Data
                    = 03h          Get Secondary Palette Data
                    = 80h          Set Palette Data during Vertical Retrace
                                with Blank Bit on
               CX   =         Number of palette registers to update
               DX   =         First palette register to update
               ES:DI=         Table of palette values (see below for
     format)

     Output:   AX   =         VBE Return Status

     Format of Palette Values:   Alignment byte, Red byte, Green byte, Blue
     byte

     Note: The need for BL= 80h is for older style RAMDAC's where
     programming the RAM values during display time causes a "snow-like"
     effect on the screen.  Newer style RAMDAC's don't have this limitation
     and can easily be programmed at any time, but older RAMDAC's require
     that they be programmed during a non-display time only to stop the
     snow like effect seen when changing the DAC values.  When this is
     requested the VBE implementation will program the DAC with blanking
     on.  Check D2 of the Capabilities field returned by VBE Function 00h
     to determine if 80h should be used instead of 00h.

     Note: The need for the secondary palette is for anticipated future
     palette extensions, if a secondary palette does not exist in a
     implementation and these calls are made, the VBE implementation will
     return error code 02h.

     Note:  When in 6 bit mode, the format of the 6 bits is LSB, this is
     done for speed reasons, as the application can typically shift the
     data faster than the BIOS can.

     Note: All application should assume the DAC is defaulted to 6 bit
     mode.  The application is responsible for switching the DAC to higher
     color modes using Function 08h.

     Note: Query VBE Function 08h to determine the RAMDAC width before
     loading a new palette.

     4.13.     Function 0Ah - Return VBE Protected Mode Interface

     This required function call returns a pointer to a table that contains
     code for a 32-bit protected mode interface that can either be copied
     into local 32 bit memory space or can be executed from ROM providing
     the calling application sets all required selectors and I/O access
     correctly. This function returns a pointer (in real mode space) with
     offsets to the code fragments, and additionally returns an offset to a
     table which contains Non-VGA Port and Memory locations which an
     Application may have to have I/O access to.


     Input:    AX   = 4F0Ah   VBE 2.0 Protected Mode Interface
               BL   = 00h          Return protected mode table


     Output:   AX   =         Status
               ES   =         Real Mode Segment of Table
               DI   =         Offset of Table
               CX   =         Length of Table including protected mode code
                              (for copying purposes)


     The format of the table is as follows:

          ES:DI + 00h    Word Offset in table of Protected mode code for
                         Function 5 for Set Window Call
          ES:DI + 02h    Word Offset in table of Protected mode code for
                         Function 7 for set Display Start
          ES:DI + 04h    Word Offset in table of Protected mode code for
                         Function 9 for set Primary Palette data
          ES:DI + 06h    Word  Offset in table of Ports and Memory Locations
                         that the application may need I/O privilege for.
                         (Optional:  if unsupported this must be 0000h)
                         (See Sub-table for format)
          ES:DI + ?      Variable remainder of Table including Code


     The format of the Sub-Table (Ports and Memory locations)

          Port, Port, ... , Port, Terminate Port List with FF FF, Memory
          locations (4 bytes), Length (2 bytes), Terminate Memory List with
          FF FF.

     Example 1. For Port/Index combination 3DE/Fh and Memory locations
     DE800-DEA00h (length = 200h) the table would look like this:
          DE 03 DF 03 FF FF 00 E8 0D 00 00 02 FF FF

     Example 2. For only the ports it would look like:
          DE 03 DF 03 FF FF FF FF

     Example 3. For only the memory locations it would look like
          FF FF 00 E8 0D 00 00 02 FF FF

     Note:. All protected mode functions should end with a near RET (as
     opposed to FAR RET) to allow the application software to CALL the code
     from within the ROM.

     Note:  The Port and Memory location Sub-table does not include the
     Frame Buffer Memory location.  The Frame Buffer Memory location is
     contained within the ModeInfoBlock returned by VBE Function 01h.

     Note:  The protected mode code is assembled for a 32-bit code segment,
     when copying it, the application must copy the code to a 32-bit code
     segment.

     Note:  It is the application's responsibility to ensure that the
     selectors and segments are set up correctly.

     Note:  Currently undefined registers may be destroyed with the
     exception of ESI, EBP, DS and SS.


     Note:  Refer to Section 4.2 for information on protected mode
     considerations.

--------------------------  END OF DOCUMENT --------------------------------

