1236b28bcf90890f00256894aa8bdc125924e8c4
[dosdemo] / src / dos / vbe.h
1 #ifndef VBE_H_
2 #define VBE_H_
3
4 #include <stdio.h>
5 #include "inttypes.h"
6 #include "util.h"
7
8 #pragma pack (push, 1)
9 struct vbe_info {
10         char sig[4];
11         uint16_t ver;
12         char *oem_name;
13         uint32_t caps;
14         uint16_t *modes;
15         uint16_t vmem_blk;      /* video memory size in 64k blocks */
16         uint16_t oem_ver;
17         char *vendor;
18         char *product;
19         char *revstr;
20         uint16_t accel_ver;
21         uint16_t *accel_modes;
22         char reserved[216];
23         char oem_data[256];
24 } PACKED;
25
26 struct vbe_mode_info {
27         uint16_t attr;
28         uint8_t wina_attr, winb_attr;
29         uint16_t win_gran, win_size;
30         uint16_t wina_seg, winb_seg;
31         uint32_t win_func;
32         uint16_t scanline_bytes;
33
34         /* VBE 1.2 and above */
35         uint16_t xres, yres;
36         uint8_t xcharsz, ycharsz;
37         uint8_t num_planes;
38         uint8_t bpp;
39         uint8_t num_banks;
40         uint8_t mem_model;
41         uint8_t bank_size;              /* bank size in KB */
42         uint8_t num_img_pages;
43         uint8_t reserved1;
44
45         /* direct color fields */
46         uint8_t rsize, rpos;
47         uint8_t gsize, gpos;
48         uint8_t bsize, bpos;
49         uint8_t xsize, xpos;
50         uint8_t cmode_info;             /* direct color mode attributes */
51
52         /* VBE 2.0 and above */
53         uint32_t fb_addr;               /* physical address of the linear framebuffer */
54         uint32_t os_addr;               /* phys. address of off-screen memory */
55         uint16_t os_size;               /* size in KB of off-screen memory */
56
57         /* VBE 3.0 and above */
58         uint16_t lfb_scanline_bytes;
59         uint8_t banked_num_img_pages;
60         uint8_t lfb_num_img_pages;
61         uint8_t lfb_rsize, lfb_rpos;
62         uint8_t lfb_gsize, lfb_gpos;
63         uint8_t lfb_bsize, lfb_bpos;
64         uint8_t lfb_xsize, lfb_xpos;
65         uint32_t max_pixel_clock;
66
67         char reserved2[190];
68 } PACKED;
69
70 struct vbe_crtc_info {
71         uint16_t htotal, hsync_start, hsync_end;
72         uint16_t vtotal, vsync_start, vsync_end;
73         uint8_t flags;
74         uint32_t pixel_clock;
75         uint16_t rate_centihz;  /* refresh rate in 1/100 hz (pck / (htotal * vtotal)) */
76         char reserved[40];
77 } PACKED;
78 #pragma pack (pop)
79
80 enum {
81         VBE_8BIT_DAC    = 0x01,
82         VBE_NON_VGA             = 0x02,
83         VBE_DAC_BLANK   = 0x04,
84         VBE_STEREO              = 0x08, /* ? */
85         VBE_ACCEL               = 0x08,
86         VBE_STEREO_VESA = 0x10, /* ? */
87         VBE_MUSTLOCK    = 0x10,
88         VBE_HWCURSOR    = 0x20,
89         VBE_HWCLIP              = 0x40,
90         VBE_TRANSP_BLT  = 0x80
91 };
92
93 #define VBE_VER_MAJOR(v)        (((v) >> 8) & 0xff)
94 #define VBE_VER_MINOR(v)        ((v) & 0xff)
95
96 /* VBE mode attribute flags (vbe_mode_info.attr) */
97 enum {
98         VBE_ATTR_AVAIL          = 0x0001,
99         VBE_ATTR_OPTINFO        = 0x0002,
100         VBE_ATTR_TTY            = 0x0004,
101         VBE_ATTR_COLOR          = 0x0008,
102         VBE_ATTR_GFX            = 0x0010,
103         /* VBE 2.0 */
104         VBE_ATTR_NOTVGA         = 0x0020,
105         VBE_ATTR_BANKED         = 0x0040,
106         VBE_ATTR_LFB            = 0x0080,
107         VBE_ATTR_DBLSCAN        = 0x0100,
108         /* VBE 3.0 */
109         VBE_ATTR_ILACE          = 0x0200,       /* ! */
110         VBE_ATTR_TRIPLEBUF      = 0x0400,
111         VBE_ATTR_STEREO         = 0x0800,
112         VBE_ATTR_STEREO_2FB     = 0x1000,
113         /* VBE/AF */
114         VBE_ATTR_MUSTLOCK       = 0x0200,       /* ! */
115 };
116
117 /* VBE memory model type (vbe_mode_info.mem_model) */
118 enum {
119         VBE_TYPE_TEXT,
120         VBE_TYPE_CGA,
121         VBE_TYPE_HERCULES,
122         VBE_TYPE_PLANAR,
123         VBE_TYPE_PACKED,
124         VBE_TYPE_UNCHAIN,
125         VBE_TYPE_DIRECT,
126         VBE_TYPE_YUV
127 };
128
129 /* VBE window attribute (vbe_mode_info.win(a|b)_attr) */
130 enum {
131         VBE_WIN_AVAIL   = 0x01,
132         VBE_WIN_RD              = 0x02,
133         VBE_WIN_WR              = 0x04
134 };
135
136 /* mode number flags */
137 enum {
138         VBE_MODE_RATE           = 0x0800,       /* VBE 3.0+ user-specified refresh rate */
139         VBE_MODE_ACCEL          = 0x2000,       /* VBE/AF */
140         VBE_MODE_LFB            = 0x4000,       /* VBE 2.0+ */
141         VBE_MODE_PRESERVE       = 0x8000
142 };
143
144 /* standard mode numbers */
145 enum {
146         VBE_640X400_8BPP        = 0x100,
147         VBE_640X480_8BPP        = 0x101,
148         VBE_800X600_4BPP        = 0x102,
149         VBE_800X600_8BPP        = 0x103,
150         VBE_1024X768_4BPP       = 0x104,
151         VBE_1024X768_8BPP       = 0x105,
152         VBE_1280X1024_4BPP      = 0x106,
153         VBE_1280X1024_8BPP      = 0x107,
154         VBE_80X60_TEXT          = 0x108,
155         VBE_132X25_TEXT         = 0x109,
156         VBE_132X43_TEXT         = 0x10a,
157         VBE_132X50_TEXT         = 0x10b,
158         VBE_132X60_TEXT         = 0x10c,
159         /* VBE 1.2 */
160         VBE_320X200_15BPP       = 0x10d,
161         VBE_320X200_16BPP       = 0x10e,
162         VBE_320X200_24BPP       = 0x10f,
163         VBE_640X480_15BPP       = 0x110,
164         VBE_640X480_16BPP       = 0x111,
165         VBE_640X480_24BPP       = 0x112,
166         VBE_800X600_15BPP       = 0x113,
167         VBE_800X600_16BPP       = 0x114,
168         VBE_800X600_24BPP       = 0x115,
169         VBE_1024X768_15BPP      = 0x116,
170         VBE_1024X768_16BPP      = 0x117,
171         VBE_1024X768_24BPP      = 0x118,
172         VBE_1280X1024_15BPP     = 0x119,
173         VBE_1280X1024_16BPP     = 0x11a,
174         VBE_1280X1024_24BPP     = 0x11b,
175         /* VBE 2.0 */
176         VBE_1600X1200_8BPP      = 0x120,
177         VBE_1600X1200_15BPP     = 0x121,
178         VBE_1600X1200_16BPP     = 0x122,
179
180         VBE_VMEM_MODE           = 0x81ff
181 };
182
183 /* VBE CRTC flags (vbe_crtc_info.flags) */
184 enum {
185         VBE_CRTC_DBLSCAN        = 0x01,
186         VBE_CRTC_ILACE          = 0x02,
187         VBE_CRTC_HSYNC_NEG      = 0x04,
188         VBE_CRTC_VSYNC_NEG      = 0x08
189 };
190
191 int vbe_info(struct vbe_info *info);
192 int vbe_num_modes(struct vbe_info *info);
193 int vbe_mode_info(int mode, struct vbe_mode_info *minf);
194
195 void vbe_print_info(FILE *fp, struct vbe_info *info);
196 void vbe_print_mode_info(FILE *fp, struct vbe_mode_info *minf);
197
198 int vbe_setmode(uint16_t mode);
199 int vbe_setmode_crtc(uint16_t mode, struct vbe_crtc_info *crtc);
200
201 #endif  /* VBE_H_ */