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.
