2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
5 * PURPOSE: VDM Video BIOS Support Library
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
10 /* INCLUDES *******************************************************************/
19 // #include "vidbios.h"
22 #include "hardware/vga.h"
24 /* DEFINES ********************************************************************/
27 #define BOP_VIDEO_INT 0x10
29 /* MACROS *********************************************************************/
32 // These macros are defined for ease-of-use of some VGA I/O ports
33 // whose addresses depend whether we are in Monochrome or Colour mode.
35 #define VGA_INSTAT1_READ Bda->CrtBasePort + 6 // VGA_INSTAT1_READ_MONO or VGA_INSTAT1_READ_COLOR
36 #define VGA_CRTC_INDEX Bda->CrtBasePort // VGA_CRTC_INDEX_MONO or VGA_CRTC_INDEX_COLOR
37 #define VGA_CRTC_DATA Bda->CrtBasePort + 1 // VGA_CRTC_DATA_MONO or VGA_CRTC_DATA_COLOR
39 /* PRIVATE VARIABLES **********************************************************/
42 * VGA Register Configurations for BIOS Video Modes
43 * The configurations come from DOSBox.
45 static VGA_REGISTERS VideoMode_40x25_text
=
47 /* Miscellaneous Register */
50 /* Sequencer Registers */
51 {0x00, 0x08, 0x03, 0x00, 0x07},
54 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
55 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x1F, 0x96, 0xB9, 0xA3,
59 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
62 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
63 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
66 static VGA_REGISTERS VideoMode_80x25_text
=
68 /* Miscellaneous Register */
71 /* Sequencer Registers */
72 {0x00, 0x00, 0x03, 0x00, 0x07},
75 {0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
76 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3,
80 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
83 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
84 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
87 static VGA_REGISTERS VideoMode_320x200_4color
=
89 /* Miscellaneous Register */
92 /* Sequencer Registers */
93 {0x00, 0x09, 0x03, 0x00, 0x02},
96 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
97 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xA2,
101 {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0F, 0x0F, 0xFF},
104 {0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
105 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
108 static VGA_REGISTERS VideoMode_640x200_2color
=
110 /* Miscellaneous Register */
113 /* Sequencer Registers */
114 {0x00, 0x09, 0x0F, 0x00, 0x02},
117 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xC2,
122 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0xFF},
125 {0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
126 0x17, 0x17, 0x17, 0x17, 0x01, 0x00, 0x01, 0x00, 0x00}
129 static VGA_REGISTERS VideoMode_320x200_16color
=
131 /* Miscellaneous Register */
134 /* Sequencer Registers */
135 {0x00, 0x09, 0x0F, 0x00, 0x02},
138 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
139 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xE3,
143 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
146 // {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
147 // 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
148 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
149 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
152 static VGA_REGISTERS VideoMode_640x200_16color
=
154 /* Miscellaneous Register */
157 /* Sequencer Registers */
158 {0x00, 0x01, 0x0F, 0x00, 0x02},
161 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
162 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xE3,
166 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
169 // {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
170 // 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
171 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
172 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
175 static VGA_REGISTERS VideoMode_640x350_16color
=
177 /* Miscellaneous Register */
180 /* Sequencer Registers */
181 {0x00, 0x01, 0x0F, 0x00, 0x02},
184 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00,
185 0x00, 0x00, 0x00, 0x00, 0x83, 0x85, 0x5D, 0x28, 0x0F, 0x63, 0xBA, 0xE3,
189 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
192 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
193 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
196 static VGA_REGISTERS VideoMode_640x480_2color
=
198 /* Miscellaneous Register */
201 /* Sequencer Registers */
202 {0x00, 0x01, 0x0F, 0x00, 0x02},
205 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xC3,
210 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
213 {0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
214 0x3F, 0x3F, 0x3F, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
217 static VGA_REGISTERS VideoMode_640x480_16color
=
219 /* Miscellaneous Register */
222 /* Sequencer Registers */
223 {0x00, 0x01, 0x0F, 0x00, 0x02},
226 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
227 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3,
231 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
234 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
235 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
238 static VGA_REGISTERS VideoMode_320x200_256color
=
240 /* Miscellaneous Register */
243 /* Sequencer Registers */
244 {0x00, 0x01, 0x0F, 0x00, 0x0E},
247 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x41, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3,
252 {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF},
255 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
256 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00}
259 /* See http://wiki.osdev.org/Drawing_In_Protected_Mode#Locating_Video_Memory */
260 static PVGA_REGISTERS VideoModes
[BIOS_MAX_VIDEO_MODE
+ 1] =
262 &VideoMode_40x25_text
, /* Mode 00h */ // 16 color (mono)
263 &VideoMode_40x25_text
, /* Mode 01h */ // 16 color
264 &VideoMode_80x25_text
, /* Mode 02h */ // 16 color (mono)
265 &VideoMode_80x25_text
, /* Mode 03h */ // 16 color
266 &VideoMode_320x200_4color
, /* Mode 04h */ // CGA 4 color
267 &VideoMode_320x200_4color
, /* Mode 05h */ // CGA same (m) (uses 3rd CGA palette)
268 &VideoMode_640x200_2color
, /* Mode 06h */ // CGA 640*200 2 color
269 NULL
, /* Mode 07h */ // MDA monochrome text 80*25
270 NULL
, /* Mode 08h */ // PCjr
271 NULL
, /* Mode 09h */ // PCjr
272 NULL
, /* Mode 0Ah */ // PCjr
273 NULL
, /* Mode 0Bh */ // Reserved
274 NULL
, /* Mode 0Ch */ // Reserved
275 &VideoMode_320x200_16color
, /* Mode 0Dh */ // EGA 320*200 16 color
276 &VideoMode_640x200_16color
, /* Mode 0Eh */ // EGA 640*200 16 color
277 NULL
, /* Mode 0Fh */ // EGA 640*350 mono
278 &VideoMode_640x350_16color
, /* Mode 10h */ // EGA 640*350 HiRes 16 color
279 &VideoMode_640x480_2color
, /* Mode 11h */ // VGA 640*480 mono
280 &VideoMode_640x480_16color
, /* Mode 12h */ // VGA
281 &VideoMode_320x200_256color
, /* Mode 13h */ // VGA
284 // FIXME: Are they computable with the previous data ??
285 // Values taken from DOSBox.
286 static WORD VideoModePageSize
[BIOS_MAX_VIDEO_MODE
+ 1] =
288 0x0800, 0x0800, 0x1000, 0x1000,
289 0x4000, 0x4000, 0x4000, 0x1000,
290 0x0000, 0x0000, 0x0000, 0x0000,
291 0x0000, 0x2000, 0x4000, 0x8000,
292 0x8000, 0xA000, 0xA000, 0x2000
298 * Many people have different versions of those palettes
299 * (e.g. DOSBox, http://www.brokenthorn.com/Resources/OSDevVid2.html ,
300 * etc...) A choice should be made at some point.
303 // This is the same as EgaPalette__HiRes
304 static CONST COLORREF TextPalette
[VGA_MAX_COLORS
/ 4] =
306 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
307 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
308 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
309 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
311 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
312 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
313 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
314 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
317 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
318 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
319 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
320 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
322 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
323 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
324 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
325 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
328 // Unused at the moment
329 static CONST COLORREF mtext_palette
[64] =
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(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
334 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
335 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
336 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
337 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
338 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
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(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
345 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
346 RGB(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)
350 // Unused at the moment
351 static CONST COLORREF mtext_s3_palette
[64] =
353 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
354 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
355 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
356 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
357 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
358 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
359 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
360 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
362 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
363 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
364 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
365 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
366 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
367 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
368 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
369 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
374 // Unused at the moment
375 static CONST COLORREF CgaPalette
[16] =
377 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
378 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
379 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
380 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
384 static CONST BYTE CgaPalette1
[] =
386 0x00, /* 0 - Black */
388 0x05, /* 2- Magenta */
389 0x07, /* 3 - White */
392 /* CGA palette 1 bright */
393 static CONST BYTE CgaPalette1i
[] =
395 0x00, /* 0 - Black */
396 0x13, /* 1 - Light cyan */
397 0x15, /* 2 - Light magenta */
398 0x17, /* 3 - Bright White */
402 static CONST BYTE CgaPalette2
[] =
404 0x00, /* 0 - Black */
405 0x02, /* 1 - Green */
407 0x06, /* 3 - Brown */
410 /* CGA palette 2 bright */
411 static CONST BYTE CgaPalette2i
[] =
413 0x00, /* 0 - Black */
414 0x12, /* 1 - Light green */
415 0x14, /* 2 - Light red */
416 0x16, /* 3 - Yellow */
419 // Unused at the moment; same palette as EgaPalette__16Colors
420 static CONST COLORREF CgaPalette2
[VGA_MAX_COLORS
/ 4] =
422 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
423 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
424 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
425 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
427 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
428 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
429 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
430 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
432 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
433 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
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(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
438 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
439 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
440 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
445 static CONST COLORREF EgaPalette__16Colors
[VGA_MAX_COLORS
/ 4] =
447 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
448 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
450 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
451 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
454 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
455 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
457 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
458 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
462 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
463 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
465 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
466 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
469 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
470 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
472 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
473 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
476 // This is the same as TextPalette
477 static CONST COLORREF EgaPalette__HiRes
[VGA_MAX_COLORS
/ 4] =
479 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
480 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
481 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
482 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
484 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
485 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
486 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
487 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
490 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
491 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
492 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
493 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
495 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
496 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
497 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
498 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
501 #define USE_REACTOS_COLORS
502 // #define USE_DOSBOX_COLORS
505 * Same palette as the default one 'VgaDefaultPalette' in vga.c
507 #if defined(USE_REACTOS_COLORS)
510 static CONST COLORREF VgaPalette
[VGA_MAX_COLORS
] =
512 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
513 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
514 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
515 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
516 RGB(0x00, 0x00, 0x00), RGB(0x10, 0x10, 0x10), RGB(0x20, 0x20, 0x20), RGB(0x35, 0x35, 0x35),
517 RGB(0x45, 0x45, 0x45), RGB(0x55, 0x55, 0x55), RGB(0x65, 0x65, 0x65), RGB(0x75, 0x75, 0x75),
518 RGB(0x8A, 0x8A, 0x8A), RGB(0x9A, 0x9A, 0x9A), RGB(0xAA, 0xAA, 0xAA), RGB(0xBA, 0xBA, 0xBA),
519 RGB(0xCA, 0xCA, 0xCA), RGB(0xDF, 0xDF, 0xDF), RGB(0xEF, 0xEF, 0xEF), RGB(0xFF, 0xFF, 0xFF),
520 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x82, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
521 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x82), RGB(0xFF, 0x00, 0x41),
522 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x82, 0x00), RGB(0xFF, 0xBE, 0x00),
523 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x82, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
524 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x82), RGB(0x00, 0xFF, 0xBE),
525 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x82, 0xFF), RGB(0x00, 0x41, 0xFF),
526 RGB(0x82, 0x82, 0xFF), RGB(0x9E, 0x82, 0xFF), RGB(0xBE, 0x82, 0xFF), RGB(0xDF, 0x82, 0xFF),
527 RGB(0xFF, 0x82, 0xFF), RGB(0xFF, 0x82, 0xDF), RGB(0xFF, 0x82, 0xBE), RGB(0xFF, 0x82, 0x9E),
528 RGB(0xFF, 0x82, 0x82), RGB(0xFF, 0x9E, 0x82), RGB(0xFF, 0xBE, 0x82), RGB(0xFF, 0xDF, 0x82),
529 RGB(0xFF, 0xFF, 0x82), RGB(0xDF, 0xFF, 0x82), RGB(0xBE, 0xFF, 0x82), RGB(0x9E, 0xFF, 0x82),
530 RGB(0x82, 0xFF, 0x82), RGB(0x82, 0xFF, 0x9E), RGB(0x82, 0xFF, 0xBE), RGB(0x82, 0xFF, 0xDF),
531 RGB(0x82, 0xFF, 0xFF), RGB(0x82, 0xDF, 0xFF), RGB(0x82, 0xBE, 0xFF), RGB(0x82, 0x9E, 0xFF),
532 RGB(0xBA, 0xBA, 0xFF), RGB(0xCA, 0xBA, 0xFF), RGB(0xDF, 0xBA, 0xFF), RGB(0xEF, 0xBA, 0xFF),
533 RGB(0xFF, 0xBA, 0xFF), RGB(0xFF, 0xBA, 0xEF), RGB(0xFF, 0xBA, 0xDF), RGB(0xFF, 0xBA, 0xCA),
534 RGB(0xFF, 0xBA, 0xBA), RGB(0xFF, 0xCA, 0xBA), RGB(0xFF, 0xDF, 0xBA), RGB(0xFF, 0xEF, 0xBA),
535 RGB(0xFF, 0xFF, 0xBA), RGB(0xEF, 0xFF, 0xBA), RGB(0xDF, 0xFF, 0xBA), RGB(0xCA, 0xFF, 0xBA),
536 RGB(0xBA, 0xFF, 0xBA), RGB(0xBA, 0xFF, 0xCA), RGB(0xBA, 0xFF, 0xDF), RGB(0xBA, 0xFF, 0xEF),
537 RGB(0xBA, 0xFF, 0xFF), RGB(0xBA, 0xEF, 0xFF), RGB(0xBA, 0xDF, 0xFF), RGB(0xBA, 0xCA, 0xFF),
538 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x39, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
539 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x39), RGB(0x71, 0x00, 0x1C),
540 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x39, 0x00), RGB(0x71, 0x55, 0x00),
541 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x39, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
542 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x39), RGB(0x00, 0x71, 0x55),
543 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x39, 0x71), RGB(0x00, 0x1C, 0x71),
544 RGB(0x39, 0x39, 0x71), RGB(0x45, 0x39, 0x71), RGB(0x55, 0x39, 0x71), RGB(0x61, 0x39, 0x71),
545 RGB(0x71, 0x39, 0x71), RGB(0x71, 0x39, 0x61), RGB(0x71, 0x39, 0x55), RGB(0x71, 0x39, 0x45),
546 RGB(0x71, 0x39, 0x39), RGB(0x71, 0x45, 0x39), RGB(0x71, 0x55, 0x39), RGB(0x71, 0x61, 0x39),
547 RGB(0x71, 0x71, 0x39), RGB(0x61, 0x71, 0x39), RGB(0x55, 0x71, 0x39), RGB(0x45, 0x71, 0x39),
548 RGB(0x39, 0x71, 0x39), RGB(0x39, 0x71, 0x45), RGB(0x39, 0x71, 0x55), RGB(0x39, 0x71, 0x61),
549 RGB(0x39, 0x71, 0x71), RGB(0x39, 0x61, 0x71), RGB(0x39, 0x55, 0x71), RGB(0x39, 0x45, 0x71),
550 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
551 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
552 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
553 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
554 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
555 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
556 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x31, 0x00, 0x41),
557 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x31), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
558 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x31, 0x00),
559 RGB(0x41, 0x41, 0x00), RGB(0x31, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
560 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x31),
561 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x31, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
562 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x31, 0x20, 0x41), RGB(0x39, 0x20, 0x41),
563 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x39), RGB(0x41, 0x20, 0x31), RGB(0x41, 0x20, 0x28),
564 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x31, 0x20), RGB(0x41, 0x39, 0x20),
565 RGB(0x41, 0x41, 0x20), RGB(0x39, 0x41, 0x20), RGB(0x31, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
566 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x31), RGB(0x20, 0x41, 0x39),
567 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x39, 0x41), RGB(0x20, 0x31, 0x41), RGB(0x20, 0x28, 0x41),
568 RGB(0x2D, 0x2D, 0x41), RGB(0x31, 0x2D, 0x41), RGB(0x35, 0x2D, 0x41), RGB(0x3D, 0x2D, 0x41),
569 RGB(0x41, 0x2D, 0x41), RGB(0x41, 0x2D, 0x3D), RGB(0x41, 0x2D, 0x35), RGB(0x41, 0x2D, 0x31),
570 RGB(0x41, 0x2D, 0x2D), RGB(0x41, 0x31, 0x2D), RGB(0x41, 0x35, 0x2D), RGB(0x41, 0x3D, 0x2D),
571 RGB(0x41, 0x41, 0x2D), RGB(0x3D, 0x41, 0x2D), RGB(0x35, 0x41, 0x2D), RGB(0x31, 0x41, 0x2D),
572 RGB(0x2D, 0x41, 0x2D), RGB(0x2D, 0x41, 0x31), RGB(0x2D, 0x41, 0x35), RGB(0x2D, 0x41, 0x3D),
573 RGB(0x2D, 0x41, 0x41), RGB(0x2D, 0x3D, 0x41), RGB(0x2D, 0x35, 0x41), RGB(0x2D, 0x31, 0x41),
574 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
575 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
578 #elif defined(USE_DOSBOX_COLORS)
581 static CONST COLORREF VgaPalette
[VGA_MAX_COLORS
] =
583 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
584 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
585 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
586 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
587 RGB(0x00, 0x00, 0x00), RGB(0x14, 0x14, 0x14), RGB(0x20, 0x20, 0x20), RGB(0x2C, 0x2C, 0x2C),
588 RGB(0x38, 0x38, 0x38), RGB(0x45, 0x45, 0x45), RGB(0x51, 0x51, 0x51), RGB(0x61, 0x61, 0x61),
589 RGB(0x71, 0x71, 0x71), RGB(0x82, 0x82, 0x82), RGB(0x92, 0x92, 0x92), RGB(0xA2, 0xA2, 0xA2),
590 RGB(0xB6, 0xB6, 0xB6), RGB(0xCB, 0xCB, 0xCB), RGB(0xE3, 0xE3, 0xE3), RGB(0xFF, 0xFF, 0xFF),
591 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x7D, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
592 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x7D), RGB(0xFF, 0x00, 0x41),
593 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x7D, 0x00), RGB(0xFF, 0xBE, 0x00),
594 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x7D, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
595 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x7D), RGB(0x00, 0xFF, 0xBE),
596 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x7D, 0xFF), RGB(0x00, 0x41, 0xFF),
597 RGB(0x7D, 0x7D, 0xFF), RGB(0x9E, 0x7D, 0xFF), RGB(0xBE, 0x7D, 0xFF), RGB(0xDF, 0x7D, 0xFF),
598 RGB(0xFF, 0x7D, 0xFF), RGB(0xFF, 0x7D, 0xDF), RGB(0xFF, 0x7D, 0xBE), RGB(0xFF, 0x7D, 0x9E),
600 RGB(0xFF, 0x7D, 0x7D), RGB(0xFF, 0x9E, 0x7D), RGB(0xFF, 0xBE, 0x7D), RGB(0xFF, 0xDF, 0x7D),
601 RGB(0xFF, 0xFF, 0x7D), RGB(0xDF, 0xFF, 0x7D), RGB(0xBE, 0xFF, 0x7D), RGB(0x9E, 0xFF, 0x7D),
602 RGB(0x7D, 0xFF, 0x7D), RGB(0x7D, 0xFF, 0x9E), RGB(0x7D, 0xFF, 0xBE), RGB(0x7D, 0xFF, 0xDF),
603 RGB(0x7D, 0xFF, 0xFF), RGB(0x7D, 0xDF, 0xFF), RGB(0x7D, 0xBE, 0xFF), RGB(0x7D, 0x9E, 0xFF),
604 RGB(0xB6, 0xB6, 0xFF), RGB(0xC7, 0xB6, 0xFF), RGB(0xDB, 0xB6, 0xFF), RGB(0xEB, 0xB6, 0xFF),
605 RGB(0xFF, 0xB6, 0xFF), RGB(0xFF, 0xB6, 0xEB), RGB(0xFF, 0xB6, 0xDB), RGB(0xFF, 0xB6, 0xC7),
606 RGB(0xFF, 0xB6, 0xB6), RGB(0xFF, 0xC7, 0xB6), RGB(0xFF, 0xDB, 0xB6), RGB(0xFF, 0xEB, 0xB6),
607 RGB(0xFF, 0xFF, 0xB6), RGB(0xEB, 0xFF, 0xB6), RGB(0xDB, 0xFF, 0xB6), RGB(0xC7, 0xFF, 0xB6),
608 RGB(0xB6, 0xFF, 0xB6), RGB(0xB6, 0xFF, 0xC7), RGB(0xB6, 0xFF, 0xDB), RGB(0xB6, 0xFF, 0xEB),
609 RGB(0xB6, 0xFF, 0xFF), RGB(0xB6, 0xEB, 0xFF), RGB(0xB6, 0xDB, 0xFF), RGB(0xB6, 0xC7, 0xFF),
610 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x38, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
611 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x38), RGB(0x71, 0x00, 0x1C),
612 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x38, 0x00), RGB(0x71, 0x55, 0x00),
613 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x38, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
614 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x38), RGB(0x00, 0x71, 0x55),
615 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x38, 0x71), RGB(0x00, 0x1C, 0x71),
617 RGB(0x38, 0x38, 0x71), RGB(0x45, 0x38, 0x71), RGB(0x55, 0x38, 0x71), RGB(0x61, 0x38, 0x71),
618 RGB(0x71, 0x38, 0x71), RGB(0x71, 0x38, 0x61), RGB(0x71, 0x38, 0x55), RGB(0x71, 0x38, 0x45),
619 RGB(0x71, 0x38, 0x38), RGB(0x71, 0x45, 0x38), RGB(0x71, 0x55, 0x38), RGB(0x71, 0x61, 0x38),
620 RGB(0x71, 0x71, 0x38), RGB(0x61, 0x71, 0x38), RGB(0x55, 0x71, 0x38), RGB(0x45, 0x71, 0x38),
621 RGB(0x38, 0x71, 0x38), RGB(0x38, 0x71, 0x45), RGB(0x38, 0x71, 0x55), RGB(0x38, 0x71, 0x61),
622 RGB(0x38, 0x71, 0x71), RGB(0x38, 0x61, 0x71), RGB(0x38, 0x55, 0x71), RGB(0x38, 0x45, 0x71),
623 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
624 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
625 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
626 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
627 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
628 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
629 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x30, 0x00, 0x41),
630 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x30), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
631 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x30, 0x00),
632 RGB(0x41, 0x41, 0x00), RGB(0x30, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
634 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x30),
635 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x30, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
636 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x30, 0x20, 0x41), RGB(0x38, 0x20, 0x41),
637 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x38), RGB(0x41, 0x20, 0x30), RGB(0x41, 0x20, 0x28),
638 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x30, 0x20), RGB(0x41, 0x38, 0x20),
639 RGB(0x41, 0x41, 0x20), RGB(0x38, 0x41, 0x20), RGB(0x30, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
640 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x30), RGB(0x20, 0x41, 0x38),
641 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x38, 0x41), RGB(0x20, 0x30, 0x41), RGB(0x20, 0x28, 0x41),
642 RGB(0x2C, 0x2C, 0x41), RGB(0x30, 0x2C, 0x41), RGB(0x34, 0x2C, 0x41), RGB(0x3C, 0x2C, 0x41),
643 RGB(0x41, 0x2C, 0x41), RGB(0x41, 0x2C, 0x3C), RGB(0x41, 0x2C, 0x34), RGB(0x41, 0x2C, 0x30),
644 RGB(0x41, 0x2C, 0x2C), RGB(0x41, 0x30, 0x2C), RGB(0x41, 0x34, 0x2C), RGB(0x41, 0x3C, 0x2C),
645 RGB(0x41, 0x41, 0x2C), RGB(0x3C, 0x41, 0x2C), RGB(0x34, 0x41, 0x2C), RGB(0x30, 0x41, 0x2C),
646 RGB(0x2C, 0x41, 0x2C), RGB(0x2C, 0x41, 0x30), RGB(0x2C, 0x41, 0x34), RGB(0x2C, 0x41, 0x3C),
647 RGB(0x2C, 0x41, 0x41), RGB(0x2C, 0x3C, 0x41), RGB(0x2C, 0x34, 0x41), RGB(0x2C, 0x30, 0x41),
648 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
649 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
654 static CONST UCHAR Font8x8
[VGA_FONT_CHARACTERS
* 8] =
656 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
657 0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E,
658 0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E,
659 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
660 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,
661 0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x92, 0x10, 0x7C,
662 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C,
663 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00,
664 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF,
665 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
666 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF,
667 0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78,
668 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18,
669 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0,
670 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0,
671 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99,
672 0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00,
673 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00,
674 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18,
675 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00,
676 0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00,
677 0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0x86, 0xFC,
678 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00,
679 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF,
680 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00,
681 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00,
682 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00,
683 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
684 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00,
685 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
686 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00,
687 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00,
688 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
689 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00,
690 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
691 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
692 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00,
693 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00,
694 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00,
695 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
696 0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00,
697 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00,
698 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
699 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
700 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30,
701 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
702 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
703 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
704 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00,
705 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00,
706 0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00,
707 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00,
708 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00,
709 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00,
710 0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00,
711 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00,
712 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00,
713 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00,
714 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
715 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
716 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00,
717 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00,
718 0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00,
719 0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00,
720 0x7C, 0xC6, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00,
721 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00,
722 0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00,
723 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00,
724 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00,
725 0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
726 0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00,
727 0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00,
728 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00,
729 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
730 0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
731 0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00,
732 0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00,
733 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
734 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00,
735 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
736 0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,
737 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x0E, 0x00,
738 0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00,
739 0x7C, 0xC6, 0xE0, 0x78, 0x0E, 0xC6, 0x7C, 0x00,
740 0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
741 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00,
742 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
743 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
744 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00,
745 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00,
746 0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00,
747 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00,
748 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00,
749 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00,
750 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
751 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
752 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
753 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
754 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00,
755 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00,
756 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00,
757 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
758 0x38, 0x6C, 0x64, 0xF0, 0x60, 0x60, 0xF0, 0x00,
759 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
760 0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00,
761 0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
762 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78,
763 0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
764 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
765 0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xD6, 0x00,
766 0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
767 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
768 0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0,
769 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
770 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0xF0, 0x00,
771 0x00, 0x00, 0x7C, 0xC0, 0x70, 0x1C, 0xF8, 0x00,
772 0x10, 0x30, 0xFC, 0x30, 0x30, 0x34, 0x18, 0x00,
773 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
774 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
775 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
776 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00,
777 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
778 0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00,
779 0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00,
780 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00,
781 0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00,
782 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
783 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00,
784 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x0C, 0x06, 0x7C,
785 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
786 0x1C, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
787 0x7E, 0x81, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0x00,
788 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
789 0xE0, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
790 0x30, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
791 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x78, 0x0C, 0x38,
792 0x7E, 0x81, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00,
793 0xCC, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
794 0xE0, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
795 0xCC, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
796 0x7C, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
797 0xE0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
798 0xC6, 0x10, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
799 0x30, 0x30, 0x00, 0x78, 0xCC, 0xFC, 0xCC, 0x00,
800 0x1C, 0x00, 0xFC, 0x60, 0x78, 0x60, 0xFC, 0x00,
801 0x00, 0x00, 0x7F, 0x0C, 0x7F, 0xCC, 0x7F, 0x00,
802 0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00,
803 0x78, 0x84, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
804 0x00, 0xCC, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
805 0x00, 0xE0, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
806 0x78, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
807 0x00, 0xE0, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
808 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
809 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00,
810 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
811 0x18, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x18,
812 0x38, 0x6C, 0x64, 0xF0, 0x60, 0xE6, 0xFC, 0x00,
813 0xCC, 0xCC, 0x78, 0x30, 0xFC, 0x30, 0xFC, 0x30,
814 0xF8, 0xCC, 0xCC, 0xFA, 0xC6, 0xCF, 0xC6, 0xC3,
815 0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0xD8, 0x70,
816 0x1C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
817 0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
818 0x00, 0x1C, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
819 0x00, 0x1C, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
820 0x00, 0xF8, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0x00,
821 0xFC, 0x00, 0xCC, 0xEC, 0xFC, 0xDC, 0xCC, 0x00,
822 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00,
823 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00,
824 0x18, 0x00, 0x18, 0x18, 0x30, 0x66, 0x3C, 0x00,
825 0x00, 0x00, 0x00, 0xFC, 0xC0, 0xC0, 0x00, 0x00,
826 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x0C, 0x00, 0x00,
827 0xC6, 0xCC, 0xD8, 0x36, 0x6B, 0xC2, 0x84, 0x0F,
828 0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6D, 0xCF, 0x03,
829 0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00,
830 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
831 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00,
832 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
833 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
834 0xDB, 0xF6, 0xDB, 0x6F, 0xDB, 0x7E, 0xD7, 0xED,
835 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
836 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18,
837 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
838 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36,
839 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36,
840 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
841 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36,
842 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
843 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36,
844 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00,
845 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00,
846 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00,
847 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18,
848 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00,
849 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
850 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18,
851 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
852 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
853 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18,
854 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
855 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36,
856 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00,
857 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36,
858 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00,
859 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36,
860 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36,
861 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
862 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36,
863 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
864 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00,
865 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18,
866 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36,
867 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00,
868 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00,
869 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
870 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36,
871 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36,
872 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18,
873 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00,
874 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18,
875 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
876 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
877 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
878 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
879 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
880 0x00, 0x00, 0x76, 0xDC, 0xC8, 0xDC, 0x76, 0x00,
881 0x00, 0x78, 0xCC, 0xF8, 0xCC, 0xF8, 0xC0, 0xC0,
882 0x00, 0xFC, 0xCC, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
883 0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x00,
884 0xFC, 0xCC, 0x60, 0x30, 0x60, 0xCC, 0xFC, 0x00,
885 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0x70, 0x00,
886 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
887 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00,
888 0xFC, 0x30, 0x78, 0xCC, 0xCC, 0x78, 0x30, 0xFC,
889 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x6C, 0x38, 0x00,
890 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x6C, 0xEE, 0x00,
891 0x1C, 0x30, 0x18, 0x7C, 0xCC, 0xCC, 0x78, 0x00,
892 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00,
893 0x06, 0x0C, 0x7E, 0xDB, 0xDB, 0x7E, 0x60, 0xC0,
894 0x38, 0x60, 0xC0, 0xF8, 0xC0, 0x60, 0x38, 0x00,
895 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
896 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00,
897 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00,
898 0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xFC, 0x00,
899 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xFC, 0x00,
900 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18,
901 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70,
902 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00,
903 0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00,
904 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
905 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
906 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
907 0x0F, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C,
908 0x58, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00,
909 0x70, 0x98, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00,
910 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00,
911 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
914 static CONST UCHAR Font8x16
[VGA_FONT_CHARACTERS
* 16] =
916 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
917 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
918 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD,
919 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00,
920 0x00, 0x00, 0x7C, 0xFE, 0xFE, 0xD6, 0xFE, 0xFE,
921 0xBA, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00,
922 0x00, 0x00, 0x00, 0x6C, 0xEE, 0xFE, 0xFE, 0xFE,
923 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
924 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C,
925 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
926 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x10, 0x6C,
927 0xEE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
928 0x00, 0x00, 0x10, 0x38, 0x7C, 0x7C, 0xFE, 0xFE,
929 0xFE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
930 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C,
931 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
932 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3,
933 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
934 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x66, 0x66,
935 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
936 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0x99, 0x99,
937 0x99, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
938 0x00, 0x00, 0x1E, 0x0E, 0x1E, 0x36, 0x78, 0xCC,
939 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
940 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18,
941 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
942 0x00, 0x00, 0x1E, 0x1A, 0x1E, 0x18, 0x18, 0x18,
943 0x18, 0x78, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00,
944 0x00, 0x00, 0x3E, 0x36, 0x3E, 0x36, 0x36, 0x76,
945 0xF6, 0x66, 0x0E, 0x1E, 0x0C, 0x00, 0x00, 0x00,
946 0x00, 0x00, 0x18, 0xDB, 0x7E, 0x3C, 0x66, 0x66,
947 0x3C, 0x7E, 0xDB, 0x18, 0x00, 0x00, 0x00, 0x00,
948 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xFE,
949 0xFC, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00,
950 0x00, 0x00, 0x00, 0x02, 0x0E, 0x3E, 0x7E, 0xFE,
951 0x7E, 0x3E, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00,
952 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
953 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
954 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
955 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
956 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0xDB, 0x7B,
957 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00,
958 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x7C, 0xF6,
959 0xDE, 0x7C, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
960 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00,
962 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
963 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
964 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
965 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
966 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
967 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
968 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0xFF,
969 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
970 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xFE,
971 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
972 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
973 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
974 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF,
975 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
976 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x7C,
977 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
978 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x7C,
979 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
980 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
981 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
982 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x3C, 0x18,
983 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
984 0x00, 0x36, 0x36, 0x36, 0x36, 0x14, 0x00, 0x00,
985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
986 0x00, 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C,
987 0xFE, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
988 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0x78,
989 0x3C, 0x06, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
990 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x66, 0x0C,
991 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00, 0x00, 0x00,
992 0x00, 0x00, 0x38, 0x6C, 0x38, 0x30, 0x76, 0x7E,
993 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
994 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
995 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
996 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30,
997 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
998 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C,
999 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1000 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x38, 0xFE,
1001 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1002 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E,
1003 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1004 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1005 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1006 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1007 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1009 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1010 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
1011 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
1012 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xCE, 0xDE, 0xF6,
1013 0xE6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1014 0x00, 0x00, 0x18, 0x78, 0x18, 0x18, 0x18, 0x18,
1015 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1016 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x06, 0x0C, 0x18,
1017 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1018 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06,
1019 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1020 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xCC,
1021 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00,
1022 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06,
1023 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1024 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xFC, 0xC6,
1025 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1026 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C, 0x18, 0x30,
1027 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
1028 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6,
1029 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1030 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E,
1031 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1032 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1033 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1034 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1035 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1036 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0xC0,
1037 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1038 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
1039 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1040 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06,
1041 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
1042 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18,
1043 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1044 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xDE, 0xDE,
1045 0xDE, 0xDC, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00,
1046 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE,
1047 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1048 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66,
1049 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1050 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0,
1051 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1052 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66,
1053 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,
1054 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1055 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1056 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1057 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1058 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0,
1059 0xCE, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1060 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6,
1061 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1062 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1063 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1064 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1065 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1066 0x00, 0x00, 0xC6, 0xC6, 0xCC, 0xD8, 0xF0, 0xF0,
1067 0xD8, 0xCC, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1068 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60,
1069 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1070 0x00, 0x00, 0xC6, 0xC6, 0xEE, 0xEE, 0xFE, 0xD6,
1071 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1072 0x00, 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xF6, 0xDE,
1073 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1074 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1075 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1076 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x66, 0x7C,
1077 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1078 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1079 0xC6, 0xD6, 0xD6, 0x7C, 0x06, 0x00, 0x00, 0x00,
1080 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x78,
1081 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1082 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0x70, 0x1C,
1083 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1084 0x00, 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18,
1085 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1086 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1087 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1088 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1089 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1090 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6,
1091 0xFE, 0xEE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1092 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x38,
1093 0x6C, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1094 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C,
1095 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1096 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30,
1097 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1098 0x00, 0x00, 0x7C, 0x60, 0x60, 0x60, 0x60, 0x60,
1099 0x60, 0x60, 0x60, 0x7C, 0x00, 0x00, 0x00, 0x00,
1100 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30,
1101 0x18, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1102 0x00, 0x00, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
1103 0x0C, 0x0C, 0x0C, 0x7C, 0x00, 0x00, 0x00, 0x00,
1104 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00,
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1107 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
1108 0x00, 0x18, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x00,
1109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1110 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1111 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1112 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1113 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1114 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1115 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1116 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC,
1117 0xCC, 0xCC, 0xCC, 0x7E, 0x00, 0x00, 0x00, 0x00,
1118 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1119 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1120 0x00, 0x00, 0x1C, 0x36, 0x30, 0x30, 0xFC, 0x30,
1121 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00,
1122 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCE, 0xC6,
1123 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1124 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1125 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1126 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18,
1127 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1128 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x0C,
1129 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1130 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x66, 0x6C,
1131 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1132 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1133 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00,
1134 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xD6,
1135 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1136 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1137 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1138 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1139 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1140 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1141 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x00,
1142 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC,
1143 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
1144 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x60,
1145 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1146 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1147 0x7C, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1148 0x00, 0x00, 0x30, 0x30, 0x30, 0xFC, 0x30, 0x30,
1149 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,
1150 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC,
1151 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1152 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1153 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1154 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6,
1155 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00,
1156 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x6C,
1157 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1158 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1159 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1160 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x86, 0x0C,
1161 0x18, 0x30, 0x62, 0xFE, 0x00, 0x00, 0x00, 0x00,
1162 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18,
1163 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00,
1164 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
1165 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1166 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18,
1167 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
1168 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1170 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
1171 0x6C, 0x6C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1172 0x00, 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0xC6,
1173 0x66, 0x3C, 0x18, 0x0C, 0xCC, 0x38, 0x00, 0x00,
1174 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1175 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1176 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1177 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1178 0x00, 0x30, 0x78, 0xCC, 0x00, 0x78, 0x0C, 0x7C,
1179 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1180 0x00, 0x00, 0xCC, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1181 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1182 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C,
1183 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1184 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78, 0x0C, 0x7C,
1185 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1186 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0,
1187 0xC6, 0x7C, 0x18, 0x0C, 0x6C, 0x38, 0x00, 0x00,
1188 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1189 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1190 0x00, 0x00, 0xCC, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1191 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1192 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1193 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1194 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
1195 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1196 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18,
1197 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1198 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18,
1199 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1200 0x00, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6,
1201 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1202 0x38, 0x6C, 0x38, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1203 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1204 0x0C, 0x18, 0x30, 0x00, 0xFE, 0x60, 0x60, 0x7C,
1205 0x60, 0x60, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00,
1206 0x00, 0x00, 0x00, 0x00, 0x66, 0xDB, 0x1B, 0x7F,
1207 0xD8, 0xD8, 0xDF, 0x76, 0x00, 0x00, 0x00, 0x00,
1208 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xD8, 0xFE,
1209 0xD8, 0xD8, 0xD8, 0xDE, 0x00, 0x00, 0x00, 0x00,
1210 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1211 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1212 0x00, 0x00, 0xC6, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1213 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1214 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1215 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1216 0x00, 0x30, 0x78, 0xCC, 0x00, 0xC6, 0xC6, 0xC6,
1217 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1218 0x00, 0x60, 0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6,
1219 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1220 0x00, 0x18, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18,
1221 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1222 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6,
1223 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1224 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1225 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1226 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0xC0,
1227 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1228 0x00, 0x38, 0x6C, 0x60, 0x60, 0xF0, 0x60, 0x60,
1229 0x60, 0x66, 0xF6, 0x6C, 0x00, 0x00, 0x00, 0x00,
1230 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E,
1231 0x18, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1232 0x00, 0x00, 0x3E, 0x63, 0x63, 0x30, 0x1C, 0x06,
1233 0x63, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1234 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x63, 0x38,
1235 0x0E, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1236 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78, 0x0C, 0x7C,
1237 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1238 0x00, 0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18,
1239 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1240 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1241 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1242 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC,
1243 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1244 0x00, 0x00, 0x76, 0xDC, 0x00, 0xBC, 0x66, 0x66,
1245 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1246 0x00, 0x76, 0xDC, 0x00, 0xC6, 0xC6, 0xE6, 0xF6,
1247 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1248 0x00, 0x21, 0x1E, 0x00, 0x1E, 0x33, 0x60, 0x60,
1249 0x67, 0x63, 0x33, 0x1D, 0x00, 0x00, 0x00, 0x00,
1250 0x00, 0x42, 0x3C, 0x00, 0x3B, 0x66, 0x66, 0x66,
1251 0x3E, 0x06, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1252 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30,
1253 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1255 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
1256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1257 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
1258 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x30,
1259 0x60, 0xDC, 0x36, 0x0C, 0x18, 0x3E, 0x00, 0x00,
1260 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x36,
1261 0x6E, 0xDE, 0x36, 0x7E, 0x06, 0x06, 0x00, 0x00,
1262 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x3C,
1263 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1264 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6C, 0xD8,
1265 0x6C, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1266 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x6C, 0x36,
1267 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1268 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1269 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1270 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1271 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1272 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1273 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1274 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1275 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1276 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1277 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1278 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1279 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1280 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6,
1281 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1283 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1284 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8,
1285 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1286 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xF6,
1287 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1288 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1289 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1290 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6,
1291 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1292 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xFE,
1293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1294 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE,
1295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1296 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
1299 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1300 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1302 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1305 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1306 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1307 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1310 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1311 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1312 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1313 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1314 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
1315 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1316 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3F,
1317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1318 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37,
1319 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1320 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF,
1321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1322 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7,
1323 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1324 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37,
1325 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1326 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1328 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7,
1329 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1330 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF,
1331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1332 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1334 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1335 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1337 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1338 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F,
1339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1340 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1342 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F,
1343 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
1345 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1346 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1347 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1348 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF,
1349 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1350 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
1353 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1354 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1355 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1357 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1358 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1359 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1360 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1361 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1362 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1364 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0xD8, 0xD8,
1365 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1366 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8, 0xFC, 0xC6,
1367 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00, 0x00, 0x00,
1368 0x00, 0x00, 0xFE, 0x66, 0x62, 0x60, 0x60, 0x60,
1369 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00,
1370 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x6C, 0x6C,
1371 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1372 0x00, 0x00, 0xFE, 0xC6, 0x62, 0x30, 0x18, 0x18,
1373 0x30, 0x62, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1374 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xCC,
1375 0xCC, 0xCC, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1376 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1377 0x66, 0x7C, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
1378 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18,
1379 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1380 0x00, 0x00, 0xFE, 0x38, 0x38, 0x6C, 0xC6, 0xC6,
1381 0x6C, 0x38, 0x38, 0xFE, 0x00, 0x00, 0x00, 0x00,
1382 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE,
1383 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
1384 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6,
1385 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00, 0x00, 0x00,
1386 0x00, 0x00, 0x3E, 0x60, 0x60, 0x3C, 0x66, 0xC6,
1387 0xC6, 0xC6, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1388 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB,
1389 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1390 0x00, 0x00, 0x02, 0x06, 0x7C, 0xCE, 0xDE, 0xF6,
1391 0xF6, 0x7C, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00,
1392 0x00, 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C,
1393 0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00,
1394 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1395 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1396 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE,
1397 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1398 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1399 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1400 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18,
1401 0x30, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1402 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18,
1403 0x0C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1404 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1E, 0x1A, 0x18,
1405 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1406 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1407 0x18, 0x18, 0x58, 0x78, 0x30, 0x00, 0x00, 0x00,
1408 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E,
1409 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1411 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1412 0x00, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1415 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1417 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1418 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18,
1419 0xD8, 0xD8, 0x78, 0x38, 0x18, 0x00, 0x00, 0x00,
1420 0x00, 0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
1421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1422 0x00, 0x00, 0x70, 0xD8, 0x18, 0x30, 0x60, 0xF8,
1423 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1424 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E,
1425 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1430 /* PRIVATE FUNCTIONS **********************************************************/
1432 static VOID
VidBiosReadWindow(LPWORD Buffer
, SMALL_RECT Rectangle
, BYTE Page
)
1437 DWORD VideoAddress
= TO_LINEAR(TEXT_VIDEO_SEG
, Page
* Bda
->VideoPageSize
);
1439 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
1441 for (j
= Rectangle
.Left
; j
<= Rectangle
.Right
; j
++)
1443 /* Read from video memory */
1444 EmulatorReadMemory(&EmulatorContext
,
1445 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
1449 /* Write the data to the buffer in row order */
1450 Buffer
[Counter
++] = Character
;
1455 static VOID
VidBiosWriteWindow(LPWORD Buffer
, SMALL_RECT Rectangle
, BYTE Page
)
1460 DWORD VideoAddress
= TO_LINEAR(TEXT_VIDEO_SEG
, Page
* Bda
->VideoPageSize
);
1462 for (i
= Rectangle
.Top
; i
<= Rectangle
.Bottom
; i
++)
1464 for (j
= Rectangle
.Left
; j
<= Rectangle
.Right
; j
++)
1466 Character
= Buffer
[Counter
++];
1468 /* Write to video memory */
1469 EmulatorWriteMemory(&EmulatorContext
,
1470 VideoAddress
+ (i
* Bda
->ScreenColumns
+ j
) * sizeof(WORD
),
1477 static BOOLEAN
VidBiosScrollWindow(INT Direction
,
1479 SMALL_RECT Rectangle
,
1485 WORD WindowWidth
= Rectangle
.Right
- Rectangle
.Left
+ 1;
1486 WORD WindowHeight
= Rectangle
.Bottom
- Rectangle
.Top
+ 1;
1487 DWORD WindowSize
= WindowWidth
* WindowHeight
;
1489 /* Allocate a buffer for the window */
1490 WindowData
= (LPWORD
)HeapAlloc(GetProcessHeap(),
1492 WindowSize
* sizeof(WORD
));
1493 if (WindowData
== NULL
) return FALSE
;
1495 /* Read the window data */
1496 VidBiosReadWindow(WindowData
, Rectangle
, Page
);
1499 || (((Direction
== SCROLL_DIRECTION_UP
)
1500 || (Direction
== SCROLL_DIRECTION_DOWN
))
1501 && (Amount
>= WindowHeight
))
1502 || (((Direction
== SCROLL_DIRECTION_LEFT
)
1503 || (Direction
== SCROLL_DIRECTION_RIGHT
))
1504 && (Amount
>= WindowWidth
)))
1506 /* Fill the window */
1507 for (i
= 0; i
< WindowSize
; i
++)
1509 WindowData
[i
] = MAKEWORD(' ', FillAttribute
);
1517 case SCROLL_DIRECTION_UP
:
1519 RtlMoveMemory(WindowData
,
1520 &WindowData
[WindowWidth
* Amount
],
1521 (WindowSize
- WindowWidth
* Amount
) * sizeof(WORD
));
1523 for (i
= 0; i
< Amount
* WindowWidth
; i
++)
1525 WindowData
[WindowSize
- i
- 1] = MAKEWORD(' ', FillAttribute
);
1531 case SCROLL_DIRECTION_DOWN
:
1533 RtlMoveMemory(&WindowData
[WindowWidth
* Amount
],
1535 (WindowSize
- WindowWidth
* Amount
) * sizeof(WORD
));
1537 for (i
= 0; i
< Amount
* WindowWidth
; i
++)
1539 WindowData
[i
] = MAKEWORD(' ', FillAttribute
);
1547 // TODO: NOT IMPLEMENTED!
1553 /* Write back the window data */
1554 VidBiosWriteWindow(WindowData
, Rectangle
, Page
);
1556 /* Free the window buffer */
1557 HeapFree(GetProcessHeap(), 0, WindowData
);
1562 static __inline VOID
VgaSetSinglePaletteRegister(BYTE Index
, BYTE Value
)
1564 /* Write the index */
1565 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
1566 IOWriteB(VGA_AC_INDEX
, Index
);
1568 /* Write the data */
1569 IOWriteB(VGA_AC_WRITE
, Value
);
1572 static BOOLEAN
VgaSetRegisters(PVGA_REGISTERS Registers
)
1576 if (Registers
== NULL
) return FALSE
;
1578 /* Disable interrupts */
1582 * Set the CRT base address according to the selected mode,
1583 * monochrome or color. The following macros:
1584 * VGA_INSTAT1_READ, VGA_CRTC_INDEX and VGA_CRTC_DATA are then
1585 * used to access the correct VGA I/O ports.
1587 Bda
->CrtBasePort
= (Registers
->Misc
& 0x01) ? VGA_CRTC_INDEX_COLOR
1588 : VGA_CRTC_INDEX_MONO
;
1590 /* Write the misc register */
1591 IOWriteB(VGA_MISC_WRITE
, Registers
->Misc
);
1593 /* Synchronous reset on */
1594 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_RESET_REG
);
1595 IOWriteB(VGA_SEQ_DATA
, VGA_SEQ_RESET_AR
);
1597 /* Write the sequencer registers */
1598 for (i
= 1; i
< VGA_SEQ_MAX_REG
; i
++)
1600 IOWriteB(VGA_SEQ_INDEX
, i
);
1601 IOWriteB(VGA_SEQ_DATA
, Registers
->Sequencer
[i
]);
1604 /* Synchronous reset off */
1605 IOWriteB(VGA_SEQ_INDEX
, VGA_SEQ_RESET_REG
);
1606 IOWriteB(VGA_SEQ_DATA
, VGA_SEQ_RESET_SR
| VGA_SEQ_RESET_AR
);
1608 /* Unlock CRTC registers 0-7 */
1609 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_END_HORZ_BLANKING_REG
);
1610 IOWriteB(VGA_CRTC_DATA
, IOReadB(VGA_CRTC_DATA
) | 0x80);
1611 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_VERT_RETRACE_END_REG
);
1612 IOWriteB(VGA_CRTC_DATA
, IOReadB(VGA_CRTC_DATA
) & ~0x80);
1613 // Make sure they remain unlocked
1614 Registers
->CRT
[VGA_CRTC_END_HORZ_BLANKING_REG
] |= 0x80;
1615 Registers
->CRT
[VGA_CRTC_VERT_RETRACE_END_REG
] &= ~0x80;
1617 /* Write the CRTC registers */
1618 for (i
= 0; i
< VGA_CRTC_MAX_REG
; i
++)
1620 IOWriteB(VGA_CRTC_INDEX
, i
);
1621 IOWriteB(VGA_CRTC_DATA
, Registers
->CRT
[i
]);
1624 /* Write the GC registers */
1625 for (i
= 0; i
< VGA_GC_MAX_REG
; i
++)
1627 IOWriteB(VGA_GC_INDEX
, i
);
1628 IOWriteB(VGA_GC_DATA
, Registers
->Graphics
[i
]);
1631 /* Write the AC registers */
1633 for (i
= 0; i
< VGA_AC_MAX_REG
; i
++)
1635 VgaSetSinglePaletteRegister(i
, Registers
->Attribute
[i
]);
1636 // DbgPrint("Registers->Attribute[%d] = %d\n", i, Registers->Attribute[i]);
1640 /* Set the PEL mask */
1641 IOWriteB(VGA_DAC_MASK
, 0xFF);
1643 /* Enable screen and disable palette access */
1644 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
1645 IOWriteB(VGA_AC_INDEX
, 0x20);
1647 /* Enable interrupts */
1653 static VOID
VgaSetPalette(const COLORREF
* Palette
, ULONG Size
)
1657 // /* Disable screen and enable palette access */
1658 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
1659 // IOWriteB(VGA_AC_INDEX, 0x00);
1661 for (i
= 0; i
< Size
; i
++)
1663 IOWriteB(VGA_DAC_WRITE_INDEX
, i
);
1664 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(GetRValue(Palette
[i
])));
1665 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(GetGValue(Palette
[i
])));
1666 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(GetBValue(Palette
[i
])));
1669 /* The following step might be optional */
1670 for (i
= Size
; i
< VGA_MAX_COLORS
; i
++)
1672 IOWriteB(VGA_DAC_WRITE_INDEX
, i
);
1673 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(0x00));
1674 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(0x00));
1675 IOWriteB(VGA_DAC_DATA
, VGA_COLOR_TO_DAC(0x00));
1678 /* Enable screen and disable palette access */
1679 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
1680 // IOWriteB(VGA_AC_INDEX, 0x20);
1683 static VOID
VgaChangePalette(BYTE ModeNumber
)
1685 const COLORREF
* Palette
;
1688 if (ModeNumber
>= 0x13)
1691 Palette
= VgaPalette
;
1692 Size
= sizeof(VgaPalette
)/sizeof(VgaPalette
[0]);
1694 else if (ModeNumber
== 0x10) // || (ModeNumber == 0x0D) || (ModeNumber == 0x0E)
1696 /* EGA HiRes mode */
1697 Palette
= EgaPalette__HiRes
;
1698 Size
= sizeof(EgaPalette__HiRes
)/sizeof(EgaPalette__HiRes
[0]);
1701 else if ((ModeNumber
== 0x04) || (ModeNumber
== 0x05))
1704 * CGA modes; this palette contains both normal and
1705 * bright versions of CGA palettes 0 and 1
1707 Palette
= CgaPalette2
;
1708 Size
= sizeof(CgaPalette2
)/sizeof(CgaPalette2
[0]);
1711 else // if ((ModeNumber == 0x0D) || (ModeNumber == 0x0E))
1714 Palette
= EgaPalette__16Colors
;
1715 Size
= sizeof(EgaPalette__16Colors
)/sizeof(EgaPalette__16Colors
[0]);
1718 VgaSetPalette(Palette
, Size
);
1721 static VOID
VidBiosGetCursorPosition(PBYTE Row
, PBYTE Column
, BYTE Page
)
1723 /* Make sure the selected video page is valid */
1724 if (Page
>= BIOS_MAX_PAGES
) return;
1726 /* Get the cursor location */
1727 *Row
= HIBYTE(Bda
->CursorPosition
[Page
]);
1728 *Column
= LOBYTE(Bda
->CursorPosition
[Page
]);
1731 static VOID
VidBiosSetCursorPosition(BYTE Row
, BYTE Column
, BYTE Page
)
1733 /* Make sure the selected video page is valid */
1734 if (Page
>= BIOS_MAX_PAGES
) return;
1736 /* Update the position in the BDA */
1737 Bda
->CursorPosition
[Page
] = MAKEWORD(Column
, Row
);
1739 /* Check if this is the current video page */
1740 if (Page
== Bda
->VideoPage
)
1742 WORD Offset
= Row
* Bda
->ScreenColumns
+ Column
;
1744 /* Modify the CRTC registers */
1745 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_LOW_REG
);
1746 IOWriteB(VGA_CRTC_DATA
, LOBYTE(Offset
));
1747 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_HIGH_REG
);
1748 IOWriteB(VGA_CRTC_DATA
, HIBYTE(Offset
));
1752 VOID
VidBiosSyncCursorPosition(VOID
)
1756 SHORT ScreenColumns
= VgaGetDisplayResolution().X
;
1759 /* Get the cursor location */
1760 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_LOW_REG
);
1761 Low
= IOReadB(VGA_CRTC_DATA
);
1762 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_LOC_HIGH_REG
);
1763 High
= IOReadB(VGA_CRTC_DATA
);
1765 Offset
= MAKEWORD(Low
, High
);
1767 Row
= (BYTE
)(Offset
/ ScreenColumns
);
1768 Column
= (BYTE
)(Offset
% ScreenColumns
);
1770 /* Synchronize our cursor position with VGA */
1771 VidBiosSetCursorPosition(Row
, Column
, Bda
->VideoPage
);
1774 BYTE
VidBiosGetVideoMode(VOID
)
1776 return Bda
->VideoMode
;
1779 static BOOLEAN
VidBiosSetVideoMode(BYTE ModeNumber
)
1783 BOOLEAN DoNotClear
= !!(ModeNumber
& 0x80);
1784 PVGA_REGISTERS VgaMode
;
1786 /* Retrieve the real mode number and check its validity */
1788 // if (ModeNumber >= sizeof(VideoModes)/sizeof(VideoModes[0]))
1789 if (ModeNumber
> BIOS_MAX_VIDEO_MODE
)
1791 DPRINT1("VidBiosSetVideoMode -- Mode %02Xh invalid\n", ModeNumber
);
1795 VgaMode
= VideoModes
[ModeNumber
];
1797 DPRINT1("Switching to mode %02Xh %s clearing the screen; VgaMode = 0x%p\n",
1798 ModeNumber
, (DoNotClear
? "without" : "and"), VgaMode
);
1800 if (!VgaSetRegisters(VgaMode
)) return FALSE
;
1802 VgaChangePalette(ModeNumber
);
1805 * IBM standard modes do not clear the screen if the
1806 * high bit of AL is set (EGA or higher only).
1807 * See Ralf Brown: http://www.ctyme.com/intr/rb-0069.htm
1808 * for more information.
1810 if (!DoNotClear
) VgaClearMemory();
1812 // Bda->CrtModeControl;
1813 // Bda->CrtColorPaletteMask;
1817 /* Update the values in the BDA */
1818 Bda
->VideoMode
= ModeNumber
;
1819 Bda
->VideoPageSize
= VideoModePageSize
[ModeNumber
];
1821 Bda
->VideoPageOffset
= Bda
->VideoPage
* Bda
->VideoPageSize
;
1823 /* Set the start address in the CRTC */
1824 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_LOW_REG
);
1825 IOWriteB(VGA_CRTC_DATA
, LOBYTE(Bda
->VideoPageOffset
));
1826 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_HIGH_REG
);
1827 IOWriteB(VGA_CRTC_DATA
, HIBYTE(Bda
->VideoPageOffset
));
1829 /* Update the character height */
1830 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_MAX_SCAN_LINE_REG
);
1831 Bda
->CharacterHeight
= 1 + (IOReadB(VGA_CRTC_DATA
) & 0x1F);
1833 /* Update the screen size */
1834 Resolution
= VgaGetDisplayResolution();
1835 Bda
->ScreenColumns
= Resolution
.X
;
1836 Bda
->ScreenRows
= Resolution
.Y
- 1;
1838 /* Set the cursor position for each page */
1839 for (Page
= 0; Page
< BIOS_MAX_PAGES
; ++Page
)
1840 VidBiosSetCursorPosition(0, 0, Page
);
1842 /* Refresh display */
1843 VgaRefreshDisplay();
1848 static BOOLEAN
VidBiosSetVideoPage(BYTE PageNumber
)
1852 /* Check if the page exists */
1853 if (PageNumber
>= BIOS_MAX_PAGES
) return FALSE
;
1855 /* Check if this is the same page */
1856 if (PageNumber
== Bda
->VideoPage
) return TRUE
;
1858 /* Update the values in the BDA */
1859 Bda
->VideoPage
= PageNumber
;
1860 Bda
->VideoPageOffset
= Bda
->VideoPage
* Bda
->VideoPageSize
;
1862 /* Set the start address in the CRTC */
1863 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_LOW_REG
);
1864 IOWriteB(VGA_CRTC_DATA
, LOBYTE(Bda
->VideoPageOffset
));
1865 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_START_ADDR_HIGH_REG
);
1866 IOWriteB(VGA_CRTC_DATA
, HIBYTE(Bda
->VideoPageOffset
));
1869 * Get the cursor location (we don't update anything on the BIOS side
1870 * but we update the cursor location on the VGA side).
1872 VidBiosGetCursorPosition(&Row
, &Column
, PageNumber
);
1873 VidBiosSetCursorPosition(Row
, Column
, PageNumber
);
1878 static VOID
VidBiosPrintCharacter(CHAR Character
, BYTE Attribute
, BYTE Page
)
1880 WORD CharData
= MAKEWORD(Character
, Attribute
);
1883 /* Make sure the page exists */
1884 if (Page
>= BIOS_MAX_PAGES
) return;
1886 /* Get the cursor location */
1887 VidBiosGetCursorPosition(&Row
, &Column
, Page
);
1889 if (Character
== '\a')
1891 /* Bell control character */
1892 // NOTE: We may use what the terminal emulator offers to us...
1896 else if (Character
== '\b')
1898 /* Backspace control character */
1905 Column
= Bda
->ScreenColumns
- 1;
1909 /* Erase the existing character */
1910 CharData
= MAKEWORD(' ', Attribute
);
1911 EmulatorWriteMemory(&EmulatorContext
,
1912 TO_LINEAR(TEXT_VIDEO_SEG
,
1913 Page
* Bda
->VideoPageSize
+
1914 (Row
* Bda
->ScreenColumns
+ Column
) * sizeof(WORD
)),
1918 else if (Character
== '\t')
1920 /* Horizontal Tabulation control character */
1923 // Taken from DOSBox
1924 VidBiosPrintCharacter(' ', Attribute
, Page
);
1925 VidBiosGetCursorPosition(&Row
, &Column
, Page
);
1926 } while (Column
% 8);
1928 else if (Character
== '\n')
1930 /* Line Feed control character */
1933 else if (Character
== '\r')
1935 /* Carriage Return control character */
1940 /* Default character */
1942 /* Write the character */
1943 EmulatorWriteMemory(&EmulatorContext
,
1944 TO_LINEAR(TEXT_VIDEO_SEG
,
1945 Page
* Bda
->VideoPageSize
+
1946 (Row
* Bda
->ScreenColumns
+ Column
) * sizeof(WORD
)),
1950 /* Advance the cursor */
1954 /* Check if it passed the end of the row */
1955 if (Column
>= Bda
->ScreenColumns
)
1957 /* Return to the first column and go to the next line */
1962 /* Scroll the screen up if needed */
1963 if (Row
> Bda
->ScreenRows
)
1965 /* The screen must be scrolled up */
1966 SMALL_RECT Rectangle
= { 0, 0, Bda
->ScreenColumns
- 1, Bda
->ScreenRows
};
1968 VidBiosScrollWindow(SCROLL_DIRECTION_UP
,
1977 /* Set the cursor position */
1978 VidBiosSetCursorPosition(Row
, Column
, Page
);
1981 /* PUBLIC FUNCTIONS ***********************************************************/
1983 VOID WINAPI
VidBiosVideoService(LPWORD Stack
)
1987 /* Set Video Mode */
1990 VidBiosSetVideoMode(getAL());
1994 /* Set Text-Mode Cursor Shape */
1997 /* Update the BDA */
1998 Bda
->CursorStartLine
= getCH();
1999 Bda
->CursorEndLine
= getCL();
2001 /* Modify the CRTC registers */
2002 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_START_REG
);
2003 IOWriteB(VGA_CRTC_DATA
, Bda
->CursorStartLine
);
2004 IOWriteB(VGA_CRTC_INDEX
, VGA_CRTC_CURSOR_END_REG
);
2005 IOWriteB(VGA_CRTC_DATA
, Bda
->CursorEndLine
);
2010 /* Set Cursor Position */
2013 VidBiosSetCursorPosition(getDH(), getDL(), getBH());
2017 /* Get Cursor Position and Shape */
2020 /* Make sure the selected video page exists */
2021 if (getBH() >= BIOS_MAX_PAGES
) break;
2023 /* Return the result */
2025 setCX(MAKEWORD(Bda
->CursorEndLine
, Bda
->CursorStartLine
));
2026 setDX(Bda
->CursorPosition
[getBH()]);
2030 /* Query Light Pen */
2034 * On modern BIOSes, this function returns 0
2035 * so that we can ignore the other registers.
2041 /* Select Active Display Page */
2044 VidBiosSetVideoPage(getAL());
2048 /* Scroll Window Up/Down */
2052 SMALL_RECT Rectangle
= { getCL(), getCH(), getDL(), getDH() };
2054 /* Call the internal function */
2055 VidBiosScrollWindow((getAH() == 0x06) ? SCROLL_DIRECTION_UP
2056 : SCROLL_DIRECTION_DOWN
,
2065 /* Read Character and Attribute at Cursor Position */
2069 BYTE Page
= getBH();
2072 /* Check if the page exists */
2073 if (Page
>= BIOS_MAX_PAGES
) break;
2075 /* Find the offset of the character */
2076 Offset
= Page
* Bda
->VideoPageSize
+
2077 (HIBYTE(Bda
->CursorPosition
[Page
]) * Bda
->ScreenColumns
+
2078 LOBYTE(Bda
->CursorPosition
[Page
])) * 2;
2080 /* Read from the video memory */
2081 EmulatorReadMemory(&EmulatorContext
,
2082 TO_LINEAR(TEXT_VIDEO_SEG
, Offset
),
2083 (LPVOID
)&CharacterData
,
2086 /* Return the character data in AX */
2087 setAX(CharacterData
);
2092 /* Write Character and Attribute at Cursor Position */
2094 /* Write Character only (PCjr: + Attribute) at Cursor Position */
2097 WORD CharacterData
= MAKEWORD(getAL(), getBL());
2098 BYTE Page
= getBH();
2099 DWORD Offset
, Counter
= getCX();
2101 /* Check if the page exists */
2102 if (Page
>= BIOS_MAX_PAGES
) break;
2104 /* Find the offset of the character */
2105 Offset
= Page
* Bda
->VideoPageSize
+
2106 (HIBYTE(Bda
->CursorPosition
[Page
]) * Bda
->ScreenColumns
+
2107 LOBYTE(Bda
->CursorPosition
[Page
])) * 2;
2109 /* Write to video memory a certain number of times */
2112 EmulatorWriteMemory(&EmulatorContext
,
2113 TO_LINEAR(TEXT_VIDEO_SEG
, Offset
),
2114 (LPVOID
)&CharacterData
,
2115 (getAH() == 0x09) ? sizeof(WORD
) : sizeof(BYTE
));
2123 /* Set Video Colors */
2126 if (Bda
->VideoMode
< 4 || Bda
->VideoMode
> 6)
2128 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X is unsupported for non-CGA modes\n",
2135 case 0x00: /* Set Background/Border Color */
2138 BYTE Index
= getBL();
2139 BYTE CrtColorPaletteMask
= Bda
->CrtColorPaletteMask
;
2140 CrtColorPaletteMask
= (CrtColorPaletteMask
& 0xE0) | (Index
& 0x1F);
2141 Bda
->CrtColorPaletteMask
= CrtColorPaletteMask
;
2143 Index
= ((Index
<< 1) & 0x10) | (Index
& 0x7);
2145 /* Always set the overscan color */
2146 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG
, Index
);
2148 /* Don't set any extra colors when in text mode */
2149 if (Bda
->VideoMode
<= 3) break;
2151 VgaSetSinglePaletteRegister(0x00, Index
);
2153 Index
= (CrtColorPaletteMask
& 0x10) | 0x02 | ((CrtColorPaletteMask
& 0x20) >> 5);
2155 VgaSetSinglePaletteRegister(0x01, Index
);
2157 VgaSetSinglePaletteRegister(0x02, Index
);
2159 VgaSetSinglePaletteRegister(0x03, Index
);
2161 /* Background/Border Color is modifiable via the first index */
2162 VgaSetSinglePaletteRegister(0x00, getBL());
2165 /* Enable screen and disable palette access */
2166 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2167 IOWriteB(VGA_AC_INDEX
, 0x20);
2171 case 0x01: /* Set Palette */
2173 BYTE Index
= getBL();
2174 BYTE CrtColorPaletteMask
= Bda
->CrtColorPaletteMask
;
2175 CrtColorPaletteMask
= (CrtColorPaletteMask
& 0xDF) | ((Index
& 1) ? 0x20 : 0x0);
2176 Bda
->CrtColorPaletteMask
= CrtColorPaletteMask
;
2178 /* Don't set any extra colors when in text mode */
2179 if (Bda
->VideoMode
<= 3) break;
2181 Index
= (CrtColorPaletteMask
& 0x10) | 0x02 | Index
;
2183 VgaSetSinglePaletteRegister(0x01, Index
);
2185 VgaSetSinglePaletteRegister(0x02, Index
);
2187 VgaSetSinglePaletteRegister(0x03, Index
);
2189 /* Enable screen and disable palette access */
2190 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2191 IOWriteB(VGA_AC_INDEX
, 0x20);
2196 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X NOT IMPLEMENTED\n",
2204 /* Teletype Output */
2207 VidBiosPrintCharacter(getAL(), getBL(), getBH());
2211 /* Get Current Video Mode */
2214 setAX(MAKEWORD(Bda
->VideoMode
, Bda
->ScreenColumns
));
2215 setBX(MAKEWORD(getBL(), Bda
->VideoPage
));
2219 /* Palette Control */
2224 /* Set Single Palette Register */
2227 VgaSetSinglePaletteRegister(getBL(), getBH());
2229 /* Enable screen and disable palette access */
2230 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2231 IOWriteB(VGA_AC_INDEX
, 0x20);
2235 /* Set Overscan Color */
2238 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG
, getBH());
2240 /* Enable screen and disable palette access */
2241 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2242 IOWriteB(VGA_AC_INDEX
, 0x20);
2246 /* Set All Palette Registers */
2250 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
2252 /* Set the palette registers */
2253 for (i
= 0; i
<= VGA_AC_PAL_F_REG
; i
++)
2255 VgaSetSinglePaletteRegister(i
, Buffer
[i
]);
2258 /* Set the overscan register */
2259 // VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Buffer[VGA_AC_PAL_F_REG + 1]);
2260 IOWriteB(VGA_AC_INDEX
, VGA_AC_OVERSCAN_REG
);
2261 IOWriteB(VGA_AC_WRITE
, Buffer
[VGA_AC_PAL_F_REG
+ 1]);
2263 /* Enable screen and disable palette access */
2264 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2265 IOWriteB(VGA_AC_INDEX
, 0x20);
2269 /* Get Single Palette Register */
2272 /* Write the index */
2273 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2274 IOWriteB(VGA_AC_INDEX
, getBL());
2277 setBH(IOReadB(VGA_AC_READ
));
2279 /* Enable screen and disable palette access */
2280 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2281 IOWriteB(VGA_AC_INDEX
, 0x20);
2285 /* Get Overscan Color */
2288 /* Write the index */
2289 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2290 IOWriteB(VGA_AC_INDEX
, VGA_AC_OVERSCAN_REG
);
2293 setBH(IOReadB(VGA_AC_READ
));
2295 /* Enable screen and disable palette access */
2296 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2297 IOWriteB(VGA_AC_INDEX
, 0x20);
2301 /* Get All Palette Registers */
2305 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
2307 /* Get the palette registers */
2308 for (i
= 0; i
<= VGA_AC_PAL_F_REG
; i
++)
2310 /* Write the index */
2311 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2312 IOWriteB(VGA_AC_INDEX
, i
);
2315 Buffer
[i
] = IOReadB(VGA_AC_READ
);
2318 /* Get the overscan register */
2319 IOWriteB(VGA_AC_INDEX
, VGA_AC_OVERSCAN_REG
);
2320 Buffer
[VGA_AC_PAL_F_REG
+ 1] = IOReadB(VGA_AC_READ
);
2322 /* Enable screen and disable palette access */
2323 IOReadB(VGA_INSTAT1_READ
); // Put the AC register into index state
2324 IOWriteB(VGA_AC_INDEX
, 0x20);
2328 /* Set Individual DAC Register */
2331 /* Write the index */
2332 // Certainly in BL and not in BX as said by Ralf Brown...
2333 IOWriteB(VGA_DAC_WRITE_INDEX
, getBL());
2335 /* Write the data in this order: Red, Green, Blue */
2336 IOWriteB(VGA_DAC_DATA
, getDH());
2337 IOWriteB(VGA_DAC_DATA
, getCH());
2338 IOWriteB(VGA_DAC_DATA
, getCL());
2343 /* Set Block of DAC Registers */
2347 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
2349 /* Write the index */
2350 // Certainly in BL and not in BX as said by Ralf Brown...
2351 IOWriteB(VGA_DAC_WRITE_INDEX
, getBL());
2353 for (i
= 0; i
< getCX(); i
++)
2355 /* Write the data in this order: Red, Green, Blue */
2356 IOWriteB(VGA_DAC_DATA
, *Buffer
++);
2357 IOWriteB(VGA_DAC_DATA
, *Buffer
++);
2358 IOWriteB(VGA_DAC_DATA
, *Buffer
++);
2364 /* Get Individual DAC Register */
2367 /* Write the index */
2368 IOWriteB(VGA_DAC_READ_INDEX
, getBL());
2370 /* Read the data in this order: Red, Green, Blue */
2371 setDH(IOReadB(VGA_DAC_DATA
));
2372 setCH(IOReadB(VGA_DAC_DATA
));
2373 setCL(IOReadB(VGA_DAC_DATA
));
2378 /* Get Block of DAC Registers */
2382 LPBYTE Buffer
= SEG_OFF_TO_PTR(getES(), getDX());
2384 /* Write the index */
2385 // Certainly in BL and not in BX as said by Ralf Brown...
2386 IOWriteB(VGA_DAC_READ_INDEX
, getBL());
2388 for (i
= 0; i
< getCX(); i
++)
2390 /* Write the data in this order: Red, Green, Blue */
2391 *Buffer
++ = IOReadB(VGA_DAC_DATA
);
2392 *Buffer
++ = IOReadB(VGA_DAC_DATA
);
2393 *Buffer
++ = IOReadB(VGA_DAC_DATA
);
2401 DPRINT1("BIOS Palette Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
2419 FONT_8x8_HIGH_OFFSET
, /* 00h - INT 0x1F pointer */
2420 0, /* 01h - NOT IMPLEMENTED - INT 0x43 pointer */
2421 0, /* 02h - NOT IMPLEMENTED - 8x14 font */
2422 FONT_8x8_OFFSET
, /* 03h - 8x8 font */
2423 FONT_8x8_HIGH_OFFSET
, /* 04h - 8x8 font, upper half */
2424 0, /* 05h - NOT IMPLEMENTED - 9x14 font */
2425 FONT_8x16_OFFSET
, /* 06h - 8x16 font */
2426 0, /* 07h - NOT IMPLEMENTED - 9x16 font */
2429 /* Return the data */
2430 setES(VIDEO_BIOS_DATA_SEG
);
2431 setBP(Offsets
[getBH() & 7]);
2438 DPRINT1("BIOS Font Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
2446 /* Alternate Function Select */
2449 DPRINT1("BIOS Function INT 10h, AH = 12h (Alternate Function Select), BX = 0x%04X NOT IMPLEMENTED\n",
2457 DPRINT1("BIOS Function INT 13h (Write String) is UNIMPLEMENTED\n");
2461 /* Display combination code */
2466 case 0x00: /* Get Display combiantion code */
2467 setAX(MAKEWORD(0x1A, 0x1A));
2468 setBX(MAKEWORD(0x08, 0x00)); /* VGA w/ color analog display */
2470 case 0x01: /* Set Display combination code */
2471 DPRINT1("Set Display combination code - Unsupported\n");
2481 DPRINT1("BIOS Function INT 10h, AH = 0x%02X, AL = 0x%02X, BH = 0x%02X NOT IMPLEMENTED\n",
2482 getAH(), getAL(), getBH());
2489 * Those attach / detach functions are work-in-progress
2492 static BOOL Attached
= TRUE
;
2494 VOID
VidBiosAttachToConsole(VOID
)
2496 // VgaRefreshDisplay();
2499 VgaAttachToConsole();
2503 VgaRefreshDisplay();
2504 VidBiosSyncCursorPosition();
2507 VOID
VidBiosDetachFromConsole(VOID
)
2509 /* Perform another screen refresh */
2510 VgaRefreshDisplay();
2512 /* Detach from the console */
2513 VgaDetachFromConsole(FALSE
);
2517 BOOLEAN
VidBiosInitialize(VOID
)
2519 /* Some interrupts are in fact addresses to tables */
2520 ((PULONG
)BaseAddress
)[0x1D] = (ULONG
)NULL
;
2521 ((PULONG
)BaseAddress
)[0x1F] = MAKELONG(FONT_8x8_HIGH_OFFSET
, VIDEO_BIOS_DATA_SEG
);
2522 // ((PULONG)BaseAddress)[0x42] = (ULONG)NULL;
2523 ((PULONG
)BaseAddress
)[0x43] = (ULONG
)NULL
;
2524 ((PULONG
)BaseAddress
)[0x44] = (ULONG
)NULL
;
2526 /* Fill the tables */
2527 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, FONT_8x8_OFFSET
),
2530 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG
, FONT_8x16_OFFSET
),
2534 /* Write the default font to the VGA font plane */
2535 VgaWriteFont(0, Font8x16
, 16);
2537 /* Initialize the VGA BDA data */
2538 Bda
->VGAOptions
= 0x30; /* 256 KB Video RAM */
2539 Bda
->VGASwitches
= 0x09; /* High-resolution */
2542 // FIXME: At the moment we always set a VGA mode. In the future,
2543 // we should set this mode **only** when:
2544 // - an app starts to use directly the video memory
2545 // (that should be done in emulator.c)
2546 // - or starts to use non-stream I/O interrupts
2547 // (that should be done here, or maybe in VGA ??)
2550 /* Set the default video mode */
2551 VidBiosSetVideoMode(BIOS_DEFAULT_VIDEO_MODE
);
2553 /* Synchronize our cursor position with VGA */
2554 VidBiosSyncCursorPosition();
2556 /* Register the BIOS support BOPs */
2557 RegisterBop(BOP_VIDEO_INT
, VidBiosVideoService
);
2562 VOID
VidBiosCleanup(VOID
)