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