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 "vgabios.h" // struct VideoParamTableEntry_s
9 #include "biosvar.h" // GET_GLOBAL
10 #include "util.h" // memcpy_far
11 #include "stdvga.h" // struct vgamode_s
14 /****************************************************************
15 * Video parameter table
16 ****************************************************************/
18 // Standard Video Save Pointer Table
19 struct VideoSavePointer_s {
20 struct segoff_s videoparam;
21 struct segoff_s paramdynamicsave;
22 struct segoff_s textcharset;
23 struct segoff_s graphcharset;
24 struct segoff_s secsavepointer;
28 struct VideoSavePointer_s video_save_pointer_table VAR16;
30 // standard BIOS Video Parameter Table
43 struct VideoParam_s video_param_table[29] VAR16;
46 build_video_param(void)
48 static u8 parammodes[ARRAY_SIZE(video_param_table)] VAR16 = {
49 0, 0, 0, 0, 0x04, 0x05, 0x06, 0x07,
50 0, 0, 0, 0, 0, 0x0d, 0x0e, 0,
51 0, 0x0f, 0x10, 0, 0, 0, 0, 0x01,
52 0x03, 0x07, 0x11, 0x12, 0x13
56 for (i=0; i<ARRAY_SIZE(parammodes); i++) {
57 int mode = GET_GLOBAL(parammodes[i]);
60 struct VideoParam_s *vparam_g = &video_param_table[i];
61 struct vgamode_s *vmode_g = stdvga_find_mode(mode);
64 int width = GET_GLOBAL(vmode_g->width);
65 int height = GET_GLOBAL(vmode_g->height);
66 u8 memmodel = GET_GLOBAL(vmode_g->memmodel);
67 int cheight = GET_GLOBAL(vmode_g->cheight);
68 if (memmodel == MM_TEXT) {
69 SET_VGA(vparam_g->twidth, width);
70 SET_VGA(vparam_g->theightm1, height-1);
72 int cwidth = GET_GLOBAL(vmode_g->cwidth);
73 SET_VGA(vparam_g->twidth, width / cwidth);
74 SET_VGA(vparam_g->theightm1, (height / cheight) - 1);
76 SET_VGA(vparam_g->cheight, cheight);
77 SET_VGA(vparam_g->slength, calc_page_size(memmodel, width, height));
78 struct stdvga_mode_s *stdmode_g = container_of(
79 vmode_g, struct stdvga_mode_s, info);
80 memcpy_far(get_global_seg(), vparam_g->sequ_regs
81 , get_global_seg(), GET_GLOBAL(stdmode_g->sequ_regs)
82 , ARRAY_SIZE(vparam_g->sequ_regs));
83 SET_VGA(vparam_g->miscreg, GET_GLOBAL(stdmode_g->miscreg));
84 memcpy_far(get_global_seg(), vparam_g->crtc_regs
85 , get_global_seg(), GET_GLOBAL(stdmode_g->crtc_regs)
86 , ARRAY_SIZE(vparam_g->crtc_regs));
87 memcpy_far(get_global_seg(), vparam_g->actl_regs
88 , get_global_seg(), GET_GLOBAL(stdmode_g->actl_regs)
89 , ARRAY_SIZE(vparam_g->actl_regs));
90 memcpy_far(get_global_seg(), vparam_g->grdc_regs
91 , get_global_seg(), GET_GLOBAL(stdmode_g->grdc_regs)
92 , ARRAY_SIZE(vparam_g->grdc_regs));
95 SET_VGA(video_save_pointer_table.videoparam
96 , SEGOFF(get_global_seg(), (u32)video_param_table));
100 /****************************************************************
101 * Register definitions
102 ****************************************************************/
105 static u8 palette0[] VAR16 = {
106 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
107 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
108 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
109 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
110 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
111 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
112 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f,
113 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f,
114 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
115 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
116 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
117 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
118 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
119 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
120 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f,
121 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f
124 static u8 palette1[] VAR16 = {
125 0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
126 0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
127 0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
128 0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
129 0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
130 0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f,
131 0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
132 0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f,
133 0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
134 0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
135 0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
136 0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
137 0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
138 0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f,
139 0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
140 0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f
143 static u8 palette2[] VAR16 = {
144 0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
145 0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x2a,0x00, 0x2a,0x2a,0x2a,
146 0x00,0x00,0x15, 0x00,0x00,0x3f, 0x00,0x2a,0x15, 0x00,0x2a,0x3f,
147 0x2a,0x00,0x15, 0x2a,0x00,0x3f, 0x2a,0x2a,0x15, 0x2a,0x2a,0x3f,
148 0x00,0x15,0x00, 0x00,0x15,0x2a, 0x00,0x3f,0x00, 0x00,0x3f,0x2a,
149 0x2a,0x15,0x00, 0x2a,0x15,0x2a, 0x2a,0x3f,0x00, 0x2a,0x3f,0x2a,
150 0x00,0x15,0x15, 0x00,0x15,0x3f, 0x00,0x3f,0x15, 0x00,0x3f,0x3f,
151 0x2a,0x15,0x15, 0x2a,0x15,0x3f, 0x2a,0x3f,0x15, 0x2a,0x3f,0x3f,
152 0x15,0x00,0x00, 0x15,0x00,0x2a, 0x15,0x2a,0x00, 0x15,0x2a,0x2a,
153 0x3f,0x00,0x00, 0x3f,0x00,0x2a, 0x3f,0x2a,0x00, 0x3f,0x2a,0x2a,
154 0x15,0x00,0x15, 0x15,0x00,0x3f, 0x15,0x2a,0x15, 0x15,0x2a,0x3f,
155 0x3f,0x00,0x15, 0x3f,0x00,0x3f, 0x3f,0x2a,0x15, 0x3f,0x2a,0x3f,
156 0x15,0x15,0x00, 0x15,0x15,0x2a, 0x15,0x3f,0x00, 0x15,0x3f,0x2a,
157 0x3f,0x15,0x00, 0x3f,0x15,0x2a, 0x3f,0x3f,0x00, 0x3f,0x3f,0x2a,
158 0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
159 0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f
162 static u8 palette3[] VAR16 = {
163 0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
164 0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
165 0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
166 0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f,
167 0x00,0x00,0x00, 0x05,0x05,0x05, 0x08,0x08,0x08, 0x0b,0x0b,0x0b,
168 0x0e,0x0e,0x0e, 0x11,0x11,0x11, 0x14,0x14,0x14, 0x18,0x18,0x18,
169 0x1c,0x1c,0x1c, 0x20,0x20,0x20, 0x24,0x24,0x24, 0x28,0x28,0x28,
170 0x2d,0x2d,0x2d, 0x32,0x32,0x32, 0x38,0x38,0x38, 0x3f,0x3f,0x3f,
171 0x00,0x00,0x3f, 0x10,0x00,0x3f, 0x1f,0x00,0x3f, 0x2f,0x00,0x3f,
172 0x3f,0x00,0x3f, 0x3f,0x00,0x2f, 0x3f,0x00,0x1f, 0x3f,0x00,0x10,
173 0x3f,0x00,0x00, 0x3f,0x10,0x00, 0x3f,0x1f,0x00, 0x3f,0x2f,0x00,
174 0x3f,0x3f,0x00, 0x2f,0x3f,0x00, 0x1f,0x3f,0x00, 0x10,0x3f,0x00,
175 0x00,0x3f,0x00, 0x00,0x3f,0x10, 0x00,0x3f,0x1f, 0x00,0x3f,0x2f,
176 0x00,0x3f,0x3f, 0x00,0x2f,0x3f, 0x00,0x1f,0x3f, 0x00,0x10,0x3f,
177 0x1f,0x1f,0x3f, 0x27,0x1f,0x3f, 0x2f,0x1f,0x3f, 0x37,0x1f,0x3f,
178 0x3f,0x1f,0x3f, 0x3f,0x1f,0x37, 0x3f,0x1f,0x2f, 0x3f,0x1f,0x27,
180 0x3f,0x1f,0x1f, 0x3f,0x27,0x1f, 0x3f,0x2f,0x1f, 0x3f,0x37,0x1f,
181 0x3f,0x3f,0x1f, 0x37,0x3f,0x1f, 0x2f,0x3f,0x1f, 0x27,0x3f,0x1f,
182 0x1f,0x3f,0x1f, 0x1f,0x3f,0x27, 0x1f,0x3f,0x2f, 0x1f,0x3f,0x37,
183 0x1f,0x3f,0x3f, 0x1f,0x37,0x3f, 0x1f,0x2f,0x3f, 0x1f,0x27,0x3f,
184 0x2d,0x2d,0x3f, 0x31,0x2d,0x3f, 0x36,0x2d,0x3f, 0x3a,0x2d,0x3f,
185 0x3f,0x2d,0x3f, 0x3f,0x2d,0x3a, 0x3f,0x2d,0x36, 0x3f,0x2d,0x31,
186 0x3f,0x2d,0x2d, 0x3f,0x31,0x2d, 0x3f,0x36,0x2d, 0x3f,0x3a,0x2d,
187 0x3f,0x3f,0x2d, 0x3a,0x3f,0x2d, 0x36,0x3f,0x2d, 0x31,0x3f,0x2d,
188 0x2d,0x3f,0x2d, 0x2d,0x3f,0x31, 0x2d,0x3f,0x36, 0x2d,0x3f,0x3a,
189 0x2d,0x3f,0x3f, 0x2d,0x3a,0x3f, 0x2d,0x36,0x3f, 0x2d,0x31,0x3f,
190 0x00,0x00,0x1c, 0x07,0x00,0x1c, 0x0e,0x00,0x1c, 0x15,0x00,0x1c,
191 0x1c,0x00,0x1c, 0x1c,0x00,0x15, 0x1c,0x00,0x0e, 0x1c,0x00,0x07,
192 0x1c,0x00,0x00, 0x1c,0x07,0x00, 0x1c,0x0e,0x00, 0x1c,0x15,0x00,
193 0x1c,0x1c,0x00, 0x15,0x1c,0x00, 0x0e,0x1c,0x00, 0x07,0x1c,0x00,
194 0x00,0x1c,0x00, 0x00,0x1c,0x07, 0x00,0x1c,0x0e, 0x00,0x1c,0x15,
195 0x00,0x1c,0x1c, 0x00,0x15,0x1c, 0x00,0x0e,0x1c, 0x00,0x07,0x1c,
197 0x0e,0x0e,0x1c, 0x11,0x0e,0x1c, 0x15,0x0e,0x1c, 0x18,0x0e,0x1c,
198 0x1c,0x0e,0x1c, 0x1c,0x0e,0x18, 0x1c,0x0e,0x15, 0x1c,0x0e,0x11,
199 0x1c,0x0e,0x0e, 0x1c,0x11,0x0e, 0x1c,0x15,0x0e, 0x1c,0x18,0x0e,
200 0x1c,0x1c,0x0e, 0x18,0x1c,0x0e, 0x15,0x1c,0x0e, 0x11,0x1c,0x0e,
201 0x0e,0x1c,0x0e, 0x0e,0x1c,0x11, 0x0e,0x1c,0x15, 0x0e,0x1c,0x18,
202 0x0e,0x1c,0x1c, 0x0e,0x18,0x1c, 0x0e,0x15,0x1c, 0x0e,0x11,0x1c,
203 0x14,0x14,0x1c, 0x16,0x14,0x1c, 0x18,0x14,0x1c, 0x1a,0x14,0x1c,
204 0x1c,0x14,0x1c, 0x1c,0x14,0x1a, 0x1c,0x14,0x18, 0x1c,0x14,0x16,
205 0x1c,0x14,0x14, 0x1c,0x16,0x14, 0x1c,0x18,0x14, 0x1c,0x1a,0x14,
206 0x1c,0x1c,0x14, 0x1a,0x1c,0x14, 0x18,0x1c,0x14, 0x16,0x1c,0x14,
207 0x14,0x1c,0x14, 0x14,0x1c,0x16, 0x14,0x1c,0x18, 0x14,0x1c,0x1a,
208 0x14,0x1c,0x1c, 0x14,0x1a,0x1c, 0x14,0x18,0x1c, 0x14,0x16,0x1c,
209 0x00,0x00,0x10, 0x04,0x00,0x10, 0x08,0x00,0x10, 0x0c,0x00,0x10,
210 0x10,0x00,0x10, 0x10,0x00,0x0c, 0x10,0x00,0x08, 0x10,0x00,0x04,
211 0x10,0x00,0x00, 0x10,0x04,0x00, 0x10,0x08,0x00, 0x10,0x0c,0x00,
212 0x10,0x10,0x00, 0x0c,0x10,0x00, 0x08,0x10,0x00, 0x04,0x10,0x00,
214 0x00,0x10,0x00, 0x00,0x10,0x04, 0x00,0x10,0x08, 0x00,0x10,0x0c,
215 0x00,0x10,0x10, 0x00,0x0c,0x10, 0x00,0x08,0x10, 0x00,0x04,0x10,
216 0x08,0x08,0x10, 0x0a,0x08,0x10, 0x0c,0x08,0x10, 0x0e,0x08,0x10,
217 0x10,0x08,0x10, 0x10,0x08,0x0e, 0x10,0x08,0x0c, 0x10,0x08,0x0a,
218 0x10,0x08,0x08, 0x10,0x0a,0x08, 0x10,0x0c,0x08, 0x10,0x0e,0x08,
219 0x10,0x10,0x08, 0x0e,0x10,0x08, 0x0c,0x10,0x08, 0x0a,0x10,0x08,
220 0x08,0x10,0x08, 0x08,0x10,0x0a, 0x08,0x10,0x0c, 0x08,0x10,0x0e,
221 0x08,0x10,0x10, 0x08,0x0e,0x10, 0x08,0x0c,0x10, 0x08,0x0a,0x10,
222 0x0b,0x0b,0x10, 0x0c,0x0b,0x10, 0x0d,0x0b,0x10, 0x0f,0x0b,0x10,
223 0x10,0x0b,0x10, 0x10,0x0b,0x0f, 0x10,0x0b,0x0d, 0x10,0x0b,0x0c,
224 0x10,0x0b,0x0b, 0x10,0x0c,0x0b, 0x10,0x0d,0x0b, 0x10,0x0f,0x0b,
225 0x10,0x10,0x0b, 0x0f,0x10,0x0b, 0x0d,0x10,0x0b, 0x0c,0x10,0x0b,
226 0x0b,0x10,0x0b, 0x0b,0x10,0x0c, 0x0b,0x10,0x0d, 0x0b,0x10,0x0f,
227 0x0b,0x10,0x10, 0x0b,0x0f,0x10, 0x0b,0x0d,0x10, 0x0b,0x0c,0x10,
228 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
229 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00
232 static u8 sequ_01[] VAR16 = { 0x08, 0x03, 0x00, 0x02 };
233 static u8 crtc_01[] VAR16 = {
234 0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0, 0xbf, 0x1f,
235 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
236 0x9c, 0x8e, 0x8f, 0x14, 0x1f, 0x96, 0xb9, 0xa3,
238 static u8 actl_01[] VAR16 = {
239 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
240 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
241 0x0c, 0x00, 0x0f, 0x08 };
242 static u8 grdc_01[] VAR16 = {
243 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x0f, 0xff };
244 static u8 sequ_03[] VAR16 = { 0x00, 0x03, 0x00, 0x02 };
245 static u8 crtc_03[] VAR16 = {
246 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f,
247 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
248 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96, 0xb9, 0xa3,
250 static u8 sequ_04[] VAR16 = { 0x09, 0x03, 0x00, 0x02 };
251 static u8 crtc_04[] VAR16 = {
252 0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80, 0xbf, 0x1f,
253 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254 0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96, 0xb9, 0xa2,
256 static u8 actl_04[] VAR16 = {
257 0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07,
258 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
259 0x01, 0x00, 0x03, 0x00 };
260 static u8 grdc_04[] VAR16 = {
261 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0f, 0x0f, 0xff };
262 static u8 sequ_06[] VAR16 = { 0x01, 0x01, 0x00, 0x06 };
263 static u8 crtc_06[] VAR16 = {
264 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
265 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
266 0x9c, 0x8e, 0x8f, 0x28, 0x00, 0x96, 0xb9, 0xc2,
268 static u8 actl_06[] VAR16 = {
269 0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
270 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
271 0x01, 0x00, 0x01, 0x00 };
272 static u8 grdc_06[] VAR16 = {
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0f, 0xff };
274 static u8 crtc_07[] VAR16 = {
275 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f,
276 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
277 0x9c, 0x8e, 0x8f, 0x28, 0x0f, 0x96, 0xb9, 0xa3,
279 static u8 actl_07[] VAR16 = {
280 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
281 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
282 0x0e, 0x00, 0x0f, 0x08 };
283 static u8 grdc_07[] VAR16 = {
284 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x0f, 0xff };
285 static u8 sequ_0d[] VAR16 = { 0x09, 0x0f, 0x00, 0x06 };
286 static u8 crtc_0d[] VAR16 = {
287 0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80, 0xbf, 0x1f,
288 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96, 0xb9, 0xe3,
291 static u8 actl_0d[] VAR16 = {
292 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
293 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
294 0x01, 0x00, 0x0f, 0x00 };
295 static u8 grdc_0d[] VAR16 = {
296 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff };
297 static u8 sequ_0e[] VAR16 = { 0x01, 0x0f, 0x00, 0x06 };
298 static u8 crtc_0e[] VAR16 = {
299 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
300 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x9c, 0x8e, 0x8f, 0x28, 0x00, 0x96, 0xb9, 0xe3,
303 static u8 crtc_0f[] VAR16 = {
304 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
305 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
306 0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63, 0xba, 0xe3,
308 static u8 actl_0f[] VAR16 = {
309 0x00, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
310 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,
311 0x01, 0x00, 0x01, 0x00 };
312 static u8 actl_10[] VAR16 = {
313 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
314 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
315 0x01, 0x00, 0x0f, 0x00 };
316 static u8 crtc_11[] VAR16 = {
317 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0x0b, 0x3e,
318 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7, 0x04, 0xe3,
321 static u8 actl_11[] VAR16 = {
322 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f,
323 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f,
324 0x01, 0x00, 0x0f, 0x00 };
325 static u8 sequ_13[] VAR16 = { 0x01, 0x0f, 0x00, 0x0e };
326 static u8 crtc_13[] VAR16 = {
327 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
328 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x9c, 0x8e, 0x8f, 0x28, 0x40, 0x96, 0xb9, 0xa3,
331 static u8 actl_13[] VAR16 = {
332 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
333 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
334 0x41, 0x00, 0x0f, 0x00 };
335 static u8 grdc_13[] VAR16 = {
336 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0f, 0xff };
337 static u8 crtc_6A[] VAR16 = {
338 0x7f, 0x63, 0x63, 0x83, 0x6b, 0x1b, 0x72, 0xf0,
339 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x59, 0x8d, 0x57, 0x32, 0x00, 0x57, 0x73, 0xe3,
344 /****************************************************************
346 ****************************************************************/
348 #define PAL(x) x, sizeof(x)
349 #define VPARAM(x) &video_param_table[x]
351 static struct stdvga_mode_s vga_modes[] VAR16 = {
352 //mode { model tx ty bpp cw ch sstart }
353 // pelm dac sequ misc crtc actl grdc
354 {0x00, { MM_TEXT, 40, 25, 4, 9, 16, SEG_CTEXT }
355 , 0xFF, PAL(palette2), sequ_01, 0x67, crtc_01, actl_01, grdc_01},
356 {0x01, { MM_TEXT, 40, 25, 4, 9, 16, SEG_CTEXT }
357 , 0xFF, PAL(palette2), sequ_01, 0x67, crtc_01, actl_01, grdc_01},
358 {0x02, { MM_TEXT, 80, 25, 4, 9, 16, SEG_CTEXT }
359 , 0xFF, PAL(palette2), sequ_03, 0x67, crtc_03, actl_01, grdc_01},
360 {0x03, { MM_TEXT, 80, 25, 4, 9, 16, SEG_CTEXT }
361 , 0xFF, PAL(palette2), sequ_03, 0x67, crtc_03, actl_01, grdc_01},
362 {0x04, { MM_CGA, 320, 200, 2, 8, 8, SEG_CTEXT }
363 , 0xFF, PAL(palette1), sequ_04, 0x63, crtc_04, actl_04, grdc_04},
364 {0x05, { MM_CGA, 320, 200, 2, 8, 8, SEG_CTEXT }
365 , 0xFF, PAL(palette1), sequ_04, 0x63, crtc_04, actl_04, grdc_04},
366 {0x06, { MM_CGA, 640, 200, 1, 8, 8, SEG_CTEXT }
367 , 0xFF, PAL(palette1), sequ_06, 0x63, crtc_06, actl_06, grdc_06},
368 {0x07, { MM_TEXT, 80, 25, 4, 9, 16, SEG_MTEXT }
369 , 0xFF, PAL(palette0), sequ_03, 0x66, crtc_07, actl_07, grdc_07},
370 {0x0D, { MM_PLANAR, 320, 200, 4, 8, 8, SEG_GRAPH }
371 , 0xFF, PAL(palette1), sequ_0d, 0x63, crtc_0d, actl_0d, grdc_0d},
372 {0x0E, { MM_PLANAR, 640, 200, 4, 8, 8, SEG_GRAPH }
373 , 0xFF, PAL(palette1), sequ_0e, 0x63, crtc_0e, actl_0d, grdc_0d},
374 {0x0F, { MM_PLANAR, 640, 350, 1, 8, 14, SEG_GRAPH }
375 , 0xFF, PAL(palette0), sequ_0e, 0xa3, crtc_0f, actl_0f, grdc_0d},
376 {0x10, { MM_PLANAR, 640, 350, 4, 8, 14, SEG_GRAPH }
377 , 0xFF, PAL(palette2), sequ_0e, 0xa3, crtc_0f, actl_10, grdc_0d},
378 {0x11, { MM_PLANAR, 640, 480, 1, 8, 16, SEG_GRAPH }
379 , 0xFF, PAL(palette2), sequ_0e, 0xe3, crtc_11, actl_11, grdc_0d},
380 {0x12, { MM_PLANAR, 640, 480, 4, 8, 16, SEG_GRAPH }
381 , 0xFF, PAL(palette2), sequ_0e, 0xe3, crtc_11, actl_10, grdc_0d},
382 {0x13, { MM_PACKED, 320, 200, 8, 8, 8, SEG_GRAPH }
383 , 0xFF, PAL(palette3), sequ_13, 0x63, crtc_13, actl_13, grdc_13},
384 {0x6A, { MM_PLANAR, 800, 600, 4, 8, 16, SEG_GRAPH }
385 , 0xFF, PAL(palette2), sequ_0e, 0xe3, crtc_6A, actl_10, grdc_0d},
389 stdvga_find_mode(int mode)
392 for (i = 0; i < ARRAY_SIZE(vga_modes); i++) {
393 struct stdvga_mode_s *stdmode_g = &vga_modes[i];
394 if (GET_GLOBAL(stdmode_g->mode) == mode)
395 return &stdmode_g->info;
401 /****************************************************************
402 * Static functionality table
403 ****************************************************************/
405 u8 static_functionality[0x10] VAR16 = {
406 /* 0 */ 0xff, // All modes supported #1
407 /* 1 */ 0xe0, // All modes supported #2
408 /* 2 */ 0x0f, // All modes supported #3
409 /* 3 */ 0x00, 0x00, 0x00, 0x00, // reserved
410 /* 7 */ 0x07, // 200, 350, 400 scan lines
411 /* 8 */ 0x02, // mamimum number of visible charsets in text mode
412 /* 9 */ 0x08, // total number of charset blocks in text mode
413 /* a */ 0xe7, // Change to add new functions
414 /* b */ 0x0c, // Change to add new functions
415 /* c */ 0x00, // reserved
416 /* d */ 0x00, // reserved
417 /* e */ 0x00, // Change to add new functions
418 /* f */ 0x00 // reserved