VBE Display API
-------------------------------------------------------------------------------------------------------------
  This document is part of the Bochs/VBEBios documentation,
  it specifies the bochs host <-> vbebios client communication.
  
  That means, the display code implementation and the vbebios code depend
  very heavily on each other. As such, this documents needs be synchronised
  between bochs CVS and the vgabios CVS.
  
  This document does not describe how the VBEBios implements the VBE2/3 spec.
  This document does not describe how the Bochs display code will display gfx based upon this spec.


API History
-----------
0xb0c0            supports the following VBE_DISPI_ interfaces (present in Bochs 1.4):
                  VBE_DISPI_INDEX_ID
                  VBE_DISPI_INDEX_XRES
                  VBE_DISPI_INDEX_YRES
                  VBE_DISPI_INDEX_BPP
                  VBE_DISPI_INDEX_ENABLE
                  VBE_DISPI_INDEX_BANK

                  Bpp format supported is:
                  VBE_DISPI_BPP_8

0xb0c1            supports 0xb0c0 VBE_DISPI_ interfaces, additional interfaces (present in Bochs 2.0):
                  VBE_DISPI_INDEX_VIRT_WIDTH
                  VBE_DISPI_INDEX_VIRT_HEIGHT
                  VBE_DISPI_INDEX_X_OFFSET
                  VBE_DISPI_INDEX_Y_OFFSET

0xb0c2            supports 0xb0c1 VBE_DISPI_ interfaces, interfaces updated for
                  additional features (present in Bochs 2.1):
                  VBE_DISPI_INDEX_BPP supports >8bpp color depth (value = bits)
                  VBE_DISPI_INDEX_ENABLE supports new flags VBE_DISPI_NOCLEARMEM and VBE_DISPI_LFB_ENABLED
                  VBE i/o registers changed from 0xFF80/81 to 0x01CE/CF

0xb0c3            supports 0xb0c2 VBE_DISPI_ interfaces, interfaces updated for
                  additional features:
                  VBE_DISPI_INDEX_ENABLE supports new flags VBE_DISPI_GETCAPS and VBE_DISPI_8BIT_DAC

0xb0c4            VBE video memory increased to 8 MB


History
-------
  Version 0.6     2002 Nov 23  Jeroen Janssen
                  - Added LFB support
                  - Added Virt width, height and x,y offset

  Version 0.5     2002 March 08   Jeroen Janssen
                  - Added documentation about panic behaviour / current limits of the data values.
                  - Changed BPP API (in order to include future (A)RGB formats)
                  - Initial version (based upon extended display text of the vbe bochs display patch)


Todo
----
  Version 0.6+    [random order]
                  - Add lots of different (A)RGB formats
  
References
----------
  [VBE3]          VBE 3 Specification at
                  http://www.vesa.org/vbe3.pdf

  [BOCHS]         Bochs Open Source IA-32 Emulator at
                  http://bochs.sourceforge.net

  [VBEBIOS]       VBE Bios for Bochs at
                  http://savannah.gnu.org/projects/vgabios/

  [Screenshots]   Screenshots of programs using the VBE Bios at
                  http://japj.org/projects/bochs_plex86/screenshots.html

Abbreviations
-------------
  VBE             Vesa Bios Extension
  DISPI           (Bochs) Display Interface
  BPP             Bits Per Pixel
  LFB             Linear Frame Buffer


#defines
--------
vbetables-gen.c
  #define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 8

vbe.h
  #define VBE_DISPI_BANK_ADDRESS          0xA0000
  #define VBE_DISPI_BANK_SIZE_KB          64

  #define VBE_DISPI_MAX_XRES              1024
  #define VBE_DISPI_MAX_YRES              768

  #define VBE_DISPI_IOPORT_INDEX          0x01CE
  #define VBE_DISPI_IOPORT_DATA           0x01CF

  #define VBE_DISPI_INDEX_ID              0x0
  #define VBE_DISPI_INDEX_XRES            0x1
  #define VBE_DISPI_INDEX_YRES            0x2
  #define VBE_DISPI_INDEX_BPP             0x3
  #define VBE_DISPI_INDEX_ENABLE          0x4
  #define VBE_DISPI_INDEX_BANK            0x5
  #define VBE_DISPI_INDEX_VIRT_WIDTH      0x6
  #define VBE_DISPI_INDEX_VIRT_HEIGHT     0x7
  #define VBE_DISPI_INDEX_X_OFFSET        0x8
  #define VBE_DISPI_INDEX_Y_OFFSET        0x9

  #define VBE_DISPI_ID0                   0xB0C0
  #define VBE_DISPI_ID1                   0xB0C1
  #define VBE_DISPI_ID2                   0xB0C2
  #define VBE_DISPI_ID3                   0xB0C3
  #define VBE_DISPI_ID4                   0xB0C4

  #define VBE_DISPI_DISABLED              0x00
  #define VBE_DISPI_ENABLED               0x01
  #define VBE_DISPI_VBE_ENABLED           0x40
  #define VBE_DISPI_NOCLEARMEM            0x80

  #define VBE_DISPI_LFB_PHYSICAL_ADDRESS  0xE0000000

API
---
  The display api works by using a index (VBE_DISPI_IOPORT_INDEX) and
  data (VBE_DISPI_IOPORT_DATA) ioport. One writes the index of the parameter to the index port.
  Next, the parameter value can be read or written.

