[NTVDM] Improve the PCH situation.
[reactos.git] / reactos / subsystems / mvdm / ntvdm / bios / vidbios.c
1 /*
2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: subsystems/mvdm/ntvdm/bios/vidbios.c
5 * PURPOSE: VDM 32-bit Video BIOS Support Library
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
8 */
9
10 #include "ntvdm.h"
11
12 #define NDEBUG
13 #include <debug.h>
14
15 /* MACROS *********************************************************************/
16
17 //
18 // These macros are defined for ease-of-use of some VGA I/O ports
19 // whose addresses depend whether we are in Monochrome or Colour mode.
20 //
21 #define VGA_INSTAT1_READ Bda->CrtBasePort + 6 // VGA_INSTAT1_READ_MONO or VGA_INSTAT1_READ_COLOR
22 #define VGA_CRTC_INDEX Bda->CrtBasePort // VGA_CRTC_INDEX_MONO or VGA_CRTC_INDEX_COLOR
23 #define VGA_CRTC_DATA Bda->CrtBasePort + 1 // VGA_CRTC_DATA_MONO or VGA_CRTC_DATA_COLOR
24
25 /* PRIVATE VARIABLES **********************************************************/
26
27 /*
28 * WARNING! For compatibility purposes the string "IBM" should be at C000:001E.
29 */
30 static const CHAR BiosInfo[] =
31 "00000000000 Emulation of IBM VGA Compatible ROM\0"
32 "CL-GD5434 VGA BIOS Version 1.41 \r\n"
33 "Copyright (C) ReactOS Team 1996-"COPYRIGHT_YEAR"\r\n"
34 "The original CL-GD5434 card was created by Cirrus Logic, Inc.\r\n\0"
35 "BIOS Date: 06/17/13\0";
36
37 C_ASSERT(sizeof(BiosInfo)-1 <= 0xFF-0x05); // Ensures that we won't overflow on the Video Code
38
39
40 /*
41 * VGA Register Configurations for BIOS Video Modes.
42 * The configurations were checked against SeaBIOS VGA BIOS.
43 */
44
45 static VGA_REGISTERS VideoMode_40x25_text =
46 {
47 /* Miscellaneous Register */
48 0x67,
49
50 /* Sequencer Registers */
51 {0x00, 0x08, 0x03, 0x00, 0x02},
52
53 /* CRTC Registers */ /* CGA-compatible: 0xC7, 0x06, 0x07 */
54 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
55 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x1F, 0x96, 0xB9, 0xA3,
56 0xFF},
57
58 /* GC Registers */
59 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
60
61 /* AC Registers */
62 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
63 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
64 };
65
66 static VGA_REGISTERS VideoMode_80x25_text =
67 {
68 /* Miscellaneous Register */
69 0x67,
70
71 /* Sequencer Registers */
72 {0x00, 0x00, 0x03, 0x00, 0x02},
73
74 /* CRTC Registers */ /* CGA-compatible: 0xC7, 0x06, 0x07 */
75 {0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
76 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3,
77 0xFF},
78
79 /* GC Registers */
80 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
81
82 /* AC Registers */
83 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
84 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
85 };
86
87 static VGA_REGISTERS VideoMode_320x200_4color =
88 {
89 /* Miscellaneous Register */
90 0x63,
91
92 /* Sequencer Registers */
93 {0x00, 0x09, 0x03, 0x00, 0x02},
94
95 /* CRTC Registers */
96 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
97 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xA2,
98 0xFF},
99
100 /* GC Registers */
101 {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0F, 0x0F, 0xFF},
102
103 /* AC Registers */
104 {0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
105 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x03, 0x00, 0x00}
106 };
107
108 static VGA_REGISTERS VideoMode_640x200_2color =
109 {
110 /* Miscellaneous Register */
111 0x63,
112
113 /* Sequencer Registers */
114 {0x00, 0x01, 0x01, 0x00, 0x02},
115
116 /* CRTC Registers */
117 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xC2,
119 0xFF},
120
121 /* GC Registers */
122 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0xFF},
123
124 /* AC Registers */
125 {0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
126 0x17, 0x17, 0x17, 0x17, 0x01, 0x00, 0x01, 0x00, 0x00}
127 };
128
129 static VGA_REGISTERS VideoMode_320x200_16color =
130 {
131 /* Miscellaneous Register */
132 0x63,
133
134 /* Sequencer Registers */
135 {0x00, 0x09, 0x0F, 0x00, 0x06},
136
137 /* CRTC Registers */
138 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
139 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xE3,
140 0xFF},
141
142 /* GC Registers */
143 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
144
145 /* AC Registers */
146 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
147 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
148 };
149
150 static VGA_REGISTERS VideoMode_640x200_16color =
151 {
152 /* Miscellaneous Register */
153 0x63,
154
155 /* Sequencer Registers */
156 {0x00, 0x01, 0x0F, 0x00, 0x06},
157
158 /* CRTC Registers */
159 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
160 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xE3,
161 0xFF},
162
163 /* GC Registers */
164 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
165
166 /* AC Registers */
167 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
168 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
169 };
170
171 static VGA_REGISTERS VideoMode_640x350_16color =
172 {
173 /* Miscellaneous Register */
174 0xA3,
175
176 /* Sequencer Registers */
177 {0x00, 0x01, 0x0F, 0x00, 0x06},
178
179 /* CRTC Registers */
180 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00,
181 0x00, 0x00, 0x00, 0x00, 0x83, 0x85, 0x5D, 0x28, 0x0F, 0x63, 0xBA, 0xE3,
182 0xFF},
183
184 /* GC Registers */
185 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
186
187 /* AC Registers */
188 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
189 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
190 };
191
192 static VGA_REGISTERS VideoMode_640x480_2color =
193 {
194 /* Miscellaneous Register */
195 0xE3,
196
197 /* Sequencer Registers */
198 {0x00, 0x01, 0x0F, 0x00, 0x06},
199
200 /* CRTC Registers */
201 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
202 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xC3,
203 0xFF},
204
205 /* GC Registers */
206 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
207
208 /* AC Registers */
209 // {0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
210 // 0x3F, 0x3F, 0x3F, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
211 {0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F,
212 0x00, 0x3F, 0x00, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
213 };
214
215 static VGA_REGISTERS VideoMode_640x480_16color =
216 {
217 /* Miscellaneous Register */
218 0xE3,
219
220 /* Sequencer Registers */
221 {0x00, 0x01, 0x0F, 0x00, 0x06},
222
223 /* CRTC Registers */
224 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
225 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3,
226 0xFF},
227
228 /* GC Registers */
229 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
230
231 /* AC Registers */
232 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
233 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
234 };
235
236 static VGA_REGISTERS VideoMode_320x200_256color =
237 {
238 /* Miscellaneous Register */
239 0x63,
240
241 /* Sequencer Registers */
242 {0x00, 0x01, 0x0F, 0x00, 0x0E},
243
244 /* CRTC Registers */
245 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x41, 0x00, 0x00,
246 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3,
247 0xFF},
248
249 /* GC Registers */
250 {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF},
251
252 /* AC Registers */
253 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
254 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00}
255 };
256
257
258 /*
259 * BIOS Mode Palettes
260 *
261 * Many people have different versions of those palettes
262 * (e.g. DOSBox, http://www.brokenthorn.com/Resources/OSDevVid2.html ,
263 * etc...) A choice should be made at some point.
264 */
265
266 // This is the same as EgaPalette__HiRes
267 static CONST COLORREF TextPalette[VGA_MAX_COLORS / 4] =
268 {
269 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
270 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
271 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
272 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
273
274 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
275 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
276 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
277 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
278
279
280 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
281 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
282 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
283 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
284
285 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
286 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
287 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
288 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
289 };
290
291 // Unused at the moment
292 static CONST COLORREF mtext_palette[64] =
293 {
294 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
295 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
296 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
297 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
298 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
299 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
300 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
301 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
302
303 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
304 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
305 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
306 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
307 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
308 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
309 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
310 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
311 };
312
313 // Unused at the moment
314 static CONST COLORREF mtext_s3_palette[64] =
315 {
316 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
317 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
318 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
319 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
320 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
321 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
322 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
323 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
324
325 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
326 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
327 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
328 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
329 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
330 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
331 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
332 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
333 };
334
335 #if 0
336
337 // Unused at the moment
338 static CONST COLORREF CgaPalette[16] =
339 {
340 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
341 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
342 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
343 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
344 };
345
346 /* CGA palette 1 */
347 static CONST BYTE CgaPalette1[] =
348 {
349 0x00, /* 0 - Black */
350 0x03, /* 1 - Cyan */
351 0x05, /* 2- Magenta */
352 0x07, /* 3 - White */
353 }
354
355 /* CGA palette 1 bright */
356 static CONST BYTE CgaPalette1i[] =
357 {
358 0x00, /* 0 - Black */
359 0x13, /* 1 - Light cyan */
360 0x15, /* 2 - Light magenta */
361 0x17, /* 3 - Bright White */
362 };
363
364 /* CGA palette 2 */
365 static CONST BYTE CgaPalette2[] =
366 {
367 0x00, /* 0 - Black */
368 0x02, /* 1 - Green */
369 0x04, /* 2 - Red */
370 0x06, /* 3 - Brown */
371 };
372
373 /* CGA palette 2 bright */
374 static CONST BYTE CgaPalette2i[] =
375 {
376 0x00, /* 0 - Black */
377 0x12, /* 1 - Light green */
378 0x14, /* 2 - Light red */
379 0x16, /* 3 - Yellow */
380 };
381
382 // Unused at the moment; same palette as EgaPalette__16Colors
383 static CONST COLORREF CgaPalette2[VGA_MAX_COLORS / 4] =
384 {
385 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
386 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
387 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
388 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
389
390 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
391 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
392 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
393 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
394
395 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
396 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
397 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
398 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
399
400 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
401 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
402 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
403 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
404 };
405
406 #endif
407
408 static CONST COLORREF EgaPalette__16Colors[VGA_MAX_COLORS / 4] =
409 {
410 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
411 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
412
413 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
414 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
415
416
417 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
418 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
419
420 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
421 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
422
423
424
425 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
426 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
427
428 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
429 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
430
431
432 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
433 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
434
435 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
436 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
437 };
438
439 // This is the same as TextPalette
440 static CONST COLORREF EgaPalette__HiRes[VGA_MAX_COLORS / 4] =
441 {
442 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
443 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
444 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
445 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
446
447 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
448 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
449 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
450 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
451
452
453 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
454 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
455 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
456 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
457
458 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
459 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
460 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
461 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
462 };
463
464 #define USE_REACTOS_COLORS
465 // #define USE_DOSBOX_COLORS
466
467 /*
468 * Same palette as the default one 'VgaDefaultPalette' in vga.c
469 */
470 #if defined(USE_REACTOS_COLORS)
471
472 // ReactOS colors
473 static CONST COLORREF VgaPalette[VGA_MAX_COLORS] =
474 {
475 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
476 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
477 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
478 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
479 RGB(0x00, 0x00, 0x00), RGB(0x10, 0x10, 0x10), RGB(0x20, 0x20, 0x20), RGB(0x35, 0x35, 0x35),
480 RGB(0x45, 0x45, 0x45), RGB(0x55, 0x55, 0x55), RGB(0x65, 0x65, 0x65), RGB(0x75, 0x75, 0x75),
481 RGB(0x8A, 0x8A, 0x8A), RGB(0x9A, 0x9A, 0x9A), RGB(0xAA, 0xAA, 0xAA), RGB(0xBA, 0xBA, 0xBA),
482 RGB(0xCA, 0xCA, 0xCA), RGB(0xDF, 0xDF, 0xDF), RGB(0xEF, 0xEF, 0xEF), RGB(0xFF, 0xFF, 0xFF),
483 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x82, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
484 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x82), RGB(0xFF, 0x00, 0x41),
485 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x82, 0x00), RGB(0xFF, 0xBE, 0x00),
486 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x82, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
487 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x82), RGB(0x00, 0xFF, 0xBE),
488 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x82, 0xFF), RGB(0x00, 0x41, 0xFF),
489 RGB(0x82, 0x82, 0xFF), RGB(0x9E, 0x82, 0xFF), RGB(0xBE, 0x82, 0xFF), RGB(0xDF, 0x82, 0xFF),
490 RGB(0xFF, 0x82, 0xFF), RGB(0xFF, 0x82, 0xDF), RGB(0xFF, 0x82, 0xBE), RGB(0xFF, 0x82, 0x9E),
491 RGB(0xFF, 0x82, 0x82), RGB(0xFF, 0x9E, 0x82), RGB(0xFF, 0xBE, 0x82), RGB(0xFF, 0xDF, 0x82),
492 RGB(0xFF, 0xFF, 0x82), RGB(0xDF, 0xFF, 0x82), RGB(0xBE, 0xFF, 0x82), RGB(0x9E, 0xFF, 0x82),
493 RGB(0x82, 0xFF, 0x82), RGB(0x82, 0xFF, 0x9E), RGB(0x82, 0xFF, 0xBE), RGB(0x82, 0xFF, 0xDF),
494 RGB(0x82, 0xFF, 0xFF), RGB(0x82, 0xDF, 0xFF), RGB(0x82, 0xBE, 0xFF), RGB(0x82, 0x9E, 0xFF),
495 RGB(0xBA, 0xBA, 0xFF), RGB(0xCA, 0xBA, 0xFF), RGB(0xDF, 0xBA, 0xFF), RGB(0xEF, 0xBA, 0xFF),
496 RGB(0xFF, 0xBA, 0xFF), RGB(0xFF, 0xBA, 0xEF), RGB(0xFF, 0xBA, 0xDF), RGB(0xFF, 0xBA, 0xCA),
497 RGB(0xFF, 0xBA, 0xBA), RGB(0xFF, 0xCA, 0xBA), RGB(0xFF, 0xDF, 0xBA), RGB(0xFF, 0xEF, 0xBA),
498 RGB(0xFF, 0xFF, 0xBA), RGB(0xEF, 0xFF, 0xBA), RGB(0xDF, 0xFF, 0xBA), RGB(0xCA, 0xFF, 0xBA),
499 RGB(0xBA, 0xFF, 0xBA), RGB(0xBA, 0xFF, 0xCA), RGB(0xBA, 0xFF, 0xDF), RGB(0xBA, 0xFF, 0xEF),
500 RGB(0xBA, 0xFF, 0xFF), RGB(0xBA, 0xEF, 0xFF), RGB(0xBA, 0xDF, 0xFF), RGB(0xBA, 0xCA, 0xFF),
501 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x39, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
502 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x39), RGB(0x71, 0x00, 0x1C),
503 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x39, 0x00), RGB(0x71, 0x55, 0x00),
504 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x39, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
505 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x39), RGB(0x00, 0x71, 0x55),
506 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x39, 0x71), RGB(0x00, 0x1C, 0x71),
507 RGB(0x39, 0x39, 0x71), RGB(0x45, 0x39, 0x71), RGB(0x55, 0x39, 0x71), RGB(0x61, 0x39, 0x71),
508 RGB(0x71, 0x39, 0x71), RGB(0x71, 0x39, 0x61), RGB(0x71, 0x39, 0x55), RGB(0x71, 0x39, 0x45),
509 RGB(0x71, 0x39, 0x39), RGB(0x71, 0x45, 0x39), RGB(0x71, 0x55, 0x39), RGB(0x71, 0x61, 0x39),
510 RGB(0x71, 0x71, 0x39), RGB(0x61, 0x71, 0x39), RGB(0x55, 0x71, 0x39), RGB(0x45, 0x71, 0x39),
511 RGB(0x39, 0x71, 0x39), RGB(0x39, 0x71, 0x45), RGB(0x39, 0x71, 0x55), RGB(0x39, 0x71, 0x61),
512 RGB(0x39, 0x71, 0x71), RGB(0x39, 0x61, 0x71), RGB(0x39, 0x55, 0x71), RGB(0x39, 0x45, 0x71),
513 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
514 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
515 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
516 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
517 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
518 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
519 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x31, 0x00, 0x41),
520 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x31), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
521 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x31, 0x00),
522 RGB(0x41, 0x41, 0x00), RGB(0x31, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
523 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x31),
524 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x31, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
525 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x31, 0x20, 0x41), RGB(0x39, 0x20, 0x41),
526 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x39), RGB(0x41, 0x20, 0x31), RGB(0x41, 0x20, 0x28),
527 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x31, 0x20), RGB(0x41, 0x39, 0x20),
528 RGB(0x41, 0x41, 0x20), RGB(0x39, 0x41, 0x20), RGB(0x31, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
529 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x31), RGB(0x20, 0x41, 0x39),
530 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x39, 0x41), RGB(0x20, 0x31, 0x41), RGB(0x20, 0x28, 0x41),
531 RGB(0x2D, 0x2D, 0x41), RGB(0x31, 0x2D, 0x41), RGB(0x35, 0x2D, 0x41), RGB(0x3D, 0x2D, 0x41),
532 RGB(0x41, 0x2D, 0x41), RGB(0x41, 0x2D, 0x3D), RGB(0x41, 0x2D, 0x35), RGB(0x41, 0x2D, 0x31),
533 RGB(0x41, 0x2D, 0x2D), RGB(0x41, 0x31, 0x2D), RGB(0x41, 0x35, 0x2D), RGB(0x41, 0x3D, 0x2D),
534 RGB(0x41, 0x41, 0x2D), RGB(0x3D, 0x41, 0x2D), RGB(0x35, 0x41, 0x2D), RGB(0x31, 0x41, 0x2D),
535 RGB(0x2D, 0x41, 0x2D), RGB(0x2D, 0x41, 0x31), RGB(0x2D, 0x41, 0x35), RGB(0x2D, 0x41, 0x3D),
536 RGB(0x2D, 0x41, 0x41), RGB(0x2D, 0x3D, 0x41), RGB(0x2D, 0x35, 0x41), RGB(0x2D, 0x31, 0x41),
537 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
538 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
539 };
540
541 #elif defined(USE_DOSBOX_COLORS)
542
543 // DOSBox colors
544 static CONST COLORREF VgaPalette[VGA_MAX_COLORS] =
545 {
546 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
547 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
548 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
549 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
550 RGB(0x00, 0x00, 0x00), RGB(0x14, 0x14, 0x14), RGB(0x20, 0x20, 0x20), RGB(0x2C, 0x2C, 0x2C),
551 RGB(0x38, 0x38, 0x38), RGB(0x45, 0x45, 0x45), RGB(0x51, 0x51, 0x51), RGB(0x61, 0x61, 0x61),
552 RGB(0x71, 0x71, 0x71), RGB(0x82, 0x82, 0x82), RGB(0x92, 0x92, 0x92), RGB(0xA2, 0xA2, 0xA2),
553 RGB(0xB6, 0xB6, 0xB6), RGB(0xCB, 0xCB, 0xCB), RGB(0xE3, 0xE3, 0xE3), RGB(0xFF, 0xFF, 0xFF),
554 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x7D, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
555 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x7D), RGB(0xFF, 0x00, 0x41),
556 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x7D, 0x00), RGB(0xFF, 0xBE, 0x00),
557 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x7D, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
558 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x7D), RGB(0x00, 0xFF, 0xBE),
559 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x7D, 0xFF), RGB(0x00, 0x41, 0xFF),
560 RGB(0x7D, 0x7D, 0xFF), RGB(0x9E, 0x7D, 0xFF), RGB(0xBE, 0x7D, 0xFF), RGB(0xDF, 0x7D, 0xFF),
561 RGB(0xFF, 0x7D, 0xFF), RGB(0xFF, 0x7D, 0xDF), RGB(0xFF, 0x7D, 0xBE), RGB(0xFF, 0x7D, 0x9E),
562
563 RGB(0xFF, 0x7D, 0x7D), RGB(0xFF, 0x9E, 0x7D), RGB(0xFF, 0xBE, 0x7D), RGB(0xFF, 0xDF, 0x7D),
564 RGB(0xFF, 0xFF, 0x7D), RGB(0xDF, 0xFF, 0x7D), RGB(0xBE, 0xFF, 0x7D), RGB(0x9E, 0xFF, 0x7D),
565 RGB(0x7D, 0xFF, 0x7D), RGB(0x7D, 0xFF, 0x9E), RGB(0x7D, 0xFF, 0xBE), RGB(0x7D, 0xFF, 0xDF),
566 RGB(0x7D, 0xFF, 0xFF), RGB(0x7D, 0xDF, 0xFF), RGB(0x7D, 0xBE, 0xFF), RGB(0x7D, 0x9E, 0xFF),
567 RGB(0xB6, 0xB6, 0xFF), RGB(0xC7, 0xB6, 0xFF), RGB(0xDB, 0xB6, 0xFF), RGB(0xEB, 0xB6, 0xFF),
568 RGB(0xFF, 0xB6, 0xFF), RGB(0xFF, 0xB6, 0xEB), RGB(0xFF, 0xB6, 0xDB), RGB(0xFF, 0xB6, 0xC7),
569 RGB(0xFF, 0xB6, 0xB6), RGB(0xFF, 0xC7, 0xB6), RGB(0xFF, 0xDB, 0xB6), RGB(0xFF, 0xEB, 0xB6),
570 RGB(0xFF, 0xFF, 0xB6), RGB(0xEB, 0xFF, 0xB6), RGB(0xDB, 0xFF, 0xB6), RGB(0xC7, 0xFF, 0xB6),
571 RGB(0xB6, 0xFF, 0xB6), RGB(0xB6, 0xFF, 0xC7), RGB(0xB6, 0xFF, 0xDB), RGB(0xB6, 0xFF, 0xEB),
572 RGB(0xB6, 0xFF, 0xFF), RGB(0xB6, 0xEB, 0xFF), RGB(0xB6, 0xDB, 0xFF), RGB(0xB6, 0xC7, 0xFF),
573 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x38, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
574 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x38), RGB(0x71, 0x00, 0x1C),
575 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x38, 0x00), RGB(0x71, 0x55, 0x00),
576 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x38, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
577 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x38), RGB(0x00, 0x71, 0x55),
578 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x38, 0x71), RGB(0x00, 0x1C, 0x71),
579
580 RGB(0x38, 0x38, 0x71), RGB(0x45, 0x38, 0x71), RGB(0x55, 0x38, 0x71), RGB(0x61, 0x38, 0x71),
581 RGB(0x71, 0x38, 0x71), RGB(0x71, 0x38, 0x61), RGB(0x71, 0x38, 0x55), RGB(0x71, 0x38, 0x45),
582 RGB(0x71, 0x38, 0x38), RGB(0x71, 0x45, 0x38), RGB(0x71, 0x55, 0x38), RGB(0x71, 0x61, 0x38),
583 RGB(0x71, 0x71, 0x38), RGB(0x61, 0x71, 0x38), RGB(0x55, 0x71, 0x38), RGB(0x45, 0x71, 0x38),
584 RGB(0x38, 0x71, 0x38), RGB(0x38, 0x71, 0x45), RGB(0x38, 0x71, 0x55), RGB(0x38, 0x71, 0x61),
585 RGB(0x38, 0x71, 0x71), RGB(0x38, 0x61, 0x71), RGB(0x38, 0x55, 0x71), RGB(0x38, 0x45, 0x71),
586 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
587 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
588 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
589 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
590 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
591 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
592 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x30, 0x00, 0x41),
593 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x30), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
594 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x30, 0x00),
595 RGB(0x41, 0x41, 0x00), RGB(0x30, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
596
597 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x30),
598 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x30, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
599 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x30, 0x20, 0x41), RGB(0x38, 0x20, 0x41),
600 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x38), RGB(0x41, 0x20, 0x30), RGB(0x41, 0x20, 0x28),
601 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x30, 0x20), RGB(0x41, 0x38, 0x20),
602 RGB(0x41, 0x41, 0x20), RGB(0x38, 0x41, 0x20), RGB(0x30, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
603 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x30), RGB(0x20, 0x41, 0x38),
604 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x38, 0x41), RGB(0x20, 0x30, 0x41), RGB(0x20, 0x28, 0x41),
605 RGB(0x2C, 0x2C, 0x41), RGB(0x30, 0x2C, 0x41), RGB(0x34, 0x2C, 0x41), RGB(0x3C, 0x2C, 0x41),
606 RGB(0x41, 0x2C, 0x41), RGB(0x41, 0x2C, 0x3C), RGB(0x41, 0x2C, 0x34), RGB(0x41, 0x2C, 0x30),
607 RGB(0x41, 0x2C, 0x2C), RGB(0x41, 0x30, 0x2C), RGB(0x41, 0x34, 0x2C), RGB(0x41, 0x3C, 0x2C),
608 RGB(0x41, 0x41, 0x2C), RGB(0x3C, 0x41, 0x2C), RGB(0x34, 0x41, 0x2C), RGB(0x30, 0x41, 0x2C),
609 RGB(0x2C, 0x41, 0x2C), RGB(0x2C, 0x41, 0x30), RGB(0x2C, 0x41, 0x34), RGB(0x2C, 0x41, 0x3C),
610 RGB(0x2C, 0x41, 0x41), RGB(0x2C, 0x3C, 0x41), RGB(0x2C, 0x34, 0x41), RGB(0x2C, 0x30, 0x41),
611 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
612 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
613 };
614
615 #endif
616
617 static CONST UCHAR Font8x8[VGA_FONT_CHARACTERS * 8] =
618 {
619 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
620 0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E,
621 0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E,
622 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
623 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,
624 0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x92, 0x10, 0x7C,
625 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C,
626 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00,
627 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF,
628 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
629 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF,
630 0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78,
631 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18,
632 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0,
633 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0,
634 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99,
635 0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00,
636 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00,
637 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18,
638 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00,
639 0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00,
640 0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0x86, 0xFC,
641 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00,
642 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF,
643 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00,
644 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00,
645 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00,
646 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
647 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00,
648 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
649 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00,
650 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00,
651 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
652 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00,
653 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
654 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
655 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00,
656 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00,
657 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00,
658 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
659 0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00,
660 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00,
661 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
662 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
663 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30,
664 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
665 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
666 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
667 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00,
668 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00,
669 0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00,
670 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00,
671 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00,
672 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00,
673 0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00,
674 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00,
675 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00,
676 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00,
677 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
678 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
679 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00,
680 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00,
681 0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00,
682 0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00,
683 0x7C, 0xC6, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00,
684 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00,
685 0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00,
686 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00,
687 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00,
688 0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
689 0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00,
690 0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00,
691 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00,
692 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
693 0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
694 0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00,
695 0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00,
696 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
697 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00,
698 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
699 0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,
700 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x0E, 0x00,
701 0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00,
702 0x7C, 0xC6, 0xE0, 0x78, 0x0E, 0xC6, 0x7C, 0x00,
703 0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
704 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00,
705 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
706 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
707 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00,
708 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00,
709 0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00,
710 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00,
711 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00,
712 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00,
713 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
714 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
715 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
716 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
717 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00,
718 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00,
719 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00,
720 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
721 0x38, 0x6C, 0x64, 0xF0, 0x60, 0x60, 0xF0, 0x00,
722 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
723 0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00,
724 0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
725 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78,
726 0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
727 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
728 0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xD6, 0x00,
729 0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
730 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
731 0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0,
732 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
733 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0xF0, 0x00,
734 0x00, 0x00, 0x7C, 0xC0, 0x70, 0x1C, 0xF8, 0x00,
735 0x10, 0x30, 0xFC, 0x30, 0x30, 0x34, 0x18, 0x00,
736 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
737 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
738 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
739 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00,
740 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
741 0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00,
742 0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00,
743 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00,
744 0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00,
745 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
746 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00,
747 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x0C, 0x06, 0x7C,
748 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
749 0x1C, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
750 0x7E, 0x81, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0x00,
751 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
752 0xE0, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
753 0x30, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
754 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x78, 0x0C, 0x38,
755 0x7E, 0x81, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00,
756 0xCC, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
757 0xE0, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
758 0xCC, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
759 0x7C, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
760 0xE0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
761 0xC6, 0x10, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
762 0x30, 0x30, 0x00, 0x78, 0xCC, 0xFC, 0xCC, 0x00,
763 0x1C, 0x00, 0xFC, 0x60, 0x78, 0x60, 0xFC, 0x00,
764 0x00, 0x00, 0x7F, 0x0C, 0x7F, 0xCC, 0x7F, 0x00,
765 0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00,
766 0x78, 0x84, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
767 0x00, 0xCC, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
768 0x00, 0xE0, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
769 0x78, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
770 0x00, 0xE0, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
771 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
772 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00,
773 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
774 0x18, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x18,
775 0x38, 0x6C, 0x64, 0xF0, 0x60, 0xE6, 0xFC, 0x00,
776 0xCC, 0xCC, 0x78, 0x30, 0xFC, 0x30, 0xFC, 0x30,
777 0xF8, 0xCC, 0xCC, 0xFA, 0xC6, 0xCF, 0xC6, 0xC3,
778 0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0xD8, 0x70,
779 0x1C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
780 0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
781 0x00, 0x1C, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
782 0x00, 0x1C, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
783 0x00, 0xF8, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0x00,
784 0xFC, 0x00, 0xCC, 0xEC, 0xFC, 0xDC, 0xCC, 0x00,
785 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00,
786 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00,
787 0x18, 0x00, 0x18, 0x18, 0x30, 0x66, 0x3C, 0x00,
788 0x00, 0x00, 0x00, 0xFC, 0xC0, 0xC0, 0x00, 0x00,
789 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x0C, 0x00, 0x00,
790 0xC6, 0xCC, 0xD8, 0x36, 0x6B, 0xC2, 0x84, 0x0F,
791 0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6D, 0xCF, 0x03,
792 0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00,
793 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
794 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00,
795 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
796 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
797 0xDB, 0xF6, 0xDB, 0x6F, 0xDB, 0x7E, 0xD7, 0xED,
798 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
799 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18,
800 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
801 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36,
802 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36,
803 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
804 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36,
805 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
806 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36,
807 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00,
808 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00,
809 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00,
810 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18,
811 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00,
812 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
813 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18,
814 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
815 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
816 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18,
817 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
818 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36,
819 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00,
820 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36,
821 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00,
822 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36,
823 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36,
824 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
825 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36,
826 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
827 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00,
828 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18,
829 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36,
830 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00,
831 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00,
832 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
833 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36,
834 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36,
835 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18,
836 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00,
837 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18,
838 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
839 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
840 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
841 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
842 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
843 0x00, 0x00, 0x76, 0xDC, 0xC8, 0xDC, 0x76, 0x00,
844 0x00, 0x78, 0xCC, 0xF8, 0xCC, 0xF8, 0xC0, 0xC0,
845 0x00, 0xFC, 0xCC, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
846 0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x00,
847 0xFC, 0xCC, 0x60, 0x30, 0x60, 0xCC, 0xFC, 0x00,
848 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0x70, 0x00,
849 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
850 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00,
851 0xFC, 0x30, 0x78, 0xCC, 0xCC, 0x78, 0x30, 0xFC,
852 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x6C, 0x38, 0x00,
853 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x6C, 0xEE, 0x00,
854 0x1C, 0x30, 0x18, 0x7C, 0xCC, 0xCC, 0x78, 0x00,
855 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00,
856 0x06, 0x0C, 0x7E, 0xDB, 0xDB, 0x7E, 0x60, 0xC0,
857 0x38, 0x60, 0xC0, 0xF8, 0xC0, 0x60, 0x38, 0x00,
858 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
859 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00,
860 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00,
861 0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xFC, 0x00,
862 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xFC, 0x00,
863 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18,
864 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70,
865 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00,
866 0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00,
867 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
868 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
869 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
870 0x0F, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C,
871 0x58, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00,
872 0x70, 0x98, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00,
873 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00,
874 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
875 };
876
877 static CONST UCHAR Font8x14[VGA_FONT_CHARACTERS * 14] =
878 {
879 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
880 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
881 0x00, 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81,
882 0x81, 0xBD, 0x99, 0x81, 0x7E, 0x00, 0x00,
883 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xDB, 0xFF,
884 0xFF, 0xC3, 0xE7, 0xFF, 0x7E, 0x00, 0x00,
885 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE,
886 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00,
887 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C,
888 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00,
889 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0xE7,
890 0xE7, 0xE7, 0x18, 0x18, 0x3C, 0x00, 0x00,
891 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF,
892 0xFF, 0x7E, 0x18, 0x18, 0x3C, 0x00, 0x00,
893 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
894 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
895 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7,
896 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF,
897 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66,
898 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00,
899 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99,
900 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF,
901 0x00, 0x00, 0x00, 0x1E, 0x0E, 0x1A, 0x32,
902 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00,
903 0x00, 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66,
904 0x3C, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
905 0x00, 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30,
906 0x30, 0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00,
907 0x00, 0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63,
908 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00,
909 0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C,
910 0xE7, 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00,
911 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF8,
912 0xFE, 0xF8, 0xE0, 0xC0, 0x80, 0x00, 0x00,
913 0x00, 0x00, 0x00, 0x02, 0x06, 0x0E, 0x3E,
914 0xFE, 0x3E, 0x0E, 0x06, 0x02, 0x00, 0x00,
915 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
916 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
917 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
918 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00,
919 0x00, 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB,
920 0x7B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00,
921 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6,
922 0x6C, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00,
923 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
924 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE,
925 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
926 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00,
927 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
928 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
929 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
930 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
931 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C,
932 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00,
933 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60,
934 0xFE, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00,
935 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
936 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00,
937 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6C,
938 0xFE, 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00,
939 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
940 0x7C, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00,
941 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C,
942 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00,
943 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
944 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
945 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C,
946 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00,
947 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00,
948 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
949 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C,
950 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00,
951 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0,
952 0x7C, 0x06, 0x86, 0xC6, 0x7C, 0x18, 0x18,
953 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6,
954 0x0C, 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00,
955 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
956 0x76, 0xDC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
957 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30,
958 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
959 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30,
960 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00,
961 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C,
962 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00,
963 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C,
964 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00,
965 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
966 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
967 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
968 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
969 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
970 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
971 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
972 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
973 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
974 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
975 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
976 0xD6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00,
977 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18,
978 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00,
979 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C,
980 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00,
981 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06,
982 0x3C, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00,
983 0x00, 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C,
984 0xCC, 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
985 0x00, 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0,
986 0xFC, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00,
987 0x00, 0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0,
988 0xFC, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
989 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C,
990 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00,
991 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
992 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
993 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
994 0x7E, 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00,
995 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
996 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
997 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
998 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
999 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60,
1000 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00,
1001 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1002 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1003 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C,
1004 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00,
1005 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C,
1006 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00,
1007 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE,
1008 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00,
1009 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6,
1010 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1011 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1012 0x7C, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00,
1013 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1014 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00,
1015 0x00, 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66,
1016 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00,
1017 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68,
1018 0x78, 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00,
1019 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68,
1020 0x78, 0x68, 0x60, 0x60, 0xF0, 0x00, 0x00,
1021 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1022 0xC0, 0xDE, 0xC6, 0x66, 0x3A, 0x00, 0x00,
1023 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1024 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1025 0x00, 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18,
1026 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1027 0x00, 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C,
1028 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1029 0x00, 0x00, 0x00, 0xE6, 0x66, 0x6C, 0x6C,
1030 0x78, 0x6C, 0x6C, 0x66, 0xE6, 0x00, 0x00,
1031 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60,
1032 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00,
1033 0x00, 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xD6,
1034 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1035 0x00, 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE,
1036 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1037 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1038 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1039 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1040 0x7C, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00,
1041 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1042 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x0E, 0x00,
1043 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1044 0x7C, 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00,
1045 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60,
1046 0x38, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1047 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x5A, 0x18,
1048 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1049 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1050 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1051 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1052 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00,
1053 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1054 0xD6, 0xD6, 0xFE, 0x6C, 0x6C, 0x00, 0x00,
1055 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7C,
1056 0x38, 0x7C, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1057 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1058 0x3C, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1059 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x8C, 0x18,
1060 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00,
1061 0x00, 0x00, 0x00, 0x3C, 0x30, 0x30, 0x30,
1062 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00,
1063 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70,
1064 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00,
1065 0x00, 0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C,
1066 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x00,
1067 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
1068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1069 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1070 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1071 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1072 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1073 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
1074 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1075 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x78,
1076 0x6C, 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00,
1077 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1078 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1079 0x00, 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C,
1080 0x6C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1081 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1082 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1083 0x00, 0x00, 0x00, 0x1C, 0x36, 0x32, 0x30,
1084 0x7C, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00,
1085 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1086 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x78,
1087 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C,
1088 0x76, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00,
1089 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x38,
1090 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1091 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E,
1092 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C,
1093 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66,
1094 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00,
1095 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18,
1096 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1097 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC,
1098 0xFE, 0xD6, 0xD6, 0xD6, 0xD6, 0x00, 0x00,
1099 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1100 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00,
1101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1102 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1104 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xF0,
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1106 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
1107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1108 0x76, 0x66, 0x60, 0x60, 0xF0, 0x00, 0x00,
1109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1110 0xC6, 0x70, 0x1C, 0xC6, 0x7C, 0x00, 0x00,
1111 0x00, 0x00, 0x00, 0x10, 0x30, 0x30, 0xFC,
1112 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00,
1113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC,
1114 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1116 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00,
1117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1118 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00,
1119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1120 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00,
1121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1122 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
1123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1124 0xCC, 0x18, 0x30, 0x66, 0xFE, 0x00, 0x00,
1125 0x00, 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18,
1126 0x70, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00,
1127 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1128 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
1129 0x00, 0x00, 0x00, 0x70, 0x18, 0x18, 0x18,
1130 0x0E, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00,
1131 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1134 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00, 0x00,
1135 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1136 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x18, 0x70,
1137 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0xCC,
1138 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1139 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x7C,
1140 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1141 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x78,
1142 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1143 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x78,
1144 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1145 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 0x78,
1146 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1147 0x00, 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78,
1148 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1150 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x18, 0x70,
1151 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C,
1152 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1153 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x7C,
1154 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1155 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C,
1156 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1157 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x38,
1158 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1159 0x00, 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38,
1160 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1161 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x38,
1162 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1163 0x00, 0xC6, 0x00, 0x10, 0x38, 0x6C, 0xC6,
1164 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1165 0x38, 0x6C, 0x38, 0x10, 0x38, 0x6C, 0xC6,
1166 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1167 0x0C, 0x18, 0x00, 0xFE, 0x66, 0x62, 0x68,
1168 0x78, 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00,
1169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC,
1170 0x36, 0x76, 0xDC, 0xD8, 0x6E, 0x00, 0x00,
1171 0x00, 0x00, 0x00, 0x3E, 0x6C, 0xCC, 0xCC,
1172 0xFE, 0xCC, 0xCC, 0xCC, 0xCE, 0x00, 0x00,
1173 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C,
1174 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1175 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x7C,
1176 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1177 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C,
1178 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1179 0x00, 0x00, 0x30, 0x78, 0xCC, 0x00, 0xCC,
1180 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1181 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 0xCC,
1182 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1183 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0xC6,
1184 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
1185 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1186 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1187 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1188 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1189 0x00, 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6,
1190 0xC0, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
1191 0x00, 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60,
1192 0xF0, 0x60, 0x60, 0x66, 0xFC, 0x00, 0x00,
1193 0x00, 0x00, 0x00, 0x66, 0x66, 0x3C, 0x18,
1194 0x7E, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
1195 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x7C,
1196 0x62, 0x66, 0x6F, 0x66, 0xF3, 0x00, 0x00,
1197 0x00, 0x00, 0x00, 0x0E, 0x1B, 0x18, 0x18,
1198 0x7E, 0x18, 0x18, 0xD8, 0x70, 0x00, 0x00,
1199 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78,
1200 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1201 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x38,
1202 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1203 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x7C,
1204 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1205 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0xCC,
1206 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1207 0x00, 0x00, 0x00, 0x76, 0xDC, 0x00, 0xDC,
1208 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00,
1209 0x76, 0xDC, 0x00, 0xC6, 0xE6, 0xF6, 0xFE,
1210 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1211 0x00, 0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x36,
1212 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1213 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
1214 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
1215 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30,
1216 0x30, 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1218 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
1219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1220 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00,
1221 0x00, 0x60, 0xE0, 0x63, 0x66, 0x6C, 0x18,
1222 0x30, 0x6E, 0xC3, 0x06, 0x0C, 0x1F, 0x00,
1223 0x00, 0x60, 0xE0, 0x63, 0x66, 0x6C, 0x18,
1224 0x36, 0x6E, 0xDA, 0x3F, 0x06, 0x06, 0x00,
1225 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18,
1226 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00,
1227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1228 0x36, 0x6C, 0xD8, 0x6C, 0x36, 0x00, 0x00,
1229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1230 0xD8, 0x6C, 0x36, 0x6C, 0xD8, 0x00, 0x00,
1231 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11,
1232 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1233 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1234 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
1235 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD,
1236 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1237 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1238 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1239 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1240 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1241 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18,
1242 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1243 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1244 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1246 0xFE, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1247 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18,
1248 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1249 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06,
1250 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1251 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1252 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1253 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06,
1254 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1255 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06,
1256 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1257 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1258 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1259 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18,
1260 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1262 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1263 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1264 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1265 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1266 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1267 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1268 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1269 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1270 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1272 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1273 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1274 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1275 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18,
1276 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1277 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1278 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1279 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30,
1280 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1281 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30,
1282 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1283 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00,
1284 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1285 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1286 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1287 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30,
1288 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1289 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1290 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1291 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00,
1292 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1293 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00,
1294 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1295 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1296 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1297 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1298 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1300 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1301 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1302 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1303 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18,
1304 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1305 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18,
1306 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1308 0x3F, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1309 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1310 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1311 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18,
1312 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1313 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1314 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1316 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1317 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1318 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1320 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1321 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1322 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1323 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1324 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1325 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1328 0xDC, 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00,
1329 0x00, 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8,
1330 0xCC, 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00,
1331 0x00, 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC0,
1332 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00,
1333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1334 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00,
1335 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x60, 0x30,
1336 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00,
1337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1338 0xD8, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00,
1339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66,
1340 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
1341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1342 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
1343 0x00, 0x00, 0x00, 0x7E, 0x18, 0x3C, 0x66,
1344 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00,
1345 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1346 0xFE, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00,
1347 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1348 0xC6, 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00,
1349 0x00, 0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C,
1350 0x3E, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00,
1351 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB,
1352 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1353 0x00, 0x00, 0x00, 0x03, 0x06, 0x7E, 0xDB,
1354 0xDB, 0xF3, 0x7E, 0x60, 0xC0, 0x00, 0x00,
1355 0x00, 0x00, 0x00, 0x1E, 0x30, 0x60, 0x60,
1356 0x7E, 0x60, 0x60, 0x30, 0x1E, 0x00, 0x00,
1357 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1358 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
1359 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
1360 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
1361 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1362 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
1363 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06,
1364 0x0C, 0x18, 0x30, 0x00, 0x7E, 0x00, 0x00,
1365 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60,
1366 0x30, 0x18, 0x0C, 0x00, 0x7E, 0x00, 0x00,
1367 0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18,
1368 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1369 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1370 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00,
1371 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
1372 0x7E, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
1373 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1374 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1375 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
1376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1378 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1380 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1381 0x00, 0x00, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C,
1382 0x0C, 0xEC, 0x6C, 0x3C, 0x1C, 0x00, 0x00,
1383 0x00, 0x00, 0x00, 0x6C, 0x36, 0x36, 0x36,
1384 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
1385 0x00, 0x00, 0x00, 0x3C, 0x66, 0x0C, 0x18,
1386 0x32, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1387 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E,
1388 0x7E, 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00,
1389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1391 };
1392
1393 static CONST UCHAR Font8x16[VGA_FONT_CHARACTERS * 16] =
1394 {
1395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1397 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD,
1398 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00,
1399 0x00, 0x00, 0x7C, 0xFE, 0xFE, 0xD6, 0xFE, 0xFE,
1400 0xBA, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00,
1401 0x00, 0x00, 0x00, 0x6C, 0xEE, 0xFE, 0xFE, 0xFE,
1402 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1403 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C,
1404 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1405 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x10, 0x6C,
1406 0xEE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
1407 0x00, 0x00, 0x10, 0x38, 0x7C, 0x7C, 0xFE, 0xFE,
1408 0xFE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
1409 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C,
1410 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1411 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3,
1412 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1413 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x66, 0x66,
1414 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1415 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0x99, 0x99,
1416 0x99, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1417 0x00, 0x00, 0x1E, 0x0E, 0x1E, 0x36, 0x78, 0xCC,
1418 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1419 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18,
1420 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1421 0x00, 0x00, 0x1E, 0x1A, 0x1E, 0x18, 0x18, 0x18,
1422 0x18, 0x78, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00,
1423 0x00, 0x00, 0x3E, 0x36, 0x3E, 0x36, 0x36, 0x76,
1424 0xF6, 0x66, 0x0E, 0x1E, 0x0C, 0x00, 0x00, 0x00,
1425 0x00, 0x00, 0x18, 0xDB, 0x7E, 0x3C, 0x66, 0x66,
1426 0x3C, 0x7E, 0xDB, 0x18, 0x00, 0x00, 0x00, 0x00,
1427 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xFE,
1428 0xFC, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00,
1429 0x00, 0x00, 0x00, 0x02, 0x0E, 0x3E, 0x7E, 0xFE,
1430 0x7E, 0x3E, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00,
1431 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1432 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1433 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
1434 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1435 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0xDB, 0x7B,
1436 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00,
1437 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x7C, 0xF6,
1438 0xDE, 0x7C, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1439 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1440 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00,
1441 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1442 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1443 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1444 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1445 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1446 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1447 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0xFF,
1448 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1449 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xFE,
1450 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1451 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
1452 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1453 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF,
1454 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1455 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x7C,
1456 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1457 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x7C,
1458 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1459 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1461 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x3C, 0x18,
1462 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1463 0x00, 0x36, 0x36, 0x36, 0x36, 0x14, 0x00, 0x00,
1464 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1465 0x00, 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C,
1466 0xFE, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1467 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0x78,
1468 0x3C, 0x06, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
1469 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x66, 0x0C,
1470 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00, 0x00, 0x00,
1471 0x00, 0x00, 0x38, 0x6C, 0x38, 0x30, 0x76, 0x7E,
1472 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1473 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1474 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1475 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30,
1476 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1477 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C,
1478 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1479 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x38, 0xFE,
1480 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1481 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E,
1482 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1483 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1484 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1485 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1487 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1488 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1489 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
1490 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
1491 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xCE, 0xDE, 0xF6,
1492 0xE6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1493 0x00, 0x00, 0x18, 0x78, 0x18, 0x18, 0x18, 0x18,
1494 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1495 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x06, 0x0C, 0x18,
1496 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1497 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06,
1498 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1499 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xCC,
1500 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00,
1501 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06,
1502 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1503 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xFC, 0xC6,
1504 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1505 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C, 0x18, 0x30,
1506 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
1507 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6,
1508 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1509 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E,
1510 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1511 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1512 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1513 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1514 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1515 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0xC0,
1516 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1517 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
1518 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1519 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06,
1520 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
1521 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18,
1522 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1523 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xDE, 0xDE,
1524 0xDE, 0xDC, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00,
1525 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE,
1526 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1527 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66,
1528 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1529 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0,
1530 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1531 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66,
1532 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,
1533 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1534 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1535 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1536 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1537 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0,
1538 0xCE, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1539 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6,
1540 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1541 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1542 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1543 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1544 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1545 0x00, 0x00, 0xC6, 0xC6, 0xCC, 0xD8, 0xF0, 0xF0,
1546 0xD8, 0xCC, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1547 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60,
1548 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1549 0x00, 0x00, 0xC6, 0xC6, 0xEE, 0xEE, 0xFE, 0xD6,
1550 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1551 0x00, 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xF6, 0xDE,
1552 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1553 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1554 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1555 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x66, 0x7C,
1556 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1557 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1558 0xC6, 0xD6, 0xD6, 0x7C, 0x06, 0x00, 0x00, 0x00,
1559 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x78,
1560 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1561 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0x70, 0x1C,
1562 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1563 0x00, 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18,
1564 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1565 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1566 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1567 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1568 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1569 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6,
1570 0xFE, 0xEE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1571 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x38,
1572 0x6C, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1573 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C,
1574 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1575 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30,
1576 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1577 0x00, 0x00, 0x7C, 0x60, 0x60, 0x60, 0x60, 0x60,
1578 0x60, 0x60, 0x60, 0x7C, 0x00, 0x00, 0x00, 0x00,
1579 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30,
1580 0x18, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1581 0x00, 0x00, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
1582 0x0C, 0x0C, 0x0C, 0x7C, 0x00, 0x00, 0x00, 0x00,
1583 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00,
1584 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1585 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1586 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
1587 0x00, 0x18, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x00,
1588 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1589 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1590 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1591 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1592 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1593 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1594 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1595 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC,
1596 0xCC, 0xCC, 0xCC, 0x7E, 0x00, 0x00, 0x00, 0x00,
1597 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1598 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1599 0x00, 0x00, 0x1C, 0x36, 0x30, 0x30, 0xFC, 0x30,
1600 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00,
1601 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCE, 0xC6,
1602 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1603 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1604 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1605 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18,
1606 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1607 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x0C,
1608 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1609 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x66, 0x6C,
1610 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1611 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1612 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00,
1613 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xD6,
1614 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1615 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1616 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1617 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1618 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1619 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1620 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x00,
1621 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC,
1622 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
1623 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x60,
1624 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1625 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1626 0x7C, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1627 0x00, 0x00, 0x30, 0x30, 0x30, 0xFC, 0x30, 0x30,
1628 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,
1629 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC,
1630 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1631 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1632 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1633 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6,
1634 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00,
1635 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x6C,
1636 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1637 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1638 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1639 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x86, 0x0C,
1640 0x18, 0x30, 0x62, 0xFE, 0x00, 0x00, 0x00, 0x00,
1641 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18,
1642 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00,
1643 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
1644 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1645 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18,
1646 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
1647 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1648 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1649 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
1650 0x6C, 0x6C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1651 0x00, 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0xC6,
1652 0x66, 0x3C, 0x18, 0x0C, 0xCC, 0x38, 0x00, 0x00,
1653 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1654 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1655 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1656 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1657 0x00, 0x30, 0x78, 0xCC, 0x00, 0x78, 0x0C, 0x7C,
1658 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1659 0x00, 0x00, 0xCC, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1660 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1661 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C,
1662 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1663 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78, 0x0C, 0x7C,
1664 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1665 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0,
1666 0xC6, 0x7C, 0x18, 0x0C, 0x6C, 0x38, 0x00, 0x00,
1667 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1668 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1669 0x00, 0x00, 0xCC, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1670 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1671 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1672 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1673 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
1674 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1675 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18,
1676 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1677 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18,
1678 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1679 0x00, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6,
1680 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1681 0x38, 0x6C, 0x38, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1682 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1683 0x0C, 0x18, 0x30, 0x00, 0xFE, 0x60, 0x60, 0x7C,
1684 0x60, 0x60, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00,
1685 0x00, 0x00, 0x00, 0x00, 0x66, 0xDB, 0x1B, 0x7F,
1686 0xD8, 0xD8, 0xDF, 0x76, 0x00, 0x00, 0x00, 0x00,
1687 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xD8, 0xFE,
1688 0xD8, 0xD8, 0xD8, 0xDE, 0x00, 0x00, 0x00, 0x00,
1689 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1690 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1691 0x00, 0x00, 0xC6, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1692 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1693 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1694 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1695 0x00, 0x30, 0x78, 0xCC, 0x00, 0xC6, 0xC6, 0xC6,
1696 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1697 0x00, 0x60, 0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6,
1698 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1699 0x00, 0x18, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18,
1700 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1701 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6,
1702 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1703 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1704 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1705 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0xC0,
1706 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1707 0x00, 0x38, 0x6C, 0x60, 0x60, 0xF0, 0x60, 0x60,
1708 0x60, 0x66, 0xF6, 0x6C, 0x00, 0x00, 0x00, 0x00,
1709 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E,
1710 0x18, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1711 0x00, 0x00, 0x3E, 0x63, 0x63, 0x30, 0x1C, 0x06,
1712 0x63, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1713 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x63, 0x38,
1714 0x0E, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1715 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78, 0x0C, 0x7C,
1716 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1717 0x00, 0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18,
1718 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1719 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1720 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1721 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC,
1722 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1723 0x00, 0x00, 0x76, 0xDC, 0x00, 0xBC, 0x66, 0x66,
1724 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1725 0x00, 0x76, 0xDC, 0x00, 0xC6, 0xC6, 0xE6, 0xF6,
1726 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1727 0x00, 0x21, 0x1E, 0x00, 0x1E, 0x33, 0x60, 0x60,
1728 0x67, 0x63, 0x33, 0x1D, 0x00, 0x00, 0x00, 0x00,
1729 0x00, 0x42, 0x3C, 0x00, 0x3B, 0x66, 0x66, 0x66,
1730 0x3E, 0x06, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1731 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30,
1732 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1733 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1734 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
1735 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1736 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
1737 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x30,
1738 0x60, 0xDC, 0x36, 0x0C, 0x18, 0x3E, 0x00, 0x00,
1739 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x36,
1740 0x6E, 0xDE, 0x36, 0x7E, 0x06, 0x06, 0x00, 0x00,
1741 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x3C,
1742 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1743 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6C, 0xD8,
1744 0x6C, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1745 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x6C, 0x36,
1746 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1747 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1748 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1749 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1750 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1751 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1752 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1753 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1754 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1755 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1756 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1757 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1758 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1759 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6,
1760 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1761 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1762 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1763 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8,
1764 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1765 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xF6,
1766 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1767 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1768 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1769 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6,
1770 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1771 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xFE,
1772 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1773 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE,
1774 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1775 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1776 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1777 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
1778 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1779 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1780 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1781 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1783 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1784 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1785 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1786 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1787 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1788 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1789 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1790 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1791 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1792 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1793 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
1794 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1795 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3F,
1796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1797 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37,
1798 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1799 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF,
1800 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1801 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7,
1802 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1803 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37,
1804 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1805 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1807 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7,
1808 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1809 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF,
1810 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1811 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1812 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1813 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1814 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1815 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1816 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1817 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F,
1818 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1819 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1821 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F,
1822 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1823 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
1824 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1825 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1826 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1827 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF,
1828 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1829 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1830 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1831 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
1832 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1833 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1834 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1835 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1836 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1837 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1838 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1839 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1840 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1841 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1843 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0xD8, 0xD8,
1844 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1845 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8, 0xFC, 0xC6,
1846 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00, 0x00, 0x00,
1847 0x00, 0x00, 0xFE, 0x66, 0x62, 0x60, 0x60, 0x60,
1848 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00,
1849 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x6C, 0x6C,
1850 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1851 0x00, 0x00, 0xFE, 0xC6, 0x62, 0x30, 0x18, 0x18,
1852 0x30, 0x62, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1853 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xCC,
1854 0xCC, 0xCC, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1855 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1856 0x66, 0x7C, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
1857 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18,
1858 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1859 0x00, 0x00, 0xFE, 0x38, 0x38, 0x6C, 0xC6, 0xC6,
1860 0x6C, 0x38, 0x38, 0xFE, 0x00, 0x00, 0x00, 0x00,
1861 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE,
1862 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
1863 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6,
1864 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00, 0x00, 0x00,
1865 0x00, 0x00, 0x3E, 0x60, 0x60, 0x3C, 0x66, 0xC6,
1866 0xC6, 0xC6, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1867 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB,
1868 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1869 0x00, 0x00, 0x02, 0x06, 0x7C, 0xCE, 0xDE, 0xF6,
1870 0xF6, 0x7C, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00,
1871 0x00, 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C,
1872 0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00,
1873 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1874 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1875 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE,
1876 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1877 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1878 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1879 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18,
1880 0x30, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1881 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18,
1882 0x0C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1883 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1E, 0x1A, 0x18,
1884 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1885 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1886 0x18, 0x18, 0x58, 0x78, 0x30, 0x00, 0x00, 0x00,
1887 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E,
1888 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1889 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1890 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1891 0x00, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1892 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1893 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1894 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1895 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1896 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1897 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18,
1898 0xD8, 0xD8, 0x78, 0x38, 0x18, 0x00, 0x00, 0x00,
1899 0x00, 0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
1900 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1901 0x00, 0x00, 0x70, 0xD8, 0x18, 0x30, 0x60, 0xF8,
1902 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1903 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E,
1904 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1905 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1906 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1907 };
1908
1909
1910 /*
1911 * Table of supported Video Modes.
1912 *
1913 * See http://wiki.osdev.org/Drawing_In_Protected_Mode#Locating_Video_Memory
1914 * Values of PageSize taken from DOSBox.
1915 */
1916
1917 typedef struct _VGA_MODE
1918 {
1919 PVGA_REGISTERS VgaRegisters;
1920 WORD PageSize;
1921 WORD CharacterWidth;
1922 WORD CharacterHeight;
1923 // PCOLORREF Palette;
1924 } VGA_MODE, *PVGA_MODE;
1925
1926 static CONST VGA_MODE VideoModes[BIOS_MAX_VIDEO_MODE + 1] =
1927 {
1928 {&VideoMode_40x25_text, 0x0800, 9, 16}, /* Mode 00h - 16 color (mono) */
1929 {&VideoMode_40x25_text, 0x0800, 9, 16}, /* Mode 01h - 16 color */
1930 {&VideoMode_80x25_text, 0x1000, 9, 16}, /* Mode 02h - 16 color (mono) */
1931 {&VideoMode_80x25_text, 0x1000, 9, 16}, /* Mode 03h - 16 color */
1932 {&VideoMode_320x200_4color, 0x4000, 8, 8}, /* Mode 04h - CGA 4 color */
1933 {&VideoMode_320x200_4color, 0x4000, 8, 8}, /* Mode 05h - CGA same (m) (uses 3rd CGA palette) */
1934 {&VideoMode_640x200_2color, 0x4000, 8, 8}, /* Mode 06h - CGA 640*200 2 color */
1935 {NULL, 0x1000, 1, 1}, /* Mode 07h - MDA monochrome text 80*25 */
1936 {NULL, 0x0000, 1, 1}, /* Mode 08h - PCjr */
1937 {NULL, 0x0000, 1, 1}, /* Mode 09h - PCjr */
1938 {NULL, 0x0000, 1, 1}, /* Mode 0Ah - PCjr */
1939 {NULL, 0x0000, 1, 1}, /* Mode 0Bh - Reserved */
1940 {NULL, 0x0000, 1, 1}, /* Mode 0Ch - Reserved */
1941 {&VideoMode_320x200_16color, 0x2000, 8, 8}, /* Mode 0Dh - EGA 320*200 16 color */
1942 {&VideoMode_640x200_16color, 0x4000, 8, 8}, /* Mode 0Eh - EGA 640*200 16 color */
1943 {NULL, 0x8000, 1, 1}, /* Mode 0Fh - EGA 640*350 mono */
1944 {&VideoMode_640x350_16color, 0x8000, 8, 14}, /* Mode 10h - EGA 640*350 HiRes 16 color */
1945 {&VideoMode_640x480_2color, 0xA000, 8, 16}, /* Mode 11h - VGA 640*480 mono */
1946 {&VideoMode_640x480_16color, 0xA000, 8, 16}, /* Mode 12h - VGA */
1947 {&VideoMode_320x200_256color, 0x2000, 8, 8}, /* Mode 13h - VGA */
1948 };
1949
1950 #define IS_TEXT_MODE(ModeNumber) \
1951 (((ModeNumber) >= 0x00 && (ModeNumber) <= 0x03) || ((ModeNumber) == 0x07))
1952
1953 static PVGA_STATIC_FUNC_TABLE VgaStaticFuncTable;
1954 static BOOLEAN VbeInitialized = FALSE;
1955
1956 /* PRIVATE FUNCTIONS **********************************************************/
1957
1958 static BOOLEAN VidBiosScrollWindow(SCROLL_DIRECTION Direction,
1959 DWORD Amount,
1960 SMALL_RECT Rectangle,
1961 BYTE Page,
1962 BYTE FillAttribute)
1963 {
1964 INT i, j;
1965 DWORD VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Page * Bda->VideoPageSize);
1966 WORD FillCharacter = MAKEWORD(' ', FillAttribute);
1967
1968 WORD WindowWidth, WindowHeight;
1969
1970 /* Fixup the rectangle if needed */
1971 Rectangle.Left = min(max(Rectangle.Left , 0), Bda->ScreenColumns - 1);
1972 Rectangle.Right = min(max(Rectangle.Right , 0), Bda->ScreenColumns - 1);
1973 Rectangle.Top = min(max(Rectangle.Top , 0), Bda->ScreenRows);
1974 Rectangle.Bottom = min(max(Rectangle.Bottom, 0), Bda->ScreenRows);
1975
1976 WindowWidth = Rectangle.Right - Rectangle.Left + 1;
1977 WindowHeight = Rectangle.Bottom - Rectangle.Top + 1;
1978
1979 /* Amount == 0 means we clear all the rectangle */
1980 if ((Amount == 0) ||
1981 (((Direction == SCROLL_UP ) || (Direction == SCROLL_DOWN )) && (Amount >= WindowHeight)) ||
1982 (((Direction == SCROLL_LEFT) || (Direction == SCROLL_RIGHT)) && (Amount >= WindowWidth )))
1983 {
1984 /* Fill the rectangle */
1985 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
1986 {
1987 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
1988 {
1989 EmulatorWriteMemory(&EmulatorContext,
1990 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
1991 (LPVOID)&FillCharacter,
1992 sizeof(FillCharacter));
1993 }
1994 }
1995
1996 return TRUE;
1997 }
1998
1999 switch (Direction)
2000 {
2001 case SCROLL_UP:
2002 {
2003 /* Move text lines up */
2004 for (i = Rectangle.Top + Amount; i <= Rectangle.Bottom; i++)
2005 {
2006 EmulatorCopyMemory(&EmulatorContext,
2007 VideoAddress + ((i - Amount) * Bda->ScreenColumns + Rectangle.Left) * sizeof(WORD),
2008 VideoAddress + ( i * Bda->ScreenColumns + Rectangle.Left) * sizeof(WORD),
2009 (Rectangle.Right - Rectangle.Left + 1) * sizeof(WORD));
2010 }
2011
2012 /* Fill the bottom of the rectangle */
2013 for (i = Rectangle.Bottom - Amount + 1; i <= Rectangle.Bottom; i++)
2014 {
2015 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
2016 {
2017 EmulatorWriteMemory(&EmulatorContext,
2018 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2019 (LPVOID)&FillCharacter,
2020 sizeof(FillCharacter));
2021 }
2022 }
2023
2024 break;
2025 }
2026
2027 case SCROLL_DOWN:
2028 {
2029 INT Bottom;
2030
2031 /* Move text lines down */
2032 for (i = Rectangle.Bottom - Amount; i >= Rectangle.Top; i--)
2033 {
2034 EmulatorCopyMemory(&EmulatorContext,
2035 VideoAddress + ((i + Amount) * Bda->ScreenColumns + Rectangle.Left) * sizeof(WORD),
2036 VideoAddress + ( i * Bda->ScreenColumns + Rectangle.Left) * sizeof(WORD),
2037 (Rectangle.Right - Rectangle.Left + 1) * sizeof(WORD));
2038 }
2039
2040 /* Fill the top of the rectangle */
2041 Bottom = Rectangle.Top + Amount - 1;
2042 for (i = Rectangle.Top; i <= Bottom; i++)
2043 {
2044 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
2045 {
2046 EmulatorWriteMemory(&EmulatorContext,
2047 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2048 (LPVOID)&FillCharacter,
2049 sizeof(FillCharacter));
2050 }
2051 }
2052
2053 break;
2054 }
2055
2056 case SCROLL_LEFT:
2057 {
2058 /* Move text lines left */
2059 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2060 {
2061 EmulatorCopyMemory(&EmulatorContext,
2062 VideoAddress + (i * Bda->ScreenColumns + Rectangle.Left ) * sizeof(WORD),
2063 VideoAddress + (i * Bda->ScreenColumns + Rectangle.Left + Amount) * sizeof(WORD),
2064 (Rectangle.Right - Rectangle.Left - Amount + 1) * sizeof(WORD));
2065 }
2066
2067 /* Fill the right of the rectangle */
2068 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2069 {
2070 for (j = Rectangle.Right - Amount + 1; j <= Rectangle.Right; j++)
2071 {
2072 EmulatorWriteMemory(&EmulatorContext,
2073 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2074 (LPVOID)&FillCharacter,
2075 sizeof(FillCharacter));
2076 }
2077 }
2078
2079 break;
2080 }
2081
2082 case SCROLL_RIGHT:
2083 {
2084 INT Right;
2085
2086 /* Move text lines right */
2087 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2088 {
2089 EmulatorCopyMemory(&EmulatorContext,
2090 VideoAddress + (i * Bda->ScreenColumns + Rectangle.Left + Amount) * sizeof(WORD),
2091 VideoAddress + (i * Bda->ScreenColumns + Rectangle.Left ) * sizeof(WORD),
2092 (Rectangle.Right - Rectangle.Left - Amount + 1) * sizeof(WORD));
2093 }
2094
2095 /* Fill the left of the rectangle */
2096 Right = Rectangle.Left + Amount - 1;
2097 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2098 {
2099 for (j = Rectangle.Left; j <= Right; j++)
2100 {
2101 EmulatorWriteMemory(&EmulatorContext,
2102 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2103 (LPVOID)&FillCharacter,
2104 sizeof(FillCharacter));
2105 }
2106 }
2107
2108 break;
2109 }
2110 }
2111
2112 return TRUE;
2113 }
2114
2115 static __inline VOID VgaSetSinglePaletteRegister(BYTE Index, BYTE Value)
2116 {
2117 /* Write the index */
2118 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2119 IOWriteB(VGA_AC_INDEX, Index);
2120
2121 /* Write the data */
2122 IOWriteB(VGA_AC_WRITE, Value);
2123 }
2124
2125 static BOOLEAN VgaSetRegisters(PVGA_REGISTERS Registers)
2126 {
2127 UINT i;
2128
2129 if (Registers == NULL) return FALSE;
2130
2131 /* Disable interrupts */
2132 setIF(0);
2133
2134 /*
2135 * Set the CRT base address according to the selected mode,
2136 * monochrome or color. The following macros:
2137 * VGA_INSTAT1_READ, VGA_CRTC_INDEX and VGA_CRTC_DATA are then
2138 * used to access the correct VGA I/O ports.
2139 */
2140 Bda->CrtBasePort = (Registers->Misc & 0x01) ? VGA_CRTC_INDEX_COLOR
2141 : VGA_CRTC_INDEX_MONO;
2142 /* Bit 1 indicates whether display is color (0) or monochrome (1) */
2143 Bda->VGAOptions = (Bda->VGAOptions & 0xFD) | (!(Registers->Misc & 0x01) << 1);
2144 Bda->CrtModeControl = (Bda->CrtModeControl & 0xFB) | (!(Registers->Misc & 0x01) << 1);
2145
2146 /* Update blink bit in BDA */
2147 if (Registers->Attribute[VGA_AC_CONTROL_REG] & VGA_AC_CONTROL_BLINK)
2148 Bda->CrtModeControl |= (1 << 5);
2149 else
2150 Bda->CrtModeControl &= ~(1 << 5);
2151
2152 /* Turn the video off */
2153 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_CLOCK_REG);
2154 IOWriteB(VGA_SEQ_DATA , IOReadB(VGA_SEQ_DATA) | VGA_SEQ_CLOCK_SD);
2155
2156 /* Write the misc register */
2157 IOWriteB(VGA_MISC_WRITE, Registers->Misc);
2158
2159 /* Synchronous reset on */
2160 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_RESET_REG);
2161 IOWriteB(VGA_SEQ_DATA , VGA_SEQ_RESET_AR );
2162
2163 /* Write the sequencer registers */
2164 for (i = 1; i < VGA_SEQ_MAX_REG; i++)
2165 {
2166 IOWriteB(VGA_SEQ_INDEX, i);
2167 IOWriteB(VGA_SEQ_DATA , Registers->Sequencer[i]);
2168 }
2169
2170 /* Synchronous reset off */
2171 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_RESET_REG);
2172 IOWriteB(VGA_SEQ_DATA , VGA_SEQ_RESET_SR | VGA_SEQ_RESET_AR);
2173
2174 /* Unlock CRTC registers 0-7 */
2175 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_END_HORZ_BLANKING_REG);
2176 IOWriteB(VGA_CRTC_DATA , IOReadB(VGA_CRTC_DATA) | 0x80);
2177 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_VERT_RETRACE_END_REG);
2178 IOWriteB(VGA_CRTC_DATA , IOReadB(VGA_CRTC_DATA) & ~0x80);
2179 // Make sure they remain unlocked
2180 Registers->CRT[VGA_CRTC_END_HORZ_BLANKING_REG] |= 0x80;
2181 Registers->CRT[VGA_CRTC_VERT_RETRACE_END_REG] &= ~0x80;
2182
2183 /* Write the CRTC registers */
2184 for (i = 0; i < VGA_CRTC_MAX_REG; i++)
2185 {
2186 IOWriteB(VGA_CRTC_INDEX, i);
2187 IOWriteB(VGA_CRTC_DATA , Registers->CRT[i]);
2188 }
2189
2190 /* Write the GC registers */
2191 for (i = 0; i < VGA_GC_MAX_REG; i++)
2192 {
2193 IOWriteB(VGA_GC_INDEX, i);
2194 IOWriteB(VGA_GC_DATA , Registers->Graphics[i]);
2195 }
2196
2197 /* Write the AC registers */
2198 for (i = 0; i < VGA_AC_MAX_REG; i++)
2199 {
2200 VgaSetSinglePaletteRegister(i, Registers->Attribute[i]);
2201 }
2202
2203 /* Set the PEL mask */
2204 IOWriteB(VGA_DAC_MASK, 0xFF);
2205
2206 /* Enable screen and disable palette access */
2207 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2208 IOWriteB(VGA_AC_INDEX, 0x20);
2209
2210 /* Turn the video on */
2211 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_CLOCK_REG);
2212 IOWriteB(VGA_SEQ_DATA , IOReadB(VGA_SEQ_DATA) & ~VGA_SEQ_CLOCK_SD);
2213
2214 /* Enable interrupts */
2215 setIF(1);
2216
2217 return TRUE;
2218 }
2219
2220 static VOID VgaSetPalette(const COLORREF* Palette, ULONG Size)
2221 {
2222 ULONG i;
2223
2224 // /* Disable screen and enable palette access */
2225 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2226 // IOWriteB(VGA_AC_INDEX, 0x00);
2227
2228 for (i = 0; i < Size; i++)
2229 {
2230 IOWriteB(VGA_DAC_WRITE_INDEX, i);
2231 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetRValue(Palette[i])));
2232 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetGValue(Palette[i])));
2233 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetBValue(Palette[i])));
2234 }
2235
2236 /* The following step might be optional */
2237 for (i = Size; i < VGA_MAX_COLORS; i++)
2238 {
2239 IOWriteB(VGA_DAC_WRITE_INDEX, i);
2240 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
2241 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
2242 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
2243 }
2244
2245 /* Enable screen and disable palette access */
2246 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2247 // IOWriteB(VGA_AC_INDEX, 0x20);
2248 }
2249
2250 static VOID VgaChangePalette(BYTE ModeNumber)
2251 {
2252 const COLORREF* Palette;
2253 ULONG Size;
2254
2255 if (ModeNumber >= 0x13)
2256 {
2257 /* VGA modes */
2258 Palette = VgaPalette;
2259 Size = ARRAYSIZE(VgaPalette);
2260 }
2261 else if (ModeNumber == 0x10) // || (ModeNumber == 0x0D) || (ModeNumber == 0x0E)
2262 {
2263 /* EGA HiRes mode */
2264 Palette = EgaPalette__HiRes;
2265 Size = ARRAYSIZE(EgaPalette__HiRes);
2266 }
2267 #if 0
2268 else if ((ModeNumber == 0x04) || (ModeNumber == 0x05))
2269 {
2270 /*
2271 * CGA modes; this palette contains both normal and
2272 * bright versions of CGA palettes 0 and 1
2273 */
2274 Palette = CgaPalette2;
2275 Size = ARRAYSIZE(CgaPalette2);
2276 }
2277 #endif
2278 else // if ((ModeNumber == 0x0D) || (ModeNumber == 0x0E))
2279 {
2280 /* EGA modes */
2281 Palette = EgaPalette__16Colors;
2282 Size = ARRAYSIZE(EgaPalette__16Colors);
2283 }
2284
2285 VgaSetPalette(Palette, Size);
2286 }
2287
2288 static __inline VOID VidBiosGetCursorPosition(PBYTE Row, PBYTE Column, BYTE Page)
2289 {
2290 *Row = HIBYTE(Bda->CursorPosition[Page]);
2291 *Column = LOBYTE(Bda->CursorPosition[Page]);
2292 }
2293
2294 static VOID VidBiosSetCursorPosition(BYTE Row, BYTE Column, BYTE Page)
2295 {
2296 /* Update the position in the BDA */
2297 Bda->CursorPosition[Page] = MAKEWORD(Column, Row);
2298
2299 /* Check if this is the current video page */
2300 if (Page == Bda->VideoPage)
2301 {
2302 WORD Offset = Row * Bda->ScreenColumns + Column;
2303
2304 /* Modify the CRTC registers */
2305 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_LOW_REG);
2306 IOWriteB(VGA_CRTC_DATA , LOBYTE(Offset));
2307 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_HIGH_REG);
2308 IOWriteB(VGA_CRTC_DATA , HIBYTE(Offset));
2309 }
2310 }
2311
2312 static VOID VidBiosSetCursorShape(WORD CursorStartEnd)
2313 {
2314 /* Only valid in text-mode */
2315 if (!IS_TEXT_MODE(Bda->VideoMode)) return;
2316
2317 /* Update the BDA */
2318 Bda->CursorStartLine = HIBYTE(CursorStartEnd) & 0x1F;
2319 Bda->CursorEndLine = LOBYTE(CursorStartEnd) & 0x1F;
2320
2321 /*
2322 * In cursor emulation mode, we suppose the cursor scanlines
2323 * to be in CGA mode, so that we need to adjust them
2324 *
2325 * WARNING!!
2326 * =========
2327 * Contrary to what is mentioned in lots of literature out there, e.g. in:
2328 * http://webpages.charter.net/danrollins/techhelp/0072.HTM
2329 * http://www.bioscentral.com/misc/bda.htm
2330 * and in other various places, bit 0 of Bda->VGAOptions is 0 when
2331 * cursor emulation is ENABLED, and is 1 when it is DISABLED.
2332 *
2333 * The following documentation is right about this fact:
2334 * http://www.cs.nyu.edu/~mwalfish/classes/ut/s12-cs372h/ref/hardware/vgadoc/VGABIOS.TXT
2335 * https://sites.google.com/site/pcdosretro/biosdata
2336 *
2337 * A proof that it is OK is that in the following code samples it is
2338 * explicitely mentioned that setting bit 0 disables cursor emulation:
2339 * - Code snippets in PC Magazine vol.5 num.15 of 16/09/1986, p.291-292;
2340 * - CardFile DOS utility (Jeff Prosise, PC Magazine vol.6 num.17 of 13/10/1987, p.403-416):
2341 * https://ia600700.us.archive.org/1/items/srccode-00000020/cardfile.asm.txt
2342 * (function 'show_cursor', "or ega_info,1 ;disable EGA cursor emulation")
2343 */
2344 if (!(Bda->VGAOptions & 0x01))
2345 {
2346 // HACK: Quick "fix" for cursor scanline adjustment. This must be reworked.
2347 DPRINT1("HACK: Using HACK for cursor scanlines adjustment\n");
2348 CursorStartEnd = MAKEWORD((LOBYTE(CursorStartEnd) & 0x1F) * 2,
2349 (HIBYTE(CursorStartEnd) & 0x1F) * 2 | (HIBYTE(CursorStartEnd) & 0xE0));
2350 }
2351
2352 /* Modify the CRTC registers */
2353 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_START_REG);
2354 IOWriteB(VGA_CRTC_DATA , HIBYTE(CursorStartEnd));
2355 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_END_REG);
2356 IOWriteB(VGA_CRTC_DATA , LOBYTE(CursorStartEnd));
2357 }
2358
2359 static VOID VidBiosSyncCursorPosition(VOID)
2360 {
2361 BYTE Row, Column;
2362 BYTE Low, High;
2363 SHORT ScreenColumns = Bda->ScreenColumns;
2364 WORD Offset;
2365
2366 /* Get the cursor position */
2367 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_LOW_REG);
2368 Low = IOReadB(VGA_CRTC_DATA);
2369 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_HIGH_REG);
2370 High = IOReadB(VGA_CRTC_DATA);
2371
2372 Offset = MAKEWORD(Low, High);
2373
2374 Row = (BYTE)(Offset / ScreenColumns);
2375 Column = (BYTE)(Offset % ScreenColumns);
2376
2377 /* Synchronize our cursor position with VGA */
2378 VidBiosSetCursorPosition(Row, Column, Bda->VideoPage);
2379 }
2380
2381 static inline BYTE VidBiosGetVideoMode(VOID)
2382 {
2383 /* Bit 7 of VideoMode is determined by bit 7 of VGAOptions */
2384 return Bda->VideoMode | (Bda->VGAOptions & 0x80);
2385 }
2386
2387 static inline VOID VidBiosClearScreen(VOID)
2388 {
2389 static const DWORD MemoryMaps[4] = { 0xA0000, 0xA0000, 0xB0000, 0xB8000 };
2390 static const DWORD MemorySizes[4] = { 0x20000, 0x10000, 0x08000, 0x08000 };
2391
2392 DWORD VideoAddress;
2393 DWORD BufferSize;
2394 BYTE Misc;
2395 BYTE Buffer[0x20000];
2396
2397 /* Read the misc register */
2398 IOWriteB(VGA_GC_INDEX, VGA_GC_MISC_REG);
2399 Misc = IOReadB(VGA_GC_DATA);
2400
2401 /* Get the video address and buffer size */
2402 VideoAddress = MemoryMaps[(Misc >> 2) & 3];
2403 BufferSize = MemorySizes[(Misc >> 2) & 3];
2404
2405 // !IS_TEXT_MODE(Bda->VideoMode)
2406 if (Misc & 1)
2407 {
2408 /* Graphics mode */
2409 RtlZeroMemory(Buffer, BufferSize);
2410 }
2411 else
2412 {
2413 /* Text mode */
2414 UINT i;
2415 for (i = 0; i < (BufferSize >> 1); i++)
2416 {
2417 ((PWORD)Buffer)[i] = MAKEWORD(' ', DEFAULT_ATTRIBUTE);
2418 }
2419 }
2420
2421 /* Write to video memory */
2422 EmulatorWriteMemory(&EmulatorContext, VideoAddress, Buffer, BufferSize);
2423 }
2424
2425 static BOOLEAN VidBiosSetVideoMode(BYTE ModeNumber)
2426 {
2427 BYTE Page;
2428 COORD Resolution;
2429 BYTE OrgModeNumber = ModeNumber;
2430
2431 /*
2432 * IBM standard modes do not clear the screen if the
2433 * high bit of AL is set (EGA or higher only).
2434 * See Ralf Brown: http://www.ctyme.com/intr/rb-0069.htm
2435 * for more information.
2436 */
2437 BOOLEAN DoNotClear = !!(ModeNumber & 0x80);
2438
2439 /* Retrieve the real mode number and check its validity */
2440 ModeNumber &= 0x7F;
2441 // if (ModeNumber >= ARRAYSIZE(VideoModes))
2442 if (ModeNumber > BIOS_MAX_VIDEO_MODE)
2443 {
2444 DPRINT1("VidBiosSetVideoMode -- Mode %02Xh invalid\n", ModeNumber);
2445 return FALSE;
2446 }
2447
2448 DPRINT1("Switching to mode %02Xh (%02Xh) %s clearing the screen; VgaRegisters = 0x%p\n",
2449 ModeNumber, OrgModeNumber, (DoNotClear ? "without" : "and"), VideoModes[ModeNumber].VgaRegisters);
2450
2451 if (!VgaSetRegisters(VideoModes[ModeNumber].VgaRegisters)) return FALSE;
2452
2453 VgaChangePalette(ModeNumber);
2454
2455 /* Clear the VGA memory if needed */
2456 if (!DoNotClear) VgaClearMemory();
2457
2458 /* Update the values in the BDA */
2459 Bda->VideoMode = ModeNumber;
2460 Bda->VideoPageSize = VideoModes[ModeNumber].PageSize;
2461 Bda->VideoPage = 0;
2462 Bda->VideoPageOffset = Bda->VideoPage * Bda->VideoPageSize;
2463
2464 /* 256 KB Video RAM; set bit 7 if we do not clear the screen */
2465 Bda->VGAOptions = 0x60 | (Bda->VGAOptions & 0x7F) | (DoNotClear ? 0x80 : 0x00);
2466 Bda->VGASwitches = 0xF9; /* High-resolution */
2467
2468 // Bda->VGAFlags;
2469 // Bda->CrtModeControl;
2470 // Bda->CrtColorPaletteMask;
2471
2472 /* Set the start address in the CRTC */
2473 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG);
2474 IOWriteB(VGA_CRTC_DATA , LOBYTE(Bda->VideoPageOffset));
2475 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_HIGH_REG);
2476 IOWriteB(VGA_CRTC_DATA , HIBYTE(Bda->VideoPageOffset));
2477
2478 /* Update the screen size */
2479 Resolution = VgaGetDisplayResolution();
2480 // This could be simplified if the VGA helper always returned the resolution
2481 // in number of pixels, instead of in number of cells for text-modes only...
2482 if (!IS_TEXT_MODE(ModeNumber))
2483 {
2484 Resolution.X /= VideoModes[ModeNumber].CharacterWidth ;
2485 Resolution.Y /= VideoModes[ModeNumber].CharacterHeight;
2486 }
2487 Bda->ScreenColumns = Resolution.X;
2488 Bda->ScreenRows = Resolution.Y - 1;
2489
2490 /* Update the current font */
2491 Bda->CharacterHeight = VideoModes[ModeNumber].CharacterHeight;
2492 switch (Bda->CharacterHeight)
2493 {
2494 /*
2495 * Write the default font to the VGA font plane for text-modes only.
2496 * Update the BIOS INT 43h vector (far pointer to the character range 00h-...).
2497 */
2498 case 8:
2499 {
2500 if (IS_TEXT_MODE(ModeNumber))
2501 VgaWriteTextModeFont(0, Font8x8, ARRAYSIZE(Font8x8) / VGA_FONT_CHARACTERS);
2502
2503 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x8_OFFSET, VIDEO_BIOS_DATA_SEG);
2504 break;
2505 }
2506 case 14:
2507 {
2508 if (IS_TEXT_MODE(ModeNumber))
2509 VgaWriteTextModeFont(0, Font8x14, ARRAYSIZE(Font8x14) / VGA_FONT_CHARACTERS);
2510
2511 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x14_OFFSET, VIDEO_BIOS_DATA_SEG);
2512 break;
2513 }
2514 case 16:
2515 {
2516 if (IS_TEXT_MODE(ModeNumber))
2517 VgaWriteTextModeFont(0, Font8x16, ARRAYSIZE(Font8x16) / VGA_FONT_CHARACTERS);
2518
2519 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
2520 break;
2521 }
2522 }
2523
2524 #if 0 // Commented, because I need to think about how to change correctly the ScreenRows
2525 // in the code that really use it (the Font generator functions of INT 10h, AH=11h)
2526 // so that it also changes the screen resolution *in text mode only*.
2527 switch (getBL())
2528 {
2529 case 0x00: Bda->ScreenRows = getDL()-1; break;
2530 case 0x01: Bda->ScreenRows = 13; break;
2531 case 0x03: Bda->ScreenRows = 42; break;
2532 case 0x02:
2533 default : Bda->ScreenRows = 24; break;
2534 }
2535 #endif
2536
2537 /*
2538 * Update the cursor shape (text-mode only).
2539 * Use the default CGA cursor scanline values,
2540 * see: http://vitaly_filatov.tripod.com/ng/asm/asm_023.2.html
2541 */
2542 if (IS_TEXT_MODE(ModeNumber))
2543 // FIXME: we might read the CRT registers and do the adjustment?
2544 VidBiosSetCursorShape(MAKEWORD(0x07, 0x06));
2545
2546 /* Set the cursor position for each page */
2547 for (Page = 0; Page < BIOS_MAX_PAGES; ++Page)
2548 VidBiosSetCursorPosition(0, 0, Page);
2549
2550 if (!DoNotClear) VidBiosClearScreen();
2551
2552 /* Refresh display */
2553 VgaRefreshDisplay();
2554
2555 return TRUE;
2556 }
2557
2558 static BOOLEAN VidBiosSetVideoPage(BYTE PageNumber)
2559 {
2560 BYTE Row, Column;
2561
2562 /* Check if the page exists */
2563 if (PageNumber >= BIOS_MAX_PAGES) return FALSE;
2564
2565 /* Check if this is the same page */
2566 if (PageNumber == Bda->VideoPage) return TRUE;
2567
2568 /* Update the values in the BDA */
2569 Bda->VideoPage = PageNumber;
2570 Bda->VideoPageOffset = Bda->VideoPage * Bda->VideoPageSize;
2571
2572 /* Set the start address in the CRTC */
2573 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG);
2574 IOWriteB(VGA_CRTC_DATA , LOBYTE(Bda->VideoPageOffset));
2575 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_HIGH_REG);
2576 IOWriteB(VGA_CRTC_DATA , HIBYTE(Bda->VideoPageOffset));
2577
2578 /*
2579 * Get the cursor position (we don't update anything on the BIOS side
2580 * but we update the cursor position on the VGA side).
2581 */
2582 VidBiosGetCursorPosition(&Row, &Column, PageNumber);
2583 VidBiosSetCursorPosition( Row, Column, PageNumber);
2584
2585 return TRUE;
2586 }
2587
2588 static VOID VidBiosDrawGlyph(WORD CharData, BOOLEAN UseAttr, BYTE Page, BYTE Row, BYTE Column)
2589 {
2590 switch (Bda->VideoMode)
2591 {
2592 /* Alphanumeric mode */
2593 case 0x00:
2594 case 0x01:
2595 case 0x02:
2596 case 0x03:
2597 case 0x07:
2598 {
2599 EmulatorWriteMemory(&EmulatorContext,
2600 TO_LINEAR(TEXT_VIDEO_SEG,
2601 Page * Bda->VideoPageSize +
2602 (Row * Bda->ScreenColumns + Column) * sizeof(WORD)),
2603 (LPVOID)&CharData,
2604 UseAttr ? sizeof(WORD) : sizeof(BYTE));
2605 break;
2606 }
2607
2608 /* 4-color CGA */
2609 case 0x04:
2610 case 0x05:
2611 {
2612 WORD i;
2613 WORD CgaSegment[] = { CGA_EVEN_VIDEO_SEG, CGA_ODD_VIDEO_SEG };
2614 PUCHAR Font = (PUCHAR)FAR_POINTER(((PULONG)BaseAddress)[0x43]);
2615 PUCHAR Glyph = &Font[LOBYTE(CharData) * Bda->CharacterHeight];
2616 BOOLEAN Xor = (HIBYTE(CharData) & 0x80) ? TRUE : FALSE;
2617 BYTE OldRotate;
2618 BYTE DoubledBits[] =
2619 {
2620 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,
2621 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF
2622 };
2623
2624 if (Xor)
2625 {
2626 /* Set the logical operation to XOR */
2627 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2628 OldRotate = IOReadB(VGA_GC_DATA);
2629 IOWriteB(VGA_GC_DATA, OldRotate | 0x18);
2630 }
2631
2632 for (i = 0; i < Bda->CharacterHeight; i++)
2633 {
2634 WORD Pixel = MAKEWORD(DoubledBits[Glyph[i] >> 4],
2635 DoubledBits[Glyph[i] & 0x0F]);
2636 if (Xor)
2637 {
2638 USHORT Dummy;
2639
2640 /* Read from VGA memory to load the latch register */
2641 EmulatorReadMemory(&EmulatorContext,
2642 TO_LINEAR(CgaSegment[(Row * Bda->CharacterHeight + i) & 1],
2643 (((Row * Bda->CharacterHeight + i) >> 1)
2644 * Bda->ScreenColumns + Column) * 2),
2645 (LPVOID)&Dummy,
2646 sizeof(USHORT));
2647 }
2648
2649 EmulatorWriteMemory(&EmulatorContext,
2650 TO_LINEAR(CgaSegment[(Row * Bda->CharacterHeight + i) & 1],
2651 (((Row * Bda->CharacterHeight + i) >> 1)
2652 * Bda->ScreenColumns + Column) * 2),
2653 (LPVOID)&Pixel,
2654 sizeof(USHORT));
2655 }
2656
2657 if (Xor)
2658 {
2659 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2660 IOWriteB(VGA_GC_DATA, OldRotate);
2661 }
2662
2663 break;
2664 }
2665
2666 /* 2-color CGA */
2667 case 0x06:
2668 {
2669 WORD i;
2670 WORD CgaSegment[] = { CGA_EVEN_VIDEO_SEG, CGA_ODD_VIDEO_SEG };
2671 PUCHAR Font = (PUCHAR)FAR_POINTER(((PULONG)BaseAddress)[0x43]);
2672 PUCHAR Glyph = &Font[LOBYTE(CharData) * Bda->CharacterHeight];
2673 BOOLEAN Xor = (HIBYTE(CharData) & 0x80) ? TRUE : FALSE;
2674 BYTE OldRotate;
2675
2676 if (Xor)
2677 {
2678 /* Set the logical operation to XOR */
2679 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2680 OldRotate = IOReadB(VGA_GC_DATA);
2681 IOWriteB(VGA_GC_DATA, OldRotate | 0x18);
2682 }
2683
2684 for (i = 0; i < Bda->CharacterHeight; i++)
2685 {
2686 if (Xor)
2687 {
2688 UCHAR Dummy;
2689
2690 /* Read from VGA memory to load the latch register */
2691 EmulatorReadMemory(&EmulatorContext,
2692 TO_LINEAR(CgaSegment[(Row * Bda->CharacterHeight + i) & 1],
2693 (((Row * Bda->CharacterHeight + i) >> 1)
2694 * Bda->ScreenColumns) + Column),
2695 (LPVOID)&Dummy,
2696 sizeof(UCHAR));
2697 }
2698
2699 EmulatorWriteMemory(&EmulatorContext,
2700 TO_LINEAR(CgaSegment[(Row * Bda->CharacterHeight + i) & 1],
2701 (((Row * Bda->CharacterHeight + i) >> 1)
2702 * Bda->ScreenColumns) + Column),
2703 (LPVOID)&Glyph[i],
2704 sizeof(UCHAR));
2705 }
2706
2707 if (Xor)
2708 {
2709 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2710 IOWriteB(VGA_GC_DATA, OldRotate);
2711 }
2712
2713 break;
2714 }
2715
2716 /* 16-color modes */
2717 case 0x0D:
2718 case 0x0E:
2719 case 0x10:
2720 case 0x11:
2721 case 0x12:
2722 {
2723 WORD i;
2724 PUCHAR Font = (PUCHAR)FAR_POINTER(((PULONG)BaseAddress)[0x43]);
2725 PUCHAR Glyph = &Font[LOBYTE(CharData) * Bda->CharacterHeight];
2726 BOOLEAN Xor = (HIBYTE(CharData) & 0x80) ? TRUE : FALSE;
2727 BYTE OldPlaneWrite, OldReset, OldEnableReset, OldRotate, OldMode;
2728
2729 /* Write to all planes */
2730 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_MASK_REG);
2731 OldPlaneWrite = IOReadB(VGA_SEQ_DATA);
2732 IOWriteB(VGA_SEQ_DATA, 0x0F);
2733
2734 /* Zero the planes whose bits are set in the enable set/reset register */
2735 IOWriteB(VGA_GC_INDEX, VGA_GC_RESET_REG);
2736 OldReset = IOReadB(VGA_GC_DATA);
2737 IOWriteB(VGA_GC_DATA, 0x00);
2738
2739 /* Set the enable set/reset register to the inverse of the color */
2740 IOWriteB(VGA_GC_INDEX, VGA_GC_ENABLE_RESET_REG);
2741 OldEnableReset = IOReadB(VGA_GC_DATA);
2742 IOWriteB(VGA_GC_DATA, (~HIBYTE(CharData)) & 0x0F);
2743
2744 /* Make sure we're in write mode 0 */
2745 IOWriteB(VGA_GC_INDEX, VGA_GC_MODE_REG);
2746 OldMode = IOReadB(VGA_GC_DATA);
2747 IOWriteB(VGA_GC_DATA, 0x00);
2748
2749 if (Xor)
2750 {
2751 /* Set the logical operation to XOR */
2752 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2753 OldRotate = IOReadB(VGA_GC_DATA);
2754 IOWriteB(VGA_GC_DATA, OldRotate | 0x18);
2755 }
2756
2757 for (i = 0; i < Bda->CharacterHeight; i++)
2758 {
2759 if (Xor)
2760 {
2761 UCHAR Dummy;
2762
2763 /* Read from VGA memory to load the latch register */
2764 EmulatorReadMemory(&EmulatorContext,
2765 TO_LINEAR(GRAPHICS_VIDEO_SEG,
2766 ((Row * Bda->CharacterHeight + i)
2767 * Bda->ScreenColumns) + Column),
2768 (LPVOID)&Dummy,
2769 sizeof(UCHAR));
2770 }
2771
2772 EmulatorWriteMemory(&EmulatorContext,
2773 TO_LINEAR(GRAPHICS_VIDEO_SEG,
2774 ((Row * Bda->CharacterHeight + i)
2775 * Bda->ScreenColumns) + Column),
2776 (LPVOID)&Glyph[i],
2777 sizeof(UCHAR));
2778 }
2779
2780 /* Restore the registers */
2781 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_MASK_REG);
2782 IOWriteB(VGA_SEQ_DATA, OldPlaneWrite);
2783 IOWriteB(VGA_GC_INDEX, VGA_GC_RESET_REG);
2784 IOWriteB(VGA_GC_DATA, OldReset);
2785 IOWriteB(VGA_GC_INDEX, VGA_GC_ENABLE_RESET_REG);
2786 IOWriteB(VGA_GC_DATA, OldEnableReset);
2787 IOWriteB(VGA_GC_INDEX, VGA_GC_MODE_REG);
2788 IOWriteB(VGA_GC_DATA, OldMode);
2789
2790 if (Xor)
2791 {
2792 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2793 IOWriteB(VGA_GC_DATA, OldRotate);
2794 }
2795
2796 break;
2797 }
2798
2799 /* 256-color mode */
2800 case 0x13:
2801 {
2802 WORD i, j;
2803 PUCHAR Font = (PUCHAR)FAR_POINTER(((PULONG)BaseAddress)[0x43]);
2804 PUCHAR Glyph = &Font[LOBYTE(CharData) * Bda->CharacterHeight];
2805 BYTE PixelBuffer[8]; // 8 == CharacterWidth
2806
2807 for (i = 0; i < Bda->CharacterHeight; i++)
2808 {
2809 for (j = 0; j < ARRAYSIZE(PixelBuffer); j++)
2810 {
2811 PixelBuffer[j] = (Glyph[i] & (1 << (7 - j))) ? HIBYTE(CharData) : 0;
2812 }
2813
2814 EmulatorWriteMemory(&EmulatorContext,
2815 TO_LINEAR(GRAPHICS_VIDEO_SEG,
2816 ((Row * Bda->CharacterHeight + i)
2817 * Bda->ScreenColumns + Column) * 8),
2818 (LPVOID)PixelBuffer,
2819 sizeof(PixelBuffer));
2820 }
2821
2822 break;
2823 }
2824
2825 default:
2826 {
2827 DPRINT1("Drawing glyphs in mode %02Xh is not supported.\n", Bda->VideoMode);
2828 }
2829 }
2830 }
2831
2832 static VOID VidBiosPrintCharacter(CHAR Character, BYTE Attribute, BOOLEAN UseAttr, BYTE Page)
2833 {
2834 WORD CharData = MAKEWORD(Character, Attribute);
2835 BYTE Row, Column;
2836
2837 /* Get the cursor position */
2838 VidBiosGetCursorPosition(&Row, &Column, Page);
2839
2840 if (Character == '\a')
2841 {
2842 /* Bell control character */
2843 // NOTE: We may use what the terminal emulator offers to us...
2844 Beep(800, 200);
2845 return;
2846 }
2847 else if (Character == '\b')
2848 {
2849 /* Backspace control character */
2850 if (Column > 0)
2851 {
2852 Column--;
2853 }
2854 else if (Row > 0)
2855 {
2856 Column = Bda->ScreenColumns - 1;
2857 Row--;
2858 }
2859
2860 /* Erase the existing character */
2861 CharData = MAKEWORD(' ', Attribute);
2862 VidBiosDrawGlyph(CharData, UseAttr, Page, Row, Column);
2863 }
2864 else if (Character == '\t')
2865 {
2866 /* Horizontal Tabulation control character */
2867 do
2868 {
2869 // Taken from DOSBox
2870 VidBiosPrintCharacter(' ', Attribute, UseAttr, Page);
2871 VidBiosGetCursorPosition(&Row, &Column, Page);
2872 } while (Column % 8);
2873 }
2874 else if (Character == '\n')
2875 {
2876 /* Line Feed control character */
2877 Row++;
2878 }
2879 else if (Character == '\r')
2880 {
2881 /* Carriage Return control character */
2882 Column = 0;
2883 }
2884 else
2885 {
2886 /* Default character */
2887
2888 /* Write the character and advance the cursor */
2889 VidBiosDrawGlyph(CharData, UseAttr, Page, Row, Column);
2890 Column++;
2891 }
2892
2893 /* Check if it passed the end of the row */
2894 if (Column >= Bda->ScreenColumns)
2895 {
2896 /* Return to the first column and go to the next line */
2897 Column = 0;
2898 Row++;
2899 }
2900
2901 /* Scroll the screen up if needed */
2902 if (Row > Bda->ScreenRows)
2903 {
2904 /* The screen must be scrolled up */
2905 SMALL_RECT Rectangle = { 0, 0, Bda->ScreenColumns - 1, Bda->ScreenRows };
2906 VidBiosScrollWindow(SCROLL_UP, 1, Rectangle, Page, DEFAULT_ATTRIBUTE/*Attribute*/);
2907 Row--;
2908 }
2909
2910 /* Set the cursor position */
2911 VidBiosSetCursorPosition(Row, Column, Page);
2912 }
2913
2914 /* PUBLIC FUNCTIONS ***********************************************************/
2915
2916 VOID WINAPI VidBiosVideoService(LPWORD Stack)
2917 {
2918 switch (getAH())
2919 {
2920 /* Set Video Mode */
2921 case 0x00:
2922 {
2923 VidBiosSetVideoMode(getAL());
2924 break;
2925 }
2926
2927 /* Set Text-Mode Cursor Shape */
2928 case 0x01:
2929 {
2930 VidBiosSetCursorShape(getCX());
2931 break;
2932 }
2933
2934 /* Set Cursor Position */
2935 case 0x02:
2936 {
2937 BYTE Page = getBH();
2938
2939 /* Validate the selected video page */
2940 if (Page >= BIOS_MAX_PAGES) break;
2941
2942 VidBiosSetCursorPosition(getDH(), getDL(), Page);
2943 break;
2944 }
2945
2946 /* Get Cursor Position and Shape */
2947 case 0x03:
2948 {
2949 BYTE Page = getBH();
2950
2951 /* Validate the selected video page */
2952 if (Page == 0xFF) // Special case: use the current video page
2953 Page = Bda->VideoPage;
2954 else if (Page >= BIOS_MAX_PAGES)
2955 break;
2956
2957 /* Return the result */
2958 setCX(MAKEWORD(Bda->CursorEndLine, Bda->CursorStartLine));
2959 setDX(Bda->CursorPosition[Page]);
2960 break;
2961 }
2962
2963 /* Query Light Pen */
2964 case 0x04:
2965 {
2966 /*
2967 * On modern BIOSes, this function returns 0
2968 * so that we can ignore the other registers.
2969 */
2970 setAX(0);
2971 break;
2972 }
2973
2974 /* Select Active Display Page */
2975 case 0x05:
2976 {
2977 VidBiosSetVideoPage(getAL());
2978 break;
2979 }
2980
2981 /* Scroll Window Up/Down */
2982 case 0x06:
2983 case 0x07:
2984 {
2985 SMALL_RECT Rectangle = { getCL(), getCH(), getDL(), getDH() };
2986
2987 VidBiosScrollWindow((getAH() == 0x06) ? SCROLL_UP : SCROLL_DOWN,
2988 getAL(), Rectangle, Bda->VideoPage, getBH());
2989
2990 break;
2991 }
2992
2993 /* Read Character and Attribute at Cursor Position */
2994 case 0x08:
2995 {
2996 WORD CharData;
2997 BYTE Page = getBH();
2998 DWORD Offset;
2999
3000 /* Validate the selected video page */
3001 if (Page == 0xFF) // Special case: use the current video page
3002 Page = Bda->VideoPage;
3003 else if (Page >= BIOS_MAX_PAGES)
3004 break;
3005
3006 /* Find the offset of the character */
3007 Offset = Page * Bda->VideoPageSize +
3008 (HIBYTE(Bda->CursorPosition[Page]) * Bda->ScreenColumns +
3009 LOBYTE(Bda->CursorPosition[Page])) * 2;
3010
3011 /* Read from the video memory */
3012 EmulatorReadMemory(&EmulatorContext,
3013 TO_LINEAR(TEXT_VIDEO_SEG, Offset),
3014 (LPVOID)&CharData,
3015 sizeof(WORD));
3016
3017 /* Return the character data in AX */
3018 setAX(CharData);
3019
3020 break;
3021 }
3022
3023 /* Write Character and Attribute at Cursor Position */
3024 case 0x09:
3025 /* Write Character only (PCjr: + Attribute) at Cursor Position */
3026 case 0x0A:
3027 {
3028 WORD Counter = getCX();
3029 WORD CharData = MAKEWORD(getAL(), getBL());
3030 BOOLEAN UseAttr = (getAH() == 0x09);
3031 BYTE Page = getBH();
3032 BYTE Row, Column;
3033
3034 /* Validate the selected video page */
3035 if (Page == 0xFF) // Special case: use the current video page
3036 Page = Bda->VideoPage;
3037 else if (Page >= BIOS_MAX_PAGES)
3038 break;
3039
3040 /* Get the cursor position */
3041 VidBiosGetCursorPosition(&Row, &Column, Page);
3042
3043 /* Write to video memory a certain number of times */
3044 while (Counter-- > 0)
3045 {
3046 /* Write the character and advance the position */
3047 VidBiosDrawGlyph(CharData, UseAttr, Page, Row, Column);
3048 Column++;
3049
3050 /* Check if it passed the end of the row */
3051 if (Column >= Bda->ScreenColumns)
3052 {
3053 /* Return to the first column and go to the next line */
3054 Column = 0;
3055 Row++;
3056 }
3057
3058 /* Contrary to the "Teletype Output" function, the screen is not scrolled */
3059 if (Row > Bda->ScreenRows)
3060 {
3061 Row = Bda->ScreenRows;
3062 }
3063 }
3064
3065 break;
3066 }
3067
3068 /* Set Video Colors */
3069 case 0x0B:
3070 {
3071 if (Bda->VideoMode < 0x04 || Bda->VideoMode > 0x06)
3072 {
3073 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X is unsupported for non-CGA modes\n",
3074 getBH());
3075 break;
3076 }
3077
3078 switch (getBH())
3079 {
3080 case 0x00: /* Set Background/Border Color */
3081 {
3082 #ifdef DOSBOX
3083 BYTE Index = getBL();
3084
3085 /* See: http://www.bioscentral.com/misc/bda.htm */
3086 Bda->CrtColorPaletteMask = (Bda->CrtColorPaletteMask & 0xE0) | (Index & 0x1F);
3087
3088 Index = ((Index << 1) & 0x10) | (Index & 0x7);
3089
3090 /* Always set the overscan color */
3091 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Index);
3092
3093 /* Don't set any extra colors when in text mode */
3094 if (Bda->VideoMode <= 0x03) break;
3095
3096 VgaSetSinglePaletteRegister(0x00, Index);
3097
3098 Index = (Bda->CrtColorPaletteMask & 0x10) | 0x02 | ((Bda->CrtColorPaletteMask & 0x20) >> 5);
3099
3100 VgaSetSinglePaletteRegister(0x01, Index);
3101 Index += 2;
3102 VgaSetSinglePaletteRegister(0x02, Index);
3103 Index += 2;
3104 VgaSetSinglePaletteRegister(0x03, Index);
3105 #else
3106 /* Background/Border Color is modifiable via the first index */
3107 VgaSetSinglePaletteRegister(0x00, getBL());
3108 #endif
3109
3110 /* Enable screen and disable palette access */
3111 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3112 IOWriteB(VGA_AC_INDEX, 0x20);
3113 break;
3114 }
3115
3116 case 0x01: /* Set Palette */
3117 {
3118 BYTE Index = getBL();
3119
3120 /* See: http://www.bioscentral.com/misc/bda.htm */
3121 /* Reset bit 5: foreground colors index (0: green/red/yellow; 1: cyan/magenta/white) */
3122 Bda->CrtColorPaletteMask = (Bda->CrtColorPaletteMask & 0xDF) | ((Index & 1) ? 0x20 : 0x00);
3123
3124 /* Don't set any extra colors when in text mode */
3125 if (Bda->VideoMode <= 0x03) break;
3126
3127 Index = (Bda->CrtColorPaletteMask & 0x10) | 0x02 | Index;
3128
3129 VgaSetSinglePaletteRegister(0x01, Index);
3130 Index += 2;
3131 VgaSetSinglePaletteRegister(0x02, Index);
3132 Index += 2;
3133 VgaSetSinglePaletteRegister(0x03, Index);
3134
3135 /* Enable screen and disable palette access */
3136 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3137 IOWriteB(VGA_AC_INDEX, 0x20);
3138 break;
3139 }
3140
3141 default:
3142 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X NOT IMPLEMENTED\n",
3143 getAH(), getBH());
3144 break;
3145 }
3146
3147 break;
3148 }
3149
3150 /* Teletype Output */
3151 case 0x0E:
3152 {
3153 BYTE Page = getBH();
3154
3155 /* Validate the selected video page */
3156 if (Page == 0xFF) // Special case: use the current video page
3157 Page = Bda->VideoPage;
3158 else if (Page >= BIOS_MAX_PAGES)
3159 break;
3160
3161 VidBiosPrintCharacter(getAL(), getBL(), !IS_TEXT_MODE(Bda->VideoMode), Page);
3162 break;
3163 }
3164
3165 /* Get Current Video Mode */
3166 case 0x0F:
3167 {
3168 setAX(MAKEWORD(VidBiosGetVideoMode(), Bda->ScreenColumns));
3169 setBH(Bda->VideoPage);
3170 break;
3171 }
3172
3173 /* Palette Control */
3174 case 0x10:
3175 {
3176 switch (getAL())
3177 {
3178 /* Set Single Palette Register */
3179 case 0x00:
3180 {
3181 VgaSetSinglePaletteRegister(getBL(), getBH());
3182
3183 /* Enable screen and disable palette access */
3184 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3185 IOWriteB(VGA_AC_INDEX, 0x20);
3186 break;
3187 }
3188
3189 /* Set Overscan Color */
3190 case 0x01:
3191 {
3192 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, getBH());
3193
3194 /* Enable screen and disable palette access */
3195 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3196 IOWriteB(VGA_AC_INDEX, 0x20);
3197 break;
3198 }
3199
3200 /* Set All Palette Registers */
3201 case 0x02:
3202 {
3203 UINT i;
3204 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3205
3206 /* Set the palette registers */
3207 for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
3208 {
3209 VgaSetSinglePaletteRegister(i, Buffer[i]);
3210 }
3211
3212 /* Set the overscan register */
3213 // VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Buffer[VGA_AC_PAL_F_REG + 1]);
3214 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
3215 IOWriteB(VGA_AC_WRITE, Buffer[VGA_AC_PAL_F_REG + 1]);
3216
3217 /* Enable screen and disable palette access */
3218 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3219 IOWriteB(VGA_AC_INDEX, 0x20);
3220 break;
3221 }
3222
3223 /* Toggle Intensity/Blinking Bit */
3224 case 0x03:
3225 {
3226 /* Read the old AC mode control register value */
3227 BYTE VgaAcControlReg;
3228 IOWriteB(VGA_AC_INDEX, VGA_AC_CONTROL_REG);
3229 VgaAcControlReg = IOReadB(VGA_AC_READ);
3230
3231 /* Toggle the blinking bit and write the new value */
3232 if (getBL())
3233 {
3234 VgaAcControlReg |= VGA_AC_CONTROL_BLINK;
3235 Bda->CrtModeControl |= (1 << 5);
3236 }
3237 else
3238 {
3239 VgaAcControlReg &= ~VGA_AC_CONTROL_BLINK;
3240 Bda->CrtModeControl &= ~(1 << 5);
3241 }
3242
3243 IOWriteB(VGA_AC_INDEX, VGA_AC_CONTROL_REG);
3244 IOWriteB(VGA_AC_WRITE, VgaAcControlReg);
3245
3246 /* Enable screen and disable palette access */
3247 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3248 IOWriteB(VGA_AC_INDEX, 0x20);
3249 break;
3250 }
3251
3252 /* Get Single Palette Register */
3253 case 0x07:
3254 {
3255 /* Write the index */
3256 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3257 IOWriteB(VGA_AC_INDEX, getBL());
3258
3259 /* Read the data */
3260 setBH(IOReadB(VGA_AC_READ));
3261
3262 /* Enable screen and disable palette access */
3263 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3264 IOWriteB(VGA_AC_INDEX, 0x20);
3265 break;
3266 }
3267
3268 /* Get Overscan Color */
3269 case 0x08:
3270 {
3271 /* Write the index */
3272 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3273 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
3274
3275 /* Read the data */
3276 setBH(IOReadB(VGA_AC_READ));
3277
3278 /* Enable screen and disable palette access */
3279 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3280 IOWriteB(VGA_AC_INDEX, 0x20);
3281 break;
3282 }
3283
3284 /* Get All Palette Registers */
3285 case 0x09:
3286 {
3287 UINT i;
3288 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3289
3290 /* Get the palette registers */
3291 for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
3292 {
3293 /* Write the index */
3294 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3295 IOWriteB(VGA_AC_INDEX, i);
3296
3297 /* Read the data */
3298 Buffer[i] = IOReadB(VGA_AC_READ);
3299 }
3300
3301 /* Get the overscan register */
3302 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
3303 Buffer[VGA_AC_PAL_F_REG + 1] = IOReadB(VGA_AC_READ);
3304
3305 /* Enable screen and disable palette access */
3306 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3307 IOWriteB(VGA_AC_INDEX, 0x20);
3308 break;
3309 }
3310
3311 /* Set Individual DAC Register */
3312 case 0x10:
3313 {
3314 /* Write the index */
3315 // Certainly in BL and not in BX as said by Ralf Brown...
3316 IOWriteB(VGA_DAC_WRITE_INDEX, getBL());
3317
3318 /* Write the data in this order: Red, Green, Blue */
3319 IOWriteB(VGA_DAC_DATA, getDH());
3320 IOWriteB(VGA_DAC_DATA, getCH());
3321 IOWriteB(VGA_DAC_DATA, getCL());
3322
3323 break;
3324 }
3325
3326 /* Set Block of DAC Registers */
3327 case 0x12:
3328 {
3329 UINT i;
3330 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3331
3332 /* Write the index */
3333 // Certainly in BL and not in BX as said by Ralf Brown...
3334 IOWriteB(VGA_DAC_WRITE_INDEX, getBL());
3335
3336 for (i = 0; i < getCX(); i++)
3337 {
3338 /* Write the data in this order: Red, Green, Blue */
3339 IOWriteB(VGA_DAC_DATA, *Buffer++);
3340 IOWriteB(VGA_DAC_DATA, *Buffer++);
3341 IOWriteB(VGA_DAC_DATA, *Buffer++);
3342 }
3343
3344 break;
3345 }
3346
3347 /* Get Individual DAC Register */
3348 case 0x15:
3349 {
3350 /* Write the index */
3351 IOWriteB(VGA_DAC_READ_INDEX, getBL());
3352
3353 /* Read the data in this order: Red, Green, Blue */
3354 setDH(IOReadB(VGA_DAC_DATA));
3355 setCH(IOReadB(VGA_DAC_DATA));
3356 setCL(IOReadB(VGA_DAC_DATA));
3357
3358 break;
3359 }
3360
3361 /* Get Block of DAC Registers */
3362 case 0x17:
3363 {
3364 UINT i;
3365 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3366
3367 /* Write the index */
3368 // Certainly in BL and not in BX as said by Ralf Brown...
3369 IOWriteB(VGA_DAC_READ_INDEX, getBL());
3370
3371 for (i = 0; i < getCX(); i++)
3372 {
3373 /* Write the data in this order: Red, Green, Blue */
3374 *Buffer++ = IOReadB(VGA_DAC_DATA);
3375 *Buffer++ = IOReadB(VGA_DAC_DATA);
3376 *Buffer++ = IOReadB(VGA_DAC_DATA);
3377 }
3378
3379 break;
3380 }
3381
3382 /* Set PEL Mask */
3383 case 0x18:
3384 {
3385 IOWriteB(VGA_DAC_MASK, getBL());
3386 break;
3387 }
3388
3389 /* Get PEL Mask */
3390 case 0x19:
3391 {
3392 setBL(IOReadB(VGA_DAC_MASK));
3393 break;
3394 }
3395
3396 default:
3397 {
3398 DPRINT1("BIOS Palette Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3399 getAL());
3400 break;
3401 }
3402 }
3403
3404 break;
3405 }
3406
3407 /* Font Control */
3408 case 0x11:
3409 {
3410 switch (getAL())
3411 {
3412 // FIXME: At the moment we support only graphics-mode functions!
3413
3414 /* Load User-specified Patterns (Character Set) for Text Mode */
3415 case 0x00:
3416 case 0x10: // FIXME: 0x1x performs a full mode reset
3417 {
3418 // FIXME: BL == ??
3419
3420 /* Write the default font to the VGA font plane */
3421 // VgaWriteTextModeFont(0, Font8x8, ARRAYSIZE(Font8x8) / VGA_FONT_CHARACTERS);
3422
3423 UNIMPLEMENTED;
3424 break;
3425 }
3426
3427 /* Load ROM Monochrome 8x14 Patterns (Character Set) for Text Mode */
3428 case 0x01:
3429 case 0x11: // FIXME: 0x1x performs a full mode reset
3430 {
3431 // FIXME: BL == ??
3432
3433 /* Write the default font to the VGA font plane */
3434 VgaWriteTextModeFont(0, Font8x14, ARRAYSIZE(Font8x14) / VGA_FONT_CHARACTERS);
3435
3436 UNIMPLEMENTED;
3437 break;
3438 }
3439
3440 /* Load ROM 8x8 Double-dot Patterns (Character Set) for Text Mode */
3441 case 0x02:
3442 case 0x12: // FIXME: 0x1x performs a full mode reset
3443 {
3444 // FIXME: BL == ??
3445
3446 /* Write the default font to the VGA font plane */
3447 VgaWriteTextModeFont(0, Font8x8, ARRAYSIZE(Font8x8) / VGA_FONT_CHARACTERS);
3448
3449 UNIMPLEMENTED;
3450 break;
3451 }
3452
3453 /* Load ROM 8x16 Character Set for Text Mode */
3454 case 0x04:
3455 case 0x14: // FIXME: 0x1x performs a full mode reset
3456 {
3457 // FIXME: BL == ??
3458
3459 /* Write the default font to the VGA font plane */
3460 VgaWriteTextModeFont(0, Font8x16, ARRAYSIZE(Font8x16) / VGA_FONT_CHARACTERS);
3461
3462 UNIMPLEMENTED;
3463 break;
3464 }
3465
3466 /* Set User 8x8 Graphics Chars (Setup INT 1Fh Vector) */
3467 case 0x20:
3468 {
3469 /* Update the BIOS INT 1Fh vector to user-defined ES:BP pointer */
3470 // Far pointer to the 8x8 characters 80h-FFh
3471 ((PULONG)BaseAddress)[0x1F] = MAKELONG(getBP(), getES());
3472 break;
3473 }
3474
3475 /* Set User Graphics Characters */
3476 case 0x21:
3477 {
3478 /*
3479 * Update the BIOS INT 43h vector (far pointer
3480 * to the character range 00h-...)
3481 */
3482 ((PULONG)BaseAddress)[0x43] = MAKELONG(getBP(), getES());
3483
3484 /* Update BDA */
3485 Bda->CharacterHeight = getCX();
3486 switch (getBL())
3487 {
3488 case 0x00: Bda->ScreenRows = getDL()-1; break;
3489 case 0x01: Bda->ScreenRows = 13; break;
3490 case 0x03: Bda->ScreenRows = 42; break;
3491 case 0x02:
3492 default : Bda->ScreenRows = 24; break;
3493 }
3494
3495 break;
3496 }
3497
3498 /* Setup ROM 8x14 Font for Graphics Mode */
3499 case 0x22:
3500 {
3501 /*
3502 * Update the BIOS INT 43h vector (far pointer
3503 * to the character range 00h-...)
3504 */
3505 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x14_OFFSET, VIDEO_BIOS_DATA_SEG);
3506
3507 /* Update BDA */
3508 Bda->CharacterHeight = 14;
3509 switch (getBL())
3510 {
3511 case 0x00: Bda->ScreenRows = getDL()-1; break;
3512 case 0x01: Bda->ScreenRows = 13; break;
3513 case 0x03: Bda->ScreenRows = 42; break;
3514 case 0x02:
3515 default : Bda->ScreenRows = 24; break;
3516 }
3517
3518 break;
3519 }
3520
3521 /* Setup ROM 8x8 Font for Graphics Mode */
3522 case 0x23:
3523 {
3524 /*
3525 * Update the BIOS INT 43h vector (far pointer
3526 * to the character range 00h-...)
3527 */
3528 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x8_OFFSET, VIDEO_BIOS_DATA_SEG);
3529
3530 /* Update BDA */
3531 Bda->CharacterHeight = 8;
3532 switch (getBL())
3533 {
3534 case 0x00: Bda->ScreenRows = getDL()-1; break;
3535 case 0x01: Bda->ScreenRows = 13; break;
3536 case 0x03: Bda->ScreenRows = 42; break;
3537 case 0x02:
3538 default : Bda->ScreenRows = 24; break;
3539 }
3540
3541 break;
3542 }
3543
3544 /* Setup ROM 8x16 Font for Graphics Mode */
3545 case 0x24:
3546 {
3547 /*
3548 * Update the BIOS INT 43h vector (far pointer
3549 * to the character range 00h-...).
3550 */
3551 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
3552
3553 /* Update BDA */
3554 Bda->CharacterHeight = 16;
3555 switch (getBL())
3556 {
3557 case 0x00: Bda->ScreenRows = getDL()-1; break;
3558 case 0x01: Bda->ScreenRows = 13; break;
3559 case 0x03: Bda->ScreenRows = 42; break;
3560 case 0x02:
3561 default : Bda->ScreenRows = 24; break;
3562 }
3563
3564 break;
3565 }
3566
3567 /* Get Current Character Font Information */
3568 case 0x30:
3569 {
3570 ULONG Address = (ULONG)NULL;
3571
3572 switch (getBH())
3573 {
3574 /* 00h - INT 0x1F pointer */
3575 case 0x00:
3576 Address = ((PULONG)BaseAddress)[0x1F];
3577 break;
3578
3579 /* 01h - INT 0x43 pointer */
3580 case 0x01:
3581 Address = ((PULONG)BaseAddress)[0x43];
3582 break;
3583
3584 /* 02h - 8x14 font */
3585 case 0x02:
3586 Address = MAKELONG(FONT_8x14_OFFSET, VIDEO_BIOS_DATA_SEG);
3587 break;
3588
3589 /* 03h - 8x8 font */
3590 case 0x03:
3591 Address = MAKELONG(FONT_8x8_OFFSET, VIDEO_BIOS_DATA_SEG);
3592 break;
3593
3594 /* 04h - 8x8 font, upper half */
3595 case 0x04:
3596 Address = MAKELONG(FONT_8x8_HIGH_OFFSET, VIDEO_BIOS_DATA_SEG);
3597 break;
3598
3599 /* 05h - NOT IMPLEMENTED - 9x14 font */
3600 case 0x05:
3601 break;
3602
3603 /* 06h - 8x16 font */
3604 case 0x06:
3605 Address = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
3606 break;
3607
3608 /* 07h - NOT IMPLEMENTED - 9x16 font */
3609 case 0x07:
3610 break;
3611
3612 default:
3613 DPRINT1("INT 10h, AL=30h Function BH = 0x%02X NOT IMPLEMENTED\n",
3614 getBH());
3615 }
3616
3617 /* Return the data */
3618 setES(HIWORD(Address));
3619 setBP(LOWORD(Address));
3620 setCX(Bda->CharacterHeight);
3621 setDL(Bda->ScreenRows);
3622
3623 break;
3624 }
3625
3626 default:
3627 {
3628 DPRINT1("BIOS Font Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3629 getAL());
3630 }
3631 }
3632
3633 break;
3634 }
3635
3636 /* Alternate Function Select */
3637 case 0x12:
3638 {
3639 switch (getBL())
3640 {
3641 /* Get EGA/VGA Information */
3642 case 0x10:
3643 {
3644 setBH((Bda->VGAOptions & 0x02) >> 1); /* Color (0) or monochrome (1) display */
3645 setBL((Bda->VGAOptions & 0x60) >> 5); /* Video RAM size */
3646 setCH((Bda->VGASwitches & 0xF0) >> 4); /* Features settings */
3647 setCL( Bda->VGASwitches & 0x0F); /* Switches settings */
3648 break;
3649 }
3650
3651 /* Enable/Disable Cursor Emulation */
3652 case 0x34:
3653 {
3654 BYTE State = getAL();
3655
3656 /* Check for validity */
3657 if (State > 1) break;
3658
3659 /*
3660 * Enable (State == 0) or disable (State == 1) cursor emulation.
3661 * Please read the WARNING in the 'VidBiosSetCursorShape'
3662 * function for more details.
3663 */
3664 Bda->VGAOptions = (Bda->VGAOptions & 0xFE) | (State & 0x01);
3665
3666 /* Return success */
3667 setAL(0x12);
3668 break;
3669 }
3670
3671 /* Enable/Disable screen refresh */
3672 case 0x36:
3673 {
3674 BYTE State = getAL();
3675 BYTE Clocking;
3676
3677 /* Check for validity */
3678 if (State > 1) break;
3679
3680 /* Turn the video on (State == 0) or off (State == 1) */
3681 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_CLOCK_REG);
3682 Clocking = IOReadB(VGA_SEQ_DATA);
3683
3684 if (State == 0)
3685 Clocking &= ~VGA_SEQ_CLOCK_SD;
3686 else
3687 Clocking |= VGA_SEQ_CLOCK_SD;
3688
3689 IOWriteB(VGA_SEQ_DATA, Clocking);
3690
3691 /* Return success */
3692 setAL(0x12);
3693 break;
3694 }
3695
3696 default:
3697 {
3698 DPRINT1("BIOS Function INT 10h, AH = 12h (Alternate Function Select), BX = 0x%04X NOT IMPLEMENTED\n",
3699 getBX());
3700 break;
3701 }
3702 }
3703
3704 break;
3705 }
3706
3707 /* Write String */
3708 case 0x13:
3709 {
3710 PCHAR String = (PCHAR)SEG_OFF_TO_PTR(getES(), getBP());
3711 WORD Counter = getCX();
3712 BYTE Row, Column;
3713 BYTE OldRow, OldColumn;
3714 CHAR Character;
3715 BYTE Attribute = getBL(); // Default attribute in case the string contains only characters.
3716 BYTE Page = getBH();
3717 BYTE Flags = getAL();
3718
3719 /* Validate the selected video page */
3720 if (Page == 0xFF) // Special case: use the current video page
3721 Page = Bda->VideoPage;
3722 else if (Page >= BIOS_MAX_PAGES)
3723 break;
3724
3725 /* Get the original cursor position */
3726 VidBiosGetCursorPosition(&OldRow, &OldColumn, Page);
3727
3728 /* Set the new cursor position */
3729 Row = getDH();
3730 Column = getDL();
3731 if (Row == 0xFF) // Special case: use the current cursor position
3732 {
3733 Row = OldRow;
3734 Column = OldColumn;
3735 }
3736 VidBiosSetCursorPosition(Row, Column, Page);
3737
3738 while (Counter-- > 0)
3739 {
3740 Character = *String++;
3741 if (Flags & 0x02) Attribute = *String++;
3742 VidBiosPrintCharacter(Character, Attribute, TRUE, Page);
3743 }
3744
3745 /* Reset the cursor position to its original value if we don't want to update it */
3746 if (!(Flags & 0x01)) VidBiosSetCursorPosition(OldRow, OldColumn, Page);
3747
3748 break;
3749 }
3750
3751 /* Get/Set Display combination code */
3752 case 0x1A:
3753 {
3754 switch (getAL())
3755 {
3756 case 0x00: /* Get Display combination code */
3757 {
3758 setBL(Bda->VGADccIDActive);
3759 setBH(0x00); // No alternate display
3760
3761 /* Return success */
3762 setAL(0x1A);
3763 break;
3764 }
3765 case 0x01: /* Set Display combination code */
3766 {
3767 DPRINT1("Set Display combination code - Unsupported\n");
3768 break;
3769 }
3770 default:
3771 break;
3772 }
3773 break;
3774 }
3775
3776 /* Functionality/State Information (VGA) */
3777 case 0x1B:
3778 {
3779 PVGA_DYNAMIC_FUNC_TABLE Table = SEG_OFF_TO_PTR(getES(), getDI());
3780
3781 /* Check for only supported subfunction */
3782 if (getBX() != 0x0000)
3783 {
3784 DPRINT1("INT 10h, AH=1Bh, unsupported subfunction 0x%04x\n", getBX());
3785 break;
3786 }
3787
3788 /* Fill the VGA dynamic functionality table with our information */
3789
3790 Table->StaticFuncTablePtr = MAKELONG(VIDEO_STATE_INFO_OFFSET, VIDEO_BIOS_DATA_SEG);
3791
3792 Table->VideoMode = Bda->VideoMode;
3793 Table->ScreenColumns = Bda->ScreenColumns;
3794 Table->VideoPageSize = Bda->VideoPageSize;
3795 Table->VideoPageOffset = Bda->VideoPageOffset;
3796 RtlCopyMemory(Table->CursorPosition, Bda->CursorPosition, sizeof(Bda->CursorPosition));
3797 Table->CursorEndLine = Bda->CursorEndLine;
3798 Table->CursorStartLine = Bda->CursorStartLine;
3799 Table->VideoPage = Bda->VideoPage;
3800 Table->CrtBasePort = Bda->CrtBasePort;
3801 Table->CrtModeControl = Bda->CrtModeControl;
3802 Table->CrtColorPaletteMask = Bda->CrtColorPaletteMask;
3803 Table->ScreenRows = Bda->ScreenRows;
3804 Table->CharacterHeight = Bda->CharacterHeight;
3805
3806 Table->VGADccIDActive = Bda->VGADccIDActive;
3807 Table->VGADccIDAlternate = 0x00; // No alternate display
3808 // Table->CurrModeSupportedColorsNum;
3809 // Table->CurrModeSupportedPagesNum;
3810 // Table->Scanlines;
3811 // Table->PrimaryCharTable;
3812 // Table->SecondaryCharTable;
3813 // Table->VGAFlags;
3814 Table->VGAAvailMemory = (Bda->VGAOptions & 0x60) >> 5;
3815 // Table->VGASavePtrStateFlags;
3816 // Table->VGADispInfo;
3817 UNIMPLEMENTED;
3818
3819 /* Return success */
3820 setAL(0x1B);
3821 break;
3822 }
3823
3824 /* VESA BIOS Extensions */
3825 case 0x4F:
3826 {
3827 if (VbeInitialized) VbeService(Stack);
3828 break;
3829 }
3830
3831 default:
3832 {
3833 DPRINT1("BIOS Function INT 10h, AH = 0x%02X, AL = 0x%02X, BH = 0x%02X NOT IMPLEMENTED\n",
3834 getAH(), getAL(), getBH());
3835 }
3836 }
3837 }
3838
3839
3840 /*
3841 * Those attach / detach functions are work-in-progress
3842 */
3843
3844 static BOOL Attached = TRUE;
3845
3846 VOID VidBiosAttachToConsole(VOID)
3847 {
3848 if (!Attached)
3849 {
3850 VgaAttachToConsole();
3851 Attached = TRUE;
3852 }
3853
3854 /* Refresh display */
3855 VgaRefreshDisplay();
3856 VidBiosSyncCursorPosition();
3857 }
3858
3859 VOID VidBiosDetachFromConsole(VOID)
3860 {
3861 if (!Attached) return;
3862
3863 /* Refresh display */
3864 VgaRefreshDisplay();
3865
3866 /* Detach from the console */
3867 VgaDetachFromConsole();
3868 Attached = FALSE;
3869 }
3870
3871 VOID VidBiosPost(VOID)
3872 {
3873 /*
3874 * Initialize VGA BIOS32 RAM dynamic data
3875 */
3876
3877 /* Some vectors are in fact addresses to tables */
3878 ((PULONG)BaseAddress)[0x1D] = (ULONG)NULL; // Video Parameter Tables
3879 // Far pointer to the 8x8 graphics font for the 8x8 characters 80h-FFh
3880 ((PULONG)BaseAddress)[0x1F] = MAKELONG(FONT_8x8_HIGH_OFFSET, VIDEO_BIOS_DATA_SEG);
3881 // Far pointer to the character table (EGA, MCGA, VGA) for the 8x16 characters 00h-...
3882 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
3883 ((PULONG)BaseAddress)[0x44] = (ULONG)NULL; // ROM BIOS Character Font, Characters 00h-7Fh (PCjr)
3884
3885 /* Relocated services by the BIOS (when needed) */
3886 ((PULONG)BaseAddress)[0x42] = (ULONG)NULL; // Relocated Default INT 10h Video Services
3887 ((PULONG)BaseAddress)[0x6D] = (ULONG)NULL; // Video BIOS Entry Point
3888
3889 //
3890 // FIXME: At the moment we always set a VGA mode. In the future,
3891 // we should set this mode **only** when:
3892 // - an app starts to use directly the video memory
3893 // (that should be done in emulator.c)
3894 // - or starts to use non-stream I/O interrupts
3895 // (that should be done here, or maybe in VGA ??)
3896 //
3897
3898 Bda->CrtModeControl = 0x00;
3899 Bda->CrtColorPaletteMask = 0x00;
3900 Bda->VGADccIDActive = 0x08; // VGA w/ color analog active display
3901
3902 /* Set the default video mode */
3903 VidBiosSetVideoMode(BIOS_DEFAULT_VIDEO_MODE);
3904
3905 /* Synchronize our cursor position with VGA */
3906 VidBiosSyncCursorPosition();
3907
3908 /* Register the BIOS 32-bit Interrupts */
3909 RegisterBiosInt32(BIOS_VIDEO_INTERRUPT, VidBiosVideoService);
3910
3911 /* Vectors that should be implemented */
3912 RegisterBiosInt32(0x42, NULL); // Relocated Default INT 10h Video Services
3913 RegisterBiosInt32(0x6D, NULL); // Video BIOS Entry Point
3914
3915 /* Initialize VBE */
3916 VbeInitialized = VbeInitialize();
3917 if (!VbeInitialized) DPRINT1("Couldn't initialize VBE!\n");
3918 }
3919
3920 BOOLEAN VidBiosInitialize(VOID)
3921 {
3922 UCHAR Checksum;
3923
3924 /*
3925 * Initialize VGA BIOS32 static data
3926 */
3927
3928 /* This is a ROM of size 'VIDEO_BIOS_ROM_SIZE' */
3929 *(PWORD)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, 0x0000)) = 0xAA55;
3930 *(PBYTE)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, 0x0002)) = VIDEO_BIOS_ROM_SIZE / 512; // Size in blocks of 512 bytes
3931
3932 /* Bootstrap code */
3933 *(PWORD)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, 0x0003)) = 0x90CB; // retf, nop
3934 // RtlCopyMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, 0xFFF0), Bootstrap, sizeof(Bootstrap));
3935
3936 /* Video BIOS Information */
3937 RtlCopyMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, 0x0005), BiosInfo, sizeof(BiosInfo)-1);
3938
3939 /* Initialize the VGA static function table */
3940 VgaStaticFuncTable = SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, VIDEO_STATE_INFO_OFFSET);
3941 RtlZeroMemory(VgaStaticFuncTable, sizeof(*VgaStaticFuncTable));
3942 VgaStaticFuncTable->SupportedModes[0] = 0xFF; // Modes 0x00 to 0x07 supported
3943 VgaStaticFuncTable->SupportedModes[1] = 0xFF; // Modes 0x08 to 0x0F supported
3944 VgaStaticFuncTable->SupportedModes[2] = 0x0F; // Modes 0x10 to 0x13 supported
3945 VgaStaticFuncTable->SupportedScanlines = 0x07; // Scanlines 200, 350 and 400 supported
3946 VgaStaticFuncTable->TextCharBlocksNumber = 0;
3947 VgaStaticFuncTable->MaxActiveTextCharBlocksNumber = 0;
3948 VgaStaticFuncTable->VGAFuncSupportFlags = 0x0CFD; // See: http://www.ctyme.com/intr/rb-0221.htm#Table46
3949 VgaStaticFuncTable->VGASavePtrFuncFlags = 0x18; // See: http://www.ctyme.com/intr/rb-0221.htm#Table47
3950
3951 /* Fill the font tables */
3952 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x8_OFFSET),
3953 Font8x8, sizeof(Font8x8));
3954 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x16_OFFSET),
3955 Font8x16, sizeof(Font8x16));
3956 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x14_OFFSET),
3957 Font8x14, sizeof(Font8x14));
3958
3959 VidBios32Initialize();
3960
3961 /* Compute the ROM checksum and store it */
3962 *(PBYTE)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, VIDEO_BIOS_ROM_SIZE - 1)) = 0x00;
3963 Checksum = CalcRomChecksum(TO_LINEAR(VIDEO_BIOS_DATA_SEG, 0x0000), VIDEO_BIOS_ROM_SIZE);
3964 *(PBYTE)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, VIDEO_BIOS_ROM_SIZE - 1)) = (0xFF - Checksum + 1) & 0xFF;
3965
3966 WriteProtectRom((PVOID)TO_LINEAR(VIDEO_BIOS_DATA_SEG, 0x0000),
3967 VIDEO_BIOS_ROM_SIZE);
3968
3969 return TRUE;
3970 }
3971
3972 VOID VidBiosCleanup(VOID)
3973 {
3974 }
3975
3976 /* EOF */