|
|
1.1 root 1: /* Generate the VGABIOS VBE Tables */
2: #include <stdlib.h>
3: #include <stdio.h>
4:
1.1.1.2 ! root 5: #define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 16
1.1 root 6:
7: typedef struct {
8: int width;
9: int height;
10: int depth;
11: int mode;
12: } ModeInfo;
13:
14: ModeInfo 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:
1.1.1.2 ! root 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},
1.1 root 54: { 1152, 864, 15 , 0x149},
55: { 1152, 864, 16 , 0x14a},
56: { 1152, 864, 24 , 0x14b},
57: { 1152, 864, 32 , 0x14c},
1.1.1.2 ! root 58: { 1280, 800, 16 , 0x178},
! 59: { 1280, 800, 24 , 0x179},
! 60: { 1280, 800, 32 , 0x17a},
! 61: { 1280, 960, 16 , 0x17b},
! 62: { 1280, 960, 24 , 0x17c},
! 63: { 1280, 960, 32 , 0x17d},
! 64: { 1440, 900, 16 , 0x17e},
! 65: { 1440, 900, 24 , 0x17f},
! 66: { 1440, 900, 32 , 0x180},
! 67: { 1400, 1050, 16 , 0x181},
! 68: { 1400, 1050, 24 , 0x182},
! 69: { 1400, 1050, 32 , 0x183},
! 70: { 1680, 1050, 16 , 0x184},
! 71: { 1680, 1050, 24 , 0x185},
! 72: { 1680, 1050, 32 , 0x186},
! 73: { 1920, 1200, 16 , 0x187},
! 74: { 1920, 1200, 24 , 0x188},
! 75: { 1920, 1200, 32 , 0x189},
! 76: { 2560, 1600, 16 , 0x18a},
! 77: { 2560, 1600, 24 , 0x18b},
! 78: { 2560, 1600, 32 , 0x18c},
1.1 root 79: { 0, },
80: };
81:
82: int main(int argc, char **argv)
83: {
84: const ModeInfo *pm;
85: int pages, pitch;
86: int r_size, r_pos, g_size, g_pos, b_size, b_pos, a_size, a_pos;
87: const char *str;
88: long vram_size = VBE_DISPI_TOTAL_VIDEO_MEMORY_MB * 1024 * 1024;
89:
90: printf("/* THIS FILE IS AUTOMATICALLY GENERATED - DO NOT EDIT */\n\n");
91: printf("#define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB %d\n\n", VBE_DISPI_TOTAL_VIDEO_MEMORY_MB);
92: printf("static ModeInfoListItem mode_info_list[]=\n");
93: printf("{\n");
94: for (pm = modes; pm->mode != 0; pm++) {
95: if (pm->depth == 4)
96: pitch = (pm->width + 7) / 8;
97: else
98: pitch = pm->width * ((pm->depth + 7) / 8);
99: pages = vram_size / (pm->height * pitch);
100: if (pages > 0) {
101: printf("{ 0x%04x, /* %dx%dx%d */\n",
102: pm->mode, pm->width, pm->height, pm->depth);
103: if (pm->depth == 4)
104: printf("{ /*Bit16u ModeAttributes*/ %s,\n",
105: "VBE_MODE_ATTRIBUTE_SUPPORTED | "
106: "VBE_MODE_ATTRIBUTE_EXTENDED_INFORMATION_AVAILABLE | "
107: "VBE_MODE_ATTRIBUTE_COLOR_MODE | "
108: "VBE_MODE_ATTRIBUTE_TTY_BIOS_SUPPORT | "
109: "VBE_MODE_ATTRIBUTE_GRAPHICS_MODE");
110: else
111: printf("{ /*Bit16u ModeAttributes*/ %s,\n",
112: "VBE_MODE_ATTRIBUTE_SUPPORTED | "
113: "VBE_MODE_ATTRIBUTE_EXTENDED_INFORMATION_AVAILABLE | "
114: "VBE_MODE_ATTRIBUTE_COLOR_MODE | "
115: "VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE | "
116: "VBE_MODE_ATTRIBUTE_GRAPHICS_MODE");
117: printf("/*Bit8u WinAAttributes*/ %s,\n",
118: "VBE_WINDOW_ATTRIBUTE_RELOCATABLE | "
119: "VBE_WINDOW_ATTRIBUTE_READABLE | "
120: "VBE_WINDOW_ATTRIBUTE_WRITEABLE");
121:
122: printf("/*Bit8u WinBAttributes*/ %d,\n", 0);
123:
124: printf("/*Bit16u WinGranularity*/ %s,\n", "VBE_DISPI_BANK_SIZE_KB");
125:
126: printf("/*Bit16u WinSize*/ %s,\n", "VBE_DISPI_BANK_SIZE_KB");
127:
128: printf("/*Bit16u WinASegment*/ %s,\n", "VGAMEM_GRAPH");
129:
130: printf("/*Bit16u WinBSegment*/ 0x%04x,\n", 0);
131:
132: printf("/*Bit32u WinFuncPtr*/ %d,\n", 0);
133:
134: printf("/*Bit16u BytesPerScanLine*/ %d,\n", pitch);
135:
136: // Mandatory information for VBE 1.2 and above
137: printf("/*Bit16u XResolution*/ %d,\n", pm->width);
138: printf("/*Bit16u YResolution*/ %d,\n", pm->height);
139: printf("/*Bit8u XCharSize*/ %d,\n", 8);
140: printf("/*Bit8u YCharSize*/ %d,\n", 16);
141: if (pm->depth == 4) {
142: printf("/*Bit8u NumberOfPlanes*/ %d,\n", 4);
143: } else {
144: printf("/*Bit8u NumberOfPlanes*/ %d,\n", 1);
145: }
146: printf("/*Bit8u BitsPerPixel*/ %d,\n", pm->depth);
147: printf("/*Bit8u NumberOfBanks*/ %d,\n",
148: (pm->height * pitch + 65535) / 65536);
149:
150: if (pm->depth == 4)
151: str = "VBE_MEMORYMODEL_PLANAR";
152: else if (pm->depth == 8)
153: str = "VBE_MEMORYMODEL_PACKED_PIXEL";
154: else
155: str = "VBE_MEMORYMODEL_DIRECT_COLOR";
156: printf("/*Bit8u MemoryModel*/ %s,\n", str);
157: printf("/*Bit8u BankSize*/ %d,\n", 0);
158: if (pm->depth == 4)
159: printf("/*Bit8u NumberOfImagePages*/ %d,\n", (pages / 4) - 1);
160: else
161: printf("/*Bit8u NumberOfImagePages*/ %d,\n", pages - 1);
162: printf("/*Bit8u Reserved_page*/ %d,\n", 0);
163:
164: // Direct Color fields (required for direct/6 and YUV/7 memory models)
165: switch(pm->depth) {
166: case 15:
167: r_size = 5;
168: r_pos = 10;
169: g_size = 5;
170: g_pos = 5;
171: b_size = 5;
172: b_pos = 0;
173: a_size = 1;
174: a_pos = 15;
175: break;
176: case 16:
177: r_size = 5;
178: r_pos = 11;
179: g_size = 6;
180: g_pos = 5;
181: b_size = 5;
182: b_pos = 0;
183: a_size = 0;
184: a_pos = 0;
185: break;
186: case 24:
187: r_size = 8;
188: r_pos = 16;
189: g_size = 8;
190: g_pos = 8;
191: b_size = 8;
192: b_pos = 0;
193: a_size = 0;
194: a_pos = 0;
195: break;
196: case 32:
197: r_size = 8;
198: r_pos = 16;
199: g_size = 8;
200: g_pos = 8;
201: b_size = 8;
202: b_pos = 0;
203: a_size = 8;
204: a_pos = 24;
205: break;
206: default:
207: r_size = 0;
208: r_pos = 0;
209: g_size = 0;
210: g_pos = 0;
211: b_size = 0;
212: b_pos = 0;
213: a_size = 0;
214: a_pos = 0;
215: break;
216: }
217:
218: printf("/*Bit8u RedMaskSize*/ %d,\n", r_size);
219: printf("/*Bit8u RedFieldPosition*/ %d,\n", r_pos);
220: printf("/*Bit8u GreenMaskSize*/ %d,\n", g_size);
221: printf("/*Bit8u GreenFieldPosition*/ %d,\n", g_pos);
222: printf("/*Bit8u BlueMaskSize*/ %d,\n", b_size);
223: printf("/*Bit8u BlueFieldPosition*/ %d,\n", b_pos);
224: printf("/*Bit8u RsvdMaskSize*/ %d,\n", a_size);
225: printf("/*Bit8u RsvdFieldPosition*/ %d,\n", a_pos);
226: if (pm->depth == 32)
227: printf("/*Bit8u DirectColorModeInfo*/ %s,\n",
228: "VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE");
229: else
230: printf("/*Bit8u DirectColorModeInfo*/ %s,\n", "0");
231:
232: // Mandatory information for VBE 2.0 and above
233: if (pm->depth > 4)
234: printf("/*Bit32u PhysBasePtr*/ %s,\n",
235: "VBE_DISPI_LFB_PHYSICAL_ADDRESS");
236: else
237: printf("/*Bit32u PhysBasePtr*/ %s,\n", "0");
238: printf("/*Bit32u OffScreenMemOffset*/ %d,\n", 0);
239: printf("/*Bit16u OffScreenMemSize*/ %d,\n", 0);
240: // Mandatory information for VBE 3.0 and above
241: printf("/*Bit16u LinBytesPerScanLine*/ %d,\n", pitch);
242: printf("/*Bit8u BnkNumberOfPages*/ %d,\n", 0);
243: printf("/*Bit8u LinNumberOfPages*/ %d,\n", 0);
244: printf("/*Bit8u LinRedMaskSize*/ %d,\n", r_size);
245: printf("/*Bit8u LinRedFieldPosition*/ %d,\n", r_pos);
246: printf("/*Bit8u LinGreenMaskSize*/ %d,\n", g_size);
247: printf("/*Bit8u LinGreenFieldPosition*/ %d,\n", g_pos);
248: printf("/*Bit8u LinBlueMaskSize*/ %d,\n", b_size);
249: printf("/*Bit8u LinBlueFieldPosition*/ %d,\n", b_pos);
250: printf("/*Bit8u LinRsvdMaskSize*/ %d,\n", a_size);
251: printf("/*Bit8u LinRsvdFieldPosition*/ %d,\n", a_pos);
252: printf("/*Bit32u MaxPixelClock*/ %d,\n", 0);
253: printf("} },\n");
254: }
255: }
256: printf("{ VBE_VESA_MODE_END_OF_LIST,\n");
257: printf("{ 0,\n");
258: printf("} },\n");
259: printf("};\n");
260: return 0;
261: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.