more vbe
[dosdemo] / src / dos / vbe.h
index 5854d5e..734f94d 100644 (file)
@@ -1,35 +1,30 @@
 #ifndef VBE_H_
 #define VBE_H_
 
+#include <stdio.h>
 #include "inttypes.h"
+#include "util.h"
 
-#ifdef __GNUC__
-#define PACKED __attribute__((packed))
-#else
-#define PACKED
-#endif
-
-#define VBE_ATTR_LFB   (1 << 7)
-#define VBE_MODE_LFB   (1 << 14)
-
-#pragma pack (push, 0)
+#pragma pack (push, 1)
 struct vbe_info {
-       uint8_t sig[4];
-       uint16_t version;
-       uint32_t oem_str_ptr;
-       uint8_t caps[4];                        /* capabilities */
-       uint32_t vid_mode_ptr;          /* vbefarptr to video mode list */
-       uint16_t total_mem;                     /* num of 64k mem blocks */
-       uint16_t oem_sw_rev;            /* VBE implementation software revision */
-       uint32_t oem_vendor_name_ptr;
-       uint32_t oem_product_name_ptr;
-       uint32_t oem_product_rev_ptr;
-       uint8_t reserved[222];
-       uint8_t oem_data[256];
+       char sig[4];
+       uint16_t ver;
+       char *oem_name;
+       uint32_t caps;
+       uint16_t *modes;
+       uint16_t vmem_blk;      /* video memory size in 64k blocks */
+       uint16_t oem_ver;
+       char *vendor;
+       char *product;
+       char *revstr;
+       uint16_t accel_ver;
+       uint16_t *accel_modes;
+       char reserved[216];
+       char oem_data[256];
 } PACKED;
 
 struct vbe_mode_info {
-       uint16_t mode_attr;
+       uint16_t attr;
        uint8_t wina_attr, winb_attr;
        uint16_t win_gran, win_size;
        uint16_t wina_seg, winb_seg;
@@ -48,29 +43,100 @@ struct vbe_mode_info {
        uint8_t reserved1;
 
        /* direct color fields */
-       uint8_t rmask_size, rpos;
-       uint8_t gmask_size, gpos;
-       uint8_t bmask_size, bpos;
-       uint8_t xmask_size, xpos;
+       uint8_t rsize, rpos;
+       uint8_t gsize, gpos;
+       uint8_t bsize, bpos;
+       uint8_t xsize, xpos;
        uint8_t cmode_info;             /* direct color mode attributes */
 
        /* VBE 2.0 and above */
        uint32_t fb_addr;               /* physical address of the linear framebuffer */
-       uint32_t reserved2;
-       uint16_t reserved3;
+       uint32_t os_addr;               /* phys. address of off-screen memory */
+       uint16_t os_size;               /* size in KB of off-screen memory */
 
-       uint8_t reserved4[206];
+       /* VBE 3.0 and above */
+       uint16_t lfb_scanline_bytes;
+       uint8_t banked_num_img_pages;
+       uint8_t lfb_num_img_pages;
+       uint8_t lfb_rsize, lfb_rpos;
+       uint8_t lfb_gsize, lfb_gpos;
+       uint8_t lfb_bsize, lfb_bpos;
+       uint8_t lfb_xsize, lfb_xpos;
+       uint32_t max_pixel_clock;
+
+       uint8_t reserved2[190];
 } PACKED;
 #pragma pack (pop)
 
-struct vbe_info *vbe_get_info(void);
-struct vbe_mode_info *vbe_get_mode_info(int mode);
+enum {
+       VBE_8BIT_DAC    = 0x01,
+       VBE_NON_VGA             = 0x02,
+       VBE_DAC_BLANK   = 0x04,
+       VBE_STEREO              = 0x08, /* ? */
+       VBE_ACCEL               = 0x08,
+       VBE_STEREO_VESA = 0x10, /* ? */
+       VBE_MUSTLOCK    = 0x10,
+       VBE_HWCURSOR    = 0x20,
+       VBE_HWCLIP              = 0x40,
+       VBE_TRANSP_BLT  = 0x80
+};
+
+#define VBE_VER_MAJOR(v)       (((v) >> 8) & 0xff)
+#define VBE_VER_MINOR(v)       ((v) & 0xff)
+
+/* VBE mode attribute flags (vbe_mode_info.attr) */
+enum {
+       VBE_ATTR_AVAIL          = 0x0001,
+       VBE_ATTR_OPTINFO        = 0x0002,
+       VBE_ATTR_TTY            = 0x0004,
+       VBE_ATTR_COLOR          = 0x0008,
+       VBE_ATTR_GFX            = 0x0010,
+       /* VBE 2.0 */
+       VBE_ATTR_NOTVGA         = 0x0020,
+       VBE_ATTR_BANKED         = 0x0040,
+       VBE_ATTR_LFB            = 0x0080,
+       VBE_ATTR_2XSCAN         = 0x0100,
+       /* VBE 3.0 */
+       VBE_ATTR_ILACE          = 0x0200,       /* ! */
+       VBE_ATTR_TRIPLEBUF      = 0x0400,
+       VBE_ATTR_STEREO         = 0x0800,
+       VBE_ATTR_STEREO_2FB     = 0x1000,
+       /* VBE/AF */
+       VBE_ATTR_MUSTLOCK       = 0x0200,       /* ! */
+};
+
+/* VBE memory model type (vbe_mode_info.mem_model) */
+enum {
+       VBE_TYPE_TEXT,
+       VBE_TYPE_CGA,
+       VBE_TYPE_HERCULES,
+       VBE_TYPE_PLANAR,
+       VBE_TYPE_PACKED,
+       VBE_TYPE_UNCHAIN,
+       VBE_TYPE_DIRECT,
+       VBE_TYPE_YUV
+};
+
+/* VBE window attribute (vbe_mode_info.win(a|b)_attr) */
+enum {
+       VBE_WIN_AVAIL   = 0x01,
+       VBE_WIN_RD              = 0x02,
+       VBE_WIN_WR              = 0x04
+};
 
-int vbe_set_mode(int mode);
+/* mode number flags */
+enum {
+       VBE_MODE_RATE           = 0x0800,       /* VBE 3.0+ user-specified refresh rate */
+       VBE_MODE_ACCEL          = 0x2000,       /* VBE/AF */
+       VBE_MODE_LFB            = 0x4000,       /* VBE 2.0+ */
+       VBE_MODE_PRESERVE       = 0x8000
+};
 
-int vbe_set_palette_bits(int bits);
-void vbe_set_palette(int idx, int *col, int count, int bits);
+int vbe_info(struct vbe_info *info);
+int vbe_num_modes(struct vbe_info *info);
+int vbe_mode_info(int mode, struct vbe_mode_info *minf);
 
-void print_mode_info(FILE *fp, struct vbe_mode_info *modei);
+void vbe_print_info(FILE *fp, struct vbe_info *info);
+void vbe_print_mode_info(FILE *fp, struct vbe_mode_info *minf);
 
 #endif /* VBE_H_ */