1 // Tables used by VGA bios
3 // Copyright (C) 2009 Kevin O'Connor <kevin@koconnor.net>
4 // Copyright (C) 2001-2008 the LGPL VGABios developers Team
6 // This file may be distributed under the terms of the GNU LGPLv3 license.
8 #include "vgatables.h" // struct VideoParamTableEntry_s
9 #include "biosvar.h" // GET_GLOBAL
12 /****************************************************************
13 * Video parameter table
14 ****************************************************************/
16 struct VideoSavePointer_s video_save_pointer_table VAR16;
18 struct VideoParam_s video_param_table[] VAR16 = {
19 // index=0x00 no mode defined
21 // index=0x01 no mode defined
23 // index=0x02 no mode defined
25 // index=0x03 no mode defined
27 // index=0x04 vga mode 0x04
28 { 40, 24, 8, 0x0800, /* tw, th-1, ch, slength */
29 { 0x09, 0x03, 0x00, 0x02 }, /* sequ_regs */
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 */
40 /* index=0x05 vga mode 0x05 */
41 { 40, 24, 8, 0x0800, /* tw, th-1, ch, slength */
42 { 0x09, 0x03, 0x00, 0x02 }, /* sequ_regs */
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 */
53 /* index=0x06 vga mode 0x06 */
54 { 80, 24, 8, 0x1000, /* tw, th-1, ch, slength */
55 { 0x01, 0x01, 0x00, 0x06 }, /* sequ_regs */
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 */
66 /* index=0x07 vga mode 0x07 */
67 { 80, 24, 16, 0x1000, /* tw, th-1, ch, slength */
68 { 0x00, 0x03, 0x00, 0x02 }, /* sequ_regs */
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 */
79 /* index=0x08 no mode defined */
81 /* index=0x09 no mode defined */
83 /* index=0x0a no mode defined */
85 /* index=0x0b no mode defined */
87 /* index=0x0c no mode defined */
89 /* index=0x0d vga mode 0x0d */
90 { 40, 24, 8, 0x2000, /* tw, th-1, ch, slength */
91 { 0x09, 0x0f, 0x00, 0x06 }, /* sequ_regs */
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 */
102 /* index=0x0e vga mode 0x0e */
103 { 80, 24, 8, 0x4000, /* tw, th-1, ch, slength */
104 { 0x01, 0x0f, 0x00, 0x06 }, /* sequ_regs */
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 */
115 /* index=0x0f no mode defined */
117 /* index=0x10 no mode defined */
119 /* index=0x11 vga mode 0x0f */
120 { 80, 24, 14, 0x8000, /* tw, th-1, ch, slength */
121 { 0x01, 0x0f, 0x00, 0x06 }, /* sequ_regs */
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 */
132 /* index=0x12 vga mode 0x10 */
133 { 80, 24, 14, 0x8000, /* tw, th-1, ch, slength */
134 { 0x01, 0x0f, 0x00, 0x06 }, /* sequ_regs */
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 */
145 /* index=0x13 no mode defined */
147 /* index=0x14 no mode defined */
149 /* index=0x15 no mode defined */
151 /* index=0x16 no mode defined */
153 /* index=0x17 vga mode 0x01 */
154 { 40, 24, 16, 0x0800, /* tw, th-1, ch, slength */
155 { 0x08, 0x03, 0x00, 0x02 }, /* sequ_regs */
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 */
166 /* index=0x18 vga mode 0x03 */
167 { 80, 24, 16, 0x1000, /* tw, th-1, ch, slength */
168 { 0x00, 0x03, 0x00, 0x02 }, /* sequ_regs */
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 */
179 /* index=0x19 vga mode 0x07 */
180 { 80, 24, 16, 0x1000, /* tw, th-1, ch, slength */
181 { 0x00, 0x03, 0x00, 0x02 }, /* sequ_regs */
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 */
192 /* index=0x1a vga mode 0x11 */
193 { 80, 29, 16, 0x0000, /* tw, th-1, ch, slength */
194 { 0x01, 0x0f, 0x00, 0x06 }, /* sequ_regs */
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 */
205 /* index=0x1b vga mode 0x12 */
206 { 80, 29, 16, 0x0000, /* tw, th-1, ch, slength */
207 { 0x01, 0x0f, 0x00, 0x06 }, /* sequ_regs */
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 */
218 /* index=0x1c vga mode 0x13 */
219 { 40, 24, 8, 0x0000, /* tw, th-1, ch, slength */
220 { 0x01, 0x0f, 0x00, 0x0e }, /* sequ_regs */
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 */
231 /* index=0x1d vga mode 0x6a */
232 { 100, 36, 16, 0x0000, /* tw, th-1, ch, slength */
233 { 0x01, 0x0f, 0x00, 0x06 }, /* sequ_regs */
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 */
247 /****************************************************************
248 * Register definitions
249 ****************************************************************/
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
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
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
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,
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,
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,
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
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
491 /****************************************************************
493 ****************************************************************/
495 #define PAL(x) x, sizeof(x)
496 #define VPARAM(x) &video_param_table[x]
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},
536 find_vga_entry(u8 mode)
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)
548 /****************************************************************
549 * Static functionality table
550 ****************************************************************/
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