X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=blobdiff_plain;f=src%2Fdos%2Fvbe.h;h=734f94d20481f793a8863fa0a198cd0e6b3bd465;hp=5854d5e6c88d45d8289ba1e7bd29a0e6d35c9fa9;hb=05672cb8988cd30a798ea3fbce124695fc76f09c;hpb=0165ec15f868a16a70b56ada2d42db0cb69ea193 diff --git a/src/dos/vbe.h b/src/dos/vbe.h index 5854d5e..734f94d 100644 --- a/src/dos/vbe.h +++ b/src/dos/vbe.h @@ -1,35 +1,30 @@ #ifndef VBE_H_ #define VBE_H_ +#include #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_ */