2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: subsystems/mvdm/ntvdm/bios/vidbios.c
5 * PURPOSE: VDM 32-bit Video BIOS Support Library
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
10 /* INCLUDES *******************************************************************/
17 /* BIOS Version number and Copyright */
18 #include <reactos/buildno.h>
19 #include <reactos/version.h>
27 #include "bios32/bios32p.h"
29 #include "bios32/vbe.h"
30 // #include "vidbios.h"
31 #include "bios32/vidbios32.h"
34 #include "hardware/video/svga.h"
36 #include "../console/video.h"
39 /* MACROS *********************************************************************/
42 // These macros are defined for ease-of-use of some VGA I/O ports
43 // whose addresses depend whether we are in Monochrome or Colour mode.
45 #define VGA_INSTAT1_READ Bda->CrtBasePort + 6 // VGA_INSTAT1_READ_MONO or VGA_INSTAT1_READ_COLOR
46 #define VGA_CRTC_INDEX Bda->CrtBasePort // VGA_CRTC_INDEX_MONO or VGA_CRTC_INDEX_COLOR
47 #define VGA_CRTC_DATA Bda->CrtBasePort + 1 // VGA_CRTC_DATA_MONO or VGA_CRTC_DATA_COLOR
49 /* PRIVATE VARIABLES **********************************************************/
52 * WARNING! For compatibility purposes the string "IBM" should be at C000:001E.
54 static const CHAR BiosInfo
[] =
55 "00000000000 Emulation of IBM VGA Compatible ROM\0"
56 "CL-GD5434 VGA BIOS Version 1.41 \r\n"
57 "Copyright (C) ReactOS Team 1996-"COPYRIGHT_YEAR
"\r\n"
58 "The original CL-GD5434 card was created by Cirrus Logic, Inc.\r\n\0"
59 "BIOS Date: 06/17/13\0";
61 C_ASSERT(sizeof(BiosInfo
)-1 <= 0xFF-0x05); // Ensures that we won't overflow on the Video Code
65 * VGA Register Configurations for BIOS Video Modes.
66 * The configurations were checked against SeaBIOS VGA BIOS.
69 static VGA_REGISTERS VideoMode_40x25_text
=
71 /* Miscellaneous Register */
74 /* Sequencer Registers */
75 {0x00, 0x08, 0x03, 0x00, 0x02},
77 /* CRTC Registers */ /* CGA-compatible: 0xC7, 0x06, 0x07 */
78 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
79 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x1F, 0x96, 0xB9, 0xA3,
83 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
86 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
87 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
90 static VGA_REGISTERS VideoMode_80x25_text
=
92 /* Miscellaneous Register */
95 /* Sequencer Registers */
96 {0x00, 0x00, 0x03, 0x00, 0x02},
98 /* CRTC Registers */ /* CGA-compatible: 0xC7, 0x06, 0x07 */
99 {0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
100 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3,
104 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
107 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
108 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
111 static VGA_REGISTERS VideoMode_320x200_4color
=
113 /* Miscellaneous Register */
116 /* Sequencer Registers */
117 {0x00, 0x09, 0x03, 0x00, 0x02},
120 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
121 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xA2,
125 {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0F, 0x0F, 0xFF},
128 {0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
129 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x03, 0x00, 0x00}
132 static VGA_REGISTERS VideoMode_640x200_2color
=
134 /* Miscellaneous Register */
137 /* Sequencer Registers */
138 {0x00, 0x01, 0x01, 0x00, 0x02},
141 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
142 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xC2,
146 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0xFF},
149 {0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
150 0x17, 0x17, 0x17, 0x17, 0x01, 0x00, 0x01, 0x00, 0x00}
153 static VGA_REGISTERS VideoMode_320x200_16color
=
155 /* Miscellaneous Register */
158 /* Sequencer Registers */
159 {0x00, 0x09, 0x0F, 0x00, 0x06},
162 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
163 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xE3,
167 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
170 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
171 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
174 static VGA_REGISTERS VideoMode_640x200_16color
=
176 /* Miscellaneous Register */
179 /* Sequencer Registers */
180 {0x00, 0x01, 0x0F, 0x00, 0x06},
183 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
184 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xE3,
188 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
191 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
192 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
195 static VGA_REGISTERS VideoMode_640x350_16color
=
197 /* Miscellaneous Register */
200 /* Sequencer Registers */
201 {0x00, 0x01, 0x0F, 0x00, 0x06},
204 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00,
205 0x00, 0x00, 0x00, 0x00, 0x83, 0x85, 0x5D, 0x28, 0x0F, 0x63, 0xBA, 0xE3,
209 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
212 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
213 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
216 static VGA_REGISTERS VideoMode_640x480_2color
=
218 /* Miscellaneous Register */
221 /* Sequencer Registers */
222 {0x00, 0x01, 0x0F, 0x00, 0x06},
225 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xC3,
230 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
233 // {0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
234 // 0x3F, 0x3F, 0x3F, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
235 {0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F,
236 0x00, 0x3F, 0x00, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
239 static VGA_REGISTERS VideoMode_640x480_16color
=
241 /* Miscellaneous Register */
244 /* Sequencer Registers */
245 {0x00, 0x01, 0x0F, 0x00, 0x06},
248 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
249 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3,
253 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
256 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
257 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
260 static VGA_REGISTERS VideoMode_320x200_256color
=
262 /* Miscellaneous Register */
265 /* Sequencer Registers */
266 {0x00, 0x01, 0x0F, 0x00, 0x0E},
269 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x41, 0x00, 0x00,
270 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3,
274 {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF},
277 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
278 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00}
285 * Many people have different versions of those palettes
286 * (e.g. DOSBox, http://www.brokenthorn.com/Resources/OSDevVid2.html ,
287 * etc...) A choice should be made at some point.
290 // This is the same as EgaPalette__HiRes
291 static CONST COLORREF TextPalette
[VGA_MAX_COLORS
/ 4] =
293 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
294 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
295 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
296 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
298 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
299 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
300 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
301 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
304 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
305 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
306 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
307 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
309 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
310 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
311 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
312 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
315 // Unused at the moment
316 static CONST COLORREF mtext_palette
[64] =
318 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
319 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
320 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
321 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
322 RGB(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(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
325 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
327 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
328 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
329 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
330 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
331 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
332 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
333 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
334 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
337 // Unused at the moment
338 static CONST COLORREF mtext_s3_palette
[64] =
340 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
341 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
342 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
343 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
344 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
345 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
346 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
347 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
349 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
350 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
351 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
352 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
353 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
354 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
355 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
356 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
361 // Unused at the moment
362 static CONST COLORREF CgaPalette
[16] =
364 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
365 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
366 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
367 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
371 static CONST BYTE CgaPalette1
[] =
373 0x00, /* 0 - Black */
375 0x05, /* 2- Magenta */
376 0x07, /* 3 - White */
379 /* CGA palette 1 bright */
380 static CONST BYTE CgaPalette1i
[] =
382 0x00, /* 0 - Black */
383 0x13, /* 1 - Light cyan */
384 0x15, /* 2 - Light magenta */
385 0x17, /* 3 - Bright White */
389 static CONST BYTE CgaPalette2
[] =
391 0x00, /* 0 - Black */
392 0x02, /* 1 - Green */
394 0x06, /* 3 - Brown */
397 /* CGA palette 2 bright */
398 static CONST BYTE CgaPalette2i
[] =
400 0x00, /* 0 - Black */
401 0x12, /* 1 - Light green */
402 0x14, /* 2 - Light red */
403 0x16, /* 3 - Yellow */
406 // Unused at the moment; same palette as EgaPalette__16Colors
407 static CONST COLORREF CgaPalette2
[VGA_MAX_COLORS
/ 4] =
409 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
410 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
411 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
412 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
414 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
415 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
416 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
417 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
419 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
420 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
421 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
422 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
424 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
425 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
426 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
427 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
432 static CONST COLORREF EgaPalette__16Colors
[VGA_MAX_COLORS
/ 4] =
434 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
435 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
437 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
438 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
441 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
442 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
444 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
445 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
449 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
450 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
452 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
453 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
456 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
457 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
459 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
460 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
463 // This is the same as TextPalette
464 static CONST COLORREF EgaPalette__HiRes
[VGA_MAX_COLORS
/ 4] =
466 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
467 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
468 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
469 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
471 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
472 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
473 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
474 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
477 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
478 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
479 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
480 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
482 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
483 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
484 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
485 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
488 #define USE_REACTOS_COLORS
489 // #define USE_DOSBOX_COLORS
492 * Same palette as the default one 'VgaDefaultPalette' in vga.c
494 #if defined(USE_REACTOS_COLORS)
497 static CONST COLORREF VgaPalette
[VGA_MAX_COLORS
] =
499 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
500 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
501 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
502 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
503 RGB(0x00, 0x00, 0x00), RGB(0x10, 0x10, 0x10), RGB(0x20, 0x20, 0x20), RGB(0x35, 0x35, 0x35),
504 RGB(0x45, 0x45, 0x45), RGB(0x55, 0x55, 0x55), RGB(0x65, 0x65, 0x65), RGB(0x75, 0x75, 0x75),
505 RGB(0x8A, 0x8A, 0x8A), RGB(0x9A, 0x9A, 0x9A), RGB(0xAA, 0xAA, 0xAA), RGB(0xBA, 0xBA, 0xBA),
506 RGB(0xCA, 0xCA, 0xCA), RGB(0xDF, 0xDF, 0xDF), RGB(0xEF, 0xEF, 0xEF), RGB(0xFF, 0xFF, 0xFF),
507 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x82, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
508 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x82), RGB(0xFF, 0x00, 0x41),
509 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x82, 0x00), RGB(0xFF, 0xBE, 0x00),
510 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x82, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
511 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x82), RGB(0x00, 0xFF, 0xBE),
512 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x82, 0xFF), RGB(0x00, 0x41, 0xFF),
513 RGB(0x82, 0x82, 0xFF), RGB(0x9E, 0x82, 0xFF), RGB(0xBE, 0x82, 0xFF), RGB(0xDF, 0x82, 0xFF),
514 RGB(0xFF, 0x82, 0xFF), RGB(0xFF, 0x82, 0xDF), RGB(0xFF, 0x82, 0xBE), RGB(0xFF, 0x82, 0x9E),
515 RGB(0xFF, 0x82, 0x82), RGB(0xFF, 0x9E, 0x82), RGB(0xFF, 0xBE, 0x82), RGB(0xFF, 0xDF, 0x82),
516 RGB(0xFF, 0xFF, 0x82), RGB(0xDF, 0xFF, 0x82), RGB(0xBE, 0xFF, 0x82), RGB(0x9E, 0xFF, 0x82),
517 RGB(0x82, 0xFF, 0x82), RGB(0x82, 0xFF, 0x9E), RGB(0x82, 0xFF, 0xBE), RGB(0x82, 0xFF, 0xDF),
518 RGB(0x82, 0xFF, 0xFF), RGB(0x82, 0xDF, 0xFF), RGB(0x82, 0xBE, 0xFF), RGB(0x82, 0x9E, 0xFF),
519 RGB(0xBA, 0xBA, 0xFF), RGB(0xCA, 0xBA, 0xFF), RGB(0xDF, 0xBA, 0xFF), RGB(0xEF, 0xBA, 0xFF),
520 RGB(0xFF, 0xBA, 0xFF), RGB(0xFF, 0xBA, 0xEF), RGB(0xFF, 0xBA, 0xDF), RGB(0xFF, 0xBA, 0xCA),
521 RGB(0xFF, 0xBA, 0xBA), RGB(0xFF, 0xCA, 0xBA), RGB(0xFF, 0xDF, 0xBA), RGB(0xFF, 0xEF, 0xBA),
522 RGB(0xFF, 0xFF, 0xBA), RGB(0xEF, 0xFF, 0xBA), RGB(0xDF, 0xFF, 0xBA), RGB(0xCA, 0xFF, 0xBA),
523 RGB(0xBA, 0xFF, 0xBA), RGB(0xBA, 0xFF, 0xCA), RGB(0xBA, 0xFF, 0xDF), RGB(0xBA, 0xFF, 0xEF),
524 RGB(0xBA, 0xFF, 0xFF), RGB(0xBA, 0xEF, 0xFF), RGB(0xBA, 0xDF, 0xFF), RGB(0xBA, 0xCA, 0xFF),
525 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x39, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
526 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x39), RGB(0x71, 0x00, 0x1C),
527 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x39, 0x00), RGB(0x71, 0x55, 0x00),
528 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x39, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
529 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x39), RGB(0x00, 0x71, 0x55),
530 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x39, 0x71), RGB(0x00, 0x1C, 0x71),
531 RGB(0x39, 0x39, 0x71), RGB(0x45, 0x39, 0x71), RGB(0x55, 0x39, 0x71), RGB(0x61, 0x39, 0x71),
532 RGB(0x71, 0x39, 0x71), RGB(0x71, 0x39, 0x61), RGB(0x71, 0x39, 0x55), RGB(0x71, 0x39, 0x45),
533 RGB(0x71, 0x39, 0x39), RGB(0x71, 0x45, 0x39), RGB(0x71, 0x55, 0x39), RGB(0x71, 0x61, 0x39),
534 RGB(0x71, 0x71, 0x39), RGB(0x61, 0x71, 0x39), RGB(0x55, 0x71, 0x39), RGB(0x45, 0x71, 0x39),
535 RGB(0x39, 0x71, 0x39), RGB(0x39, 0x71, 0x45), RGB(0x39, 0x71, 0x55), RGB(0x39, 0x71, 0x61),
536 RGB(0x39, 0x71, 0x71), RGB(0x39, 0x61, 0x71), RGB(0x39, 0x55, 0x71), RGB(0x39, 0x45, 0x71),
537 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
538 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
539 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
540 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
541 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
542 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
543 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x31, 0x00, 0x41),
544 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x31), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
545 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x31, 0x00),
546 RGB(0x41, 0x41, 0x00), RGB(0x31, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
547 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x31),
548 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x31, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
549 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x31, 0x20, 0x41), RGB(0x39, 0x20, 0x41),
550 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x39), RGB(0x41, 0x20, 0x31), RGB(0x41, 0x20, 0x28),
551 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x31, 0x20), RGB(0x41, 0x39, 0x20),
552 RGB(0x41, 0x41, 0x20), RGB(0x39, 0x41, 0x20), RGB(0x31, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
553 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x31), RGB(0x20, 0x41, 0x39),
554 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x39, 0x41), RGB(0x20, 0x31, 0x41), RGB(0x20, 0x28, 0x41),
555 RGB(0x2D, 0x2D, 0x41), RGB(0x31, 0x2D, 0x41), RGB(0x35, 0x2D, 0x41), RGB(0x3D, 0x2D, 0x41),
556 RGB(0x41, 0x2D, 0x41), RGB(0x41, 0x2D, 0x3D), RGB(0x41, 0x2D, 0x35), RGB(0x41, 0x2D, 0x31),
557 RGB(0x41, 0x2D, 0x2D), RGB(0x41, 0x31, 0x2D), RGB(0x41, 0x35, 0x2D), RGB(0x41, 0x3D, 0x2D),
558 RGB(0x41, 0x41, 0x2D), RGB(0x3D, 0x41, 0x2D), RGB(0x35, 0x41, 0x2D), RGB(0x31, 0x41, 0x2D),
559 RGB(0x2D, 0x41, 0x2D), RGB(0x2D, 0x41, 0x31), RGB(0x2D, 0x41, 0x35), RGB(0x2D, 0x41, 0x3D),
560 RGB(0x2D, 0x41, 0x41), RGB(0x2D, 0x3D, 0x41), RGB(0x2D, 0x35, 0x41), RGB(0x2D, 0x31, 0x41),
561 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
562 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
565 #elif defined(USE_DOSBOX_COLORS)
568 static CONST COLORREF VgaPalette
[VGA_MAX_COLORS
] =
570 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
571 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
572 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
573 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
574 RGB(0x00, 0x00, 0x00), RGB(0x14, 0x14, 0x14), RGB(0x20, 0x20, 0x20), RGB(0x2C, 0x2C, 0x2C),
575 RGB(0x38, 0x38, 0x38), RGB(0x45, 0x45, 0x45), RGB(0x51, 0x51, 0x51), RGB(0x61, 0x61, 0x61),
576 RGB(0x71, 0x71, 0x71), RGB(0x82, 0x82, 0x82), RGB(0x92, 0x92, 0x92), RGB(0xA2, 0xA2, 0xA2),
577 RGB(0xB6, 0xB6, 0xB6), RGB(0xCB, 0xCB, 0xCB), RGB(0xE3, 0xE3, 0xE3), RGB(0xFF, 0xFF, 0xFF),
578 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x7D, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
579 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x7D), RGB(0xFF, 0x00, 0x41),
580 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x7D, 0x00), RGB(0xFF, 0xBE, 0x00),
581 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x7D, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
582 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x7D), RGB(0x00, 0xFF, 0xBE),
583 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x7D, 0xFF), RGB(0x00, 0x41, 0xFF),
584 RGB(0x7D, 0x7D, 0xFF), RGB(0x9E, 0x7D, 0xFF), RGB(0xBE, 0x7D, 0xFF), RGB(0xDF, 0x7D, 0xFF),
585 RGB(0xFF, 0x7D, 0xFF), RGB(0xFF, 0x7D, 0xDF), RGB(0xFF, 0x7D, 0xBE), RGB(0xFF, 0x7D, 0x9E),
587 RGB(0xFF, 0x7D, 0x7D), RGB(0xFF, 0x9E, 0x7D), RGB(0xFF, 0xBE, 0x7D), RGB(0xFF, 0xDF, 0x7D),
588 RGB(0xFF, 0xFF, 0x7D), RGB(0xDF, 0xFF, 0x7D), RGB(0xBE, 0xFF, 0x7D), RGB(0x9E, 0xFF, 0x7D),
589 RGB(0x7D, 0xFF, 0x7D), RGB(0x7D, 0xFF, 0x9E), RGB(0x7D, 0xFF, 0xBE), RGB(0x7D, 0xFF, 0xDF),
590 RGB(0x7D, 0xFF, 0xFF), RGB(0x7D, 0xDF, 0xFF), RGB(0x7D, 0xBE, 0xFF), RGB(0x7D, 0x9E, 0xFF),
591 RGB(0xB6, 0xB6, 0xFF), RGB(0xC7, 0xB6, 0xFF), RGB(0xDB, 0xB6, 0xFF), RGB(0xEB, 0xB6, 0xFF),
592 RGB(0xFF, 0xB6, 0xFF), RGB(0xFF, 0xB6, 0xEB), RGB(0xFF, 0xB6, 0xDB), RGB(0xFF, 0xB6, 0xC7),
593 RGB(0xFF, 0xB6, 0xB6), RGB(0xFF, 0xC7, 0xB6), RGB(0xFF, 0xDB, 0xB6), RGB(0xFF, 0xEB, 0xB6),
594 RGB(0xFF, 0xFF, 0xB6), RGB(0xEB, 0xFF, 0xB6), RGB(0xDB, 0xFF, 0xB6), RGB(0xC7, 0xFF, 0xB6),
595 RGB(0xB6, 0xFF, 0xB6), RGB(0xB6, 0xFF, 0xC7), RGB(0xB6, 0xFF, 0xDB), RGB(0xB6, 0xFF, 0xEB),
596 RGB(0xB6, 0xFF, 0xFF), RGB(0xB6, 0xEB, 0xFF), RGB(0xB6, 0xDB, 0xFF), RGB(0xB6, 0xC7, 0xFF),
597 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x38, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
598 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x38), RGB(0x71, 0x00, 0x1C),
599 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x38, 0x00), RGB(0x71, 0x55, 0x00),
600 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x38, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
601 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x38), RGB(0x00, 0x71, 0x55),
602 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x38, 0x71), RGB(0x00, 0x1C, 0x71),
604 RGB(0x38, 0x38, 0x71), RGB(0x45, 0x38, 0x71), RGB(0x55, 0x38, 0x71), RGB(0x61, 0x38, 0x71),
605 RGB(0x71, 0x38, 0x71), RGB(0x71, 0x38, 0x61), RGB(0x71, 0x38, 0x55), RGB(0x71, 0x38, 0x45),
606 RGB(0x71, 0x38, 0x38), RGB(0x71, 0x45, 0x38), RGB(0x71, 0x55, 0x38), RGB(0x71, 0x61, 0x38),
607 RGB(0x71, 0x71, 0x38), RGB(0x61, 0x71, 0x38), RGB(0x55, 0x71, 0x38), RGB(0x45, 0x71, 0x38),
608 RGB(0x38, 0x71, 0x38), RGB(0x38, 0x71, 0x45), RGB(0x38, 0x71, 0x55), RGB(0x38, 0x71, 0x61),
609 RGB(0x38, 0x71, 0x71), RGB(0x38, 0x61, 0x71), RGB(0x38, 0x55, 0x71), RGB(0x38, 0x45, 0x71),
610 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
611 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
612 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
613 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
614 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
615 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
616 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x30, 0x00, 0x41),
617 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x30), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
618 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x30, 0x00),
619 RGB(0x41, 0x41, 0x00), RGB(0x30, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
621 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x30),
622 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x30, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
623 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x30, 0x20, 0x41), RGB(0x38, 0x20, 0x41),
624 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x38), RGB(0x41, 0x20, 0x30), RGB(0x41, 0x20, 0x28),
625 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x30, 0x20), RGB(0x41, 0x38, 0x20),
626 RGB(0x41, 0x41, 0x20), RGB(0x38, 0x41, 0x20), RGB(0x30, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
627 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x30), RGB(0x20, 0x41, 0x38),
628 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x38, 0x41), RGB(0x20, 0x30, 0x41), RGB(0x20, 0x28, 0x41),
629 RGB(0x2C, 0x2C, 0x41), RGB(0x30, 0x2C, 0x41), RGB(0x34, 0x2C, 0x41), RGB(0x3C, 0x2C, 0x41),
630 RGB(0x41, 0x2C, 0x41), RGB(0x41, 0x2C, 0x3C), RGB(0x41, 0x2C, 0x34), RGB(0x41, 0x2C, 0x30),
631 RGB(0x41, 0x2C, 0x2C), RGB(0x41, 0x30, 0x2C), RGB(0x41, 0x34, 0x2C), RGB(0x41, 0x3C, 0x2C),
632 RGB(0x41, 0x41, 0x2C), RGB(0x3C, 0x41, 0x2C), RGB(0x34, 0x41, 0x2C), RGB(0x30, 0x41, 0x2C),
633 RGB(0x2C, 0x41, 0x2C), RGB(0x2C, 0x41, 0x30), RGB(0x2C, 0x41, 0x34), RGB(0x2C, 0x41, 0x3C),
634 RGB(0x2C, 0x41, 0x41), RGB(0x2C, 0x3C, 0x41), RGB(0x2C, 0x34, 0x41), RGB(0x2C, 0x30, 0x41),
635 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
636 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
641 static CONST UCHAR Font8x8
[VGA_FONT_CHARACTERS
* 8] =
643 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
644 0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E,
645 0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E,
646 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
647 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,
648 0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x92, 0x10, 0x7C,
649 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C,
650 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00,
651 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF,
652 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
653 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF,
654 0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78,
655 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18,
656 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0,
657 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0,
658 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99,
659 0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00,
660 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00,
661 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18,
662 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00,
663 0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00,
664 0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0x86, 0xFC,
665 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00,
666 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF,
667 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00,
668 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00,
669 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00,
670 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
671 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00,
672 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
673 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00,
674 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00,
675 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
676 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00,
677 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
678 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
679 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00,
680 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00,
681 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00,
682 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
683 0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00,
684 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00,
685 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
686 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
687 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30,
688 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
689 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
690 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
691 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00,
692 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00,
693 0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00,
694 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00,
695 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00,
696 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00,
697 0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00,
698 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00,
699 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00,
700 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00,
701 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
702 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
703 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00,
704 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00,
705 0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00,
706 0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00,
707 0x7C, 0xC6, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00,
708 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00,
709 0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00,
710 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00,
711 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00,
712 0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
713 0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00,
714 0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00,
715 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00,
716 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
717 0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
718 0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00,
719 0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00,
720 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
721 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00,
722 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
723 0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,
724 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x0E, 0x00,
725 0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00,
726 0x7C, 0xC6, 0xE0, 0x78, 0x0E, 0xC6, 0x7C, 0x00,
727 0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
728 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00,
729 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
730 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
731 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00,
732 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00,
733 0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00,
734 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00,
735 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00,
736 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00,
737 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
738 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
739 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
740 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
741 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00,
742 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00,
743 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00,
744 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
745 0x38, 0x6C, 0x64, 0xF0, 0x60, 0x60, 0xF0, 0x00,
746 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
747 0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00,
748 0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
749 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78,
750 0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
751 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
752 0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xD6, 0x00,
753 0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
754 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
755 0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0,
756 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
757 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0xF0, 0x00,
758 0x00, 0x00, 0x7C, 0xC0, 0x70, 0x1C, 0xF8, 0x00,
759 0x10, 0x30, 0xFC, 0x30, 0x30, 0x34, 0x18, 0x00,
760 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
761 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
762 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
763 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00,
764 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
765 0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00,
766 0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00,
767 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00,
768 0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00,
769 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
770 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00,
771 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x0C, 0x06, 0x7C,
772 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
773 0x1C, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
774 0x7E, 0x81, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0x00,
775 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
776 0xE0, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
777 0x30, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
778 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x78, 0x0C, 0x38,
779 0x7E, 0x81, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00,
780 0xCC, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
781 0xE0, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
782 0xCC, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
783 0x7C, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
784 0xE0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
785 0xC6, 0x10, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
786 0x30, 0x30, 0x00, 0x78, 0xCC, 0xFC, 0xCC, 0x00,
787 0x1C, 0x00, 0xFC, 0x60, 0x78, 0x60, 0xFC, 0x00,
788 0x00, 0x00, 0x7F, 0x0C, 0x7F, 0xCC, 0x7F, 0x00,
789 0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00,
790 0x78, 0x84, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
791 0x00, 0xCC, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
792 0x00, 0xE0, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
793 0x78, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
794 0x00, 0xE0, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
795 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
796 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00,
797 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
798 0x18, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x18,
799 0x38, 0x6C, 0x64, 0xF0, 0x60, 0xE6, 0xFC, 0x00,
800 0xCC, 0xCC, 0x78, 0x30, 0xFC, 0x30, 0xFC, 0x30,
801 0xF8, 0xCC, 0xCC, 0xFA, 0xC6, 0xCF, 0xC6, 0xC3,
802 0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0xD8, 0x70,
803 0x1C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
804 0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
805 0x00, 0x1C, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
806 0x00, 0x1C, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
807 0x00, 0xF8, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0x00,
808 0xFC, 0x00, 0xCC, 0xEC, 0xFC, 0xDC, 0xCC, 0x00,
809 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00,
810 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00,
811 0x18, 0x00, 0x18, 0x18, 0x30, 0x66, 0x3C, 0x00,
812 0x00, 0x00, 0x00, 0xFC, 0xC0, 0xC0, 0x00, 0x00,
813 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x0C, 0x00, 0x00,
814 0xC6, 0xCC, 0xD8, 0x36, 0x6B, 0xC2, 0x84, 0x0F,
815 0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6D, 0xCF, 0x03,
816 0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00,
817 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
818 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00,
819 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
820 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
821 0xDB, 0xF6, 0xDB, 0x6F, 0xDB, 0x7E, 0xD7, 0xED,
822 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
823 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18,
824 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
825 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36,
826 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36,
827 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
828 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36,
829 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
830 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36,
831 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00,
832 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00,
833 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00,
834 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18,
835 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00,
836 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
837 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18,
838 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
839 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
840 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18,
841 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
842 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36,
843 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00,
844 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36,
845 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00,
846 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36,
847 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36,
848 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
849 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36,
850 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
851 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00,
852 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18,
853 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36,
854 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00,
855 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00,
856 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
857 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36,
858 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36,
859 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18,
860 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00,
861 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18,
862 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
863 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
864 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
865 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
866 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
867 0x00, 0x00, 0x76, 0xDC, 0xC8, 0xDC, 0x76, 0x00,
868 0x00, 0x78, 0xCC, 0xF8, 0xCC, 0xF8, 0xC0, 0xC0,
869 0x00, 0xFC, 0xCC, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
870 0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x00,
871 0xFC, 0xCC, 0x60, 0x30, 0x60, 0xCC, 0xFC, 0x00,
872 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0x70, 0x00,
873 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
874 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00,
875 0xFC, 0x30, 0x78, 0xCC, 0xCC, 0x78, 0x30, 0xFC,
876 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x6C, 0x38, 0x00,
877 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x6C, 0xEE, 0x00,
878 0x1C, 0x30, 0x18, 0x7C, 0xCC, 0xCC, 0x78, 0x00,
879 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00,
880 0x06, 0x0C, 0x7E, 0xDB, 0xDB, 0x7E, 0x60, 0xC0,
881 0x38, 0x60, 0xC0, 0xF8, 0xC0, 0x60, 0x38, 0x00,
882 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
883 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00,
884 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00,
885 0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xFC, 0x00,
886 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xFC, 0x00,
887 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18,
888 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70,
889 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00,
890 0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00,
891 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
892 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
893 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
894 0x0F, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C,
895 0x58, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00,
896 0x70, 0x98, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00,
897 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00,
898 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
901 static CONST UCHAR Font8x14
[VGA_FONT_CHARACTERS
* 14] =
903 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
904 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
905 0x00, 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81,
906 0x81, 0xBD, 0x99, 0x81, 0x7E, 0x00, 0x00,
907 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xDB, 0xFF,
908 0xFF, 0xC3, 0xE7, 0xFF, 0x7E, 0x00, 0x00,
909 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE,
910 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00,
911 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C,
912 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00,
913 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0xE7,
914 0xE7, 0xE7, 0x18, 0x18, 0x3C, 0x00, 0x00,
915 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF,
916 0xFF, 0x7E, 0x18, 0x18, 0x3C, 0x00, 0x00,
917 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
918 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
919 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7,
920 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF,
921 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66,
922 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00,
923 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99,
924 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF,
925 0x00, 0x00, 0x00, 0x1E, 0x0E, 0x1A, 0x32,
926 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00,
927 0x00, 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66,
928 0x3C, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
929 0x00, 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30,
930 0x30, 0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00,
931 0x00, 0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63,
932 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00,
933 0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C,
934 0xE7, 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00,
935 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF8,
936 0xFE, 0xF8, 0xE0, 0xC0, 0x80, 0x00, 0x00,
937 0x00, 0x00, 0x00, 0x02, 0x06, 0x0E, 0x3E,
938 0xFE, 0x3E, 0x0E, 0x06, 0x02, 0x00, 0x00,
939 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
940 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
941 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
942 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00,
943 0x00, 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB,
944 0x7B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00,
945 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6,
946 0x6C, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00,
947 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
948 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE,
949 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
950 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00,
951 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
952 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
953 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
954 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
955 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C,
956 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00,
957 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60,
958 0xFE, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00,
959 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
960 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00,
961 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6C,
962 0xFE, 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00,
963 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
964 0x7C, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00,
965 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C,
966 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00,
967 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
968 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
969 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C,
970 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00,
971 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00,
972 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
973 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C,
974 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00,
975 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0,
976 0x7C, 0x06, 0x86, 0xC6, 0x7C, 0x18, 0x18,
977 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6,
978 0x0C, 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00,
979 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
980 0x76, 0xDC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
981 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30,
982 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
983 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30,
984 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00,
985 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C,
986 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00,
987 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C,
988 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00,
989 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
990 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
991 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
992 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
993 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
994 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
995 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
996 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
997 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
998 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
999 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1000 0xD6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00,
1001 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18,
1002 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00,
1003 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C,
1004 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00,
1005 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06,
1006 0x3C, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1007 0x00, 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C,
1008 0xCC, 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
1009 0x00, 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0,
1010 0xFC, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1011 0x00, 0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0,
1012 0xFC, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1013 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C,
1014 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00,
1015 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1016 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1017 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1018 0x7E, 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00,
1019 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1020 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
1021 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1022 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
1023 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60,
1024 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00,
1025 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1026 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1027 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C,
1028 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00,
1029 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C,
1030 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00,
1031 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE,
1032 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00,
1033 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6,
1034 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1035 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1036 0x7C, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00,
1037 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1038 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00,
1039 0x00, 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66,
1040 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00,
1041 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68,
1042 0x78, 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00,
1043 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68,
1044 0x78, 0x68, 0x60, 0x60, 0xF0, 0x00, 0x00,
1045 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1046 0xC0, 0xDE, 0xC6, 0x66, 0x3A, 0x00, 0x00,
1047 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1048 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1049 0x00, 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18,
1050 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1051 0x00, 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C,
1052 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1053 0x00, 0x00, 0x00, 0xE6, 0x66, 0x6C, 0x6C,
1054 0x78, 0x6C, 0x6C, 0x66, 0xE6, 0x00, 0x00,
1055 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60,
1056 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00,
1057 0x00, 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xD6,
1058 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1059 0x00, 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE,
1060 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1061 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1062 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1063 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1064 0x7C, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00,
1065 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1066 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x0E, 0x00,
1067 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1068 0x7C, 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00,
1069 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60,
1070 0x38, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1071 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x5A, 0x18,
1072 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1073 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1074 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1075 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1076 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00,
1077 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1078 0xD6, 0xD6, 0xFE, 0x6C, 0x6C, 0x00, 0x00,
1079 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7C,
1080 0x38, 0x7C, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1081 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1082 0x3C, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1083 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x8C, 0x18,
1084 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00,
1085 0x00, 0x00, 0x00, 0x3C, 0x30, 0x30, 0x30,
1086 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00,
1087 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70,
1088 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00,
1089 0x00, 0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C,
1090 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x00,
1091 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
1092 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1093 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1094 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1095 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1096 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1097 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
1098 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1099 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x78,
1100 0x6C, 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00,
1101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1102 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1103 0x00, 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C,
1104 0x6C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1106 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1107 0x00, 0x00, 0x00, 0x1C, 0x36, 0x32, 0x30,
1108 0x7C, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00,
1109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1110 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x78,
1111 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C,
1112 0x76, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00,
1113 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x38,
1114 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1115 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E,
1116 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C,
1117 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66,
1118 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00,
1119 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18,
1120 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC,
1122 0xFE, 0xD6, 0xD6, 0xD6, 0xD6, 0x00, 0x00,
1123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1124 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00,
1125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1126 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1128 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xF0,
1129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1130 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
1131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1132 0x76, 0x66, 0x60, 0x60, 0xF0, 0x00, 0x00,
1133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1134 0xC6, 0x70, 0x1C, 0xC6, 0x7C, 0x00, 0x00,
1135 0x00, 0x00, 0x00, 0x10, 0x30, 0x30, 0xFC,
1136 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00,
1137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC,
1138 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1140 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00,
1141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1142 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00,
1143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1144 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00,
1145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1146 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
1147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1148 0xCC, 0x18, 0x30, 0x66, 0xFE, 0x00, 0x00,
1149 0x00, 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18,
1150 0x70, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00,
1151 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1152 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
1153 0x00, 0x00, 0x00, 0x70, 0x18, 0x18, 0x18,
1154 0x0E, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00,
1155 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1158 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00, 0x00,
1159 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1160 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x18, 0x70,
1161 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0xCC,
1162 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1163 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x7C,
1164 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1165 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x78,
1166 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1167 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x78,
1168 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1169 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 0x78,
1170 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1171 0x00, 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78,
1172 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1174 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x18, 0x70,
1175 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C,
1176 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1177 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x7C,
1178 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1179 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C,
1180 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1181 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x38,
1182 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1183 0x00, 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38,
1184 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1185 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x38,
1186 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1187 0x00, 0xC6, 0x00, 0x10, 0x38, 0x6C, 0xC6,
1188 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1189 0x38, 0x6C, 0x38, 0x10, 0x38, 0x6C, 0xC6,
1190 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1191 0x0C, 0x18, 0x00, 0xFE, 0x66, 0x62, 0x68,
1192 0x78, 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00,
1193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC,
1194 0x36, 0x76, 0xDC, 0xD8, 0x6E, 0x00, 0x00,
1195 0x00, 0x00, 0x00, 0x3E, 0x6C, 0xCC, 0xCC,
1196 0xFE, 0xCC, 0xCC, 0xCC, 0xCE, 0x00, 0x00,
1197 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C,
1198 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1199 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x7C,
1200 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1201 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C,
1202 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1203 0x00, 0x00, 0x30, 0x78, 0xCC, 0x00, 0xCC,
1204 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1205 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 0xCC,
1206 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1207 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0xC6,
1208 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
1209 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1210 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1211 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1212 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1213 0x00, 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6,
1214 0xC0, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
1215 0x00, 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60,
1216 0xF0, 0x60, 0x60, 0x66, 0xFC, 0x00, 0x00,
1217 0x00, 0x00, 0x00, 0x66, 0x66, 0x3C, 0x18,
1218 0x7E, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
1219 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x7C,
1220 0x62, 0x66, 0x6F, 0x66, 0xF3, 0x00, 0x00,
1221 0x00, 0x00, 0x00, 0x0E, 0x1B, 0x18, 0x18,
1222 0x7E, 0x18, 0x18, 0xD8, 0x70, 0x00, 0x00,
1223 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78,
1224 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1225 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x38,
1226 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1227 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x7C,
1228 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1229 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0xCC,
1230 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1231 0x00, 0x00, 0x00, 0x76, 0xDC, 0x00, 0xDC,
1232 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00,
1233 0x76, 0xDC, 0x00, 0xC6, 0xE6, 0xF6, 0xFE,
1234 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1235 0x00, 0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x36,
1236 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1237 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
1238 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
1239 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30,
1240 0x30, 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1242 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
1243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1244 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00,
1245 0x00, 0x60, 0xE0, 0x63, 0x66, 0x6C, 0x18,
1246 0x30, 0x6E, 0xC3, 0x06, 0x0C, 0x1F, 0x00,
1247 0x00, 0x60, 0xE0, 0x63, 0x66, 0x6C, 0x18,
1248 0x36, 0x6E, 0xDA, 0x3F, 0x06, 0x06, 0x00,
1249 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18,
1250 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00,
1251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1252 0x36, 0x6C, 0xD8, 0x6C, 0x36, 0x00, 0x00,
1253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1254 0xD8, 0x6C, 0x36, 0x6C, 0xD8, 0x00, 0x00,
1255 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11,
1256 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1257 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1258 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
1259 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD,
1260 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1261 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1262 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1263 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1264 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1265 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18,
1266 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1267 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1268 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1270 0xFE, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1271 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18,
1272 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1273 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06,
1274 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1275 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1276 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1277 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06,
1278 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1279 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06,
1280 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1281 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1282 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1283 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18,
1284 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1286 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1287 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1288 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1289 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1290 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1292 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1293 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1294 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1296 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1297 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1298 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1299 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18,
1300 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1301 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1302 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1303 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30,
1304 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1305 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30,
1306 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1307 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00,
1308 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1309 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1310 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1311 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30,
1312 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1313 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1314 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1315 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00,
1316 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1317 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00,
1318 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1319 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1320 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1321 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1322 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1324 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1325 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1326 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1327 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18,
1328 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1329 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18,
1330 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1332 0x3F, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1333 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1334 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1335 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18,
1336 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1337 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1338 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1340 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1341 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1342 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1344 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1345 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1346 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1347 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1348 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1349 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1352 0xDC, 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00,
1353 0x00, 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8,
1354 0xCC, 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00,
1355 0x00, 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC0,
1356 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00,
1357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1358 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00,
1359 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x60, 0x30,
1360 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00,
1361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1362 0xD8, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00,
1363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66,
1364 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
1365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1366 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
1367 0x00, 0x00, 0x00, 0x7E, 0x18, 0x3C, 0x66,
1368 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00,
1369 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1370 0xFE, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00,
1371 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1372 0xC6, 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00,
1373 0x00, 0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C,
1374 0x3E, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00,
1375 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB,
1376 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1377 0x00, 0x00, 0x00, 0x03, 0x06, 0x7E, 0xDB,
1378 0xDB, 0xF3, 0x7E, 0x60, 0xC0, 0x00, 0x00,
1379 0x00, 0x00, 0x00, 0x1E, 0x30, 0x60, 0x60,
1380 0x7E, 0x60, 0x60, 0x30, 0x1E, 0x00, 0x00,
1381 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1382 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
1383 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
1384 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
1385 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1386 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
1387 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06,
1388 0x0C, 0x18, 0x30, 0x00, 0x7E, 0x00, 0x00,
1389 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60,
1390 0x30, 0x18, 0x0C, 0x00, 0x7E, 0x00, 0x00,
1391 0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18,
1392 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1393 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1394 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00,
1395 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
1396 0x7E, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
1397 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1398 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1399 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
1400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1402 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1404 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1405 0x00, 0x00, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C,
1406 0x0C, 0xEC, 0x6C, 0x3C, 0x1C, 0x00, 0x00,
1407 0x00, 0x00, 0x00, 0x6C, 0x36, 0x36, 0x36,
1408 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
1409 0x00, 0x00, 0x00, 0x3C, 0x66, 0x0C, 0x18,
1410 0x32, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1411 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E,
1412 0x7E, 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00,
1413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1417 static CONST UCHAR Font8x16
[VGA_FONT_CHARACTERS
* 16] =
1419 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1421 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD,
1422 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00,
1423 0x00, 0x00, 0x7C, 0xFE, 0xFE, 0xD6, 0xFE, 0xFE,
1424 0xBA, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00,
1425 0x00, 0x00, 0x00, 0x6C, 0xEE, 0xFE, 0xFE, 0xFE,
1426 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1427 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C,
1428 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1429 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x10, 0x6C,
1430 0xEE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
1431 0x00, 0x00, 0x10, 0x38, 0x7C, 0x7C, 0xFE, 0xFE,
1432 0xFE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
1433 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C,
1434 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1435 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3,
1436 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1437 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x66, 0x66,
1438 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1439 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0x99, 0x99,
1440 0x99, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1441 0x00, 0x00, 0x1E, 0x0E, 0x1E, 0x36, 0x78, 0xCC,
1442 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1443 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18,
1444 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1445 0x00, 0x00, 0x1E, 0x1A, 0x1E, 0x18, 0x18, 0x18,
1446 0x18, 0x78, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00,
1447 0x00, 0x00, 0x3E, 0x36, 0x3E, 0x36, 0x36, 0x76,
1448 0xF6, 0x66, 0x0E, 0x1E, 0x0C, 0x00, 0x00, 0x00,
1449 0x00, 0x00, 0x18, 0xDB, 0x7E, 0x3C, 0x66, 0x66,
1450 0x3C, 0x7E, 0xDB, 0x18, 0x00, 0x00, 0x00, 0x00,
1451 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xFE,
1452 0xFC, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00,
1453 0x00, 0x00, 0x00, 0x02, 0x0E, 0x3E, 0x7E, 0xFE,
1454 0x7E, 0x3E, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00,
1455 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1456 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1457 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
1458 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1459 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0xDB, 0x7B,
1460 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00,
1461 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x7C, 0xF6,
1462 0xDE, 0x7C, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1463 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1464 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00,
1465 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1466 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1467 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1468 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1469 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1470 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1471 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0xFF,
1472 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1473 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xFE,
1474 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
1476 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1477 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF,
1478 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1479 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x7C,
1480 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1481 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x7C,
1482 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1483 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1484 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1485 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x3C, 0x18,
1486 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1487 0x00, 0x36, 0x36, 0x36, 0x36, 0x14, 0x00, 0x00,
1488 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1489 0x00, 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C,
1490 0xFE, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1491 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0x78,
1492 0x3C, 0x06, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
1493 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x66, 0x0C,
1494 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00, 0x00, 0x00,
1495 0x00, 0x00, 0x38, 0x6C, 0x38, 0x30, 0x76, 0x7E,
1496 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1497 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1498 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1499 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30,
1500 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1501 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C,
1502 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1503 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x38, 0xFE,
1504 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1505 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E,
1506 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1507 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1508 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1509 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1510 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1511 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1512 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1513 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
1514 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
1515 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xCE, 0xDE, 0xF6,
1516 0xE6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1517 0x00, 0x00, 0x18, 0x78, 0x18, 0x18, 0x18, 0x18,
1518 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1519 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x06, 0x0C, 0x18,
1520 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1521 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06,
1522 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1523 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xCC,
1524 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00,
1525 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06,
1526 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1527 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xFC, 0xC6,
1528 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1529 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C, 0x18, 0x30,
1530 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
1531 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6,
1532 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1533 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E,
1534 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1535 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1536 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1537 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1538 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1539 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0xC0,
1540 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1541 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
1542 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1543 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06,
1544 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
1545 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18,
1546 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1547 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xDE, 0xDE,
1548 0xDE, 0xDC, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00,
1549 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE,
1550 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1551 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66,
1552 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1553 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0,
1554 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1555 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66,
1556 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,
1557 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1558 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1559 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1560 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1561 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0,
1562 0xCE, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1563 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6,
1564 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1565 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1566 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1567 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1568 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1569 0x00, 0x00, 0xC6, 0xC6, 0xCC, 0xD8, 0xF0, 0xF0,
1570 0xD8, 0xCC, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1571 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60,
1572 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1573 0x00, 0x00, 0xC6, 0xC6, 0xEE, 0xEE, 0xFE, 0xD6,
1574 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1575 0x00, 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xF6, 0xDE,
1576 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1577 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1578 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1579 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x66, 0x7C,
1580 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1581 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1582 0xC6, 0xD6, 0xD6, 0x7C, 0x06, 0x00, 0x00, 0x00,
1583 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x78,
1584 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1585 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0x70, 0x1C,
1586 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1587 0x00, 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18,
1588 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1589 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1590 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1591 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1592 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1593 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6,
1594 0xFE, 0xEE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1595 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x38,
1596 0x6C, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1597 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C,
1598 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1599 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30,
1600 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1601 0x00, 0x00, 0x7C, 0x60, 0x60, 0x60, 0x60, 0x60,
1602 0x60, 0x60, 0x60, 0x7C, 0x00, 0x00, 0x00, 0x00,
1603 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30,
1604 0x18, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1605 0x00, 0x00, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
1606 0x0C, 0x0C, 0x0C, 0x7C, 0x00, 0x00, 0x00, 0x00,
1607 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00,
1608 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1609 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1610 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
1611 0x00, 0x18, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x00,
1612 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1613 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1614 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1615 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1616 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1617 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1618 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1619 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC,
1620 0xCC, 0xCC, 0xCC, 0x7E, 0x00, 0x00, 0x00, 0x00,
1621 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1622 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1623 0x00, 0x00, 0x1C, 0x36, 0x30, 0x30, 0xFC, 0x30,
1624 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00,
1625 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCE, 0xC6,
1626 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1627 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1628 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1629 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18,
1630 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1631 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x0C,
1632 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1633 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x66, 0x6C,
1634 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1635 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1636 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00,
1637 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xD6,
1638 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1639 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1640 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1641 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1642 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1643 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1644 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x00,
1645 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC,
1646 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
1647 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x60,
1648 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1649 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1650 0x7C, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1651 0x00, 0x00, 0x30, 0x30, 0x30, 0xFC, 0x30, 0x30,
1652 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,
1653 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC,
1654 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1655 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1656 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1657 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6,
1658 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00,
1659 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x6C,
1660 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1661 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1662 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1663 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x86, 0x0C,
1664 0x18, 0x30, 0x62, 0xFE, 0x00, 0x00, 0x00, 0x00,
1665 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18,
1666 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00,
1667 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
1668 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1669 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18,
1670 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
1671 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1672 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1673 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
1674 0x6C, 0x6C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1675 0x00, 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0xC6,
1676 0x66, 0x3C, 0x18, 0x0C, 0xCC, 0x38, 0x00, 0x00,
1677 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1678 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1679 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1680 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1681 0x00, 0x30, 0x78, 0xCC, 0x00, 0x78, 0x0C, 0x7C,
1682 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1683 0x00, 0x00, 0xCC, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1684 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1685 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C,
1686 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1687 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78, 0x0C, 0x7C,
1688 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1689 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0,
1690 0xC6, 0x7C, 0x18, 0x0C, 0x6C, 0x38, 0x00, 0x00,
1691 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1692 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1693 0x00, 0x00, 0xCC, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1694 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1695 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1696 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1697 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
1698 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1699 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18,
1700 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1701 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18,
1702 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1703 0x00, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6,
1704 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1705 0x38, 0x6C, 0x38, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1706 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1707 0x0C, 0x18, 0x30, 0x00, 0xFE, 0x60, 0x60, 0x7C,
1708 0x60, 0x60, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00,
1709 0x00, 0x00, 0x00, 0x00, 0x66, 0xDB, 0x1B, 0x7F,
1710 0xD8, 0xD8, 0xDF, 0x76, 0x00, 0x00, 0x00, 0x00,
1711 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xD8, 0xFE,
1712 0xD8, 0xD8, 0xD8, 0xDE, 0x00, 0x00, 0x00, 0x00,
1713 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1714 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1715 0x00, 0x00, 0xC6, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1716 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1717 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1718 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1719 0x00, 0x30, 0x78, 0xCC, 0x00, 0xC6, 0xC6, 0xC6,
1720 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1721 0x00, 0x60, 0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6,
1722 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1723 0x00, 0x18, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18,
1724 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1725 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6,
1726 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1727 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1728 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1729 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0xC0,
1730 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1731 0x00, 0x38, 0x6C, 0x60, 0x60, 0xF0, 0x60, 0x60,
1732 0x60, 0x66, 0xF6, 0x6C, 0x00, 0x00, 0x00, 0x00,
1733 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E,
1734 0x18, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1735 0x00, 0x00, 0x3E, 0x63, 0x63, 0x30, 0x1C, 0x06,
1736 0x63, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1737 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x63, 0x38,
1738 0x0E, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1739 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78, 0x0C, 0x7C,
1740 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1741 0x00, 0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18,
1742 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1743 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1744 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1745 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC,
1746 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1747 0x00, 0x00, 0x76, 0xDC, 0x00, 0xBC, 0x66, 0x66,
1748 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1749 0x00, 0x76, 0xDC, 0x00, 0xC6, 0xC6, 0xE6, 0xF6,
1750 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1751 0x00, 0x21, 0x1E, 0x00, 0x1E, 0x33, 0x60, 0x60,
1752 0x67, 0x63, 0x33, 0x1D, 0x00, 0x00, 0x00, 0x00,
1753 0x00, 0x42, 0x3C, 0x00, 0x3B, 0x66, 0x66, 0x66,
1754 0x3E, 0x06, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1755 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30,
1756 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1757 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1758 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
1759 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1760 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
1761 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x30,
1762 0x60, 0xDC, 0x36, 0x0C, 0x18, 0x3E, 0x00, 0x00,
1763 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x36,
1764 0x6E, 0xDE, 0x36, 0x7E, 0x06, 0x06, 0x00, 0x00,
1765 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x3C,
1766 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1767 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6C, 0xD8,
1768 0x6C, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1769 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x6C, 0x36,
1770 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1771 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1772 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1773 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1774 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1775 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1776 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1777 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1778 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1779 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1780 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1781 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1782 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1783 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6,
1784 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1786 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1787 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8,
1788 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1789 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xF6,
1790 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1791 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1792 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1793 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6,
1794 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1795 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xFE,
1796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1797 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE,
1798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1799 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1800 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1801 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
1802 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1803 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1804 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1805 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1807 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1808 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1809 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1810 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1811 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1812 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1813 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1814 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1815 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1816 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1817 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
1818 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1819 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3F,
1820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1821 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37,
1822 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1823 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF,
1824 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1825 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7,
1826 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1827 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37,
1828 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1829 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1830 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1831 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7,
1832 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1833 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF,
1834 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1835 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1836 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1837 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1838 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1840 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1841 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F,
1842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1843 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1845 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F,
1846 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1847 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
1848 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1849 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1850 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1851 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF,
1852 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1853 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1854 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1855 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
1856 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1857 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1858 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1859 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1860 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1861 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1862 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1863 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1864 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1865 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1866 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1867 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0xD8, 0xD8,
1868 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1869 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8, 0xFC, 0xC6,
1870 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00, 0x00, 0x00,
1871 0x00, 0x00, 0xFE, 0x66, 0x62, 0x60, 0x60, 0x60,
1872 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00,
1873 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x6C, 0x6C,
1874 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1875 0x00, 0x00, 0xFE, 0xC6, 0x62, 0x30, 0x18, 0x18,
1876 0x30, 0x62, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1877 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xCC,
1878 0xCC, 0xCC, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1879 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1880 0x66, 0x7C, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
1881 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18,
1882 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1883 0x00, 0x00, 0xFE, 0x38, 0x38, 0x6C, 0xC6, 0xC6,
1884 0x6C, 0x38, 0x38, 0xFE, 0x00, 0x00, 0x00, 0x00,
1885 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE,
1886 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
1887 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6,
1888 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00, 0x00, 0x00,
1889 0x00, 0x00, 0x3E, 0x60, 0x60, 0x3C, 0x66, 0xC6,
1890 0xC6, 0xC6, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1891 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB,
1892 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1893 0x00, 0x00, 0x02, 0x06, 0x7C, 0xCE, 0xDE, 0xF6,
1894 0xF6, 0x7C, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00,
1895 0x00, 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C,
1896 0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00,
1897 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1898 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1899 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE,
1900 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1901 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1902 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1903 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18,
1904 0x30, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1905 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18,
1906 0x0C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1907 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1E, 0x1A, 0x18,
1908 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1909 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1910 0x18, 0x18, 0x58, 0x78, 0x30, 0x00, 0x00, 0x00,
1911 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E,
1912 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1913 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1914 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1915 0x00, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1916 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1917 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1918 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1919 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1920 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1921 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18,
1922 0xD8, 0xD8, 0x78, 0x38, 0x18, 0x00, 0x00, 0x00,
1923 0x00, 0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
1924 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1925 0x00, 0x00, 0x70, 0xD8, 0x18, 0x30, 0x60, 0xF8,
1926 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1927 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E,
1928 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1929 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1930 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1935 * Table of supported Video Modes.
1937 * See http://wiki.osdev.org/Drawing_In_Protected_Mode#Locating_Video_Memory
1938 * Values of PageSize taken from DOSBox.
1941 typedef struct _VGA_MODE
1943 PVGA_REGISTERS VgaRegisters
;
1945 WORD CharacterWidth
;
1946 WORD CharacterHeight
;
1947 // PCOLORREF Palette;
1948 } VGA_MODE
, *PVGA_MODE
;
1950 static CONST VGA_MODE VideoModes
[BIOS_MAX_VIDEO_MODE
+ 1] =
1952 {&VideoMode_40x25_text
, 0x0800, 9, 16}, /* Mode 00h - 16 color (mono) */
1953 {&VideoMode_40x25_text
, 0x0800, 9, 16}, /* Mode 01h - 16 color */
1954 {&VideoMode_80x25_text
, 0x1000, 9, 16}, /* Mode 02h - 16 color (mono) */
1955 {&VideoMode_80x25_text
, 0x1000, 9, 16}, /* Mode 03h - 16 color */
1956 {&VideoMode_320x200_4color
, 0x4000, 8, 8}, /* Mode 04h - CGA 4 color */
1957 {&VideoMode_320x200_4color
, 0x4000, 8, 8}, /* Mode 05h - CGA same (m) (uses 3rd CGA palette) */
1958 {&VideoMode_640x200_2color
, 0x4000, 8, 8}, /* Mode 06h - CGA 640*200 2 color */
1959 {NULL
, 0x1000, 1, 1}, /* Mode 07h - MDA monochrome text 80*25 */
1960 {NULL
, 0x0000, 1, 1}, /* Mode 08h - PCjr */
1961 {NULL
, 0x0000, 1, 1}, /* Mode 09h - PCjr */
1962 {NULL
, 0x0000, 1, 1}, /* Mode 0Ah - PCjr */
1963 {NULL
, 0x0000, 1, 1}, /* Mode 0Bh - Reserved */
1964 {NULL
, 0x0000, 1, 1}, /* Mode 0Ch - Reserved */
1965 {&VideoMode_320x200_16color
, 0x2000, 8, 8}, /* Mode 0Dh - EGA 320*200 16 color */
1966 {&VideoMode_640x200_16color
, 0x4000, 8, 8}, /* Mode 0Eh - EGA 640*200 16 color */
1967 {NULL
, 0x8000, 1, 1}, /* Mode 0Fh - EGA 640*350 mono */
1968 {&VideoMode_640x350_16color
, 0x8000, 8, 14}, /* Mode 10h - EGA 640*350 HiRes 16 color */
1969 {&VideoMode_640x480_2color
, 0xA000, 8, 16}, /* Mode 11h - VGA 640*480 mono */
1970 {&VideoMode_640x480_16color
, 0xA000, 8, 16}, /* Mode 12h - VGA */
1971 {&VideoMode_320x200_256color
, 0x2000, 8, 8}, /* Mode 13h - VGA */
1974 #define IS_TEXT_MODE(ModeNumber) \
1975 (((ModeNumber) >= 0x00 && (ModeNumber) <= 0x03) || ((ModeNumber) == 0x07))
1977 static PVGA_STATIC_FUNC_TABLE VgaStaticFuncTable
;
1978 static BOOLEAN VbeInitialized
= FALSE
;
1980 /* PRIVATE FUNCTIONS **********************************************************/
1982 static BOOLEAN
VidBiosScrollWindow(SCROLL_DIRECTION Direction
,
1984 SMALL_RECT Rectangle
,
1989 DWORD VideoAddress
= TO_LINEAR(TEXT_VIDEO_SEG
, Page
* Bda
->VideoPageSize
);
1990 WORD FillCharacter
= MAKEWORD(' ', FillAttribute
);
1992 WORD WindowWidth
, WindowHeight
;
1994 /* TODO: This function doesn't work in non-alphanumeric modes yet */
1995 if (Bda
->VideoMode
> 3)
1997 DPRINT1("VidBiosScrollWindow: not implemented for mode 0%Xh\n", Bda
->VideoMode
);
2001 /* Fixup the rectangle if needed */
2002 Rectangle
.Left
= min(max(Rectangle
.Left
, 0), Bda
->ScreenColumns
- 1);
2003 Rectangle
.Right
= min(max(Rectangle
.Right
, 0), Bda
->ScreenColumns
- 1);
2004 Rectangle
.Top
= min(max(Rectangle
.Top
, 0), Bda
->ScreenRows
);
2005 Rectangle
.Bottom
= min(max(Rectangle
.Bottom
, 0), Bda
->ScreenRows
);
2007 WindowWidth
= Rectangle
.Right
- Rectangle
.Left
+ 1;
2008 WindowHeight
= Rectangle
.Bottom
- Rectangle
.Top
+ 1;
2010 /* Amount == 0 means we clear all the rectangle */
2011 if ((Amount
== 0) ||
2012 (((Direction
== SCROLL_UP
) || (Direction
== SCROLL_DOWN
)) && (Amount
>= WindowHeight
)) ||
2013 (((Direction
== SCROLL_LEFT
) || (Direction
== SCROLL_RIGHT
)) && (Amount
>= WindowWidth
)))
2015 /* Fill the rectangle */
2016 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2018 for (j
= Rectangle
.Left
; j
<= Rectangle
.Right
; j
++)
2020 EmulatorWriteMemory(&EmulatorContext
,
2021 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2022 (LPVOID
)&FillCharacter
,
2023 sizeof(FillCharacter
));
2034 /* Move text lines up */
2035 for (i
= Rectangle
.Top
+ Amount
; i
<= Rectangle
.Bottom
; i
++)
2037 EmulatorCopyMemory(&EmulatorContext
,
2038 VideoAddress
+ ((i
- Amount
) * Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
),
2039 VideoAddress
+ ( i
* Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
),
2040 (Rectangle
.Right
- Rectangle
.Left
+ 1) * sizeof(WORD
));
2043 /* Fill the bottom of the rectangle */
2044 for (i
= Rectangle
.Bottom
- Amount
+ 1; i
<= Rectangle
.Bottom
; i
++)
2046 for (j
= Rectangle
.Left
; j
<= Rectangle
.Right
; j
++)
2048 EmulatorWriteMemory(&EmulatorContext
,
2049 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2050 (LPVOID
)&FillCharacter
,
2051 sizeof(FillCharacter
));
2062 /* Move text lines down */
2063 for (i
= Rectangle
.Bottom
- Amount
; i
>= Rectangle
.Top
; i
--)
2065 EmulatorCopyMemory(&EmulatorContext
,
2066 VideoAddress
+ ((i
+ Amount
) * Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
),
2067 VideoAddress
+ ( i
* Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
),
2068 (Rectangle
.Right
- Rectangle
.Left
+ 1) * sizeof(WORD
));
2071 /* Fill the top of the rectangle */
2072 Bottom
= Rectangle
.Top
+ Amount
- 1;
2073 for (i
= Rectangle
.Top
; i
<= Bottom
; i
++)
2075 for (j
= Rectangle
.Left
; j
<= Rectangle
.Right
; j
++)
2077 EmulatorWriteMemory(&EmulatorContext
,
2078 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2079 (LPVOID
)&FillCharacter
,
2080 sizeof(FillCharacter
));
2089 /* Move text lines left */
2090 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2092 EmulatorCopyMemory(&EmulatorContext
,
2093 VideoAddress
+ (i
* Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
),
2094 VideoAddress
+ (i
* Bda
->ScreenColumns
+ Rectangle
.Left
+ Amount
) * sizeof(WORD
),
2095 (Rectangle
.Right
- Rectangle
.Left
- Amount
+ 1) * sizeof(WORD
));
2098 /* Fill the right of the rectangle */
2099 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2101 for (j
= Rectangle
.Right
- Amount
+ 1; j
<= Rectangle
.Right
; j
++)
2103 EmulatorWriteMemory(&EmulatorContext
,
2104 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2105 (LPVOID
)&FillCharacter
,
2106 sizeof(FillCharacter
));
2117 /* Move text lines right */
2118 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2120 EmulatorCopyMemory(&EmulatorContext
,
2121 VideoAddress
+ (i
* Bda
->ScreenColumns
+ Rectangle
.Left
+ Amount
) * sizeof(WORD
),
2122 VideoAddress
+ (i
* Bda
->ScreenColumns
+ Rectangle
.Left
) * sizeof(WORD
),
2123 (Rectangle
.Right
- Rectangle
.Left
- Amount
+ 1) * sizeof(WORD
));
2126 /* Fill the left of the rectangle */
2127 Right
= Rectangle
.Left
+ Amount
- 1;
2128 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
2130 for (j
= Rectangle
.Left
; j
<= Right
; j
++)
2132 EmulatorWriteMemory(&EmulatorContext
,
2133 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
2134 (LPVOID
)&FillCharacter
,
2135 sizeof(FillCharacter
));
2146 static __inline VOID
VgaSetSinglePaletteRegister(BYTE Index
, BYTE Value
)
2148 /* Write the index */
2149 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2150 IOWriteB(VGA_AC_INDEX
, Index
);
2152 /* Write the data */
2153 IOWriteB(VGA_AC_WRITE
, Value
);
2156 static BOOLEAN
VgaSetRegisters(PVGA_REGISTERS Registers
)
2160 if (Registers
== NULL
) return FALSE
;
2162 /* Disable interrupts */
2166 * Set the CRT base address according to the selected mode,
2167 * monochrome or color. The following macros:
2168 * VGA_INSTAT1_READ, VGA_CRTC_INDEX and VGA_CRTC_DATA are then
2169 * used to access the correct VGA I/O ports.
2171 Bda
->CrtBasePort
= (Registers
->Misc
& 0x01) ? VGA_CRTC_INDEX_COLOR
2172 : VGA_CRTC_INDEX_MONO
;
2173 /* Bit 1 indicates whether display is color (0) or monochrome (1) */
2174 Bda
->VGAOptions
= (Bda
->VGAOptions
& 0xFD) | (!(Registers
->Misc
& 0x01) << 1);
2175 Bda
->CrtModeControl
= (Bda
->CrtModeControl
& 0xFB) | (!(Registers
->Misc
& 0x01) << 1);
2177 /* Update blink bit in BDA */
2178 if (Registers
->Attribute
[VGA_AC_CONTROL_REG
] & VGA_AC_CONTROL_BLINK
)
2179 Bda
->CrtModeControl
|= (1 << 5);
2181 Bda
->CrtModeControl
&= ~(1 << 5);
2183 /* Turn the video off */
2184 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_CLOCK_REG
);
2185 IOWriteB(VGA_SEQ_DATA
, IOReadB(VGA_SEQ_DATA
) | VGA_SEQ_CLOCK_SD
);
2187 /* Write the misc register */
2188 IOWriteB(VGA_MISC_WRITE
, Registers
->Misc
);
2190 /* Synchronous reset on */
2191 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_RESET_REG
);
2192 IOWriteB(VGA_SEQ_DATA
, VGA_SEQ_RESET_AR
);
2194 /* Write the sequencer registers */
2195 for (i
= 1; i
< VGA_SEQ_MAX_REG
; i
++)
2197 IOWriteB(VGA_SEQ_INDEX
, i
);
2198 IOWriteB(VGA_SEQ_DATA
, Registers
->Sequencer
[i
]);
2201 /* Synchronous reset off */
2202 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_RESET_REG
);
2203 IOWriteB(VGA_SEQ_DATA
, VGA_SEQ_RESET_SR
| VGA_SEQ_RESET_AR
);
2205 /* Unlock CRTC registers 0-7 */
2206 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_END_HORZ_BLANKING_REG
);
2207 IOWriteB(VGA_CRTC_DATA
, IOReadB(VGA_CRTC_DATA
) | 0x80);
2208 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_VERT_RETRACE_END_REG
);
2209 IOWriteB(VGA_CRTC_DATA
, IOReadB(VGA_CRTC_DATA
) & ~0x80);
2210 // Make sure they remain unlocked
2211 Registers
->CRT
[VGA_CRTC_END_HORZ_BLANKING_REG
] |= 0x80;
2212 Registers
->CRT
[VGA_CRTC_VERT_RETRACE_END_REG
] &= ~0x80;
2214 /* Write the CRTC registers */
2215 for (i
= 0; i
< VGA_CRTC_MAX_REG
; i
++)
2217 IOWriteB(VGA_CRTC_INDEX
, i
);
2218 IOWriteB(VGA_CRTC_DATA
, Registers
->CRT
[i
]);
2221 /* Write the GC registers */
2222 for (i
= 0; i
< VGA_GC_MAX_REG
; i
++)
2224 IOWriteB(VGA_GC_INDEX
, i
);
2225 IOWriteB(VGA_GC_DATA
, Registers
->Graphics
[i
]);
2228 /* Write the AC registers */
2229 for (i
= 0; i
< VGA_AC_MAX_REG
; i
++)
2231 VgaSetSinglePaletteRegister(i
, Registers
->Attribute
[i
]);
2234 /* Set the PEL mask */
2235 IOWriteB(VGA_DAC_MASK
, 0xFF);
2237 /* Enable screen and disable palette access */
2238 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2239 IOWriteB(VGA_AC_INDEX
, 0x20);
2241 /* Turn the video on */
2242 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_CLOCK_REG
);
2243 IOWriteB(VGA_SEQ_DATA
, IOReadB(VGA_SEQ_DATA
) & ~VGA_SEQ_CLOCK_SD
);
2245 /* Enable interrupts */
2251 static VOID
VgaSetPalette(const COLORREF
* Palette
, ULONG Size
)
2255 // /* Disable screen and enable palette access */
2256 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2257 // IOWriteB(VGA_AC_INDEX, 0x00);
2259 for (i
= 0; i
< Size
; i
++)
2261 IOWriteB(VGA_DAC_WRITE_INDEX
, i
);
2262 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(GetRValue(Palette
[i
])));
2263 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(GetGValue(Palette
[i
])));
2264 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(GetBValue(Palette
[i
])));
2267 /* The following step might be optional */
2268 for (i
= Size
; i
< VGA_MAX_COLORS
; i
++)
2270 IOWriteB(VGA_DAC_WRITE_INDEX
, i
);
2271 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(0x00));
2272 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(0x00));
2273 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(0x00));
2276 /* Enable screen and disable palette access */
2277 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2278 // IOWriteB(VGA_AC_INDEX, 0x20);
2281 static VOID
VgaChangePalette(BYTE ModeNumber
)
2283 const COLORREF
* Palette
;
2286 if (ModeNumber
>= 0x13)
2289 Palette
= VgaPalette
;
2290 Size
= ARRAYSIZE(VgaPalette
);
2292 else if (ModeNumber
== 0x10) // || (ModeNumber == 0x0D) || (ModeNumber == 0x0E)
2294 /* EGA HiRes mode */
2295 Palette
= EgaPalette__HiRes
;
2296 Size
= ARRAYSIZE(EgaPalette__HiRes
);
2299 else if ((ModeNumber
== 0x04) || (ModeNumber
== 0x05))
2302 * CGA modes; this palette contains both normal and
2303 * bright versions of CGA palettes 0 and 1
2305 Palette
= CgaPalette2
;
2306 Size
= ARRAYSIZE(CgaPalette2
);
2309 else // if ((ModeNumber == 0x0D) || (ModeNumber == 0x0E))
2312 Palette
= EgaPalette__16Colors
;
2313 Size
= ARRAYSIZE(EgaPalette__16Colors
);
2316 VgaSetPalette(Palette
, Size
);
2319 static __inline VOID
VidBiosGetCursorPosition(PBYTE Row
, PBYTE Column
, BYTE Page
)
2321 *Row
= HIBYTE(Bda
->CursorPosition
[Page
]);
2322 *Column
= LOBYTE(Bda
->CursorPosition
[Page
]);
2325 static VOID
VidBiosSetCursorPosition(BYTE Row
, BYTE Column
, BYTE Page
)
2327 /* Update the position in the BDA */
2328 Bda
->CursorPosition
[Page
] = MAKEWORD(Column
, Row
);
2330 /* Check if this is the current video page */
2331 if (Page
== Bda
->VideoPage
)
2333 WORD Offset
= Row
* Bda
->ScreenColumns
+ Column
;
2335 /* Modify the CRTC registers */
2336 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_LOW_REG
);
2337 IOWriteB(VGA_CRTC_DATA
, LOBYTE(Offset
));
2338 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_HIGH_REG
);
2339 IOWriteB(VGA_CRTC_DATA
, HIBYTE(Offset
));
2343 static VOID
VidBiosSetCursorShape(WORD CursorStartEnd
)
2345 /* Only valid in text-mode */
2346 if (!IS_TEXT_MODE(Bda
->VideoMode
)) return;
2348 /* Update the BDA */
2349 Bda
->CursorStartLine
= HIBYTE(CursorStartEnd
) & 0x1F;
2350 Bda
->CursorEndLine
= LOBYTE(CursorStartEnd
) & 0x1F;
2353 * In cursor emulation mode, we suppose the cursor scanlines
2354 * to be in CGA mode, so that we need to adjust them
2358 * Contrary to what is mentioned in lots of literature out there, e.g. in:
2359 * http://webpages.charter.net/danrollins/techhelp/0072.HTM
2360 * http://www.bioscentral.com/misc/bda.htm
2361 * and in other various places, bit 0 of Bda->VGAOptions is 0 when
2362 * cursor emulation is ENABLED, and is 1 when it is DISABLED.
2364 * The following documentation is right about this fact:
2365 * http://www.cs.nyu.edu/~mwalfish/classes/ut/s12-cs372h/ref/hardware/vgadoc/VGABIOS.TXT
2366 * https://sites.google.com/site/pcdosretro/biosdata
2368 * A proof that it is OK is that in the following code samples it is
2369 * explicitely mentioned that setting bit 0 disables cursor emulation:
2370 * - Code snippets in PC Magazine vol.5 num.15 of 16/09/1986, p.291-292;
2371 * - CardFile DOS utility (Jeff Prosise, PC Magazine vol.6 num.17 of 13/10/1987, p.403-416):
2372 * https://ia600700.us.archive.org/1/items/srccode-00000020/cardfile.asm.txt
2373 * (function 'show_cursor', "or ega_info,1 ;disable EGA cursor emulation")
2375 if (!(Bda
->VGAOptions
& 0x01))
2377 // HACK: Quick "fix" for cursor scanline adjustment. This must be reworked.
2378 DPRINT1("HACK: Using HACK for cursor scanlines adjustment\n");
2379 CursorStartEnd
= MAKEWORD((LOBYTE(CursorStartEnd
) & 0x1F) * 2,
2380 (HIBYTE(CursorStartEnd
) & 0x1F) * 2 | (HIBYTE(CursorStartEnd
) & 0xE0));
2383 /* Modify the CRTC registers */
2384 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_START_REG
);
2385 IOWriteB(VGA_CRTC_DATA
, HIBYTE(CursorStartEnd
));
2386 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_END_REG
);
2387 IOWriteB(VGA_CRTC_DATA
, LOBYTE(CursorStartEnd
));
2390 static VOID
VidBiosSyncCursorPosition(VOID
)
2394 SHORT ScreenColumns
= Bda
->ScreenColumns
;
2397 /* Get the cursor position */
2398 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_LOW_REG
);
2399 Low
= IOReadB(VGA_CRTC_DATA
);
2400 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_HIGH_REG
);
2401 High
= IOReadB(VGA_CRTC_DATA
);
2403 Offset
= MAKEWORD(Low
, High
);
2405 Row
= (BYTE
)(Offset
/ ScreenColumns
);
2406 Column
= (BYTE
)(Offset
% ScreenColumns
);
2408 /* Synchronize our cursor position with VGA */
2409 VidBiosSetCursorPosition(Row
, Column
, Bda
->VideoPage
);
2412 static inline BYTE
VidBiosGetVideoMode(VOID
)
2414 /* Bit 7 of VideoMode is determined by bit 7 of VGAOptions */
2415 return Bda
->VideoMode
| (Bda
->VGAOptions
& 0x80);
2418 static inline VOID
VidBiosClearScreen(VOID
)
2420 static const DWORD MemoryMaps
[4] = { 0xA0000, 0xA0000, 0xB0000, 0xB8000 };
2421 static const DWORD MemorySizes
[4] = { 0x20000, 0x10000, 0x08000, 0x08000 };
2426 BYTE Buffer
[0x20000];
2428 /* Read the misc register */
2429 IOWriteB(VGA_GC_INDEX
, VGA_GC_MISC_REG
);
2430 Misc
= IOReadB(VGA_GC_DATA
);
2432 /* Get the video address and buffer size */
2433 VideoAddress
= MemoryMaps
[(Misc
>> 2) & 3];
2434 BufferSize
= MemorySizes
[(Misc
>> 2) & 3];
2436 // !IS_TEXT_MODE(Bda->VideoMode)
2440 RtlZeroMemory(Buffer
, BufferSize
);
2446 for (i
= 0; i
< (BufferSize
>> 1); i
++)
2448 ((PWORD
)Buffer
)[i
] = MAKEWORD(' ', DEFAULT_ATTRIBUTE
);
2452 /* Write to video memory */
2453 EmulatorWriteMemory(&EmulatorContext
, VideoAddress
, Buffer
, BufferSize
);
2456 static BOOLEAN
VidBiosSetVideoMode(BYTE ModeNumber
)
2460 BYTE OrgModeNumber
= ModeNumber
;
2463 * IBM standard modes do not clear the screen if the
2464 * high bit of AL is set (EGA or higher only).
2465 * See Ralf Brown: http://www.ctyme.com/intr/rb-0069.htm
2466 * for more information.
2468 BOOLEAN DoNotClear
= !!(ModeNumber
& 0x80);
2470 /* Retrieve the real mode number and check its validity */
2472 // if (ModeNumber >= ARRAYSIZE(VideoModes))
2473 if (ModeNumber
> BIOS_MAX_VIDEO_MODE
)
2475 DPRINT1("VidBiosSetVideoMode -- Mode %02Xh invalid\n", ModeNumber
);
2479 DPRINT1("Switching to mode %02Xh (%02Xh) %s clearing the screen; VgaRegisters = 0x%p\n",
2480 ModeNumber
, OrgModeNumber
, (DoNotClear
? "without" : "and"), VideoModes
[ModeNumber
].VgaRegisters
);
2482 if (!VgaSetRegisters(VideoModes
[ModeNumber
].VgaRegisters
)) return FALSE
;
2484 VgaChangePalette(ModeNumber
);
2486 /* Clear the VGA memory if needed */
2487 if (!DoNotClear
) VgaClearMemory();
2489 /* Update the values in the BDA */
2490 Bda
->VideoMode
= ModeNumber
;
2491 Bda
->VideoPageSize
= VideoModes
[ModeNumber
].PageSize
;
2493 Bda
->VideoPageOffset
= Bda
->VideoPage
* Bda
->VideoPageSize
;
2495 /* 256 KB Video RAM; set bit 7 if we do not clear the screen */
2496 Bda
->VGAOptions
= 0x60 | (Bda
->VGAOptions
& 0x7F) | (DoNotClear
? 0x80 : 0x00);
2497 Bda
->VGASwitches
= 0xF9; /* High-resolution */
2500 // Bda->CrtModeControl;
2501 // Bda->CrtColorPaletteMask;
2503 /* Set the start address in the CRTC */
2504 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_LOW_REG
);
2505 IOWriteB(VGA_CRTC_DATA
, LOBYTE(Bda
->VideoPageOffset
));
2506 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_HIGH_REG
);
2507 IOWriteB(VGA_CRTC_DATA
, HIBYTE(Bda
->VideoPageOffset
));
2509 /* Update the screen size */
2510 Resolution
= VgaGetDisplayResolution();
2511 // This could be simplified if the VGA helper always returned the resolution
2512 // in number of pixels, instead of in number of cells for text-modes only...
2513 if (!IS_TEXT_MODE(ModeNumber
))
2515 Resolution
.X
/= VideoModes
[ModeNumber
].CharacterWidth
;
2516 Resolution
.Y
/= VideoModes
[ModeNumber
].CharacterHeight
;
2518 Bda
->ScreenColumns
= Resolution
.X
;
2519 Bda
->ScreenRows
= Resolution
.Y
- 1;
2521 /* Update the current font */
2522 Bda
->CharacterHeight
= VideoModes
[ModeNumber
].CharacterHeight
;
2523 switch (Bda
->CharacterHeight
)
2526 * Write the default font to the VGA font plane for text-modes only.
2527 * Update the BIOS INT 43h vector (far pointer to the character range 00h-...).
2531 if (IS_TEXT_MODE(ModeNumber
))
2532 VgaWriteTextModeFont(0, Font8x8
, ARRAYSIZE(Font8x8
) / VGA_FONT_CHARACTERS
);
2534 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x8_OFFSET
, VIDEO_BIOS_DATA_SEG
);
2539 if (IS_TEXT_MODE(ModeNumber
))
2540 VgaWriteTextModeFont(0, Font8x14
, ARRAYSIZE(Font8x14
) / VGA_FONT_CHARACTERS
);
2542 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x14_OFFSET
, VIDEO_BIOS_DATA_SEG
);
2547 if (IS_TEXT_MODE(ModeNumber
))
2548 VgaWriteTextModeFont(0, Font8x16
, ARRAYSIZE(Font8x16
) / VGA_FONT_CHARACTERS
);
2550 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x16_OFFSET
, VIDEO_BIOS_DATA_SEG
);
2555 #if 0 // Commented, because I need to think about how to change correctly the ScreenRows
2556 // in the code that really use it (the Font generator functions of INT 10h, AH=11h)
2557 // so that it also changes the screen resolution *in text mode only*.
2560 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
2561 case 0x01: Bda
->ScreenRows
= 13; break;
2562 case 0x03: Bda
->ScreenRows
= 42; break;
2564 default : Bda
->ScreenRows
= 24; break;
2569 * Update the cursor shape (text-mode only).
2570 * Use the default CGA cursor scanline values,
2571 * see: http://vitaly_filatov.tripod.com/ng/asm/asm_023.2.html
2573 if (IS_TEXT_MODE(ModeNumber
))
2574 // FIXME: we might read the CRT registers and do the adjustment?
2575 VidBiosSetCursorShape(MAKEWORD(0x07, 0x06));
2577 /* Set the cursor position for each page */
2578 for (Page
= 0; Page
< BIOS_MAX_PAGES
; ++Page
)
2579 VidBiosSetCursorPosition(0, 0, Page
);
2581 if (!DoNotClear
) VidBiosClearScreen();
2583 /* Refresh display */
2584 VgaRefreshDisplay();
2589 static BOOLEAN
VidBiosSetVideoPage(BYTE PageNumber
)
2593 /* Check if the page exists */
2594 if (PageNumber
>= BIOS_MAX_PAGES
) return FALSE
;
2596 /* Check if this is the same page */
2597 if (PageNumber
== Bda
->VideoPage
) return TRUE
;
2599 /* Update the values in the BDA */
2600 Bda
->VideoPage
= PageNumber
;
2601 Bda
->VideoPageOffset
= Bda
->VideoPage
* Bda
->VideoPageSize
;
2603 /* Set the start address in the CRTC */
2604 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_LOW_REG
);
2605 IOWriteB(VGA_CRTC_DATA
, LOBYTE(Bda
->VideoPageOffset
));
2606 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_HIGH_REG
);
2607 IOWriteB(VGA_CRTC_DATA
, HIBYTE(Bda
->VideoPageOffset
));
2610 * Get the cursor position (we don't update anything on the BIOS side
2611 * but we update the cursor position on the VGA side).
2613 VidBiosGetCursorPosition(&Row
, &Column
, PageNumber
);
2614 VidBiosSetCursorPosition( Row
, Column
, PageNumber
);
2619 static VOID
VidBiosDrawGlyph(WORD CharData
, BOOLEAN UseAttr
, BYTE Page
, BYTE Row
, BYTE Column
)
2621 switch (Bda
->VideoMode
)
2623 /* Alphanumeric mode */
2630 EmulatorWriteMemory(&EmulatorContext
,
2631 TO_LINEAR(TEXT_VIDEO_SEG
,
2632 Page
* Bda
->VideoPageSize
+
2633 (Row
* Bda
->ScreenColumns
+ Column
) * sizeof(WORD
)),
2635 UseAttr
? sizeof(WORD
) : sizeof(BYTE
));
2644 WORD CgaSegment
[] = { CGA_EVEN_VIDEO_SEG
, CGA_ODD_VIDEO_SEG
};
2645 PUCHAR Font
= (PUCHAR
)FAR_POINTER(((PULONG
)BaseAddress
)[0x43]);
2646 PUCHAR Glyph
= &Font
[LOBYTE(CharData
) * Bda
->CharacterHeight
];
2647 BOOLEAN Xor
= (HIBYTE(CharData
) & 0x80) ? TRUE
: FALSE
;
2649 BYTE DoubledBits
[] =
2651 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,
2652 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF
2657 /* Set the logical operation to XOR */
2658 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2659 OldRotate
= IOReadB(VGA_GC_DATA
);
2660 IOWriteB(VGA_GC_DATA
, OldRotate
| 0x18);
2663 for (i
= 0; i
< Bda
->CharacterHeight
; i
++)
2665 WORD Pixel
= MAKEWORD(DoubledBits
[Glyph
[i
] >> 4],
2666 DoubledBits
[Glyph
[i
] & 0x0F]);
2671 /* Read from VGA memory to load the latch register */
2672 EmulatorReadMemory(&EmulatorContext
,
2673 TO_LINEAR(CgaSegment
[(Row
* Bda
->CharacterHeight
+ i
) & 1],
2674 (((Row
* Bda
->CharacterHeight
+ i
) >> 1)
2675 * Bda
->ScreenColumns
+ Column
) * 2),
2680 EmulatorWriteMemory(&EmulatorContext
,
2681 TO_LINEAR(CgaSegment
[(Row
* Bda
->CharacterHeight
+ i
) & 1],
2682 (((Row
* Bda
->CharacterHeight
+ i
) >> 1)
2683 * Bda
->ScreenColumns
+ Column
) * 2),
2690 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2691 IOWriteB(VGA_GC_DATA
, OldRotate
);
2701 WORD CgaSegment
[] = { CGA_EVEN_VIDEO_SEG
, CGA_ODD_VIDEO_SEG
};
2702 PUCHAR Font
= (PUCHAR
)FAR_POINTER(((PULONG
)BaseAddress
)[0x43]);
2703 PUCHAR Glyph
= &Font
[LOBYTE(CharData
) * Bda
->CharacterHeight
];
2704 BOOLEAN Xor
= (HIBYTE(CharData
) & 0x80) ? TRUE
: FALSE
;
2709 /* Set the logical operation to XOR */
2710 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2711 OldRotate
= IOReadB(VGA_GC_DATA
);
2712 IOWriteB(VGA_GC_DATA
, OldRotate
| 0x18);
2715 for (i
= 0; i
< Bda
->CharacterHeight
; i
++)
2721 /* Read from VGA memory to load the latch register */
2722 EmulatorReadMemory(&EmulatorContext
,
2723 TO_LINEAR(CgaSegment
[(Row
* Bda
->CharacterHeight
+ i
) & 1],
2724 (((Row
* Bda
->CharacterHeight
+ i
) >> 1)
2725 * Bda
->ScreenColumns
) + Column
),
2730 EmulatorWriteMemory(&EmulatorContext
,
2731 TO_LINEAR(CgaSegment
[(Row
* Bda
->CharacterHeight
+ i
) & 1],
2732 (((Row
* Bda
->CharacterHeight
+ i
) >> 1)
2733 * Bda
->ScreenColumns
) + Column
),
2740 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2741 IOWriteB(VGA_GC_DATA
, OldRotate
);
2747 /* 16-color modes */
2755 PUCHAR Font
= (PUCHAR
)FAR_POINTER(((PULONG
)BaseAddress
)[0x43]);
2756 PUCHAR Glyph
= &Font
[LOBYTE(CharData
) * Bda
->CharacterHeight
];
2757 BOOLEAN Xor
= (HIBYTE(CharData
) & 0x80) ? TRUE
: FALSE
;
2758 BYTE OldPlaneWrite
, OldReset
, OldEnableReset
, OldRotate
, OldMode
;
2760 /* Write to all planes */
2761 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_MASK_REG
);
2762 OldPlaneWrite
= IOReadB(VGA_SEQ_DATA
);
2763 IOWriteB(VGA_SEQ_DATA
, 0x0F);
2765 /* Zero the planes whose bits are set in the enable set/reset register */
2766 IOWriteB(VGA_GC_INDEX
, VGA_GC_RESET_REG
);
2767 OldReset
= IOReadB(VGA_GC_DATA
);
2768 IOWriteB(VGA_GC_DATA
, 0x00);
2770 /* Set the enable set/reset register to the inverse of the color */
2771 IOWriteB(VGA_GC_INDEX
, VGA_GC_ENABLE_RESET_REG
);
2772 OldEnableReset
= IOReadB(VGA_GC_DATA
);
2773 IOWriteB(VGA_GC_DATA
, (~HIBYTE(CharData
)) & 0x0F);
2775 /* Make sure we're in write mode 0 */
2776 IOWriteB(VGA_GC_INDEX
, VGA_GC_MODE_REG
);
2777 OldMode
= IOReadB(VGA_GC_DATA
);
2778 IOWriteB(VGA_GC_DATA
, 0x00);
2782 /* Set the logical operation to XOR */
2783 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2784 OldRotate
= IOReadB(VGA_GC_DATA
);
2785 IOWriteB(VGA_GC_DATA
, OldRotate
| 0x18);
2788 for (i
= 0; i
< Bda
->CharacterHeight
; i
++)
2794 /* Read from VGA memory to load the latch register */
2795 EmulatorReadMemory(&EmulatorContext
,
2796 TO_LINEAR(GRAPHICS_VIDEO_SEG
,
2797 ((Row
* Bda
->CharacterHeight
+ i
)
2798 * Bda
->ScreenColumns
) + Column
),
2803 EmulatorWriteMemory(&EmulatorContext
,
2804 TO_LINEAR(GRAPHICS_VIDEO_SEG
,
2805 ((Row
* Bda
->CharacterHeight
+ i
)
2806 * Bda
->ScreenColumns
) + Column
),
2811 /* Restore the registers */
2812 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_MASK_REG
);
2813 IOWriteB(VGA_SEQ_DATA
, OldPlaneWrite
);
2814 IOWriteB(VGA_GC_INDEX
, VGA_GC_RESET_REG
);
2815 IOWriteB(VGA_GC_DATA
, OldReset
);
2816 IOWriteB(VGA_GC_INDEX
, VGA_GC_ENABLE_RESET_REG
);
2817 IOWriteB(VGA_GC_DATA
, OldEnableReset
);
2818 IOWriteB(VGA_GC_INDEX
, VGA_GC_MODE_REG
);
2819 IOWriteB(VGA_GC_DATA
, OldMode
);
2823 IOWriteB(VGA_GC_INDEX
, VGA_GC_ROTATE_REG
);
2824 IOWriteB(VGA_GC_DATA
, OldRotate
);
2830 /* 256-color mode */
2834 PUCHAR Font
= (PUCHAR
)FAR_POINTER(((PULONG
)BaseAddress
)[0x43]);
2835 PUCHAR Glyph
= &Font
[LOBYTE(CharData
) * Bda
->CharacterHeight
];
2836 BYTE PixelBuffer
[8]; // 8 == CharacterWidth
2838 for (i
= 0; i
< Bda
->CharacterHeight
; i
++)
2840 for (j
= 0; j
< ARRAYSIZE(PixelBuffer
); j
++)
2842 PixelBuffer
[j
] = (Glyph
[i
] & (1 << (7 - j
))) ? HIBYTE(CharData
) : 0;
2845 EmulatorWriteMemory(&EmulatorContext
,
2846 TO_LINEAR(GRAPHICS_VIDEO_SEG
,
2847 ((Row
* Bda
->CharacterHeight
+ i
)
2848 * Bda
->ScreenColumns
+ Column
) * 8),
2849 (LPVOID
)PixelBuffer
,
2850 sizeof(PixelBuffer
));
2858 DPRINT1("Drawing glyphs in mode %02Xh is not supported.\n", Bda
->VideoMode
);
2863 static VOID
VidBiosPrintCharacter(CHAR Character
, BYTE Attribute
, BOOLEAN UseAttr
, BYTE Page
)
2865 WORD CharData
= MAKEWORD(Character
, Attribute
);
2868 /* Get the cursor position */
2869 VidBiosGetCursorPosition(&Row
, &Column
, Page
);
2871 if (Character
== '\a')
2873 /* Bell control character */
2874 // NOTE: We may use what the terminal emulator offers to us...
2878 else if (Character
== '\b')
2880 /* Backspace control character */
2887 Column
= Bda
->ScreenColumns
- 1;
2891 /* Erase the existing character */
2892 CharData
= MAKEWORD(' ', Attribute
);
2893 VidBiosDrawGlyph(CharData
, UseAttr
, Page
, Row
, Column
);
2895 else if (Character
== '\t')
2897 /* Horizontal Tabulation control character */
2900 // Taken from DOSBox
2901 VidBiosPrintCharacter(' ', Attribute
, UseAttr
, Page
);
2902 VidBiosGetCursorPosition(&Row
, &Column
, Page
);
2903 } while (Column
% 8);
2905 else if (Character
== '\n')
2907 /* Line Feed control character */
2910 else if (Character
== '\r')
2912 /* Carriage Return control character */
2917 /* Default character */
2919 /* Write the character and advance the cursor */
2920 VidBiosDrawGlyph(CharData
, UseAttr
, Page
, Row
, Column
);
2924 /* Check if it passed the end of the row */
2925 if (Column
>= Bda
->ScreenColumns
)
2927 /* Return to the first column and go to the next line */
2932 /* Scroll the screen up if needed */
2933 if (Row
> Bda
->ScreenRows
)
2935 /* The screen must be scrolled up */
2936 SMALL_RECT Rectangle
= { 0, 0, Bda
->ScreenColumns
- 1, Bda
->ScreenRows
};
2937 VidBiosScrollWindow(SCROLL_UP
, 1, Rectangle
, Page
, DEFAULT_ATTRIBUTE
/*Attribute*/);
2941 /* Set the cursor position */
2942 VidBiosSetCursorPosition(Row
, Column
, Page
);
2945 /* PUBLIC FUNCTIONS ***********************************************************/
2947 VOID WINAPI
VidBiosVideoService(LPWORD Stack
)
2951 /* Set Video Mode */
2954 VidBiosSetVideoMode(getAL());
2958 /* Set Text-Mode Cursor Shape */
2961 VidBiosSetCursorShape(getCX());
2965 /* Set Cursor Position */
2968 BYTE Page
= getBH();
2970 /* Validate the selected video page */
2971 if (Page
>= BIOS_MAX_PAGES
) break;
2973 VidBiosSetCursorPosition(getDH(), getDL(), Page
);
2977 /* Get Cursor Position and Shape */
2980 BYTE Page
= getBH();
2982 /* Validate the selected video page */
2983 if (Page
== 0xFF) // Special case: use the current video page
2984 Page
= Bda
->VideoPage
;
2985 else if (Page
>= BIOS_MAX_PAGES
)
2988 /* Return the result */
2989 setCX(MAKEWORD(Bda
->CursorEndLine
, Bda
->CursorStartLine
));
2990 setDX(Bda
->CursorPosition
[Page
]);
2994 /* Query Light Pen */
2998 * On modern BIOSes, this function returns 0
2999 * so that we can ignore the other registers.
3005 /* Select Active Display Page */
3008 VidBiosSetVideoPage(getAL());
3012 /* Scroll Window Up/Down */
3016 SMALL_RECT Rectangle
= { getCL(), getCH(), getDL(), getDH() };
3018 VidBiosScrollWindow((getAH() == 0x06) ? SCROLL_UP
: SCROLL_DOWN
,
3019 getAL(), Rectangle
, Bda
->VideoPage
, getBH());
3024 /* Read Character and Attribute at Cursor Position */
3028 BYTE Page
= getBH();
3031 /* Validate the selected video page */
3032 if (Page
== 0xFF) // Special case: use the current video page
3033 Page
= Bda
->VideoPage
;
3034 else if (Page
>= BIOS_MAX_PAGES
)
3037 /* Find the offset of the character */
3038 Offset
= Page
* Bda
->VideoPageSize
+
3039 (HIBYTE(Bda
->CursorPosition
[Page
]) * Bda
->ScreenColumns
+
3040 LOBYTE(Bda
->CursorPosition
[Page
])) * 2;
3042 /* Read from the video memory */
3043 EmulatorReadMemory(&EmulatorContext
,
3044 TO_LINEAR(TEXT_VIDEO_SEG
, Offset
),
3048 /* Return the character data in AX */
3054 /* Write Character and Attribute at Cursor Position */
3056 /* Write Character only (PCjr: + Attribute) at Cursor Position */
3059 WORD Counter
= getCX();
3060 WORD CharData
= MAKEWORD(getAL(), getBL());
3061 BOOLEAN UseAttr
= (getAH() == 0x09);
3062 BYTE Page
= getBH();
3065 /* Validate the selected video page */
3066 if (Page
== 0xFF) // Special case: use the current video page
3067 Page
= Bda
->VideoPage
;
3068 else if (Page
>= BIOS_MAX_PAGES
)
3071 /* Get the cursor position */
3072 VidBiosGetCursorPosition(&Row
, &Column
, Page
);
3074 /* Write to video memory a certain number of times */
3075 while (Counter
-- > 0)
3077 /* Write the character and advance the position */
3078 VidBiosDrawGlyph(CharData
, UseAttr
, Page
, Row
, Column
);
3081 /* Check if it passed the end of the row */
3082 if (Column
>= Bda
->ScreenColumns
)
3084 /* Return to the first column and go to the next line */
3089 /* Contrary to the "Teletype Output" function, the screen is not scrolled */
3090 if (Row
> Bda
->ScreenRows
)
3092 Row
= Bda
->ScreenRows
;
3099 /* Set Video Colors */
3102 if (Bda
->VideoMode
< 0x04 || Bda
->VideoMode
> 0x06)
3104 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X is unsupported for non-CGA modes\n",
3111 case 0x00: /* Set Background/Border Color */
3114 BYTE Index
= getBL();
3116 /* See: http://www.bioscentral.com/misc/bda.htm */
3117 Bda
->CrtColorPaletteMask
= (Bda
->CrtColorPaletteMask
& 0xE0) | (Index
& 0x1F);
3119 Index
= ((Index
<< 1) & 0x10) | (Index
& 0x7);
3121 /* Always set the overscan color */
3122 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG
, Index
);
3124 /* Don't set any extra colors when in text mode */
3125 if (Bda
->VideoMode
<= 0x03) break;
3127 VgaSetSinglePaletteRegister(0x00, Index
);
3129 Index
= (Bda
->CrtColorPaletteMask
& 0x10) | 0x02 | ((Bda
->CrtColorPaletteMask
& 0x20) >> 5);
3131 VgaSetSinglePaletteRegister(0x01, Index
);
3133 VgaSetSinglePaletteRegister(0x02, Index
);
3135 VgaSetSinglePaletteRegister(0x03, Index
);
3137 /* Background/Border Color is modifiable via the first index */
3138 VgaSetSinglePaletteRegister(0x00, getBL());
3141 /* Enable screen and disable palette access */
3142 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3143 IOWriteB(VGA_AC_INDEX
, 0x20);
3147 case 0x01: /* Set Palette */
3149 BYTE Index
= getBL();
3151 /* See: http://www.bioscentral.com/misc/bda.htm */
3152 /* Reset bit 5: foreground colors index (0: green/red/yellow; 1: cyan/magenta/white) */
3153 Bda
->CrtColorPaletteMask
= (Bda
->CrtColorPaletteMask
& 0xDF) | ((Index
& 1) ? 0x20 : 0x00);
3155 /* Don't set any extra colors when in text mode */
3156 if (Bda
->VideoMode
<= 0x03) break;
3158 Index
= (Bda
->CrtColorPaletteMask
& 0x10) | 0x02 | Index
;
3160 VgaSetSinglePaletteRegister(0x01, Index
);
3162 VgaSetSinglePaletteRegister(0x02, Index
);
3164 VgaSetSinglePaletteRegister(0x03, Index
);
3166 /* Enable screen and disable palette access */
3167 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3168 IOWriteB(VGA_AC_INDEX
, 0x20);
3173 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X NOT IMPLEMENTED\n",
3181 /* Teletype Output */
3184 BYTE Page
= getBH();
3186 /* Validate the selected video page */
3187 if (Page
== 0xFF) // Special case: use the current video page
3188 Page
= Bda
->VideoPage
;
3189 else if (Page
>= BIOS_MAX_PAGES
)
3192 VidBiosPrintCharacter(getAL(), getBL(), !IS_TEXT_MODE(Bda
->VideoMode
), Page
);
3196 /* Get Current Video Mode */
3199 setAX(MAKEWORD(VidBiosGetVideoMode(), Bda
->ScreenColumns
));
3200 setBH(Bda
->VideoPage
);
3204 /* Palette Control */
3209 /* Set Single Palette Register */
3212 VgaSetSinglePaletteRegister(getBL(), getBH());
3214 /* Enable screen and disable palette access */
3215 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3216 IOWriteB(VGA_AC_INDEX
, 0x20);
3220 /* Set Overscan Color */
3223 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG
, getBH());
3225 /* Enable screen and disable palette access */
3226 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3227 IOWriteB(VGA_AC_INDEX
, 0x20);
3231 /* Set All Palette Registers */
3235 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
3237 /* Set the palette registers */
3238 for (i
= 0; i
<= VGA_AC_PAL_F_REG
; i
++)
3240 VgaSetSinglePaletteRegister(i
, Buffer
[i
]);
3243 /* Set the overscan register */
3244 // VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Buffer[VGA_AC_PAL_F_REG + 1]);
3245 IOWriteB(VGA_AC_INDEX
, VGA_AC_OVERSCAN_REG
);
3246 IOWriteB(VGA_AC_WRITE
, Buffer
[VGA_AC_PAL_F_REG
+ 1]);
3248 /* Enable screen and disable palette access */
3249 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3250 IOWriteB(VGA_AC_INDEX
, 0x20);
3254 /* Toggle Intensity/Blinking Bit */
3257 /* Read the old AC mode control register value */
3258 BYTE VgaAcControlReg
;
3259 IOWriteB(VGA_AC_INDEX
, VGA_AC_CONTROL_REG
);
3260 VgaAcControlReg
= IOReadB(VGA_AC_READ
);
3262 /* Toggle the blinking bit and write the new value */
3265 VgaAcControlReg
|= VGA_AC_CONTROL_BLINK
;
3266 Bda
->CrtModeControl
|= (1 << 5);
3270 VgaAcControlReg
&= ~VGA_AC_CONTROL_BLINK
;
3271 Bda
->CrtModeControl
&= ~(1 << 5);
3274 IOWriteB(VGA_AC_INDEX
, VGA_AC_CONTROL_REG
);
3275 IOWriteB(VGA_AC_WRITE
, VgaAcControlReg
);
3277 /* Enable screen and disable palette access */
3278 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3279 IOWriteB(VGA_AC_INDEX
, 0x20);
3283 /* Get Single Palette Register */
3286 /* Write the index */
3287 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3288 IOWriteB(VGA_AC_INDEX
, getBL());
3291 setBH(IOReadB(VGA_AC_READ
));
3293 /* Enable screen and disable palette access */
3294 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3295 IOWriteB(VGA_AC_INDEX
, 0x20);
3299 /* Get Overscan Color */
3302 /* Write the index */
3303 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3304 IOWriteB(VGA_AC_INDEX
, VGA_AC_OVERSCAN_REG
);
3307 setBH(IOReadB(VGA_AC_READ
));
3309 /* Enable screen and disable palette access */
3310 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3311 IOWriteB(VGA_AC_INDEX
, 0x20);
3315 /* Get All Palette Registers */
3319 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
3321 /* Get the palette registers */
3322 for (i
= 0; i
<= VGA_AC_PAL_F_REG
; i
++)
3324 /* Write the index */
3325 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3326 IOWriteB(VGA_AC_INDEX
, i
);
3329 Buffer
[i
] = IOReadB(VGA_AC_READ
);
3332 /* Get the overscan register */
3333 IOWriteB(VGA_AC_INDEX
, VGA_AC_OVERSCAN_REG
);
3334 Buffer
[VGA_AC_PAL_F_REG
+ 1] = IOReadB(VGA_AC_READ
);
3336 /* Enable screen and disable palette access */
3337 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
3338 IOWriteB(VGA_AC_INDEX
, 0x20);
3342 /* Set Individual DAC Register */
3345 /* Write the index */
3346 // Certainly in BL and not in BX as said by Ralf Brown...
3347 IOWriteB(VGA_DAC_WRITE_INDEX
, getBL());
3349 /* Write the data in this order: Red, Green, Blue */
3350 IOWriteB(VGA_DAC_DATA
, getDH());
3351 IOWriteB(VGA_DAC_DATA
, getCH());
3352 IOWriteB(VGA_DAC_DATA
, getCL());
3357 /* Set Block of DAC Registers */
3361 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
3363 /* Write the index */
3364 // Certainly in BL and not in BX as said by Ralf Brown...
3365 IOWriteB(VGA_DAC_WRITE_INDEX
, getBL());
3367 for (i
= 0; i
< getCX(); i
++)
3369 /* Write the data in this order: Red, Green, Blue */
3370 IOWriteB(VGA_DAC_DATA
, *Buffer
++);
3371 IOWriteB(VGA_DAC_DATA
, *Buffer
++);
3372 IOWriteB(VGA_DAC_DATA
, *Buffer
++);
3378 /* Get Individual DAC Register */
3381 /* Write the index */
3382 IOWriteB(VGA_DAC_READ_INDEX
, getBL());
3384 /* Read the data in this order: Red, Green, Blue */
3385 setDH(IOReadB(VGA_DAC_DATA
));
3386 setCH(IOReadB(VGA_DAC_DATA
));
3387 setCL(IOReadB(VGA_DAC_DATA
));
3392 /* Get Block of DAC Registers */
3396 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
3398 /* Write the index */
3399 // Certainly in BL and not in BX as said by Ralf Brown...
3400 IOWriteB(VGA_DAC_READ_INDEX
, getBL());
3402 for (i
= 0; i
< getCX(); i
++)
3404 /* Write the data in this order: Red, Green, Blue */
3405 *Buffer
++ = IOReadB(VGA_DAC_DATA
);
3406 *Buffer
++ = IOReadB(VGA_DAC_DATA
);
3407 *Buffer
++ = IOReadB(VGA_DAC_DATA
);
3416 IOWriteB(VGA_DAC_MASK
, getBL());
3423 setBL(IOReadB(VGA_DAC_MASK
));
3429 DPRINT1("BIOS Palette Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3443 // FIXME: At the moment we support only graphics-mode functions!
3445 /* Load User-specified Patterns (Character Set) for Text Mode */
3447 case 0x10: // FIXME: 0x1x performs a full mode reset
3451 /* Write the default font to the VGA font plane */
3452 // VgaWriteTextModeFont(0, Font8x8, ARRAYSIZE(Font8x8) / VGA_FONT_CHARACTERS);
3458 /* Load ROM Monochrome 8x14 Patterns (Character Set) for Text Mode */
3460 case 0x11: // FIXME: 0x1x performs a full mode reset
3464 /* Write the default font to the VGA font plane */
3465 VgaWriteTextModeFont(0, Font8x14
, ARRAYSIZE(Font8x14
) / VGA_FONT_CHARACTERS
);
3471 /* Load ROM 8x8 Double-dot Patterns (Character Set) for Text Mode */
3473 case 0x12: // FIXME: 0x1x performs a full mode reset
3477 /* Write the default font to the VGA font plane */
3478 VgaWriteTextModeFont(0, Font8x8
, ARRAYSIZE(Font8x8
) / VGA_FONT_CHARACTERS
);
3484 /* Load ROM 8x16 Character Set for Text Mode */
3486 case 0x14: // FIXME: 0x1x performs a full mode reset
3490 /* Write the default font to the VGA font plane */
3491 VgaWriteTextModeFont(0, Font8x16
, ARRAYSIZE(Font8x16
) / VGA_FONT_CHARACTERS
);
3497 /* Set User 8x8 Graphics Chars (Setup INT 1Fh Vector) */
3500 /* Update the BIOS INT 1Fh vector to user-defined ES:BP pointer */
3501 // Far pointer to the 8x8 characters 80h-FFh
3502 ((PULONG
)BaseAddress
)[0x1F] = MAKELONG(getBP(), getES());
3506 /* Set User Graphics Characters */
3510 * Update the BIOS INT 43h vector (far pointer
3511 * to the character range 00h-...)
3513 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(getBP(), getES());
3516 Bda
->CharacterHeight
= getCX();
3519 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
3520 case 0x01: Bda
->ScreenRows
= 13; break;
3521 case 0x03: Bda
->ScreenRows
= 42; break;
3523 default : Bda
->ScreenRows
= 24; break;
3529 /* Setup ROM 8x14 Font for Graphics Mode */
3533 * Update the BIOS INT 43h vector (far pointer
3534 * to the character range 00h-...)
3536 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x14_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3539 Bda
->CharacterHeight
= 14;
3542 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
3543 case 0x01: Bda
->ScreenRows
= 13; break;
3544 case 0x03: Bda
->ScreenRows
= 42; break;
3546 default : Bda
->ScreenRows
= 24; break;
3552 /* Setup ROM 8x8 Font for Graphics Mode */
3556 * Update the BIOS INT 43h vector (far pointer
3557 * to the character range 00h-...)
3559 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x8_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3562 Bda
->CharacterHeight
= 8;
3565 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
3566 case 0x01: Bda
->ScreenRows
= 13; break;
3567 case 0x03: Bda
->ScreenRows
= 42; break;
3569 default : Bda
->ScreenRows
= 24; break;
3575 /* Setup ROM 8x16 Font for Graphics Mode */
3579 * Update the BIOS INT 43h vector (far pointer
3580 * to the character range 00h-...).
3582 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x16_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3585 Bda
->CharacterHeight
= 16;
3588 case 0x00: Bda
->ScreenRows
= getDL()-1; break;
3589 case 0x01: Bda
->ScreenRows
= 13; break;
3590 case 0x03: Bda
->ScreenRows
= 42; break;
3592 default : Bda
->ScreenRows
= 24; break;
3598 /* Get Current Character Font Information */
3601 ULONG Address
= (ULONG
)NULL
;
3605 /* 00h - INT 0x1F pointer */
3607 Address
= ((PULONG
)BaseAddress
)[0x1F];
3610 /* 01h - INT 0x43 pointer */
3612 Address
= ((PULONG
)BaseAddress
)[0x43];
3615 /* 02h - 8x14 font */
3617 Address
= MAKELONG(FONT_8x14_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3620 /* 03h - 8x8 font */
3622 Address
= MAKELONG(FONT_8x8_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3625 /* 04h - 8x8 font, upper half */
3627 Address
= MAKELONG(FONT_8x8_HIGH_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3630 /* 05h - NOT IMPLEMENTED - 9x14 font */
3634 /* 06h - 8x16 font */
3636 Address
= MAKELONG(FONT_8x16_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3639 /* 07h - NOT IMPLEMENTED - 9x16 font */
3644 DPRINT1("INT 10h, AL=30h Function BH = 0x%02X NOT IMPLEMENTED\n",
3648 /* Return the data */
3649 setES(HIWORD(Address
));
3650 setBP(LOWORD(Address
));
3651 setCX(Bda
->CharacterHeight
);
3652 setDL(Bda
->ScreenRows
);
3659 DPRINT1("BIOS Font Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3667 /* Alternate Function Select */
3672 /* Get EGA/VGA Information */
3675 setBH((Bda
->VGAOptions
& 0x02) >> 1); /* Color (0) or monochrome (1) display */
3676 setBL((Bda
->VGAOptions
& 0x60) >> 5); /* Video RAM size */
3677 setCH((Bda
->VGASwitches
& 0xF0) >> 4); /* Features settings */
3678 setCL( Bda
->VGASwitches
& 0x0F); /* Switches settings */
3682 /* Enable/Disable Cursor Emulation */
3685 BYTE State
= getAL();
3687 /* Check for validity */
3688 if (State
> 1) break;
3691 * Enable (State == 0) or disable (State == 1) cursor emulation.
3692 * Please read the WARNING in the 'VidBiosSetCursorShape'
3693 * function for more details.
3695 Bda
->VGAOptions
= (Bda
->VGAOptions
& 0xFE) | (State
& 0x01);
3697 /* Return success */
3702 /* Enable/Disable screen refresh */
3705 BYTE State
= getAL();
3708 /* Check for validity */
3709 if (State
> 1) break;
3711 /* Turn the video on (State == 0) or off (State == 1) */
3712 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_CLOCK_REG
);
3713 Clocking
= IOReadB(VGA_SEQ_DATA
);
3716 Clocking
&= ~VGA_SEQ_CLOCK_SD
;
3718 Clocking
|= VGA_SEQ_CLOCK_SD
;
3720 IOWriteB(VGA_SEQ_DATA
, Clocking
);
3722 /* Return success */
3729 DPRINT1("BIOS Function INT 10h, AH = 12h (Alternate Function Select), BX = 0x%04X NOT IMPLEMENTED\n",
3741 PCHAR String
= (PCHAR
)SEG_OFF_TO_PTR(getES(), getBP());
3742 WORD Counter
= getCX();
3744 BYTE OldRow
, OldColumn
;
3746 BYTE Attribute
= getBL(); // Default attribute in case the string contains only characters.
3747 BYTE Page
= getBH();
3748 BYTE Flags
= getAL();
3750 /* Validate the selected video page */
3751 if (Page
== 0xFF) // Special case: use the current video page
3752 Page
= Bda
->VideoPage
;
3753 else if (Page
>= BIOS_MAX_PAGES
)
3756 /* Get the original cursor position */
3757 VidBiosGetCursorPosition(&OldRow
, &OldColumn
, Page
);
3759 /* Set the new cursor position */
3762 if (Row
== 0xFF) // Special case: use the current cursor position
3767 VidBiosSetCursorPosition(Row
, Column
, Page
);
3769 while (Counter
-- > 0)
3771 Character
= *String
++;
3772 if (Flags
& 0x02) Attribute
= *String
++;
3773 VidBiosPrintCharacter(Character
, Attribute
, TRUE
, Page
);
3776 /* Reset the cursor position to its original value if we don't want to update it */
3777 if (!(Flags
& 0x01)) VidBiosSetCursorPosition(OldRow
, OldColumn
, Page
);
3782 /* Get/Set Display combination code */
3787 case 0x00: /* Get Display combination code */
3789 setBL(Bda
->VGADccIDActive
);
3790 setBH(0x00); // No alternate display
3792 /* Return success */
3796 case 0x01: /* Set Display combination code */
3798 DPRINT1("Set Display combination code - Unsupported\n");
3807 /* Functionality/State Information (VGA) */
3810 PVGA_DYNAMIC_FUNC_TABLE Table
= SEG_OFF_TO_PTR(getES(), getDI());
3812 /* Check for only supported subfunction */
3813 if (getBX() != 0x0000)
3815 DPRINT1("INT 10h, AH=1Bh, unsupported subfunction 0x%04x\n", getBX());
3819 /* Fill the VGA dynamic functionality table with our information */
3821 Table
->StaticFuncTablePtr
= MAKELONG(VIDEO_STATE_INFO_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3823 Table
->VideoMode
= Bda
->VideoMode
;
3824 Table
->ScreenColumns
= Bda
->ScreenColumns
;
3825 Table
->VideoPageSize
= Bda
->VideoPageSize
;
3826 Table
->VideoPageOffset
= Bda
->VideoPageOffset
;
3827 RtlCopyMemory(Table
->CursorPosition
, Bda
->CursorPosition
, sizeof(Bda
->CursorPosition
));
3828 Table
->CursorEndLine
= Bda
->CursorEndLine
;
3829 Table
->CursorStartLine
= Bda
->CursorStartLine
;
3830 Table
->VideoPage
= Bda
->VideoPage
;
3831 Table
->CrtBasePort
= Bda
->CrtBasePort
;
3832 Table
->CrtModeControl
= Bda
->CrtModeControl
;
3833 Table
->CrtColorPaletteMask
= Bda
->CrtColorPaletteMask
;
3834 Table
->ScreenRows
= Bda
->ScreenRows
;
3835 Table
->CharacterHeight
= Bda
->CharacterHeight
;
3837 Table
->VGADccIDActive
= Bda
->VGADccIDActive
;
3838 Table
->VGADccIDAlternate
= 0x00; // No alternate display
3839 // Table->CurrModeSupportedColorsNum;
3840 // Table->CurrModeSupportedPagesNum;
3841 // Table->Scanlines;
3842 // Table->PrimaryCharTable;
3843 // Table->SecondaryCharTable;
3845 Table
->VGAAvailMemory
= (Bda
->VGAOptions
& 0x60) >> 5;
3846 // Table->VGASavePtrStateFlags;
3847 // Table->VGADispInfo;
3850 /* Return success */
3855 /* VESA BIOS Extensions */
3858 if (VbeInitialized
) VbeService(Stack
);
3864 DPRINT1("BIOS Function INT 10h, AH = 0x%02X, AL = 0x%02X, BH = 0x%02X NOT IMPLEMENTED\n",
3865 getAH(), getAL(), getBH());
3872 * Those attach / detach functions are work-in-progress
3875 static BOOL Attached
= TRUE
;
3877 VOID
VidBiosAttachToConsole(VOID
)
3881 VgaAttachToConsole();
3885 /* Refresh display */
3886 VgaRefreshDisplay();
3887 VidBiosSyncCursorPosition();
3890 VOID
VidBiosDetachFromConsole(VOID
)
3892 if (!Attached
) return;
3894 /* Refresh display */
3895 VgaRefreshDisplay();
3897 /* Detach from the console */
3898 VgaDetachFromConsole();
3902 VOID
VidBiosPost(VOID
)
3905 * Initialize VGA BIOS32 RAM dynamic data
3908 /* Some vectors are in fact addresses to tables */
3909 ((PULONG
)BaseAddress
)[0x1D] = (ULONG
)NULL
; // Video Parameter Tables
3910 // Far pointer to the 8x8 graphics font for the 8x8 characters 80h-FFh
3911 ((PULONG
)BaseAddress
)[0x1F] = MAKELONG(FONT_8x8_HIGH_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3912 // Far pointer to the character table (EGA, MCGA, VGA) for the 8x16 characters 00h-...
3913 ((PULONG
)BaseAddress
)[0x43] = MAKELONG(FONT_8x16_OFFSET
, VIDEO_BIOS_DATA_SEG
);
3914 ((PULONG
)BaseAddress
)[0x44] = (ULONG
)NULL
; // ROM BIOS Character Font, Characters 00h-7Fh (PCjr)
3916 /* Relocated services by the BIOS (when needed) */
3917 ((PULONG
)BaseAddress
)[0x42] = (ULONG
)NULL
; // Relocated Default INT 10h Video Services
3918 ((PULONG
)BaseAddress
)[0x6D] = (ULONG
)NULL
; // Video BIOS Entry Point
3921 // FIXME: At the moment we always set a VGA mode. In the future,
3922 // we should set this mode **only** when:
3923 // - an app starts to use directly the video memory
3924 // (that should be done in emulator.c)
3925 // - or starts to use non-stream I/O interrupts
3926 // (that should be done here, or maybe in VGA ??)
3929 Bda
->CrtModeControl
= 0x00;
3930 Bda
->CrtColorPaletteMask
= 0x00;
3931 Bda
->VGADccIDActive
= 0x08; // VGA w/ color analog active display
3933 /* Set the default video mode */
3934 VidBiosSetVideoMode(BIOS_DEFAULT_VIDEO_MODE
);
3936 /* Synchronize our cursor position with VGA */
3937 VidBiosSyncCursorPosition();
3939 /* Register the BIOS 32-bit Interrupts */
3940 RegisterBiosInt32(BIOS_VIDEO_INTERRUPT
, VidBiosVideoService
);
3942 /* Vectors that should be implemented */
3943 RegisterBiosInt32(0x42, NULL
); // Relocated Default INT 10h Video Services
3944 RegisterBiosInt32(0x6D, NULL
); // Video BIOS Entry Point
3946 /* Initialize VBE */
3947 VbeInitialized
= VbeInitialize();
3948 if (!VbeInitialized
) DPRINT1("Couldn't initialize VBE!\n");
3951 BOOLEAN
VidBiosInitialize(VOID
)
3956 * Initialize VGA BIOS32 static data
3959 /* This is a ROM of size 'VIDEO_BIOS_ROM_SIZE' */
3960 *(PWORD
)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, 0x0000)) = 0xAA55;
3961 *(PBYTE
)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, 0x0002)) = VIDEO_BIOS_ROM_SIZE
/ 512; // Size in blocks of 512 bytes
3963 /* Bootstrap code */
3964 *(PWORD
)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, 0x0003)) = 0x90CB; // retf, nop
3965 // RtlCopyMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, 0xFFF0), Bootstrap, sizeof(Bootstrap));
3967 /* Video BIOS Information */
3968 RtlCopyMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, 0x0005), BiosInfo
, sizeof(BiosInfo
)-1);
3970 /* Initialize the VGA static function table */
3971 VgaStaticFuncTable
= SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, VIDEO_STATE_INFO_OFFSET
);
3972 RtlZeroMemory(VgaStaticFuncTable
, sizeof(*VgaStaticFuncTable
));
3973 VgaStaticFuncTable
->SupportedModes
[0] = 0xFF; // Modes 0x00 to 0x07 supported
3974 VgaStaticFuncTable
->SupportedModes
[1] = 0xFF; // Modes 0x08 to 0x0F supported
3975 VgaStaticFuncTable
->SupportedModes
[2] = 0x0F; // Modes 0x10 to 0x13 supported
3976 VgaStaticFuncTable
->SupportedScanlines
= 0x07; // Scanlines 200, 350 and 400 supported
3977 VgaStaticFuncTable
->TextCharBlocksNumber
= 0;
3978 VgaStaticFuncTable
->MaxActiveTextCharBlocksNumber
= 0;
3979 VgaStaticFuncTable
->VGAFuncSupportFlags
= 0x0CFD; // See: http://www.ctyme.com/intr/rb-0221.htm#Table46
3980 VgaStaticFuncTable
->VGASavePtrFuncFlags
= 0x18; // See: http://www.ctyme.com/intr/rb-0221.htm#Table47
3982 /* Fill the font tables */
3983 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, FONT_8x8_OFFSET
),
3984 Font8x8
, sizeof(Font8x8
));
3985 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, FONT_8x16_OFFSET
),
3986 Font8x16
, sizeof(Font8x16
));
3987 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, FONT_8x14_OFFSET
),
3988 Font8x14
, sizeof(Font8x14
));
3990 /* Make another copy of the lower half of the 8x8 font at F000:FA6E for compatibility */
3991 RtlMoveMemory(SEG_OFF_TO_PTR(BIOS_SEGMENT
, FONT_8x8_COMPAT_OFFSET
), Font8x8
, sizeof(Font8x8
) / 2);
3993 VidBios32Initialize();
3995 /* Compute the ROM checksum and store it */
3996 *(PBYTE
)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, VIDEO_BIOS_ROM_SIZE
- 1)) = 0x00;
3997 Checksum
= CalcRomChecksum(TO_LINEAR(VIDEO_BIOS_DATA_SEG
, 0x0000), VIDEO_BIOS_ROM_SIZE
);
3998 *(PBYTE
)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, VIDEO_BIOS_ROM_SIZE
- 1)) = (0xFF - Checksum
+ 1) & 0xFF;
4000 WriteProtectRom((PVOID
)TO_LINEAR(VIDEO_BIOS_DATA_SEG
, 0x0000),
4001 VIDEO_BIOS_ROM_SIZE
);
4006 VOID
VidBiosCleanup(VOID
)