]> 4ch.mooo.com Git - 16.git/blob - 16/w_modex/MODEX.CPP
f266a98653fde1d5a55dbefcbf73a472cc0c468f
[16.git] / 16 / w_modex / MODEX.CPP
1 #include <conio.h>\r
2 #include <dos.h>\r
3 #include <mem.h>\r
4 \r
5 #include "modex.hpp"\r
6 \r
7 #define ATTRCON_ADDR    0x3C0\r
8 #define MISC_ADDR       0x3C2\r
9 #define VGAENABLE_ADDR  0x3C3\r
10 #define SEQU_ADDR       0x3C4\r
11 #define GRACON_ADDR     0x3CE\r
12 #define CRTC_ADDR       0x3D4\r
13 #define STATUS_ADDR     0x3DA\r
14 \r
15 unsigned short width, height, widthBytes, num_pages;\r
16 unsigned short pageSize, activeStart, visibleStart;\r
17 unsigned char write_plane, read_plane;\r
18 unsigned char *RowsX[600];\r
19 unsigned char line_head[4] = { 0xFF, 0x0E, 0x0C, 0x08 };\r
20 unsigned char line_tail[4] = { 0x00, 0x01, 0x03, 0x07 };\r
21 unsigned short plane_mask[4] = { PLANE_0, PLANE_1, PLANE_2, PLANE_3 };\r
22 unsigned short read_mask[4]  = { READ_PLANE_0, READ_PLANE_1,\r
23                                  READ_PLANE_2, READ_PLANE_3 };\r
24 unsigned short text_mask[16] = { 0x0002, 0x0102, 0x0202, 0x0302,\r
25                                  0x0402, 0x0502, 0x0602, 0x0702,\r
26                                  0x0802, 0x0902, 0x0A02, 0x0B02,\r
27                                  0x0C02, 0x0D02, 0x0E02, 0x0F02 };\r
28 unsigned short page_offset[5];\r
29 unsigned short page_mask_high[5];\r
30 unsigned short page_mask_low[5];\r
31 \r
32 \r
33 unsigned short ModeX_256x224regs[75] =\r
34 {\r
35     0x3c2, 0x00, 0xe3,\r
36     0x3d4, 0x00, 0x5f,\r
37     0x3d4, 0x01, 0x3f,\r
38     0x3d4, 0x02, 0x40,\r
39     0x3d4, 0x03, 0x82,\r
40     0x3d4, 0x04, 0x4a,\r
41     0x3d4, 0x05, 0x9a,\r
42     0x3d4, 0x06, 0x0b,\r
43     0x3d4, 0x07, 0x3e,\r
44     0x3d4, 0x08, 0x00,\r
45     0x3d4, 0x09, 0x41,\r
46     0x3d4, 0x10, 0xda,\r
47     0x3d4, 0x11, 0x9c,\r
48     0x3d4, 0x12, 0xbf,\r
49     0x3d4, 0x13, 0x20,\r
50     0x3d4, 0x14, 0x00,\r
51     0x3d4, 0x15, 0xc7,\r
52     0x3d4, 0x16, 0x04,\r
53     0x3d4, 0x17, 0xe3,\r
54     0x3c4, 0x01, 0x01,\r
55     0x3c4, 0x04, 0x06,\r
56     0x3ce, 0x05, 0x40,\r
57     0x3ce, 0x06, 0x05,\r
58     0x3c0, 0x10, 0x41,\r
59     0x3c0, 0x13, 0x00\r
60 };\r
61 \r
62 unsigned short ModeX_256x240regs[75] =\r
63 {\r
64     0x3c2, 0x00, 0xe3,\r
65     0x3d4, 0x00, 0x5f,\r
66     0x3d4, 0x01, 0x3f,\r
67     0x3d4, 0x02, 0x40,\r
68     0x3d4, 0x03, 0x82,\r
69     0x3d4, 0x04, 0x4e,\r
70     0x3d4, 0x05, 0x96,\r
71     0x3d4, 0x06, 0x0d,\r
72     0x3d4, 0x07, 0x3e,\r
73     0x3d4, 0x08, 0x00,\r
74     0x3d4, 0x09, 0x41,\r
75     0x3d4, 0x10, 0xea,\r
76     0x3d4, 0x11, 0xac,\r
77     0x3d4, 0x12, 0xdf,\r
78     0x3d4, 0x13, 0x20,\r
79     0x3d4, 0x14, 0x00,\r
80     0x3d4, 0x15, 0xe7,\r
81     0x3d4, 0x16, 0x06,\r
82     0x3d4, 0x17, 0xe3,\r
83     0x3c4, 0x01, 0x01,\r
84     0x3c4, 0x04, 0x06,\r
85     0x3ce, 0x05, 0x40,\r
86     0x3ce, 0x06, 0x05,\r
87     0x3c0, 0x10, 0x41,\r
88     0x3c0, 0x13, 0x00\r
89 };\r
90 \r
91 unsigned short ModeX_256x256regs[75] =\r
92 {\r
93     0x3c2, 0x00, 0xe3,\r
94     0x3d4, 0x00, 0x5f,\r
95     0x3d4, 0x01, 0x3f,\r
96     0x3d4, 0x02, 0x40,\r
97     0x3d4, 0x03, 0x82,\r
98     0x3d4, 0x04, 0x4a,\r
99     0x3d4, 0x05, 0x9a,\r
100     0x3d4, 0x06, 0x23,\r
101     0x3d4, 0x07, 0xb2,\r
102     0x3d4, 0x08, 0x00,\r
103     0x3d4, 0x09, 0x61,\r
104     0x3d4, 0x10, 0x0a,\r
105     0x3d4, 0x11, 0xac,\r
106     0x3d4, 0x12, 0xff,\r
107     0x3d4, 0x13, 0x20,\r
108     0x3d4, 0x14, 0x00,\r
109     0x3d4, 0x15, 0x07,\r
110     0x3d4, 0x16, 0x1a,\r
111     0x3d4, 0x17, 0xe3,\r
112     0x3c4, 0x01, 0x01,\r
113     0x3c4, 0x04, 0x06,\r
114     0x3ce, 0x05, 0x40,\r
115     0x3ce, 0x06, 0x05,\r
116     0x3c0, 0x10, 0x41,\r
117     0x3c0, 0x13, 0x00\r
118 };\r
119 \r
120 unsigned short ModeX_256x480regs[75] =\r
121 {\r
122     0x3c2, 0x00, 0xe3,\r
123     0x3d4, 0x00, 0x5f,\r
124     0x3d4, 0x01, 0x3f,\r
125     0x3d4, 0x02, 0x40,\r
126     0x3d4, 0x03, 0x82,\r
127     0x3d4, 0x04, 0x4e,\r
128     0x3d4, 0x05, 0x96,\r
129     0x3d4, 0x06, 0x0d,\r
130     0x3d4, 0x07, 0x3e,\r
131     0x3d4, 0x08, 0x00,\r
132     0x3d4, 0x09, 0x40,\r
133     0x3d4, 0x10, 0xea,\r
134     0x3d4, 0x11, 0xac,\r
135     0x3d4, 0x12, 0xdf,\r
136     0x3d4, 0x13, 0x20,\r
137     0x3d4, 0x14, 0x00,\r
138     0x3d4, 0x15, 0xe7,\r
139     0x3d4, 0x16, 0x06,\r
140     0x3d4, 0x17, 0xe3,\r
141     0x3c4, 0x01, 0x01,\r
142     0x3c4, 0x04, 0x06,\r
143     0x3ce, 0x05, 0x40,\r
144     0x3ce, 0x06, 0x05,\r
145     0x3c0, 0x10, 0x41,\r
146     0x3c0, 0x13, 0x00\r
147 };\r
148 \r
149 unsigned short ModeX_320x200regs[75] =\r
150 {\r
151     0x3c2, 0x00, 0x63,\r
152     0x3d4, 0x00, 0x5f,\r
153     0x3d4, 0x01, 0x4f,\r
154     0x3d4, 0x02, 0x50,\r
155     0x3d4, 0x03, 0x82,\r
156     0x3d4, 0x04, 0x54,\r
157     0x3d4, 0x05, 0x80,\r
158     0x3d4, 0x06, 0xbf,\r
159     0x3d4, 0x07, 0x1f,\r
160     0x3d4, 0x08, 0x00,\r
161     0x3d4, 0x09, 0x41,\r
162     0x3d4, 0x10, 0x9c,\r
163     0x3d4, 0x11, 0x8e,\r
164     0x3d4, 0x12, 0x8f,\r
165     0x3d4, 0x13, 0x28,\r
166     0x3d4, 0x14, 0x00,\r
167     0x3d4, 0x15, 0x96,\r
168     0x3d4, 0x16, 0xb9,\r
169     0x3d4, 0x17, 0xe3,\r
170     0x3c4, 0x01, 0x01,\r
171     0x3c4, 0x04, 0x06,\r
172     0x3ce, 0x05, 0x40,\r
173     0x3ce, 0x06, 0x05,\r
174     0x3c0, 0x10, 0x41,\r
175     0x3c0, 0x13, 0x00\r
176 };\r
177 \r
178 unsigned short ModeX_320x240regs[75] =\r
179 {\r
180     0x3c2, 0x00, 0xe3,\r
181     0x3d4, 0x00, 0x5f,\r
182     0x3d4, 0x01, 0x4f,\r
183     0x3d4, 0x02, 0x50,\r
184     0x3d4, 0x03, 0x82,\r
185     0x3d4, 0x04, 0x54,\r
186     0x3d4, 0x05, 0x80,\r
187     0x3d4, 0x06, 0x0d,\r
188     0x3d4, 0x07, 0x3e,\r
189     0x3d4, 0x08, 0x00,\r
190     0x3d4, 0x09, 0x41,\r
191     0x3d4, 0x10, 0xea,\r
192     0x3d4, 0x11, 0xac,\r
193     0x3d4, 0x12, 0xdf,\r
194     0x3d4, 0x13, 0x28,\r
195     0x3d4, 0x14, 0x00,\r
196     0x3d4, 0x15, 0xe7,\r
197     0x3d4, 0x16, 0x06,\r
198     0x3d4, 0x17, 0xe3,\r
199     0x3c4, 0x01, 0x01,\r
200     0x3c4, 0x04, 0x06,\r
201     0x3ce, 0x05, 0x40,\r
202     0x3ce, 0x06, 0x05,\r
203     0x3c0, 0x10, 0x41,\r
204     0x3c0, 0x13, 0x00\r
205 };\r
206 \r
207 unsigned short ModeX_320x400regs[75] =\r
208 {\r
209     0x3c2, 0x00, 0x63,\r
210     0x3d4, 0x00, 0x5f,\r
211     0x3d4, 0x01, 0x4f,\r
212     0x3d4, 0x02, 0x50,\r
213     0x3d4, 0x03, 0x82,\r
214     0x3d4, 0x04, 0x54,\r
215     0x3d4, 0x05, 0x80,\r
216     0x3d4, 0x06, 0xbf,\r
217     0x3d4, 0x07, 0x1f,\r
218     0x3d4, 0x08, 0x00,\r
219     0x3d4, 0x09, 0x40,\r
220     0x3d4, 0x10, 0x9c,\r
221     0x3d4, 0x11, 0x8e,\r
222     0x3d4, 0x12, 0x8f,\r
223     0x3d4, 0x13, 0x28,\r
224     0x3d4, 0x14, 0x00,\r
225     0x3d4, 0x15, 0x96,\r
226     0x3d4, 0x16, 0xb9,\r
227     0x3d4, 0x17, 0xe3,\r
228     0x3c4, 0x01, 0x01,\r
229     0x3c4, 0x04, 0x06,\r
230     0x3ce, 0x05, 0x40,\r
231     0x3ce, 0x06, 0x05,\r
232     0x3c0, 0x10, 0x41,\r
233     0x3c0, 0x13, 0x00\r
234 };\r
235 \r
236 unsigned short ModeX_320x480regs[75] =\r
237 {\r
238     0x3c2, 0x00, 0xe3,\r
239     0x3d4, 0x00, 0x5f,\r
240     0x3d4, 0x01, 0x4f,\r
241     0x3d4, 0x02, 0x50,\r
242     0x3d4, 0x03, 0x82,\r
243     0x3d4, 0x04, 0x54,\r
244     0x3d4, 0x05, 0x80,\r
245     0x3d4, 0x06, 0x0d,\r
246     0x3d4, 0x07, 0x3e,\r
247     0x3d4, 0x08, 0x00,\r
248     0x3d4, 0x09, 0x40,\r
249     0x3d4, 0x10, 0xea,\r
250     0x3d4, 0x11, 0xac,\r
251     0x3d4, 0x12, 0xdf,\r
252     0x3d4, 0x13, 0x28,\r
253     0x3d4, 0x14, 0x00,\r
254     0x3d4, 0x15, 0xe7,\r
255     0x3d4, 0x16, 0x06,\r
256     0x3d4, 0x17, 0xe3,\r
257     0x3c4, 0x01, 0x01,\r
258     0x3c4, 0x04, 0x06,\r
259     0x3ce, 0x05, 0x40,\r
260     0x3ce, 0x06, 0x05,\r
261     0x3c0, 0x10, 0x41,\r
262     0x3c0, 0x13, 0x00\r
263 };\r
264 \r
265 unsigned short ModeX_360x200regs[75] =\r
266 {\r
267     0x3c2, 0x00, 0x67,\r
268     0x3d4, 0x00, 0x6b,\r
269     0x3d4, 0x01, 0x59,\r
270     0x3d4, 0x02, 0x5a,\r
271     0x3d4, 0x03, 0x8e,\r
272     0x3d4, 0x04, 0x5e,\r
273     0x3d4, 0x05, 0x8a,\r
274     0x3d4, 0x06, 0xbf,\r
275     0x3d4, 0x07, 0x1f,\r
276     0x3d4, 0x08, 0x00,\r
277     0x3d4, 0x09, 0x41,\r
278     0x3d4, 0x10, 0x9c,\r
279     0x3d4, 0x11, 0x8e,\r
280     0x3d4, 0x12, 0x8f,\r
281     0x3d4, 0x13, 0x2d,\r
282     0x3d4, 0x14, 0x00,\r
283     0x3d4, 0x15, 0x96,\r
284     0x3d4, 0x16, 0xb9,\r
285     0x3d4, 0x17, 0xe3,\r
286     0x3c4, 0x01, 0x01,\r
287     0x3c4, 0x04, 0x06,\r
288     0x3ce, 0x05, 0x40,\r
289     0x3ce, 0x06, 0x05,\r
290     0x3c0, 0x10, 0x41,\r
291     0x3c0, 0x13, 0x00\r
292 };\r
293 \r
294 unsigned short ModeX_360x240regs[75] =\r
295 {\r
296     0x3c2, 0x00, 0xe7,\r
297     0x3d4, 0x00, 0x6b,\r
298     0x3d4, 0x01, 0x59,\r
299     0x3d4, 0x02, 0x5a,\r
300     0x3d4, 0x03, 0x8e,\r
301     0x3d4, 0x04, 0x5e,\r
302     0x3d4, 0x05, 0x8a,\r
303     0x3d4, 0x06, 0x0d,\r
304     0x3d4, 0x07, 0x3e,\r
305     0x3d4, 0x08, 0x00,\r
306     0x3d4, 0x09, 0x41,\r
307     0x3d4, 0x10, 0xea,\r
308     0x3d4, 0x11, 0xac,\r
309     0x3d4, 0x12, 0xdf,\r
310     0x3d4, 0x13, 0x2d,\r
311     0x3d4, 0x14, 0x00,\r
312     0x3d4, 0x15, 0xe7,\r
313     0x3d4, 0x16, 0x06,\r
314     0x3d4, 0x17, 0xe3,\r
315     0x3c4, 0x01, 0x01,\r
316     0x3c4, 0x04, 0x06,\r
317     0x3ce, 0x05, 0x40,\r
318     0x3ce, 0x06, 0x05,\r
319     0x3c0, 0x10, 0x41,\r
320     0x3c0, 0x13, 0x00\r
321 };\r
322 \r
323 unsigned short ModeX_360x270regs[75] =\r
324 {\r
325     0x3c2, 0x00, 0xe7,\r
326     0x3d4, 0x00, 0x6b,\r
327     0x3d4, 0x01, 0x59,\r
328     0x3d4, 0x02, 0x5a,\r
329     0x3d4, 0x03, 0x8e,\r
330     0x3d4, 0x04, 0x5e,\r
331     0x3d4, 0x05, 0x8a,\r
332     0x3d4, 0x06, 0x30,\r
333     0x3d4, 0x07, 0xf0,\r
334     0x3d4, 0x08, 0x00,\r
335     0x3d4, 0x09, 0x61,\r
336     0x3d4, 0x10, 0x20,\r
337     0x3d4, 0x11, 0xa9,\r
338     0x3d4, 0x12, 0x1b,\r
339     0x3d4, 0x13, 0x2d,\r
340     0x3d4, 0x14, 0x00,\r
341     0x3d4, 0x15, 0x1f,\r
342     0x3d4, 0x16, 0x2f,\r
343     0x3d4, 0x17, 0xe3,\r
344     0x3c4, 0x01, 0x01,\r
345     0x3c4, 0x04, 0x06,\r
346     0x3ce, 0x05, 0x40,\r
347     0x3ce, 0x06, 0x05,\r
348     0x3c0, 0x10, 0x41,\r
349     0x3c0, 0x13, 0x00\r
350 };\r
351 \r
352 unsigned short ModeX_360x360regs[75] =\r
353 {\r
354     0x3c2, 0x00, 0x67,\r
355     0x3d4, 0x00, 0x6b,\r
356     0x3d4, 0x01, 0x59,\r
357     0x3d4, 0x02, 0x5a,\r
358     0x3d4, 0x03, 0x8e,\r
359     0x3d4, 0x04, 0x5e,\r
360     0x3d4, 0x05, 0x8a,\r
361     0x3d4, 0x06, 0xbf,\r
362     0x3d4, 0x07, 0x1f,\r
363     0x3d4, 0x08, 0x00,\r
364     0x3d4, 0x09, 0x40,\r
365     0x3d4, 0x10, 0x88,\r
366     0x3d4, 0x11, 0x85,\r
367     0x3d4, 0x12, 0x67,\r
368     0x3d4, 0x13, 0x2d,\r
369     0x3d4, 0x14, 0x00,\r
370     0x3d4, 0x15, 0x6d,\r
371     0x3d4, 0x16, 0xba,\r
372     0x3d4, 0x17, 0xe3,\r
373     0x3c4, 0x01, 0x01,\r
374     0x3c4, 0x04, 0x06,\r
375     0x3ce, 0x05, 0x40,\r
376     0x3ce, 0x06, 0x05,\r
377     0x3c0, 0x10, 0x41,\r
378     0x3c0, 0x13, 0x00\r
379 };\r
380 \r
381 unsigned short ModeX_360x400regs[75] =\r
382 {\r
383     0x3c2, 0x00, 0x67,\r
384     0x3d4, 0x00, 0x6b,\r
385     0x3d4, 0x01, 0x59,\r
386     0x3d4, 0x02, 0x5a,\r
387     0x3d4, 0x03, 0x8e,\r
388     0x3d4, 0x04, 0x5e,\r
389     0x3d4, 0x05, 0x8a,\r
390     0x3d4, 0x06, 0xbf,\r
391     0x3d4, 0x07, 0x1f,\r
392     0x3d4, 0x08, 0x00,\r
393     0x3d4, 0x09, 0x40,\r
394     0x3d4, 0x10, 0x9c,\r
395     0x3d4, 0x11, 0x8e,\r
396     0x3d4, 0x12, 0x8f,\r
397     0x3d4, 0x13, 0x2d,\r
398     0x3d4, 0x14, 0x00,\r
399     0x3d4, 0x15, 0x96,\r
400     0x3d4, 0x16, 0xb9,\r
401     0x3d4, 0x17, 0xe3,\r
402     0x3c4, 0x01, 0x01,\r
403     0x3c4, 0x04, 0x06,\r
404     0x3ce, 0x05, 0x40,\r
405     0x3ce, 0x06, 0x05,\r
406     0x3c0, 0x10, 0x41,\r
407     0x3c0, 0x13, 0x00\r
408 };\r
409 \r
410 unsigned short ModeX_360x480regs[75] =\r
411 {\r
412     0x3c2, 0x00, 0xe7,\r
413     0x3d4, 0x00, 0x6b,\r
414     0x3d4, 0x01, 0x59,\r
415     0x3d4, 0x02, 0x5a,\r
416     0x3d4, 0x03, 0x8e,\r
417     0x3d4, 0x04, 0x5e,\r
418     0x3d4, 0x05, 0x8a,\r
419     0x3d4, 0x06, 0x0d,\r
420     0x3d4, 0x07, 0x3e,\r
421     0x3d4, 0x08, 0x00,\r
422     0x3d4, 0x09, 0x40,\r
423     0x3d4, 0x10, 0xea,\r
424     0x3d4, 0x11, 0xac,\r
425     0x3d4, 0x12, 0xdf,\r
426     0x3d4, 0x13, 0x2d,\r
427     0x3d4, 0x14, 0x00,\r
428     0x3d4, 0x15, 0xe7,\r
429     0x3d4, 0x16, 0x06,\r
430     0x3d4, 0x17, 0xe3,\r
431     0x3c4, 0x01, 0x01,\r
432     0x3c4, 0x04, 0x06,\r
433     0x3ce, 0x05, 0x40,\r
434     0x3ce, 0x06, 0x05,\r
435     0x3c0, 0x10, 0x41,\r
436     0x3c0, 0x13, 0x00\r
437 };\r
438 \r
439 unsigned short ModeX_376x282regs[75] =\r
440 {\r
441     0x3c2, 0x00, 0xe7,\r
442     0x3d4, 0x00, 0x6e,\r
443     0x3d4, 0x01, 0x5d,\r
444     0x3d4, 0x02, 0x5e,\r
445     0x3d4, 0x03, 0x91,\r
446     0x3d4, 0x04, 0x62,\r
447     0x3d4, 0x05, 0x8f,\r
448     0x3d4, 0x06, 0x62,\r
449     0x3d4, 0x07, 0xf0,\r
450     0x3d4, 0x08, 0x00,\r
451     0x3d4, 0x09, 0x61,\r
452     0x3d4, 0x10, 0x37,\r
453     0x3d4, 0x11, 0x89,\r
454     0x3d4, 0x12, 0x33,\r
455     0x3d4, 0x13, 0x2f,\r
456     0x3d4, 0x14, 0x00,\r
457     0x3d4, 0x15, 0x3c,\r
458     0x3d4, 0x16, 0x5c,\r
459     0x3d4, 0x17, 0xe3,\r
460     0x3c4, 0x01, 0x01,\r
461     0x3c4, 0x04, 0x06,\r
462     0x3ce, 0x05, 0x40,\r
463     0x3ce, 0x06, 0x05,\r
464     0x3c0, 0x10, 0x41,\r
465     0x3c0, 0x13, 0x00\r
466 };\r
467 \r
468 unsigned short ModeX_376x564regs[75] =\r
469 {\r
470     0x3c2, 0x00, 0xe7,\r
471     0x3d4, 0x00, 0x6e,\r
472     0x3d4, 0x01, 0x5d,\r
473     0x3d4, 0x02, 0x5e,\r
474     0x3d4, 0x03, 0x91,\r
475     0x3d4, 0x04, 0x62,\r
476     0x3d4, 0x05, 0x8f,\r
477     0x3d4, 0x06, 0x62,\r
478     0x3d4, 0x07, 0xf0,\r
479     0x3d4, 0x08, 0x00,\r
480     0x3d4, 0x09, 0x60,\r
481     0x3d4, 0x10, 0x37,\r
482     0x3d4, 0x11, 0x89,\r
483     0x3d4, 0x12, 0x33,\r
484     0x3d4, 0x13, 0x2f,\r
485     0x3d4, 0x14, 0x00,\r
486     0x3d4, 0x15, 0x3c,\r
487     0x3d4, 0x16, 0x5c,\r
488     0x3d4, 0x17, 0xe3,\r
489     0x3c4, 0x01, 0x01,\r
490     0x3c4, 0x04, 0x06,\r
491     0x3ce, 0x05, 0x40,\r
492     0x3ce, 0x06, 0x05,\r
493     0x3c0, 0x10, 0x41,\r
494     0x3c0, 0x13, 0x00\r
495 };\r
496 \r
497 unsigned short ModeX_400x300regs[78] =\r
498 {\r
499     0x3c2, 0x00, 0xa7,\r
500     0x3d4, 0x00, 0x71,\r
501     0x3d4, 0x01, 0x63,\r
502     0x3d4, 0x02, 0x64,\r
503     0x3d4, 0x03, 0x92,\r
504     0x3d4, 0x04, 0x65,\r
505     0x3d4, 0x05, 0x82,\r
506     0x3d4, 0x06, 0x46,\r
507     0x3d4, 0x07, 0x1f,\r
508     0x3d4, 0x08, 0x00,\r
509     0x3d4, 0x09, 0x40,\r
510     0x3d4, 0x10, 0x31,\r
511     0x3d4, 0x11, 0x80,\r
512     0x3d4, 0x12, 0x2b,\r
513     0x3d4, 0x13, 0x32,\r
514     0x3d4, 0x14, 0x00,\r
515     0x3d4, 0x15, 0x2f,\r
516     0x3d4, 0x16, 0x44,\r
517     0x3d4, 0x17, 0xe3,\r
518     0x3c4, 0x01, 0x01,\r
519     0x3c4, 0x02, 0x0f,\r
520     0x3c4, 0x04, 0x06,\r
521     0x3ce, 0x05, 0x40,\r
522     0x3ce, 0x06, 0x05,\r
523     0x3c0, 0x10, 0x41,\r
524     0x3c0, 0x13, 0x00\r
525 };\r
526 \r
527 unsigned short ModeX_400x600regs[78] =\r
528 {\r
529     0x3c2, 0x00, 0xe7,\r
530     0x3d4, 0x00, 0x70,\r
531     0x3d4, 0x01, 0x63,\r
532     0x3d4, 0x02, 0x64,\r
533     0x3d4, 0x03, 0x92,\r
534     0x3d4, 0x04, 0x65,\r
535     0x3d4, 0x05, 0x82,\r
536     0x3d4, 0x06, 0x70,\r
537     0x3d4, 0x07, 0xf0,\r
538     0x3d4, 0x08, 0x00,\r
539     0x3d4, 0x09, 0x60,\r
540     0x3d4, 0x10, 0x5b,\r
541     0x3d4, 0x11, 0x8c,\r
542     0x3d4, 0x12, 0x57,\r
543     0x3d4, 0x13, 0x32,\r
544     0x3d4, 0x14, 0x00,\r
545     0x3d4, 0x15, 0x58,\r
546     0x3d4, 0x16, 0x70,\r
547     0x3d4, 0x17, 0xe3,\r
548     0x3c4, 0x01, 0x01,\r
549     0x3c4, 0x02, 0x0f,\r
550     0x3c4, 0x04, 0x06,\r
551     0x3ce, 0x05, 0x40,\r
552     0x3ce, 0x06, 0x05,\r
553     0x3c0, 0x10, 0x41,\r
554     0x3c0, 0x13, 0x00\r
555 };\r
556 \r
557 \r
558 void\r
559 calc_rows(void)\r
560 {\r
561     int i;\r
562 \r
563     // Each byte addresses four pixels, so the width of a scan line\r
564     // in *bytes* is one fourth of the number of pixels on a line.\r
565     widthBytes = width / 4;\r
566 \r
567     pageSize = (widthBytes * height);\r
568 \r
569     for (i=0; i < height; i++) {\r
570         RowsX[i] = (unsigned char *)((0xA000 << 4) + (widthBytes * i));\r
571     }\r
572 \r
573     // Clear entire video memory, by selecting all four planes, then\r
574     // writing 0 to entire segment.\r
575     outpw(SEQU_ADDR, ALL_PLANES);\r
576     memset((unsigned char *)(0xA000 << 4), 0x00, 0x00010000);\r
577 \r
578     // By default we want screen refreshing and drawing operations\r
579     // to be based at offset 0 in the video segment.\r
580     activeStart = visibleStart = 0;\r
581 \r
582     // Set current plane to invalid value\r
583     write_plane = -1;\r
584     read_plane  = -1;\r
585 \r
586     // How many pages fit in 256K VGA Card?\r
587     num_pages = ((64 * 1024) / pageSize);\r
588 \r
589     for (i=0; i < num_pages; i++) {\r
590         page_offset[i] = (pageSize * i);\r
591         page_mask_high[i] = (0x0C |  (page_offset[i] & 0xFF00));\r
592         page_mask_low[i]  = (0x0D | ((page_offset[i] & 0x00FF) << 8));\r
593     }\r
594 }\r
595 \r
596 \r
597 //    setBaseXMode() does the initialization to make the VGA ready to\r
598 //    accept any combination of configuration register settings.  This\r
599 //    involves enabling writes to index 0 to 7 of the CRT controller (port\r
600 //    0x3D4), by clearing the most significant bit (bit 7) of index 0x11.\r
601 void\r
602 setBaseXMode(void)\r
603 {\r
604     int temp;\r
605     union REGS r;\r
606 \r
607     r.x.eax = 0x0013;\r
608     int386(0x10, &r, &r);\r
609 \r
610     outp(0x3D4, 0x11);\r
611     temp = inp(0x3D5) & 0x7F;\r
612     outp(0x3D4, 0x11);\r
613     outp(0x3D5, temp);\r
614 }\r
615 \r
616 \r
617 void\r
618 outReg(unsigned short *r)\r
619 {\r
620     switch (r[0]) {\r
621         // First handle special cases:\r
622 \r
623                 case ATTRCON_ADDR:\r
624             // reset read/write flip-flop\r
625             inp(STATUS_ADDR);\r
626             outp(ATTRCON_ADDR, r[1] | 0x20);\r
627             // ensure VGA output is enabled\r
628             outp(ATTRCON_ADDR, r[2]);\r
629                         break;\r
630 \r
631                 case MISC_ADDR:\r
632                 case VGAENABLE_ADDR:\r
633             // Copy directly to port\r
634             outp(r[0], r[2]);\r
635                         break;\r
636 \r
637         case SEQU_ADDR:\r
638                 case GRACON_ADDR:\r
639                 case CRTC_ADDR:\r
640         default:\r
641             // Index to port\r
642             outp(r[0], r[1]);\r
643             // Value to port+1\r
644             outp(r[0] + 1, r[2]);\r
645                         break;\r
646     }\r
647 }\r
648 \r
649 void\r
650 outRegArray(unsigned short *r, int n)\r
651 {\r
652     while (n--) {\r
653         outReg(r);\r
654         r += 3;\r
655     }\r
656 }\r
657 \r
658 \r
659 void\r
660 set80x25(void)\r
661 {\r
662     union REGS r;\r
663     r.x.eax = 0x0003;\r
664 \r
665     int386(0x10, &r, &r);\r
666 }\r
667 \r
668 void\r
669 set256x224x256_X(void)\r
670 {\r
671     setBaseXMode();\r
672     outRegArray(ModeX_256x224regs, 25);\r
673 \r
674     width  = 256;\r
675     height = 224;\r
676 \r
677     calc_rows();\r
678 }\r
679 \r
680 void\r
681 set256x240x256_X(void)\r
682 {\r
683     setBaseXMode();\r
684     outRegArray(ModeX_256x240regs, 25);\r
685 \r
686     width  = 256;\r
687     height = 240;\r
688 \r
689     calc_rows();\r
690 }\r
691 \r
692 void\r
693 set256x256x256_X(void)\r
694 {\r
695     setBaseXMode();\r
696     outRegArray(ModeX_256x256regs, 25);\r
697 \r
698     width  = 256;\r
699     height = 256;\r
700 \r
701     calc_rows();\r
702 }\r
703 \r
704 void\r
705 set256x480x256_X(void)\r
706 {\r
707     setBaseXMode();\r
708     outRegArray(ModeX_256x480regs, 25);\r
709 \r
710     width  = 256;\r
711     height = 480;\r
712 \r
713     calc_rows();\r
714 }\r
715 \r
716 void\r
717 set320x200x256_X(void)\r
718 {\r
719     setBaseXMode();\r
720     outRegArray(ModeX_320x200regs, 25);\r
721 \r
722     width  = 320;\r
723     height = 200;\r
724 \r
725     calc_rows();\r
726 }\r
727 \r
728 void\r
729 set320x240x256_X(void)\r
730 {\r
731     setBaseXMode();\r
732     outRegArray(ModeX_320x240regs, 25);\r
733 \r
734     width  = 320;\r
735     height = 240;\r
736 \r
737     calc_rows();\r
738 }\r
739 \r
740 void\r
741 set320x400x256_X(void)\r
742 {\r
743     setBaseXMode();\r
744     outRegArray(ModeX_320x400regs, 25);\r
745 \r
746     width  = 320;\r
747     height = 400;\r
748 \r
749     calc_rows();\r
750 }\r
751 \r
752 void\r
753 set320x480x256_X(void)\r
754 {\r
755     setBaseXMode();\r
756     outRegArray(ModeX_320x480regs, 25);\r
757 \r
758     width  = 320;\r
759     height = 480;\r
760 \r
761     calc_rows();\r
762 }\r
763 \r
764 void\r
765 set360x200x256_X(void)\r
766 {\r
767     setBaseXMode();\r
768     outRegArray(ModeX_360x200regs, 25);\r
769 \r
770     width  = 360;\r
771     height = 200;\r
772 \r
773     calc_rows();\r
774 }\r
775 \r
776 void\r
777 set360x240x256_X(void)\r
778 {\r
779     setBaseXMode();\r
780     outRegArray(ModeX_360x240regs, 25);\r
781 \r
782     width  = 360;\r
783     height = 240;\r
784 \r
785     calc_rows();\r
786 }\r
787 \r
788 void\r
789 set360x270x256_X(void)\r
790 {\r
791     setBaseXMode();\r
792     outRegArray(ModeX_360x270regs, 25);\r
793 \r
794     width  = 360;\r
795     height = 270;\r
796 \r
797     calc_rows();\r
798 }\r
799 \r
800 void\r
801 set360x360x256_X(void)\r
802 {\r
803     setBaseXMode();\r
804     outRegArray(ModeX_360x360regs, 25);\r
805 \r
806     width  = 360;\r
807     height = 360;\r
808 \r
809     calc_rows();\r
810 }\r
811 \r
812 void\r
813 set360x400x256_X(void)\r
814 {\r
815     setBaseXMode();\r
816     outRegArray(ModeX_360x400regs, 25);\r
817 \r
818     width  = 360;\r
819     height = 400;\r
820 \r
821     calc_rows();\r
822 }\r
823 \r
824 void\r
825 set360x480x256_X(void)\r
826 {\r
827     setBaseXMode();\r
828     outRegArray(ModeX_360x480regs, 25);\r
829 \r
830     width  = 360;\r
831     height = 480;\r
832 \r
833     calc_rows();\r
834 }\r
835 \r
836 void\r
837 set376x282x256_X(void)\r
838 {\r
839     setBaseXMode();\r
840     outRegArray(ModeX_376x282regs, 25);\r
841 \r
842     width  = 376;\r
843     height = 282;\r
844 \r
845     calc_rows();\r
846 }\r
847 \r
848 void\r
849 set376x564x256_X(void)\r
850 {\r
851     setBaseXMode();\r
852     outRegArray(ModeX_376x564regs, 25);\r
853 \r
854     width  = 376;\r
855     height = 564;\r
856 \r
857     calc_rows();\r
858 }\r
859 \r
860 void\r
861 set400x300x256_X(void)\r
862 {\r
863     setBaseXMode();\r
864     outRegArray(ModeX_400x300regs, 26);\r
865 \r
866     width  = 400;\r
867     height = 300;\r
868 \r
869     calc_rows();\r
870 }\r
871 \r
872 void\r
873 set400x600x256_X(void)\r
874 {\r
875     setBaseXMode();\r
876     outRegArray(ModeX_400x600regs, 26);\r
877 \r
878     width  = 400;\r
879     height = 600;\r
880 \r
881     calc_rows();\r
882 }\r
883 \r
884 \r
885 COORD\r
886 get_xres(void)\r
887 {\r
888     return width;\r
889 }\r
890 \r
891 \r
892 COORD\r
893 get_yres(void)\r
894 {\r
895     return height;\r
896 }\r
897 \r
898 \r
899 void\r
900 set_write_plane(unsigned short int plane_mask)\r
901 {\r
902     write_plane = -1;\r
903     outpw(SEQU_ADDR, plane_mask);\r
904 }\r
905 \r
906 \r
907 void\r
908 set_read_plane(unsigned short int plane_mask)\r
909 {\r
910     read_plane = -1;\r
911     outpw(GRACON_ADDR, plane_mask);\r
912 }\r
913 \r