1#ifndef vbe_h_included 2#define vbe_h_included 3 4#include "vgabios.h" 5 6// DISPI helper function 7void dispi_set_enable(enable); 8 9/** VBE int10 API 10 * 11 * See the function descriptions in vbe.c for more information 12 */ 13Boolean vbe_has_vbe_display(); 14void vbe_biosfn_return_controller_information(AX, ES, DI); 15void vbe_biosfn_return_mode_information(AX, CX, ES, DI); 16void vbe_biosfn_set_mode(AX, BX, ES, DI); 17void vbe_biosfn_save_restore_state(AX, CX, DX, ES, BX); 18void vbe_biosfn_set_get_palette_data(AX); 19void vbe_biosfn_return_protected_mode_interface(AX); 20 21// The official VBE Information Block 22typedef struct VbeInfoBlock 23{ 24 Bit8u VbeSignature[4]; 25 Bit16u VbeVersion; 26 Bit16u OemStringPtr_Off; 27 Bit16u OemStringPtr_Seg; 28 Bit8u Capabilities[4]; 29 Bit16u VideoModePtr_Off; 30 Bit16u VideoModePtr_Seg; 31 Bit16u TotalMemory; 32 Bit16u OemSoftwareRev; 33 Bit16u OemVendorNamePtr_Off; 34 Bit16u OemVendorNamePtr_Seg; 35 Bit16u OemProductNamePtr_Off; 36 Bit16u OemProductNamePtr_Seg; 37 Bit16u OemProductRevPtr_Off; 38 Bit16u OemProductRevPtr_Seg; 39 Bit16u Reserved[111]; // used for dynamicly generated mode list 40 Bit8u OemData[256]; 41} VbeInfoBlock; 42 43 44// This one is for compactly storing a static list of mode info blocks 45// this saves us 189 bytes per block 46typedef struct ModeInfoBlockCompact 47{ 48// Mandatory information for all VBE revisions 49 Bit16u ModeAttributes; 50 Bit8u WinAAttributes; 51 Bit8u WinBAttributes; 52 Bit16u WinGranularity; 53 Bit16u WinSize; 54 Bit16u WinASegment; 55 Bit16u WinBSegment; 56 Bit32u WinFuncPtr; 57 Bit16u BytesPerScanLine; 58// Mandatory information for VBE 1.2 and above 59 Bit16u XResolution; 60 Bit16u YResolution; 61 Bit8u XCharSize; 62 Bit8u YCharSize; 63 Bit8u NumberOfPlanes; 64 Bit8u BitsPerPixel; 65 Bit8u NumberOfBanks; 66 Bit8u MemoryModel; 67 Bit8u BankSize; 68 Bit8u NumberOfImagePages; 69 Bit8u Reserved_page; 70// Direct Color fields (required for direct/6 and YUV/7 memory models) 71 Bit8u RedMaskSize; 72 Bit8u RedFieldPosition; 73 Bit8u GreenMaskSize; 74 Bit8u GreenFieldPosition; 75 Bit8u BlueMaskSize; 76 Bit8u BlueFieldPosition; 77 Bit8u RsvdMaskSize; 78 Bit8u RsvdFieldPosition; 79 Bit8u DirectColorModeInfo; 80// Mandatory information for VBE 2.0 and above 81 Bit32u PhysBasePtr; 82 Bit32u OffScreenMemOffset; 83 Bit16u OffScreenMemSize; 84// Mandatory information for VBE 3.0 and above 85 Bit16u LinBytesPerScanLine; 86 Bit8u BnkNumberOfPages; 87 Bit8u LinNumberOfPages; 88 Bit8u LinRedMaskSize; 89 Bit8u LinRedFieldPosition; 90 Bit8u LinGreenMaskSize; 91 Bit8u LinGreenFieldPosition; 92 Bit8u LinBlueMaskSize; 93 Bit8u LinBlueFieldPosition; 94 Bit8u LinRsvdMaskSize; 95 Bit8u LinRsvdFieldPosition; 96 Bit32u MaxPixelClock; 97// Bit8u Reserved[189]; // DO NOT PUT THIS IN HERE because of Compact Mode Info storage in bios 98} ModeInfoBlockCompact; 99 100typedef struct ModeInfoBlock 101{ 102// Mandatory information for all VBE revisions 103 Bit16u ModeAttributes; 104 Bit8u WinAAttributes; 105 Bit8u WinBAttributes; 106 Bit16u WinGranularity; 107 Bit16u WinSize; 108 Bit16u WinASegment; 109 Bit16u WinBSegment; 110 Bit32u WinFuncPtr; 111 Bit16u BytesPerScanLine; 112// Mandatory information for VBE 1.2 and above 113 Bit16u XResolution; 114 Bit16u YResolution; 115 Bit8u XCharSize; 116 Bit8u YCharSize; 117 Bit8u NumberOfPlanes; 118 Bit8u BitsPerPixel; 119 Bit8u NumberOfBanks; 120 Bit8u MemoryModel; 121 Bit8u BankSize; 122 Bit8u NumberOfImagePages; 123 Bit8u Reserved_page; 124// Direct Color fields (required for direct/6 and YUV/7 memory models) 125 Bit8u RedMaskSize; 126 Bit8u RedFieldPosition; 127 Bit8u GreenMaskSize; 128 Bit8u GreenFieldPosition; 129 Bit8u BlueMaskSize; 130 Bit8u BlueFieldPosition; 131 Bit8u RsvdMaskSize; 132 Bit8u RsvdFieldPosition; 133 Bit8u DirectColorModeInfo; 134// Mandatory information for VBE 2.0 and above 135 Bit32u PhysBasePtr; 136 Bit32u OffScreenMemOffset; 137 Bit16u OffScreenMemSize; 138// Mandatory information for VBE 3.0 and above 139 Bit16u LinBytesPerScanLine; 140 Bit8u BnkNumberOfPages; 141 Bit8u LinNumberOfPages; 142 Bit8u LinRedMaskSize; 143 Bit8u LinRedFieldPosition; 144 Bit8u LinGreenMaskSize; 145 Bit8u LinGreenFieldPosition; 146 Bit8u LinBlueMaskSize; 147 Bit8u LinBlueFieldPosition; 148 Bit8u LinRsvdMaskSize; 149 Bit8u LinRsvdFieldPosition; 150 Bit32u MaxPixelClock; 151 Bit8u Reserved[189]; 152} ModeInfoBlock; 153 154typedef struct ModeInfoListItem 155{ 156 Bit16u mode; 157 ModeInfoBlockCompact info; 158} ModeInfoListItem; 159 160// VBE Return Status Info 161// AL 162#define VBE_RETURN_STATUS_SUPPORTED 0x4F 163#define VBE_RETURN_STATUS_UNSUPPORTED 0x00 164// AH 165#define VBE_RETURN_STATUS_SUCCESSFULL 0x00 166#define VBE_RETURN_STATUS_FAILED 0x01 167#define VBE_RETURN_STATUS_NOT_SUPPORTED 0x02 168#define VBE_RETURN_STATUS_INVALID 0x03 169 170// VBE Mode Numbers 171 172#define VBE_MODE_VESA_DEFINED 0x0100 173#define VBE_MODE_REFRESH_RATE_USE_CRTC 0x0800 174#define VBE_MODE_LINEAR_FRAME_BUFFER 0x4000 175#define VBE_MODE_PRESERVE_DISPLAY_MEMORY 0x8000 176 177// VBE GFX Mode Number 178 179#define VBE_VESA_MODE_640X400X8 0x100 180#define VBE_VESA_MODE_640X480X8 0x101 181#define VBE_VESA_MODE_800X600X4 0x102 182#define VBE_VESA_MODE_800X600X8 0x103 183#define VBE_VESA_MODE_1024X768X4 0x104 184#define VBE_VESA_MODE_1024X768X8 0x105 185#define VBE_VESA_MODE_1280X1024X4 0x106 186#define VBE_VESA_MODE_1280X1024X8 0x107 187#define VBE_VESA_MODE_320X200X1555 0x10D 188#define VBE_VESA_MODE_320X200X565 0x10E 189#define VBE_VESA_MODE_320X200X888 0x10F 190#define VBE_VESA_MODE_640X480X1555 0x110 191#define VBE_VESA_MODE_640X480X565 0x111 192#define VBE_VESA_MODE_640X480X888 0x112 193#define VBE_VESA_MODE_800X600X1555 0x113 194#define VBE_VESA_MODE_800X600X565 0x114 195#define VBE_VESA_MODE_800X600X888 0x115 196#define VBE_VESA_MODE_1024X768X1555 0x116 197#define VBE_VESA_MODE_1024X768X565 0x117 198#define VBE_VESA_MODE_1024X768X888 0x118 199#define VBE_VESA_MODE_1280X1024X1555 0x119 200#define VBE_VESA_MODE_1280X1024X565 0x11A 201#define VBE_VESA_MODE_1280X1024X888 0x11B 202#define VBE_VESA_MODE_1600X1200X8 0x11C 203#define VBE_VESA_MODE_1600X1200X1555 0x11D 204#define VBE_VESA_MODE_1600X1200X565 0x11E 205#define VBE_VESA_MODE_1600X1200X888 0x11F 206 207// BOCHS/PLEX86 'own' mode numbers 208#define VBE_OWN_MODE_320X200X8888 0x140 209#define VBE_OWN_MODE_640X400X8888 0x141 210#define VBE_OWN_MODE_640X480X8888 0x142 211#define VBE_OWN_MODE_800X600X8888 0x143 212#define VBE_OWN_MODE_1024X768X8888 0x144 213#define VBE_OWN_MODE_1280X1024X8888 0x145 214#define VBE_OWN_MODE_320X200X8 0x146 215#define VBE_OWN_MODE_1600X1200X8888 0x147 216#define VBE_OWN_MODE_1152X864X8 0x148 217#define VBE_OWN_MODE_1152X864X1555 0x149 218#define VBE_OWN_MODE_1152X864X565 0x14a 219#define VBE_OWN_MODE_1152X864X888 0x14b 220#define VBE_OWN_MODE_1152X864X8888 0x14c 221 222#define VBE_VESA_MODE_END_OF_LIST 0xFFFF 223 224// Capabilities 225 226#define VBE_CAPABILITY_8BIT_DAC 0x0001 227#define VBE_CAPABILITY_NOT_VGA_COMPATIBLE 0x0002 228#define VBE_CAPABILITY_RAMDAC_USE_BLANK_BIT 0x0004 229#define VBE_CAPABILITY_STEREOSCOPIC_SUPPORT 0x0008 230#define VBE_CAPABILITY_STEREO_VIA_VESA_EVC 0x0010 231 232// Mode Attributes 233 234#define VBE_MODE_ATTRIBUTE_SUPPORTED 0x0001 235#define VBE_MODE_ATTRIBUTE_EXTENDED_INFORMATION_AVAILABLE 0x0002 236#define VBE_MODE_ATTRIBUTE_TTY_BIOS_SUPPORT 0x0004 237#define VBE_MODE_ATTRIBUTE_COLOR_MODE 0x0008 238#define VBE_MODE_ATTRIBUTE_GRAPHICS_MODE 0x0010 239#define VBE_MODE_ATTRIBUTE_NOT_VGA_COMPATIBLE 0x0020 240#define VBE_MODE_ATTRIBUTE_NO_VGA_COMPATIBLE_WINDOW 0x0040 241#define VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE 0x0080 242#define VBE_MODE_ATTRIBUTE_DOUBLE_SCAN_MODE 0x0100 243#define VBE_MODE_ATTRIBUTE_INTERLACE_MODE 0x0200 244#define VBE_MODE_ATTRIBUTE_HARDWARE_TRIPLE_BUFFER 0x0400 245#define VBE_MODE_ATTRIBUTE_HARDWARE_STEREOSCOPIC_DISPLAY 0x0800 246#define VBE_MODE_ATTRIBUTE_DUAL_DISPLAY_START_ADDRESS 0x1000 247 248#define VBE_MODE_ATTTRIBUTE_LFB_ONLY ( VBE_MODE_ATTRIBUTE_NO_VGA_COMPATIBLE_WINDOW | VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE ) 249 250// Window attributes 251 252#define VBE_WINDOW_ATTRIBUTE_RELOCATABLE 0x01 253#define VBE_WINDOW_ATTRIBUTE_READABLE 0x02 254#define VBE_WINDOW_ATTRIBUTE_WRITEABLE 0x04 255 256// Memory model 257 258#define VBE_MEMORYMODEL_TEXT_MODE 0x00 259#define VBE_MEMORYMODEL_CGA_GRAPHICS 0x01 260#define VBE_MEMORYMODEL_HERCULES_GRAPHICS 0x02 261#define VBE_MEMORYMODEL_PLANAR 0x03 262#define VBE_MEMORYMODEL_PACKED_PIXEL 0x04 263#define VBE_MEMORYMODEL_NON_CHAIN_4_256 0x05 264#define VBE_MEMORYMODEL_DIRECT_COLOR 0x06 265#define VBE_MEMORYMODEL_YUV 0x07 266 267// DirectColorModeInfo 268 269#define VBE_DIRECTCOLOR_COLOR_RAMP_PROGRAMMABLE 0x01 270#define VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE 0x02 271 272// GUEST <-> HOST Communication API 273 274// FIXME: either dynamicly ask host for this or put somewhere high in physical memory 275// like 0xE0000000 276 277 278 #define VBE_DISPI_BANK_ADDRESS 0xA0000 279 #define VBE_DISPI_BANK_SIZE_KB 64 280 281 #define VBE_DISPI_MAX_XRES 2560 282 #define VBE_DISPI_MAX_YRES 1600 283 284 #define VBE_DISPI_IOPORT_INDEX 0x01CE 285 #define VBE_DISPI_IOPORT_DATA 0x01CF 286 287 #define VBE_DISPI_INDEX_ID 0x0 288 #define VBE_DISPI_INDEX_XRES 0x1 289 #define VBE_DISPI_INDEX_YRES 0x2 290 #define VBE_DISPI_INDEX_BPP 0x3 291 #define VBE_DISPI_INDEX_ENABLE 0x4 292 #define VBE_DISPI_INDEX_BANK 0x5 293 #define VBE_DISPI_INDEX_VIRT_WIDTH 0x6 294 #define VBE_DISPI_INDEX_VIRT_HEIGHT 0x7 295 #define VBE_DISPI_INDEX_X_OFFSET 0x8 296 #define VBE_DISPI_INDEX_Y_OFFSET 0x9 297 #define VBE_DISPI_INDEX_VIDEO_MEMORY_64K 0xa 298 299 #define VBE_DISPI_ID0 0xB0C0 300 #define VBE_DISPI_ID1 0xB0C1 301 #define VBE_DISPI_ID2 0xB0C2 302 #define VBE_DISPI_ID3 0xB0C3 303 #define VBE_DISPI_ID4 0xB0C4 304 #define VBE_DISPI_ID5 0xB0C5 305 306 #define VBE_DISPI_DISABLED 0x00 307 #define VBE_DISPI_ENABLED 0x01 308 #define VBE_DISPI_GETCAPS 0x02 309 #define VBE_DISPI_8BIT_DAC 0x20 310 #define VBE_DISPI_LFB_ENABLED 0x40 311 #define VBE_DISPI_NOCLEARMEM 0x80 312 313 #define VBE_DISPI_LFB_PHYSICAL_ADDRESS 0xE0000000 314 315#endif 316