- new function dispi_get_bpp()
[vgabios.git] / vbe_display_api.txt
blob4bd449ccf55bb7675b36ae6fc79aba26ec881c15
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 hwo 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.
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
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
33 0xb0c2            supports 0xb0c1 VBE_DISPI_ interfaces, interfaces updated for additional features:
34                   VBE_DISPI_INDEX_BPP supports >8bpp color depth (value = bits)
35                   VBE_DISPI_INDEX_ENABLE supports new flag VBE_DISPI_NOCLEARMEM
37                   
39 History
40 -------
41   Version 0.6     (UNRELEASED)  Jeroen Janssen
42                   - Added LFB support
43                   - Added Virt width, height and x,y offset
44                   
45   Version 0.5     2002 March 08   Jeroen Janssen
46                   - Added documentation about panic behaviour / current limits of the data values.
47                   - Changed BPP API (in order to include future (A)RGB formats)
48                   - Initial version (based upon extended display text of the vbe bochs display patch)
51 Todo
52 ----
53   Version 0.6     - add virtual width, height, x offset, y offset in bios & bochs
54                     (for set/get logical scan line length andset/get display start)
55   
56   Version 0.6+    [random order]
57                   - Add lots of different (A)RGB formats
58   
59 References
60 ----------
61   [VBE3]          VBE 3 Specification at 
62                   http://www.vesa.org/vbe3.pdf
63                   
64   [BOCHS]         Bochs Open Source IA-32 Emulator at 
65                   http://bochs.sourceforge.net
66                   
67   [VBEBIOS]       VBE Bios for Bochs at 
68                   http://savannah.gnu.org/projects/vgabios/
69                   
70   [Screenshots]   Screenshots of programs using the VBE Bios at 
71                   http://japj.org/projects/bochs_plex86/screenshots.html
73 Abbreviations
74 -------------
75   VBE             Vesa Bios Extension
76   DISPI           (Bochs) Display Interface
77   BPP             Bits Per Pixel
78   LFB             Linear Frame Buffer
81 #defines
82 --------
83   #define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 4
84   #define VBE_DISPI_BANK_ADDRESS          0xA0000
85   #define VBE_DISPI_BANK_SIZE_KB          64
86   
87   #define VBE_DISPI_MAX_XRES              1024
88   #define VBE_DISPI_MAX_YRES              768
89   
90   #define VBE_DISPI_IOPORT_INDEX          0xFF80
91   #define VBE_DISPI_IOPORT_DATA           0xFF81
92   
93   #define VBE_DISPI_INDEX_ID              0x0
94   #define VBE_DISPI_INDEX_XRES            0x1
95   #define VBE_DISPI_INDEX_YRES            0x2
96   #define VBE_DISPI_INDEX_BPP             0x3
97   #define VBE_DISPI_INDEX_ENABLE          0x4
98   #define VBE_DISPI_INDEX_BANK            0x5
99   #define VBE_DISPI_INDEX_VIRT_WIDTH      0x6
100   #define VBE_DISPI_INDEX_VIRT_HEIGHT     0x7
101   #define VBE_DISPI_INDEX_X_OFFSET        0x8
102   #define VBE_DISPI_INDEX_Y_OFFSET        0x9
103   
104   #define VBE_DISPI_ID0                   0xB0C0
105   #define VBE_DISPI_ID1                   0xB0C1
106   #define VBE_DISPI_ID2                   0xB0C2
107   
108   #define VBE_DISPI_DISABLED              0x00
109   #define VBE_DISPI_ENABLED               0x01
110   #define VBE_DISPI_NOCLEARMEM            0x80
111   
112   #define VBE_DISPI_LFB_PHYSICAL_ADDRESS  0xE0000000
116   The display api works by using a index (VBE_DISPI_IOPORT_INDEX) and 
117   data (VBE_DISPI_IOPORT_DATA) ioport. One writes the index of the parameter to the index port.
118   Next, the parameter value can be read or written.
120 [0xb0c0]
121   * VBE_DISPI_INDEX_ID  : WORD {R,W}
122     This parameter can be used to detect the current display API (both bochs & vbebios).
123     The bios writes VBE_DISPI_ID0 to the dataport and reads it back again.
124     This way, the display code knows the vbebios 'ID' and the vbebios can check if the correct
125     display code is present.
126     As a result, a PANIC can be generated if an incompatible vbebios/display code combination is detected.
127     This panic can be generated from the bochs display code (NOT the bios, see Notes).
128     
129     Example values: VBE_DISPI_ID0
130         
131   * VBE_DISPI_INDEX_XRES : WORD {R,W}
132     This parameter can be used to read/write the vbe display X resolution (in pixels).
133     It's illegal to set the XRES when the VBE is enabled (display code should generate PANIC).
134     
135     If the value written exceeds VBE_DISPI_MAX_XRES, the display code needs to generate a PANIC.
136     
137     Example values:   320,640,800,1024
139   * VBE_DISPI_INDEX_YRES : WORD {R,W}
140     This parameter can be used to read/write the vbe display Y resolution (in pixels).
141     It's illegal to set the YRES when the VBE is enabled (display code should generate PANIC).
142     
143     If the value written exceeds VBE_DISPI_MAX_YRES, the display code needs to generate a PANIC.
144     
145     Example values:   200,400,480,600,768
146   
147   * VBE_DISPI_INDEX_BPP : WORD {R,W}
148     This parameter can be used to read/write the vbe display BPP.
149     It's illegal to set the BPP when the VBE is enabled (display code should generate PANIC).
150     
151     If the value written is an incompatible BPP, the display code needs to generate a PANIC.
152     
153     Example values:   VBE_DISPI_BPP_8
154     
155   * VBE_DISPI_INDEX_ENABLE : WORD {R,W}
156     This parameter can be used to read/write the vbe ENABLED state.
157     If the bios writes VBE_DISPI_ENABLED then the display code will setup a hostside display mode 
158     with the current XRES, YRES and BPP settings.
159     If the bios write VBE_DISPI_DISABLED then the display code will switch back to normal vga mode behaviour.
160     
161     Example values: VBE_DISPI_ENABLED, VBE_DISPI_DISABLED
162   
163   * VBE_DISPI_INDEX_BANK : WORD {R,W}
164     This parameter can be used to read/write the current selected BANK (at 0xA0000).
165     This can be used for switching banks in banked mode.
167 [0xb0c1]
168   * VBE_DISPI_INDEX_VIRT_WIDTH : WORD {R,W}
169     This parameter can be used to read/write the current virtual width.
170     Upon enabling a mode, this will be set to the current xres
171     Setting this field during enabled mode will result in the virtual width to be changed.
172     Value will be adjusted if current setting is not possible.
173   
174   * VBE_DISPI_INDEX_VIRT_HEIGHT : WORD {R}
175     This parameter can be read in order to obtain the current virtual height.
176     This setting will be adjusted after setting a virtual width in order to stay within limit of video memory.
177     
178   * VBE_DISPI_INDEX_X_OFFSET : WORD {R,W}
179     The current X offset (in pixels!) of the visible screen part.
180     Writing a new offset will also result in a complete screen refresh.
182   * VBE_DISPI_INDEX_Y_OFFSET : WORD {R,W}
183     The current Y offset (in pixels!) of the visible screen part.
184     Writing a new offset will also result in a complete screen refresh.
187 [0xb0c2]
188   * VBE_DISPI_INDEX_BPP : WORD {R,W}
189     The value written is now the number of bits per pixel. A value of 0 is treated
190     the same as 8 for backward compatibilty. These values are supported: 8, 15,
191     16, 24 and 32. The value of 4 is not handled in the VBE code.
192   * VBE_DISPI_INDEX_ENABLE : WORD {R,W}
193     The new flag VBE_DISPI_NOCLEARMEM allows to preserve the VBE video memory.
195 Displaying GFX
196 --------------
197   Currently Linear Frame Buffer support is not available yet.
198   The only other way of displaying (VBE) graphics is using banked modi.
199   
200   What happens is that the total screen is devided in banks of 'VBE_DISPI_BANK_SIZE_KB' KiloByte in size.
201   If you want to set a pixel you can calculate its bank by doing:
202   
203     offset = pixel_x + pixel_y * resolution_x;
204     bank = offset / 64 Kb (rounded 1.9999 -> 1)
205     
206     bank_pixel_pos = offset - bank * 64Kb
207     
208   Now you can set the current bank and put the pixel at VBE_DISPI_BANK_ADDRESS + bank_pixel_pos  
211 Notes
212 ----- 
213   * Since the XRES/YRES/BPP may not be written when VBE is enabled, if you want to switch from one VBE mode
214     to another, you will need to disable VBE first.
215   
216   * Note when the bios doesn't find a valid DISPI_ID, it can disable the VBE functions. This allows people to 
217     use the same bios for both vbe enabled and disabled bochs executables.