Home | History | Annotate | Download | only in vgabios
      1 VBE Display API
      2 -------------------------------------------------------------------------------------------------------------
      3   This document is part of the Bochs/VBEBios documentation,
      4   it specifies the bochs host <-> vbebios client communication.
      5   
      6   That means, the display code implementation and the vbebios code depend
      7   very heavily on each other. As such, this documents needs be synchronised
      8   between bochs CVS and the vgabios CVS.
      9   
     10   This document does not describe how the VBEBios implements the VBE2/3 spec.
     11   This document does not describe how the Bochs display code will display gfx based upon this spec.
     12 
     13 
     14 API History
     15 -----------
     16 0xb0c0            supports the following VBE_DISPI_ interfaces (present in Bochs 1.4):
     17                   VBE_DISPI_INDEX_ID
     18                   VBE_DISPI_INDEX_XRES
     19                   VBE_DISPI_INDEX_YRES
     20                   VBE_DISPI_INDEX_BPP
     21                   VBE_DISPI_INDEX_ENABLE
     22                   VBE_DISPI_INDEX_BANK
     23 
     24                   Bpp format supported is:
     25                   VBE_DISPI_BPP_8
     26 
     27 0xb0c1            supports 0xb0c0 VBE_DISPI_ interfaces, additional interfaces (present in Bochs 2.0):
     28                   VBE_DISPI_INDEX_VIRT_WIDTH
     29                   VBE_DISPI_INDEX_VIRT_HEIGHT
     30                   VBE_DISPI_INDEX_X_OFFSET
     31                   VBE_DISPI_INDEX_Y_OFFSET
     32 
     33 0xb0c2            supports 0xb0c1 VBE_DISPI_ interfaces, interfaces updated for
     34                   additional features (present in Bochs 2.1):
     35                   VBE_DISPI_INDEX_BPP supports >8bpp color depth (value = bits)
     36                   VBE_DISPI_INDEX_ENABLE supports new flags VBE_DISPI_NOCLEARMEM and VBE_DISPI_LFB_ENABLED
     37                   VBE i/o registers changed from 0xFF80/81 to 0x01CE/CF
     38 
     39 0xb0c3            supports 0xb0c2 VBE_DISPI_ interfaces, interfaces updated for
     40                   additional features:
     41                   VBE_DISPI_INDEX_ENABLE supports new flags VBE_DISPI_GETCAPS and VBE_DISPI_8BIT_DAC
     42 
     43 0xb0c4            VBE video memory increased to 8 MB
     44 
     45 
     46 History
     47 -------
     48   Version 0.6     2002 Nov 23  Jeroen Janssen
     49                   - Added LFB support
     50                   - Added Virt width, height and x,y offset
     51 
     52   Version 0.5     2002 March 08   Jeroen Janssen
     53                   - Added documentation about panic behaviour / current limits of the data values.
     54                   - Changed BPP API (in order to include future (A)RGB formats)
     55                   - Initial version (based upon extended display text of the vbe bochs display patch)
     56 
     57 
     58 Todo
     59 ----
     60   Version 0.6+    [random order]
     61                   - Add lots of different (A)RGB formats
     62   
     63 References
     64 ----------
     65   [VBE3]          VBE 3 Specification at
     66                   http://www.vesa.org/vbe3.pdf
     67 
     68   [BOCHS]         Bochs Open Source IA-32 Emulator at
     69                   http://bochs.sourceforge.net
     70 
     71   [VBEBIOS]       VBE Bios for Bochs at
     72                   http://savannah.gnu.org/projects/vgabios/
     73 
     74   [Screenshots]   Screenshots of programs using the VBE Bios at
     75                   http://japj.org/projects/bochs_plex86/screenshots.html
     76 
     77 Abbreviations
     78 -------------
     79   VBE             Vesa Bios Extension
     80   DISPI           (Bochs) Display Interface
     81   BPP             Bits Per Pixel
     82   LFB             Linear Frame Buffer
     83 
     84 
     85 #defines
     86 --------
     87 vbetables-gen.c
     88   #define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 8
     89 
     90 vbe.h
     91   #define VBE_DISPI_BANK_ADDRESS          0xA0000
     92   #define VBE_DISPI_BANK_SIZE_KB          64
     93 
     94   #define VBE_DISPI_MAX_XRES              1024
     95   #define VBE_DISPI_MAX_YRES              768
     96 
     97   #define VBE_DISPI_IOPORT_INDEX          0x01CE
     98   #define VBE_DISPI_IOPORT_DATA           0x01CF
     99 
    100   #define VBE_DISPI_INDEX_ID              0x0
    101   #define VBE_DISPI_INDEX_XRES            0x1
    102   #define VBE_DISPI_INDEX_YRES            0x2
    103   #define VBE_DISPI_INDEX_BPP             0x3
    104   #define VBE_DISPI_INDEX_ENABLE          0x4
    105   #define VBE_DISPI_INDEX_BANK            0x5
    106   #define VBE_DISPI_INDEX_VIRT_WIDTH      0x6
    107   #define VBE_DISPI_INDEX_VIRT_HEIGHT     0x7
    108   #define VBE_DISPI_INDEX_X_OFFSET        0x8
    109   #define VBE_DISPI_INDEX_Y_OFFSET        0x9
    110 
    111   #define VBE_DISPI_ID0                   0xB0C0
    112   #define VBE_DISPI_ID1                   0xB0C1
    113   #define VBE_DISPI_ID2                   0xB0C2
    114   #define VBE_DISPI_ID3                   0xB0C3
    115   #define VBE_DISPI_ID4                   0xB0C4
    116 
    117   #define VBE_DISPI_DISABLED              0x00
    118   #define VBE_DISPI_ENABLED               0x01
    119   #define VBE_DISPI_VBE_ENABLED           0x40
    120   #define VBE_DISPI_NOCLEARMEM            0x80
    121 
    122   #define VBE_DISPI_LFB_PHYSICAL_ADDRESS  0xE0000000
    123 
    124 API
    125 ---
    126   The display api works by using a index (VBE_DISPI_IOPORT_INDEX) and
    127   data (VBE_DISPI_IOPORT_DATA) ioport. One writes the index of the parameter to the index port.
    128   Next, the parameter value can be read or written.
    129 
    130 [0xb0c0]
    131   * VBE_DISPI_INDEX_ID  : WORD {R,W}
    132     This parameter can be used to detect the current display API (both bochs & vbebios).
    133     The bios writes VBE_DISPI_ID0 to the dataport and reads it back again.
    134     This way, the display code knows the vbebios 'ID' and the vbebios can check if the correct
    135     display code is present.
    136     As a result, a PANIC can be generated if an incompatible vbebios/display code combination is detected.
    137     This panic can be generated from the bochs display code (NOT the bios, see Notes).
    138 
    139     Example values: VBE_DISPI_ID0
    140 
    141   * VBE_DISPI_INDEX_XRES : WORD {R,W}
    142     This parameter can be used to read/write the vbe display X resolution (in pixels).
    143     It's illegal to set the XRES when the VBE is enabled (display code should generate PANIC).
    144 
    145     If the value written exceeds VBE_DISPI_MAX_XRES, the display code needs to generate a PANIC.
    146 
    147     Example values:   320,640,800,1024
    148 
    149   * VBE_DISPI_INDEX_YRES : WORD {R,W}
    150     This parameter can be used to read/write the vbe display Y resolution (in pixels).
    151     It's illegal to set the YRES when the VBE is enabled (display code should generate PANIC).
    152 
    153     If the value written exceeds VBE_DISPI_MAX_YRES, the display code needs to generate a PANIC.
    154 
    155     Example values:   200,400,480,600,768
    156 
    157   * VBE_DISPI_INDEX_BPP : WORD {R,W}
    158     This parameter can be used to read/write the vbe display BPP.
    159     It's illegal to set the BPP when the VBE is enabled (display code should generate PANIC).
    160 
    161     If the value written is an incompatible BPP, the display code needs to generate a PANIC.
    162 
    163     Example values:   VBE_DISPI_BPP_8
    164 
    165   * VBE_DISPI_INDEX_ENABLE : WORD {R,W}
    166     This parameter can be used to read/write the vbe ENABLED state.
    167     If the bios writes VBE_DISPI_ENABLED then the display code will setup a hostside display mode
    168     with the current XRES, YRES and BPP settings.
    169     If the bios write VBE_DISPI_DISABLED then the display code will switch back to normal vga mode behaviour.
    170 
    171     Example values: VBE_DISPI_ENABLED, VBE_DISPI_DISABLED
    172 
    173   * VBE_DISPI_INDEX_BANK : WORD {R,W}
    174     This parameter can be used to read/write the current selected BANK (at 0xA0000).
    175     This can be used for switching banks in banked mode.
    176 
    177 [0xb0c1]
    178   * VBE_DISPI_INDEX_VIRT_WIDTH : WORD {R,W}
    179     This parameter can be used to read/write the current virtual width.
    180     Upon enabling a mode, this will be set to the current xres
    181     Setting this field during enabled mode will result in the virtual width to be changed.
    182     Value will be adjusted if current setting is not possible.
    183 
    184   * VBE_DISPI_INDEX_VIRT_HEIGHT : WORD {R}
    185     This parameter can be read in order to obtain the current virtual height.
    186     This setting will be adjusted after setting a virtual width in order to stay within limit of video memory.
    187 
    188   * VBE_DISPI_INDEX_X_OFFSET : WORD {R,W}
    189     The current X offset (in pixels!) of the visible screen part.
    190     Writing a new offset will also result in a complete screen refresh.
    191 
    192   * VBE_DISPI_INDEX_Y_OFFSET : WORD {R,W}
    193     The current Y offset (in pixels!) of the visible screen part.
    194     Writing a new offset will also result in a complete screen refresh.
    195 
    196 
    197 [0xb0c2]
    198   * VBE_DISPI_INDEX_BPP : WORD {R,W}
    199     The value written is now the number of bits per pixel. A value of 0 is treated
    200     the same as 8 for backward compatibilty. These values are supported: 8, 15,
    201     16, 24 and 32. The value of 4 is not yet handled in the VBE code.
    202   * VBE_DISPI_INDEX_ENABLE : WORD {R,W}
    203     The new flag VBE_DISPI_NOCLEARMEM allows to preserve the VBE video memory.
    204     The new flag VBE_DISPI_LFB_ENABLED indicates the usage of the LFB.
    205 
    206 [0xb0c3]
    207   * VBE_DISPI_INDEX_ENABLE : WORD {R,W}
    208     If the new flag VBE_DISPI_GETCAPS is enabled, the xres, yres and bpp registers
    209     return the gui capabilities.
    210     The new flag VBE_DISPI_8BIT_DAC switches the DAC to 8 bit mode.
    211 
    212 [0xb0c4]
    213   * VBE_DISPI_TOTAL_VIDEO_MEMORY_MB set to 8 (moved to auto-generated vbetables.h)
    214 
    215 Displaying GFX (banked mode)
    216 --------------
    217   What happens is that the total screen is devided in banks of 'VBE_DISPI_BANK_SIZE_KB' KiloByte in size.
    218   If you want to set a pixel you can calculate its bank by doing:
    219 
    220     offset = pixel_x + pixel_y * resolution_x;
    221     bank = offset / 64 Kb (rounded 1.9999 -> 1)
    222 
    223     bank_pixel_pos = offset - bank * 64Kb
    224 
    225   Now you can set the current bank and put the pixel at VBE_DISPI_BANK_ADDRESS + bank_pixel_pos
    226 
    227 Displaying GFX (linear frame buffer mode)
    228 --------------
    229   NOT WRITTEN YET
    230 
    231 Notes
    232 -----
    233   * Since the XRES/YRES/BPP may not be written when VBE is enabled, if you want to switch from one VBE mode
    234     to another, you will need to disable VBE first.
    235 
    236   * Note when the bios doesn't find a valid DISPI_ID, it can disable the VBE functions. This allows people to
    237     use the same bios for both vbe enabled and disabled bochs executables.
    238