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 *******************************************************************/
14 /* BIOS Version number and Copyright */
15 #include <reactos/buildno.h>
16 #include <reactos/version.h>
25 #include "bios32/bios32p.h"
27 #include "bios32/vbe.h"
28 // #include "vidbios.h"
29 #include "bios32/vidbios32.h"
32 #include "hardware/video/svga.h"
34 /* MACROS *********************************************************************/
37 // These macros are defined for ease-of-use of some VGA I/O ports
38 // whose addresses depend whether we are in Monochrome or Colour mode.
40 #define VGA_INSTAT1_READ Bda->CrtBasePort + 6 // VGA_INSTAT1_READ_MONO or VGA_INSTAT1_READ_COLOR
41 #define VGA_CRTC_INDEX Bda->CrtBasePort // VGA_CRTC_INDEX_MONO or VGA_CRTC_INDEX_COLOR
42 #define VGA_CRTC_DATA Bda->CrtBasePort + 1 // VGA_CRTC_DATA_MONO or VGA_CRTC_DATA_COLOR
44 /* PRIVATE VARIABLES **********************************************************/
47 * WARNING! For compatibility purposes the string "IBM" should be at C000:001E.
49 static const CHAR BiosInfo
[] =
50 "00000000000 Emulation of IBM VGA Compatible ROM\0"
51 "CL-GD5434 VGA BIOS Version 1.41 \r\n"
52 "Copyright (C) ReactOS Team 1996-"COPYRIGHT_YEAR
"\r\n"
53 "The original CL-GD5434 card was created by Cirrus Logic, Inc.\r\n\0"
54 "BIOS Date: 06/17/13\0";
56 C_ASSERT(sizeof(BiosInfo
)-1 <= 0xFF-0x05); // Ensures that we won't overflow on the Video Code
60 * VGA Register Configurations for BIOS Video Modes.
61 * The configurations were checked against SeaBIOS VGA BIOS.
64 static VGA_REGISTERS VideoMode_40x25_text
=
66 /* Miscellaneous Register */
69 /* Sequencer Registers */
70 {0x00, 0x08, 0x03, 0x00, 0x02},
72 /* CRTC Registers */ /* CGA-compatible: 0xC7, 0x06, 0x07 */
73 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
74 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x1F, 0x96, 0xB9, 0xA3,
78 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
81 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
82 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
85 static VGA_REGISTERS VideoMode_80x25_text
=
87 /* Miscellaneous Register */
90 /* Sequencer Registers */
91 {0x00, 0x00, 0x03, 0x00, 0x02},
93 /* CRTC Registers */ /* CGA-compatible: 0xC7, 0x06, 0x07 */
94 {0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
95 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3,
99 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
102 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
103 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
106 static VGA_REGISTERS VideoMode_320x200_4color
=
108 /* Miscellaneous Register */
111 /* Sequencer Registers */
112 {0x00, 0x09, 0x03, 0x00, 0x02},
115 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
116 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xA2,
120 {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0F, 0x0F, 0xFF},
123 {0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
124 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x03, 0x00, 0x00}
127 static VGA_REGISTERS VideoMode_640x200_2color
=
129 /* Miscellaneous Register */
132 /* Sequencer Registers */
133 {0x00, 0x01, 0x01, 0x00, 0x02},
136 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
137 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xC2,
141 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0xFF},
144 {0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
145 0x17, 0x17, 0x17, 0x17, 0x01, 0x00, 0x01, 0x00, 0x00}
148 static VGA_REGISTERS VideoMode_320x200_16color
=
150 /* Miscellaneous Register */
153 /* Sequencer Registers */
154 {0x00, 0x09, 0x0F, 0x00, 0x06},
157 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xE3,
162 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
165 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
166 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
169 static VGA_REGISTERS VideoMode_640x200_16color
=
171 /* Miscellaneous Register */
174 /* Sequencer Registers */
175 {0x00, 0x01, 0x0F, 0x00, 0x06},
178 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
179 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xE3,
183 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
186 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
187 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
190 static VGA_REGISTERS VideoMode_640x350_16color
=
192 /* Miscellaneous Register */
195 /* Sequencer Registers */
196 {0x00, 0x01, 0x0F, 0x00, 0x06},
199 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00,
200 0x00, 0x00, 0x00, 0x00, 0x83, 0x85, 0x5D, 0x28, 0x0F, 0x63, 0xBA, 0xE3,
204 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
207 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
208 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
211 static VGA_REGISTERS VideoMode_640x480_2color
=
213 /* Miscellaneous Register */
216 /* Sequencer Registers */
217 {0x00, 0x01, 0x0F, 0x00, 0x06},
220 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
221 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xC3,
225 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
228 // {0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
229 // 0x3F, 0x3F, 0x3F, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
230 {0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F,
231 0x00, 0x3F, 0x00, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
234 static VGA_REGISTERS VideoMode_640x480_16color
=
236 /* Miscellaneous Register */
239 /* Sequencer Registers */
240 {0x00, 0x01, 0x0F, 0x00, 0x06},
243 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
244 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3,
248 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
251 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
252 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
255 static VGA_REGISTERS VideoMode_320x200_256color
=
257 /* Miscellaneous Register */
260 /* Sequencer Registers */
261 {0x00, 0x01, 0x0F, 0x00, 0x0E},
264 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x41, 0x00, 0x00,
265 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3,
269 {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF},
272 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
273 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00}
280 * Many people have different versions of those palettes
281 * (e.g. DOSBox, http://www.brokenthorn.com/Resources/OSDevVid2.html ,
282 * etc...) A choice should be made at some point.
285 // This is the same as EgaPalette__HiRes
286 static CONST COLORREF TextPalette
[VGA_MAX_COLORS
/ 4] =
288 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
289 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
290 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
291 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
293 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
294 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
295 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
296 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
299 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
300 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
301 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
302 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
304 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
305 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
306 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
307 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
310 // Unused at the moment
311 static CONST COLORREF mtext_palette
[64] =
313 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
314 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
315 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
316 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
317 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
318 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
319 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
320 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
322 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
323 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
324 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
325 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
326 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
327 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
328 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
329 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
332 // Unused at the moment
333 static CONST COLORREF mtext_s3_palette
[64] =
335 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
336 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
337 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
338 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
339 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
340 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
341 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
342 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
344 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
345 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
346 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
347 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
348 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
349 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
350 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
351 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
356 // Unused at the moment
357 static CONST COLORREF CgaPalette
[16] =
359 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
360 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
361 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
362 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
366 static CONST BYTE CgaPalette1
[] =
368 0x00, /* 0 - Black */
370 0x05, /* 2- Magenta */
371 0x07, /* 3 - White */
374 /* CGA palette 1 bright */
375 static CONST BYTE CgaPalette1i
[] =
377 0x00, /* 0 - Black */
378 0x13, /* 1 - Light cyan */
379 0x15, /* 2 - Light magenta */
380 0x17, /* 3 - Bright White */
384 static CONST BYTE CgaPalette2
[] =
386 0x00, /* 0 - Black */
387 0x02, /* 1 - Green */
389 0x06, /* 3 - Brown */
392 /* CGA palette 2 bright */
393 static CONST BYTE CgaPalette2i
[] =
395 0x00, /* 0 - Black */
396 0x12, /* 1 - Light green */
397 0x14, /* 2 - Light red */
398 0x16, /* 3 - Yellow */
401 // Unused at the moment; same palette as EgaPalette__16Colors
402 static CONST COLORREF CgaPalette2
[VGA_MAX_COLORS
/ 4] =
404 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
405 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
406 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
407 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
409 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
410 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
411 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
412 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
414 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
415 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
416 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
417 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),
421 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
422 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
427 static CONST COLORREF EgaPalette__16Colors
[VGA_MAX_COLORS
/ 4] =
429 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
430 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
432 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
433 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
436 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
437 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
439 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
440 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
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, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
447 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
448 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
451 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
452 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
454 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
455 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
458 // This is the same as TextPalette
459 static CONST COLORREF EgaPalette__HiRes
[VGA_MAX_COLORS
/ 4] =
461 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
462 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
463 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
464 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
466 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
467 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
468 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
469 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
472 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
473 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
474 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
475 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
477 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
478 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 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)
483 #define USE_REACTOS_COLORS
484 // #define USE_DOSBOX_COLORS
487 * Same palette as the default one 'VgaDefaultPalette' in vga.c
489 #if defined(USE_REACTOS_COLORS)
492 static CONST COLORREF VgaPalette
[VGA_MAX_COLORS
] =
494 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
495 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
496 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
497 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
498 RGB(0x00, 0x00, 0x00), RGB(0x10, 0x10, 0x10), RGB(0x20, 0x20, 0x20), RGB(0x35, 0x35, 0x35),
499 RGB(0x45, 0x45, 0x45), RGB(0x55, 0x55, 0x55), RGB(0x65, 0x65, 0x65), RGB(0x75, 0x75, 0x75),
500 RGB(0x8A, 0x8A, 0x8A), RGB(0x9A, 0x9A, 0x9A), RGB(0xAA, 0xAA, 0xAA), RGB(0xBA, 0xBA, 0xBA),
501 RGB(0xCA, 0xCA, 0xCA), RGB(0xDF, 0xDF, 0xDF), RGB(0xEF, 0xEF, 0xEF), RGB(0xFF, 0xFF, 0xFF),
502 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x82, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
503 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x82), RGB(0xFF, 0x00, 0x41),
504 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x82, 0x00), RGB(0xFF, 0xBE, 0x00),
505 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x82, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
506 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x82), RGB(0x00, 0xFF, 0xBE),
507 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x82, 0xFF), RGB(0x00, 0x41, 0xFF),
508 RGB(0x82, 0x82, 0xFF), RGB(0x9E, 0x82, 0xFF), RGB(0xBE, 0x82, 0xFF), RGB(0xDF, 0x82, 0xFF),
509 RGB(0xFF, 0x82, 0xFF), RGB(0xFF, 0x82, 0xDF), RGB(0xFF, 0x82, 0xBE), RGB(0xFF, 0x82, 0x9E),
510 RGB(0xFF, 0x82, 0x82), RGB(0xFF, 0x9E, 0x82), RGB(0xFF, 0xBE, 0x82), RGB(0xFF, 0xDF, 0x82),
511 RGB(0xFF, 0xFF, 0x82), RGB(0xDF, 0xFF, 0x82), RGB(0xBE, 0xFF, 0x82), RGB(0x9E, 0xFF, 0x82),
512 RGB(0x82, 0xFF, 0x82), RGB(0x82, 0xFF, 0x9E), RGB(0x82, 0xFF, 0xBE), RGB(0x82, 0xFF, 0xDF),
513 RGB(0x82, 0xFF, 0xFF), RGB(0x82, 0xDF, 0xFF), RGB(0x82, 0xBE, 0xFF), RGB(0x82, 0x9E, 0xFF),
514 RGB(0xBA, 0xBA, 0xFF), RGB(0xCA, 0xBA, 0xFF), RGB(0xDF, 0xBA, 0xFF), RGB(0xEF, 0xBA, 0xFF),
515 RGB(0xFF, 0xBA, 0xFF), RGB(0xFF, 0xBA, 0xEF), RGB(0xFF, 0xBA, 0xDF), RGB(0xFF, 0xBA, 0xCA),
516 RGB(0xFF, 0xBA, 0xBA), RGB(0xFF, 0xCA, 0xBA), RGB(0xFF, 0xDF, 0xBA), RGB(0xFF, 0xEF, 0xBA),
517 RGB(0xFF, 0xFF, 0xBA), RGB(0xEF, 0xFF, 0xBA), RGB(0xDF, 0xFF, 0xBA), RGB(0xCA, 0xFF, 0xBA),
518 RGB(0xBA, 0xFF, 0xBA), RGB(0xBA, 0xFF, 0xCA), RGB(0xBA, 0xFF, 0xDF), RGB(0xBA, 0xFF, 0xEF),
519 RGB(0xBA, 0xFF, 0xFF), RGB(0xBA, 0xEF, 0xFF), RGB(0xBA, 0xDF, 0xFF), RGB(0xBA, 0xCA, 0xFF),
520 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x39, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
521 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x39), RGB(0x71, 0x00, 0x1C),
522 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x39, 0x00), RGB(0x71, 0x55, 0x00),
523 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x39, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
524 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x39), RGB(0x00, 0x71, 0x55),
525 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x39, 0x71), RGB(0x00, 0x1C, 0x71),
526 RGB(0x39, 0x39, 0x71), RGB(0x45, 0x39, 0x71), RGB(0x55, 0x39, 0x71), RGB(0x61, 0x39, 0x71),
527 RGB(0x71, 0x39, 0x71), RGB(0x71, 0x39, 0x61), RGB(0x71, 0x39, 0x55), RGB(0x71, 0x39, 0x45),
528 RGB(0x71, 0x39, 0x39), RGB(0x71, 0x45, 0x39), RGB(0x71, 0x55, 0x39), RGB(0x71, 0x61, 0x39),
529 RGB(0x71, 0x71, 0x39), RGB(0x61, 0x71, 0x39), RGB(0x55, 0x71, 0x39), RGB(0x45, 0x71, 0x39),
530 RGB(0x39, 0x71, 0x39), RGB(0x39, 0x71, 0x45), RGB(0x39, 0x71, 0x55), RGB(0x39, 0x71, 0x61),
531 RGB(0x39, 0x71, 0x71), RGB(0x39, 0x61, 0x71), RGB(0x39, 0x55, 0x71), RGB(0x39, 0x45, 0x71),
532 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
533 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
534 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
535 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
536 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
537 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
538 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x31, 0x00, 0x41),
539 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x31), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
540 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x31, 0x00),
541 RGB(0x41, 0x41, 0x00), RGB(0x31, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
542 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x31),
543 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x31, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
544 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x31, 0x20, 0x41), RGB(0x39, 0x20, 0x41),
545 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x39), RGB(0x41, 0x20, 0x31), RGB(0x41, 0x20, 0x28),
546 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x31, 0x20), RGB(0x41, 0x39, 0x20),
547 RGB(0x41, 0x41, 0x20), RGB(0x39, 0x41, 0x20), RGB(0x31, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
548 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x31), RGB(0x20, 0x41, 0x39),
549 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x39, 0x41), RGB(0x20, 0x31, 0x41), RGB(0x20, 0x28, 0x41),
550 RGB(0x2D, 0x2D, 0x41), RGB(0x31, 0x2D, 0x41), RGB(0x35, 0x2D, 0x41), RGB(0x3D, 0x2D, 0x41),
551 RGB(0x41, 0x2D, 0x41), RGB(0x41, 0x2D, 0x3D), RGB(0x41, 0x2D, 0x35), RGB(0x41, 0x2D, 0x31),
552 RGB(0x41, 0x2D, 0x2D), RGB(0x41, 0x31, 0x2D), RGB(0x41, 0x35, 0x2D), RGB(0x41, 0x3D, 0x2D),
553 RGB(0x41, 0x41, 0x2D), RGB(0x3D, 0x41, 0x2D), RGB(0x35, 0x41, 0x2D), RGB(0x31, 0x41, 0x2D),
554 RGB(0x2D, 0x41, 0x2D), RGB(0x2D, 0x41, 0x31), RGB(0x2D, 0x41, 0x35), RGB(0x2D, 0x41, 0x3D),
555 RGB(0x2D, 0x41, 0x41), RGB(0x2D, 0x3D, 0x41), RGB(0x2D, 0x35, 0x41), RGB(0x2D, 0x31, 0x41),
556 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
557 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
560 #elif defined(USE_DOSBOX_COLORS)
563 static CONST COLORREF VgaPalette
[VGA_MAX_COLORS
] =
565 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
566 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
567 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
568 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
569 RGB(0x00, 0x00, 0x00), RGB(0x14, 0x14, 0x14), RGB(0x20, 0x20, 0x20), RGB(0x2C, 0x2C, 0x2C),
570 RGB(0x38, 0x38, 0x38), RGB(0x45, 0x45, 0x45), RGB(0x51, 0x51, 0x51), RGB(0x61, 0x61, 0x61),
571 RGB(0x71, 0x71, 0x71), RGB(0x82, 0x82, 0x82), RGB(0x92, 0x92, 0x92), RGB(0xA2, 0xA2, 0xA2),
572 RGB(0xB6, 0xB6, 0xB6), RGB(0xCB, 0xCB, 0xCB), RGB(0xE3, 0xE3, 0xE3), RGB(0xFF, 0xFF, 0xFF),
573 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x7D, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
574 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x7D), RGB(0xFF, 0x00, 0x41),
575 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x7D, 0x00), RGB(0xFF, 0xBE, 0x00),
576 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x7D, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
577 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x7D), RGB(0x00, 0xFF, 0xBE),
578 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x7D, 0xFF), RGB(0x00, 0x41, 0xFF),
579 RGB(0x7D, 0x7D, 0xFF), RGB(0x9E, 0x7D, 0xFF), RGB(0xBE, 0x7D, 0xFF), RGB(0xDF, 0x7D, 0xFF),
580 RGB(0xFF, 0x7D, 0xFF), RGB(0xFF, 0x7D, 0xDF), RGB(0xFF, 0x7D, 0xBE), RGB(0xFF, 0x7D, 0x9E),
582 RGB(0xFF, 0x7D, 0x7D), RGB(0xFF, 0x9E, 0x7D), RGB(0xFF, 0xBE, 0x7D), RGB(0xFF, 0xDF, 0x7D),
583 RGB(0xFF, 0xFF, 0x7D), RGB(0xDF, 0xFF, 0x7D), RGB(0xBE, 0xFF, 0x7D), RGB(0x9E, 0xFF, 0x7D),
584 RGB(0x7D, 0xFF, 0x7D), RGB(0x7D, 0xFF, 0x9E), RGB(0x7D, 0xFF, 0xBE), RGB(0x7D, 0xFF, 0xDF),
585 RGB(0x7D, 0xFF, 0xFF), RGB(0x7D, 0xDF, 0xFF), RGB(0x7D, 0xBE, 0xFF), RGB(0x7D, 0x9E, 0xFF),
586 RGB(0xB6, 0xB6, 0xFF), RGB(0xC7, 0xB6, 0xFF), RGB(0xDB, 0xB6, 0xFF), RGB(0xEB, 0xB6, 0xFF),
587 RGB(0xFF, 0xB6, 0xFF), RGB(0xFF, 0xB6, 0xEB), RGB(0xFF, 0xB6, 0xDB), RGB(0xFF, 0xB6, 0xC7),
588 RGB(0xFF, 0xB6, 0xB6), RGB(0xFF, 0xC7, 0xB6), RGB(0xFF, 0xDB, 0xB6), RGB(0xFF, 0xEB, 0xB6),
589 RGB(0xFF, 0xFF, 0xB6), RGB(0xEB, 0xFF, 0xB6), RGB(0xDB, 0xFF, 0xB6), RGB(0xC7, 0xFF, 0xB6),
590 RGB(0xB6, 0xFF, 0xB6), RGB(0xB6, 0xFF, 0xC7), RGB(0xB6, 0xFF, 0xDB), RGB(0xB6, 0xFF, 0xEB),
591 RGB(0xB6, 0xFF, 0xFF), RGB(0xB6, 0xEB, 0xFF), RGB(0xB6, 0xDB, 0xFF), RGB(0xB6, 0xC7, 0xFF),
592 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x38, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
593 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x38), RGB(0x71, 0x00, 0x1C),
594 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x38, 0x00), RGB(0x71, 0x55, 0x00),
595 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x38, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
596 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x38), RGB(0x00, 0x71, 0x55),
597 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x38, 0x71), RGB(0x00, 0x1C, 0x71),
599 RGB(0x38, 0x38, 0x71), RGB(0x45, 0x38, 0x71), RGB(0x55, 0x38, 0x71), RGB(0x61, 0x38, 0x71),
600 RGB(0x71, 0x38, 0x71), RGB(0x71, 0x38, 0x61), RGB(0x71, 0x38, 0x55), RGB(0x71, 0x38, 0x45),
601 RGB(0x71, 0x38, 0x38), RGB(0x71, 0x45, 0x38), RGB(0x71, 0x55, 0x38), RGB(0x71, 0x61, 0x38),
602 RGB(0x71, 0x71, 0x38), RGB(0x61, 0x71, 0x38), RGB(0x55, 0x71, 0x38), RGB(0x45, 0x71, 0x38),
603 RGB(0x38, 0x71, 0x38), RGB(0x38, 0x71, 0x45), RGB(0x38, 0x71, 0x55), RGB(0x38, 0x71, 0x61),
604 RGB(0x38, 0x71, 0x71), RGB(0x38, 0x61, 0x71), RGB(0x38, 0x55, 0x71), RGB(0x38, 0x45, 0x71),
605 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
606 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
607 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
608 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
609 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
610 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
611 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x30, 0x00, 0x41),
612 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x30), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
613 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x30, 0x00),
614 RGB(0x41, 0x41, 0x00), RGB(0x30, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
616 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x30),
617 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x30, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
618 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x30, 0x20, 0x41), RGB(0x38, 0x20, 0x41),
619 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x38), RGB(0x41, 0x20, 0x30), RGB(0x41, 0x20, 0x28),
620 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x30, 0x20), RGB(0x41, 0x38, 0x20),
621 RGB(0x41, 0x41, 0x20), RGB(0x38, 0x41, 0x20), RGB(0x30, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
622 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x30), RGB(0x20, 0x41, 0x38),
623 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x38, 0x41), RGB(0x20, 0x30, 0x41), RGB(0x20, 0x28, 0x41),
624 RGB(0x2C, 0x2C, 0x41), RGB(0x30, 0x2C, 0x41), RGB(0x34, 0x2C, 0x41), RGB(0x3C, 0x2C, 0x41),
625 RGB(0x41, 0x2C, 0x41), RGB(0x41, 0x2C, 0x3C), RGB(0x41, 0x2C, 0x34), RGB(0x41, 0x2C, 0x30),
626 RGB(0x41, 0x2C, 0x2C), RGB(0x41, 0x30, 0x2C), RGB(0x41, 0x34, 0x2C), RGB(0x41, 0x3C, 0x2C),
627 RGB(0x41, 0x41, 0x2C), RGB(0x3C, 0x41, 0x2C), RGB(0x34, 0x41, 0x2C), RGB(0x30, 0x41, 0x2C),
628 RGB(0x2C, 0x41, 0x2C), RGB(0x2C, 0x41, 0x30), RGB(0x2C, 0x41, 0x34), RGB(0x2C, 0x41, 0x3C),
629 RGB(0x2C, 0x41, 0x41), RGB(0x2C, 0x3C, 0x41), RGB(0x2C, 0x34, 0x41), RGB(0x2C, 0x30, 0x41),
630 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
631 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
636 static CONST UCHAR Font8x8
[VGA_FONT_CHARACTERS
* 8] =
638 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
639 0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E,
640 0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E,
641 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
642 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,
643 0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x92, 0x10, 0x7C,
644 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C,
645 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00,
646 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF,
647 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
648 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF,
649 0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78,
650 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18,
651 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0,
652 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0,
653 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99,
654 0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00,
655 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00,
656 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18,
657 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00,
658 0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00,
659 0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0x86, 0xFC,
660 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00,
661 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF,
662 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00,
663 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00,
664 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00,
665 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
666 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00,
667 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
668 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00,
669 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00,
670 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
671 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00,
672 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
673 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
674 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00,
675 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00,
676 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00,
677 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
678 0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00,
679 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00,
680 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
681 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
682 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30,
683 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
684 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
685 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
686 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00,
687 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00,
688 0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00,
689 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00,
690 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00,
691 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00,
692 0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00,
693 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00,
694 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00,
695 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00,
696 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
697 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
698 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00,
699 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00,
700 0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00,
701 0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00,
702 0x7C, 0xC6, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00,
703 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00,
704 0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00,
705 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00,
706 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00,
707 0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
708 0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00,
709 0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00,
710 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00,
711 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
712 0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
713 0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00,
714 0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00,
715 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
716 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00,
717 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
718 0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,
719 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x0E, 0x00,
720 0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00,
721 0x7C, 0xC6, 0xE0, 0x78, 0x0E, 0xC6, 0x7C, 0x00,
722 0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
723 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00,
724 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
725 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
726 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00,
727 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00,
728 0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00,
729 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00,
730 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00,
731 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00,
732 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
733 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
734 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
735 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
736 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00,
737 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00,
738 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00,
739 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
740 0x38, 0x6C, 0x64, 0xF0, 0x60, 0x60, 0xF0, 0x00,
741 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
742 0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00,
743 0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
744 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78,
745 0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
746 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
747 0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xD6, 0x00,
748 0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
749 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
750 0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0,
751 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
752 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0xF0, 0x00,
753 0x00, 0x00, 0x7C, 0xC0, 0x70, 0x1C, 0xF8, 0x00,
754 0x10, 0x30, 0xFC, 0x30, 0x30, 0x34, 0x18, 0x00,
755 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
756 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
757 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
758 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00,
759 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
760 0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00,
761 0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00,
762 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00,
763 0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00,
764 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
765 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00,
766 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x0C, 0x06, 0x7C,
767 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
768 0x1C, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
769 0x7E, 0x81, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0x00,
770 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
771 0xE0, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
772 0x30, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
773 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x78, 0x0C, 0x38,
774 0x7E, 0x81, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00,
775 0xCC, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
776 0xE0, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
777 0xCC, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
778 0x7C, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
779 0xE0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
780 0xC6, 0x10, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
781 0x30, 0x30, 0x00, 0x78, 0xCC, 0xFC, 0xCC, 0x00,
782 0x1C, 0x00, 0xFC, 0x60, 0x78, 0x60, 0xFC, 0x00,
783 0x00, 0x00, 0x7F, 0x0C, 0x7F, 0xCC, 0x7F, 0x00,
784 0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00,
785 0x78, 0x84, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
786 0x00, 0xCC, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
787 0x00, 0xE0, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
788 0x78, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
789 0x00, 0xE0, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
790 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
791 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00,
792 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
793 0x18, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x18,
794 0x38, 0x6C, 0x64, 0xF0, 0x60, 0xE6, 0xFC, 0x00,
795 0xCC, 0xCC, 0x78, 0x30, 0xFC, 0x30, 0xFC, 0x30,
796 0xF8, 0xCC, 0xCC, 0xFA, 0xC6, 0xCF, 0xC6, 0xC3,
797 0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0xD8, 0x70,
798 0x1C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
799 0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
800 0x00, 0x1C, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
801 0x00, 0x1C, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
802 0x00, 0xF8, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0x00,
803 0xFC, 0x00, 0xCC, 0xEC, 0xFC, 0xDC, 0xCC, 0x00,
804 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00,
805 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00,
806 0x18, 0x00, 0x18, 0x18, 0x30, 0x66, 0x3C, 0x00,
807 0x00, 0x00, 0x00, 0xFC, 0xC0, 0xC0, 0x00, 0x00,
808 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x0C, 0x00, 0x00,
809 0xC6, 0xCC, 0xD8, 0x36, 0x6B, 0xC2, 0x84, 0x0F,
810 0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6D, 0xCF, 0x03,
811 0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00,
812 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
813 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00,
814 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
815 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
816 0xDB, 0xF6, 0xDB, 0x6F, 0xDB, 0x7E, 0xD7, 0xED,
817 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
818 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18,
819 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
820 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36,
821 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36,
822 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
823 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36,
824 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
825 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36,
826 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00,
827 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00,
828 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00,
829 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18,
830 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00,
831 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
832 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18,
833 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
834 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
835 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18,
836 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
837 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36,
838 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00,
839 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36,
840 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00,
841 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36,
842 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36,
843 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
844 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36,
845 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
846 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00,
847 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18,
848 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36,
849 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00,
850 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00,
851 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
852 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36,
853 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36,
854 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18,
855 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00,
856 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18,
857 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
858 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
859 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
860 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
861 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
862 0x00, 0x00, 0x76, 0xDC, 0xC8, 0xDC, 0x76, 0x00,
863 0x00, 0x78, 0xCC, 0xF8, 0xCC, 0xF8, 0xC0, 0xC0,
864 0x00, 0xFC, 0xCC, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
865 0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x00,
866 0xFC, 0xCC, 0x60, 0x30, 0x60, 0xCC, 0xFC, 0x00,
867 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0x70, 0x00,
868 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
869 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00,
870 0xFC, 0x30, 0x78, 0xCC, 0xCC, 0x78, 0x30, 0xFC,
871 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x6C, 0x38, 0x00,
872 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x6C, 0xEE, 0x00,
873 0x1C, 0x30, 0x18, 0x7C, 0xCC, 0xCC, 0x78, 0x00,
874 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00,
875 0x06, 0x0C, 0x7E, 0xDB, 0xDB, 0x7E, 0x60, 0xC0,
876 0x38, 0x60, 0xC0, 0xF8, 0xC0, 0x60, 0x38, 0x00,
877 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
878 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00,
879 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00,
880 0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xFC, 0x00,
881 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xFC, 0x00,
882 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18,
883 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70,
884 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00,
885 0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00,
886 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
887 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
888 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
889 0x0F, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C,
890 0x58, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00,
891 0x70, 0x98, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00,
892 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00,
893 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
896 static CONST UCHAR Font8x14
[VGA_FONT_CHARACTERS
* 14] =
898 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
899 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
900 0x00, 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81,
901 0x81, 0xBD, 0x99, 0x81, 0x7E, 0x00, 0x00,
902 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xDB, 0xFF,
903 0xFF, 0xC3, 0xE7, 0xFF, 0x7E, 0x00, 0x00,
904 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE,
905 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00,
906 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C,
907 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00,
908 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0xE7,
909 0xE7, 0xE7, 0x18, 0x18, 0x3C, 0x00, 0x00,
910 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF,
911 0xFF, 0x7E, 0x18, 0x18, 0x3C, 0x00, 0x00,
912 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
913 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
914 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7,
915 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF,
916 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66,
917 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00,
918 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99,
919 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF,
920 0x00, 0x00, 0x00, 0x1E, 0x0E, 0x1A, 0x32,
921 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00,
922 0x00, 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66,
923 0x3C, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
924 0x00, 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30,
925 0x30, 0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00,
926 0x00, 0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63,
927 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00,
928 0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C,
929 0xE7, 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00,
930 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF8,
931 0xFE, 0xF8, 0xE0, 0xC0, 0x80, 0x00, 0x00,
932 0x00, 0x00, 0x00, 0x02, 0x06, 0x0E, 0x3E,
933 0xFE, 0x3E, 0x0E, 0x06, 0x02, 0x00, 0x00,
934 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
935 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
936 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
937 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00,
938 0x00, 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB,
939 0x7B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00,
940 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6,
941 0x6C, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00,
942 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
943 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE,
944 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
945 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00,
946 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
947 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
948 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
949 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
950 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C,
951 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00,
952 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60,
953 0xFE, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00,
954 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
955 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00,
956 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6C,
957 0xFE, 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00,
958 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
959 0x7C, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00,
960 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C,
961 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00,
962 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
963 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
964 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C,
965 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00,
966 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00,
967 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
968 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C,
969 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00,
970 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0,
971 0x7C, 0x06, 0x86, 0xC6, 0x7C, 0x18, 0x18,
972 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6,
973 0x0C, 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00,
974 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
975 0x76, 0xDC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
976 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30,
977 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
978 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30,
979 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00,
980 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C,
981 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00,
982 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C,
983 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00,
984 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
985 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
986 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
987 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
988 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
989 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
990 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
991 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
992 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
993 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
994 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
995 0xD6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00,
996 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18,
997 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00,
998 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C,
999 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00,
1000 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06,
1001 0x3C, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1002 0x00, 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C,
1003 0xCC, 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
1004 0x00, 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0,
1005 0xFC, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1006 0x00, 0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0,
1007 0xFC, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C,
1009 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00,
1010 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1011 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1012 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1013 0x7E, 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00,
1014 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1015 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
1016 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1017 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
1018 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60,
1019 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00,
1020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1021 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1022 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C,
1023 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00,
1024 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C,
1025 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00,
1026 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE,
1027 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00,
1028 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6,
1029 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1030 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1031 0x7C, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00,
1032 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1033 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00,
1034 0x00, 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66,
1035 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00,
1036 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68,
1037 0x78, 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00,
1038 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68,
1039 0x78, 0x68, 0x60, 0x60, 0xF0, 0x00, 0x00,
1040 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1041 0xC0, 0xDE, 0xC6, 0x66, 0x3A, 0x00, 0x00,
1042 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1043 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1044 0x00, 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18,
1045 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1046 0x00, 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C,
1047 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1048 0x00, 0x00, 0x00, 0xE6, 0x66, 0x6C, 0x6C,
1049 0x78, 0x6C, 0x6C, 0x66, 0xE6, 0x00, 0x00,
1050 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60,
1051 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00,
1052 0x00, 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xD6,
1053 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1054 0x00, 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE,
1055 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1056 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1057 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1058 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1059 0x7C, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00,
1060 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1061 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x0E, 0x00,
1062 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1063 0x7C, 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00,
1064 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60,
1065 0x38, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1066 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x5A, 0x18,
1067 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1068 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1069 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1070 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1071 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00,
1072 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1073 0xD6, 0xD6, 0xFE, 0x6C, 0x6C, 0x00, 0x00,
1074 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7C,
1075 0x38, 0x7C, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1076 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1077 0x3C, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1078 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x8C, 0x18,
1079 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00,
1080 0x00, 0x00, 0x00, 0x3C, 0x30, 0x30, 0x30,
1081 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00,
1082 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70,
1083 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00,
1084 0x00, 0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C,
1085 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x00,
1086 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
1087 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1088 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1089 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1090 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1091 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1092 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
1093 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1094 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x78,
1095 0x6C, 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00,
1096 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1097 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1098 0x00, 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C,
1099 0x6C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1101 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1102 0x00, 0x00, 0x00, 0x1C, 0x36, 0x32, 0x30,
1103 0x7C, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00,
1104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1105 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x78,
1106 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C,
1107 0x76, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00,
1108 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x38,
1109 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1110 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E,
1111 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C,
1112 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66,
1113 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00,
1114 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18,
1115 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC,
1117 0xFE, 0xD6, 0xD6, 0xD6, 0xD6, 0x00, 0x00,
1118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1119 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00,
1120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1121 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1123 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xF0,
1124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1125 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
1126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1127 0x76, 0x66, 0x60, 0x60, 0xF0, 0x00, 0x00,
1128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1129 0xC6, 0x70, 0x1C, 0xC6, 0x7C, 0x00, 0x00,
1130 0x00, 0x00, 0x00, 0x10, 0x30, 0x30, 0xFC,
1131 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00,
1132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC,
1133 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1135 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00,
1136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1137 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00,
1138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1139 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00,
1140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1141 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
1142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1143 0xCC, 0x18, 0x30, 0x66, 0xFE, 0x00, 0x00,
1144 0x00, 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18,
1145 0x70, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00,
1146 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1147 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
1148 0x00, 0x00, 0x00, 0x70, 0x18, 0x18, 0x18,
1149 0x0E, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00,
1150 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1153 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00, 0x00,
1154 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1155 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x18, 0x70,
1156 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0xCC,
1157 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1158 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x7C,
1159 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1160 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x78,
1161 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1162 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x78,
1163 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1164 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 0x78,
1165 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1166 0x00, 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78,
1167 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1169 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x18, 0x70,
1170 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C,
1171 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1172 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x7C,
1173 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1174 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C,
1175 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1176 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x38,
1177 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1178 0x00, 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38,
1179 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1180 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x38,
1181 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1182 0x00, 0xC6, 0x00, 0x10, 0x38, 0x6C, 0xC6,
1183 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1184 0x38, 0x6C, 0x38, 0x10, 0x38, 0x6C, 0xC6,
1185 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1186 0x0C, 0x18, 0x00, 0xFE, 0x66, 0x62, 0x68,
1187 0x78, 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00,
1188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC,
1189 0x36, 0x76, 0xDC, 0xD8, 0x6E, 0x00, 0x00,
1190 0x00, 0x00, 0x00, 0x3E, 0x6C, 0xCC, 0xCC,
1191 0xFE, 0xCC, 0xCC, 0xCC, 0xCE, 0x00, 0x00,
1192 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C,
1193 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1194 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x7C,
1195 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1196 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C,
1197 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1198 0x00, 0x00, 0x30, 0x78, 0xCC, 0x00, 0xCC,
1199 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1200 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 0xCC,
1201 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1202 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0xC6,
1203 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
1204 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1205 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1206 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1207 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1208 0x00, 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6,
1209 0xC0, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
1210 0x00, 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60,
1211 0xF0, 0x60, 0x60, 0x66, 0xFC, 0x00, 0x00,
1212 0x00, 0x00, 0x00, 0x66, 0x66, 0x3C, 0x18,
1213 0x7E, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
1214 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x7C,
1215 0x62, 0x66, 0x6F, 0x66, 0xF3, 0x00, 0x00,
1216 0x00, 0x00, 0x00, 0x0E, 0x1B, 0x18, 0x18,
1217 0x7E, 0x18, 0x18, 0xD8, 0x70, 0x00, 0x00,
1218 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78,
1219 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1220 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x38,
1221 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1222 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x7C,
1223 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1224 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0xCC,
1225 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1226 0x00, 0x00, 0x00, 0x76, 0xDC, 0x00, 0xDC,
1227 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00,
1228 0x76, 0xDC, 0x00, 0xC6, 0xE6, 0xF6, 0xFE,
1229 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1230 0x00, 0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x36,
1231 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1232 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
1233 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
1234 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30,
1235 0x30, 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1237 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
1238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1239 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00,
1240 0x00, 0x60, 0xE0, 0x63, 0x66, 0x6C, 0x18,
1241 0x30, 0x6E, 0xC3, 0x06, 0x0C, 0x1F, 0x00,
1242 0x00, 0x60, 0xE0, 0x63, 0x66, 0x6C, 0x18,
1243 0x36, 0x6E, 0xDA, 0x3F, 0x06, 0x06, 0x00,
1244 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18,
1245 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00,
1246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1247 0x36, 0x6C, 0xD8, 0x6C, 0x36, 0x00, 0x00,
1248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1249 0xD8, 0x6C, 0x36, 0x6C, 0xD8, 0x00, 0x00,
1250 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11,
1251 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1252 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1253 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
1254 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD,
1255 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1256 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1257 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1258 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1259 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1260 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18,
1261 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1262 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1263 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1265 0xFE, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1266 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18,
1267 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1268 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06,
1269 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1270 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1271 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1272 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06,
1273 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1274 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06,
1275 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1276 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1277 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1278 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18,
1279 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1281 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1282 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1283 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1284 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1285 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1287 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1288 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1289 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1291 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1292 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1293 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1294 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18,
1295 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1296 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1297 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1298 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30,
1299 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1300 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30,
1301 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1302 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00,
1303 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1304 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1305 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1306 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30,
1307 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1308 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1309 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1310 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00,
1311 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1312 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00,
1313 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1314 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1315 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1316 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1317 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1319 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1320 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1321 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1322 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18,
1323 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1324 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18,
1325 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1327 0x3F, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1328 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1329 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1330 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18,
1331 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1332 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1333 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1335 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1336 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1337 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1339 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1340 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1341 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1342 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1343 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1344 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1347 0xDC, 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00,
1348 0x00, 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8,
1349 0xCC, 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00,
1350 0x00, 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC0,
1351 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00,
1352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1353 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00,
1354 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x60, 0x30,
1355 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00,
1356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1357 0xD8, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00,
1358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66,
1359 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
1360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1361 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
1362 0x00, 0x00, 0x00, 0x7E, 0x18, 0x3C, 0x66,
1363 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00,
1364 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1365 0xFE, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00,
1366 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1367 0xC6, 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00,
1368 0x00, 0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C,
1369 0x3E, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00,
1370 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB,
1371 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1372 0x00, 0x00, 0x00, 0x03, 0x06, 0x7E, 0xDB,
1373 0xDB, 0xF3, 0x7E, 0x60, 0xC0, 0x00, 0x00,
1374 0x00, 0x00, 0x00, 0x1E, 0x30, 0x60, 0x60,
1375 0x7E, 0x60, 0x60, 0x30, 0x1E, 0x00, 0x00,
1376 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1377 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
1378 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
1379 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
1380 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1381 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
1382 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06,
1383 0x0C, 0x18, 0x30, 0x00, 0x7E, 0x00, 0x00,
1384 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60,
1385 0x30, 0x18, 0x0C, 0x00, 0x7E, 0x00, 0x00,
1386 0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18,
1387 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1388 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1389 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00,
1390 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
1391 0x7E, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
1392 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1393 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1394 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
1395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1397 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1399 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1400 0x00, 0x00, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C,
1401 0x0C, 0xEC, 0x6C, 0x3C, 0x1C, 0x00, 0x00,
1402 0x00, 0x00, 0x00, 0x6C, 0x36, 0x36, 0x36,
1403 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
1404 0x00, 0x00, 0x00, 0x3C, 0x66, 0x0C, 0x18,
1405 0x32, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1406 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E,
1407 0x7E, 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00,
1408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1412 static CONST UCHAR Font8x16
[VGA_FONT_CHARACTERS
* 16] =
1414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1416 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD,
1417 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00,
1418 0x00, 0x00, 0x7C, 0xFE, 0xFE, 0xD6, 0xFE, 0xFE,
1419 0xBA, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00,
1420 0x00, 0x00, 0x00, 0x6C, 0xEE, 0xFE, 0xFE, 0xFE,
1421 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1422 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C,
1423 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1424 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x10, 0x6C,
1425 0xEE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
1426 0x00, 0x00, 0x10, 0x38, 0x7C, 0x7C, 0xFE, 0xFE,
1427 0xFE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
1428 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C,
1429 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1430 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3,
1431 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1432 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x66, 0x66,
1433 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1434 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0x99, 0x99,
1435 0x99, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1436 0x00, 0x00, 0x1E, 0x0E, 0x1E, 0x36, 0x78, 0xCC,
1437 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1438 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18,
1439 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1440 0x00, 0x00, 0x1E, 0x1A, 0x1E, 0x18, 0x18, 0x18,
1441 0x18, 0x78, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00,
1442 0x00, 0x00, 0x3E, 0x36, 0x3E, 0x36, 0x36, 0x76,
1443 0xF6, 0x66, 0x0E, 0x1E, 0x0C, 0x00, 0x00, 0x00,
1444 0x00, 0x00, 0x18, 0xDB, 0x7E, 0x3C, 0x66, 0x66,
1445 0x3C, 0x7E, 0xDB, 0x18, 0x00, 0x00, 0x00, 0x00,
1446 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xFE,
1447 0xFC, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00,
1448 0x00, 0x00, 0x00, 0x02, 0x0E, 0x3E, 0x7E, 0xFE,
1449 0x7E, 0x3E, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00,
1450 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1451 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1452 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
1453 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1454 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0xDB, 0x7B,
1455 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00,
1456 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x7C, 0xF6,
1457 0xDE, 0x7C, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1458 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1459 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00,
1460 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1461 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1462 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1463 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1464 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1465 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1466 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0xFF,
1467 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1468 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xFE,
1469 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1470 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
1471 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1472 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF,
1473 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1474 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x7C,
1475 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1476 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x7C,
1477 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1478 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1479 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1480 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x3C, 0x18,
1481 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1482 0x00, 0x36, 0x36, 0x36, 0x36, 0x14, 0x00, 0x00,
1483 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1484 0x00, 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C,
1485 0xFE, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1486 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0x78,
1487 0x3C, 0x06, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
1488 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x66, 0x0C,
1489 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00, 0x00, 0x00,
1490 0x00, 0x00, 0x38, 0x6C, 0x38, 0x30, 0x76, 0x7E,
1491 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1492 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1493 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1494 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30,
1495 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1496 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C,
1497 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1498 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x38, 0xFE,
1499 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1500 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E,
1501 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1502 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1503 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1504 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1505 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1506 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1507 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1508 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
1509 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
1510 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xCE, 0xDE, 0xF6,
1511 0xE6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1512 0x00, 0x00, 0x18, 0x78, 0x18, 0x18, 0x18, 0x18,
1513 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1514 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x06, 0x0C, 0x18,
1515 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1516 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06,
1517 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1518 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xCC,
1519 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00,
1520 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06,
1521 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1522 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xFC, 0xC6,
1523 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1524 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C, 0x18, 0x30,
1525 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
1526 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6,
1527 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1528 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E,
1529 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1530 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1531 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1532 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1533 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1534 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0xC0,
1535 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1536 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
1537 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1538 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06,
1539 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
1540 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18,
1541 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1542 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xDE, 0xDE,
1543 0xDE, 0xDC, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00,
1544 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE,
1545 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1546 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66,
1547 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1548 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0,
1549 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1550 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66,
1551 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,
1552 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1553 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1554 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1555 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1556 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0,
1557 0xCE, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1558 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6,
1559 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1560 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1561 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1562 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1563 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1564 0x00, 0x00, 0xC6, 0xC6, 0xCC, 0xD8, 0xF0, 0xF0,
1565 0xD8, 0xCC, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1566 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60,
1567 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1568 0x00, 0x00, 0xC6, 0xC6, 0xEE, 0xEE, 0xFE, 0xD6,
1569 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1570 0x00, 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xF6, 0xDE,
1571 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1572 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1573 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1574 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x66, 0x7C,
1575 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1576 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1577 0xC6, 0xD6, 0xD6, 0x7C, 0x06, 0x00, 0x00, 0x00,
1578 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x78,
1579 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1580 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0x70, 0x1C,
1581 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1582 0x00, 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18,
1583 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1584 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1585 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1586 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1587 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1588 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6,
1589 0xFE, 0xEE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1590 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x38,
1591 0x6C, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1592 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C,
1593 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1594 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30,
1595 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1596 0x00, 0x00, 0x7C, 0x60, 0x60, 0x60, 0x60, 0x60,
1597 0x60, 0x60, 0x60, 0x7C, 0x00, 0x00, 0x00, 0x00,
1598 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30,
1599 0x18, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1600 0x00, 0x00, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
1601 0x0C, 0x0C, 0x0C, 0x7C, 0x00, 0x00, 0x00, 0x00,
1602 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00,
1603 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1604 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1605 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
1606 0x00, 0x18, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x00,
1607 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1608 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1609 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1610 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1611 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1612 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1613 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1614 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC,
1615 0xCC, 0xCC, 0xCC, 0x7E, 0x00, 0x00, 0x00, 0x00,
1616 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1617 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1618 0x00, 0x00, 0x1C, 0x36, 0x30, 0x30, 0xFC, 0x30,
1619 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00,
1620 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCE, 0xC6,
1621 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1622 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1623 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1624 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18,
1625 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1626 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x0C,
1627 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1628 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x66, 0x6C,
1629 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1630 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1631 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00,
1632 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xD6,
1633 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1634 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1635 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1636 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1637 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1638 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1639 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x00,
1640 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC,
1641 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
1642 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x60,
1643 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1644 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1645 0x7C, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1646 0x00, 0x00, 0x30, 0x30, 0x30, 0xFC, 0x30, 0x30,
1647 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,
1648 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC,
1649 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1650 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1651 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1652 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6,
1653 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00,
1654 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x6C,
1655 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1656 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1657 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1658 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x86, 0x0C,
1659 0x18, 0x30, 0x62, 0xFE, 0x00, 0x00, 0x00, 0x00,
1660 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18,
1661 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00,
1662 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
1663 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1664 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18,
1665 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
1666 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1667 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1668 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
1669 0x6C, 0x6C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1670 0x00, 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0xC6,
1671 0x66, 0x3C, 0x18, 0x0C, 0xCC, 0x38, 0x00, 0x00,
1672 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1673 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1674 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1675 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1676 0x00, 0x30, 0x78, 0xCC, 0x00, 0x78, 0x0C, 0x7C,
1677 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1678 0x00, 0x00, 0xCC, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1679 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1680 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C,
1681 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1682 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78, 0x0C, 0x7C,
1683 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1684 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0,
1685 0xC6, 0x7C, 0x18, 0x0C, 0x6C, 0x38, 0x00, 0x00,
1686 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1687 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1688 0x00, 0x00, 0xCC, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1689 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1690 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1691 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1692 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
1693 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1694 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18,
1695 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1696 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18,
1697 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1698 0x00, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6,
1699 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1700 0x38, 0x6C, 0x38, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1701 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1702 0x0C, 0x18, 0x30, 0x00, 0xFE, 0x60, 0x60, 0x7C,
1703 0x60, 0x60, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00,
1704 0x00, 0x00, 0x00, 0x00, 0x66, 0xDB, 0x1B, 0x7F,
1705 0xD8, 0xD8, 0xDF, 0x76, 0x00, 0x00, 0x00, 0x00,
1706 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xD8, 0xFE,
1707 0xD8, 0xD8, 0xD8, 0xDE, 0x00, 0x00, 0x00, 0x00,
1708 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1709 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1710 0x00, 0x00, 0xC6, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1711 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1712 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1713 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1714 0x00, 0x30, 0x78, 0xCC, 0x00, 0xC6, 0xC6, 0xC6,
1715 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1716 0x00, 0x60, 0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6,
1717 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1718 0x00, 0x18, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18,
1719 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1720 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6,
1721 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1722 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1723 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1724 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0xC0,
1725 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1726 0x00, 0x38, 0x6C, 0x60, 0x60, 0xF0, 0x60, 0x60,
1727 0x60, 0x66, 0xF6, 0x6C, 0x00, 0x00, 0x00, 0x00,
1728 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E,
1729 0x18, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1730 0x00, 0x00, 0x3E, 0x63, 0x63, 0x30, 0x1C, 0x06,
1731 0x63, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1732 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x63, 0x38,
1733 0x0E, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1734 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78, 0x0C, 0x7C,
1735 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1736 0x00, 0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18,
1737 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1738 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1739 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1740 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC,
1741 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1742 0x00, 0x00, 0x76, 0xDC, 0x00, 0xBC, 0x66, 0x66,
1743 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1744 0x00, 0x76, 0xDC, 0x00, 0xC6, 0xC6, 0xE6, 0xF6,
1745 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1746 0x00, 0x21, 0x1E, 0x00, 0x1E, 0x33, 0x60, 0x60,
1747 0x67, 0x63, 0x33, 0x1D, 0x00, 0x00, 0x00, 0x00,
1748 0x00, 0x42, 0x3C, 0x00, 0x3B, 0x66, 0x66, 0x66,
1749 0x3E, 0x06, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1750 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30,
1751 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1752 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1753 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
1754 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1755 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
1756 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x30,
1757 0x60, 0xDC, 0x36, 0x0C, 0x18, 0x3E, 0x00, 0x00,
1758 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x36,
1759 0x6E, 0xDE, 0x36, 0x7E, 0x06, 0x06, 0x00, 0x00,
1760 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x3C,
1761 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1762 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6C, 0xD8,
1763 0x6C, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1764 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x6C, 0x36,
1765 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1766 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1767 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1768 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1769 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1770 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1771 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1772 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1773 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1774 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1775 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1776 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1777 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1778 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6,
1779 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1780 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1781 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1782 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8,
1783 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1784 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xF6,
1785 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1786 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1787 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1788 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6,
1789 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1790 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xFE,
1791 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1792 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE,
1793 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1794 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1795 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
1797 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1798 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1799 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1800 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1801 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1802 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1803 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1804 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1805 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1807 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1808 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1809 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1810 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1811 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1812 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
1813 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1814 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3F,
1815 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1816 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37,
1817 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1818 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF,
1819 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1820 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7,
1821 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1822 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37,
1823 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1824 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1825 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1826 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7,
1827 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1828 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF,
1829 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1830 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1831 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1832 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1833 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1834 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1835 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1836 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F,
1837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1838 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1840 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F,
1841 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
1843 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1844 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1845 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1846 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF,
1847 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1848 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1849 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1850 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
1851 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1852 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1853 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1854 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1855 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1856 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1857 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1858 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1859 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1860 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1861 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1862 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0xD8, 0xD8,
1863 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1864 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8, 0xFC, 0xC6,
1865 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00, 0x00, 0x00,
1866 0x00, 0x00, 0xFE, 0x66, 0x62, 0x60, 0x60, 0x60,
1867 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00,
1868 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x6C, 0x6C,
1869 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1870 0x00, 0x00, 0xFE, 0xC6, 0x62, 0x30, 0x18, 0x18,
1871 0x30, 0x62, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1872 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xCC,
1873 0xCC, 0xCC, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1874 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1875 0x66, 0x7C, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
1876 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18,
1877 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1878 0x00, 0x00, 0xFE, 0x38, 0x38, 0x6C, 0xC6, 0xC6,
1879 0x6C, 0x38, 0x38, 0xFE, 0x00, 0x00, 0x00, 0x00,
1880 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE,
1881 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
1882 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6,
1883 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00, 0x00, 0x00,
1884 0x00, 0x00, 0x3E, 0x60, 0x60, 0x3C, 0x66, 0xC6,
1885 0xC6, 0xC6, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1886 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB,
1887 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1888 0x00, 0x00, 0x02, 0x06, 0x7C, 0xCE, 0xDE, 0xF6,
1889 0xF6, 0x7C, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00,
1890 0x00, 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C,
1891 0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00,
1892 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1893 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1894 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE,
1895 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1896 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1897 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1898 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18,
1899 0x30, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1900 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18,
1901 0x0C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1902 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1E, 0x1A, 0x18,
1903 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1904 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1905 0x18, 0x18, 0x58, 0x78, 0x30, 0x00, 0x00, 0x00,
1906 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E,
1907 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1908 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1909 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1910 0x00, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1911 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1912 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1913 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1914 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1915 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1916 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18,
1917 0xD8, 0xD8, 0x78, 0x38, 0x18, 0x00, 0x00, 0x00,
1918 0x00, 0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
1919 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1920 0x00, 0x00, 0x70, 0xD8, 0x18, 0x30, 0x60, 0xF8,
1921 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1922 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E,
1923 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1924 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1925 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1930 * Table of supported Video Modes.
1932 * See http://wiki.osdev.org/Drawing_In_Protected_Mode#Locating_Video_Memory
1933 * Values of PageSize taken from DOSBox.
1936 typedef struct _VGA_MODE
1938 PVGA_REGISTERS VgaRegisters
;
1940 WORD CharacterHeight
;
1941 // PCOLORREF Palette;
1942 } VGA_MODE
, *PVGA_MODE
;
1944 static CONST VGA_MODE VideoModes
[BIOS_MAX_VIDEO_MODE
+ 1] =
1946 {&VideoMode_40x25_text
, 0x0800, 16}, /* Mode 00h - 16 color (mono) */
1947 {&VideoMode_40x25_text
, 0x0800, 16}, /* Mode 01h - 16 color */
1948 {&VideoMode_80x25_text
, 0x1000, 16}, /* Mode 02h - 16 color (mono) */
1949 {&VideoMode_80x25_text
, 0x1000, 16}, /* Mode 03h - 16 color */
1950 {&VideoMode_320x200_4color
, 0x4000, 8}, /* Mode 04h - CGA 4 color */
1951 {&VideoMode_320x200_4color
, 0x4000, 8}, /* Mode 05h - CGA same (m) (uses 3rd CGA palette) */
1952 {&VideoMode_640x200_2color
, 0x4000, 8}, /* Mode 06h - CGA 640*200 2 color */
1953 {NULL
, 0x1000, 0}, /* Mode 07h - MDA monochrome text 80*25 */
1954 {NULL
, 0x0000, 0}, /* Mode 08h - PCjr */
1955 {NULL
, 0x0000, 0}, /* Mode 09h - PCjr */
1956 {NULL
, 0x0000, 0}, /* Mode 0Ah - PCjr */
1957 {NULL
, 0x0000, 0}, /* Mode 0Bh - Reserved */
1958 {NULL
, 0x0000, 0}, /* Mode 0Ch - Reserved */
1959 {&VideoMode_320x200_16color
, 0x2000, 8}, /* Mode 0Dh - EGA 320*200 16 color */
1960 {&VideoMode_640x200_16color
, 0x4000, 8}, /* Mode 0Eh - EGA 640*200 16 color */
1961 {NULL
, 0x8000, 0}, /* Mode 0Fh - EGA 640*350 mono */
1962 {&VideoMode_640x350_16color
, 0x8000, 14}, /* Mode 10h - EGA 640*350 HiRes 16 color */
1963 {&VideoMode_640x480_2color
, 0xA000, 16}, /* Mode 11h - VGA 640*480 mono */
1964 {&VideoMode_640x480_16color
, 0xA000, 16}, /* Mode 12h - VGA */
1965 {&VideoMode_320x200_256color
, 0x2000, 8}, /* Mode 13h - VGA */
1968 #define IS_TEXT_MODE(ModeNumber) \
1969 (((ModeNumber) >= 0x00 && (ModeNumber) <= 0x03) || ((ModeNumber) == 0x07))
1971 static PVGA_STATIC_FUNC_TABLE VgaStaticFuncTable
;
1972 static BOOLEAN VbeInitialized
= FALSE
;
1974 /* PRIVATE FUNCTIONS **********************************************************/
1976 static BOOLEAN
VidBiosScrollWindow(SCROLL_DIRECTION Direction
,
1978 SMALL_RECT Rectangle
,
1983 DWORD VideoAddress
= TO_LINEAR(TEXT_VIDEO_SEG
, Page
* Bda
->VideoPageSize
);
1984 WORD FillCharacter
= MAKEWORD(' ', FillAttribute
);
1986 WORD WindowWidth
, WindowHeight
;
1988 /* Fixup the rectangle if needed */
1989 Rectangle
.Left
= min(max(Rectangle
.Left
, 0), Bda
->ScreenColumns
- 1);
1990 Rectangle
.Right
= min(max(Rectangle
.Right
, 0), Bda
->ScreenColumns
- 1);
1991 Rectangle
.Top
= min(max(Rectangle
.Top
, 0), Bda
->ScreenRows
);
1992 Rectangle
.Bottom
= min(max(Rectangle
.Bottom
, 0), Bda
->ScreenRows
);
1994 WindowWidth
= Rectangle
.Right
- Rectangle
.Left
+ 1;
1995 WindowHeight
= Rectangle
.Bottom
- Rectangle
.Top
+ 1;
1997 /* Amount == 0 means we clear all the rectangle */
1998 if ((Amount
== 0) ||
1999 (((Direction
== SCROLL_UP
) || (Direction
== SCROLL_DOWN
)) && (Amount
>= WindowHeight
)) ||
2000 (((Direction
== SCROLL_LEFT
) || (Direction
== SCROLL_RIGHT
)) && (Amount
>= WindowWidth
)))
2002 /* Fill the rectangle */
2003 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2005 for (j
= Rectangle
.Left
; j
<= Rectangle
.Right
; j
++)
2007 EmulatorWriteMemory(&EmulatorContext
,
2008 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2009 (LPVOID
)&FillCharacter
,
2010 sizeof(FillCharacter
));
2021 /* Move text lines up */
2022 for (i
= Rectangle
.Top
+ Amount
; i
<= Rectangle
.Bottom
; i
++)
2024 EmulatorWriteMemory(&EmulatorContext
,
2025 VideoAddress
+ ((i
- Amount
) * Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
),
2026 REAL_TO_PHYS(VideoAddress
+ ( i
* Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
)),
2027 (Rectangle
.Right
- Rectangle
.Left
+ 1) * sizeof(WORD
));
2030 /* Fill the bottom of the rectangle */
2031 for (i
= Rectangle
.Bottom
- Amount
+ 1; i
<= Rectangle
.Bottom
; i
++)
2033 for (j
= Rectangle
.Left
; j
<= Rectangle
.Right
; j
++)
2035 EmulatorWriteMemory(&EmulatorContext
,
2036 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2037 (LPVOID
)&FillCharacter
,
2038 sizeof(FillCharacter
));
2049 /* Move text lines down */
2050 for (i
= Rectangle
.Bottom
- Amount
; i
>= Rectangle
.Top
; i
--)
2052 EmulatorWriteMemory(&EmulatorContext
,
2053 VideoAddress
+ ((i
+ Amount
) * Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
),
2054 REAL_TO_PHYS(VideoAddress
+ ( i
* Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
)),
2055 (Rectangle
.Right
- Rectangle
.Left
+ 1) * sizeof(WORD
));
2058 /* Fill the top of the rectangle */
2059 Bottom
= Rectangle
.Top
+ Amount
- 1;
2060 for (i
= Rectangle
.Top
; i
<= Bottom
; i
++)
2062 for (j
= Rectangle
.Left
; j
<= Rectangle
.Right
; j
++)
2064 EmulatorWriteMemory(&EmulatorContext
,
2065 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2066 (LPVOID
)&FillCharacter
,
2067 sizeof(FillCharacter
));
2076 /* Move text lines left */
2077 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2079 EmulatorWriteMemory(&EmulatorContext
,
2080 VideoAddress
+ (i
* Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
),
2081 REAL_TO_PHYS(VideoAddress
+ (i
* Bda
->ScreenColumns
+ Rectangle
.Left
+ Amount
) * sizeof(WORD
)),
2082 (Rectangle
.Right
- Rectangle
.Left
- Amount
+ 1) * sizeof(WORD
));
2085 /* Fill the right of the rectangle */
2086 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2088 for (j
= Rectangle
.Right
- Amount
+ 1; j
<= Rectangle
.Right
; j
++)
2090 EmulatorWriteMemory(&EmulatorContext
,
2091 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2092 (LPVOID
)&FillCharacter
,
2093 sizeof(FillCharacter
));
2102 /* Move text lines right */
2103 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2105 EmulatorWriteMemory(&EmulatorContext
,
2106 VideoAddress
+ (i
* Bda
->ScreenColumns
+ Rectangle
.Left
+ Amount
) * sizeof(WORD
),
2107 REAL_TO_PHYS(VideoAddress
+ (i
* Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
)),
2108 (Rectangle
.Right
- Rectangle
.Left
- Amount
+ 1) * sizeof(WORD
));
2111 /* Fill the left of the rectangle */
2112 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2114 INT Right
= Rectangle
.Left
+ Amount
- 1;
2115 for (j
= Rectangle
.Left
; j
<= Right
; j
++)
2117 EmulatorWriteMemory(&EmulatorContext
,
2118 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2119 (LPVOID
)&FillCharacter
,
2120 sizeof(FillCharacter
));
2131 static __inline VOID
VgaSetSinglePaletteRegister(BYTE Index
, BYTE Value
)
2133 /* Write the index */
2134 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2135 IOWriteB(VGA_AC_INDEX
, Index
);
2137 /* Write the data */
2138 IOWriteB(VGA_AC_WRITE
, Value
);
2141 static BOOLEAN
VgaSetRegisters(PVGA_REGISTERS Registers
)
2145 if (Registers
== NULL
) return FALSE
;
2147 /* Disable interrupts */
2151 * Set the CRT base address according to the selected mode,
2152 * monochrome or color. The following macros:
2153 * VGA_INSTAT1_READ, VGA_CRTC_INDEX and VGA_CRTC_DATA are then
2154 * used to access the correct VGA I/O ports.
2156 Bda
->CrtBasePort
= (Registers
->Misc
& 0x01) ? VGA_CRTC_INDEX_COLOR
2157 : VGA_CRTC_INDEX_MONO
;
2158 /* Bit 1 indicates whether display is color (0) or monochrome (1) */
2159 Bda
->VGAOptions
= (Bda
->VGAOptions
& 0xFD) | (!(Registers
->Misc
& 0x01) << 1);
2160 Bda
->CrtModeControl
= (Bda
->CrtModeControl
& 0xFB) | (!(Registers
->Misc
& 0x01) << 1);
2162 /* Update blink bit in BDA */
2163 if (Registers
->Attribute
[VGA_AC_CONTROL_REG
] & VGA_AC_CONTROL_BLINK
)
2164 Bda
->CrtModeControl
|= (1 << 5);
2166 Bda
->CrtModeControl
&= ~(1 << 5);
2168 /* Turn the video off */
2169 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_CLOCK_REG
);
2170 IOWriteB(VGA_SEQ_DATA
, IOReadB(VGA_SEQ_DATA
) | VGA_SEQ_CLOCK_SD
);
2172 /* Write the misc register */
2173 IOWriteB(VGA_MISC_WRITE
, Registers
->Misc
);
2175 /* Synchronous reset on */
2176 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_RESET_REG
);
2177 IOWriteB(VGA_SEQ_DATA
, VGA_SEQ_RESET_AR
);
2179 /* Write the sequencer registers */
2180 for (i
= 1; i
< VGA_SEQ_MAX_REG
; i
++)
2182 IOWriteB(VGA_SEQ_INDEX
, i
);
2183 IOWriteB(VGA_SEQ_DATA
, Registers
->Sequencer
[i
]);
2186 /* Synchronous reset off */
2187 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_RESET_REG
);
2188 IOWriteB(VGA_SEQ_DATA
, VGA_SEQ_RESET_SR
| VGA_SEQ_RESET_AR
);
2190 /* Unlock CRTC registers 0-7 */
2191 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_END_HORZ_BLANKING_REG
);
2192 IOWriteB(VGA_CRTC_DATA
, IOReadB(VGA_CRTC_DATA
) | 0x80);
2193 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_VERT_RETRACE_END_REG
);
2194 IOWriteB(VGA_CRTC_DATA
, IOReadB(VGA_CRTC_DATA
) & ~0x80);
2195 // Make sure they remain unlocked
2196 Registers
->CRT
[VGA_CRTC_END_HORZ_BLANKING_REG
] |= 0x80;
2197 Registers
->CRT
[VGA_CRTC_VERT_RETRACE_END_REG
] &= ~0x80;
2199 /* Write the CRTC registers */
2200 for (i
= 0; i
< VGA_CRTC_MAX_REG
; i
++)
2202 IOWriteB(VGA_CRTC_INDEX
, i
);
2203 IOWriteB(VGA_CRTC_DATA
, Registers
->CRT
[i
]);
2206 /* Write the GC registers */
2207 for (i
= 0; i
< VGA_GC_MAX_REG
; i
++)
2209 IOWriteB(VGA_GC_INDEX
, i
);
2210 IOWriteB(VGA_GC_DATA
, Registers
->Graphics
[i
]);
2213 /* Write the AC registers */
2214 for (i
= 0; i
< VGA_AC_MAX_REG
; i
++)
2216 VgaSetSinglePaletteRegister(i
, Registers
->Attribute
[i
]);
2219 /* Set the PEL mask */
2220 IOWriteB(VGA_DAC_MASK
, 0xFF);
2222 /* Enable screen and disable palette access */
2223 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2224 IOWriteB(VGA_AC_INDEX
, 0x20);
2226 /* Turn the video on */
2227 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_CLOCK_REG
);
2228 IOWriteB(VGA_SEQ_DATA
, IOReadB(VGA_SEQ_DATA
) & ~VGA_SEQ_CLOCK_SD
);
2230 /* Enable interrupts */
2236 static VOID
VgaSetPalette(const COLORREF
* Palette
, ULONG Size
)
2240 // /* Disable screen and enable palette access */
2241 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2242 // IOWriteB(VGA_AC_INDEX, 0x00);
2244 for (i
= 0; i
< Size
; i
++)
2246 IOWriteB(VGA_DAC_WRITE_INDEX
, i
);
2247 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(GetRValue(Palette
[i
])));
2248 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(GetGValue(Palette
[i
])));
2249 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(GetBValue(Palette
[i
])));
2252 /* The following step might be optional */
2253 for (i
= Size
; i
< VGA_MAX_COLORS
; i
++)
2255 IOWriteB(VGA_DAC_WRITE_INDEX
, i
);
2256 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(0x00));
2257 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(0x00));
2258 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(0x00));
2261 /* Enable screen and disable palette access */
2262 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2263 // IOWriteB(VGA_AC_INDEX, 0x20);
2266 static VOID
VgaChangePalette(BYTE ModeNumber
)
2268 const COLORREF
* Palette
;
2271 if (ModeNumber
>= 0x13)
2274 Palette
= VgaPalette
;
2275 Size
= ARRAYSIZE(VgaPalette
);
2277 else if (ModeNumber
== 0x10) // || (ModeNumber == 0x0D) || (ModeNumber == 0x0E)
2279 /* EGA HiRes mode */
2280 Palette
= EgaPalette__HiRes
;
2281 Size
= ARRAYSIZE(EgaPalette__HiRes
);
2284 else if ((ModeNumber
== 0x04) || (ModeNumber
== 0x05))
2287 * CGA modes; this palette contains both normal and
2288 * bright versions of CGA palettes 0 and 1
2290 Palette
= CgaPalette2
;
2291 Size
= ARRAYSIZE(CgaPalette2
);
2294 else // if ((ModeNumber == 0x0D) || (ModeNumber == 0x0E))
2297 Palette
= EgaPalette__16Colors
;
2298 Size
= ARRAYSIZE(EgaPalette__16Colors
);
2301 VgaSetPalette(Palette
, Size
);
2304 static __inline VOID
VidBiosGetCursorPosition(PBYTE Row
, PBYTE Column
, BYTE Page
)
2306 *Row
= HIBYTE(Bda
->CursorPosition
[Page
]);
2307 *Column
= LOBYTE(Bda
->CursorPosition
[Page
]);
2310 static VOID
VidBiosSetCursorPosition(BYTE Row
, BYTE Column
, BYTE Page
)
2312 /* Update the position in the BDA */
2313 Bda
->CursorPosition
[Page
] = MAKEWORD(Column
, Row
);
2315 /* Check if this is the current video page */
2316 if (Page
== Bda
->VideoPage
)
2318 WORD Offset
= Row
* Bda
->ScreenColumns
+ Column
;
2320 /* Modify the CRTC registers */
2321 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_LOW_REG
);
2322 IOWriteB(VGA_CRTC_DATA
, LOBYTE(Offset
));
2323 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_HIGH_REG
);
2324 IOWriteB(VGA_CRTC_DATA
, HIBYTE(Offset
));
2328 static VOID
VidBiosSetCursorShape(WORD CursorStartEnd
)
2330 /* Only valid in text-mode */
2331 if (!IS_TEXT_MODE(Bda
->VideoMode
)) return;
2333 /* Update the BDA */
2334 Bda
->CursorStartLine
= HIBYTE(CursorStartEnd
) & 0x1F;
2335 Bda
->CursorEndLine
= LOBYTE(CursorStartEnd
) & 0x1F;
2338 * In cursor emulation mode, we suppose the cursor scanlines
2339 * to be in CGA mode, so that we need to adjust them
2343 * Contrary to what is mentioned in lots of literature out there, e.g. in:
2344 * http://webpages.charter.net/danrollins/techhelp/0072.HTM
2345 * http://www.bioscentral.com/misc/bda.htm
2346 * and in other various places, bit 0 of Bda->VGAOptions is 0 when
2347 * cursor emulation is ENABLED, and is 1 when it is DISABLED.
2349 * The following documentation is right about this fact:
2350 * http://www.cs.nyu.edu/~mwalfish/classes/ut/s12-cs372h/ref/hardware/vgadoc/VGABIOS.TXT
2351 * https://sites.google.com/site/pcdosretro/biosdata
2353 * A proof that it is OK is that in the following code samples it is
2354 * explicitely mentioned that setting bit 0 disables cursor emulation:
2355 * - Code snippets in PC Magazine vol.5 num.15 of 16/09/1986, p.291-292;
2356 * - CardFile DOS utility (Jeff Prosise, PC Magazine vol.6 num.17 of 13/10/1987, p.403-416):
2357 * https://ia600700.us.archive.org/1/items/srccode-00000020/cardfile.asm.txt
2358 * (function 'show_cursor', "or ega_info,1 ;disable EGA cursor emulation")
2360 if (!(Bda
->VGAOptions
& 0x01))
2362 // HACK: Quick "fix" for cursor scanline adjustment. This must be reworked.
2363 DPRINT1("HACK: Using HACK for cursor scanlines adjustment\n");
2364 CursorStartEnd
= MAKEWORD((LOBYTE(CursorStartEnd
) & 0x1F) * 2,
2365 (HIBYTE(CursorStartEnd
) & 0x1F) * 2 | (HIBYTE(CursorStartEnd
) & 0xE0));
2368 /* Modify the CRTC registers */
2369 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_START_REG
);
2370 IOWriteB(VGA_CRTC_DATA
, HIBYTE(CursorStartEnd
));
2371 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_END_REG
);
2372 IOWriteB(VGA_CRTC_DATA
, LOBYTE(CursorStartEnd
));
2375 VOID
VidBiosSyncCursorPosition(VOID
)
2379 SHORT ScreenColumns
= VgaGetDisplayResolution().X
;
2382 /* Get the cursor position */
2383 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_LOW_REG
);
2384 Low
= IOReadB(VGA_CRTC_DATA
);
2385 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_HIGH_REG
);
2386 High
= IOReadB(VGA_CRTC_DATA
);
2388 Offset
= MAKEWORD(Low
, High
);
2390 Row
= (BYTE
)(Offset
/ ScreenColumns
);
2391 Column
= (BYTE
)(Offset
% ScreenColumns
);
2393 /* Synchronize our cursor position with VGA */
2394 VidBiosSetCursorPosition(Row
, Column
, Bda
->VideoPage
);
2397 static inline BYTE
VidBiosGetVideoMode(VOID
)
2399 /* Bit 7 of VideoMode is determined by bit 7 of VGAOptions */
2400 return Bda
->VideoMode
| (Bda
->VGAOptions
& 0x80);
2403 static inline VOID
VidBiosClearScreen(VOID
)
2405 static const DWORD MemoryMaps
[4] = { 0xA0000, 0xA0000, 0xB0000, 0xB8000 };
2406 static const DWORD MemorySizes
[4] = { 0x20000, 0x10000, 0x08000, 0x08000 };
2411 BYTE Buffer
[0x20000];
2413 /* Read the misc register */
2414 IOWriteB(VGA_GC_INDEX
, VGA_GC_MISC_REG
);
2415 Misc
= IOReadB(VGA_GC_DATA
);
2417 /* Get the video address and buffer size */
2418 VideoAddress
= MemoryMaps
[(Misc
>> 2) & 3];
2419 BufferSize
= MemorySizes
[(Misc
>> 2) & 3];
2421 // !IS_TEXT_MODE(Bda->VideoMode)
2425 RtlZeroMemory(Buffer
, BufferSize
);
2431 for (i
= 0; i
< (BufferSize
>> 1); i
++)
2433 ((PWORD
)Buffer
)[i
] = MAKEWORD(' ', DEFAULT_ATTRIBUTE
);
2437 /* Write to video memory */
2438 EmulatorWriteMemory(&EmulatorContext
, VideoAddress
, Buffer
, BufferSize
);
2441 static BOOLEAN
VidBiosSetVideoMode(BYTE ModeNumber
)
2445 BYTE OrgModeNumber
= ModeNumber
;
2448 * IBM standard modes do not clear the screen if the
2449 * high bit of AL is set (EGA or higher only).
2450 * See Ralf Brown: http://www.ctyme.com/intr/rb-0069.htm
2451 * for more information.
2453 BOOLEAN DoNotClear
= !!(ModeNumber
& 0x80);
2455 /* Retrieve the real mode number and check its validity */
2457 // if (ModeNumber >= ARRAYSIZE(VideoModes))
2458 if (ModeNumber
> BIOS_MAX_VIDEO_MODE
)
2460 DPRINT1("VidBiosSetVideoMode -- Mode %02Xh invalid\n", ModeNumber
);
2464 DPRINT1("Switching to mode %02Xh (%02Xh) %s clearing the screen; VgaRegisters = 0x%p\n",
2465 ModeNumber
, OrgModeNumber
, (DoNotClear
? "without" : "and"), VideoModes
[ModeNumber
].VgaRegisters
);
2467 if (!VgaSetRegisters(VideoModes
[ModeNumber
].VgaRegisters
)) return FALSE
;
2469 VgaChangePalette(ModeNumber
);
2471 /* Clear the VGA memory if needed */
2472 if (!DoNotClear
) VgaClearMemory();
2474 /* Update the values in the BDA */
2475 Bda
->VideoMode
= ModeNumber
;
2476 Bda
->VideoPageSize
= VideoModes
[ModeNumber
].PageSize
;
2478 Bda
->VideoPageOffset
= Bda
->VideoPage
* Bda
->VideoPageSize
;
2480 /* 256 KB Video RAM; set bit 7 if we do not clear the screen */
2481 Bda
->VGAOptions
= 0x60 | (Bda
->VGAOptions
& 0x7F) | (DoNotClear
? 0x80 : 0x00);
2482 Bda
->VGASwitches
= 0xF9; /* High-resolution */
2485 // Bda->CrtModeControl;
2486 // Bda->CrtColorPaletteMask;
2488 /* Set the start address in the CRTC */
2489 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_LOW_REG
);
2490 IOWriteB(VGA_CRTC_DATA
, LOBYTE(Bda
->VideoPageOffset
));
2491 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_HIGH_REG
);
2492 IOWriteB(VGA_CRTC_DATA
, HIBYTE(Bda
->VideoPageOffset
));
2494 /* Update the screen size */
2495 Resolution
= VgaGetDisplayResolution();
2496 Bda
->ScreenColumns
= Resolution
.X
;
2497 Bda
->ScreenRows
= Resolution
.Y
- 1;
2499 /* Adjust the number of columns for graphics modes */
2500 if (!IS_TEXT_MODE(ModeNumber
)) Bda
->ScreenColumns
>>= 3;
2502 /* Update the current font */
2503 Bda
->CharacterHeight
= VideoModes
[ModeNumber
].CharacterHeight
;
2504 switch (Bda
->CharacterHeight
)
2507 * Write the default font to the VGA font plane for text-modes only.
2508 * Update the BIOS INT 43h vector (far pointer to the character range 00h-...).
2512 if (IS_TEXT_MODE(ModeNumber
))
2513 VgaWriteTextModeFont(0, Font8x8
, ARRAYSIZE(Font8x8
) / VGA_FONT_CHARACTERS
);
2515 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x8_OFFSET
, VIDEO_BIOS_DATA_SEG
);
2520 if (IS_TEXT_MODE(ModeNumber
))
2521 VgaWriteTextModeFont(0, Font8x14
, ARRAYSIZE(Font8x14
) / VGA_FONT_CHARACTERS
);
2523 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x14_OFFSET
, VIDEO_BIOS_DATA_SEG
);
2528 if (IS_TEXT_MODE(ModeNumber
))
2529 VgaWriteTextModeFont(0, Font8x16
, ARRAYSIZE(Font8x16
) / VGA_FONT_CHARACTERS
);
2531 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x16_OFFSET
, VIDEO_BIOS_DATA_SEG
);
2536 #if 0 // Commented, because I need to think about how to change correctly the ScreenRows
2537 // in the code that really use it (the Font generator functions of INT 10h, AH=11h)
2538 // so that it also changes the screen resolution *in text mode only*.
2541 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
2542 case 0x01: Bda
->ScreenRows
= 13; break;
2543 case 0x03: Bda
->ScreenRows
= 42; break;
2545 default : Bda
->ScreenRows
= 24; break;
2550 * Update the cursor shape (text-mode only).
2551 * Use the default CGA cursor scanline values,
2552 * see: http://vitaly_filatov.tripod.com/ng/asm/asm_023.2.html
2554 if (IS_TEXT_MODE(ModeNumber
))
2555 // FIXME: we might read the CRT registers and do the adjustment?
2556 VidBiosSetCursorShape(MAKEWORD(0x07, 0x06));
2558 /* Set the cursor position for each page */
2559 for (Page
= 0; Page
< BIOS_MAX_PAGES
; ++Page
)
2560 VidBiosSetCursorPosition(0, 0, Page
);
2562 if (!DoNotClear
) VidBiosClearScreen();
2564 /* Refresh display */
2565 VgaRefreshDisplay();
2570 static BOOLEAN
VidBiosSetVideoPage(BYTE PageNumber
)
2574 /* Check if the page exists */
2575 if (PageNumber
>= BIOS_MAX_PAGES
) return FALSE
;
2577 /* Check if this is the same page */
2578 if (PageNumber
== Bda
->VideoPage
) return TRUE
;
2580 /* Update the values in the BDA */
2581 Bda
->VideoPage
= PageNumber
;
2582 Bda
->VideoPageOffset
= Bda
->VideoPage
* Bda
->VideoPageSize
;
2584 /* Set the start address in the CRTC */
2585 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_LOW_REG
);
2586 IOWriteB(VGA_CRTC_DATA
, LOBYTE(Bda
->VideoPageOffset
));
2587 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_HIGH_REG
);
2588 IOWriteB(VGA_CRTC_DATA
, HIBYTE(Bda
->VideoPageOffset
));
2591 * Get the cursor position (we don't update anything on the BIOS side
2592 * but we update the cursor position on the VGA side).
2594 VidBiosGetCursorPosition(&Row
, &Column
, PageNumber
);
2595 VidBiosSetCursorPosition(Row
, Column
, PageNumber
);
2600 static VOID
VidBiosDrawGlyph(WORD CharData
, BOOLEAN UseAttr
, BYTE Page
, BYTE Row
, BYTE Column
)
2602 switch (Bda
->VideoMode
)
2604 /* Alphanumeric mode */
2611 EmulatorWriteMemory(&EmulatorContext
,
2612 TO_LINEAR(TEXT_VIDEO_SEG
,
2613 Page
* Bda
->VideoPageSize
+
2614 (Row
* Bda
->ScreenColumns
+ Column
) * sizeof(WORD
)),
2616 UseAttr
? sizeof(WORD
) : sizeof(BYTE
));
2625 WORD CgaSegment
[] = { CGA_EVEN_VIDEO_SEG
, CGA_ODD_VIDEO_SEG
};
2626 PUCHAR Font
= (PUCHAR
)FAR_POINTER(((PULONG
)BaseAddress
)[0x43]);
2627 PUCHAR Glyph
= &Font
[LOBYTE(CharData
) * Bda
->CharacterHeight
];
2628 BOOLEAN Xor
= (HIBYTE(CharData
) & 0x80) ? TRUE
: FALSE
;
2630 BYTE DoubledBits
[] =
2632 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,
2633 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF
2638 /* Set the logical operation to XOR */
2639 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2640 OldRotate
= IOReadB(VGA_GC_DATA
);
2641 IOWriteB(VGA_GC_DATA
, OldRotate
| 0x18);
2644 for (i
= 0; i
< Bda
->CharacterHeight
; i
++)
2646 WORD Pixel
= MAKEWORD(DoubledBits
[Glyph
[i
] >> 4],
2647 DoubledBits
[Glyph
[i
] & 0x0F]);
2652 /* Read from VGA memory to load the latch register */
2653 EmulatorReadMemory(&EmulatorContext
,
2654 TO_LINEAR(CgaSegment
[(Row
* Bda
->CharacterHeight
+ i
) & 1],
2655 (((Row
* Bda
->CharacterHeight
+ i
) >> 1)
2656 * Bda
->ScreenColumns
+ Column
) * 2),
2661 EmulatorWriteMemory(&EmulatorContext
,
2662 TO_LINEAR(CgaSegment
[(Row
* Bda
->CharacterHeight
+ i
) & 1],
2663 (((Row
* Bda
->CharacterHeight
+ i
) >> 1)
2664 * Bda
->ScreenColumns
+ Column
) * 2),
2671 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2672 IOWriteB(VGA_GC_DATA
, OldRotate
);
2682 WORD CgaSegment
[] = { CGA_EVEN_VIDEO_SEG
, CGA_ODD_VIDEO_SEG
};
2683 PUCHAR Font
= (PUCHAR
)FAR_POINTER(((PULONG
)BaseAddress
)[0x43]);
2684 PUCHAR Glyph
= &Font
[LOBYTE(CharData
) * Bda
->CharacterHeight
];
2685 BOOLEAN Xor
= (HIBYTE(CharData
) & 0x80) ? TRUE
: FALSE
;
2690 /* Set the logical operation to XOR */
2691 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2692 OldRotate
= IOReadB(VGA_GC_DATA
);
2693 IOWriteB(VGA_GC_DATA
, OldRotate
| 0x18);
2696 for (i
= 0; i
< Bda
->CharacterHeight
; i
++)
2702 /* Read from VGA memory to load the latch register */
2703 EmulatorReadMemory(&EmulatorContext
,
2704 TO_LINEAR(CgaSegment
[(Row
* Bda
->CharacterHeight
+ i
) & 1],
2705 (((Row
* Bda
->CharacterHeight
+ i
) >> 1)
2706 * Bda
->ScreenColumns
) + Column
),
2711 EmulatorWriteMemory(&EmulatorContext
,
2712 TO_LINEAR(CgaSegment
[(Row
* Bda
->CharacterHeight
+ i
) & 1],
2713 (((Row
* Bda
->CharacterHeight
+ i
) >> 1)
2714 * Bda
->ScreenColumns
) + Column
),
2721 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2722 IOWriteB(VGA_GC_DATA
, OldRotate
);
2728 /* 16-color modes */
2736 PUCHAR Font
= (PUCHAR
)FAR_POINTER(((PULONG
)BaseAddress
)[0x43]);
2737 PUCHAR Glyph
= &Font
[LOBYTE(CharData
) * Bda
->CharacterHeight
];
2738 BOOLEAN Xor
= (HIBYTE(CharData
) & 0x80) ? TRUE
: FALSE
;
2739 BYTE OldPlaneWrite
, OldReset
, OldEnableReset
, OldRotate
, OldMode
;
2741 /* Write to all planes */
2742 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_MASK_REG
);
2743 OldPlaneWrite
= IOReadB(VGA_SEQ_DATA
);
2744 IOWriteB(VGA_SEQ_DATA
, 0x0F);
2746 /* Zero the planes whose bits are set in the enable set/reset register */
2747 IOWriteB(VGA_GC_INDEX
, VGA_GC_RESET_REG
);
2748 OldReset
= IOReadB(VGA_GC_DATA
);
2749 IOWriteB(VGA_GC_DATA
, 0x00);
2751 /* Set the enable set/reset register to the inverse of the color */
2752 IOWriteB(VGA_GC_INDEX
, VGA_GC_ENABLE_RESET_REG
);
2753 OldEnableReset
= IOReadB(VGA_GC_DATA
);
2754 IOWriteB(VGA_GC_DATA
, (~HIBYTE(CharData
)) & 0x0F);
2756 /* Make sure we're in write mode 0 */
2757 IOWriteB(VGA_GC_INDEX
, VGA_GC_MODE_REG
);
2758 OldMode
= IOReadB(VGA_GC_DATA
);
2759 IOWriteB(VGA_GC_DATA
, 0x00);
2763 /* Set the logical operation to XOR */
2764 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2765 OldRotate
= IOReadB(VGA_GC_DATA
);
2766 IOWriteB(VGA_GC_DATA
, OldRotate
| 0x18);
2769 for (i
= 0; i
< Bda
->CharacterHeight
; i
++)
2775 /* Read from VGA memory to load the latch register */
2776 EmulatorReadMemory(&EmulatorContext
,
2777 TO_LINEAR(GRAPHICS_VIDEO_SEG
,
2778 ((Row
* Bda
->CharacterHeight
+ i
)
2779 * Bda
->ScreenColumns
) + Column
),
2784 EmulatorWriteMemory(&EmulatorContext
,
2785 TO_LINEAR(GRAPHICS_VIDEO_SEG
,
2786 ((Row
* Bda
->CharacterHeight
+ i
)
2787 * Bda
->ScreenColumns
) + Column
),
2792 /* Restore the registers */
2793 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_MASK_REG
);
2794 IOWriteB(VGA_SEQ_DATA
, OldPlaneWrite
);
2795 IOWriteB(VGA_GC_INDEX
, VGA_GC_RESET_REG
);
2796 IOWriteB(VGA_GC_DATA
, OldReset
);
2797 IOWriteB(VGA_GC_INDEX
, VGA_GC_ENABLE_RESET_REG
);
2798 IOWriteB(VGA_GC_DATA
, OldEnableReset
);
2799 IOWriteB(VGA_GC_INDEX
, VGA_GC_MODE_REG
);
2800 IOWriteB(VGA_GC_DATA
, OldMode
);
2804 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2805 IOWriteB(VGA_GC_DATA
, OldRotate
);
2811 /* 256-color mode */
2815 PUCHAR Font
= (PUCHAR
)FAR_POINTER(((PULONG
)BaseAddress
)[0x43]);
2816 PUCHAR Glyph
= &Font
[LOBYTE(CharData
) * Bda
->CharacterHeight
];
2817 BYTE PixelBuffer
[8];
2819 for (i
= 0; i
< Bda
->CharacterHeight
; i
++)
2821 for (j
= 0; j
< 8; j
++)
2823 PixelBuffer
[j
] = (Glyph
[i
] & (1 << (7 - j
))) ? HIBYTE(CharData
) : 0;
2826 EmulatorWriteMemory(&EmulatorContext
,
2827 TO_LINEAR(GRAPHICS_VIDEO_SEG
,
2828 ((Row
* Bda
->CharacterHeight
+ i
)
2829 * Bda
->ScreenColumns
+ Column
) << 3),
2830 (LPVOID
)PixelBuffer
,
2831 sizeof(PixelBuffer
));
2839 DPRINT1("Drawing glyphs in mode %02Xh is not supported.\n", Bda
->VideoMode
);
2844 static VOID
VidBiosPrintCharacter(CHAR Character
, BYTE Attribute
, BOOLEAN UseAttr
, BYTE Page
)
2846 WORD CharData
= MAKEWORD(Character
, Attribute
);
2849 /* Get the cursor position */
2850 VidBiosGetCursorPosition(&Row
, &Column
, Page
);
2852 if (Character
== '\a')
2854 /* Bell control character */
2855 // NOTE: We may use what the terminal emulator offers to us...
2859 else if (Character
== '\b')
2861 /* Backspace control character */
2868 Column
= Bda
->ScreenColumns
- 1;
2872 /* Erase the existing character */
2873 CharData
= MAKEWORD(' ', Attribute
);
2874 VidBiosDrawGlyph(CharData
, UseAttr
, Page
, Row
, Column
);
2876 else if (Character
== '\t')
2878 /* Horizontal Tabulation control character */
2881 // Taken from DOSBox
2882 VidBiosPrintCharacter(' ', Attribute
, UseAttr
, Page
);
2883 VidBiosGetCursorPosition(&Row
, &Column
, Page
);
2884 } while (Column
% 8);
2886 else if (Character
== '\n')
2888 /* Line Feed control character */
2891 else if (Character
== '\r')
2893 /* Carriage Return control character */
2898 /* Default character */
2900 /* Write the character and advance the cursor */
2901 VidBiosDrawGlyph(CharData
, UseAttr
, Page
, Row
, Column
);
2905 /* Check if it passed the end of the row */
2906 if (Column
>= Bda
->ScreenColumns
)
2908 /* Return to the first column and go to the next line */
2913 /* Scroll the screen up if needed */
2914 if (Row
> Bda
->ScreenRows
)
2916 /* The screen must be scrolled up */
2917 SMALL_RECT Rectangle
= { 0, 0, Bda
->ScreenColumns
- 1, Bda
->ScreenRows
};
2918 VidBiosScrollWindow(SCROLL_UP
, 1, Rectangle
, Page
, DEFAULT_ATTRIBUTE
/*Attribute*/);
2922 /* Set the cursor position */
2923 VidBiosSetCursorPosition(Row
, Column
, Page
);
2926 /* PUBLIC FUNCTIONS ***********************************************************/
2928 VOID WINAPI
VidBiosVideoService(LPWORD Stack
)
2932 /* Set Video Mode */
2935 VidBiosSetVideoMode(getAL());
2939 /* Set Text-Mode Cursor Shape */
2942 VidBiosSetCursorShape(getCX());
2946 /* Set Cursor Position */
2949 BYTE Page
= getBH();
2951 /* Validate the selected video page */
2952 if (Page
>= BIOS_MAX_PAGES
) break;
2954 VidBiosSetCursorPosition(getDH(), getDL(), Page
);
2958 /* Get Cursor Position and Shape */
2961 BYTE Page
= getBH();
2963 /* Validate the selected video page */
2964 if (Page
== 0xFF) // Special case: use the current video page
2965 Page
= Bda
->VideoPage
;
2966 else if (Page
>= BIOS_MAX_PAGES
)
2969 /* Return the result */
2970 setCX(MAKEWORD(Bda
->CursorEndLine
, Bda
->CursorStartLine
));
2971 setDX(Bda
->CursorPosition
[Page
]);
2975 /* Query Light Pen */
2979 * On modern BIOSes, this function returns 0
2980 * so that we can ignore the other registers.
2986 /* Select Active Display Page */
2989 VidBiosSetVideoPage(getAL());
2993 /* Scroll Window Up/Down */
2997 SMALL_RECT Rectangle
= { getCL(), getCH(), getDL(), getDH() };
2999 VidBiosScrollWindow((getAH() == 0x06) ? SCROLL_UP
: SCROLL_DOWN
,
3000 getAL(), Rectangle
, Bda
->VideoPage
, getBH());
3005 /* Read Character and Attribute at Cursor Position */
3009 BYTE Page
= getBH();
3012 /* Validate the selected video page */
3013 if (Page
== 0xFF) // Special case: use the current video page
3014 Page
= Bda
->VideoPage
;
3015 else if (Page
>= BIOS_MAX_PAGES
)
3018 /* Find the offset of the character */
3019 Offset
= Page
* Bda
->VideoPageSize
+
3020 (HIBYTE(Bda
->CursorPosition
[Page
]) * Bda
->ScreenColumns
+
3021 LOBYTE(Bda
->CursorPosition
[Page
])) * 2;
3023 /* Read from the video memory */
3024 EmulatorReadMemory(&EmulatorContext
,
3025 TO_LINEAR(TEXT_VIDEO_SEG
, Offset
),
3029 /* Return the character data in AX */
3035 /* Write Character and Attribute at Cursor Position */
3037 /* Write Character only (PCjr: + Attribute) at Cursor Position */
3040 WORD Counter
= getCX();
3041 WORD CharData
= MAKEWORD(getAL(), getBL());
3042 BOOLEAN UseAttr
= (getAH() == 0x09);
3043 BYTE Page
= getBH();
3046 /* Validate the selected video page */
3047 if (Page
== 0xFF) // Special case: use the current video page
3048 Page
= Bda
->VideoPage
;
3049 else if (Page
>= BIOS_MAX_PAGES
)
3052 /* Get the cursor position */
3053 VidBiosGetCursorPosition(&Row
, &Column
, Page
);
3055 /* Write to video memory a certain number of times */
3056 while (Counter
-- > 0)
3058 /* Write the character and advance the position */
3059 VidBiosDrawGlyph(CharData
, UseAttr
, Page
, Row
, Column
);
3062 /* Check if it passed the end of the row */
3063 if (Column
>= Bda
->ScreenColumns
)
3065 /* Return to the first column and go to the next line */
3070 /* Contrary to the "Teletype Output" function, the screen is not scrolled */
3071 if (Row
> Bda
->ScreenRows
)
3073 Row
= Bda
->ScreenRows
;
3080 /* Set Video Colors */
3083 if (Bda
->VideoMode
< 0x04 || Bda
->VideoMode
> 0x06)
3085 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X is unsupported for non-CGA modes\n",
3092 case 0x00: /* Set Background/Border Color */
3095 BYTE Index
= getBL();
3097 /* See: http://www.bioscentral.com/misc/bda.htm */
3098 Bda
->CrtColorPaletteMask
= (Bda
->CrtColorPaletteMask
& 0xE0) | (Index
& 0x1F);
3100 Index
= ((Index
<< 1) & 0x10) | (Index
& 0x7);
3102 /* Always set the overscan color */
3103 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG
, Index
);
3105 /* Don't set any extra colors when in text mode */
3106 if (Bda
->VideoMode
<= 0x03) break;
3108 VgaSetSinglePaletteRegister(0x00, Index
);
3110 Index
= (Bda
->CrtColorPaletteMask
& 0x10) | 0x02 | ((Bda
->CrtColorPaletteMask
& 0x20) >> 5);
3112 VgaSetSinglePaletteRegister(0x01, Index
);
3114 VgaSetSinglePaletteRegister(0x02, Index
);
3116 VgaSetSinglePaletteRegister(0x03, Index
);
3118 /* Background/Border Color is modifiable via the first index */
3119 VgaSetSinglePaletteRegister(0x00, getBL());
3122 /* Enable screen and disable palette access */
3123 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3124 IOWriteB(VGA_AC_INDEX
, 0x20);
3128 case 0x01: /* Set Palette */
3130 BYTE Index
= getBL();
3132 /* See: http://www.bioscentral.com/misc/bda.htm */
3133 /* Reset bit 5: foreground colors index (0: green/red/yellow; 1: cyan/magenta/white) */
3134 Bda
->CrtColorPaletteMask
= (Bda
->CrtColorPaletteMask
& 0xDF) | ((Index
& 1) ? 0x20 : 0x00);
3136 /* Don't set any extra colors when in text mode */
3137 if (Bda
->VideoMode
<= 0x03) break;
3139 Index
= (Bda
->CrtColorPaletteMask
& 0x10) | 0x02 | Index
;
3141 VgaSetSinglePaletteRegister(0x01, Index
);
3143 VgaSetSinglePaletteRegister(0x02, Index
);
3145 VgaSetSinglePaletteRegister(0x03, Index
);
3147 /* Enable screen and disable palette access */
3148 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3149 IOWriteB(VGA_AC_INDEX
, 0x20);
3154 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X NOT IMPLEMENTED\n",
3162 /* Teletype Output */
3165 BYTE Page
= getBH();
3167 /* Validate the selected video page */
3168 if (Page
== 0xFF) // Special case: use the current video page
3169 Page
= Bda
->VideoPage
;
3170 else if (Page
>= BIOS_MAX_PAGES
)
3173 VidBiosPrintCharacter(getAL(), getBL(), !IS_TEXT_MODE(Bda
->VideoMode
), Page
);
3177 /* Get Current Video Mode */
3180 setAX(MAKEWORD(VidBiosGetVideoMode(), Bda
->ScreenColumns
));
3181 setBH(Bda
->VideoPage
);
3185 /* Palette Control */
3190 /* Set Single Palette Register */
3193 VgaSetSinglePaletteRegister(getBL(), getBH());
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 /* Set Overscan Color */
3204 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG
, getBH());
3206 /* Enable screen and disable palette access */
3207 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3208 IOWriteB(VGA_AC_INDEX
, 0x20);
3212 /* Set All Palette Registers */
3216 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
3218 /* Set the palette registers */
3219 for (i
= 0; i
<= VGA_AC_PAL_F_REG
; i
++)
3221 VgaSetSinglePaletteRegister(i
, Buffer
[i
]);
3224 /* Set the overscan register */
3225 // VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Buffer[VGA_AC_PAL_F_REG + 1]);
3226 IOWriteB(VGA_AC_INDEX
, VGA_AC_OVERSCAN_REG
);
3227 IOWriteB(VGA_AC_WRITE
, Buffer
[VGA_AC_PAL_F_REG
+ 1]);
3229 /* Enable screen and disable palette access */
3230 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3231 IOWriteB(VGA_AC_INDEX
, 0x20);
3235 /* Toggle Intensity/Blinking Bit */
3238 /* Read the old AC mode control register value */
3239 BYTE VgaAcControlReg
;
3240 IOWriteB(VGA_AC_INDEX
, VGA_AC_CONTROL_REG
);
3241 VgaAcControlReg
= IOReadB(VGA_AC_READ
);
3243 /* Toggle the blinking bit and write the new value */
3246 VgaAcControlReg
|= VGA_AC_CONTROL_BLINK
;
3247 Bda
->CrtModeControl
|= (1 << 5);
3251 VgaAcControlReg
&= ~VGA_AC_CONTROL_BLINK
;
3252 Bda
->CrtModeControl
&= ~(1 << 5);
3255 IOWriteB(VGA_AC_INDEX
, VGA_AC_CONTROL_REG
);
3256 IOWriteB(VGA_AC_WRITE
, VgaAcControlReg
);
3258 /* Enable screen and disable palette access */
3259 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3260 IOWriteB(VGA_AC_INDEX
, 0x20);
3264 /* Get Single Palette Register */
3267 /* Write the index */
3268 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3269 IOWriteB(VGA_AC_INDEX
, getBL());
3272 setBH(IOReadB(VGA_AC_READ
));
3274 /* Enable screen and disable palette access */
3275 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3276 IOWriteB(VGA_AC_INDEX
, 0x20);
3280 /* Get Overscan Color */
3283 /* Write the index */
3284 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3285 IOWriteB(VGA_AC_INDEX
, VGA_AC_OVERSCAN_REG
);
3288 setBH(IOReadB(VGA_AC_READ
));
3290 /* Enable screen and disable palette access */
3291 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3292 IOWriteB(VGA_AC_INDEX
, 0x20);
3296 /* Get All Palette Registers */
3300 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
3302 /* Get the palette registers */
3303 for (i
= 0; i
<= VGA_AC_PAL_F_REG
; i
++)
3305 /* Write the index */
3306 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3307 IOWriteB(VGA_AC_INDEX
, i
);
3310 Buffer
[i
] = IOReadB(VGA_AC_READ
);
3313 /* Get the overscan register */
3314 IOWriteB(VGA_AC_INDEX
, VGA_AC_OVERSCAN_REG
);
3315 Buffer
[VGA_AC_PAL_F_REG
+ 1] = IOReadB(VGA_AC_READ
);
3317 /* Enable screen and disable palette access */
3318 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3319 IOWriteB(VGA_AC_INDEX
, 0x20);
3323 /* Set Individual DAC Register */
3326 /* Write the index */
3327 // Certainly in BL and not in BX as said by Ralf Brown...
3328 IOWriteB(VGA_DAC_WRITE_INDEX
, getBL());
3330 /* Write the data in this order: Red, Green, Blue */
3331 IOWriteB(VGA_DAC_DATA
, getDH());
3332 IOWriteB(VGA_DAC_DATA
, getCH());
3333 IOWriteB(VGA_DAC_DATA
, getCL());
3338 /* Set Block of DAC Registers */
3342 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
3344 /* Write the index */
3345 // Certainly in BL and not in BX as said by Ralf Brown...
3346 IOWriteB(VGA_DAC_WRITE_INDEX
, getBL());
3348 for (i
= 0; i
< getCX(); i
++)
3350 /* Write the data in this order: Red, Green, Blue */
3351 IOWriteB(VGA_DAC_DATA
, *Buffer
++);
3352 IOWriteB(VGA_DAC_DATA
, *Buffer
++);
3353 IOWriteB(VGA_DAC_DATA
, *Buffer
++);
3359 /* Get Individual DAC Register */
3362 /* Write the index */
3363 IOWriteB(VGA_DAC_READ_INDEX
, getBL());
3365 /* Read the data in this order: Red, Green, Blue */
3366 setDH(IOReadB(VGA_DAC_DATA
));
3367 setCH(IOReadB(VGA_DAC_DATA
));
3368 setCL(IOReadB(VGA_DAC_DATA
));
3373 /* Get Block of DAC Registers */
3377 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
3379 /* Write the index */
3380 // Certainly in BL and not in BX as said by Ralf Brown...
3381 IOWriteB(VGA_DAC_READ_INDEX
, getBL());
3383 for (i
= 0; i
< getCX(); i
++)
3385 /* Write the data in this order: Red, Green, Blue */
3386 *Buffer
++ = IOReadB(VGA_DAC_DATA
);
3387 *Buffer
++ = IOReadB(VGA_DAC_DATA
);
3388 *Buffer
++ = IOReadB(VGA_DAC_DATA
);
3397 IOWriteB(VGA_DAC_MASK
, getBL());
3404 setBL(IOReadB(VGA_DAC_MASK
));
3410 DPRINT1("BIOS Palette Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3424 // FIXME: At the moment we support only graphics-mode functions!
3426 /* Load User-specified Patterns (Character Set) for Text Mode */
3428 case 0x10: // FIXME: 0x1x performs a full mode reset
3432 /* Write the default font to the VGA font plane */
3433 // VgaWriteTextModeFont(0, Font8x8, ARRAYSIZE(Font8x8) / VGA_FONT_CHARACTERS);
3439 /* Load ROM Monochrome 8x14 Patterns (Character Set) for Text Mode */
3441 case 0x11: // FIXME: 0x1x performs a full mode reset
3445 /* Write the default font to the VGA font plane */
3446 VgaWriteTextModeFont(0, Font8x14
, ARRAYSIZE(Font8x14
) / VGA_FONT_CHARACTERS
);
3452 /* Load ROM 8x8 Double-dot Patterns (Character Set) for Text Mode */
3454 case 0x12: // FIXME: 0x1x performs a full mode reset
3458 /* Write the default font to the VGA font plane */
3459 VgaWriteTextModeFont(0, Font8x8
, ARRAYSIZE(Font8x8
) / VGA_FONT_CHARACTERS
);
3465 /* Load ROM 8x16 Character Set for Text Mode */
3467 case 0x14: // FIXME: 0x1x performs a full mode reset
3471 /* Write the default font to the VGA font plane */
3472 VgaWriteTextModeFont(0, Font8x16
, ARRAYSIZE(Font8x16
) / VGA_FONT_CHARACTERS
);
3478 /* Set User 8x8 Graphics Chars (Setup INT 1Fh Vector) */
3481 /* Update the BIOS INT 1Fh vector to user-defined ES:BP pointer */
3482 // Far pointer to the 8x8 characters 80h-FFh
3483 ((PULONG
)BaseAddress
)[0x1F] = MAKELONG(getBP(), getES());
3487 /* Set User Graphics Characters */
3491 * Update the BIOS INT 43h vector (far pointer
3492 * to the character range 00h-...)
3494 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(getBP(), getES());
3497 Bda
->CharacterHeight
= getCX();
3500 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
3501 case 0x01: Bda
->ScreenRows
= 13; break;
3502 case 0x03: Bda
->ScreenRows
= 42; break;
3504 default : Bda
->ScreenRows
= 24; break;
3510 /* Setup ROM 8x14 Font for Graphics Mode */
3514 * Update the BIOS INT 43h vector (far pointer
3515 * to the character range 00h-...)
3517 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x14_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3520 Bda
->CharacterHeight
= 14;
3523 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
3524 case 0x01: Bda
->ScreenRows
= 13; break;
3525 case 0x03: Bda
->ScreenRows
= 42; break;
3527 default : Bda
->ScreenRows
= 24; break;
3533 /* Setup ROM 8x8 Font for Graphics Mode */
3537 * Update the BIOS INT 43h vector (far pointer
3538 * to the character range 00h-...)
3540 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x8_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3543 Bda
->CharacterHeight
= 8;
3546 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
3547 case 0x01: Bda
->ScreenRows
= 13; break;
3548 case 0x03: Bda
->ScreenRows
= 42; break;
3550 default : Bda
->ScreenRows
= 24; break;
3556 /* Setup ROM 8x16 Font for Graphics Mode */
3560 * Update the BIOS INT 43h vector (far pointer
3561 * to the character range 00h-...).
3563 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x16_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3566 Bda
->CharacterHeight
= 16;
3569 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
3570 case 0x01: Bda
->ScreenRows
= 13; break;
3571 case 0x03: Bda
->ScreenRows
= 42; break;
3573 default : Bda
->ScreenRows
= 24; break;
3579 /* Get Current Character Font Information */
3582 ULONG Address
= (ULONG
)NULL
;
3586 /* 00h - INT 0x1F pointer */
3588 Address
= ((PULONG
)BaseAddress
)[0x1F];
3591 /* 01h - INT 0x43 pointer */
3593 Address
= ((PULONG
)BaseAddress
)[0x43];
3596 /* 02h - 8x14 font */
3598 Address
= MAKELONG(FONT_8x14_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3601 /* 03h - 8x8 font */
3603 Address
= MAKELONG(FONT_8x8_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3606 /* 04h - 8x8 font, upper half */
3608 Address
= MAKELONG(FONT_8x8_HIGH_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3611 /* 05h - NOT IMPLEMENTED - 9x14 font */
3615 /* 06h - 8x16 font */
3617 Address
= MAKELONG(FONT_8x16_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3620 /* 07h - NOT IMPLEMENTED - 9x16 font */
3625 DPRINT1("INT 10h, AL=30h Function BH = 0x%02X NOT IMPLEMENTED\n",
3629 /* Return the data */
3630 setES(HIWORD(Address
));
3631 setBP(LOWORD(Address
));
3632 setCX(Bda
->CharacterHeight
);
3633 setDL(Bda
->ScreenRows
);
3640 DPRINT1("BIOS Font Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3648 /* Alternate Function Select */
3653 /* Get EGA/VGA Information */
3656 setBH((Bda
->VGAOptions
& 0x02) >> 1); /* Color (0) or monochrome (1) display */
3657 setBL((Bda
->VGAOptions
& 0x60) >> 5); /* Video RAM size */
3658 setCH((Bda
->VGASwitches
& 0xF0) >> 4); /* Features settings */
3659 setCL( Bda
->VGASwitches
& 0x0F); /* Switches settings */
3663 /* Enable/Disable Cursor Emulation */
3666 BYTE State
= getAL();
3668 /* Check for validity */
3669 if (State
> 1) break;
3672 * Enable (State == 0) or disable (State == 1) cursor emulation.
3673 * Please read the WARNING in the 'VidBiosSetCursorShape'
3674 * function for more details.
3676 Bda
->VGAOptions
= (Bda
->VGAOptions
& 0xFE) | (State
& 0x01);
3678 /* Return success */
3683 /* Enable/Disable screen refresh */
3686 BYTE State
= getAL();
3689 /* Check for validity */
3690 if (State
> 1) break;
3692 /* Turn the video on (State == 0) or off (State == 1) */
3693 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_CLOCK_REG
);
3694 Clocking
= IOReadB(VGA_SEQ_DATA
);
3697 Clocking
&= ~VGA_SEQ_CLOCK_SD
;
3699 Clocking
|= VGA_SEQ_CLOCK_SD
;
3701 IOWriteB(VGA_SEQ_DATA
, Clocking
);
3703 /* Return success */
3710 DPRINT1("BIOS Function INT 10h, AH = 12h (Alternate Function Select), BX = 0x%04X NOT IMPLEMENTED\n",
3722 PCHAR String
= (PCHAR
)SEG_OFF_TO_PTR(getES(), getBP());
3723 WORD Counter
= getCX();
3725 BYTE OldRow
, OldColumn
;
3727 BYTE Attribute
= getBL(); // Default attribute in case the string contains only characters.
3728 BYTE Page
= getBH();
3729 BYTE Flags
= getAL();
3731 /* Validate the selected video page */
3732 if (Page
== 0xFF) // Special case: use the current video page
3733 Page
= Bda
->VideoPage
;
3734 else if (Page
>= BIOS_MAX_PAGES
)
3737 /* Get the original cursor position */
3738 VidBiosGetCursorPosition(&OldRow
, &OldColumn
, Page
);
3740 /* Set the new cursor position */
3743 if (Row
== 0xFF) // Special case: use the current cursor position
3748 VidBiosSetCursorPosition(Row
, Column
, Page
);
3750 while (Counter
-- > 0)
3752 Character
= *String
++;
3753 if (Flags
& 0x02) Attribute
= *String
++;
3754 VidBiosPrintCharacter(Character
, Attribute
, TRUE
, Page
);
3757 /* Reset the cursor position to its original value if we don't want to update it */
3758 if (!(Flags
& 0x01)) VidBiosSetCursorPosition(OldRow
, OldColumn
, Page
);
3763 /* Get/Set Display combination code */
3768 case 0x00: /* Get Display combination code */
3770 setBL(Bda
->VGADccIDActive
);
3771 setBH(0x00); // No alternate display
3773 /* Return success */
3777 case 0x01: /* Set Display combination code */
3779 DPRINT1("Set Display combination code - Unsupported\n");
3788 /* Functionality/State Information (VGA) */
3791 PVGA_DYNAMIC_FUNC_TABLE Table
= SEG_OFF_TO_PTR(getES(), getDI());
3793 /* Check for only supported subfunction */
3794 if (getBX() != 0x0000)
3796 DPRINT1("INT 10h, AH=1Bh, unsupported subfunction 0x%04x\n", getBX());
3800 /* Fill the VGA dynamic functionality table with our information */
3802 Table
->StaticFuncTablePtr
= MAKELONG(VIDEO_STATE_INFO_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3804 Table
->VideoMode
= Bda
->VideoMode
;
3805 Table
->ScreenColumns
= Bda
->ScreenColumns
;
3806 Table
->VideoPageSize
= Bda
->VideoPageSize
;
3807 Table
->VideoPageOffset
= Bda
->VideoPageOffset
;
3808 RtlCopyMemory(Table
->CursorPosition
, Bda
->CursorPosition
, sizeof(Bda
->CursorPosition
));
3809 Table
->CursorEndLine
= Bda
->CursorEndLine
;
3810 Table
->CursorStartLine
= Bda
->CursorStartLine
;
3811 Table
->VideoPage
= Bda
->VideoPage
;
3812 Table
->CrtBasePort
= Bda
->CrtBasePort
;
3813 Table
->CrtModeControl
= Bda
->CrtModeControl
;
3814 Table
->CrtColorPaletteMask
= Bda
->CrtColorPaletteMask
;
3815 Table
->ScreenRows
= Bda
->ScreenRows
;
3816 Table
->CharacterHeight
= Bda
->CharacterHeight
;
3818 Table
->VGADccIDActive
= Bda
->VGADccIDActive
;
3819 Table
->VGADccIDAlternate
= 0x00; // No alternate display
3820 // Table->CurrModeSupportedColorsNum;
3821 // Table->CurrModeSupportedPagesNum;
3822 // Table->Scanlines;
3823 // Table->PrimaryCharTable;
3824 // Table->SecondaryCharTable;
3826 Table
->VGAAvailMemory
= (Bda
->VGAOptions
& 0x60) >> 5;
3827 // Table->VGASavePtrStateFlags;
3828 // Table->VGADispInfo;
3831 /* Return success */
3836 /* VESA BIOS Extensions */
3839 if (VbeInitialized
) VbeService(Stack
);
3845 DPRINT1("BIOS Function INT 10h, AH = 0x%02X, AL = 0x%02X, BH = 0x%02X NOT IMPLEMENTED\n",
3846 getAH(), getAL(), getBH());
3853 * Those attach / detach functions are work-in-progress
3856 static BOOL Attached
= TRUE
;
3858 VOID
VidBiosAttachToConsole(VOID
)
3862 VgaAttachToConsole();
3866 VgaRefreshDisplay();
3867 VidBiosSyncCursorPosition();
3870 VOID
VidBiosDetachFromConsole(VOID
)
3872 /* Perform another screen refresh */
3873 VgaRefreshDisplay();
3875 /* Detach from the console */
3876 VgaDetachFromConsole(FALSE
);
3880 VOID
VidBiosPost(VOID
)
3883 * Initialize VGA BIOS32 RAM dynamic data
3886 /* Some vectors are in fact addresses to tables */
3887 ((PULONG
)BaseAddress
)[0x1D] = (ULONG
)NULL
; // Video Parameter Tables
3888 // Far pointer to the 8x8 graphics font for the 8x8 characters 80h-FFh
3889 ((PULONG
)BaseAddress
)[0x1F] = MAKELONG(FONT_8x8_HIGH_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3890 // Far pointer to the character table (EGA, MCGA, VGA) for the 8x16 characters 00h-...
3891 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x16_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3892 ((PULONG
)BaseAddress
)[0x44] = (ULONG
)NULL
; // ROM BIOS Character Font, Characters 00h-7Fh (PCjr)
3894 /* Relocated services by the BIOS (when needed) */
3895 ((PULONG
)BaseAddress
)[0x42] = (ULONG
)NULL
; // Relocated Default INT 10h Video Services
3896 ((PULONG
)BaseAddress
)[0x6D] = (ULONG
)NULL
; // Video BIOS Entry Point
3899 // FIXME: At the moment we always set a VGA mode. In the future,
3900 // we should set this mode **only** when:
3901 // - an app starts to use directly the video memory
3902 // (that should be done in emulator.c)
3903 // - or starts to use non-stream I/O interrupts
3904 // (that should be done here, or maybe in VGA ??)
3907 Bda
->CrtModeControl
= 0x00;
3908 Bda
->CrtColorPaletteMask
= 0x00;
3909 Bda
->VGADccIDActive
= 0x08; // VGA w/ color analog active display
3911 /* Set the default video mode */
3912 VidBiosSetVideoMode(BIOS_DEFAULT_VIDEO_MODE
);
3914 /* Synchronize our cursor position with VGA */
3915 VidBiosSyncCursorPosition();
3917 /* Register the BIOS 32-bit Interrupts */
3918 RegisterBiosInt32(BIOS_VIDEO_INTERRUPT
, VidBiosVideoService
);
3920 /* Vectors that should be implemented */
3921 RegisterBiosInt32(0x42, NULL
); // Relocated Default INT 10h Video Services
3922 RegisterBiosInt32(0x6D, NULL
); // Video BIOS Entry Point
3924 /* Initialize VBE */
3925 VbeInitialized
= VbeInitialize();
3926 if (!VbeInitialized
) DPRINT1("Couldn't initialize VBE!\n");
3929 BOOLEAN
VidBiosInitialize(VOID
)
3934 * Initialize VGA BIOS32 static data
3937 /* This is a ROM of size 'VIDEO_BIOS_ROM_SIZE' */
3938 *(PWORD
)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, 0x0000)) = 0xAA55;
3939 *(PBYTE
)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, 0x0002)) = VIDEO_BIOS_ROM_SIZE
/ 512; // Size in blocks of 512 bytes
3941 /* Bootstrap code */
3942 *(PWORD
)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, 0x0003)) = 0x90CB; // retf, nop
3943 // RtlCopyMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, 0xFFF0), Bootstrap, sizeof(Bootstrap));
3945 /* Video BIOS Information */
3946 RtlCopyMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, 0x0005), BiosInfo
, sizeof(BiosInfo
)-1);
3948 /* Initialize the VGA static function table */
3949 VgaStaticFuncTable
= SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, VIDEO_STATE_INFO_OFFSET
);
3950 RtlZeroMemory(VgaStaticFuncTable
, sizeof(*VgaStaticFuncTable
));
3951 VgaStaticFuncTable
->SupportedModes
[0] = 0xFF; // Modes 0x00 to 0x07 supported
3952 VgaStaticFuncTable
->SupportedModes
[1] = 0xFF; // Modes 0x08 to 0x0F supported
3953 VgaStaticFuncTable
->SupportedModes
[2] = 0x0F; // Modes 0x10 to 0x13 supported
3954 VgaStaticFuncTable
->SupportedScanlines
= 0x07; // Scanlines 200, 350 and 400 supported
3955 VgaStaticFuncTable
->TextCharBlocksNumber
= 0;
3956 VgaStaticFuncTable
->MaxActiveTextCharBlocksNumber
= 0;
3957 VgaStaticFuncTable
->VGAFuncSupportFlags
= 0x0CFD; // See: http://www.ctyme.com/intr/rb-0221.htm#Table46
3958 VgaStaticFuncTable
->VGASavePtrFuncFlags
= 0x18; // See: http://www.ctyme.com/intr/rb-0221.htm#Table47
3960 /* Fill the font tables */
3961 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, FONT_8x8_OFFSET
),
3962 Font8x8
, sizeof(Font8x8
));
3963 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, FONT_8x16_OFFSET
),
3964 Font8x16
, sizeof(Font8x16
));
3965 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, FONT_8x14_OFFSET
),
3966 Font8x14
, sizeof(Font8x14
));
3968 VidBios32Initialize();
3970 /* Compute the ROM checksum and store it */
3971 *(PBYTE
)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, VIDEO_BIOS_ROM_SIZE
- 1)) = 0x00;
3972 Checksum
= CalcRomChecksum(TO_LINEAR(VIDEO_BIOS_DATA_SEG
, 0x0000), VIDEO_BIOS_ROM_SIZE
);
3973 *(PBYTE
)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, VIDEO_BIOS_ROM_SIZE
- 1)) = (0xFF - Checksum
+ 1) & 0xFF;
3975 WriteProtectRom((PVOID
)TO_LINEAR(VIDEO_BIOS_DATA_SEG
, 0x0000),
3976 VIDEO_BIOS_ROM_SIZE
);
3981 VOID
VidBiosCleanup(VOID
)