vgabios: Use vgamode_s instead of video_param_table in code.
[seabios.git] / vgasrc / vgatables.c
1 // Tables used by VGA bios
2 //
3 // Copyright (C) 2009  Kevin O'Connor <kevin@koconnor.net>
4 // Copyright (C) 2001-2008 the LGPL VGABios developers Team
5 //
6 // This file may be distributed under the terms of the GNU LGPLv3 license.
7
8 #include "vgatables.h" // struct VideoParamTableEntry_s
9 #include "biosvar.h" // GET_GLOBAL
10
11
12 /****************************************************************
13  * Video parameter table
14  ****************************************************************/
15
16 struct VideoSavePointer_s video_save_pointer_table VAR16;
17
18 struct VideoParam_s video_param_table[] VAR16 = {
19     // index=0x00 no mode defined
20     {},
21     // index=0x01 no mode defined
22     {},
23     // index=0x02 no mode defined
24     {},
25     // index=0x03 no mode defined
26     {},
27     // index=0x04 vga mode 0x04
28     { 40, 24, 8, 0x0800,      /* tw, th-1, ch, slength */
29       { 0x09, 0x03, 0x00, 0x02 },    /* sequ_regs */
30       0x63,                      /* miscreg */
31       { 0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80, 0xbf, 0x1f,
32         0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33         0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96, 0xb9, 0xa2,
34         0xff },                      /* crtc_regs */
35       { 0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07,
36         0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
37         0x01, 0x00, 0x03, 0x00 },    /* actl_regs */
38       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0f, 0x0f, 0xff }, /* grdc_regs */
39     },
40     /* index=0x05 vga mode 0x05 */
41     { 40, 24, 8, 0x0800,     /* tw, th-1, ch, slength */
42       { 0x09, 0x03, 0x00, 0x02 },    /* sequ_regs */
43       0x63,                      /* miscreg */
44       { 0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80, 0xbf, 0x1f,
45         0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46         0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96, 0xb9, 0xa2,
47         0xff },                      /* crtc_regs */
48       { 0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07,
49         0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
50         0x01, 0x00, 0x03, 0x00 },    /* actl_regs */
51       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0f, 0x0f, 0xff }, /* grdc_regs */
52     },
53     /* index=0x06 vga mode 0x06 */
54     { 80, 24, 8, 0x1000,     /* tw, th-1, ch, slength */
55       { 0x01, 0x01, 0x00, 0x06 },    /* sequ_regs */
56       0x63,                      /* miscreg */
57       { 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
58         0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59         0x9c, 0x8e, 0x8f, 0x28, 0x00, 0x96, 0xb9, 0xc2,
60         0xff },                      /* crtc_regs */
61       { 0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
62         0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
63         0x01, 0x00, 0x01, 0x00 },    /* actl_regs */
64       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0f, 0xff }, /* grdc_regs */
65      },
66     /* index=0x07 vga mode 0x07 */
67     { 80, 24, 16, 0x1000,    /* tw, th-1, ch, slength */
68       { 0x00, 0x03, 0x00, 0x02 },    /* sequ_regs */
69       0x66,                      /* miscreg */
70       { 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f,
71         0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
72         0x9c, 0x8e, 0x8f, 0x28, 0x0f, 0x96, 0xb9, 0xa3,
73         0xff },                      /* crtc_regs */
74       { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
75         0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
76         0x0e, 0x00, 0x0f, 0x08 },    /* actl_regs */
77       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x0f, 0xff }, /* grdc_regs */
78      },
79     /* index=0x08 no mode defined */
80     {},
81     /* index=0x09 no mode defined */
82     {},
83     /* index=0x0a no mode defined */
84     {},
85     /* index=0x0b no mode defined */
86     {},
87     /* index=0x0c no mode defined */
88     {},
89     /* index=0x0d vga mode 0x0d */
90     { 40, 24, 8, 0x2000,     /* tw, th-1, ch, slength */
91       { 0x09, 0x0f, 0x00, 0x06 },    /* sequ_regs */
92       0x63,                      /* miscreg */
93       { 0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80, 0xbf, 0x1f,
94         0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95         0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96, 0xb9, 0xe3,
96         0xff },                      /* crtc_regs */
97       { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
98         0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
99         0x01, 0x00, 0x0f, 0x00 },    /* actl_regs */
100       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff }, /* grdc_regs */
101      },
102     /* index=0x0e vga mode 0x0e */
103     { 80, 24, 8, 0x4000,     /* tw, th-1, ch, slength */
104       { 0x01, 0x0f, 0x00, 0x06 },    /* sequ_regs */
105       0x63,                      /* miscreg */
106       { 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
107         0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108         0x9c, 0x8e, 0x8f, 0x28, 0x00, 0x96, 0xb9, 0xe3,
109         0xff },                      /* crtc_regs */
110       { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
111         0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
112         0x01, 0x00, 0x0f, 0x00 },    /* actl_regs */
113       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff }, /* grdc_regs */
114      },
115     /* index=0x0f no mode defined */
116     {},
117     /* index=0x10 no mode defined */
118     {},
119     /* index=0x11 vga mode 0x0f */
120     { 80, 24, 14, 0x8000,    /* tw, th-1, ch, slength */
121       { 0x01, 0x0f, 0x00, 0x06 },    /* sequ_regs */
122       0xa3,                      /* miscreg */
123       { 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
124         0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
125         0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63, 0xba, 0xe3,
126         0xff },                      /* crtc_regs */
127       { 0x00, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
128         0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,
129         0x01, 0x00, 0x01, 0x00 },    /* actl_regs */
130       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff }, /* grdc_regs */
131      },
132     /* index=0x12 vga mode 0x10 */
133     { 80, 24, 14, 0x8000,    /* tw, th-1, ch, slength */
134       { 0x01, 0x0f, 0x00, 0x06 },    /* sequ_regs */
135       0xa3,                      /* miscreg */
136       { 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
137         0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138         0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63, 0xba, 0xe3,
139         0xff },                      /* crtc_regs */
140       { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
141         0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
142         0x01, 0x00, 0x0f, 0x00 },    /* actl_regs */
143       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff }, /* grdc_regs */
144      },
145     /* index=0x13 no mode defined */
146     {},
147     /* index=0x14 no mode defined */
148     {},
149     /* index=0x15 no mode defined */
150     {},
151     /* index=0x16 no mode defined */
152     {},
153     /* index=0x17 vga mode 0x01 */
154     { 40, 24, 16, 0x0800,    /* tw, th-1, ch, slength */
155       { 0x08, 0x03, 0x00, 0x02 },    /* sequ_regs */
156       0x67,                      /* miscreg */
157       { 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0, 0xbf, 0x1f,
158         0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
159         0x9c, 0x8e, 0x8f, 0x14, 0x1f, 0x96, 0xb9, 0xa3,
160         0xff },                      /* crtc_regs */
161       { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
162         0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
163         0x0c, 0x00, 0x0f, 0x08 },    /* actl_regs */
164       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x0f, 0xff }, /* grdc_regs */
165     },
166     /* index=0x18 vga mode 0x03 */
167     { 80, 24, 16, 0x1000,    /* tw, th-1, ch, slength */
168       { 0x00, 0x03, 0x00, 0x02 },    /* sequ_regs */
169       0x67,                      /* miscreg */
170       { 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f,
171         0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
172         0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96, 0xb9, 0xa3,
173         0xff },                      /* crtc_regs */
174       { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
175         0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
176         0x0c, 0x00, 0x0f, 0x08 },    /* actl_regs */
177       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x0f, 0xff }, /* grdc_regs */
178      },
179     /* index=0x19 vga mode 0x07 */
180     { 80, 24, 16, 0x1000,    /* tw, th-1, ch, slength */
181       { 0x00, 0x03, 0x00, 0x02 },    /* sequ_regs */
182       0x66,                      /* miscreg */
183       { 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f,
184         0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
185         0x9c, 0x8e, 0x8f, 0x28, 0x0f, 0x96, 0xb9, 0xa3,
186         0xff },                      /* crtc_regs */
187       { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
188         0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
189         0x0e, 0x00, 0x0f, 0x08 },    /* actl_regs */
190       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x0f, 0xff }, /* grdc_regs */
191     },
192     /* index=0x1a vga mode 0x11 */
193     { 80, 29, 16, 0x0000,    /* tw, th-1, ch, slength */
194       { 0x01, 0x0f, 0x00, 0x06 },    /* sequ_regs */
195       0xe3,                      /* miscreg */
196       { 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0x0b, 0x3e,
197         0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
198         0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7, 0x04, 0xe3,
199         0xff },                      /* crtc_regs */
200       { 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f,
201         0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f,
202         0x01, 0x00, 0x0f, 0x00 },    /* actl_regs */
203       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff }, /* grdc_regs */
204     },
205     /* index=0x1b vga mode 0x12 */
206     { 80, 29, 16, 0x0000,    /* tw, th-1, ch, slength */
207       { 0x01, 0x0f, 0x00, 0x06 },    /* sequ_regs */
208       0xe3,                      /* miscreg */
209       { 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0x0b, 0x3e,
210         0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211         0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7, 0x04, 0xe3,
212         0xff },                      /* crtc_regs */
213       { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
214         0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
215         0x01, 0x00, 0x0f, 0x00 },    /* actl_regs */
216       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff }, /* grdc_regs */
217      },
218     /* index=0x1c vga mode 0x13 */
219     { 40, 24, 8, 0x0000,     /* tw, th-1, ch, slength */
220       { 0x01, 0x0f, 0x00, 0x0e },    /* sequ_regs */
221       0x63,                      /* miscreg */
222       { 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
223         0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224         0x9c, 0x8e, 0x8f, 0x28, 0x40, 0x96, 0xb9, 0xa3,
225         0xff },                      /* crtc_regs */
226       { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
227         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
228         0x41, 0x00, 0x0f, 0x00 },    /* actl_regs */
229       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0f, 0xff }, /* grdc_regs */
230      },
231     /* index=0x1d vga mode 0x6a */
232     { 100, 36, 16, 0x0000,   /* tw, th-1, ch, slength */
233       { 0x01, 0x0f, 0x00, 0x06 },    /* sequ_regs */
234       0xe3,                      /* miscreg */
235       { 0x7f, 0x63, 0x63, 0x83, 0x6b, 0x1b, 0x72, 0xf0,
236         0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237         0x59, 0x8d, 0x57, 0x32, 0x00, 0x57, 0x73, 0xe3,
238         0xff },                      /* crtc_regs */
239       { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
240         0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
241         0x01, 0x00, 0x0f, 0x00 },    /* actl_regs */
242       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff }, /* grdc_regs */
243      },
244 };
245
246
247 /****************************************************************
248  * Register definitions
249  ****************************************************************/
250
251 /* Mono */
252 static u8 palette0[] VAR16 = {
253   0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
254   0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
255   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
256   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
257   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
258   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
259   0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f,
260   0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f,
261   0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
262   0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
263   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
264   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
265   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
266   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
267   0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f,
268   0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f
269 };
270
271 static u8 palette1[] VAR16 = {
272   0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
273   0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
274   0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
275   0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
276   0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
277   0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f,
278   0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
279   0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f,
280   0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
281   0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
282   0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
283   0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
284   0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
285   0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f,
286   0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
287   0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f
288 };
289
290 static u8 palette2[] VAR16 = {
291   0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
292   0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x2a,0x00, 0x2a,0x2a,0x2a,
293   0x00,0x00,0x15, 0x00,0x00,0x3f, 0x00,0x2a,0x15, 0x00,0x2a,0x3f,
294   0x2a,0x00,0x15, 0x2a,0x00,0x3f, 0x2a,0x2a,0x15, 0x2a,0x2a,0x3f,
295   0x00,0x15,0x00, 0x00,0x15,0x2a, 0x00,0x3f,0x00, 0x00,0x3f,0x2a,
296   0x2a,0x15,0x00, 0x2a,0x15,0x2a, 0x2a,0x3f,0x00, 0x2a,0x3f,0x2a,
297   0x00,0x15,0x15, 0x00,0x15,0x3f, 0x00,0x3f,0x15, 0x00,0x3f,0x3f,
298   0x2a,0x15,0x15, 0x2a,0x15,0x3f, 0x2a,0x3f,0x15, 0x2a,0x3f,0x3f,
299   0x15,0x00,0x00, 0x15,0x00,0x2a, 0x15,0x2a,0x00, 0x15,0x2a,0x2a,
300   0x3f,0x00,0x00, 0x3f,0x00,0x2a, 0x3f,0x2a,0x00, 0x3f,0x2a,0x2a,
301   0x15,0x00,0x15, 0x15,0x00,0x3f, 0x15,0x2a,0x15, 0x15,0x2a,0x3f,
302   0x3f,0x00,0x15, 0x3f,0x00,0x3f, 0x3f,0x2a,0x15, 0x3f,0x2a,0x3f,
303   0x15,0x15,0x00, 0x15,0x15,0x2a, 0x15,0x3f,0x00, 0x15,0x3f,0x2a,
304   0x3f,0x15,0x00, 0x3f,0x15,0x2a, 0x3f,0x3f,0x00, 0x3f,0x3f,0x2a,
305   0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
306   0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f
307 };
308
309 static u8 palette3[] VAR16 = {
310   0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
311   0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
312   0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
313   0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f,
314   0x00,0x00,0x00, 0x05,0x05,0x05, 0x08,0x08,0x08, 0x0b,0x0b,0x0b,
315   0x0e,0x0e,0x0e, 0x11,0x11,0x11, 0x14,0x14,0x14, 0x18,0x18,0x18,
316   0x1c,0x1c,0x1c, 0x20,0x20,0x20, 0x24,0x24,0x24, 0x28,0x28,0x28,
317   0x2d,0x2d,0x2d, 0x32,0x32,0x32, 0x38,0x38,0x38, 0x3f,0x3f,0x3f,
318   0x00,0x00,0x3f, 0x10,0x00,0x3f, 0x1f,0x00,0x3f, 0x2f,0x00,0x3f,
319   0x3f,0x00,0x3f, 0x3f,0x00,0x2f, 0x3f,0x00,0x1f, 0x3f,0x00,0x10,
320   0x3f,0x00,0x00, 0x3f,0x10,0x00, 0x3f,0x1f,0x00, 0x3f,0x2f,0x00,
321   0x3f,0x3f,0x00, 0x2f,0x3f,0x00, 0x1f,0x3f,0x00, 0x10,0x3f,0x00,
322   0x00,0x3f,0x00, 0x00,0x3f,0x10, 0x00,0x3f,0x1f, 0x00,0x3f,0x2f,
323   0x00,0x3f,0x3f, 0x00,0x2f,0x3f, 0x00,0x1f,0x3f, 0x00,0x10,0x3f,
324   0x1f,0x1f,0x3f, 0x27,0x1f,0x3f, 0x2f,0x1f,0x3f, 0x37,0x1f,0x3f,
325   0x3f,0x1f,0x3f, 0x3f,0x1f,0x37, 0x3f,0x1f,0x2f, 0x3f,0x1f,0x27,
326
327   0x3f,0x1f,0x1f, 0x3f,0x27,0x1f, 0x3f,0x2f,0x1f, 0x3f,0x37,0x1f,
328   0x3f,0x3f,0x1f, 0x37,0x3f,0x1f, 0x2f,0x3f,0x1f, 0x27,0x3f,0x1f,
329   0x1f,0x3f,0x1f, 0x1f,0x3f,0x27, 0x1f,0x3f,0x2f, 0x1f,0x3f,0x37,
330   0x1f,0x3f,0x3f, 0x1f,0x37,0x3f, 0x1f,0x2f,0x3f, 0x1f,0x27,0x3f,
331   0x2d,0x2d,0x3f, 0x31,0x2d,0x3f, 0x36,0x2d,0x3f, 0x3a,0x2d,0x3f,
332   0x3f,0x2d,0x3f, 0x3f,0x2d,0x3a, 0x3f,0x2d,0x36, 0x3f,0x2d,0x31,
333   0x3f,0x2d,0x2d, 0x3f,0x31,0x2d, 0x3f,0x36,0x2d, 0x3f,0x3a,0x2d,
334   0x3f,0x3f,0x2d, 0x3a,0x3f,0x2d, 0x36,0x3f,0x2d, 0x31,0x3f,0x2d,
335   0x2d,0x3f,0x2d, 0x2d,0x3f,0x31, 0x2d,0x3f,0x36, 0x2d,0x3f,0x3a,
336   0x2d,0x3f,0x3f, 0x2d,0x3a,0x3f, 0x2d,0x36,0x3f, 0x2d,0x31,0x3f,
337   0x00,0x00,0x1c, 0x07,0x00,0x1c, 0x0e,0x00,0x1c, 0x15,0x00,0x1c,
338   0x1c,0x00,0x1c, 0x1c,0x00,0x15, 0x1c,0x00,0x0e, 0x1c,0x00,0x07,
339   0x1c,0x00,0x00, 0x1c,0x07,0x00, 0x1c,0x0e,0x00, 0x1c,0x15,0x00,
340   0x1c,0x1c,0x00, 0x15,0x1c,0x00, 0x0e,0x1c,0x00, 0x07,0x1c,0x00,
341   0x00,0x1c,0x00, 0x00,0x1c,0x07, 0x00,0x1c,0x0e, 0x00,0x1c,0x15,
342   0x00,0x1c,0x1c, 0x00,0x15,0x1c, 0x00,0x0e,0x1c, 0x00,0x07,0x1c,
343
344   0x0e,0x0e,0x1c, 0x11,0x0e,0x1c, 0x15,0x0e,0x1c, 0x18,0x0e,0x1c,
345   0x1c,0x0e,0x1c, 0x1c,0x0e,0x18, 0x1c,0x0e,0x15, 0x1c,0x0e,0x11,
346   0x1c,0x0e,0x0e, 0x1c,0x11,0x0e, 0x1c,0x15,0x0e, 0x1c,0x18,0x0e,
347   0x1c,0x1c,0x0e, 0x18,0x1c,0x0e, 0x15,0x1c,0x0e, 0x11,0x1c,0x0e,
348   0x0e,0x1c,0x0e, 0x0e,0x1c,0x11, 0x0e,0x1c,0x15, 0x0e,0x1c,0x18,
349   0x0e,0x1c,0x1c, 0x0e,0x18,0x1c, 0x0e,0x15,0x1c, 0x0e,0x11,0x1c,
350   0x14,0x14,0x1c, 0x16,0x14,0x1c, 0x18,0x14,0x1c, 0x1a,0x14,0x1c,
351   0x1c,0x14,0x1c, 0x1c,0x14,0x1a, 0x1c,0x14,0x18, 0x1c,0x14,0x16,
352   0x1c,0x14,0x14, 0x1c,0x16,0x14, 0x1c,0x18,0x14, 0x1c,0x1a,0x14,
353   0x1c,0x1c,0x14, 0x1a,0x1c,0x14, 0x18,0x1c,0x14, 0x16,0x1c,0x14,
354   0x14,0x1c,0x14, 0x14,0x1c,0x16, 0x14,0x1c,0x18, 0x14,0x1c,0x1a,
355   0x14,0x1c,0x1c, 0x14,0x1a,0x1c, 0x14,0x18,0x1c, 0x14,0x16,0x1c,
356   0x00,0x00,0x10, 0x04,0x00,0x10, 0x08,0x00,0x10, 0x0c,0x00,0x10,
357   0x10,0x00,0x10, 0x10,0x00,0x0c, 0x10,0x00,0x08, 0x10,0x00,0x04,
358   0x10,0x00,0x00, 0x10,0x04,0x00, 0x10,0x08,0x00, 0x10,0x0c,0x00,
359   0x10,0x10,0x00, 0x0c,0x10,0x00, 0x08,0x10,0x00, 0x04,0x10,0x00,
360
361   0x00,0x10,0x00, 0x00,0x10,0x04, 0x00,0x10,0x08, 0x00,0x10,0x0c,
362   0x00,0x10,0x10, 0x00,0x0c,0x10, 0x00,0x08,0x10, 0x00,0x04,0x10,
363   0x08,0x08,0x10, 0x0a,0x08,0x10, 0x0c,0x08,0x10, 0x0e,0x08,0x10,
364   0x10,0x08,0x10, 0x10,0x08,0x0e, 0x10,0x08,0x0c, 0x10,0x08,0x0a,
365   0x10,0x08,0x08, 0x10,0x0a,0x08, 0x10,0x0c,0x08, 0x10,0x0e,0x08,
366   0x10,0x10,0x08, 0x0e,0x10,0x08, 0x0c,0x10,0x08, 0x0a,0x10,0x08,
367   0x08,0x10,0x08, 0x08,0x10,0x0a, 0x08,0x10,0x0c, 0x08,0x10,0x0e,
368   0x08,0x10,0x10, 0x08,0x0e,0x10, 0x08,0x0c,0x10, 0x08,0x0a,0x10,
369   0x0b,0x0b,0x10, 0x0c,0x0b,0x10, 0x0d,0x0b,0x10, 0x0f,0x0b,0x10,
370   0x10,0x0b,0x10, 0x10,0x0b,0x0f, 0x10,0x0b,0x0d, 0x10,0x0b,0x0c,
371   0x10,0x0b,0x0b, 0x10,0x0c,0x0b, 0x10,0x0d,0x0b, 0x10,0x0f,0x0b,
372   0x10,0x10,0x0b, 0x0f,0x10,0x0b, 0x0d,0x10,0x0b, 0x0c,0x10,0x0b,
373   0x0b,0x10,0x0b, 0x0b,0x10,0x0c, 0x0b,0x10,0x0d, 0x0b,0x10,0x0f,
374   0x0b,0x10,0x10, 0x0b,0x0f,0x10, 0x0b,0x0d,0x10, 0x0b,0x0c,0x10,
375   0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
376   0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00
377 };
378
379 static u8 sequ_01[] VAR16 = { 0x08, 0x03, 0x00, 0x02 };
380 static u8 crtc_01[] VAR16 = {
381     0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0, 0xbf, 0x1f,
382     0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
383     0x9c, 0x8e, 0x8f, 0x14, 0x1f, 0x96, 0xb9, 0xa3,
384     0xff };
385 static u8 actl_01[] VAR16 = {
386     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
387     0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
388     0x0c, 0x00, 0x0f, 0x08 };
389 static u8 grdc_01[] VAR16 = {
390     0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x0f, 0xff };
391 static u8 sequ_03[] VAR16 = { 0x00, 0x03, 0x00, 0x02 };
392 static u8 crtc_03[] VAR16 = {
393     0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f,
394     0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
395     0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96, 0xb9, 0xa3,
396     0xff };
397 static u8 sequ_04[] VAR16 = { 0x09, 0x03, 0x00, 0x02 };
398 static u8 crtc_04[] VAR16 = {
399     0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80, 0xbf, 0x1f,
400     0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
401     0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96, 0xb9, 0xa2,
402     0xff };
403 static u8 actl_04[] VAR16 = {
404     0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07,
405     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
406     0x01, 0x00, 0x03, 0x00 };
407 static u8 grdc_04[] VAR16 = {
408     0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0f, 0x0f, 0xff };
409 static u8 sequ_06[] VAR16 = { 0x01, 0x01, 0x00, 0x06 };
410 static u8 crtc_06[] VAR16 = {
411     0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
412     0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413     0x9c, 0x8e, 0x8f, 0x28, 0x00, 0x96, 0xb9, 0xc2,
414     0xff };
415 static u8 actl_06[] VAR16 = {
416     0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
417     0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
418     0x01, 0x00, 0x01, 0x00 };
419 static u8 grdc_06[] VAR16 = {
420     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0f, 0xff };
421 static u8 crtc_07[] VAR16 = {
422     0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f,
423     0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
424     0x9c, 0x8e, 0x8f, 0x28, 0x0f, 0x96, 0xb9, 0xa3,
425     0xff };
426 static u8 actl_07[] VAR16 = {
427     0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
428     0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
429     0x0e, 0x00, 0x0f, 0x08 };
430 static u8 grdc_07[] VAR16 = {
431     0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x0f, 0xff };
432 static u8 sequ_0d[] VAR16 = { 0x09, 0x0f, 0x00, 0x06 };
433 static u8 crtc_0d[] VAR16 = {
434     0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80, 0xbf, 0x1f,
435     0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
436     0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96, 0xb9, 0xe3,
437     0xff };
438 static u8 actl_0d[] VAR16 = {
439     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
440     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
441     0x01, 0x00, 0x0f, 0x00 };
442 static u8 grdc_0d[] VAR16 = {
443     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff };
444 static u8 sequ_0e[] VAR16 = { 0x01, 0x0f, 0x00, 0x06 };
445 static u8 crtc_0e[] VAR16 = {
446     0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
447     0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
448     0x9c, 0x8e, 0x8f, 0x28, 0x00, 0x96, 0xb9, 0xe3,
449     0xff };
450 static u8 crtc_0f[] VAR16 = {
451     0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
452     0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
453     0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63, 0xba, 0xe3,
454     0xff };
455 static u8 actl_0f[] VAR16 = {
456     0x00, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
457     0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,
458     0x01, 0x00, 0x01, 0x00 };
459 static u8 actl_10[] VAR16 = {
460     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
461     0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
462     0x01, 0x00, 0x0f, 0x00 };
463 static u8 crtc_11[] VAR16 = {
464     0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0x0b, 0x3e,
465     0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
466     0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7, 0x04, 0xe3,
467     0xff };
468 static u8 actl_11[] VAR16 = {
469     0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f,
470     0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f,
471     0x01, 0x00, 0x0f, 0x00 };
472 static u8 sequ_13[] VAR16 = { 0x01, 0x0f, 0x00, 0x0e };
473 static u8 crtc_13[] VAR16 = {
474     0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
475     0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476     0x9c, 0x8e, 0x8f, 0x28, 0x40, 0x96, 0xb9, 0xa3,
477     0xff };
478 static u8 actl_13[] VAR16 = {
479     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
480     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
481     0x41, 0x00, 0x0f, 0x00 };
482 static u8 grdc_13[] VAR16 = {
483     0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0f, 0xff };
484 static u8 crtc_6A[] VAR16 = {
485     0x7f, 0x63, 0x63, 0x83, 0x6b, 0x1b, 0x72, 0xf0,
486     0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
487     0x59, 0x8d, 0x57, 0x32, 0x00, 0x57, 0x73, 0xe3,
488     0xff };
489
490
491 /****************************************************************
492  * Video mode list
493  ****************************************************************/
494
495 #define PAL(x) x, sizeof(x)
496 #define VPARAM(x) &video_param_table[x]
497
498 static struct vgamode_s vga_modes[] VAR16 = {
499     //mode model     tx  ty  ch bits sstart    slength
500     // pelm  dac            sequ     misc  crtc     actl     grdc
501     {0x00, CTEXT,    40, 25, 16, 4, SEG_CTEXT, 0x0800
502      , 0xFF, PAL(palette2), sequ_01, 0x67, crtc_01, actl_01, grdc_01 },
503     {0x01, CTEXT,    40, 25, 16, 4, SEG_CTEXT, 0x0800
504      , 0xFF, PAL(palette2), sequ_01, 0x67, crtc_01, actl_01, grdc_01 },
505     {0x02, CTEXT,    80, 25, 16, 4, SEG_CTEXT, 0x1000
506      , 0xFF, PAL(palette2), sequ_03, 0x67, crtc_03, actl_01, grdc_01 },
507     {0x03, CTEXT,    80, 25, 16, 4, SEG_CTEXT, 0x1000
508      , 0xFF, PAL(palette2), sequ_03, 0x67, crtc_03, actl_01, grdc_01 },
509     {0x04, CGA,      40, 25,  8, 2, SEG_CTEXT, 0x0800
510      , 0xFF, PAL(palette1), sequ_04, 0x63, crtc_04, actl_04, grdc_04},
511     {0x05, CGA,      40, 25,  8, 2, SEG_CTEXT, 0x0800
512      , 0xFF, PAL(palette1), sequ_04, 0x63, crtc_04, actl_04, grdc_04},
513     {0x06, CGA,      80, 25,  8, 1, SEG_CTEXT, 0x1000
514      , 0xFF, PAL(palette1), sequ_06, 0x63, crtc_06, actl_06, grdc_06},
515     {0x07, MTEXT,    80, 25, 16, 4, SEG_MTEXT, 0x1000
516      , 0xFF, PAL(palette0), sequ_03, 0x66, crtc_07, actl_07, grdc_07},
517     {0x0D, PLANAR4,  40, 25,  8, 4, SEG_GRAPH, 0x2000
518      , 0xFF, PAL(palette1), sequ_0d, 0x63, crtc_0d, actl_0d, grdc_0d},
519     {0x0E, PLANAR4,  80, 25,  8, 4, SEG_GRAPH, 0x4000
520      , 0xFF, PAL(palette1), sequ_0e, 0x63, crtc_0e, actl_0d, grdc_0d},
521     {0x0F, PLANAR1,  80, 25, 14, 1, SEG_GRAPH, 0x8000
522      , 0xFF, PAL(palette0), sequ_0e, 0xa3, crtc_0f, actl_0f, grdc_0d},
523     {0x10, PLANAR4,  80, 25, 14, 4, SEG_GRAPH, 0x8000
524      , 0xFF, PAL(palette2), sequ_0e, 0xa3, crtc_0f, actl_10, grdc_0d},
525     {0x11, PLANAR1,  80, 30, 16, 1, SEG_GRAPH, 0x0000
526      , 0xFF, PAL(palette2), sequ_0e, 0xe3, crtc_11, actl_11, grdc_0d},
527     {0x12, PLANAR4,  80, 30, 16, 4, SEG_GRAPH, 0x0000
528      , 0xFF, PAL(palette2), sequ_0e, 0xe3, crtc_11, actl_10, grdc_0d},
529     {0x13, LINEAR8,  40, 25,  8, 8, SEG_GRAPH, 0x0000
530      , 0xFF, PAL(palette3), sequ_13, 0x63, crtc_13, actl_13, grdc_13},
531     {0x6A, PLANAR4, 100, 37, 16, 4, SEG_GRAPH, 0x0000
532      , 0xFF, PAL(palette2), sequ_0e, 0xe3, crtc_6A, actl_10, grdc_0d},
533 };
534
535 struct vgamode_s *
536 find_vga_entry(u8 mode)
537 {
538     int i;
539     for (i = 0; i < ARRAY_SIZE(vga_modes); i++) {
540         struct vgamode_s *vmode_g = &vga_modes[i];
541         if (GET_GLOBAL(vmode_g->svgamode) == mode)
542             return vmode_g;
543     }
544     return NULL;
545 }
546
547
548 /****************************************************************
549  * Static functionality table
550  ****************************************************************/
551
552 u8 static_functionality[0x10] VAR16 = {
553  /* 0 */ 0xff,  // All modes supported #1
554  /* 1 */ 0xe0,  // All modes supported #2
555  /* 2 */ 0x0f,  // All modes supported #3
556  /* 3 */ 0x00, 0x00, 0x00, 0x00,  // reserved
557  /* 7 */ 0x07,  // 200, 350, 400 scan lines
558  /* 8 */ 0x02,  // mamimum number of visible charsets in text mode
559  /* 9 */ 0x08,  // total number of charset blocks in text mode
560  /* a */ 0xe7,  // Change to add new functions
561  /* b */ 0x0c,  // Change to add new functions
562  /* c */ 0x00,  // reserved
563  /* d */ 0x00,  // reserved
564  /* e */ 0x00,  // Change to add new functions
565  /* f */ 0x00   // reserved
566 };