[0xb0c0]
  * VBE_DISPI_INDEX_ID  : WORD {R,W}
    This parameter can be used to detect the current display API (both bochs & vbebios).
    The bios writes VBE_DISPI_ID0 to the dataport and reads it back again.
    This way, the display code knows the vbebios 'ID' and the vbebios can check if the correct
    display code is present.
    As a result, a PANIC can be generated if an incompatible vbebios/display code combination is detected.
    This panic can be generated from the bochs display code (NOT the bios, see Notes).

    Example values: VBE_DISPI_ID0

  * VBE_DISPI_INDEX_XRES : WORD {R,W}
    This parameter can be used to read/write the vbe display X resolution (in pixels).
    It's illegal to set the XRES when the VBE is enabled (display code should generate PANIC).

    If the value written exceeds VBE_DISPI_MAX_XRES, the display code needs to generate a PANIC.

    Example values:   320,640,800,1024

  * VBE_DISPI_INDEX_YRES : WORD {R,W}
    This parameter can be used to read/write the vbe display Y resolution (in pixels).
    It's illegal to set the YRES when the VBE is enabled (display code should generate PANIC).

    If the value written exceeds VBE_DISPI_MAX_YRES, the display code needs to generate a PANIC.

    Example values:   200,400,480,600,768

  * VBE_DISPI_INDEX_BPP : WORD {R,W}
    This parameter can be used to read/write the vbe display BPP.
    It's illegal to set the BPP when the VBE is enabled (display code should generate PANIC).

    If the value written is an incompatible BPP, the display code needs to generate a PANIC.

    Example values:   VBE_DISPI_BPP_8

  * VBE_DISPI_INDEX_ENABLE : WORD {R,W}
    This parameter can be used to read/write the vbe ENABLED state.
    If the bios writes VBE_DISPI_ENABLED then the display code will setup a hostside display mode
    with the current XRES, YRES and BPP settings.
    If the bios write VBE_DISPI_DISABLED then the display code will switch back to normal vga mode behaviour.

    Example values: VBE_DISPI_ENABLED, VBE_DISPI_DISABLED

  * VBE_DISPI_INDEX_BANK : WORD {R,W}
    This parameter can be used to read/write the current selected BANK (at 0xA0000).
    This can be used for switching banks in banked mode.

[0xb0c1]
  * VBE_DISPI_INDEX_VIRT_WIDTH : WORD {R,W}
    This parameter can be used to read/write the current virtual width.
    Upon enabling a mode, this will be set to the current xres
    Setting this field during enabled mode will result in the virtual width to be changed.
    Value will be adjusted if current setting is not possible.

  * VBE_DISPI_INDEX_VIRT_HEIGHT : WORD {R}
    This parameter can be read in order to obtain the current virtual height.
    This setting will be adjusted after setting a virtual width in order to stay within limit of video memory.

  * VBE_DISPI_INDEX_X_OFFSET : WORD {R,W}
    The current X offset (in pixels!) of the visible screen part.
    Writing a new offset will also result in a complete screen refresh.

  * VBE_DISPI_INDEX_Y_OFFSET : WORD {R,W}
    The current Y offset (in pixels!) of the visible screen part.
    Writing a new offset will also result in a complete screen refresh.


[0xb0c2]
  * VBE_DISPI_INDEX_BPP : WORD {R,W}
    The value written is now the number of bits per pixel. A value of 0 is treated
    the same as 8 for backward compatibilty. These values are supported: 8, 15,
    16, 24 and 32. The value of 4 is not yet handled in the VBE code.
  * VBE_DISPI_INDEX_ENABLE : WORD {R,W}
    The new flag VBE_DISPI_NOCLEARMEM allows to preserve the VBE video memory.
    The new flag VBE_DISPI_LFB_ENABLED indicates the usage of the LFB.

[0xb0c3]
  * VBE_DISPI_INDEX_ENABLE : WORD {R,W}
    If the new flag VBE_DISPI_GETCAPS is enabled, the xres, yres and bpp registers
    return the gui capabilities.
    The new flag VBE_DISPI_8BIT_DAC switches the DAC to 8 bit mode.

[0xb0c4]
  * VBE_DISPI_TOTAL_VIDEO_MEMORY_MB set to 8 (moved to auto-generated vbetables.h)

Displaying GFX (banked mode)
--------------
  What happens is that the total screen is devided in banks of 'VBE_DISPI_BANK_SIZE_KB' KiloByte in size.
  If you want to set a pixel you can calculate its bank by doing:

    offset = pixel_x + pixel_y * resolution_x;
    bank = offset / 64 Kb (rounded 1.9999 -> 1)

    bank_pixel_pos = offset - bank * 64Kb

  Now you can set the current bank and put the pixel at VBE_DISPI_BANK_ADDRESS + bank_pixel_pos

Displaying GFX (linear frame buffer mode)
--------------
  NOT WRITTEN YET

Notes
-----
  * Since the XRES/YRES/BPP may not be written when VBE is enabled, if you want to switch from one VBE mode
    to another, you will need to disable VBE first.

  * Note when the bios doesn't find a valid DISPI_ID, it can disable the VBE functions. This allows people to
    use the same bios for both vbe enabled and disabled bochs executables.