1/* Generate the VGABIOS VBE Tables */
2#include <stdlib.h>
3#include <stdio.h>
4
5#define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 16
6
7typedef struct {
8    int width;
9    int height;
10    int depth;
11    int mode;
12} ModeInfo;
13
14ModeInfo modes[] = {
15    /* standard VESA modes */
16{ 640, 400, 8                          , 0x100},
17{ 640, 480, 8                          , 0x101},
18{ 800, 600, 4                          , 0x102},
19{ 800, 600, 8                          , 0x103},
20{ 1024, 768, 4                         , 0x104},
21{ 1024, 768, 8                         , 0x105},
22{ 1280, 1024, 4                        , 0x106},
23{ 1280, 1024, 8                        , 0x107},
24{ 320, 200, 15                       , 0x10D},
25{ 320, 200, 16                        , 0x10E},
26{ 320, 200, 24                        , 0x10F},
27{ 640, 480, 15                       , 0x110},
28{ 640, 480, 16                        , 0x111},
29{ 640, 480, 24                        , 0x112},
30{ 800, 600, 15                       , 0x113},
31{ 800, 600, 16                        , 0x114},
32{ 800, 600, 24                        , 0x115},
33{ 1024, 768, 15                      , 0x116},
34{ 1024, 768, 16                       , 0x117},
35{ 1024, 768, 24                       , 0x118},
36{ 1280, 1024, 15                     , 0x119},
37{ 1280, 1024, 16                      , 0x11A},
38{ 1280, 1024, 24                      , 0x11B},
39{ 1600, 1200, 8                        , 0x11C},
40{ 1600, 1200, 15                     , 0x11D},
41{ 1600, 1200, 16                      , 0x11E},
42{ 1600, 1200, 24                      , 0x11F},
43
44      /* BOCHS/PLEX86 'own' mode numbers */
45{ 320, 200, 32                       , 0x140},
46{ 640, 400, 32                       , 0x141},
47{ 640, 480, 32                       , 0x142},
48{ 800, 600, 32                       , 0x143},
49{ 1024, 768, 32                      , 0x144},
50{ 1280, 1024, 32                     , 0x145},
51{ 320, 200, 8                        , 0x146},
52{ 1600, 1200, 32                     , 0x147},
53{ 1152, 864, 8                       , 0x148},
54{ 1152, 864, 15                      , 0x149},
55{ 1152, 864, 16                      , 0x14a},
56{ 1152, 864, 24                      , 0x14b},
57{ 1152, 864, 32                      , 0x14c},
58{ 1280, 768, 16                      , 0x175},
59{ 1280, 768, 24                      , 0x176},
60{ 1280, 768, 32                      , 0x177},
61{ 1280, 800, 16                      , 0x178},
62{ 1280, 800, 24                      , 0x179},
63{ 1280, 800, 32                      , 0x17a},
64{ 1280, 960, 16                      , 0x17b},
65{ 1280, 960, 24                      , 0x17c},
66{ 1280, 960, 32                      , 0x17d},
67{ 1440, 900, 16                      , 0x17e},
68{ 1440, 900, 24                      , 0x17f},
69{ 1440, 900, 32                      , 0x180},
70{ 1400, 1050, 16                     , 0x181},
71{ 1400, 1050, 24                     , 0x182},
72{ 1400, 1050, 32                     , 0x183},
73{ 1680, 1050, 16                     , 0x184},
74{ 1680, 1050, 24                     , 0x185},
75{ 1680, 1050, 32                     , 0x186},
76{ 1920, 1200, 16                     , 0x187},
77{ 1920, 1200, 24                     , 0x188},
78{ 1920, 1200, 32                     , 0x189},
79{ 2560, 1600, 16                     , 0x18a},
80{ 2560, 1600, 24                     , 0x18b},
81{ 2560, 1600, 32                     , 0x18c},
82{ 1280, 720, 16                      , 0x18d},
83{ 1280, 720, 24                      , 0x18e},
84{ 1280, 720, 32                      , 0x18f},
85{ 1920, 1080, 16                     , 0x190},
86{ 1920, 1080, 24                     , 0x191},
87{ 1920, 1080, 32                     , 0x192},
88{ 0, },
89};
90
91int main(int argc, char **argv)
92{
93  const ModeInfo *pm;
94  int pages, pitch;
95  int r_size, r_pos, g_size, g_pos, b_size, b_pos, a_size, a_pos;
96  const char *str;
97  long vram_size = VBE_DISPI_TOTAL_VIDEO_MEMORY_MB * 1024 * 1024;
98
99  printf("/* THIS FILE IS AUTOMATICALLY GENERATED - DO NOT EDIT */\n\n");
100  printf("#define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB %d\n\n", VBE_DISPI_TOTAL_VIDEO_MEMORY_MB);
101  printf("static ModeInfoListItem mode_info_list[]=\n");
102  printf("{\n");
103  for (pm = modes; pm->mode != 0; pm++) {
104    if (pm->depth == 4)
105      pitch = (pm->width + 7) / 8;
106    else
107      pitch = pm->width * ((pm->depth + 7) / 8);
108    pages = vram_size / (pm->height * pitch);
109    if (pages > 0) {
110      printf("{ 0x%04x, /* %dx%dx%d */\n",
111             pm->mode, pm->width, pm->height, pm->depth);
112      if (pm->depth == 4)
113        printf("{ /*Bit16u ModeAttributes*/ %s,\n",
114               "VBE_MODE_ATTRIBUTE_SUPPORTED | "
115               "VBE_MODE_ATTRIBUTE_EXTENDED_INFORMATION_AVAILABLE | "
116               "VBE_MODE_ATTRIBUTE_COLOR_MODE | "
117               "VBE_MODE_ATTRIBUTE_TTY_BIOS_SUPPORT | "
118               "VBE_MODE_ATTRIBUTE_GRAPHICS_MODE");
119      else
120        printf("{ /*Bit16u ModeAttributes*/ %s,\n",
121               "VBE_MODE_ATTRIBUTE_SUPPORTED | "
122               "VBE_MODE_ATTRIBUTE_EXTENDED_INFORMATION_AVAILABLE | "
123               "VBE_MODE_ATTRIBUTE_COLOR_MODE | "
124               "VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE | "
125               "VBE_MODE_ATTRIBUTE_GRAPHICS_MODE");
126      printf("/*Bit8u  WinAAttributes*/ %s,\n",
127             "VBE_WINDOW_ATTRIBUTE_RELOCATABLE | "
128             "VBE_WINDOW_ATTRIBUTE_READABLE | "
129             "VBE_WINDOW_ATTRIBUTE_WRITEABLE");
130
131      printf("/*Bit8u  WinBAttributes*/ %d,\n", 0);
132
133      printf("/*Bit16u WinGranularity*/ %s,\n", "VBE_DISPI_BANK_SIZE_KB");
134
135      printf("/*Bit16u WinSize*/ %s,\n", "VBE_DISPI_BANK_SIZE_KB");
136
137      printf("/*Bit16u WinASegment*/ %s,\n", "VGAMEM_GRAPH");
138
139      printf("/*Bit16u WinBSegment*/ 0x%04x,\n", 0);
140
141      printf("/*Bit32u WinFuncPtr*/ %d,\n", 0);
142
143      printf("/*Bit16u BytesPerScanLine*/ %d,\n", pitch);
144
145      // Mandatory information for VBE 1.2 and above
146      printf("/*Bit16u XResolution*/ %d,\n", pm->width);
147      printf("/*Bit16u YResolution*/ %d,\n", pm->height);
148      printf("/*Bit8u  XCharSize*/ %d,\n", 8);
149      printf("/*Bit8u  YCharSize*/ %d,\n", 16);
150      if (pm->depth == 4) {
151        printf("/*Bit8u  NumberOfPlanes*/ %d,\n", 4);
152      } else {
153        printf("/*Bit8u  NumberOfPlanes*/ %d,\n", 1);
154      }
155      printf("/*Bit8u  BitsPerPixel*/ %d,\n", pm->depth);
156      printf("/*Bit8u  NumberOfBanks*/ %d,\n",
157             (pm->height * pitch + 65535) / 65536);
158
159      if (pm->depth == 4)
160        str = "VBE_MEMORYMODEL_PLANAR";
161      else if (pm->depth == 8)
162        str = "VBE_MEMORYMODEL_PACKED_PIXEL";
163      else
164        str = "VBE_MEMORYMODEL_DIRECT_COLOR";
165      printf("/*Bit8u  MemoryModel*/ %s,\n", str);
166      printf("/*Bit8u  BankSize*/ %d,\n", 0);
167      if (pm->depth == 4)
168        printf("/*Bit8u  NumberOfImagePages*/ %d,\n", (pages / 4) - 1);
169      else
170        printf("/*Bit8u  NumberOfImagePages*/ %d,\n", pages - 1);
171      printf("/*Bit8u  Reserved_page*/ %d,\n", 0);
172
173      // Direct Color fields (required for direct/6 and YUV/7 memory models)
174      switch(pm->depth) {
175        case 15:
176          r_size = 5;
177          r_pos = 10;
178          g_size = 5;
179          g_pos = 5;
180          b_size = 5;
181          b_pos = 0;
182          a_size = 1;
183          a_pos = 15;
184          break;
185        case 16:
186          r_size = 5;
187          r_pos = 11;
188          g_size = 6;
189          g_pos = 5;
190          b_size = 5;
191          b_pos = 0;
192          a_size = 0;
193          a_pos = 0;
194          break;
195        case 24:
196          r_size = 8;
197          r_pos = 16;
198          g_size = 8;
199          g_pos = 8;
200          b_size = 8;
201          b_pos = 0;
202          a_size = 0;
203          a_pos = 0;
204          break;
205        case 32:
206          r_size = 8;
207          r_pos = 16;
208          g_size = 8;
209          g_pos = 8;
210          b_size = 8;
211          b_pos = 0;
212          a_size = 8;
213          a_pos = 24;
214          break;
215        default:
216          r_size = 0;
217          r_pos = 0;
218          g_size = 0;
219          g_pos = 0;
220          b_size = 0;
221          b_pos = 0;
222          a_size = 0;
223          a_pos = 0;
224          break;
225      }
226
227      printf("/*Bit8u  RedMaskSize*/ %d,\n", r_size);
228      printf("/*Bit8u  RedFieldPosition*/ %d,\n", r_pos);
229      printf("/*Bit8u  GreenMaskSize*/ %d,\n", g_size);
230      printf("/*Bit8u  GreenFieldPosition*/ %d,\n", g_pos);
231      printf("/*Bit8u  BlueMaskSize*/ %d,\n", b_size);
232      printf("/*Bit8u  BlueFieldPosition*/ %d,\n", b_pos);
233      printf("/*Bit8u  RsvdMaskSize*/ %d,\n", a_size);
234      printf("/*Bit8u  RsvdFieldPosition*/ %d,\n", a_pos);
235      if (pm->depth == 32)
236        printf("/*Bit8u  DirectColorModeInfo*/ %s,\n",
237               "VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE");
238      else
239        printf("/*Bit8u  DirectColorModeInfo*/ %s,\n", "0");
240
241// Mandatory information for VBE 2.0 and above
242      if (pm->depth > 4)
243        printf("/*Bit32u PhysBasePtr*/ %s,\n",
244               "VBE_DISPI_LFB_PHYSICAL_ADDRESS");
245      else
246        printf("/*Bit32u PhysBasePtr*/ %s,\n", "0");
247      printf("/*Bit32u OffScreenMemOffset*/ %d,\n", 0);
248      printf("/*Bit16u OffScreenMemSize*/ %d,\n", 0);
249      // Mandatory information for VBE 3.0 and above
250      printf("/*Bit16u LinBytesPerScanLine*/ %d,\n", pitch);
251      printf("/*Bit8u  BnkNumberOfPages*/ %d,\n", 0);
252      printf("/*Bit8u  LinNumberOfPages*/ %d,\n", 0);
253      printf("/*Bit8u  LinRedMaskSize*/ %d,\n", r_size);
254      printf("/*Bit8u  LinRedFieldPosition*/ %d,\n", r_pos);
255      printf("/*Bit8u  LinGreenMaskSize*/ %d,\n", g_size);
256      printf("/*Bit8u  LinGreenFieldPosition*/ %d,\n", g_pos);
257      printf("/*Bit8u  LinBlueMaskSize*/ %d,\n", b_size);
258      printf("/*Bit8u  LinBlueFieldPosition*/ %d,\n", b_pos);
259      printf("/*Bit8u  LinRsvdMaskSize*/ %d,\n", a_size);
260      printf("/*Bit8u  LinRsvdFieldPosition*/ %d,\n", a_pos);
261      printf("/*Bit32u MaxPixelClock*/ %d,\n", 0);
262      printf("} },\n");
263    }
264  }
265  printf("{ VBE_VESA_MODE_END_OF_LIST,\n");
266  printf("{ 0,\n");
267  printf("} },\n");
268  printf("};\n");
269  return 0;
270}
271