2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
5 * PURPOSE: VDM Video BIOS Support Library
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
10 /* INCLUDES *******************************************************************/
20 // #include "vidbios.h"
23 #include "hardware/video/vga.h"
25 /* DEFINES ********************************************************************/
28 #define BOP_VIDEO_INT 0x10
30 /* MACROS *********************************************************************/
33 // These macros are defined for ease-of-use of some VGA I/O ports
34 // whose addresses depend whether we are in Monochrome or Colour mode.
36 #define VGA_INSTAT1_READ Bda->CrtBasePort + 6 // VGA_INSTAT1_READ_MONO or VGA_INSTAT1_READ_COLOR
37 #define VGA_CRTC_INDEX Bda->CrtBasePort // VGA_CRTC_INDEX_MONO or VGA_CRTC_INDEX_COLOR
38 #define VGA_CRTC_DATA Bda->CrtBasePort + 1 // VGA_CRTC_DATA_MONO or VGA_CRTC_DATA_COLOR
40 /* PRIVATE VARIABLES **********************************************************/
43 * VGA Register Configurations for BIOS Video Modes.
44 * The configurations were checked against SeaBIOS VGA BIOS.
47 static VGA_REGISTERS VideoMode_40x25_text
=
49 /* Miscellaneous Register */
52 /* Sequencer Registers */
53 {0x00, 0x08, 0x03, 0x00, 0x02},
55 /* CRTC Registers */ /* CGA-compatible: 0xC7, 0x06, 0x07 */
56 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
57 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x1F, 0x96, 0xB9, 0xA3,
61 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
64 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
65 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
68 static VGA_REGISTERS VideoMode_80x25_text
=
70 /* Miscellaneous Register */
73 /* Sequencer Registers */
74 {0x00, 0x00, 0x03, 0x00, 0x02},
76 /* CRTC Registers */ /* CGA-compatible: 0xC7, 0x06, 0x07 */
77 {0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
78 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3,
82 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
85 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
86 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
89 static VGA_REGISTERS VideoMode_320x200_4color
=
91 /* Miscellaneous Register */
94 /* Sequencer Registers */
95 {0x00, 0x09, 0x03, 0x00, 0x02},
98 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
99 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xA2,
103 {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0F, 0x0F, 0xFF},
106 {0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
107 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x03, 0x00, 0x00}
110 static VGA_REGISTERS VideoMode_640x200_2color
=
112 /* Miscellaneous Register */
115 /* Sequencer Registers */
116 {0x00, 0x01, 0x01, 0x00, 0x02},
119 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
120 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xC2,
124 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0xFF},
127 {0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
128 0x17, 0x17, 0x17, 0x17, 0x01, 0x00, 0x01, 0x00, 0x00}
131 static VGA_REGISTERS VideoMode_320x200_16color
=
133 /* Miscellaneous Register */
136 /* Sequencer Registers */
137 {0x00, 0x09, 0x0F, 0x00, 0x06},
140 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
141 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xE3,
145 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
148 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
149 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
152 static VGA_REGISTERS VideoMode_640x200_16color
=
154 /* Miscellaneous Register */
157 /* Sequencer Registers */
158 {0x00, 0x01, 0x0F, 0x00, 0x06},
161 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
162 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xE3,
166 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
169 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
170 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
173 static VGA_REGISTERS VideoMode_640x350_16color
=
175 /* Miscellaneous Register */
178 /* Sequencer Registers */
179 {0x00, 0x01, 0x0F, 0x00, 0x06},
182 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00,
183 0x00, 0x00, 0x00, 0x00, 0x83, 0x85, 0x5D, 0x28, 0x0F, 0x63, 0xBA, 0xE3,
187 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
190 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
191 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
194 static VGA_REGISTERS VideoMode_640x480_2color
=
196 /* Miscellaneous Register */
199 /* Sequencer Registers */
200 {0x00, 0x01, 0x0F, 0x00, 0x06},
203 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
204 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xC3,
208 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
211 // {0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
212 // 0x3F, 0x3F, 0x3F, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
213 {0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F,
214 0x00, 0x3F, 0x00, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
217 static VGA_REGISTERS VideoMode_640x480_16color
=
219 /* Miscellaneous Register */
222 /* Sequencer Registers */
223 {0x00, 0x01, 0x0F, 0x00, 0x06},
226 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
227 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3,
231 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
234 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
235 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
238 static VGA_REGISTERS VideoMode_320x200_256color
=
240 /* Miscellaneous Register */
243 /* Sequencer Registers */
244 {0x00, 0x01, 0x0F, 0x00, 0x0E},
247 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x41, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3,
252 {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF},
255 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
256 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00}
263 * Many people have different versions of those palettes
264 * (e.g. DOSBox, http://www.brokenthorn.com/Resources/OSDevVid2.html ,
265 * etc...) A choice should be made at some point.
268 // This is the same as EgaPalette__HiRes
269 static CONST COLORREF TextPalette
[VGA_MAX_COLORS
/ 4] =
271 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
272 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
273 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
274 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
276 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
277 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
278 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
279 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
282 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
283 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
284 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
285 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
287 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
288 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
289 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
290 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
293 // Unused at the moment
294 static CONST COLORREF mtext_palette
[64] =
296 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
297 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
298 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
299 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
300 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
301 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
302 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
303 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
305 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
306 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
307 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
308 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
309 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
310 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
311 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
312 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
315 // Unused at the moment
316 static CONST COLORREF mtext_s3_palette
[64] =
318 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
319 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
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(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
323 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
324 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
325 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
327 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
328 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
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(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
332 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
333 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
334 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
339 // Unused at the moment
340 static CONST COLORREF CgaPalette
[16] =
342 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
343 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
344 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
345 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
349 static CONST BYTE CgaPalette1
[] =
351 0x00, /* 0 - Black */
353 0x05, /* 2- Magenta */
354 0x07, /* 3 - White */
357 /* CGA palette 1 bright */
358 static CONST BYTE CgaPalette1i
[] =
360 0x00, /* 0 - Black */
361 0x13, /* 1 - Light cyan */
362 0x15, /* 2 - Light magenta */
363 0x17, /* 3 - Bright White */
367 static CONST BYTE CgaPalette2
[] =
369 0x00, /* 0 - Black */
370 0x02, /* 1 - Green */
372 0x06, /* 3 - Brown */
375 /* CGA palette 2 bright */
376 static CONST BYTE CgaPalette2i
[] =
378 0x00, /* 0 - Black */
379 0x12, /* 1 - Light green */
380 0x14, /* 2 - Light red */
381 0x16, /* 3 - Yellow */
384 // Unused at the moment; same palette as EgaPalette__16Colors
385 static CONST COLORREF CgaPalette2
[VGA_MAX_COLORS
/ 4] =
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 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
390 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
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 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
395 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
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 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
400 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
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 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
405 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
410 static CONST COLORREF EgaPalette__16Colors
[VGA_MAX_COLORS
/ 4] =
412 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
413 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
415 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
416 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
419 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
420 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
422 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
423 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
427 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
428 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
430 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
431 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
434 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
435 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
437 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
438 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
441 // This is the same as TextPalette
442 static CONST COLORREF EgaPalette__HiRes
[VGA_MAX_COLORS
/ 4] =
444 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
445 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
446 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
447 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
449 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
450 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
451 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
452 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
455 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
456 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
457 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
458 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
460 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
461 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
462 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
463 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
466 #define USE_REACTOS_COLORS
467 // #define USE_DOSBOX_COLORS
470 * Same palette as the default one 'VgaDefaultPalette' in vga.c
472 #if defined(USE_REACTOS_COLORS)
475 static CONST COLORREF VgaPalette
[VGA_MAX_COLORS
] =
477 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
478 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
479 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
480 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
481 RGB(0x00, 0x00, 0x00), RGB(0x10, 0x10, 0x10), RGB(0x20, 0x20, 0x20), RGB(0x35, 0x35, 0x35),
482 RGB(0x45, 0x45, 0x45), RGB(0x55, 0x55, 0x55), RGB(0x65, 0x65, 0x65), RGB(0x75, 0x75, 0x75),
483 RGB(0x8A, 0x8A, 0x8A), RGB(0x9A, 0x9A, 0x9A), RGB(0xAA, 0xAA, 0xAA), RGB(0xBA, 0xBA, 0xBA),
484 RGB(0xCA, 0xCA, 0xCA), RGB(0xDF, 0xDF, 0xDF), RGB(0xEF, 0xEF, 0xEF), RGB(0xFF, 0xFF, 0xFF),
485 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x82, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
486 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x82), RGB(0xFF, 0x00, 0x41),
487 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x82, 0x00), RGB(0xFF, 0xBE, 0x00),
488 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x82, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
489 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x82), RGB(0x00, 0xFF, 0xBE),
490 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x82, 0xFF), RGB(0x00, 0x41, 0xFF),
491 RGB(0x82, 0x82, 0xFF), RGB(0x9E, 0x82, 0xFF), RGB(0xBE, 0x82, 0xFF), RGB(0xDF, 0x82, 0xFF),
492 RGB(0xFF, 0x82, 0xFF), RGB(0xFF, 0x82, 0xDF), RGB(0xFF, 0x82, 0xBE), RGB(0xFF, 0x82, 0x9E),
493 RGB(0xFF, 0x82, 0x82), RGB(0xFF, 0x9E, 0x82), RGB(0xFF, 0xBE, 0x82), RGB(0xFF, 0xDF, 0x82),
494 RGB(0xFF, 0xFF, 0x82), RGB(0xDF, 0xFF, 0x82), RGB(0xBE, 0xFF, 0x82), RGB(0x9E, 0xFF, 0x82),
495 RGB(0x82, 0xFF, 0x82), RGB(0x82, 0xFF, 0x9E), RGB(0x82, 0xFF, 0xBE), RGB(0x82, 0xFF, 0xDF),
496 RGB(0x82, 0xFF, 0xFF), RGB(0x82, 0xDF, 0xFF), RGB(0x82, 0xBE, 0xFF), RGB(0x82, 0x9E, 0xFF),
497 RGB(0xBA, 0xBA, 0xFF), RGB(0xCA, 0xBA, 0xFF), RGB(0xDF, 0xBA, 0xFF), RGB(0xEF, 0xBA, 0xFF),
498 RGB(0xFF, 0xBA, 0xFF), RGB(0xFF, 0xBA, 0xEF), RGB(0xFF, 0xBA, 0xDF), RGB(0xFF, 0xBA, 0xCA),
499 RGB(0xFF, 0xBA, 0xBA), RGB(0xFF, 0xCA, 0xBA), RGB(0xFF, 0xDF, 0xBA), RGB(0xFF, 0xEF, 0xBA),
500 RGB(0xFF, 0xFF, 0xBA), RGB(0xEF, 0xFF, 0xBA), RGB(0xDF, 0xFF, 0xBA), RGB(0xCA, 0xFF, 0xBA),
501 RGB(0xBA, 0xFF, 0xBA), RGB(0xBA, 0xFF, 0xCA), RGB(0xBA, 0xFF, 0xDF), RGB(0xBA, 0xFF, 0xEF),
502 RGB(0xBA, 0xFF, 0xFF), RGB(0xBA, 0xEF, 0xFF), RGB(0xBA, 0xDF, 0xFF), RGB(0xBA, 0xCA, 0xFF),
503 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x39, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
504 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x39), RGB(0x71, 0x00, 0x1C),
505 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x39, 0x00), RGB(0x71, 0x55, 0x00),
506 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x39, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
507 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x39), RGB(0x00, 0x71, 0x55),
508 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x39, 0x71), RGB(0x00, 0x1C, 0x71),
509 RGB(0x39, 0x39, 0x71), RGB(0x45, 0x39, 0x71), RGB(0x55, 0x39, 0x71), RGB(0x61, 0x39, 0x71),
510 RGB(0x71, 0x39, 0x71), RGB(0x71, 0x39, 0x61), RGB(0x71, 0x39, 0x55), RGB(0x71, 0x39, 0x45),
511 RGB(0x71, 0x39, 0x39), RGB(0x71, 0x45, 0x39), RGB(0x71, 0x55, 0x39), RGB(0x71, 0x61, 0x39),
512 RGB(0x71, 0x71, 0x39), RGB(0x61, 0x71, 0x39), RGB(0x55, 0x71, 0x39), RGB(0x45, 0x71, 0x39),
513 RGB(0x39, 0x71, 0x39), RGB(0x39, 0x71, 0x45), RGB(0x39, 0x71, 0x55), RGB(0x39, 0x71, 0x61),
514 RGB(0x39, 0x71, 0x71), RGB(0x39, 0x61, 0x71), RGB(0x39, 0x55, 0x71), RGB(0x39, 0x45, 0x71),
515 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
516 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
517 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
518 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
519 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
520 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
521 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x31, 0x00, 0x41),
522 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x31), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
523 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x31, 0x00),
524 RGB(0x41, 0x41, 0x00), RGB(0x31, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
525 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x31),
526 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x31, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
527 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x31, 0x20, 0x41), RGB(0x39, 0x20, 0x41),
528 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x39), RGB(0x41, 0x20, 0x31), RGB(0x41, 0x20, 0x28),
529 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x31, 0x20), RGB(0x41, 0x39, 0x20),
530 RGB(0x41, 0x41, 0x20), RGB(0x39, 0x41, 0x20), RGB(0x31, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
531 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x31), RGB(0x20, 0x41, 0x39),
532 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x39, 0x41), RGB(0x20, 0x31, 0x41), RGB(0x20, 0x28, 0x41),
533 RGB(0x2D, 0x2D, 0x41), RGB(0x31, 0x2D, 0x41), RGB(0x35, 0x2D, 0x41), RGB(0x3D, 0x2D, 0x41),
534 RGB(0x41, 0x2D, 0x41), RGB(0x41, 0x2D, 0x3D), RGB(0x41, 0x2D, 0x35), RGB(0x41, 0x2D, 0x31),
535 RGB(0x41, 0x2D, 0x2D), RGB(0x41, 0x31, 0x2D), RGB(0x41, 0x35, 0x2D), RGB(0x41, 0x3D, 0x2D),
536 RGB(0x41, 0x41, 0x2D), RGB(0x3D, 0x41, 0x2D), RGB(0x35, 0x41, 0x2D), RGB(0x31, 0x41, 0x2D),
537 RGB(0x2D, 0x41, 0x2D), RGB(0x2D, 0x41, 0x31), RGB(0x2D, 0x41, 0x35), RGB(0x2D, 0x41, 0x3D),
538 RGB(0x2D, 0x41, 0x41), RGB(0x2D, 0x3D, 0x41), RGB(0x2D, 0x35, 0x41), RGB(0x2D, 0x31, 0x41),
539 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
540 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
543 #elif defined(USE_DOSBOX_COLORS)
546 static CONST COLORREF VgaPalette
[VGA_MAX_COLORS
] =
548 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
549 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
550 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
551 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
552 RGB(0x00, 0x00, 0x00), RGB(0x14, 0x14, 0x14), RGB(0x20, 0x20, 0x20), RGB(0x2C, 0x2C, 0x2C),
553 RGB(0x38, 0x38, 0x38), RGB(0x45, 0x45, 0x45), RGB(0x51, 0x51, 0x51), RGB(0x61, 0x61, 0x61),
554 RGB(0x71, 0x71, 0x71), RGB(0x82, 0x82, 0x82), RGB(0x92, 0x92, 0x92), RGB(0xA2, 0xA2, 0xA2),
555 RGB(0xB6, 0xB6, 0xB6), RGB(0xCB, 0xCB, 0xCB), RGB(0xE3, 0xE3, 0xE3), RGB(0xFF, 0xFF, 0xFF),
556 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x7D, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
557 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x7D), RGB(0xFF, 0x00, 0x41),
558 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x7D, 0x00), RGB(0xFF, 0xBE, 0x00),
559 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x7D, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
560 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x7D), RGB(0x00, 0xFF, 0xBE),
561 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x7D, 0xFF), RGB(0x00, 0x41, 0xFF),
562 RGB(0x7D, 0x7D, 0xFF), RGB(0x9E, 0x7D, 0xFF), RGB(0xBE, 0x7D, 0xFF), RGB(0xDF, 0x7D, 0xFF),
563 RGB(0xFF, 0x7D, 0xFF), RGB(0xFF, 0x7D, 0xDF), RGB(0xFF, 0x7D, 0xBE), RGB(0xFF, 0x7D, 0x9E),
565 RGB(0xFF, 0x7D, 0x7D), RGB(0xFF, 0x9E, 0x7D), RGB(0xFF, 0xBE, 0x7D), RGB(0xFF, 0xDF, 0x7D),
566 RGB(0xFF, 0xFF, 0x7D), RGB(0xDF, 0xFF, 0x7D), RGB(0xBE, 0xFF, 0x7D), RGB(0x9E, 0xFF, 0x7D),
567 RGB(0x7D, 0xFF, 0x7D), RGB(0x7D, 0xFF, 0x9E), RGB(0x7D, 0xFF, 0xBE), RGB(0x7D, 0xFF, 0xDF),
568 RGB(0x7D, 0xFF, 0xFF), RGB(0x7D, 0xDF, 0xFF), RGB(0x7D, 0xBE, 0xFF), RGB(0x7D, 0x9E, 0xFF),
569 RGB(0xB6, 0xB6, 0xFF), RGB(0xC7, 0xB6, 0xFF), RGB(0xDB, 0xB6, 0xFF), RGB(0xEB, 0xB6, 0xFF),
570 RGB(0xFF, 0xB6, 0xFF), RGB(0xFF, 0xB6, 0xEB), RGB(0xFF, 0xB6, 0xDB), RGB(0xFF, 0xB6, 0xC7),
571 RGB(0xFF, 0xB6, 0xB6), RGB(0xFF, 0xC7, 0xB6), RGB(0xFF, 0xDB, 0xB6), RGB(0xFF, 0xEB, 0xB6),
572 RGB(0xFF, 0xFF, 0xB6), RGB(0xEB, 0xFF, 0xB6), RGB(0xDB, 0xFF, 0xB6), RGB(0xC7, 0xFF, 0xB6),
573 RGB(0xB6, 0xFF, 0xB6), RGB(0xB6, 0xFF, 0xC7), RGB(0xB6, 0xFF, 0xDB), RGB(0xB6, 0xFF, 0xEB),
574 RGB(0xB6, 0xFF, 0xFF), RGB(0xB6, 0xEB, 0xFF), RGB(0xB6, 0xDB, 0xFF), RGB(0xB6, 0xC7, 0xFF),
575 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x38, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
576 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x38), RGB(0x71, 0x00, 0x1C),
577 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x38, 0x00), RGB(0x71, 0x55, 0x00),
578 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x38, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
579 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x38), RGB(0x00, 0x71, 0x55),
580 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x38, 0x71), RGB(0x00, 0x1C, 0x71),
582 RGB(0x38, 0x38, 0x71), RGB(0x45, 0x38, 0x71), RGB(0x55, 0x38, 0x71), RGB(0x61, 0x38, 0x71),
583 RGB(0x71, 0x38, 0x71), RGB(0x71, 0x38, 0x61), RGB(0x71, 0x38, 0x55), RGB(0x71, 0x38, 0x45),
584 RGB(0x71, 0x38, 0x38), RGB(0x71, 0x45, 0x38), RGB(0x71, 0x55, 0x38), RGB(0x71, 0x61, 0x38),
585 RGB(0x71, 0x71, 0x38), RGB(0x61, 0x71, 0x38), RGB(0x55, 0x71, 0x38), RGB(0x45, 0x71, 0x38),
586 RGB(0x38, 0x71, 0x38), RGB(0x38, 0x71, 0x45), RGB(0x38, 0x71, 0x55), RGB(0x38, 0x71, 0x61),
587 RGB(0x38, 0x71, 0x71), RGB(0x38, 0x61, 0x71), RGB(0x38, 0x55, 0x71), RGB(0x38, 0x45, 0x71),
588 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
589 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
590 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
591 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
592 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
593 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
594 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x30, 0x00, 0x41),
595 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x30), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
596 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x30, 0x00),
597 RGB(0x41, 0x41, 0x00), RGB(0x30, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
599 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x30),
600 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x30, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
601 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x30, 0x20, 0x41), RGB(0x38, 0x20, 0x41),
602 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x38), RGB(0x41, 0x20, 0x30), RGB(0x41, 0x20, 0x28),
603 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x30, 0x20), RGB(0x41, 0x38, 0x20),
604 RGB(0x41, 0x41, 0x20), RGB(0x38, 0x41, 0x20), RGB(0x30, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
605 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x30), RGB(0x20, 0x41, 0x38),
606 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x38, 0x41), RGB(0x20, 0x30, 0x41), RGB(0x20, 0x28, 0x41),
607 RGB(0x2C, 0x2C, 0x41), RGB(0x30, 0x2C, 0x41), RGB(0x34, 0x2C, 0x41), RGB(0x3C, 0x2C, 0x41),
608 RGB(0x41, 0x2C, 0x41), RGB(0x41, 0x2C, 0x3C), RGB(0x41, 0x2C, 0x34), RGB(0x41, 0x2C, 0x30),
609 RGB(0x41, 0x2C, 0x2C), RGB(0x41, 0x30, 0x2C), RGB(0x41, 0x34, 0x2C), RGB(0x41, 0x3C, 0x2C),
610 RGB(0x41, 0x41, 0x2C), RGB(0x3C, 0x41, 0x2C), RGB(0x34, 0x41, 0x2C), RGB(0x30, 0x41, 0x2C),
611 RGB(0x2C, 0x41, 0x2C), RGB(0x2C, 0x41, 0x30), RGB(0x2C, 0x41, 0x34), RGB(0x2C, 0x41, 0x3C),
612 RGB(0x2C, 0x41, 0x41), RGB(0x2C, 0x3C, 0x41), RGB(0x2C, 0x34, 0x41), RGB(0x2C, 0x30, 0x41),
613 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
614 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
619 static CONST UCHAR Font8x8
[VGA_FONT_CHARACTERS
* 8] =
621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
622 0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E,
623 0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E,
624 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
625 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,
626 0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x92, 0x10, 0x7C,
627 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C,
628 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00,
629 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF,
630 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
631 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF,
632 0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78,
633 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18,
634 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0,
635 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0,
636 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99,
637 0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00,
638 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00,
639 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18,
640 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00,
641 0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00,
642 0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0x86, 0xFC,
643 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00,
644 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF,
645 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00,
646 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00,
647 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00,
648 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
649 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00,
650 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
651 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00,
652 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00,
653 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
654 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00,
655 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
656 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
657 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00,
658 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00,
659 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00,
660 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
661 0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00,
662 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00,
663 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
664 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
665 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30,
666 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
667 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
668 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
669 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00,
670 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00,
671 0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00,
672 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00,
673 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00,
674 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00,
675 0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00,
676 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00,
677 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00,
678 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00,
679 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
680 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
681 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00,
682 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00,
683 0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00,
684 0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00,
685 0x7C, 0xC6, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00,
686 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00,
687 0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00,
688 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00,
689 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00,
690 0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
691 0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00,
692 0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00,
693 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00,
694 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
695 0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
696 0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00,
697 0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00,
698 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
699 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00,
700 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
701 0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,
702 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x0E, 0x00,
703 0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00,
704 0x7C, 0xC6, 0xE0, 0x78, 0x0E, 0xC6, 0x7C, 0x00,
705 0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
706 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00,
707 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
708 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
709 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00,
710 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00,
711 0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00,
712 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00,
713 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00,
714 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00,
715 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
716 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
717 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
718 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
719 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00,
720 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00,
721 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00,
722 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
723 0x38, 0x6C, 0x64, 0xF0, 0x60, 0x60, 0xF0, 0x00,
724 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
725 0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00,
726 0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
727 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78,
728 0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
729 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
730 0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xD6, 0x00,
731 0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
732 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
733 0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0,
734 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
735 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0xF0, 0x00,
736 0x00, 0x00, 0x7C, 0xC0, 0x70, 0x1C, 0xF8, 0x00,
737 0x10, 0x30, 0xFC, 0x30, 0x30, 0x34, 0x18, 0x00,
738 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
739 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
740 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
741 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00,
742 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
743 0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00,
744 0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00,
745 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00,
746 0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00,
747 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
748 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00,
749 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x0C, 0x06, 0x7C,
750 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
751 0x1C, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
752 0x7E, 0x81, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0x00,
753 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
754 0xE0, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
755 0x30, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
756 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x78, 0x0C, 0x38,
757 0x7E, 0x81, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00,
758 0xCC, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
759 0xE0, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
760 0xCC, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
761 0x7C, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
762 0xE0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
763 0xC6, 0x10, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
764 0x30, 0x30, 0x00, 0x78, 0xCC, 0xFC, 0xCC, 0x00,
765 0x1C, 0x00, 0xFC, 0x60, 0x78, 0x60, 0xFC, 0x00,
766 0x00, 0x00, 0x7F, 0x0C, 0x7F, 0xCC, 0x7F, 0x00,
767 0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00,
768 0x78, 0x84, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
769 0x00, 0xCC, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
770 0x00, 0xE0, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
771 0x78, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
772 0x00, 0xE0, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
773 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
774 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00,
775 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
776 0x18, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x18,
777 0x38, 0x6C, 0x64, 0xF0, 0x60, 0xE6, 0xFC, 0x00,
778 0xCC, 0xCC, 0x78, 0x30, 0xFC, 0x30, 0xFC, 0x30,
779 0xF8, 0xCC, 0xCC, 0xFA, 0xC6, 0xCF, 0xC6, 0xC3,
780 0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0xD8, 0x70,
781 0x1C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
782 0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
783 0x00, 0x1C, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
784 0x00, 0x1C, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
785 0x00, 0xF8, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0x00,
786 0xFC, 0x00, 0xCC, 0xEC, 0xFC, 0xDC, 0xCC, 0x00,
787 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00,
788 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00,
789 0x18, 0x00, 0x18, 0x18, 0x30, 0x66, 0x3C, 0x00,
790 0x00, 0x00, 0x00, 0xFC, 0xC0, 0xC0, 0x00, 0x00,
791 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x0C, 0x00, 0x00,
792 0xC6, 0xCC, 0xD8, 0x36, 0x6B, 0xC2, 0x84, 0x0F,
793 0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6D, 0xCF, 0x03,
794 0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00,
795 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
796 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00,
797 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
798 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
799 0xDB, 0xF6, 0xDB, 0x6F, 0xDB, 0x7E, 0xD7, 0xED,
800 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
801 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18,
802 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
803 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36,
804 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36,
805 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
806 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36,
807 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
808 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36,
809 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00,
810 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00,
811 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00,
812 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18,
813 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00,
814 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
815 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18,
816 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
817 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
818 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18,
819 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
820 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36,
821 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00,
822 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36,
823 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00,
824 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36,
825 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36,
826 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
827 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36,
828 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
829 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00,
830 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18,
831 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36,
832 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00,
833 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00,
834 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
835 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36,
836 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36,
837 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18,
838 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00,
839 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18,
840 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
841 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
842 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
843 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
844 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
845 0x00, 0x00, 0x76, 0xDC, 0xC8, 0xDC, 0x76, 0x00,
846 0x00, 0x78, 0xCC, 0xF8, 0xCC, 0xF8, 0xC0, 0xC0,
847 0x00, 0xFC, 0xCC, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
848 0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x00,
849 0xFC, 0xCC, 0x60, 0x30, 0x60, 0xCC, 0xFC, 0x00,
850 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0x70, 0x00,
851 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
852 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00,
853 0xFC, 0x30, 0x78, 0xCC, 0xCC, 0x78, 0x30, 0xFC,
854 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x6C, 0x38, 0x00,
855 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x6C, 0xEE, 0x00,
856 0x1C, 0x30, 0x18, 0x7C, 0xCC, 0xCC, 0x78, 0x00,
857 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00,
858 0x06, 0x0C, 0x7E, 0xDB, 0xDB, 0x7E, 0x60, 0xC0,
859 0x38, 0x60, 0xC0, 0xF8, 0xC0, 0x60, 0x38, 0x00,
860 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
861 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00,
862 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00,
863 0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xFC, 0x00,
864 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xFC, 0x00,
865 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18,
866 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70,
867 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00,
868 0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00,
869 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
870 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
871 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
872 0x0F, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C,
873 0x58, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00,
874 0x70, 0x98, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00,
875 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00,
876 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
879 static CONST UCHAR Font8x14
[VGA_FONT_CHARACTERS
* 14] =
881 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
882 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
883 0x00, 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81,
884 0x81, 0xBD, 0x99, 0x81, 0x7E, 0x00, 0x00,
885 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xDB, 0xFF,
886 0xFF, 0xC3, 0xE7, 0xFF, 0x7E, 0x00, 0x00,
887 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE,
888 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00,
889 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C,
890 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00,
891 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0xE7,
892 0xE7, 0xE7, 0x18, 0x18, 0x3C, 0x00, 0x00,
893 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF,
894 0xFF, 0x7E, 0x18, 0x18, 0x3C, 0x00, 0x00,
895 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
896 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
897 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7,
898 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF,
899 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66,
900 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00,
901 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99,
902 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF,
903 0x00, 0x00, 0x00, 0x1E, 0x0E, 0x1A, 0x32,
904 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00,
905 0x00, 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66,
906 0x3C, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
907 0x00, 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30,
908 0x30, 0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00,
909 0x00, 0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63,
910 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00,
911 0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C,
912 0xE7, 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00,
913 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF8,
914 0xFE, 0xF8, 0xE0, 0xC0, 0x80, 0x00, 0x00,
915 0x00, 0x00, 0x00, 0x02, 0x06, 0x0E, 0x3E,
916 0xFE, 0x3E, 0x0E, 0x06, 0x02, 0x00, 0x00,
917 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
918 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
919 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
920 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00,
921 0x00, 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB,
922 0x7B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00,
923 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6,
924 0x6C, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00,
925 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
926 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE,
927 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
928 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00,
929 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
930 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
931 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
932 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
933 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C,
934 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00,
935 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60,
936 0xFE, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00,
937 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
938 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00,
939 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6C,
940 0xFE, 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00,
941 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
942 0x7C, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00,
943 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C,
944 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00,
945 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
946 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
947 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C,
948 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00,
949 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00,
950 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
951 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C,
952 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00,
953 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0,
954 0x7C, 0x06, 0x86, 0xC6, 0x7C, 0x18, 0x18,
955 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6,
956 0x0C, 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00,
957 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
958 0x76, 0xDC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
959 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30,
960 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30,
962 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00,
963 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C,
964 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00,
965 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C,
966 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00,
967 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
968 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
969 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
970 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
971 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
972 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
973 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
974 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
975 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
976 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
977 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
978 0xD6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00,
979 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18,
980 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00,
981 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C,
982 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00,
983 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06,
984 0x3C, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00,
985 0x00, 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C,
986 0xCC, 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
987 0x00, 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0,
988 0xFC, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00,
989 0x00, 0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0,
990 0xFC, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
991 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C,
992 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00,
993 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
994 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
995 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
996 0x7E, 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00,
997 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
998 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
999 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1000 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
1001 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60,
1002 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00,
1003 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1004 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1005 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C,
1006 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00,
1007 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C,
1008 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00,
1009 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE,
1010 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00,
1011 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6,
1012 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1013 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1014 0x7C, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00,
1015 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1016 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00,
1017 0x00, 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66,
1018 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00,
1019 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68,
1020 0x78, 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00,
1021 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68,
1022 0x78, 0x68, 0x60, 0x60, 0xF0, 0x00, 0x00,
1023 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1024 0xC0, 0xDE, 0xC6, 0x66, 0x3A, 0x00, 0x00,
1025 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1026 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1027 0x00, 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18,
1028 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1029 0x00, 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C,
1030 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1031 0x00, 0x00, 0x00, 0xE6, 0x66, 0x6C, 0x6C,
1032 0x78, 0x6C, 0x6C, 0x66, 0xE6, 0x00, 0x00,
1033 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60,
1034 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00,
1035 0x00, 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xD6,
1036 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1037 0x00, 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE,
1038 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1039 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1040 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1041 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1042 0x7C, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00,
1043 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1044 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x0E, 0x00,
1045 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1046 0x7C, 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00,
1047 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60,
1048 0x38, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1049 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x5A, 0x18,
1050 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1051 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1052 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1053 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1054 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00,
1055 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1056 0xD6, 0xD6, 0xFE, 0x6C, 0x6C, 0x00, 0x00,
1057 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7C,
1058 0x38, 0x7C, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1059 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1060 0x3C, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1061 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x8C, 0x18,
1062 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00,
1063 0x00, 0x00, 0x00, 0x3C, 0x30, 0x30, 0x30,
1064 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00,
1065 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70,
1066 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00,
1067 0x00, 0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C,
1068 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x00,
1069 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
1070 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1071 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1072 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1073 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1074 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1075 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
1076 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1077 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x78,
1078 0x6C, 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00,
1079 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1080 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1081 0x00, 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C,
1082 0x6C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1083 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1084 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1085 0x00, 0x00, 0x00, 0x1C, 0x36, 0x32, 0x30,
1086 0x7C, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00,
1087 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1088 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x78,
1089 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C,
1090 0x76, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00,
1091 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x38,
1092 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1093 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E,
1094 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C,
1095 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66,
1096 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00,
1097 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18,
1098 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1099 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC,
1100 0xFE, 0xD6, 0xD6, 0xD6, 0xD6, 0x00, 0x00,
1101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1102 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00,
1103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1104 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1106 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xF0,
1107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1108 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
1109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1110 0x76, 0x66, 0x60, 0x60, 0xF0, 0x00, 0x00,
1111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1112 0xC6, 0x70, 0x1C, 0xC6, 0x7C, 0x00, 0x00,
1113 0x00, 0x00, 0x00, 0x10, 0x30, 0x30, 0xFC,
1114 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00,
1115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC,
1116 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1118 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00,
1119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1120 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00,
1121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1122 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00,
1123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1124 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
1125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1126 0xCC, 0x18, 0x30, 0x66, 0xFE, 0x00, 0x00,
1127 0x00, 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18,
1128 0x70, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00,
1129 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1130 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
1131 0x00, 0x00, 0x00, 0x70, 0x18, 0x18, 0x18,
1132 0x0E, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00,
1133 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1136 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00, 0x00,
1137 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1138 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x18, 0x70,
1139 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0xCC,
1140 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1141 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x7C,
1142 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1143 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x78,
1144 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1145 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x78,
1146 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1147 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 0x78,
1148 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1149 0x00, 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78,
1150 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1152 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x18, 0x70,
1153 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C,
1154 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1155 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x7C,
1156 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1157 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C,
1158 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1159 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x38,
1160 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1161 0x00, 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38,
1162 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1163 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x38,
1164 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1165 0x00, 0xC6, 0x00, 0x10, 0x38, 0x6C, 0xC6,
1166 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1167 0x38, 0x6C, 0x38, 0x10, 0x38, 0x6C, 0xC6,
1168 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1169 0x0C, 0x18, 0x00, 0xFE, 0x66, 0x62, 0x68,
1170 0x78, 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00,
1171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC,
1172 0x36, 0x76, 0xDC, 0xD8, 0x6E, 0x00, 0x00,
1173 0x00, 0x00, 0x00, 0x3E, 0x6C, 0xCC, 0xCC,
1174 0xFE, 0xCC, 0xCC, 0xCC, 0xCE, 0x00, 0x00,
1175 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C,
1176 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1177 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x7C,
1178 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1179 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C,
1180 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1181 0x00, 0x00, 0x30, 0x78, 0xCC, 0x00, 0xCC,
1182 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1183 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 0xCC,
1184 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1185 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0xC6,
1186 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
1187 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1188 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1189 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1190 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1191 0x00, 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6,
1192 0xC0, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
1193 0x00, 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60,
1194 0xF0, 0x60, 0x60, 0x66, 0xFC, 0x00, 0x00,
1195 0x00, 0x00, 0x00, 0x66, 0x66, 0x3C, 0x18,
1196 0x7E, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
1197 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x7C,
1198 0x62, 0x66, 0x6F, 0x66, 0xF3, 0x00, 0x00,
1199 0x00, 0x00, 0x00, 0x0E, 0x1B, 0x18, 0x18,
1200 0x7E, 0x18, 0x18, 0xD8, 0x70, 0x00, 0x00,
1201 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78,
1202 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1203 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x38,
1204 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1205 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x7C,
1206 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1207 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0xCC,
1208 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1209 0x00, 0x00, 0x00, 0x76, 0xDC, 0x00, 0xDC,
1210 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00,
1211 0x76, 0xDC, 0x00, 0xC6, 0xE6, 0xF6, 0xFE,
1212 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1213 0x00, 0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x36,
1214 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1215 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
1216 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
1217 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30,
1218 0x30, 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1220 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
1221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1222 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00,
1223 0x00, 0x60, 0xE0, 0x63, 0x66, 0x6C, 0x18,
1224 0x30, 0x6E, 0xC3, 0x06, 0x0C, 0x1F, 0x00,
1225 0x00, 0x60, 0xE0, 0x63, 0x66, 0x6C, 0x18,
1226 0x36, 0x6E, 0xDA, 0x3F, 0x06, 0x06, 0x00,
1227 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18,
1228 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00,
1229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1230 0x36, 0x6C, 0xD8, 0x6C, 0x36, 0x00, 0x00,
1231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1232 0xD8, 0x6C, 0x36, 0x6C, 0xD8, 0x00, 0x00,
1233 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11,
1234 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1235 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1236 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
1237 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD,
1238 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1239 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1240 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1241 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1242 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1243 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18,
1244 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1245 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1246 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1248 0xFE, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1249 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18,
1250 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1251 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06,
1252 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1253 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1254 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1255 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06,
1256 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1257 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06,
1258 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1259 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1260 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1261 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18,
1262 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1264 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1265 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1266 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1267 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1268 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1270 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1271 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1272 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1274 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1275 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1276 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1277 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18,
1278 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1279 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1280 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1281 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30,
1282 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1283 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30,
1284 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1285 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00,
1286 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1287 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1288 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1289 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30,
1290 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1291 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1292 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1293 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00,
1294 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1295 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00,
1296 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1297 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1298 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1299 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1300 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1302 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1303 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1304 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1305 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18,
1306 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1307 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18,
1308 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1310 0x3F, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1311 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1312 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1313 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18,
1314 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1315 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1316 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1318 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1319 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1320 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1322 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1323 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1324 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1325 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1326 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1327 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1330 0xDC, 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00,
1331 0x00, 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8,
1332 0xCC, 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00,
1333 0x00, 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC0,
1334 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00,
1335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1336 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00,
1337 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x60, 0x30,
1338 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00,
1339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1340 0xD8, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00,
1341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66,
1342 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
1343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1344 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
1345 0x00, 0x00, 0x00, 0x7E, 0x18, 0x3C, 0x66,
1346 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00,
1347 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1348 0xFE, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00,
1349 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1350 0xC6, 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00,
1351 0x00, 0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C,
1352 0x3E, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00,
1353 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB,
1354 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1355 0x00, 0x00, 0x00, 0x03, 0x06, 0x7E, 0xDB,
1356 0xDB, 0xF3, 0x7E, 0x60, 0xC0, 0x00, 0x00,
1357 0x00, 0x00, 0x00, 0x1E, 0x30, 0x60, 0x60,
1358 0x7E, 0x60, 0x60, 0x30, 0x1E, 0x00, 0x00,
1359 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1360 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
1361 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
1362 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
1363 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1364 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
1365 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06,
1366 0x0C, 0x18, 0x30, 0x00, 0x7E, 0x00, 0x00,
1367 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60,
1368 0x30, 0x18, 0x0C, 0x00, 0x7E, 0x00, 0x00,
1369 0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18,
1370 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1371 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1372 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00,
1373 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
1374 0x7E, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
1375 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1376 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1377 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
1378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1380 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1382 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1383 0x00, 0x00, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C,
1384 0x0C, 0xEC, 0x6C, 0x3C, 0x1C, 0x00, 0x00,
1385 0x00, 0x00, 0x00, 0x6C, 0x36, 0x36, 0x36,
1386 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
1387 0x00, 0x00, 0x00, 0x3C, 0x66, 0x0C, 0x18,
1388 0x32, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1389 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E,
1390 0x7E, 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00,
1391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1395 static CONST UCHAR Font8x16
[VGA_FONT_CHARACTERS
* 16] =
1397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1399 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD,
1400 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00,
1401 0x00, 0x00, 0x7C, 0xFE, 0xFE, 0xD6, 0xFE, 0xFE,
1402 0xBA, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00,
1403 0x00, 0x00, 0x00, 0x6C, 0xEE, 0xFE, 0xFE, 0xFE,
1404 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1405 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C,
1406 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1407 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x10, 0x6C,
1408 0xEE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
1409 0x00, 0x00, 0x10, 0x38, 0x7C, 0x7C, 0xFE, 0xFE,
1410 0xFE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
1411 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C,
1412 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1413 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3,
1414 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1415 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x66, 0x66,
1416 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1417 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0x99, 0x99,
1418 0x99, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1419 0x00, 0x00, 0x1E, 0x0E, 0x1E, 0x36, 0x78, 0xCC,
1420 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1421 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18,
1422 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1423 0x00, 0x00, 0x1E, 0x1A, 0x1E, 0x18, 0x18, 0x18,
1424 0x18, 0x78, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00,
1425 0x00, 0x00, 0x3E, 0x36, 0x3E, 0x36, 0x36, 0x76,
1426 0xF6, 0x66, 0x0E, 0x1E, 0x0C, 0x00, 0x00, 0x00,
1427 0x00, 0x00, 0x18, 0xDB, 0x7E, 0x3C, 0x66, 0x66,
1428 0x3C, 0x7E, 0xDB, 0x18, 0x00, 0x00, 0x00, 0x00,
1429 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xFE,
1430 0xFC, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00,
1431 0x00, 0x00, 0x00, 0x02, 0x0E, 0x3E, 0x7E, 0xFE,
1432 0x7E, 0x3E, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00,
1433 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1434 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1435 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
1436 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1437 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0xDB, 0x7B,
1438 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00,
1439 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x7C, 0xF6,
1440 0xDE, 0x7C, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1441 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1442 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00,
1443 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1444 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1445 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1446 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1447 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1448 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1449 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0xFF,
1450 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1451 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xFE,
1452 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1453 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
1454 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1455 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF,
1456 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1457 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x7C,
1458 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1459 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x7C,
1460 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1463 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x3C, 0x18,
1464 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1465 0x00, 0x36, 0x36, 0x36, 0x36, 0x14, 0x00, 0x00,
1466 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1467 0x00, 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C,
1468 0xFE, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1469 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0x78,
1470 0x3C, 0x06, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
1471 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x66, 0x0C,
1472 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00, 0x00, 0x00,
1473 0x00, 0x00, 0x38, 0x6C, 0x38, 0x30, 0x76, 0x7E,
1474 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1475 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1476 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1477 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30,
1478 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1479 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C,
1480 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1481 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x38, 0xFE,
1482 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1483 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E,
1484 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1485 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1486 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1487 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1488 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1490 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1491 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
1492 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
1493 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xCE, 0xDE, 0xF6,
1494 0xE6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1495 0x00, 0x00, 0x18, 0x78, 0x18, 0x18, 0x18, 0x18,
1496 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1497 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x06, 0x0C, 0x18,
1498 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1499 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06,
1500 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1501 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xCC,
1502 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00,
1503 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06,
1504 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1505 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xFC, 0xC6,
1506 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1507 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C, 0x18, 0x30,
1508 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
1509 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6,
1510 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1511 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E,
1512 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1513 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1514 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1515 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1516 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1517 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0xC0,
1518 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1519 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
1520 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1521 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06,
1522 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
1523 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18,
1524 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1525 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xDE, 0xDE,
1526 0xDE, 0xDC, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00,
1527 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE,
1528 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1529 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66,
1530 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1531 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0,
1532 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1533 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66,
1534 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,
1535 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1536 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1537 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1538 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1539 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0,
1540 0xCE, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1541 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6,
1542 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1543 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1544 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1545 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1546 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1547 0x00, 0x00, 0xC6, 0xC6, 0xCC, 0xD8, 0xF0, 0xF0,
1548 0xD8, 0xCC, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1549 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60,
1550 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1551 0x00, 0x00, 0xC6, 0xC6, 0xEE, 0xEE, 0xFE, 0xD6,
1552 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1553 0x00, 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xF6, 0xDE,
1554 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1555 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1556 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1557 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x66, 0x7C,
1558 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1559 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1560 0xC6, 0xD6, 0xD6, 0x7C, 0x06, 0x00, 0x00, 0x00,
1561 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x78,
1562 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1563 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0x70, 0x1C,
1564 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1565 0x00, 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18,
1566 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1567 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1568 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1569 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1570 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1571 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6,
1572 0xFE, 0xEE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1573 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x38,
1574 0x6C, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1575 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C,
1576 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1577 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30,
1578 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1579 0x00, 0x00, 0x7C, 0x60, 0x60, 0x60, 0x60, 0x60,
1580 0x60, 0x60, 0x60, 0x7C, 0x00, 0x00, 0x00, 0x00,
1581 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30,
1582 0x18, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1583 0x00, 0x00, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
1584 0x0C, 0x0C, 0x0C, 0x7C, 0x00, 0x00, 0x00, 0x00,
1585 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00,
1586 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1587 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1588 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
1589 0x00, 0x18, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x00,
1590 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1591 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1592 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1593 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1594 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1595 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1596 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1597 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC,
1598 0xCC, 0xCC, 0xCC, 0x7E, 0x00, 0x00, 0x00, 0x00,
1599 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1600 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1601 0x00, 0x00, 0x1C, 0x36, 0x30, 0x30, 0xFC, 0x30,
1602 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00,
1603 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCE, 0xC6,
1604 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1605 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1606 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1607 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18,
1608 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1609 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x0C,
1610 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1611 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x66, 0x6C,
1612 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1613 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1614 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00,
1615 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xD6,
1616 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1617 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1618 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1619 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1620 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1621 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1622 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x00,
1623 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC,
1624 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
1625 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x60,
1626 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1627 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1628 0x7C, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1629 0x00, 0x00, 0x30, 0x30, 0x30, 0xFC, 0x30, 0x30,
1630 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,
1631 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC,
1632 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1633 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1634 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1635 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6,
1636 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00,
1637 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x6C,
1638 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1639 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1640 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1641 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x86, 0x0C,
1642 0x18, 0x30, 0x62, 0xFE, 0x00, 0x00, 0x00, 0x00,
1643 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18,
1644 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00,
1645 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
1646 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1647 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18,
1648 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
1649 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1650 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1651 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
1652 0x6C, 0x6C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1653 0x00, 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0xC6,
1654 0x66, 0x3C, 0x18, 0x0C, 0xCC, 0x38, 0x00, 0x00,
1655 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1656 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1657 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1658 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1659 0x00, 0x30, 0x78, 0xCC, 0x00, 0x78, 0x0C, 0x7C,
1660 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1661 0x00, 0x00, 0xCC, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1662 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1663 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C,
1664 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1665 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78, 0x0C, 0x7C,
1666 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1667 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0,
1668 0xC6, 0x7C, 0x18, 0x0C, 0x6C, 0x38, 0x00, 0x00,
1669 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1670 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1671 0x00, 0x00, 0xCC, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1672 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1673 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1674 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1675 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
1676 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1677 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18,
1678 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1679 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18,
1680 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1681 0x00, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6,
1682 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1683 0x38, 0x6C, 0x38, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1684 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1685 0x0C, 0x18, 0x30, 0x00, 0xFE, 0x60, 0x60, 0x7C,
1686 0x60, 0x60, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00,
1687 0x00, 0x00, 0x00, 0x00, 0x66, 0xDB, 0x1B, 0x7F,
1688 0xD8, 0xD8, 0xDF, 0x76, 0x00, 0x00, 0x00, 0x00,
1689 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xD8, 0xFE,
1690 0xD8, 0xD8, 0xD8, 0xDE, 0x00, 0x00, 0x00, 0x00,
1691 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1692 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1693 0x00, 0x00, 0xC6, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1694 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1695 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1696 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1697 0x00, 0x30, 0x78, 0xCC, 0x00, 0xC6, 0xC6, 0xC6,
1698 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1699 0x00, 0x60, 0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6,
1700 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1701 0x00, 0x18, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18,
1702 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1703 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6,
1704 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1705 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1706 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1707 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0xC0,
1708 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1709 0x00, 0x38, 0x6C, 0x60, 0x60, 0xF0, 0x60, 0x60,
1710 0x60, 0x66, 0xF6, 0x6C, 0x00, 0x00, 0x00, 0x00,
1711 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E,
1712 0x18, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1713 0x00, 0x00, 0x3E, 0x63, 0x63, 0x30, 0x1C, 0x06,
1714 0x63, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1715 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x63, 0x38,
1716 0x0E, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1717 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78, 0x0C, 0x7C,
1718 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1719 0x00, 0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18,
1720 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1721 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1722 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1723 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC,
1724 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1725 0x00, 0x00, 0x76, 0xDC, 0x00, 0xBC, 0x66, 0x66,
1726 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1727 0x00, 0x76, 0xDC, 0x00, 0xC6, 0xC6, 0xE6, 0xF6,
1728 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1729 0x00, 0x21, 0x1E, 0x00, 0x1E, 0x33, 0x60, 0x60,
1730 0x67, 0x63, 0x33, 0x1D, 0x00, 0x00, 0x00, 0x00,
1731 0x00, 0x42, 0x3C, 0x00, 0x3B, 0x66, 0x66, 0x66,
1732 0x3E, 0x06, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1733 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30,
1734 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1735 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1736 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
1737 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1738 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
1739 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x30,
1740 0x60, 0xDC, 0x36, 0x0C, 0x18, 0x3E, 0x00, 0x00,
1741 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x36,
1742 0x6E, 0xDE, 0x36, 0x7E, 0x06, 0x06, 0x00, 0x00,
1743 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x3C,
1744 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1745 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6C, 0xD8,
1746 0x6C, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1747 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x6C, 0x36,
1748 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1749 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1750 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1751 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1752 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1753 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1754 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1755 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1756 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1757 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1758 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1759 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1760 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1761 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6,
1762 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1763 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1764 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1765 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8,
1766 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1767 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xF6,
1768 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1769 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1770 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1771 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6,
1772 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1773 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xFE,
1774 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1775 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE,
1776 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1777 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1778 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1779 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
1780 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1781 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1783 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1784 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1786 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1787 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1788 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1790 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1791 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1792 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1793 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1794 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1795 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
1796 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1797 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3F,
1798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1799 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37,
1800 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1801 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF,
1802 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1803 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7,
1804 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1805 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37,
1806 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1807 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1808 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1809 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7,
1810 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1811 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF,
1812 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1813 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1814 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1815 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1816 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1818 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1819 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F,
1820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1821 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1822 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1823 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F,
1824 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1825 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
1826 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1827 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1828 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1829 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF,
1830 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1831 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1832 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1833 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
1834 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1835 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1836 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1838 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1839 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1840 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1841 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1842 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1843 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1845 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0xD8, 0xD8,
1846 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1847 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8, 0xFC, 0xC6,
1848 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00, 0x00, 0x00,
1849 0x00, 0x00, 0xFE, 0x66, 0x62, 0x60, 0x60, 0x60,
1850 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00,
1851 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x6C, 0x6C,
1852 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1853 0x00, 0x00, 0xFE, 0xC6, 0x62, 0x30, 0x18, 0x18,
1854 0x30, 0x62, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1855 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xCC,
1856 0xCC, 0xCC, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1857 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1858 0x66, 0x7C, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
1859 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18,
1860 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1861 0x00, 0x00, 0xFE, 0x38, 0x38, 0x6C, 0xC6, 0xC6,
1862 0x6C, 0x38, 0x38, 0xFE, 0x00, 0x00, 0x00, 0x00,
1863 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE,
1864 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
1865 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6,
1866 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00, 0x00, 0x00,
1867 0x00, 0x00, 0x3E, 0x60, 0x60, 0x3C, 0x66, 0xC6,
1868 0xC6, 0xC6, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1869 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB,
1870 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1871 0x00, 0x00, 0x02, 0x06, 0x7C, 0xCE, 0xDE, 0xF6,
1872 0xF6, 0x7C, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00,
1873 0x00, 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C,
1874 0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00,
1875 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1876 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1877 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE,
1878 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1879 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1880 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1881 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18,
1882 0x30, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1883 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18,
1884 0x0C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1885 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1E, 0x1A, 0x18,
1886 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1887 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1888 0x18, 0x18, 0x58, 0x78, 0x30, 0x00, 0x00, 0x00,
1889 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E,
1890 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1891 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1892 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1893 0x00, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1894 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1895 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1896 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1897 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1898 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1899 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18,
1900 0xD8, 0xD8, 0x78, 0x38, 0x18, 0x00, 0x00, 0x00,
1901 0x00, 0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
1902 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1903 0x00, 0x00, 0x70, 0xD8, 0x18, 0x30, 0x60, 0xF8,
1904 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1905 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E,
1906 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1907 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1908 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1913 * Table of supported Video Modes.
1915 * See http://wiki.osdev.org/Drawing_In_Protected_Mode#Locating_Video_Memory
1916 * Values of PageSize taken from DOSBox.
1919 typedef struct _VGA_MODE
1921 PVGA_REGISTERS VgaRegisters
;
1923 WORD CharacterHeight
;
1924 // PCOLORREF Palette;
1925 } VGA_MODE
, *PVGA_MODE
;
1927 static CONST VGA_MODE VideoModes
[BIOS_MAX_VIDEO_MODE
+ 1] =
1929 {&VideoMode_40x25_text
, 0x0800, 16}, /* Mode 00h - 16 color (mono) */
1930 {&VideoMode_40x25_text
, 0x0800, 16}, /* Mode 01h - 16 color */
1931 {&VideoMode_80x25_text
, 0x1000, 16}, /* Mode 02h - 16 color (mono) */
1932 {&VideoMode_80x25_text
, 0x1000, 16}, /* Mode 03h - 16 color */
1933 {&VideoMode_320x200_4color
, 0x4000, 8}, /* Mode 04h - CGA 4 color */
1934 {&VideoMode_320x200_4color
, 0x4000, 8}, /* Mode 05h - CGA same (m) (uses 3rd CGA palette) */
1935 {&VideoMode_640x200_2color
, 0x4000, 8}, /* Mode 06h - CGA 640*200 2 color */
1936 {NULL
, 0x1000, 0}, /* Mode 07h - MDA monochrome text 80*25 */
1937 {NULL
, 0x0000, 0}, /* Mode 08h - PCjr */
1938 {NULL
, 0x0000, 0}, /* Mode 09h - PCjr */
1939 {NULL
, 0x0000, 0}, /* Mode 0Ah - PCjr */
1940 {NULL
, 0x0000, 0}, /* Mode 0Bh - Reserved */
1941 {NULL
, 0x0000, 0}, /* Mode 0Ch - Reserved */
1942 {&VideoMode_320x200_16color
, 0x2000, 8}, /* Mode 0Dh - EGA 320*200 16 color */
1943 {&VideoMode_640x200_16color
, 0x4000, 8}, /* Mode 0Eh - EGA 640*200 16 color */
1944 {NULL
, 0x8000, 0}, /* Mode 0Fh - EGA 640*350 mono */
1945 {&VideoMode_640x350_16color
, 0x8000, 14}, /* Mode 10h - EGA 640*350 HiRes 16 color */
1946 {&VideoMode_640x480_2color
, 0xA000, 16}, /* Mode 11h - VGA 640*480 mono */
1947 {&VideoMode_640x480_16color
, 0xA000, 16}, /* Mode 12h - VGA */
1948 {&VideoMode_320x200_256color
, 0x2000, 8}, /* Mode 13h - VGA */
1952 static PVGA_STATIC_FUNC_TABLE VgaStaticFuncTable
;
1954 /* PRIVATE FUNCTIONS **********************************************************/
1956 static BOOLEAN
VidBiosScrollWindow(SCROLL_DIRECTION Direction
,
1958 SMALL_RECT Rectangle
,
1963 DWORD VideoAddress
= TO_LINEAR(TEXT_VIDEO_SEG
, Page
* Bda
->VideoPageSize
);
1964 WORD FillCharacter
= MAKEWORD(' ', FillAttribute
);
1966 WORD WindowWidth
, WindowHeight
;
1968 /* Fixup the rectangle if needed */
1969 Rectangle
.Left
= min(max(Rectangle
.Left
, 0), Bda
->ScreenColumns
- 1);
1970 Rectangle
.Right
= min(max(Rectangle
.Right
, 0), Bda
->ScreenColumns
- 1);
1971 Rectangle
.Top
= min(max(Rectangle
.Top
, 0), Bda
->ScreenRows
);
1972 Rectangle
.Bottom
= min(max(Rectangle
.Bottom
, 0), Bda
->ScreenRows
);
1974 WindowWidth
= Rectangle
.Right
- Rectangle
.Left
+ 1;
1975 WindowHeight
= Rectangle
.Bottom
- Rectangle
.Top
+ 1;
1977 /* Amount == 0 means we clear all the rectangle */
1978 if ((Amount
== 0) ||
1979 (((Direction
== SCROLL_UP
) || (Direction
== SCROLL_DOWN
)) && (Amount
>= WindowHeight
)) ||
1980 (((Direction
== SCROLL_LEFT
) || (Direction
== SCROLL_RIGHT
)) && (Amount
>= WindowWidth
)))
1982 /* Fill the rectangle */
1983 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
1985 for (j
= Rectangle
.Left
; j
<= Rectangle
.Right
; j
++)
1987 EmulatorWriteMemory(&EmulatorContext
,
1988 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
1989 (LPVOID
)&FillCharacter
,
1990 sizeof(FillCharacter
));
2001 /* Move text lines up */
2002 for (i
= Rectangle
.Top
+ Amount
; i
<= Rectangle
.Bottom
; i
++)
2004 EmulatorWriteMemory(&EmulatorContext
,
2005 VideoAddress
+ ((i
- Amount
) * Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
),
2006 REAL_TO_PHYS(VideoAddress
+ ( i
* Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
)),
2007 (Rectangle
.Right
- Rectangle
.Left
+ 1) * sizeof(WORD
));
2010 /* Fill the bottom of the rectangle */
2011 for (i
= Rectangle
.Bottom
- Amount
+ 1; i
<= Rectangle
.Bottom
; i
++)
2013 for (j
= Rectangle
.Left
; j
<= Rectangle
.Right
; j
++)
2015 EmulatorWriteMemory(&EmulatorContext
,
2016 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2017 (LPVOID
)&FillCharacter
,
2018 sizeof(FillCharacter
));
2029 /* Move text lines down */
2030 for (i
= Rectangle
.Bottom
- Amount
; i
>= Rectangle
.Top
; i
--)
2032 EmulatorWriteMemory(&EmulatorContext
,
2033 VideoAddress
+ ((i
+ Amount
) * Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
),
2034 REAL_TO_PHYS(VideoAddress
+ ( i
* Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
)),
2035 (Rectangle
.Right
- Rectangle
.Left
+ 1) * sizeof(WORD
));
2038 /* Fill the top of the rectangle */
2039 Bottom
= Rectangle
.Top
+ Amount
- 1;
2040 for (i
= Rectangle
.Top
; i
<= Bottom
; i
++)
2042 for (j
= Rectangle
.Left
; j
<= Rectangle
.Right
; j
++)
2044 EmulatorWriteMemory(&EmulatorContext
,
2045 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2046 (LPVOID
)&FillCharacter
,
2047 sizeof(FillCharacter
));
2056 /* Move text lines left */
2057 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2059 EmulatorWriteMemory(&EmulatorContext
,
2060 VideoAddress
+ (i
* Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
),
2061 REAL_TO_PHYS(VideoAddress
+ (i
* Bda
->ScreenColumns
+ Rectangle
.Left
+ Amount
) * sizeof(WORD
)),
2062 (Rectangle
.Right
- Rectangle
.Left
- Amount
+ 1) * sizeof(WORD
));
2065 /* Fill the right of the rectangle */
2066 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2068 for (j
= Rectangle
.Right
- Amount
+ 1; j
<= Rectangle
.Right
; j
++)
2070 EmulatorWriteMemory(&EmulatorContext
,
2071 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2072 (LPVOID
)&FillCharacter
,
2073 sizeof(FillCharacter
));
2082 /* Move text lines right */
2083 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2085 EmulatorWriteMemory(&EmulatorContext
,
2086 VideoAddress
+ (i
* Bda
->ScreenColumns
+ Rectangle
.Left
+ Amount
) * sizeof(WORD
),
2087 REAL_TO_PHYS(VideoAddress
+ (i
* Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
)),
2088 (Rectangle
.Right
- Rectangle
.Left
- Amount
+ 1) * sizeof(WORD
));
2091 /* Fill the left of the rectangle */
2092 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2094 INT Right
= Rectangle
.Left
+ Amount
- 1;
2095 for (j
= Rectangle
.Left
; j
<= Right
; j
++)
2097 EmulatorWriteMemory(&EmulatorContext
,
2098 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2099 (LPVOID
)&FillCharacter
,
2100 sizeof(FillCharacter
));
2111 static __inline VOID
VgaSetSinglePaletteRegister(BYTE Index
, BYTE Value
)
2113 /* Write the index */
2114 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2115 IOWriteB(VGA_AC_INDEX
, Index
);
2117 /* Write the data */
2118 IOWriteB(VGA_AC_WRITE
, Value
);
2121 static BOOLEAN
VgaSetRegisters(PVGA_REGISTERS Registers
)
2125 if (Registers
== NULL
) return FALSE
;
2127 /* Disable interrupts */
2131 * Set the CRT base address according to the selected mode,
2132 * monochrome or color. The following macros:
2133 * VGA_INSTAT1_READ, VGA_CRTC_INDEX and VGA_CRTC_DATA are then
2134 * used to access the correct VGA I/O ports.
2136 Bda
->CrtBasePort
= (Registers
->Misc
& 0x01) ? VGA_CRTC_INDEX_COLOR
2137 : VGA_CRTC_INDEX_MONO
;
2138 /* Bit 1 indicates whether display is color (0) or monochrome (1) */
2139 Bda
->VGAOptions
= (Bda
->VGAOptions
& 0xFD) | (!(Registers
->Misc
& 0x01) << 1);
2140 Bda
->CrtModeControl
= (Bda
->CrtModeControl
& 0xFB) | (!(Registers
->Misc
& 0x01) << 1);
2142 /* Update blink bit in BDA */
2143 if (Registers
->Attribute
[VGA_AC_CONTROL_REG
] & VGA_AC_CONTROL_BLINK
)
2144 Bda
->CrtModeControl
|= (1 << 5);
2146 Bda
->CrtModeControl
&= ~(1 << 5);
2148 /* Turn the video off */
2149 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_CLOCK_REG
);
2150 IOWriteB(VGA_SEQ_DATA
, IOReadB(VGA_SEQ_DATA
) | VGA_SEQ_CLOCK_SD
);
2152 /* Write the misc register */
2153 IOWriteB(VGA_MISC_WRITE
, Registers
->Misc
);
2155 /* Synchronous reset on */
2156 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_RESET_REG
);
2157 IOWriteB(VGA_SEQ_DATA
, VGA_SEQ_RESET_AR
);
2159 /* Write the sequencer registers */
2160 for (i
= 1; i
< VGA_SEQ_MAX_REG
; i
++)
2162 IOWriteB(VGA_SEQ_INDEX
, i
);
2163 IOWriteB(VGA_SEQ_DATA
, Registers
->Sequencer
[i
]);
2166 /* Synchronous reset off */
2167 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_RESET_REG
);
2168 IOWriteB(VGA_SEQ_DATA
, VGA_SEQ_RESET_SR
| VGA_SEQ_RESET_AR
);
2170 /* Unlock CRTC registers 0-7 */
2171 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_END_HORZ_BLANKING_REG
);
2172 IOWriteB(VGA_CRTC_DATA
, IOReadB(VGA_CRTC_DATA
) | 0x80);
2173 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_VERT_RETRACE_END_REG
);
2174 IOWriteB(VGA_CRTC_DATA
, IOReadB(VGA_CRTC_DATA
) & ~0x80);
2175 // Make sure they remain unlocked
2176 Registers
->CRT
[VGA_CRTC_END_HORZ_BLANKING_REG
] |= 0x80;
2177 Registers
->CRT
[VGA_CRTC_VERT_RETRACE_END_REG
] &= ~0x80;
2179 /* Write the CRTC registers */
2180 for (i
= 0; i
< VGA_CRTC_MAX_REG
; i
++)
2182 IOWriteB(VGA_CRTC_INDEX
, i
);
2183 IOWriteB(VGA_CRTC_DATA
, Registers
->CRT
[i
]);
2186 /* Write the GC registers */
2187 for (i
= 0; i
< VGA_GC_MAX_REG
; i
++)
2189 IOWriteB(VGA_GC_INDEX
, i
);
2190 IOWriteB(VGA_GC_DATA
, Registers
->Graphics
[i
]);
2193 /* Write the AC registers */
2194 for (i
= 0; i
< VGA_AC_MAX_REG
; i
++)
2196 VgaSetSinglePaletteRegister(i
, Registers
->Attribute
[i
]);
2199 /* Set the PEL mask */
2200 IOWriteB(VGA_DAC_MASK
, 0xFF);
2202 /* Enable screen and disable palette access */
2203 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2204 IOWriteB(VGA_AC_INDEX
, 0x20);
2206 /* Turn the video on */
2207 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_CLOCK_REG
);
2208 IOWriteB(VGA_SEQ_DATA
, IOReadB(VGA_SEQ_DATA
) & ~VGA_SEQ_CLOCK_SD
);
2210 /* Enable interrupts */
2216 static VOID
VgaSetPalette(const COLORREF
* Palette
, ULONG Size
)
2220 // /* Disable screen and enable palette access */
2221 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2222 // IOWriteB(VGA_AC_INDEX, 0x00);
2224 for (i
= 0; i
< Size
; i
++)
2226 IOWriteB(VGA_DAC_WRITE_INDEX
, i
);
2227 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(GetRValue(Palette
[i
])));
2228 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(GetGValue(Palette
[i
])));
2229 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(GetBValue(Palette
[i
])));
2232 /* The following step might be optional */
2233 for (i
= Size
; i
< VGA_MAX_COLORS
; i
++)
2235 IOWriteB(VGA_DAC_WRITE_INDEX
, i
);
2236 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(0x00));
2237 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(0x00));
2238 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(0x00));
2241 /* Enable screen and disable palette access */
2242 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2243 // IOWriteB(VGA_AC_INDEX, 0x20);
2246 static VOID
VgaChangePalette(BYTE ModeNumber
)
2248 const COLORREF
* Palette
;
2251 if (ModeNumber
>= 0x13)
2254 Palette
= VgaPalette
;
2255 Size
= ARRAYSIZE(VgaPalette
);
2257 else if (ModeNumber
== 0x10) // || (ModeNumber == 0x0D) || (ModeNumber == 0x0E)
2259 /* EGA HiRes mode */
2260 Palette
= EgaPalette__HiRes
;
2261 Size
= ARRAYSIZE(EgaPalette__HiRes
);
2264 else if ((ModeNumber
== 0x04) || (ModeNumber
== 0x05))
2267 * CGA modes; this palette contains both normal and
2268 * bright versions of CGA palettes 0 and 1
2270 Palette
= CgaPalette2
;
2271 Size
= ARRAYSIZE(CgaPalette2
);
2274 else // if ((ModeNumber == 0x0D) || (ModeNumber == 0x0E))
2277 Palette
= EgaPalette__16Colors
;
2278 Size
= ARRAYSIZE(EgaPalette__16Colors
);
2281 VgaSetPalette(Palette
, Size
);
2284 static VOID
VidBiosGetCursorPosition(PBYTE Row
, PBYTE Column
, BYTE Page
)
2286 /* Make sure the selected video page is valid */
2287 if (Page
>= BIOS_MAX_PAGES
) return;
2289 /* Get the cursor location */
2290 *Row
= HIBYTE(Bda
->CursorPosition
[Page
]);
2291 *Column
= LOBYTE(Bda
->CursorPosition
[Page
]);
2294 static VOID
VidBiosSetCursorPosition(BYTE Row
, BYTE Column
, BYTE Page
)
2296 /* Make sure the selected video page is valid */
2297 if (Page
>= BIOS_MAX_PAGES
) return;
2299 /* Update the position in the BDA */
2300 Bda
->CursorPosition
[Page
] = MAKEWORD(Column
, Row
);
2302 /* Check if this is the current video page */
2303 if (Page
== Bda
->VideoPage
)
2305 WORD Offset
= Row
* Bda
->ScreenColumns
+ Column
;
2307 /* Modify the CRTC registers */
2308 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_LOW_REG
);
2309 IOWriteB(VGA_CRTC_DATA
, LOBYTE(Offset
));
2310 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_HIGH_REG
);
2311 IOWriteB(VGA_CRTC_DATA
, HIBYTE(Offset
));
2315 static VOID
VidBiosSetCursorShape(WORD CursorStartEnd
)
2317 /* Only valid in text-mode */
2318 if ((Bda
->VideoMode
> 0x03) && (Bda
->VideoMode
!= 0x07)) return;
2320 /* Update the BDA */
2321 Bda
->CursorStartLine
= HIBYTE(CursorStartEnd
) & 0x1F;
2322 Bda
->CursorEndLine
= LOBYTE(CursorStartEnd
) & 0x1F;
2325 * In cursor emulation mode, we suppose the cursor scanlines
2326 * to be in CGA mode, so that we need to adjust them
2330 * Contrary to what is mentioned in lots of literature out there, e.g. in:
2331 * http://webpages.charter.net/danrollins/techhelp/0072.HTM
2332 * http://www.bioscentral.com/misc/bda.htm
2333 * and in other various places, bit 0 of Bda->VGAOptions is 0 when
2334 * cursor emulation is ENABLED, and is 1 when it is DISABLED.
2336 * The following documentation is right about this fact:
2337 * http://www.cs.nyu.edu/~mwalfish/classes/ut/s12-cs372h/ref/hardware/vgadoc/VGABIOS.TXT
2338 * https://sites.google.com/site/pcdosretro/biosdata
2340 * A proof that it is OK is that in the following code samples it is
2341 * explicitely mentioned that setting bit 0 disables cursor emulation:
2342 * - Code snippets in PC Magazine vol.5 num.15 of 16/09/1986, p.291-292;
2343 * - CardFile DOS utility (Jeff Prosise, PC Magazine vol.6 num.17 of 13/10/1987, p.403-416):
2344 * https://ia600700.us.archive.org/1/items/srccode-00000020/cardfile.asm.txt
2345 * (function 'show_cursor', "or ega_info,1 ;disable EGA cursor emulation")
2347 if (!(Bda
->VGAOptions
& 0x01))
2349 // HACK: Quick "fix" for cursor scanline adjustment. This must be reworked.
2350 DPRINT1("HACK: Using HACK for cursor scanlines adjustment\n");
2351 CursorStartEnd
= MAKEWORD((LOBYTE(CursorStartEnd
) & 0x1F) * 2,
2352 (HIBYTE(CursorStartEnd
) & 0x1F) * 2 | (HIBYTE(CursorStartEnd
) & 0xE0));
2355 /* Modify the CRTC registers */
2356 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_START_REG
);
2357 IOWriteB(VGA_CRTC_DATA
, HIBYTE(CursorStartEnd
));
2358 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_END_REG
);
2359 IOWriteB(VGA_CRTC_DATA
, LOBYTE(CursorStartEnd
));
2362 VOID
VidBiosSyncCursorPosition(VOID
)
2366 SHORT ScreenColumns
= VgaGetDisplayResolution().X
;
2369 /* Get the cursor location */
2370 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_LOW_REG
);
2371 Low
= IOReadB(VGA_CRTC_DATA
);
2372 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_HIGH_REG
);
2373 High
= IOReadB(VGA_CRTC_DATA
);
2375 Offset
= MAKEWORD(Low
, High
);
2377 Row
= (BYTE
)(Offset
/ ScreenColumns
);
2378 Column
= (BYTE
)(Offset
% ScreenColumns
);
2380 /* Synchronize our cursor position with VGA */
2381 VidBiosSetCursorPosition(Row
, Column
, Bda
->VideoPage
);
2384 static inline BYTE
VidBiosGetVideoMode(VOID
)
2386 /* Bit 7 of VideoMode is determined by bit 7 of VGAOptions */
2387 return Bda
->VideoMode
| (Bda
->VGAOptions
& 0x80);
2390 static BOOLEAN
VidBiosSetVideoMode(BYTE ModeNumber
)
2394 BYTE OrgModeNumber
= ModeNumber
;
2397 * IBM standard modes do not clear the screen if the
2398 * high bit of AL is set (EGA or higher only).
2399 * See Ralf Brown: http://www.ctyme.com/intr/rb-0069.htm
2400 * for more information.
2402 BOOLEAN DoNotClear
= !!(ModeNumber
& 0x80);
2404 /* Retrieve the real mode number and check its validity */
2406 // if (ModeNumber >= ARRAYSIZE(VideoModes))
2407 if (ModeNumber
> BIOS_MAX_VIDEO_MODE
)
2409 DPRINT1("VidBiosSetVideoMode -- Mode %02Xh invalid\n", ModeNumber
);
2413 DPRINT1("Switching to mode %02Xh (%02Xh) %s clearing the screen; VgaRegisters = 0x%p\n",
2414 ModeNumber
, OrgModeNumber
, (DoNotClear
? "without" : "and"), VideoModes
[ModeNumber
].VgaRegisters
);
2416 if (!VgaSetRegisters(VideoModes
[ModeNumber
].VgaRegisters
)) return FALSE
;
2418 VgaChangePalette(ModeNumber
);
2420 /* Clear the VGA memory if needed */
2421 if (!DoNotClear
) VgaClearMemory();
2423 /* Update the values in the BDA */
2424 Bda
->VideoMode
= ModeNumber
;
2425 Bda
->VideoPageSize
= VideoModes
[ModeNumber
].PageSize
;
2427 Bda
->VideoPageOffset
= Bda
->VideoPage
* Bda
->VideoPageSize
;
2429 /* 256 KB Video RAM; set bit 7 if we do not clear the screen */
2430 Bda
->VGAOptions
= 0x60 | (Bda
->VGAOptions
& 0x7F) | (DoNotClear
? 0x80 : 0x00);
2431 Bda
->VGASwitches
= 0xF9; /* High-resolution */
2434 // Bda->CrtModeControl;
2435 // Bda->CrtColorPaletteMask;
2437 /* Set the start address in the CRTC */
2438 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_LOW_REG
);
2439 IOWriteB(VGA_CRTC_DATA
, LOBYTE(Bda
->VideoPageOffset
));
2440 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_HIGH_REG
);
2441 IOWriteB(VGA_CRTC_DATA
, HIBYTE(Bda
->VideoPageOffset
));
2443 /* Update the screen size */
2444 Resolution
= VgaGetDisplayResolution();
2445 Bda
->ScreenColumns
= Resolution
.X
;
2446 Bda
->ScreenRows
= Resolution
.Y
- 1;
2448 /* Update the current font */
2449 Bda
->CharacterHeight
= VideoModes
[ModeNumber
].CharacterHeight
;
2450 switch (Bda
->CharacterHeight
)
2453 * Write the default font to the VGA font plane
2454 * and update the BIOS INT 43h vector (far pointer
2455 * to the character range 00h-...)
2459 VgaWriteFont(0, Font8x8
, ARRAYSIZE(Font8x8
) / VGA_FONT_CHARACTERS
);
2460 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x8_OFFSET
, VIDEO_BIOS_DATA_SEG
);
2465 VgaWriteFont(0, Font8x14
, ARRAYSIZE(Font8x14
) / VGA_FONT_CHARACTERS
);
2466 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x14_OFFSET
, VIDEO_BIOS_DATA_SEG
);
2471 VgaWriteFont(0, Font8x16
, ARRAYSIZE(Font8x16
) / VGA_FONT_CHARACTERS
);
2472 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x16_OFFSET
, VIDEO_BIOS_DATA_SEG
);
2477 #if 0 // Commented, because I need to think about how to change correctly the ScreenRows
2478 // in the code that really use it (the Font generator functions of INT 10h, AH=11h)
2479 // so that it also changes the screen resolution *in text mode only*.
2482 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
2483 case 0x01: Bda
->ScreenRows
= 13; break;
2484 case 0x03: Bda
->ScreenRows
= 42; break;
2486 default : Bda
->ScreenRows
= 24; break;
2491 * Update the cursor shape (text-mode only).
2492 * Use the default CGA cursor scanline values,
2493 * see: http://vitaly_filatov.tripod.com/ng/asm/asm_023.2.html
2495 if ((ModeNumber
>= 0x00 && ModeNumber
<= 0x03) || (ModeNumber
== 0x07))
2496 // FIXME: we might read the CRT registers and do the adjustment?
2497 VidBiosSetCursorShape(MAKEWORD(0x07, 0x06));
2499 /* Set the cursor position for each page */
2500 for (Page
= 0; Page
< BIOS_MAX_PAGES
; ++Page
)
2501 VidBiosSetCursorPosition(0, 0, Page
);
2503 // HACK: We clear here all the text memory. TODO: Do it better!
2504 if (!DoNotClear
&& ((ModeNumber
>= 0x00 && ModeNumber
<= 0x03) || (ModeNumber
== 0x07)))
2508 WORD FillCharacter
= MAKEWORD(' ', DEFAULT_ATTRIBUTE
);
2510 for (Page
= 0; Page
< BIOS_MAX_PAGES
; ++Page
)
2512 VideoAddress
= TO_LINEAR(TEXT_VIDEO_SEG
, Page
* Bda
->VideoPageSize
);
2514 for (i
= 0; i
<= Bda
->ScreenRows
; i
++)
2516 for (j
= 0; j
<= Bda
->ScreenColumns
- 1; j
++)
2518 /* Write to video memory */
2519 EmulatorWriteMemory(&EmulatorContext
,
2520 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2521 (LPVOID
)&FillCharacter
,
2522 sizeof(FillCharacter
));
2528 /* Refresh display */
2529 VgaRefreshDisplay();
2534 static BOOLEAN
VidBiosSetVideoPage(BYTE PageNumber
)
2538 /* Check if the page exists */
2539 if (PageNumber
>= BIOS_MAX_PAGES
) return FALSE
;
2541 /* Check if this is the same page */
2542 if (PageNumber
== Bda
->VideoPage
) return TRUE
;
2544 /* Update the values in the BDA */
2545 Bda
->VideoPage
= PageNumber
;
2546 Bda
->VideoPageOffset
= Bda
->VideoPage
* Bda
->VideoPageSize
;
2548 /* Set the start address in the CRTC */
2549 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_LOW_REG
);
2550 IOWriteB(VGA_CRTC_DATA
, LOBYTE(Bda
->VideoPageOffset
));
2551 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_HIGH_REG
);
2552 IOWriteB(VGA_CRTC_DATA
, HIBYTE(Bda
->VideoPageOffset
));
2555 * Get the cursor location (we don't update anything on the BIOS side
2556 * but we update the cursor location on the VGA side).
2558 VidBiosGetCursorPosition(&Row
, &Column
, PageNumber
);
2559 VidBiosSetCursorPosition(Row
, Column
, PageNumber
);
2564 static VOID
VidBiosDrawGlyph(WORD CharData
, BOOLEAN UseAttr
, BYTE Page
, BYTE Row
, BYTE Column
)
2566 switch (Bda
->VideoMode
)
2568 /* Alphanumeric mode */
2574 EmulatorWriteMemory(&EmulatorContext
,
2575 TO_LINEAR(TEXT_VIDEO_SEG
,
2576 Page
* Bda
->VideoPageSize
+
2577 (Row
* Bda
->ScreenColumns
+ Column
) * sizeof(WORD
)),
2579 UseAttr
? sizeof(WORD
) : sizeof(BYTE
));
2588 WORD CgaSegment
[] = { CGA_EVEN_VIDEO_SEG
, CGA_ODD_VIDEO_SEG
};
2589 PUCHAR Font
= (PUCHAR
)FAR_POINTER(((PULONG
)BaseAddress
)[0x43]);
2590 PUCHAR Glyph
= &Font
[LOBYTE(CharData
) * Bda
->CharacterHeight
];
2591 BOOLEAN Xor
= (HIBYTE(CharData
) & 0x80) ? TRUE
: FALSE
;
2593 BYTE DoubledBits
[] =
2595 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,
2596 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF
2601 /* Set the logical operation to XOR */
2602 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2603 OldRotate
= IOReadB(VGA_GC_DATA
);
2604 IOWriteB(VGA_GC_DATA
, OldRotate
| 0x18);
2607 for (i
= 0; i
< Bda
->CharacterHeight
; i
++)
2609 WORD Pixel
= MAKEWORD(DoubledBits
[Glyph
[i
] >> 4],
2610 DoubledBits
[Glyph
[i
] & 0x0F]);
2615 /* Read from VGA memory to load the latch register */
2616 EmulatorReadMemory(&EmulatorContext
,
2617 TO_LINEAR(CgaSegment
[(Row
+ i
) & 1],
2618 ((((Row
+ i
) >> 1) * Bda
->ScreenColumns
) >> 2) + Column
* 2),
2623 EmulatorWriteMemory(&EmulatorContext
,
2624 TO_LINEAR(CgaSegment
[(Row
+ i
) & 1],
2625 ((((Row
+ i
) >> 1) * Bda
->ScreenColumns
) >> 2) + Column
* 2),
2632 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2633 IOWriteB(VGA_GC_DATA
, OldRotate
);
2643 WORD CgaSegment
[] = { CGA_EVEN_VIDEO_SEG
, CGA_ODD_VIDEO_SEG
};
2644 PUCHAR Font
= (PUCHAR
)FAR_POINTER(((PULONG
)BaseAddress
)[0x43]);
2645 PUCHAR Glyph
= &Font
[LOBYTE(CharData
) * Bda
->CharacterHeight
];
2646 BOOLEAN Xor
= (HIBYTE(CharData
) & 0x80) ? TRUE
: FALSE
;
2651 /* Set the logical operation to XOR */
2652 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2653 OldRotate
= IOReadB(VGA_GC_DATA
);
2654 IOWriteB(VGA_GC_DATA
, OldRotate
| 0x18);
2657 for (i
= 0; i
< Bda
->CharacterHeight
; i
++)
2663 /* Read from VGA memory to load the latch register */
2664 EmulatorReadMemory(&EmulatorContext
,
2665 TO_LINEAR(CgaSegment
[(Row
+ i
) & 1],
2666 ((((Row
+ i
) >> 1) * Bda
->ScreenColumns
) >> 3) + Column
),
2671 EmulatorWriteMemory(&EmulatorContext
,
2672 TO_LINEAR(CgaSegment
[(Row
+ i
) & 1],
2673 ((((Row
+ i
) >> 1) * Bda
->ScreenColumns
) >> 3) + Column
),
2680 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2681 IOWriteB(VGA_GC_DATA
, OldRotate
);
2687 /* 16-color modes */
2695 PUCHAR Font
= (PUCHAR
)FAR_POINTER(((PULONG
)BaseAddress
)[0x43]);
2696 PUCHAR Glyph
= &Font
[LOBYTE(CharData
) * Bda
->CharacterHeight
];
2697 BOOLEAN Xor
= (HIBYTE(CharData
) & 0x80) ? TRUE
: FALSE
;
2698 BYTE OldPlaneWrite
, OldReset
, OldEnableReset
, OldRotate
, OldMode
;
2700 /* Write to all planes */
2701 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_MASK_REG
);
2702 OldPlaneWrite
= IOReadB(VGA_SEQ_DATA
);
2703 IOWriteB(VGA_SEQ_DATA
, 0x0F);
2705 /* Zero the planes whose bits are set in the enable set/reset register */
2706 IOWriteB(VGA_GC_INDEX
, VGA_GC_RESET_REG
);
2707 OldReset
= IOReadB(VGA_GC_DATA
);
2708 IOWriteB(VGA_GC_DATA
, 0x00);
2710 /* Set the enable set/reset register to the inverse of the color */
2711 IOWriteB(VGA_GC_INDEX
, VGA_GC_ENABLE_RESET_REG
);
2712 OldEnableReset
= IOReadB(VGA_GC_DATA
);
2713 IOWriteB(VGA_GC_DATA
, (~HIBYTE(CharData
)) & 0x0F);
2715 /* Make sure we're in write mode 0 */
2716 IOWriteB(VGA_GC_INDEX
, VGA_GC_MODE_REG
);
2717 OldMode
= IOReadB(VGA_GC_DATA
);
2718 IOWriteB(VGA_GC_DATA
, 0x00);
2722 /* Set the logical operation to XOR */
2723 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2724 OldRotate
= IOReadB(VGA_GC_DATA
);
2725 IOWriteB(VGA_GC_DATA
, OldRotate
| 0x18);
2728 for (i
= 0; i
< Bda
->CharacterHeight
; i
++)
2734 /* Read from VGA memory to load the latch register */
2735 EmulatorReadMemory(&EmulatorContext
,
2736 TO_LINEAR(GRAPHICS_VIDEO_SEG
,
2737 (((Row
+ i
) * Bda
->ScreenColumns
) >> 3) + Column
),
2742 EmulatorWriteMemory(&EmulatorContext
,
2743 TO_LINEAR(GRAPHICS_VIDEO_SEG
,
2744 (((Row
+ i
) * Bda
->ScreenColumns
) >> 3) + Column
),
2749 /* Restore the registers */
2750 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_MASK_REG
);
2751 IOWriteB(VGA_SEQ_DATA
, OldPlaneWrite
);
2752 IOWriteB(VGA_GC_INDEX
, VGA_GC_RESET_REG
);
2753 IOWriteB(VGA_GC_DATA
, OldReset
);
2754 IOWriteB(VGA_GC_INDEX
, VGA_GC_ENABLE_RESET_REG
);
2755 IOWriteB(VGA_GC_DATA
, OldEnableReset
);
2756 IOWriteB(VGA_GC_INDEX
, VGA_GC_MODE_REG
);
2757 IOWriteB(VGA_GC_DATA
, OldMode
);
2761 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2762 IOWriteB(VGA_GC_DATA
, OldRotate
);
2768 /* 256-color mode */
2772 PUCHAR Font
= (PUCHAR
)FAR_POINTER(((PULONG
)BaseAddress
)[0x43]);
2773 PUCHAR Glyph
= &Font
[LOBYTE(CharData
) * Bda
->CharacterHeight
];
2774 BYTE PixelBuffer
[8];
2776 for (i
= 0; i
< Bda
->CharacterHeight
; i
++)
2778 for (j
= 0; j
< 8; j
++)
2780 PixelBuffer
[j
] = (Glyph
[i
] & (1 << (7 - j
))) ? HIBYTE(CharData
) : 0;
2783 EmulatorWriteMemory(&EmulatorContext
,
2784 TO_LINEAR(GRAPHICS_VIDEO_SEG
,
2785 (Row
+ i
) * Bda
->ScreenColumns
+ Column
* 8),
2786 (LPVOID
)PixelBuffer
,
2787 sizeof(PixelBuffer
));
2795 DPRINT1("Drawing glyphs in mode %02Xh is not supported.\n", Bda
->VideoMode
);
2800 static VOID
VidBiosPrintCharacter(CHAR Character
, BYTE Attribute
, BYTE Page
)
2802 WORD CharData
= MAKEWORD(Character
, Attribute
);
2805 /* Make sure the page exists */
2806 if (Page
>= BIOS_MAX_PAGES
) return;
2808 /* Get the cursor location */
2809 VidBiosGetCursorPosition(&Row
, &Column
, Page
);
2811 if (Character
== '\a')
2813 /* Bell control character */
2814 // NOTE: We may use what the terminal emulator offers to us...
2818 else if (Character
== '\b')
2820 /* Backspace control character */
2827 Column
= Bda
->ScreenColumns
- 1;
2831 /* Erase the existing character */
2832 CharData
= MAKEWORD(' ', Attribute
);
2833 VidBiosDrawGlyph(CharData
, TRUE
, Page
, Row
, Column
);
2835 else if (Character
== '\t')
2837 /* Horizontal Tabulation control character */
2840 // Taken from DOSBox
2841 VidBiosPrintCharacter(' ', Attribute
, Page
);
2842 VidBiosGetCursorPosition(&Row
, &Column
, Page
);
2843 } while (Column
% 8);
2845 else if (Character
== '\n')
2847 /* Line Feed control character */
2850 else if (Character
== '\r')
2852 /* Carriage Return control character */
2857 /* Default character */
2859 /* Write the character and advance the cursor */
2860 VidBiosDrawGlyph(CharData
, TRUE
, Page
, Row
, Column
);
2864 /* Check if it passed the end of the row */
2865 if (Column
>= Bda
->ScreenColumns
)
2867 /* Return to the first column and go to the next line */
2872 /* Scroll the screen up if needed */
2873 if (Row
> Bda
->ScreenRows
)
2875 /* The screen must be scrolled up */
2876 SMALL_RECT Rectangle
= { 0, 0, Bda
->ScreenColumns
- 1, Bda
->ScreenRows
};
2877 VidBiosScrollWindow(SCROLL_UP
, 1, Rectangle
, Page
, DEFAULT_ATTRIBUTE
/*Attribute*/);
2881 /* Set the cursor position */
2882 VidBiosSetCursorPosition(Row
, Column
, Page
);
2885 /* PUBLIC FUNCTIONS ***********************************************************/
2887 VOID WINAPI
VidBiosVideoService(LPWORD Stack
)
2891 /* Set Video Mode */
2894 VidBiosSetVideoMode(getAL());
2898 /* Set Text-Mode Cursor Shape */
2901 VidBiosSetCursorShape(getCX());
2905 /* Set Cursor Position */
2908 VidBiosSetCursorPosition(getDH(), getDL(), getBH());
2912 /* Get Cursor Position and Shape */
2915 /* Make sure the selected video page exists */
2916 if (getBH() >= BIOS_MAX_PAGES
) break;
2918 /* Return the result */
2919 setCX(MAKEWORD(Bda
->CursorEndLine
, Bda
->CursorStartLine
));
2920 setDX(Bda
->CursorPosition
[getBH()]);
2924 /* Query Light Pen */
2928 * On modern BIOSes, this function returns 0
2929 * so that we can ignore the other registers.
2935 /* Select Active Display Page */
2938 VidBiosSetVideoPage(getAL());
2942 /* Scroll Window Up/Down */
2946 SMALL_RECT Rectangle
= { getCL(), getCH(), getDL(), getDH() };
2948 VidBiosScrollWindow((getAH() == 0x06) ? SCROLL_UP
: SCROLL_DOWN
,
2949 getAL(), Rectangle
, Bda
->VideoPage
, getBH());
2954 /* Read Character and Attribute at Cursor Position */
2958 BYTE Page
= getBH();
2961 /* Check if the page exists */
2962 if (Page
>= BIOS_MAX_PAGES
) break;
2964 /* Find the offset of the character */
2965 Offset
= Page
* Bda
->VideoPageSize
+
2966 (HIBYTE(Bda
->CursorPosition
[Page
]) * Bda
->ScreenColumns
+
2967 LOBYTE(Bda
->CursorPosition
[Page
])) * 2;
2969 /* Read from the video memory */
2970 EmulatorReadMemory(&EmulatorContext
,
2971 TO_LINEAR(TEXT_VIDEO_SEG
, Offset
),
2975 /* Return the character data in AX */
2981 /* Write Character and Attribute at Cursor Position */
2983 /* Write Character only (PCjr: + Attribute) at Cursor Position */
2986 WORD Counter
= getCX();
2987 WORD CharData
= MAKEWORD(getAL(), getBL());
2988 BOOLEAN UseAttr
= (getAH() == 0x09);
2989 BYTE Page
= getBH();
2992 /* Check if the page exists */
2993 if (Page
>= BIOS_MAX_PAGES
) break;
2995 /* Get the cursor location */
2996 // VidBiosGetCursorPosition(&Row, &Column, Page);
2997 Row
= HIBYTE(Bda
->CursorPosition
[Page
]);
2998 Column
= LOBYTE(Bda
->CursorPosition
[Page
]);
3000 /* Write to video memory a certain number of times */
3001 while (Counter
-- > 0)
3003 /* Write the character and advance the position */
3004 VidBiosDrawGlyph(CharData
, UseAttr
, Page
, Row
, Column
);
3007 /* Check if it passed the end of the row */
3008 if (Column
>= Bda
->ScreenColumns
)
3010 /* Return to the first column and go to the next line */
3015 /* Contrary to the "Teletype Output" function, the screen is not scrolled */
3016 if (Row
> Bda
->ScreenRows
)
3018 Row
= Bda
->ScreenRows
;
3025 /* Set Video Colors */
3028 if (Bda
->VideoMode
< 0x04 || Bda
->VideoMode
> 0x06)
3030 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X is unsupported for non-CGA modes\n",
3037 case 0x00: /* Set Background/Border Color */
3040 BYTE Index
= getBL();
3042 /* See: http://www.bioscentral.com/misc/bda.htm */
3043 Bda
->CrtColorPaletteMask
= (Bda
->CrtColorPaletteMask
& 0xE0) | (Index
& 0x1F);
3045 Index
= ((Index
<< 1) & 0x10) | (Index
& 0x7);
3047 /* Always set the overscan color */
3048 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG
, Index
);
3050 /* Don't set any extra colors when in text mode */
3051 if (Bda
->VideoMode
<= 0x03) break;
3053 VgaSetSinglePaletteRegister(0x00, Index
);
3055 Index
= (Bda
->CrtColorPaletteMask
& 0x10) | 0x02 | ((Bda
->CrtColorPaletteMask
& 0x20) >> 5);
3057 VgaSetSinglePaletteRegister(0x01, Index
);
3059 VgaSetSinglePaletteRegister(0x02, Index
);
3061 VgaSetSinglePaletteRegister(0x03, Index
);
3063 /* Background/Border Color is modifiable via the first index */
3064 VgaSetSinglePaletteRegister(0x00, getBL());
3067 /* Enable screen and disable palette access */
3068 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3069 IOWriteB(VGA_AC_INDEX
, 0x20);
3073 case 0x01: /* Set Palette */
3075 BYTE Index
= getBL();
3077 /* See: http://www.bioscentral.com/misc/bda.htm */
3078 /* Reset bit 5: foreground colors index (0: green/red/yellow; 1: cyan/magenta/white) */
3079 Bda
->CrtColorPaletteMask
= (Bda
->CrtColorPaletteMask
& 0xDF) | ((Index
& 1) ? 0x20 : 0x00);
3081 /* Don't set any extra colors when in text mode */
3082 if (Bda
->VideoMode
<= 0x03) break;
3084 Index
= (Bda
->CrtColorPaletteMask
& 0x10) | 0x02 | Index
;
3086 VgaSetSinglePaletteRegister(0x01, Index
);
3088 VgaSetSinglePaletteRegister(0x02, Index
);
3090 VgaSetSinglePaletteRegister(0x03, Index
);
3092 /* Enable screen and disable palette access */
3093 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3094 IOWriteB(VGA_AC_INDEX
, 0x20);
3099 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X NOT IMPLEMENTED\n",
3107 /* Teletype Output */
3110 VidBiosPrintCharacter(getAL(), getBL(), getBH());
3114 /* Get Current Video Mode */
3117 setAX(MAKEWORD(VidBiosGetVideoMode(), Bda
->ScreenColumns
));
3118 setBH(Bda
->VideoPage
);
3122 /* Palette Control */
3127 /* Set Single Palette Register */
3130 VgaSetSinglePaletteRegister(getBL(), getBH());
3132 /* Enable screen and disable palette access */
3133 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3134 IOWriteB(VGA_AC_INDEX
, 0x20);
3138 /* Set Overscan Color */
3141 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG
, getBH());
3143 /* Enable screen and disable palette access */
3144 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3145 IOWriteB(VGA_AC_INDEX
, 0x20);
3149 /* Set All Palette Registers */
3153 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
3155 /* Set the palette registers */
3156 for (i
= 0; i
<= VGA_AC_PAL_F_REG
; i
++)
3158 VgaSetSinglePaletteRegister(i
, Buffer
[i
]);
3161 /* Set the overscan register */
3162 // VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Buffer[VGA_AC_PAL_F_REG + 1]);
3163 IOWriteB(VGA_AC_INDEX
, VGA_AC_OVERSCAN_REG
);
3164 IOWriteB(VGA_AC_WRITE
, Buffer
[VGA_AC_PAL_F_REG
+ 1]);
3166 /* Enable screen and disable palette access */
3167 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3168 IOWriteB(VGA_AC_INDEX
, 0x20);
3172 /* Toggle Intensity/Blinking Bit */
3175 /* Read the old AC mode control register value */
3176 BYTE VgaAcControlReg
;
3177 IOWriteB(VGA_AC_INDEX
, VGA_AC_CONTROL_REG
);
3178 VgaAcControlReg
= IOReadB(VGA_AC_READ
);
3180 /* Toggle the blinking bit and write the new value */
3183 VgaAcControlReg
|= VGA_AC_CONTROL_BLINK
;
3184 Bda
->CrtModeControl
|= (1 << 5);
3188 VgaAcControlReg
&= ~VGA_AC_CONTROL_BLINK
;
3189 Bda
->CrtModeControl
&= ~(1 << 5);
3192 IOWriteB(VGA_AC_INDEX
, VGA_AC_CONTROL_REG
);
3193 IOWriteB(VGA_AC_WRITE
, VgaAcControlReg
);
3195 /* Enable screen and disable palette access */
3196 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3197 IOWriteB(VGA_AC_INDEX
, 0x20);
3201 /* Get Single Palette Register */
3204 /* Write the index */
3205 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3206 IOWriteB(VGA_AC_INDEX
, getBL());
3209 setBH(IOReadB(VGA_AC_READ
));
3211 /* Enable screen and disable palette access */
3212 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3213 IOWriteB(VGA_AC_INDEX
, 0x20);
3217 /* Get Overscan Color */
3220 /* Write the index */
3221 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3222 IOWriteB(VGA_AC_INDEX
, VGA_AC_OVERSCAN_REG
);
3225 setBH(IOReadB(VGA_AC_READ
));
3227 /* Enable screen and disable palette access */
3228 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3229 IOWriteB(VGA_AC_INDEX
, 0x20);
3233 /* Get All Palette Registers */
3237 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
3239 /* Get the palette registers */
3240 for (i
= 0; i
<= VGA_AC_PAL_F_REG
; i
++)
3242 /* Write the index */
3243 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3244 IOWriteB(VGA_AC_INDEX
, i
);
3247 Buffer
[i
] = IOReadB(VGA_AC_READ
);
3250 /* Get the overscan register */
3251 IOWriteB(VGA_AC_INDEX
, VGA_AC_OVERSCAN_REG
);
3252 Buffer
[VGA_AC_PAL_F_REG
+ 1] = IOReadB(VGA_AC_READ
);
3254 /* Enable screen and disable palette access */
3255 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3256 IOWriteB(VGA_AC_INDEX
, 0x20);
3260 /* Set Individual DAC Register */
3263 /* Write the index */
3264 // Certainly in BL and not in BX as said by Ralf Brown...
3265 IOWriteB(VGA_DAC_WRITE_INDEX
, getBL());
3267 /* Write the data in this order: Red, Green, Blue */
3268 IOWriteB(VGA_DAC_DATA
, getDH());
3269 IOWriteB(VGA_DAC_DATA
, getCH());
3270 IOWriteB(VGA_DAC_DATA
, getCL());
3275 /* Set Block of DAC Registers */
3279 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
3281 /* Write the index */
3282 // Certainly in BL and not in BX as said by Ralf Brown...
3283 IOWriteB(VGA_DAC_WRITE_INDEX
, getBL());
3285 for (i
= 0; i
< getCX(); i
++)
3287 /* Write the data in this order: Red, Green, Blue */
3288 IOWriteB(VGA_DAC_DATA
, *Buffer
++);
3289 IOWriteB(VGA_DAC_DATA
, *Buffer
++);
3290 IOWriteB(VGA_DAC_DATA
, *Buffer
++);
3296 /* Get Individual DAC Register */
3299 /* Write the index */
3300 IOWriteB(VGA_DAC_READ_INDEX
, getBL());
3302 /* Read the data in this order: Red, Green, Blue */
3303 setDH(IOReadB(VGA_DAC_DATA
));
3304 setCH(IOReadB(VGA_DAC_DATA
));
3305 setCL(IOReadB(VGA_DAC_DATA
));
3310 /* Get Block of DAC Registers */
3314 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
3316 /* Write the index */
3317 // Certainly in BL and not in BX as said by Ralf Brown...
3318 IOWriteB(VGA_DAC_READ_INDEX
, getBL());
3320 for (i
= 0; i
< getCX(); i
++)
3322 /* Write the data in this order: Red, Green, Blue */
3323 *Buffer
++ = IOReadB(VGA_DAC_DATA
);
3324 *Buffer
++ = IOReadB(VGA_DAC_DATA
);
3325 *Buffer
++ = IOReadB(VGA_DAC_DATA
);
3333 DPRINT1("BIOS Palette Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3347 // FIXME: At the moment we support only graphics-mode functions!
3349 /* Set User 8x8 Graphics Chars (Setup INT 1Fh Vector) */
3352 /* Update the BIOS INT 1Fh vector to user-defined ES:BP pointer */
3353 // Far pointer to the 8x8 characters 80h-FFh
3354 ((PULONG
)BaseAddress
)[0x1F] = MAKELONG(getBP(), getES());
3358 /* Set User Graphics Characters */
3361 // /* Write the font to the VGA font plane */
3362 // VgaWriteFont(0, Font8x8, ARRAYSIZE(Font8x8) / VGA_FONT_CHARACTERS);
3364 /* Update the BIOS INT 43h vector */
3365 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(getBP(), getES());
3368 Bda
->CharacterHeight
= getCX();
3371 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
3372 case 0x01: Bda
->ScreenRows
= 13; break;
3373 case 0x03: Bda
->ScreenRows
= 42; break;
3375 default : Bda
->ScreenRows
= 24; break;
3381 /* Setup ROM 8x14 Font for Graphics Mode */
3385 * Write the default font to the VGA font plane
3386 * and update the BIOS INT 43h vector (far pointer
3387 * to the character range 00h-...)
3389 VgaWriteFont(0, Font8x14
, ARRAYSIZE(Font8x14
) / VGA_FONT_CHARACTERS
);
3390 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x14_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3393 Bda
->CharacterHeight
= 14;
3396 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
3397 case 0x01: Bda
->ScreenRows
= 13; break;
3398 case 0x03: Bda
->ScreenRows
= 42; break;
3400 default : Bda
->ScreenRows
= 24; break;
3406 /* Setup ROM 8x8 Font for Graphics Mode */
3410 * Write the default font to the VGA font plane
3411 * and update the BIOS INT 43h vector (far pointer
3412 * to the character range 00h-...)
3414 VgaWriteFont(0, Font8x8
, ARRAYSIZE(Font8x8
) / VGA_FONT_CHARACTERS
);
3415 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x8_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3418 Bda
->CharacterHeight
= 8;
3421 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
3422 case 0x01: Bda
->ScreenRows
= 13; break;
3423 case 0x03: Bda
->ScreenRows
= 42; break;
3425 default : Bda
->ScreenRows
= 24; break;
3431 /* Setup ROM 8x16 Font for Graphics Mode */
3435 * Write the default font to the VGA font plane
3436 * and update the BIOS INT 43h vector (far pointer
3437 * to the character range 00h-...)
3439 VgaWriteFont(0, Font8x16
, ARRAYSIZE(Font8x16
) / VGA_FONT_CHARACTERS
);
3440 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x16_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3443 Bda
->CharacterHeight
= 16;
3446 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
3447 case 0x01: Bda
->ScreenRows
= 13; break;
3448 case 0x03: Bda
->ScreenRows
= 42; break;
3450 default : Bda
->ScreenRows
= 24; break;
3456 /* Get Current Character Font Information */
3459 ULONG Address
= (ULONG
)NULL
;
3463 /* 00h - INT 0x1F pointer */
3465 Address
= ((PULONG
)BaseAddress
)[0x1F];
3468 /* 01h - INT 0x43 pointer */
3470 Address
= ((PULONG
)BaseAddress
)[0x43];
3473 /* 02h - 8x14 font */
3475 Address
= MAKELONG(FONT_8x14_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3478 /* 03h - 8x8 font */
3480 Address
= MAKELONG(FONT_8x8_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3483 /* 04h - 8x8 font, upper half */
3485 Address
= MAKELONG(FONT_8x8_HIGH_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3488 /* 05h - NOT IMPLEMENTED - 9x14 font */
3492 /* 06h - 8x16 font */
3494 Address
= MAKELONG(FONT_8x16_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3497 /* 07h - NOT IMPLEMENTED - 9x16 font */
3502 DPRINT1("INT 10h, AL=30h Function BH = 0x%02X NOT IMPLEMENTED\n",
3506 /* Return the data */
3507 setES(HIWORD(Address
));
3508 setBP(LOWORD(Address
));
3509 setCX(Bda
->CharacterHeight
);
3510 setDL(Bda
->ScreenRows
);
3517 DPRINT1("BIOS Font Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3525 /* Alternate Function Select */
3530 /* Get EGA/VGA Information */
3533 setBH((Bda
->VGAOptions
& 0x02) >> 1); /* Color (0) or monochrome (1) display */
3534 setBL((Bda
->VGAOptions
& 0x60) >> 5); /* Video RAM size */
3535 setCH((Bda
->VGASwitches
& 0xF0) >> 4); /* Features settings */
3536 setCL( Bda
->VGASwitches
& 0x0F); /* Switches settings */
3540 /* Enable/Disable Cursor Emulation */
3543 BYTE State
= getAL();
3545 /* Check for validity */
3546 if (State
> 1) break;
3549 * Enable (State == 0) or disable (State == 1) cursor emulation.
3550 * Please read the WARNING in the 'VidBiosSetCursorShape'
3551 * function for more details.
3553 Bda
->VGAOptions
= (Bda
->VGAOptions
& 0xFE) | (State
& 0x01);
3555 /* Return success */
3560 /* Enable/Disable screen refresh */
3563 BYTE State
= getAL();
3566 /* Check for validity */
3567 if (State
> 1) break;
3569 /* Turn the video on (State == 0) or off (State == 1) */
3570 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_CLOCK_REG
);
3571 Clocking
= IOReadB(VGA_SEQ_DATA
);
3574 Clocking
&= ~VGA_SEQ_CLOCK_SD
;
3576 Clocking
|= VGA_SEQ_CLOCK_SD
;
3578 IOWriteB(VGA_SEQ_DATA
, Clocking
);
3580 /* Return success */
3587 DPRINT1("BIOS Function INT 10h, AH = 12h (Alternate Function Select), BX = 0x%04X NOT IMPLEMENTED\n",
3599 DPRINT1("BIOS Function INT 13h (Write String) is UNIMPLEMENTED\n");
3603 /* Get/Set Display combination code */
3608 case 0x00: /* Get Display combination code */
3610 setBL(Bda
->VGADccIDActive
);
3611 setBH(0x00); // No alternate display
3613 /* Return success */
3617 case 0x01: /* Set Display combination code */
3619 DPRINT1("Set Display combination code - Unsupported\n");
3628 /* Functionality/State Information (VGA) */
3631 PVGA_DYNAMIC_FUNC_TABLE Table
= SEG_OFF_TO_PTR(getES(), getDI());
3633 /* Check for only supported subfunction */
3634 if (getBX() != 0x0000)
3636 DPRINT1("INT 10h, AH=1Bh, unsupported subfunction 0x%04x\n", getBX());
3640 /* Fill the VGA dynamic functionality table with our information */
3642 Table
->StaticFuncTablePtr
= MAKELONG(VIDEO_STATE_INFO_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3644 Table
->VideoMode
= Bda
->VideoMode
;
3645 Table
->ScreenColumns
= Bda
->ScreenColumns
;
3646 Table
->VideoPageSize
= Bda
->VideoPageSize
;
3647 Table
->VideoPageOffset
= Bda
->VideoPageOffset
;
3648 RtlCopyMemory(Table
->CursorPosition
, Bda
->CursorPosition
, sizeof(Bda
->CursorPosition
));
3649 Table
->CursorEndLine
= Bda
->CursorEndLine
;
3650 Table
->CursorStartLine
= Bda
->CursorStartLine
;
3651 Table
->VideoPage
= Bda
->VideoPage
;
3652 Table
->CrtBasePort
= Bda
->CrtBasePort
;
3653 Table
->CrtModeControl
= Bda
->CrtModeControl
;
3654 Table
->CrtColorPaletteMask
= Bda
->CrtColorPaletteMask
;
3655 Table
->ScreenRows
= Bda
->ScreenRows
;
3656 Table
->CharacterHeight
= Bda
->CharacterHeight
;
3658 Table
->VGADccIDActive
= Bda
->VGADccIDActive
;
3659 Table
->VGADccIDAlternate
= 0x00; // No alternate display
3660 // Table->CurrModeSupportedColorsNum;
3661 // Table->CurrModeSupportedPagesNum;
3662 // Table->Scanlines;
3663 // Table->PrimaryCharTable;
3664 // Table->SecondaryCharTable;
3666 Table
->VGAAvailMemory
= (Bda
->VGAOptions
& 0x60) >> 5;
3667 // Table->VGASavePtrStateFlags;
3668 // Table->VGADispInfo;
3671 /* Return success */
3678 DPRINT1("BIOS Function INT 10h, AH = 0x%02X, AL = 0x%02X, BH = 0x%02X NOT IMPLEMENTED\n",
3679 getAH(), getAL(), getBH());
3686 * Those attach / detach functions are work-in-progress
3689 static BOOL Attached
= TRUE
;
3691 VOID
VidBiosAttachToConsole(VOID
)
3693 // VgaRefreshDisplay();
3696 VgaAttachToConsole();
3700 VgaRefreshDisplay();
3701 VidBiosSyncCursorPosition();
3704 VOID
VidBiosDetachFromConsole(VOID
)
3706 /* Perform another screen refresh */
3707 VgaRefreshDisplay();
3709 /* Detach from the console */
3710 VgaDetachFromConsole(FALSE
);
3714 BOOLEAN
VidBiosInitialize(VOID
)
3716 /* Some vectors are in fact addresses to tables */
3717 ((PULONG
)BaseAddress
)[0x1D] = (ULONG
)NULL
; // Video Parameter Tables
3718 // Far pointer to the 8x8 graphics font for the 8x8 characters 80h-FFh
3719 ((PULONG
)BaseAddress
)[0x1F] = MAKELONG(FONT_8x8_HIGH_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3720 // Far pointer to the character table (EGA, MCGA, VGA) for the 8x16 characters 00h-...
3721 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x16_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3722 ((PULONG
)BaseAddress
)[0x44] = (ULONG
)NULL
; // ROM BIOS Character Font, Characters 00h-7Fh (PCjr)
3724 /* Relocated services by the BIOS (when needed) */
3725 ((PULONG
)BaseAddress
)[0x42] = (ULONG
)NULL
; // Relocated Default INT 10h Video Services
3726 ((PULONG
)BaseAddress
)[0x6D] = (ULONG
)NULL
; // Video BIOS Entry Point
3728 /* Initialize the VGA static function table */
3729 VgaStaticFuncTable
= SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, VIDEO_STATE_INFO_OFFSET
);
3730 RtlZeroMemory(VgaStaticFuncTable
, sizeof(*VgaStaticFuncTable
));
3731 VgaStaticFuncTable
->SupportedModes
[0] = 0xFF; // Modes 0x00 to 0x07 supported
3732 VgaStaticFuncTable
->SupportedModes
[1] = 0xFF; // Modes 0x08 to 0x0F supported
3733 VgaStaticFuncTable
->SupportedModes
[2] = 0x0F; // Modes 0x10 to 0x13 supported
3734 VgaStaticFuncTable
->SupportedScanlines
= 0x07; // Scanlines 200, 350 and 400 supported
3735 VgaStaticFuncTable
->TextCharBlocksNumber
= 0;
3736 VgaStaticFuncTable
->MaxActiveTextCharBlocksNumber
= 0;
3737 VgaStaticFuncTable
->VGAFuncSupportFlags
= 0x0CFD; // See: http://www.ctyme.com/intr/rb-0221.htm#Table46
3738 VgaStaticFuncTable
->VGASavePtrFuncFlags
= 0x18; // See: http://www.ctyme.com/intr/rb-0221.htm#Table47
3740 /* Fill the font tables */
3741 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, FONT_8x8_OFFSET
),
3742 Font8x8
, sizeof(Font8x8
));
3743 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, FONT_8x16_OFFSET
),
3744 Font8x16
, sizeof(Font8x16
));
3745 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, FONT_8x14_OFFSET
),
3746 Font8x14
, sizeof(Font8x14
));
3749 // FIXME: At the moment we always set a VGA mode. In the future,
3750 // we should set this mode **only** when:
3751 // - an app starts to use directly the video memory
3752 // (that should be done in emulator.c)
3753 // - or starts to use non-stream I/O interrupts
3754 // (that should be done here, or maybe in VGA ??)
3757 Bda
->CrtModeControl
= 0x00;
3758 Bda
->CrtColorPaletteMask
= 0x00;
3759 Bda
->VGADccIDActive
= 0x08; // VGA w/ color analog active display
3761 /* Set the default video mode */
3762 VidBiosSetVideoMode(BIOS_DEFAULT_VIDEO_MODE
);
3764 /* Synchronize our cursor position with VGA */
3765 VidBiosSyncCursorPosition();
3767 /* Register the BIOS support BOPs */
3768 RegisterBop(BOP_VIDEO_INT
, VidBiosVideoService
);
3773 VOID
VidBiosCleanup(VOID
)