[NTVDM]: Temporarily fix for r65015 before a proper fix.
[reactos.git] / reactos / subsystems / ntvdm / bios / vidbios.c
1 /*
2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: vidbios.c
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)
8 */
9
10 /* INCLUDES *******************************************************************/
11
12 #define NDEBUG
13
14 #include "emulator.h"
15 #include "cpu/cpu.h"
16 #include "cpu/bop.h"
17
18 #include "bios.h"
19 // #include "vidbios.h"
20
21 #include "io.h"
22 #include "hardware/vga.h"
23
24 /* DEFINES ********************************************************************/
25
26 /* BOP Identifiers */
27 #define BOP_VIDEO_INT 0x10
28
29 /* MACROS *********************************************************************/
30
31 //
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.
34 //
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
38
39 /* PRIVATE VARIABLES **********************************************************/
40
41 /*
42 * VGA Register Configurations for BIOS Video Modes
43 * The configurations come from DOSBox.
44 */
45 static VGA_REGISTERS VideoMode_40x25_text =
46 {
47 /* Miscellaneous Register */
48 0x67,
49
50 /* Sequencer Registers */
51 {0x00, 0x08, 0x03, 0x00, 0x07},
52
53 /* CRTC Registers */
54 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
55 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x1F, 0x96, 0xB9, 0xA3,
56 0xFF},
57
58 /* GC Registers */
59 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
60
61 /* AC Registers */
62 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
63 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
64 };
65
66 static VGA_REGISTERS VideoMode_80x25_text =
67 {
68 /* Miscellaneous Register */
69 0x67,
70
71 /* Sequencer Registers */
72 {0x00, 0x00, 0x03, 0x00, 0x07},
73
74 /* CRTC Registers */
75 {0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
76 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3,
77 0xFF},
78
79 /* GC Registers */
80 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
81
82 /* AC Registers */
83 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
84 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
85 };
86
87 static VGA_REGISTERS VideoMode_320x200_4color =
88 {
89 /* Miscellaneous Register */
90 0x63,
91
92 /* Sequencer Registers */
93 {0x00, 0x09, 0x03, 0x00, 0x02},
94
95 /* CRTC Registers */
96 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
97 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xA2,
98 0xFF},
99
100 /* GC Registers */
101 {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0F, 0x0F, 0xFF},
102
103 /* AC Registers */
104 {0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
105 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
106 };
107
108 static VGA_REGISTERS VideoMode_640x200_2color =
109 {
110 /* Miscellaneous Register */
111 0x63,
112
113 /* Sequencer Registers */
114 {0x00, 0x09, 0x0F, 0x00, 0x02},
115
116 /* CRTC Registers */
117 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xC2,
119 0xFF},
120
121 /* GC Registers */
122 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0xFF},
123
124 /* AC Registers */
125 {0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
126 0x17, 0x17, 0x17, 0x17, 0x01, 0x00, 0x01, 0x00, 0x00}
127 };
128
129 static VGA_REGISTERS VideoMode_320x200_16color =
130 {
131 /* Miscellaneous Register */
132 0x63,
133
134 /* Sequencer Registers */
135 {0x00, 0x09, 0x0F, 0x00, 0x02},
136
137 /* CRTC Registers */
138 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
139 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xE3,
140 0xFF},
141
142 /* GC Registers */
143 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
144
145 /* AC Registers */
146 // {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 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}
150 };
151
152 static VGA_REGISTERS VideoMode_640x200_16color =
153 {
154 /* Miscellaneous Register */
155 0x63,
156
157 /* Sequencer Registers */
158 {0x00, 0x01, 0x0F, 0x00, 0x02},
159
160 /* CRTC Registers */
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,
163 0xFF},
164
165 /* GC Registers */
166 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
167
168 /* AC Registers */
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}
173 };
174
175 static VGA_REGISTERS VideoMode_640x350_16color =
176 {
177 /* Miscellaneous Register */
178 0xA3,
179
180 /* Sequencer Registers */
181 {0x00, 0x01, 0x0F, 0x00, 0x02},
182
183 /* CRTC Registers */
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,
186 0xFF},
187
188 /* GC Registers */
189 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
190
191 /* AC Registers */
192 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
193 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
194 };
195
196 static VGA_REGISTERS VideoMode_640x480_2color =
197 {
198 /* Miscellaneous Register */
199 0xE3,
200
201 /* Sequencer Registers */
202 {0x00, 0x01, 0x0F, 0x00, 0x02},
203
204 /* CRTC Registers */
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,
207 0xFF},
208
209 /* GC Registers */
210 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
211
212 /* AC Registers */
213 {0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
214 0x3F, 0x3F, 0x3F, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
215 };
216
217 static VGA_REGISTERS VideoMode_640x480_16color =
218 {
219 /* Miscellaneous Register */
220 0xE3,
221
222 /* Sequencer Registers */
223 {0x00, 0x01, 0x0F, 0x00, 0x02},
224
225 /* CRTC Registers */
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,
228 0xFF},
229
230 /* GC Registers */
231 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
232
233 /* AC Registers */
234 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
235 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
236 };
237
238 static VGA_REGISTERS VideoMode_320x200_256color =
239 {
240 /* Miscellaneous Register */
241 0x63,
242
243 /* Sequencer Registers */
244 {0x00, 0x01, 0x0F, 0x00, 0x0E},
245
246 /* CRTC Registers */
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,
249 0xFF},
250
251 /* GC Registers */
252 {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF},
253
254 /* AC Registers */
255 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
256 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00}
257 };
258
259 /* See http://wiki.osdev.org/Drawing_In_Protected_Mode#Locating_Video_Memory */
260 static PVGA_REGISTERS VideoModes[BIOS_MAX_VIDEO_MODE + 1] =
261 {
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
282 };
283
284 // FIXME: Are they computable with the previous data ??
285 // Values taken from DOSBox.
286 static WORD VideoModePageSize[BIOS_MAX_VIDEO_MODE + 1] =
287 {
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
293 };
294
295 /*
296 * BIOS Mode Palettes
297 *
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.
301 */
302
303 // This is the same as EgaPalette__HiRes
304 static CONST COLORREF TextPalette[VGA_MAX_COLORS / 4] =
305 {
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),
310
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),
315
316
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),
321
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)
326 };
327
328 // Unused at the moment
329 static CONST COLORREF mtext_palette[64] =
330 {
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),
339
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)
348 };
349
350 // Unused at the moment
351 static CONST COLORREF mtext_s3_palette[64] =
352 {
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),
361
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)
370 };
371
372 #if 0
373
374 // Unused at the moment
375 static CONST COLORREF CgaPalette[16] =
376 {
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)
381 };
382
383 /* CGA palette 1 */
384 static CONST BYTE CgaPalette1[] =
385 {
386 0x00, /* 0 - Black */
387 0x03, /* 1 - Cyan */
388 0x05, /* 2- Magenta */
389 0x07, /* 3 - White */
390 }
391
392 /* CGA palette 1 bright */
393 static CONST BYTE CgaPalette1i[] =
394 {
395 0x00, /* 0 - Black */
396 0x13, /* 1 - Light cyan */
397 0x15, /* 2 - Light magenta */
398 0x17, /* 3 - Bright White */
399 };
400
401 /* CGA palette 2 */
402 static CONST BYTE CgaPalette2[] =
403 {
404 0x00, /* 0 - Black */
405 0x02, /* 1 - Green */
406 0x04, /* 2 - Red */
407 0x06, /* 3 - Brown */
408 };
409
410 /* CGA palette 2 bright */
411 static CONST BYTE CgaPalette2i[] =
412 {
413 0x00, /* 0 - Black */
414 0x12, /* 1 - Light green */
415 0x14, /* 2 - Light red */
416 0x16, /* 3 - Yellow */
417 };
418
419 // Unused at the moment; same palette as EgaPalette__16Colors
420 static CONST COLORREF CgaPalette2[VGA_MAX_COLORS / 4] =
421 {
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),
426
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),
431
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),
436
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)
441 };
442
443 #endif
444
445 static CONST COLORREF EgaPalette__16Colors[VGA_MAX_COLORS / 4] =
446 {
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),
449
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),
452
453
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),
456
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),
459
460
461
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),
464
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),
467
468
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),
471
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)
474 };
475
476 // This is the same as TextPalette
477 static CONST COLORREF EgaPalette__HiRes[VGA_MAX_COLORS / 4] =
478 {
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),
483
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),
488
489
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),
494
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)
499 };
500
501 #define USE_REACTOS_COLORS
502 // #define USE_DOSBOX_COLORS
503
504 /*
505 * Same palette as the default one 'VgaDefaultPalette' in vga.c
506 */
507 #if defined(USE_REACTOS_COLORS)
508
509 // ReactOS colors
510 static CONST COLORREF VgaPalette[VGA_MAX_COLORS] =
511 {
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)
576 };
577
578 #elif defined(USE_DOSBOX_COLORS)
579
580 // DOSBox colors
581 static CONST COLORREF VgaPalette[VGA_MAX_COLORS] =
582 {
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),
599
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),
616
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),
633
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)
650 };
651
652 #endif
653
654 static CONST UCHAR Font8x8[VGA_FONT_CHARACTERS * 8] =
655 {
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
912 };
913
914 static CONST UCHAR Font8x14[VGA_FONT_CHARACTERS * 14] =
915 {
916 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
917 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
918 0x00, 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81,
919 0x81, 0xBD, 0x99, 0x81, 0x7E, 0x00, 0x00,
920 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xDB, 0xFF,
921 0xFF, 0xC3, 0xE7, 0xFF, 0x7E, 0x00, 0x00,
922 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE,
923 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00,
924 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C,
925 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00,
926 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0xE7,
927 0xE7, 0xE7, 0x18, 0x18, 0x3C, 0x00, 0x00,
928 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF,
929 0xFF, 0x7E, 0x18, 0x18, 0x3C, 0x00, 0x00,
930 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
931 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
932 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7,
933 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF,
934 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66,
935 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00,
936 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99,
937 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF,
938 0x00, 0x00, 0x00, 0x1E, 0x0E, 0x1A, 0x32,
939 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00,
940 0x00, 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66,
941 0x3C, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
942 0x00, 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30,
943 0x30, 0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00,
944 0x00, 0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63,
945 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00,
946 0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C,
947 0xE7, 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00,
948 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF8,
949 0xFE, 0xF8, 0xE0, 0xC0, 0x80, 0x00, 0x00,
950 0x00, 0x00, 0x00, 0x02, 0x06, 0x0E, 0x3E,
951 0xFE, 0x3E, 0x0E, 0x06, 0x02, 0x00, 0x00,
952 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
953 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
954 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
955 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00,
956 0x00, 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB,
957 0x7B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00,
958 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6,
959 0x6C, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00,
960 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE,
962 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
963 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00,
964 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
965 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
966 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
967 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
968 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C,
969 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00,
970 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60,
971 0xFE, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00,
972 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
973 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00,
974 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6C,
975 0xFE, 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00,
976 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
977 0x7C, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00,
978 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C,
979 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00,
980 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
981 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
982 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C,
983 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00,
984 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00,
985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
986 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C,
987 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00,
988 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0,
989 0x7C, 0x06, 0x86, 0xC6, 0x7C, 0x18, 0x18,
990 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6,
991 0x0C, 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00,
992 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
993 0x76, 0xDC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
994 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30,
995 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
996 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30,
997 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00,
998 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C,
999 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00,
1000 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C,
1001 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00,
1002 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1003 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1004 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1005 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
1006 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1007 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1009 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
1010 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
1011 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
1012 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1013 0xD6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00,
1014 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18,
1015 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00,
1016 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C,
1017 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00,
1018 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06,
1019 0x3C, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1020 0x00, 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C,
1021 0xCC, 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
1022 0x00, 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0,
1023 0xFC, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1024 0x00, 0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0,
1025 0xFC, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1026 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C,
1027 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00,
1028 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1029 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1030 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1031 0x7E, 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00,
1032 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1033 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
1034 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1035 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
1036 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60,
1037 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00,
1038 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1039 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1040 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C,
1041 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00,
1042 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C,
1043 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00,
1044 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE,
1045 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00,
1046 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6,
1047 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1048 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1049 0x7C, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00,
1050 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1051 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00,
1052 0x00, 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66,
1053 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00,
1054 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68,
1055 0x78, 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00,
1056 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68,
1057 0x78, 0x68, 0x60, 0x60, 0xF0, 0x00, 0x00,
1058 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1059 0xC0, 0xDE, 0xC6, 0x66, 0x3A, 0x00, 0x00,
1060 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1061 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1062 0x00, 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18,
1063 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1064 0x00, 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C,
1065 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1066 0x00, 0x00, 0x00, 0xE6, 0x66, 0x6C, 0x6C,
1067 0x78, 0x6C, 0x6C, 0x66, 0xE6, 0x00, 0x00,
1068 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60,
1069 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00,
1070 0x00, 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xD6,
1071 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1072 0x00, 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE,
1073 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1074 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1075 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1076 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1077 0x7C, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00,
1078 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1079 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x0E, 0x00,
1080 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1081 0x7C, 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00,
1082 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60,
1083 0x38, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1084 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x5A, 0x18,
1085 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1086 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1087 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1088 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1089 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00,
1090 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1091 0xD6, 0xD6, 0xFE, 0x6C, 0x6C, 0x00, 0x00,
1092 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7C,
1093 0x38, 0x7C, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1094 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1095 0x3C, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1096 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x8C, 0x18,
1097 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00,
1098 0x00, 0x00, 0x00, 0x3C, 0x30, 0x30, 0x30,
1099 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00,
1100 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70,
1101 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00,
1102 0x00, 0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C,
1103 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x00,
1104 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1107 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1108 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
1111 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1112 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x78,
1113 0x6C, 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00,
1114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1115 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1116 0x00, 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C,
1117 0x6C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1119 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1120 0x00, 0x00, 0x00, 0x1C, 0x36, 0x32, 0x30,
1121 0x7C, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00,
1122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1123 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x78,
1124 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C,
1125 0x76, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00,
1126 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x38,
1127 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1128 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E,
1129 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C,
1130 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66,
1131 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00,
1132 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18,
1133 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC,
1135 0xFE, 0xD6, 0xD6, 0xD6, 0xD6, 0x00, 0x00,
1136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1137 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00,
1138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1139 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1141 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xF0,
1142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1143 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
1144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1145 0x76, 0x66, 0x60, 0x60, 0xF0, 0x00, 0x00,
1146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1147 0xC6, 0x70, 0x1C, 0xC6, 0x7C, 0x00, 0x00,
1148 0x00, 0x00, 0x00, 0x10, 0x30, 0x30, 0xFC,
1149 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00,
1150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC,
1151 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1153 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00,
1154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1155 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00,
1156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1157 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00,
1158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1159 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
1160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1161 0xCC, 0x18, 0x30, 0x66, 0xFE, 0x00, 0x00,
1162 0x00, 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18,
1163 0x70, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00,
1164 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1165 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
1166 0x00, 0x00, 0x00, 0x70, 0x18, 0x18, 0x18,
1167 0x0E, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00,
1168 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1171 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00, 0x00,
1172 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1173 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x18, 0x70,
1174 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0xCC,
1175 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1176 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x7C,
1177 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1178 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x78,
1179 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1180 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x78,
1181 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1182 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 0x78,
1183 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1184 0x00, 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78,
1185 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1187 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x18, 0x70,
1188 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C,
1189 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1190 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x7C,
1191 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1192 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C,
1193 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1194 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x38,
1195 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1196 0x00, 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38,
1197 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1198 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x38,
1199 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1200 0x00, 0xC6, 0x00, 0x10, 0x38, 0x6C, 0xC6,
1201 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1202 0x38, 0x6C, 0x38, 0x10, 0x38, 0x6C, 0xC6,
1203 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1204 0x0C, 0x18, 0x00, 0xFE, 0x66, 0x62, 0x68,
1205 0x78, 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00,
1206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC,
1207 0x36, 0x76, 0xDC, 0xD8, 0x6E, 0x00, 0x00,
1208 0x00, 0x00, 0x00, 0x3E, 0x6C, 0xCC, 0xCC,
1209 0xFE, 0xCC, 0xCC, 0xCC, 0xCE, 0x00, 0x00,
1210 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C,
1211 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1212 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x7C,
1213 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1214 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C,
1215 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1216 0x00, 0x00, 0x30, 0x78, 0xCC, 0x00, 0xCC,
1217 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1218 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 0xCC,
1219 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1220 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0xC6,
1221 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
1222 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1223 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1224 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1225 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1226 0x00, 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6,
1227 0xC0, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
1228 0x00, 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60,
1229 0xF0, 0x60, 0x60, 0x66, 0xFC, 0x00, 0x00,
1230 0x00, 0x00, 0x00, 0x66, 0x66, 0x3C, 0x18,
1231 0x7E, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
1232 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x7C,
1233 0x62, 0x66, 0x6F, 0x66, 0xF3, 0x00, 0x00,
1234 0x00, 0x00, 0x00, 0x0E, 0x1B, 0x18, 0x18,
1235 0x7E, 0x18, 0x18, 0xD8, 0x70, 0x00, 0x00,
1236 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78,
1237 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1238 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x38,
1239 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1240 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x7C,
1241 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1242 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0xCC,
1243 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1244 0x00, 0x00, 0x00, 0x76, 0xDC, 0x00, 0xDC,
1245 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00,
1246 0x76, 0xDC, 0x00, 0xC6, 0xE6, 0xF6, 0xFE,
1247 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1248 0x00, 0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x36,
1249 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1250 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
1251 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
1252 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30,
1253 0x30, 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1255 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
1256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1257 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00,
1258 0x00, 0x60, 0xE0, 0x63, 0x66, 0x6C, 0x18,
1259 0x30, 0x6E, 0xC3, 0x06, 0x0C, 0x1F, 0x00,
1260 0x00, 0x60, 0xE0, 0x63, 0x66, 0x6C, 0x18,
1261 0x36, 0x6E, 0xDA, 0x3F, 0x06, 0x06, 0x00,
1262 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18,
1263 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00,
1264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1265 0x36, 0x6C, 0xD8, 0x6C, 0x36, 0x00, 0x00,
1266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1267 0xD8, 0x6C, 0x36, 0x6C, 0xD8, 0x00, 0x00,
1268 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11,
1269 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1270 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1271 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
1272 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD,
1273 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1274 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1275 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1276 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1277 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1278 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18,
1279 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1280 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1281 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1283 0xFE, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1284 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18,
1285 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1286 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06,
1287 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1288 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1289 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1290 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06,
1291 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1292 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06,
1293 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1294 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1295 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1296 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18,
1297 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1299 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1300 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1301 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1302 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1303 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1305 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1306 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1307 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1309 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1310 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1311 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1312 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18,
1313 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1314 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1315 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1316 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30,
1317 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1318 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30,
1319 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1320 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00,
1321 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1322 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1323 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1324 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30,
1325 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1326 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1327 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1328 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00,
1329 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1330 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00,
1331 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1332 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1333 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1334 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1335 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1337 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1338 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1339 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1340 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18,
1341 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1342 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18,
1343 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1345 0x3F, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1346 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1347 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1348 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18,
1349 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1350 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1351 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1353 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1354 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1355 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1357 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1358 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1359 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1360 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1361 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1362 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1365 0xDC, 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00,
1366 0x00, 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8,
1367 0xCC, 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00,
1368 0x00, 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC0,
1369 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00,
1370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1371 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00,
1372 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x60, 0x30,
1373 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00,
1374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1375 0xD8, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00,
1376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66,
1377 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
1378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1379 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
1380 0x00, 0x00, 0x00, 0x7E, 0x18, 0x3C, 0x66,
1381 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00,
1382 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1383 0xFE, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00,
1384 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1385 0xC6, 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00,
1386 0x00, 0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C,
1387 0x3E, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00,
1388 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB,
1389 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1390 0x00, 0x00, 0x00, 0x03, 0x06, 0x7E, 0xDB,
1391 0xDB, 0xF3, 0x7E, 0x60, 0xC0, 0x00, 0x00,
1392 0x00, 0x00, 0x00, 0x1E, 0x30, 0x60, 0x60,
1393 0x7E, 0x60, 0x60, 0x30, 0x1E, 0x00, 0x00,
1394 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1395 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
1396 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
1397 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
1398 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1399 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
1400 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06,
1401 0x0C, 0x18, 0x30, 0x00, 0x7E, 0x00, 0x00,
1402 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60,
1403 0x30, 0x18, 0x0C, 0x00, 0x7E, 0x00, 0x00,
1404 0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18,
1405 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1406 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1407 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00,
1408 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
1409 0x7E, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
1410 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1411 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1412 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
1413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1415 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1417 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1418 0x00, 0x00, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C,
1419 0x0C, 0xEC, 0x6C, 0x3C, 0x1C, 0x00, 0x00,
1420 0x00, 0x00, 0x00, 0x6C, 0x36, 0x36, 0x36,
1421 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
1422 0x00, 0x00, 0x00, 0x3C, 0x66, 0x0C, 0x18,
1423 0x32, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1424 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E,
1425 0x7E, 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00,
1426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1428 };
1429
1430 static CONST UCHAR Font8x16[VGA_FONT_CHARACTERS * 16] =
1431 {
1432 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1433 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1434 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD,
1435 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00,
1436 0x00, 0x00, 0x7C, 0xFE, 0xFE, 0xD6, 0xFE, 0xFE,
1437 0xBA, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00,
1438 0x00, 0x00, 0x00, 0x6C, 0xEE, 0xFE, 0xFE, 0xFE,
1439 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1440 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C,
1441 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1442 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x10, 0x6C,
1443 0xEE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
1444 0x00, 0x00, 0x10, 0x38, 0x7C, 0x7C, 0xFE, 0xFE,
1445 0xFE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
1446 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C,
1447 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1448 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3,
1449 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1450 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x66, 0x66,
1451 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1452 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0x99, 0x99,
1453 0x99, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1454 0x00, 0x00, 0x1E, 0x0E, 0x1E, 0x36, 0x78, 0xCC,
1455 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1456 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18,
1457 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1458 0x00, 0x00, 0x1E, 0x1A, 0x1E, 0x18, 0x18, 0x18,
1459 0x18, 0x78, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00,
1460 0x00, 0x00, 0x3E, 0x36, 0x3E, 0x36, 0x36, 0x76,
1461 0xF6, 0x66, 0x0E, 0x1E, 0x0C, 0x00, 0x00, 0x00,
1462 0x00, 0x00, 0x18, 0xDB, 0x7E, 0x3C, 0x66, 0x66,
1463 0x3C, 0x7E, 0xDB, 0x18, 0x00, 0x00, 0x00, 0x00,
1464 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xFE,
1465 0xFC, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00,
1466 0x00, 0x00, 0x00, 0x02, 0x0E, 0x3E, 0x7E, 0xFE,
1467 0x7E, 0x3E, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00,
1468 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1469 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1470 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
1471 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1472 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0xDB, 0x7B,
1473 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00,
1474 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x7C, 0xF6,
1475 0xDE, 0x7C, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1476 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1477 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00,
1478 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1479 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1480 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1481 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1482 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1483 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1484 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0xFF,
1485 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1486 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xFE,
1487 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1488 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
1489 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1490 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF,
1491 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1492 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x7C,
1493 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1494 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x7C,
1495 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1496 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1497 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1498 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x3C, 0x18,
1499 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1500 0x00, 0x36, 0x36, 0x36, 0x36, 0x14, 0x00, 0x00,
1501 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1502 0x00, 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C,
1503 0xFE, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1504 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0x78,
1505 0x3C, 0x06, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
1506 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x66, 0x0C,
1507 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00, 0x00, 0x00,
1508 0x00, 0x00, 0x38, 0x6C, 0x38, 0x30, 0x76, 0x7E,
1509 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1510 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1511 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1512 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30,
1513 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1514 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C,
1515 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1516 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x38, 0xFE,
1517 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1518 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E,
1519 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1520 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1521 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1522 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1523 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1524 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1525 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1526 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
1527 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
1528 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xCE, 0xDE, 0xF6,
1529 0xE6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1530 0x00, 0x00, 0x18, 0x78, 0x18, 0x18, 0x18, 0x18,
1531 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1532 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x06, 0x0C, 0x18,
1533 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1534 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06,
1535 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1536 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xCC,
1537 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00,
1538 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06,
1539 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1540 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xFC, 0xC6,
1541 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1542 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C, 0x18, 0x30,
1543 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
1544 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6,
1545 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1546 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E,
1547 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1548 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1549 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1550 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1551 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1552 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0xC0,
1553 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1554 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
1555 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1556 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06,
1557 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
1558 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18,
1559 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1560 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xDE, 0xDE,
1561 0xDE, 0xDC, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00,
1562 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE,
1563 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1564 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66,
1565 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1566 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0,
1567 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1568 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66,
1569 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,
1570 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1571 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1572 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1573 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1574 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0,
1575 0xCE, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1576 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6,
1577 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1578 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1579 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1580 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1581 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1582 0x00, 0x00, 0xC6, 0xC6, 0xCC, 0xD8, 0xF0, 0xF0,
1583 0xD8, 0xCC, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1584 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60,
1585 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1586 0x00, 0x00, 0xC6, 0xC6, 0xEE, 0xEE, 0xFE, 0xD6,
1587 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1588 0x00, 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xF6, 0xDE,
1589 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1590 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1591 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1592 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x66, 0x7C,
1593 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1594 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1595 0xC6, 0xD6, 0xD6, 0x7C, 0x06, 0x00, 0x00, 0x00,
1596 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x78,
1597 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1598 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0x70, 0x1C,
1599 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1600 0x00, 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18,
1601 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1602 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1603 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1604 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1605 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1606 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6,
1607 0xFE, 0xEE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1608 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x38,
1609 0x6C, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1610 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C,
1611 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1612 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30,
1613 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1614 0x00, 0x00, 0x7C, 0x60, 0x60, 0x60, 0x60, 0x60,
1615 0x60, 0x60, 0x60, 0x7C, 0x00, 0x00, 0x00, 0x00,
1616 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30,
1617 0x18, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1618 0x00, 0x00, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
1619 0x0C, 0x0C, 0x0C, 0x7C, 0x00, 0x00, 0x00, 0x00,
1620 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00,
1621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1622 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1623 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
1624 0x00, 0x18, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x00,
1625 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1626 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1627 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1628 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1629 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1630 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1631 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1632 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC,
1633 0xCC, 0xCC, 0xCC, 0x7E, 0x00, 0x00, 0x00, 0x00,
1634 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1635 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1636 0x00, 0x00, 0x1C, 0x36, 0x30, 0x30, 0xFC, 0x30,
1637 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00,
1638 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCE, 0xC6,
1639 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1640 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1641 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1642 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18,
1643 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1644 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x0C,
1645 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1646 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x66, 0x6C,
1647 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1648 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1649 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00,
1650 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xD6,
1651 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1652 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1653 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1654 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1655 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1656 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1657 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x00,
1658 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC,
1659 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
1660 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x60,
1661 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1662 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1663 0x7C, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1664 0x00, 0x00, 0x30, 0x30, 0x30, 0xFC, 0x30, 0x30,
1665 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,
1666 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC,
1667 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1668 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1669 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1670 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6,
1671 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00,
1672 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x6C,
1673 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1674 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1675 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1676 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x86, 0x0C,
1677 0x18, 0x30, 0x62, 0xFE, 0x00, 0x00, 0x00, 0x00,
1678 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18,
1679 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00,
1680 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
1681 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1682 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18,
1683 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
1684 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1685 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1686 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
1687 0x6C, 0x6C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1688 0x00, 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0xC6,
1689 0x66, 0x3C, 0x18, 0x0C, 0xCC, 0x38, 0x00, 0x00,
1690 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1691 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1692 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1693 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1694 0x00, 0x30, 0x78, 0xCC, 0x00, 0x78, 0x0C, 0x7C,
1695 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1696 0x00, 0x00, 0xCC, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1697 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1698 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C,
1699 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1700 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78, 0x0C, 0x7C,
1701 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1702 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0,
1703 0xC6, 0x7C, 0x18, 0x0C, 0x6C, 0x38, 0x00, 0x00,
1704 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1705 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1706 0x00, 0x00, 0xCC, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1707 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1708 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1709 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1710 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
1711 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1712 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18,
1713 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1714 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18,
1715 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1716 0x00, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6,
1717 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1718 0x38, 0x6C, 0x38, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1719 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1720 0x0C, 0x18, 0x30, 0x00, 0xFE, 0x60, 0x60, 0x7C,
1721 0x60, 0x60, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00,
1722 0x00, 0x00, 0x00, 0x00, 0x66, 0xDB, 0x1B, 0x7F,
1723 0xD8, 0xD8, 0xDF, 0x76, 0x00, 0x00, 0x00, 0x00,
1724 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xD8, 0xFE,
1725 0xD8, 0xD8, 0xD8, 0xDE, 0x00, 0x00, 0x00, 0x00,
1726 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1727 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1728 0x00, 0x00, 0xC6, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1729 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1730 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1731 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1732 0x00, 0x30, 0x78, 0xCC, 0x00, 0xC6, 0xC6, 0xC6,
1733 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1734 0x00, 0x60, 0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6,
1735 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1736 0x00, 0x18, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18,
1737 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1738 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6,
1739 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1740 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1741 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1742 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0xC0,
1743 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1744 0x00, 0x38, 0x6C, 0x60, 0x60, 0xF0, 0x60, 0x60,
1745 0x60, 0x66, 0xF6, 0x6C, 0x00, 0x00, 0x00, 0x00,
1746 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E,
1747 0x18, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1748 0x00, 0x00, 0x3E, 0x63, 0x63, 0x30, 0x1C, 0x06,
1749 0x63, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1750 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x63, 0x38,
1751 0x0E, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1752 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78, 0x0C, 0x7C,
1753 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1754 0x00, 0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18,
1755 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1756 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1757 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1758 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC,
1759 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1760 0x00, 0x00, 0x76, 0xDC, 0x00, 0xBC, 0x66, 0x66,
1761 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1762 0x00, 0x76, 0xDC, 0x00, 0xC6, 0xC6, 0xE6, 0xF6,
1763 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1764 0x00, 0x21, 0x1E, 0x00, 0x1E, 0x33, 0x60, 0x60,
1765 0x67, 0x63, 0x33, 0x1D, 0x00, 0x00, 0x00, 0x00,
1766 0x00, 0x42, 0x3C, 0x00, 0x3B, 0x66, 0x66, 0x66,
1767 0x3E, 0x06, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1768 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30,
1769 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1770 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1771 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
1772 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1773 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
1774 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x30,
1775 0x60, 0xDC, 0x36, 0x0C, 0x18, 0x3E, 0x00, 0x00,
1776 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x36,
1777 0x6E, 0xDE, 0x36, 0x7E, 0x06, 0x06, 0x00, 0x00,
1778 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x3C,
1779 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1780 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6C, 0xD8,
1781 0x6C, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1782 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x6C, 0x36,
1783 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1784 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1785 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1786 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1787 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1788 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1789 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1790 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1791 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1792 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1793 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1794 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1795 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1796 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6,
1797 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1799 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1800 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8,
1801 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1802 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xF6,
1803 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1804 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1805 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1806 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6,
1807 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1808 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xFE,
1809 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1810 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE,
1811 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1812 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1813 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1814 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
1815 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1816 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1818 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1819 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1821 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1822 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1823 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1824 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1825 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1826 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1827 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1828 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1829 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1830 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
1831 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1832 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3F,
1833 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1834 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37,
1835 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1836 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF,
1837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1838 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7,
1839 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1840 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37,
1841 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1842 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1843 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1844 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7,
1845 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1846 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF,
1847 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1848 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1849 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1850 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1851 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1852 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1853 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1854 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F,
1855 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1856 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1857 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1858 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F,
1859 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1860 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
1861 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1862 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1863 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1864 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF,
1865 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1866 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1867 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1868 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
1869 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1870 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1871 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1872 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1873 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1874 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1875 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1876 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1877 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1878 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1879 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1880 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0xD8, 0xD8,
1881 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1882 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8, 0xFC, 0xC6,
1883 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00, 0x00, 0x00,
1884 0x00, 0x00, 0xFE, 0x66, 0x62, 0x60, 0x60, 0x60,
1885 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00,
1886 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x6C, 0x6C,
1887 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1888 0x00, 0x00, 0xFE, 0xC6, 0x62, 0x30, 0x18, 0x18,
1889 0x30, 0x62, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1890 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xCC,
1891 0xCC, 0xCC, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1892 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1893 0x66, 0x7C, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
1894 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18,
1895 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1896 0x00, 0x00, 0xFE, 0x38, 0x38, 0x6C, 0xC6, 0xC6,
1897 0x6C, 0x38, 0x38, 0xFE, 0x00, 0x00, 0x00, 0x00,
1898 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE,
1899 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
1900 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6,
1901 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00, 0x00, 0x00,
1902 0x00, 0x00, 0x3E, 0x60, 0x60, 0x3C, 0x66, 0xC6,
1903 0xC6, 0xC6, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1904 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB,
1905 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1906 0x00, 0x00, 0x02, 0x06, 0x7C, 0xCE, 0xDE, 0xF6,
1907 0xF6, 0x7C, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00,
1908 0x00, 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C,
1909 0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00,
1910 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1911 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1912 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE,
1913 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1914 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1915 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1916 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18,
1917 0x30, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1918 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18,
1919 0x0C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1920 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1E, 0x1A, 0x18,
1921 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1922 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1923 0x18, 0x18, 0x58, 0x78, 0x30, 0x00, 0x00, 0x00,
1924 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E,
1925 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1926 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1927 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1928 0x00, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1929 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1930 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1931 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1932 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1933 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1934 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18,
1935 0xD8, 0xD8, 0x78, 0x38, 0x18, 0x00, 0x00, 0x00,
1936 0x00, 0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
1937 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1938 0x00, 0x00, 0x70, 0xD8, 0x18, 0x30, 0x60, 0xF8,
1939 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1940 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E,
1941 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1942 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1943 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1944 };
1945
1946 /* PRIVATE FUNCTIONS **********************************************************/
1947
1948 static VOID VidBiosReadWindow(LPWORD Buffer, SMALL_RECT Rectangle, BYTE Page)
1949 {
1950 INT i, j;
1951 INT Counter = 0;
1952 WORD Character;
1953 DWORD VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Page * Bda->VideoPageSize);
1954
1955 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
1956 {
1957 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
1958 {
1959 /* Read from video memory */
1960 EmulatorReadMemory(&EmulatorContext,
1961 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
1962 (LPVOID)&Character,
1963 sizeof(WORD));
1964
1965 /* Write the data to the buffer in row order */
1966 Buffer[Counter++] = Character;
1967 }
1968 }
1969 }
1970
1971 static VOID VidBiosWriteWindow(LPWORD Buffer, SMALL_RECT Rectangle, BYTE Page)
1972 {
1973 INT i, j;
1974 INT Counter = 0;
1975 WORD Character;
1976 DWORD VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Page * Bda->VideoPageSize);
1977
1978 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
1979 {
1980 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
1981 {
1982 Character = Buffer[Counter++];
1983
1984 /* Write to video memory */
1985 EmulatorWriteMemory(&EmulatorContext,
1986 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
1987 (LPVOID)&Character,
1988 sizeof(WORD));
1989 }
1990 }
1991 }
1992
1993 static BOOLEAN VidBiosScrollWindow(INT Direction,
1994 DWORD Amount,
1995 SMALL_RECT Rectangle,
1996 BYTE Page,
1997 BYTE FillAttribute)
1998 {
1999 DWORD i;
2000 LPWORD WindowData;
2001 WORD WindowWidth = Rectangle.Right - Rectangle.Left + 1;
2002 WORD WindowHeight = Rectangle.Bottom - Rectangle.Top + 1;
2003 DWORD WindowSize = WindowWidth * WindowHeight;
2004
2005 /* Allocate a buffer for the window */
2006 WindowData = (LPWORD)HeapAlloc(GetProcessHeap(),
2007 HEAP_ZERO_MEMORY,
2008 WindowSize * sizeof(WORD));
2009 if (WindowData == NULL) return FALSE;
2010
2011 /* Read the window data */
2012 VidBiosReadWindow(WindowData, Rectangle, Page);
2013
2014 if ((Amount == 0)
2015 || (((Direction == SCROLL_DIRECTION_UP)
2016 || (Direction == SCROLL_DIRECTION_DOWN))
2017 && (Amount >= WindowHeight))
2018 || (((Direction == SCROLL_DIRECTION_LEFT)
2019 || (Direction == SCROLL_DIRECTION_RIGHT))
2020 && (Amount >= WindowWidth)))
2021 {
2022 /* Fill the window */
2023 for (i = 0; i < WindowSize; i++)
2024 {
2025 WindowData[i] = MAKEWORD(' ', FillAttribute);
2026 }
2027
2028 goto Done;
2029 }
2030
2031 switch (Direction)
2032 {
2033 case SCROLL_DIRECTION_UP:
2034 {
2035 RtlMoveMemory(WindowData,
2036 &WindowData[WindowWidth * Amount],
2037 (WindowSize - WindowWidth * Amount) * sizeof(WORD));
2038
2039 for (i = 0; i < Amount * WindowWidth; i++)
2040 {
2041 WindowData[WindowSize - i - 1] = MAKEWORD(' ', FillAttribute);
2042 }
2043
2044 break;
2045 }
2046
2047 case SCROLL_DIRECTION_DOWN:
2048 {
2049 RtlMoveMemory(&WindowData[WindowWidth * Amount],
2050 WindowData,
2051 (WindowSize - WindowWidth * Amount) * sizeof(WORD));
2052
2053 for (i = 0; i < Amount * WindowWidth; i++)
2054 {
2055 WindowData[i] = MAKEWORD(' ', FillAttribute);
2056 }
2057
2058 break;
2059 }
2060
2061 default:
2062 {
2063 // TODO: NOT IMPLEMENTED!
2064 UNIMPLEMENTED;
2065 }
2066 }
2067
2068 Done:
2069 /* Write back the window data */
2070 VidBiosWriteWindow(WindowData, Rectangle, Page);
2071
2072 /* Free the window buffer */
2073 HeapFree(GetProcessHeap(), 0, WindowData);
2074
2075 return TRUE;
2076 }
2077
2078 static __inline VOID VgaSetSinglePaletteRegister(BYTE Index, BYTE Value)
2079 {
2080 /* Write the index */
2081 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2082 IOWriteB(VGA_AC_INDEX, Index);
2083
2084 /* Write the data */
2085 IOWriteB(VGA_AC_WRITE, Value);
2086 }
2087
2088 static BOOLEAN VgaSetRegisters(PVGA_REGISTERS Registers)
2089 {
2090 INT i;
2091
2092 if (Registers == NULL) return FALSE;
2093
2094 /* Disable interrupts */
2095 setIF(0);
2096
2097 /*
2098 * Set the CRT base address according to the selected mode,
2099 * monochrome or color. The following macros:
2100 * VGA_INSTAT1_READ, VGA_CRTC_INDEX and VGA_CRTC_DATA are then
2101 * used to access the correct VGA I/O ports.
2102 */
2103 Bda->CrtBasePort = (Registers->Misc & 0x01) ? VGA_CRTC_INDEX_COLOR
2104 : VGA_CRTC_INDEX_MONO;
2105
2106 /* Write the misc register */
2107 IOWriteB(VGA_MISC_WRITE, Registers->Misc);
2108
2109 /* Synchronous reset on */
2110 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_RESET_REG);
2111 IOWriteB(VGA_SEQ_DATA , VGA_SEQ_RESET_AR);
2112
2113 /* Write the sequencer registers */
2114 for (i = 1; i < VGA_SEQ_MAX_REG; i++)
2115 {
2116 IOWriteB(VGA_SEQ_INDEX, i);
2117 IOWriteB(VGA_SEQ_DATA, Registers->Sequencer[i]);
2118 }
2119
2120 /* Synchronous reset off */
2121 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_RESET_REG);
2122 IOWriteB(VGA_SEQ_DATA , VGA_SEQ_RESET_SR | VGA_SEQ_RESET_AR);
2123
2124 /* Unlock CRTC registers 0-7 */
2125 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_END_HORZ_BLANKING_REG);
2126 IOWriteB(VGA_CRTC_DATA, IOReadB(VGA_CRTC_DATA) | 0x80);
2127 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_VERT_RETRACE_END_REG);
2128 IOWriteB(VGA_CRTC_DATA, IOReadB(VGA_CRTC_DATA) & ~0x80);
2129 // Make sure they remain unlocked
2130 Registers->CRT[VGA_CRTC_END_HORZ_BLANKING_REG] |= 0x80;
2131 Registers->CRT[VGA_CRTC_VERT_RETRACE_END_REG] &= ~0x80;
2132
2133 /* Write the CRTC registers */
2134 for (i = 0; i < VGA_CRTC_MAX_REG; i++)
2135 {
2136 IOWriteB(VGA_CRTC_INDEX, i);
2137 IOWriteB(VGA_CRTC_DATA, Registers->CRT[i]);
2138 }
2139
2140 /* Write the GC registers */
2141 for (i = 0; i < VGA_GC_MAX_REG; i++)
2142 {
2143 IOWriteB(VGA_GC_INDEX, i);
2144 IOWriteB(VGA_GC_DATA, Registers->Graphics[i]);
2145 }
2146
2147 /* Write the AC registers */
2148 // DbgPrint("\n");
2149 for (i = 0; i < VGA_AC_MAX_REG; i++)
2150 {
2151 VgaSetSinglePaletteRegister(i, Registers->Attribute[i]);
2152 // DbgPrint("Registers->Attribute[%d] = %d\n", i, Registers->Attribute[i]);
2153 }
2154 // DbgPrint("\n");
2155
2156 /* Set the PEL mask */
2157 IOWriteB(VGA_DAC_MASK, 0xFF);
2158
2159 /* Enable screen and disable palette access */
2160 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2161 IOWriteB(VGA_AC_INDEX, 0x20);
2162
2163 /* Enable interrupts */
2164 setIF(1);
2165
2166 return TRUE;
2167 }
2168
2169 static VOID VgaSetPalette(const COLORREF* Palette, ULONG Size)
2170 {
2171 ULONG i;
2172
2173 // /* Disable screen and enable palette access */
2174 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2175 // IOWriteB(VGA_AC_INDEX, 0x00);
2176
2177 for (i = 0; i < Size; i++)
2178 {
2179 IOWriteB(VGA_DAC_WRITE_INDEX, i);
2180 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetRValue(Palette[i])));
2181 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetGValue(Palette[i])));
2182 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetBValue(Palette[i])));
2183 }
2184
2185 /* The following step might be optional */
2186 for (i = Size; i < VGA_MAX_COLORS; i++)
2187 {
2188 IOWriteB(VGA_DAC_WRITE_INDEX, i);
2189 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
2190 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
2191 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
2192 }
2193
2194 /* Enable screen and disable palette access */
2195 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2196 // IOWriteB(VGA_AC_INDEX, 0x20);
2197 }
2198
2199 static VOID VgaChangePalette(BYTE ModeNumber)
2200 {
2201 const COLORREF* Palette;
2202 ULONG Size;
2203
2204 if (ModeNumber >= 0x13)
2205 {
2206 /* VGA modes */
2207 Palette = VgaPalette;
2208 Size = sizeof(VgaPalette)/sizeof(VgaPalette[0]);
2209 }
2210 else if (ModeNumber == 0x10) // || (ModeNumber == 0x0D) || (ModeNumber == 0x0E)
2211 {
2212 /* EGA HiRes mode */
2213 Palette = EgaPalette__HiRes;
2214 Size = sizeof(EgaPalette__HiRes)/sizeof(EgaPalette__HiRes[0]);
2215 }
2216 #if 0
2217 else if ((ModeNumber == 0x04) || (ModeNumber == 0x05))
2218 {
2219 /*
2220 * CGA modes; this palette contains both normal and
2221 * bright versions of CGA palettes 0 and 1
2222 */
2223 Palette = CgaPalette2;
2224 Size = sizeof(CgaPalette2)/sizeof(CgaPalette2[0]);
2225 }
2226 #endif
2227 else // if ((ModeNumber == 0x0D) || (ModeNumber == 0x0E))
2228 {
2229 /* EGA modes */
2230 Palette = EgaPalette__16Colors;
2231 Size = sizeof(EgaPalette__16Colors)/sizeof(EgaPalette__16Colors[0]);
2232 }
2233
2234 VgaSetPalette(Palette, Size);
2235 }
2236
2237 static VOID VidBiosGetCursorPosition(PBYTE Row, PBYTE Column, BYTE Page)
2238 {
2239 /* Make sure the selected video page is valid */
2240 if (Page >= BIOS_MAX_PAGES) return;
2241
2242 /* Get the cursor location */
2243 *Row = HIBYTE(Bda->CursorPosition[Page]);
2244 *Column = LOBYTE(Bda->CursorPosition[Page]);
2245 }
2246
2247 static VOID VidBiosSetCursorPosition(BYTE Row, BYTE Column, BYTE Page)
2248 {
2249 /* Make sure the selected video page is valid */
2250 if (Page >= BIOS_MAX_PAGES) return;
2251
2252 /* Update the position in the BDA */
2253 Bda->CursorPosition[Page] = MAKEWORD(Column, Row);
2254
2255 /* Check if this is the current video page */
2256 if (Page == Bda->VideoPage)
2257 {
2258 WORD Offset = Row * Bda->ScreenColumns + Column;
2259
2260 /* Modify the CRTC registers */
2261 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_LOW_REG);
2262 IOWriteB(VGA_CRTC_DATA , LOBYTE(Offset));
2263 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_HIGH_REG);
2264 IOWriteB(VGA_CRTC_DATA , HIBYTE(Offset));
2265 }
2266 }
2267
2268 VOID VidBiosSyncCursorPosition(VOID)
2269 {
2270 BYTE Row, Column;
2271 BYTE Low, High;
2272 SHORT ScreenColumns = VgaGetDisplayResolution().X;
2273 WORD Offset;
2274
2275 /* Get the cursor location */
2276 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_LOW_REG);
2277 Low = IOReadB(VGA_CRTC_DATA);
2278 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_HIGH_REG);
2279 High = IOReadB(VGA_CRTC_DATA);
2280
2281 Offset = MAKEWORD(Low, High);
2282
2283 Row = (BYTE)(Offset / ScreenColumns);
2284 Column = (BYTE)(Offset % ScreenColumns);
2285
2286 /* Synchronize our cursor position with VGA */
2287 VidBiosSetCursorPosition(Row, Column, Bda->VideoPage);
2288 }
2289
2290 BYTE VidBiosGetVideoMode(VOID)
2291 {
2292 return Bda->VideoMode;
2293 }
2294
2295 static BOOLEAN VidBiosSetVideoMode(BYTE ModeNumber)
2296 {
2297 BYTE Page;
2298 COORD Resolution;
2299 PVGA_REGISTERS VgaMode;
2300
2301 /*
2302 * IBM standard modes do not clear the screen if the
2303 * high bit of AL is set (EGA or higher only).
2304 * See Ralf Brown: http://www.ctyme.com/intr/rb-0069.htm
2305 * for more information.
2306 */
2307 BOOLEAN DoNotClear = !!(ModeNumber & 0x80);
2308
2309 /* Retrieve the real mode number and check its validity */
2310 ModeNumber &= 0x7F;
2311 // if (ModeNumber >= sizeof(VideoModes)/sizeof(VideoModes[0]))
2312 if (ModeNumber > BIOS_MAX_VIDEO_MODE)
2313 {
2314 DPRINT1("VidBiosSetVideoMode -- Mode %02Xh invalid\n", ModeNumber);
2315 return FALSE;
2316 }
2317
2318 /* Check if this is the current mode */
2319 if (ModeNumber == Bda->VideoMode)
2320 {
2321 /* Just clear the VGA memory if needed */
2322 if (!DoNotClear) VgaClearMemory();
2323 return TRUE;
2324 }
2325
2326 VgaMode = VideoModes[ModeNumber];
2327
2328 DPRINT1("Switching to mode %02Xh %s clearing the screen; VgaMode = 0x%p\n",
2329 ModeNumber, (DoNotClear ? "without" : "and"), VgaMode);
2330
2331 if (!VgaSetRegisters(VgaMode)) return FALSE;
2332
2333 VgaChangePalette(ModeNumber);
2334
2335 /* Clear the VGA memory if needed */
2336 if (!DoNotClear) VgaClearMemory();
2337
2338 // Bda->CrtModeControl;
2339 // Bda->CrtColorPaletteMask;
2340 // Bda->EGAFlags;
2341 // Bda->VGAFlags;
2342
2343 /* Update the values in the BDA */
2344 Bda->VideoMode = ModeNumber;
2345 Bda->VideoPageSize = VideoModePageSize[ModeNumber];
2346 Bda->VideoPage = 0;
2347 Bda->VideoPageOffset = Bda->VideoPage * Bda->VideoPageSize;
2348
2349 /* Set the start address in the CRTC */
2350 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG);
2351 IOWriteB(VGA_CRTC_DATA , LOBYTE(Bda->VideoPageOffset));
2352 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_HIGH_REG);
2353 IOWriteB(VGA_CRTC_DATA , HIBYTE(Bda->VideoPageOffset));
2354
2355 /* Update the character height */
2356 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_MAX_SCAN_LINE_REG);
2357 Bda->CharacterHeight = 1 + (IOReadB(VGA_CRTC_DATA) & 0x1F);
2358
2359 /* Update the screen size */
2360 Resolution = VgaGetDisplayResolution();
2361 Bda->ScreenColumns = Resolution.X;
2362 Bda->ScreenRows = Resolution.Y - 1;
2363
2364 /* Set the cursor position for each page */
2365 for (Page = 0; Page < BIOS_MAX_PAGES; ++Page)
2366 VidBiosSetCursorPosition(0, 0, Page);
2367
2368 /* Refresh display */
2369 VgaRefreshDisplay();
2370
2371 return TRUE;
2372 }
2373
2374 static BOOLEAN VidBiosSetVideoPage(BYTE PageNumber)
2375 {
2376 BYTE Row, Column;
2377
2378 /* Check if the page exists */
2379 if (PageNumber >= BIOS_MAX_PAGES) return FALSE;
2380
2381 /* Check if this is the same page */
2382 if (PageNumber == Bda->VideoPage) return TRUE;
2383
2384 /* Update the values in the BDA */
2385 Bda->VideoPage = PageNumber;
2386 Bda->VideoPageOffset = Bda->VideoPage * Bda->VideoPageSize;
2387
2388 /* Set the start address in the CRTC */
2389 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG);
2390 IOWriteB(VGA_CRTC_DATA , LOBYTE(Bda->VideoPageOffset));
2391 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_HIGH_REG);
2392 IOWriteB(VGA_CRTC_DATA , HIBYTE(Bda->VideoPageOffset));
2393
2394 /*
2395 * Get the cursor location (we don't update anything on the BIOS side
2396 * but we update the cursor location on the VGA side).
2397 */
2398 VidBiosGetCursorPosition(&Row, &Column, PageNumber);
2399 VidBiosSetCursorPosition(Row, Column, PageNumber);
2400
2401 return TRUE;
2402 }
2403
2404 static VOID VidBiosPrintCharacter(CHAR Character, BYTE Attribute, BYTE Page)
2405 {
2406 WORD CharData = MAKEWORD(Character, Attribute);
2407 BYTE Row, Column;
2408
2409 /* Make sure the page exists */
2410 if (Page >= BIOS_MAX_PAGES) return;
2411
2412 /* Get the cursor location */
2413 VidBiosGetCursorPosition(&Row, &Column, Page);
2414
2415 if (Character == '\a')
2416 {
2417 /* Bell control character */
2418 // NOTE: We may use what the terminal emulator offers to us...
2419 Beep(800, 200);
2420 return;
2421 }
2422 else if (Character == '\b')
2423 {
2424 /* Backspace control character */
2425 if (Column > 0)
2426 {
2427 Column--;
2428 }
2429 else if (Row > 0)
2430 {
2431 Column = Bda->ScreenColumns - 1;
2432 Row--;
2433 }
2434
2435 /* Erase the existing character */
2436 CharData = MAKEWORD(' ', Attribute);
2437 EmulatorWriteMemory(&EmulatorContext,
2438 TO_LINEAR(TEXT_VIDEO_SEG,
2439 Page * Bda->VideoPageSize +
2440 (Row * Bda->ScreenColumns + Column) * sizeof(WORD)),
2441 (LPVOID)&CharData,
2442 sizeof(WORD));
2443 }
2444 else if (Character == '\t')
2445 {
2446 /* Horizontal Tabulation control character */
2447 do
2448 {
2449 // Taken from DOSBox
2450 VidBiosPrintCharacter(' ', Attribute, Page);
2451 VidBiosGetCursorPosition(&Row, &Column, Page);
2452 } while (Column % 8);
2453 }
2454 else if (Character == '\n')
2455 {
2456 /* Line Feed control character */
2457 Row++;
2458 }
2459 else if (Character == '\r')
2460 {
2461 /* Carriage Return control character */
2462 Column = 0;
2463 }
2464 else
2465 {
2466 /* Default character */
2467
2468 /* Write the character */
2469 EmulatorWriteMemory(&EmulatorContext,
2470 TO_LINEAR(TEXT_VIDEO_SEG,
2471 Page * Bda->VideoPageSize +
2472 (Row * Bda->ScreenColumns + Column) * sizeof(WORD)),
2473 (LPVOID)&CharData,
2474 sizeof(WORD));
2475
2476 /* Advance the cursor */
2477 Column++;
2478 }
2479
2480 /* Check if it passed the end of the row */
2481 if (Column >= Bda->ScreenColumns)
2482 {
2483 /* Return to the first column and go to the next line */
2484 Column = 0;
2485 Row++;
2486 }
2487
2488 /* Scroll the screen up if needed */
2489 if (Row > Bda->ScreenRows)
2490 {
2491 /* The screen must be scrolled up */
2492 SMALL_RECT Rectangle = { 0, 0, Bda->ScreenColumns - 1, Bda->ScreenRows };
2493
2494 VidBiosScrollWindow(SCROLL_DIRECTION_UP,
2495 1,
2496 Rectangle,
2497 Page,
2498 DEFAULT_ATTRIBUTE);
2499
2500 Row--;
2501 }
2502
2503 /* Set the cursor position */
2504 VidBiosSetCursorPosition(Row, Column, Page);
2505 }
2506
2507 /* PUBLIC FUNCTIONS ***********************************************************/
2508
2509 VOID WINAPI VidBiosVideoService(LPWORD Stack)
2510 {
2511 switch (getAH())
2512 {
2513 /* Set Video Mode */
2514 case 0x00:
2515 {
2516 VidBiosSetVideoMode(getAL());
2517 break;
2518 }
2519
2520 /* Set Text-Mode Cursor Shape */
2521 case 0x01:
2522 {
2523 /* Update the BDA */
2524 Bda->CursorStartLine = getCH();
2525 Bda->CursorEndLine = getCL();
2526
2527 /* Modify the CRTC registers */
2528 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_START_REG);
2529 IOWriteB(VGA_CRTC_DATA , Bda->CursorStartLine);
2530 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_END_REG);
2531 IOWriteB(VGA_CRTC_DATA , Bda->CursorEndLine);
2532
2533 break;
2534 }
2535
2536 /* Set Cursor Position */
2537 case 0x02:
2538 {
2539 VidBiosSetCursorPosition(getDH(), getDL(), getBH());
2540 break;
2541 }
2542
2543 /* Get Cursor Position and Shape */
2544 case 0x03:
2545 {
2546 /* Make sure the selected video page exists */
2547 if (getBH() >= BIOS_MAX_PAGES) break;
2548
2549 /* Return the result */
2550 setAX(0);
2551 setCX(MAKEWORD(Bda->CursorEndLine, Bda->CursorStartLine));
2552 setDX(Bda->CursorPosition[getBH()]);
2553 break;
2554 }
2555
2556 /* Query Light Pen */
2557 case 0x04:
2558 {
2559 /*
2560 * On modern BIOSes, this function returns 0
2561 * so that we can ignore the other registers.
2562 */
2563 setAX(0);
2564 break;
2565 }
2566
2567 /* Select Active Display Page */
2568 case 0x05:
2569 {
2570 VidBiosSetVideoPage(getAL());
2571 break;
2572 }
2573
2574 /* Scroll Window Up/Down */
2575 case 0x06:
2576 case 0x07:
2577 {
2578 SMALL_RECT Rectangle = { getCL(), getCH(), getDL(), getDH() };
2579
2580 /* Call the internal function */
2581 VidBiosScrollWindow((getAH() == 0x06) ? SCROLL_DIRECTION_UP
2582 : SCROLL_DIRECTION_DOWN,
2583 getAL(),
2584 Rectangle,
2585 Bda->VideoPage,
2586 getBH());
2587
2588 break;
2589 }
2590
2591 /* Read Character and Attribute at Cursor Position */
2592 case 0x08:
2593 {
2594 WORD CharacterData;
2595 BYTE Page = getBH();
2596 DWORD Offset;
2597
2598 /* Check if the page exists */
2599 if (Page >= BIOS_MAX_PAGES) break;
2600
2601 /* Find the offset of the character */
2602 Offset = Page * Bda->VideoPageSize +
2603 (HIBYTE(Bda->CursorPosition[Page]) * Bda->ScreenColumns +
2604 LOBYTE(Bda->CursorPosition[Page])) * 2;
2605
2606 /* Read from the video memory */
2607 EmulatorReadMemory(&EmulatorContext,
2608 TO_LINEAR(TEXT_VIDEO_SEG, Offset),
2609 (LPVOID)&CharacterData,
2610 sizeof(WORD));
2611
2612 /* Return the character data in AX */
2613 setAX(CharacterData);
2614
2615 break;
2616 }
2617
2618 /* Write Character and Attribute at Cursor Position */
2619 case 0x09:
2620 /* Write Character only (PCjr: + Attribute) at Cursor Position */
2621 case 0x0A:
2622 {
2623 WORD CharacterData = MAKEWORD(getAL(), getBL());
2624 BYTE Page = getBH();
2625 DWORD Offset, Counter = getCX();
2626
2627 /* Check if the page exists */
2628 if (Page >= BIOS_MAX_PAGES) break;
2629
2630 /* Find the offset of the character */
2631 Offset = Page * Bda->VideoPageSize +
2632 (HIBYTE(Bda->CursorPosition[Page]) * Bda->ScreenColumns +
2633 LOBYTE(Bda->CursorPosition[Page])) * 2;
2634
2635 /* Write to video memory a certain number of times */
2636 while (Counter > 0)
2637 {
2638 EmulatorWriteMemory(&EmulatorContext,
2639 TO_LINEAR(TEXT_VIDEO_SEG, Offset),
2640 (LPVOID)&CharacterData,
2641 (getAH() == 0x09) ? sizeof(WORD) : sizeof(BYTE));
2642 Offset += 2;
2643 Counter--;
2644 }
2645
2646 break;
2647 }
2648
2649 /* Set Video Colors */
2650 case 0x0B:
2651 {
2652 if (Bda->VideoMode < 4 || Bda->VideoMode > 6)
2653 {
2654 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X is unsupported for non-CGA modes\n",
2655 getBH());
2656 break;
2657 }
2658
2659 switch (getBH())
2660 {
2661 case 0x00: /* Set Background/Border Color */
2662 {
2663 #ifdef DOSBOX
2664 BYTE Index = getBL();
2665
2666 /* See: http://www.bioscentral.com/misc/bda.htm */
2667 Bda->CrtColorPaletteMask = (Bda->CrtColorPaletteMask & 0xE0) | (Index & 0x1F);
2668
2669 Index = ((Index << 1) & 0x10) | (Index & 0x7);
2670
2671 /* Always set the overscan color */
2672 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Index);
2673
2674 /* Don't set any extra colors when in text mode */
2675 if (Bda->VideoMode <= 3) break;
2676
2677 VgaSetSinglePaletteRegister(0x00, Index);
2678
2679 Index = (Bda->CrtColorPaletteMask & 0x10) | 0x02 | ((Bda->CrtColorPaletteMask & 0x20) >> 5);
2680
2681 VgaSetSinglePaletteRegister(0x01, Index);
2682 Index += 2;
2683 VgaSetSinglePaletteRegister(0x02, Index);
2684 Index += 2;
2685 VgaSetSinglePaletteRegister(0x03, Index);
2686 #else
2687 /* Background/Border Color is modifiable via the first index */
2688 VgaSetSinglePaletteRegister(0x00, getBL());
2689 #endif
2690
2691 /* Enable screen and disable palette access */
2692 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2693 IOWriteB(VGA_AC_INDEX, 0x20);
2694 break;
2695 }
2696
2697 case 0x01: /* Set Palette */
2698 {
2699 BYTE Index = getBL();
2700
2701 /* See: http://www.bioscentral.com/misc/bda.htm */
2702 /* Reset bit 5: foreground colors index (0: green/red/yellow; 1: cyan/magenta/white) */
2703 Bda->CrtColorPaletteMask = (Bda->CrtColorPaletteMask & 0xDF) | ((Index & 1) ? 0x20 : 0x00);
2704
2705 /* Don't set any extra colors when in text mode */
2706 if (Bda->VideoMode <= 3) break;
2707
2708 Index = (Bda->CrtColorPaletteMask & 0x10) | 0x02 | Index;
2709
2710 VgaSetSinglePaletteRegister(0x01, Index);
2711 Index += 2;
2712 VgaSetSinglePaletteRegister(0x02, Index);
2713 Index += 2;
2714 VgaSetSinglePaletteRegister(0x03, Index);
2715
2716 /* Enable screen and disable palette access */
2717 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2718 IOWriteB(VGA_AC_INDEX, 0x20);
2719 break;
2720 }
2721
2722 default:
2723 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X NOT IMPLEMENTED\n",
2724 getAH(), getBH());
2725 break;
2726 }
2727
2728 break;
2729 }
2730
2731 /* Teletype Output */
2732 case 0x0E:
2733 {
2734 VidBiosPrintCharacter(getAL(), getBL(), getBH());
2735 break;
2736 }
2737
2738 /* Get Current Video Mode */
2739 case 0x0F:
2740 {
2741 setAX(MAKEWORD(Bda->VideoMode, Bda->ScreenColumns));
2742 setBX(MAKEWORD(getBL(), Bda->VideoPage));
2743 break;
2744 }
2745
2746 /* Palette Control */
2747 case 0x10:
2748 {
2749 switch (getAL())
2750 {
2751 /* Set Single Palette Register */
2752 case 0x00:
2753 {
2754 VgaSetSinglePaletteRegister(getBL(), getBH());
2755
2756 /* Enable screen and disable palette access */
2757 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2758 IOWriteB(VGA_AC_INDEX, 0x20);
2759 break;
2760 }
2761
2762 /* Set Overscan Color */
2763 case 0x01:
2764 {
2765 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, getBH());
2766
2767 /* Enable screen and disable palette access */
2768 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2769 IOWriteB(VGA_AC_INDEX, 0x20);
2770 break;
2771 }
2772
2773 /* Set All Palette Registers */
2774 case 0x02:
2775 {
2776 INT i;
2777 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
2778
2779 /* Set the palette registers */
2780 for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
2781 {
2782 VgaSetSinglePaletteRegister(i, Buffer[i]);
2783 }
2784
2785 /* Set the overscan register */
2786 // VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Buffer[VGA_AC_PAL_F_REG + 1]);
2787 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
2788 IOWriteB(VGA_AC_WRITE, Buffer[VGA_AC_PAL_F_REG + 1]);
2789
2790 /* Enable screen and disable palette access */
2791 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2792 IOWriteB(VGA_AC_INDEX, 0x20);
2793 break;
2794 }
2795
2796 /* Get Single Palette Register */
2797 case 0x07:
2798 {
2799 /* Write the index */
2800 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2801 IOWriteB(VGA_AC_INDEX, getBL());
2802
2803 /* Read the data */
2804 setBH(IOReadB(VGA_AC_READ));
2805
2806 /* Enable screen and disable palette access */
2807 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2808 IOWriteB(VGA_AC_INDEX, 0x20);
2809 break;
2810 }
2811
2812 /* Get Overscan Color */
2813 case 0x08:
2814 {
2815 /* Write the index */
2816 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2817 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
2818
2819 /* Read the data */
2820 setBH(IOReadB(VGA_AC_READ));
2821
2822 /* Enable screen and disable palette access */
2823 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2824 IOWriteB(VGA_AC_INDEX, 0x20);
2825 break;
2826 }
2827
2828 /* Get All Palette Registers */
2829 case 0x09:
2830 {
2831 INT i;
2832 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
2833
2834 /* Get the palette registers */
2835 for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
2836 {
2837 /* Write the index */
2838 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2839 IOWriteB(VGA_AC_INDEX, i);
2840
2841 /* Read the data */
2842 Buffer[i] = IOReadB(VGA_AC_READ);
2843 }
2844
2845 /* Get the overscan register */
2846 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
2847 Buffer[VGA_AC_PAL_F_REG + 1] = IOReadB(VGA_AC_READ);
2848
2849 /* Enable screen and disable palette access */
2850 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2851 IOWriteB(VGA_AC_INDEX, 0x20);
2852 break;
2853 }
2854
2855 /* Set Individual DAC Register */
2856 case 0x10:
2857 {
2858 /* Write the index */
2859 // Certainly in BL and not in BX as said by Ralf Brown...
2860 IOWriteB(VGA_DAC_WRITE_INDEX, getBL());
2861
2862 /* Write the data in this order: Red, Green, Blue */
2863 IOWriteB(VGA_DAC_DATA, getDH());
2864 IOWriteB(VGA_DAC_DATA, getCH());
2865 IOWriteB(VGA_DAC_DATA, getCL());
2866
2867 break;
2868 }
2869
2870 /* Set Block of DAC Registers */
2871 case 0x12:
2872 {
2873 INT i;
2874 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
2875
2876 /* Write the index */
2877 // Certainly in BL and not in BX as said by Ralf Brown...
2878 IOWriteB(VGA_DAC_WRITE_INDEX, getBL());
2879
2880 for (i = 0; i < getCX(); i++)
2881 {
2882 /* Write the data in this order: Red, Green, Blue */
2883 IOWriteB(VGA_DAC_DATA, *Buffer++);
2884 IOWriteB(VGA_DAC_DATA, *Buffer++);
2885 IOWriteB(VGA_DAC_DATA, *Buffer++);
2886 }
2887
2888 break;
2889 }
2890
2891 /* Get Individual DAC Register */
2892 case 0x15:
2893 {
2894 /* Write the index */
2895 IOWriteB(VGA_DAC_READ_INDEX, getBL());
2896
2897 /* Read the data in this order: Red, Green, Blue */
2898 setDH(IOReadB(VGA_DAC_DATA));
2899 setCH(IOReadB(VGA_DAC_DATA));
2900 setCL(IOReadB(VGA_DAC_DATA));
2901
2902 break;
2903 }
2904
2905 /* Get Block of DAC Registers */
2906 case 0x17:
2907 {
2908 INT i;
2909 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
2910
2911 /* Write the index */
2912 // Certainly in BL and not in BX as said by Ralf Brown...
2913 IOWriteB(VGA_DAC_READ_INDEX, getBL());
2914
2915 for (i = 0; i < getCX(); i++)
2916 {
2917 /* Write the data in this order: Red, Green, Blue */
2918 *Buffer++ = IOReadB(VGA_DAC_DATA);
2919 *Buffer++ = IOReadB(VGA_DAC_DATA);
2920 *Buffer++ = IOReadB(VGA_DAC_DATA);
2921 }
2922
2923 break;
2924 }
2925
2926 default:
2927 {
2928 DPRINT1("BIOS Palette Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
2929 getAL());
2930 break;
2931 }
2932 }
2933
2934 break;
2935 }
2936
2937 /* Font Control */
2938 case 0x11:
2939 {
2940 switch (getAL())
2941 {
2942 case 0x30:
2943 {
2944 USHORT Offsets[] =
2945 {
2946 FONT_8x8_HIGH_OFFSET, /* 00h - INT 0x1F pointer */
2947 0, /* 01h - NOT IMPLEMENTED - INT 0x43 pointer */
2948 FONT_8x14_OFFSET, /* 02h - NOT IMPLEMENTED - 8x14 font */
2949 FONT_8x8_OFFSET, /* 03h - 8x8 font */
2950 FONT_8x8_HIGH_OFFSET, /* 04h - 8x8 font, upper half */
2951 0, /* 05h - NOT IMPLEMENTED - 9x14 font */
2952 FONT_8x16_OFFSET, /* 06h - 8x16 font */
2953 0, /* 07h - NOT IMPLEMENTED - 9x16 font */
2954 };
2955
2956 /* Return the data */
2957 setES(VIDEO_BIOS_DATA_SEG);
2958 setBP(Offsets[getBH() & 7]);
2959
2960 break;
2961 }
2962
2963 default:
2964 {
2965 DPRINT1("BIOS Font Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
2966 getAL());
2967 }
2968 }
2969
2970 break;
2971 }
2972
2973 /* Alternate Function Select */
2974 case 0x12:
2975 {
2976 DPRINT1("BIOS Function INT 10h, AH = 12h (Alternate Function Select), BX = 0x%04X NOT IMPLEMENTED\n",
2977 getBX());
2978 break;
2979 }
2980
2981 /* Write String */
2982 case 0x13:
2983 {
2984 DPRINT1("BIOS Function INT 13h (Write String) is UNIMPLEMENTED\n");
2985 break;
2986 }
2987
2988 /* Display combination code */
2989 case 0x1A:
2990 {
2991 switch (getAL())
2992 {
2993 case 0x00: /* Get Display combiantion code */
2994 setAX(MAKEWORD(0x1A, 0x1A));
2995 setBX(MAKEWORD(0x08, 0x00)); /* VGA w/ color analog display */
2996 break;
2997 case 0x01: /* Set Display combination code */
2998 DPRINT1("Set Display combination code - Unsupported\n");
2999 break;
3000 default:
3001 break;
3002 }
3003 break;
3004 }
3005
3006 default:
3007 {
3008 DPRINT1("BIOS Function INT 10h, AH = 0x%02X, AL = 0x%02X, BH = 0x%02X NOT IMPLEMENTED\n",
3009 getAH(), getAL(), getBH());
3010 }
3011 }
3012 }
3013
3014
3015 /*
3016 * Those attach / detach functions are work-in-progress
3017 */
3018
3019 static BOOL Attached = TRUE;
3020
3021 VOID VidBiosAttachToConsole(VOID)
3022 {
3023 // VgaRefreshDisplay();
3024 if (!Attached)
3025 {
3026 VgaAttachToConsole();
3027 Attached = TRUE;
3028 }
3029
3030 VgaRefreshDisplay();
3031 VidBiosSyncCursorPosition();
3032 }
3033
3034 VOID VidBiosDetachFromConsole(VOID)
3035 {
3036 /* Perform another screen refresh */
3037 VgaRefreshDisplay();
3038
3039 /* Detach from the console */
3040 VgaDetachFromConsole(FALSE);
3041 Attached = FALSE;
3042 }
3043
3044 BOOLEAN VidBiosInitialize(VOID)
3045 {
3046 /* Some interrupts are in fact addresses to tables */
3047 ((PULONG)BaseAddress)[0x1D] = (ULONG)NULL;
3048 ((PULONG)BaseAddress)[0x1F] = MAKELONG(FONT_8x8_HIGH_OFFSET, VIDEO_BIOS_DATA_SEG);
3049 // ((PULONG)BaseAddress)[0x42] = (ULONG)NULL;
3050 ((PULONG)BaseAddress)[0x43] = (ULONG)NULL;
3051 ((PULONG)BaseAddress)[0x44] = (ULONG)NULL;
3052
3053 /* Fill the tables */
3054 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x8_OFFSET),
3055 Font8x8,
3056 sizeof(Font8x8));
3057 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x16_OFFSET),
3058 Font8x16,
3059 sizeof(Font8x16));
3060 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x14_OFFSET),
3061 Font8x14,
3062 sizeof(Font8x14));
3063
3064 /* Write the default font to the VGA font plane */
3065 VgaWriteFont(0, Font8x16, 16);
3066
3067 /* Initialize the VGA BDA data */
3068 Bda->VGAOptions = 0x30; /* 256 KB Video RAM */
3069 Bda->VGASwitches = 0x09; /* High-resolution */
3070
3071 //
3072 // FIXME: At the moment we always set a VGA mode. In the future,
3073 // we should set this mode **only** when:
3074 // - an app starts to use directly the video memory
3075 // (that should be done in emulator.c)
3076 // - or starts to use non-stream I/O interrupts
3077 // (that should be done here, or maybe in VGA ??)
3078 //
3079
3080 /* Set the default video mode */
3081 VidBiosSetVideoMode(BIOS_DEFAULT_VIDEO_MODE);
3082
3083 /* Synchronize our cursor position with VGA */
3084 VidBiosSyncCursorPosition();
3085
3086 /* Register the BIOS support BOPs */
3087 RegisterBop(BOP_VIDEO_INT, VidBiosVideoService);
3088
3089 return TRUE;
3090 }
3091
3092 VOID VidBiosCleanup(VOID)
3093 {
3094 }
3095
3096 /* EOF */