82b2d5f0aea0b0f47e6e760412c51ad845da5ddf
[reactos.git] / reactos / subsystems / mvdm / 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 "ntvdm.h"
15 #include "emulator.h"
16 #include "cpu/cpu.h"
17 #include "cpu/bop.h"
18
19 #include "bios.h"
20 // #include "vidbios.h"
21
22 #include "io.h"
23 #include "hardware/video/vga.h"
24
25 /* DEFINES ********************************************************************/
26
27 /* BOP Identifiers */
28 #define BOP_VIDEO_INT 0x10
29
30 /* MACROS *********************************************************************/
31
32 //
33 // These macros are defined for ease-of-use of some VGA I/O ports
34 // whose addresses depend whether we are in Monochrome or Colour mode.
35 //
36 #define VGA_INSTAT1_READ Bda->CrtBasePort + 6 // VGA_INSTAT1_READ_MONO or VGA_INSTAT1_READ_COLOR
37 #define VGA_CRTC_INDEX Bda->CrtBasePort // VGA_CRTC_INDEX_MONO or VGA_CRTC_INDEX_COLOR
38 #define VGA_CRTC_DATA Bda->CrtBasePort + 1 // VGA_CRTC_DATA_MONO or VGA_CRTC_DATA_COLOR
39
40 /* PRIVATE VARIABLES **********************************************************/
41
42 /*
43 * VGA Register Configurations for BIOS Video Modes.
44 * The configurations were checked against SeaBIOS VGA BIOS.
45 */
46 static VGA_REGISTERS VideoMode_40x25_text =
47 {
48 /* Miscellaneous Register */
49 0x67,
50
51 /* Sequencer Registers */
52 {0x00, 0x08, 0x03, 0x00, 0x02},
53
54 /* CRTC Registers */ /* CGA-compatible: 0xC7, 0x06, 0x07 */
55 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
56 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x1F, 0x96, 0xB9, 0xA3,
57 0xFF},
58
59 /* GC Registers */
60 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
61
62 /* AC Registers */
63 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
64 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
65 };
66
67 static VGA_REGISTERS VideoMode_80x25_text =
68 {
69 /* Miscellaneous Register */
70 0x67,
71
72 /* Sequencer Registers */
73 {0x00, 0x00, 0x03, 0x00, 0x02},
74
75 /* CRTC Registers */ /* CGA-compatible: 0xC7, 0x06, 0x07 */
76 {0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
77 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3,
78 0xFF},
79
80 /* GC Registers */
81 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
82
83 /* AC Registers */
84 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
85 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
86 };
87
88 static VGA_REGISTERS VideoMode_320x200_4color =
89 {
90 /* Miscellaneous Register */
91 0x63,
92
93 /* Sequencer Registers */
94 {0x00, 0x09, 0x03, 0x00, 0x02},
95
96 /* CRTC Registers */
97 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
98 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xA2,
99 0xFF},
100
101 /* GC Registers */
102 {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0F, 0x0F, 0xFF},
103
104 /* AC Registers */
105 {0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
106 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x03, 0x00, 0x00}
107 };
108
109 static VGA_REGISTERS VideoMode_640x200_2color =
110 {
111 /* Miscellaneous Register */
112 0x63,
113
114 /* Sequencer Registers */
115 {0x00, 0x01, 0x01, 0x00, 0x02},
116
117 /* CRTC Registers */
118 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
119 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xC2,
120 0xFF},
121
122 /* GC Registers */
123 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0xFF},
124
125 /* AC Registers */
126 {0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
127 0x17, 0x17, 0x17, 0x17, 0x01, 0x00, 0x01, 0x00, 0x00}
128 };
129
130 static VGA_REGISTERS VideoMode_320x200_16color =
131 {
132 /* Miscellaneous Register */
133 0x63,
134
135 /* Sequencer Registers */
136 {0x00, 0x09, 0x0F, 0x00, 0x06},
137
138 /* CRTC Registers */
139 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
140 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xE3,
141 0xFF},
142
143 /* GC Registers */
144 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
145
146 /* AC Registers */
147 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
148 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
149 };
150
151 static VGA_REGISTERS VideoMode_640x200_16color =
152 {
153 /* Miscellaneous Register */
154 0x63,
155
156 /* Sequencer Registers */
157 {0x00, 0x01, 0x0F, 0x00, 0x06},
158
159 /* CRTC Registers */
160 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
161 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xE3,
162 0xFF},
163
164 /* GC Registers */
165 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
166
167 /* AC Registers */
168 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
169 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
170 };
171
172 static VGA_REGISTERS VideoMode_640x350_16color =
173 {
174 /* Miscellaneous Register */
175 0xA3,
176
177 /* Sequencer Registers */
178 {0x00, 0x01, 0x0F, 0x00, 0x06},
179
180 /* CRTC Registers */
181 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00,
182 0x00, 0x00, 0x00, 0x00, 0x83, 0x85, 0x5D, 0x28, 0x0F, 0x63, 0xBA, 0xE3,
183 0xFF},
184
185 /* GC Registers */
186 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
187
188 /* AC Registers */
189 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
190 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
191 };
192
193 static VGA_REGISTERS VideoMode_640x480_2color =
194 {
195 /* Miscellaneous Register */
196 0xE3,
197
198 /* Sequencer Registers */
199 {0x00, 0x01, 0x0F, 0x00, 0x06},
200
201 /* CRTC Registers */
202 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
203 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xC3,
204 0xFF},
205
206 /* GC Registers */
207 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
208
209 /* AC Registers */
210 // {0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
211 // 0x3F, 0x3F, 0x3F, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
212 {0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x3F,
213 0x00, 0x3F, 0x00, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
214 };
215
216 static VGA_REGISTERS VideoMode_640x480_16color =
217 {
218 /* Miscellaneous Register */
219 0xE3,
220
221 /* Sequencer Registers */
222 {0x00, 0x01, 0x0F, 0x00, 0x06},
223
224 /* CRTC Registers */
225 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3,
227 0xFF},
228
229 /* GC Registers */
230 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
231
232 /* AC Registers */
233 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
234 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
235 };
236
237 static VGA_REGISTERS VideoMode_320x200_256color =
238 {
239 /* Miscellaneous Register */
240 0x63,
241
242 /* Sequencer Registers */
243 {0x00, 0x01, 0x0F, 0x00, 0x0E},
244
245 /* CRTC Registers */
246 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x41, 0x00, 0x00,
247 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3,
248 0xFF},
249
250 /* GC Registers */
251 {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF},
252
253 /* AC Registers */
254 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
255 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00}
256 };
257
258 /* See http://wiki.osdev.org/Drawing_In_Protected_Mode#Locating_Video_Memory */
259 static PVGA_REGISTERS VideoModes[BIOS_MAX_VIDEO_MODE + 1] =
260 {
261 &VideoMode_40x25_text, /* Mode 00h */ // 16 color (mono)
262 &VideoMode_40x25_text, /* Mode 01h */ // 16 color
263 &VideoMode_80x25_text, /* Mode 02h */ // 16 color (mono)
264 &VideoMode_80x25_text, /* Mode 03h */ // 16 color
265 &VideoMode_320x200_4color, /* Mode 04h */ // CGA 4 color
266 &VideoMode_320x200_4color, /* Mode 05h */ // CGA same (m) (uses 3rd CGA palette)
267 &VideoMode_640x200_2color, /* Mode 06h */ // CGA 640*200 2 color
268 NULL, /* Mode 07h */ // MDA monochrome text 80*25
269 NULL, /* Mode 08h */ // PCjr
270 NULL, /* Mode 09h */ // PCjr
271 NULL, /* Mode 0Ah */ // PCjr
272 NULL, /* Mode 0Bh */ // Reserved
273 NULL, /* Mode 0Ch */ // Reserved
274 &VideoMode_320x200_16color, /* Mode 0Dh */ // EGA 320*200 16 color
275 &VideoMode_640x200_16color, /* Mode 0Eh */ // EGA 640*200 16 color
276 NULL, /* Mode 0Fh */ // EGA 640*350 mono
277 &VideoMode_640x350_16color, /* Mode 10h */ // EGA 640*350 HiRes 16 color
278 &VideoMode_640x480_2color, /* Mode 11h */ // VGA 640*480 mono
279 &VideoMode_640x480_16color, /* Mode 12h */ // VGA
280 &VideoMode_320x200_256color, /* Mode 13h */ // VGA
281 };
282
283 // FIXME: Are they computable with the previous data ??
284 // Values taken from DOSBox.
285 static WORD VideoModePageSize[BIOS_MAX_VIDEO_MODE + 1] =
286 {
287 0x0800, 0x0800, 0x1000, 0x1000,
288 0x4000, 0x4000, 0x4000, 0x1000,
289 0x0000, 0x0000, 0x0000, 0x0000,
290 0x0000, 0x2000, 0x4000, 0x8000,
291 0x8000, 0xA000, 0xA000, 0x2000
292 };
293
294 /*
295 * BIOS Mode Palettes
296 *
297 * Many people have different versions of those palettes
298 * (e.g. DOSBox, http://www.brokenthorn.com/Resources/OSDevVid2.html ,
299 * etc...) A choice should be made at some point.
300 */
301
302 // This is the same as EgaPalette__HiRes
303 static CONST COLORREF TextPalette[VGA_MAX_COLORS / 4] =
304 {
305 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
306 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
307 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
308 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
309
310 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
311 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
312 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
313 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
314
315
316 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
317 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
318 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
319 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
320
321 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
322 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
323 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
324 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
325 };
326
327 // Unused at the moment
328 static CONST COLORREF mtext_palette[64] =
329 {
330 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
331 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
332 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
333 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
334 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
335 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
336 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
337 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
338
339 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
340 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
341 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
342 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
343 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
344 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
345 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
346 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
347 };
348
349 // Unused at the moment
350 static CONST COLORREF mtext_s3_palette[64] =
351 {
352 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
353 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
354 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
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(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
359 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
360
361 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
362 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
363 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
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(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
368 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
369 };
370
371 #if 0
372
373 // Unused at the moment
374 static CONST COLORREF CgaPalette[16] =
375 {
376 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
377 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
378 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
379 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
380 };
381
382 /* CGA palette 1 */
383 static CONST BYTE CgaPalette1[] =
384 {
385 0x00, /* 0 - Black */
386 0x03, /* 1 - Cyan */
387 0x05, /* 2- Magenta */
388 0x07, /* 3 - White */
389 }
390
391 /* CGA palette 1 bright */
392 static CONST BYTE CgaPalette1i[] =
393 {
394 0x00, /* 0 - Black */
395 0x13, /* 1 - Light cyan */
396 0x15, /* 2 - Light magenta */
397 0x17, /* 3 - Bright White */
398 };
399
400 /* CGA palette 2 */
401 static CONST BYTE CgaPalette2[] =
402 {
403 0x00, /* 0 - Black */
404 0x02, /* 1 - Green */
405 0x04, /* 2 - Red */
406 0x06, /* 3 - Brown */
407 };
408
409 /* CGA palette 2 bright */
410 static CONST BYTE CgaPalette2i[] =
411 {
412 0x00, /* 0 - Black */
413 0x12, /* 1 - Light green */
414 0x14, /* 2 - Light red */
415 0x16, /* 3 - Yellow */
416 };
417
418 // Unused at the moment; same palette as EgaPalette__16Colors
419 static CONST COLORREF CgaPalette2[VGA_MAX_COLORS / 4] =
420 {
421 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
422 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
423 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
424 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
425
426 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
427 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
428 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
429 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
430
431 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
432 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
433 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
434 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
435
436 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
437 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
438 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
439 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
440 };
441
442 #endif
443
444 static CONST COLORREF EgaPalette__16Colors[VGA_MAX_COLORS / 4] =
445 {
446 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
447 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
448
449 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
450 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
451
452
453 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
454 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
455
456 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
457 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
458
459
460
461 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
462 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
463
464 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
465 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
466
467
468 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
469 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
470
471 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
472 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
473 };
474
475 // This is the same as TextPalette
476 static CONST COLORREF EgaPalette__HiRes[VGA_MAX_COLORS / 4] =
477 {
478 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
479 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
480 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
481 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
482
483 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
484 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
485 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
486 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
487
488
489 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
490 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
491 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
492 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
493
494 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
495 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
496 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
497 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
498 };
499
500 #define USE_REACTOS_COLORS
501 // #define USE_DOSBOX_COLORS
502
503 /*
504 * Same palette as the default one 'VgaDefaultPalette' in vga.c
505 */
506 #if defined(USE_REACTOS_COLORS)
507
508 // ReactOS colors
509 static CONST COLORREF VgaPalette[VGA_MAX_COLORS] =
510 {
511 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
512 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
513 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
514 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
515 RGB(0x00, 0x00, 0x00), RGB(0x10, 0x10, 0x10), RGB(0x20, 0x20, 0x20), RGB(0x35, 0x35, 0x35),
516 RGB(0x45, 0x45, 0x45), RGB(0x55, 0x55, 0x55), RGB(0x65, 0x65, 0x65), RGB(0x75, 0x75, 0x75),
517 RGB(0x8A, 0x8A, 0x8A), RGB(0x9A, 0x9A, 0x9A), RGB(0xAA, 0xAA, 0xAA), RGB(0xBA, 0xBA, 0xBA),
518 RGB(0xCA, 0xCA, 0xCA), RGB(0xDF, 0xDF, 0xDF), RGB(0xEF, 0xEF, 0xEF), RGB(0xFF, 0xFF, 0xFF),
519 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x82, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
520 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x82), RGB(0xFF, 0x00, 0x41),
521 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x82, 0x00), RGB(0xFF, 0xBE, 0x00),
522 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x82, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
523 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x82), RGB(0x00, 0xFF, 0xBE),
524 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x82, 0xFF), RGB(0x00, 0x41, 0xFF),
525 RGB(0x82, 0x82, 0xFF), RGB(0x9E, 0x82, 0xFF), RGB(0xBE, 0x82, 0xFF), RGB(0xDF, 0x82, 0xFF),
526 RGB(0xFF, 0x82, 0xFF), RGB(0xFF, 0x82, 0xDF), RGB(0xFF, 0x82, 0xBE), RGB(0xFF, 0x82, 0x9E),
527 RGB(0xFF, 0x82, 0x82), RGB(0xFF, 0x9E, 0x82), RGB(0xFF, 0xBE, 0x82), RGB(0xFF, 0xDF, 0x82),
528 RGB(0xFF, 0xFF, 0x82), RGB(0xDF, 0xFF, 0x82), RGB(0xBE, 0xFF, 0x82), RGB(0x9E, 0xFF, 0x82),
529 RGB(0x82, 0xFF, 0x82), RGB(0x82, 0xFF, 0x9E), RGB(0x82, 0xFF, 0xBE), RGB(0x82, 0xFF, 0xDF),
530 RGB(0x82, 0xFF, 0xFF), RGB(0x82, 0xDF, 0xFF), RGB(0x82, 0xBE, 0xFF), RGB(0x82, 0x9E, 0xFF),
531 RGB(0xBA, 0xBA, 0xFF), RGB(0xCA, 0xBA, 0xFF), RGB(0xDF, 0xBA, 0xFF), RGB(0xEF, 0xBA, 0xFF),
532 RGB(0xFF, 0xBA, 0xFF), RGB(0xFF, 0xBA, 0xEF), RGB(0xFF, 0xBA, 0xDF), RGB(0xFF, 0xBA, 0xCA),
533 RGB(0xFF, 0xBA, 0xBA), RGB(0xFF, 0xCA, 0xBA), RGB(0xFF, 0xDF, 0xBA), RGB(0xFF, 0xEF, 0xBA),
534 RGB(0xFF, 0xFF, 0xBA), RGB(0xEF, 0xFF, 0xBA), RGB(0xDF, 0xFF, 0xBA), RGB(0xCA, 0xFF, 0xBA),
535 RGB(0xBA, 0xFF, 0xBA), RGB(0xBA, 0xFF, 0xCA), RGB(0xBA, 0xFF, 0xDF), RGB(0xBA, 0xFF, 0xEF),
536 RGB(0xBA, 0xFF, 0xFF), RGB(0xBA, 0xEF, 0xFF), RGB(0xBA, 0xDF, 0xFF), RGB(0xBA, 0xCA, 0xFF),
537 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x39, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
538 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x39), RGB(0x71, 0x00, 0x1C),
539 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x39, 0x00), RGB(0x71, 0x55, 0x00),
540 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x39, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
541 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x39), RGB(0x00, 0x71, 0x55),
542 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x39, 0x71), RGB(0x00, 0x1C, 0x71),
543 RGB(0x39, 0x39, 0x71), RGB(0x45, 0x39, 0x71), RGB(0x55, 0x39, 0x71), RGB(0x61, 0x39, 0x71),
544 RGB(0x71, 0x39, 0x71), RGB(0x71, 0x39, 0x61), RGB(0x71, 0x39, 0x55), RGB(0x71, 0x39, 0x45),
545 RGB(0x71, 0x39, 0x39), RGB(0x71, 0x45, 0x39), RGB(0x71, 0x55, 0x39), RGB(0x71, 0x61, 0x39),
546 RGB(0x71, 0x71, 0x39), RGB(0x61, 0x71, 0x39), RGB(0x55, 0x71, 0x39), RGB(0x45, 0x71, 0x39),
547 RGB(0x39, 0x71, 0x39), RGB(0x39, 0x71, 0x45), RGB(0x39, 0x71, 0x55), RGB(0x39, 0x71, 0x61),
548 RGB(0x39, 0x71, 0x71), RGB(0x39, 0x61, 0x71), RGB(0x39, 0x55, 0x71), RGB(0x39, 0x45, 0x71),
549 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
550 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
551 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
552 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
553 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
554 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
555 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x31, 0x00, 0x41),
556 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x31), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
557 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x31, 0x00),
558 RGB(0x41, 0x41, 0x00), RGB(0x31, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
559 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x31),
560 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x31, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
561 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x31, 0x20, 0x41), RGB(0x39, 0x20, 0x41),
562 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x39), RGB(0x41, 0x20, 0x31), RGB(0x41, 0x20, 0x28),
563 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x31, 0x20), RGB(0x41, 0x39, 0x20),
564 RGB(0x41, 0x41, 0x20), RGB(0x39, 0x41, 0x20), RGB(0x31, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
565 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x31), RGB(0x20, 0x41, 0x39),
566 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x39, 0x41), RGB(0x20, 0x31, 0x41), RGB(0x20, 0x28, 0x41),
567 RGB(0x2D, 0x2D, 0x41), RGB(0x31, 0x2D, 0x41), RGB(0x35, 0x2D, 0x41), RGB(0x3D, 0x2D, 0x41),
568 RGB(0x41, 0x2D, 0x41), RGB(0x41, 0x2D, 0x3D), RGB(0x41, 0x2D, 0x35), RGB(0x41, 0x2D, 0x31),
569 RGB(0x41, 0x2D, 0x2D), RGB(0x41, 0x31, 0x2D), RGB(0x41, 0x35, 0x2D), RGB(0x41, 0x3D, 0x2D),
570 RGB(0x41, 0x41, 0x2D), RGB(0x3D, 0x41, 0x2D), RGB(0x35, 0x41, 0x2D), RGB(0x31, 0x41, 0x2D),
571 RGB(0x2D, 0x41, 0x2D), RGB(0x2D, 0x41, 0x31), RGB(0x2D, 0x41, 0x35), RGB(0x2D, 0x41, 0x3D),
572 RGB(0x2D, 0x41, 0x41), RGB(0x2D, 0x3D, 0x41), RGB(0x2D, 0x35, 0x41), RGB(0x2D, 0x31, 0x41),
573 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
574 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
575 };
576
577 #elif defined(USE_DOSBOX_COLORS)
578
579 // DOSBox colors
580 static CONST COLORREF VgaPalette[VGA_MAX_COLORS] =
581 {
582 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
583 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
584 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
585 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
586 RGB(0x00, 0x00, 0x00), RGB(0x14, 0x14, 0x14), RGB(0x20, 0x20, 0x20), RGB(0x2C, 0x2C, 0x2C),
587 RGB(0x38, 0x38, 0x38), RGB(0x45, 0x45, 0x45), RGB(0x51, 0x51, 0x51), RGB(0x61, 0x61, 0x61),
588 RGB(0x71, 0x71, 0x71), RGB(0x82, 0x82, 0x82), RGB(0x92, 0x92, 0x92), RGB(0xA2, 0xA2, 0xA2),
589 RGB(0xB6, 0xB6, 0xB6), RGB(0xCB, 0xCB, 0xCB), RGB(0xE3, 0xE3, 0xE3), RGB(0xFF, 0xFF, 0xFF),
590 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x7D, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
591 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x7D), RGB(0xFF, 0x00, 0x41),
592 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x7D, 0x00), RGB(0xFF, 0xBE, 0x00),
593 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x7D, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
594 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x7D), RGB(0x00, 0xFF, 0xBE),
595 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x7D, 0xFF), RGB(0x00, 0x41, 0xFF),
596 RGB(0x7D, 0x7D, 0xFF), RGB(0x9E, 0x7D, 0xFF), RGB(0xBE, 0x7D, 0xFF), RGB(0xDF, 0x7D, 0xFF),
597 RGB(0xFF, 0x7D, 0xFF), RGB(0xFF, 0x7D, 0xDF), RGB(0xFF, 0x7D, 0xBE), RGB(0xFF, 0x7D, 0x9E),
598
599 RGB(0xFF, 0x7D, 0x7D), RGB(0xFF, 0x9E, 0x7D), RGB(0xFF, 0xBE, 0x7D), RGB(0xFF, 0xDF, 0x7D),
600 RGB(0xFF, 0xFF, 0x7D), RGB(0xDF, 0xFF, 0x7D), RGB(0xBE, 0xFF, 0x7D), RGB(0x9E, 0xFF, 0x7D),
601 RGB(0x7D, 0xFF, 0x7D), RGB(0x7D, 0xFF, 0x9E), RGB(0x7D, 0xFF, 0xBE), RGB(0x7D, 0xFF, 0xDF),
602 RGB(0x7D, 0xFF, 0xFF), RGB(0x7D, 0xDF, 0xFF), RGB(0x7D, 0xBE, 0xFF), RGB(0x7D, 0x9E, 0xFF),
603 RGB(0xB6, 0xB6, 0xFF), RGB(0xC7, 0xB6, 0xFF), RGB(0xDB, 0xB6, 0xFF), RGB(0xEB, 0xB6, 0xFF),
604 RGB(0xFF, 0xB6, 0xFF), RGB(0xFF, 0xB6, 0xEB), RGB(0xFF, 0xB6, 0xDB), RGB(0xFF, 0xB6, 0xC7),
605 RGB(0xFF, 0xB6, 0xB6), RGB(0xFF, 0xC7, 0xB6), RGB(0xFF, 0xDB, 0xB6), RGB(0xFF, 0xEB, 0xB6),
606 RGB(0xFF, 0xFF, 0xB6), RGB(0xEB, 0xFF, 0xB6), RGB(0xDB, 0xFF, 0xB6), RGB(0xC7, 0xFF, 0xB6),
607 RGB(0xB6, 0xFF, 0xB6), RGB(0xB6, 0xFF, 0xC7), RGB(0xB6, 0xFF, 0xDB), RGB(0xB6, 0xFF, 0xEB),
608 RGB(0xB6, 0xFF, 0xFF), RGB(0xB6, 0xEB, 0xFF), RGB(0xB6, 0xDB, 0xFF), RGB(0xB6, 0xC7, 0xFF),
609 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x38, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
610 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x38), RGB(0x71, 0x00, 0x1C),
611 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x38, 0x00), RGB(0x71, 0x55, 0x00),
612 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x38, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
613 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x38), RGB(0x00, 0x71, 0x55),
614 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x38, 0x71), RGB(0x00, 0x1C, 0x71),
615
616 RGB(0x38, 0x38, 0x71), RGB(0x45, 0x38, 0x71), RGB(0x55, 0x38, 0x71), RGB(0x61, 0x38, 0x71),
617 RGB(0x71, 0x38, 0x71), RGB(0x71, 0x38, 0x61), RGB(0x71, 0x38, 0x55), RGB(0x71, 0x38, 0x45),
618 RGB(0x71, 0x38, 0x38), RGB(0x71, 0x45, 0x38), RGB(0x71, 0x55, 0x38), RGB(0x71, 0x61, 0x38),
619 RGB(0x71, 0x71, 0x38), RGB(0x61, 0x71, 0x38), RGB(0x55, 0x71, 0x38), RGB(0x45, 0x71, 0x38),
620 RGB(0x38, 0x71, 0x38), RGB(0x38, 0x71, 0x45), RGB(0x38, 0x71, 0x55), RGB(0x38, 0x71, 0x61),
621 RGB(0x38, 0x71, 0x71), RGB(0x38, 0x61, 0x71), RGB(0x38, 0x55, 0x71), RGB(0x38, 0x45, 0x71),
622 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
623 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
624 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
625 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
626 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
627 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
628 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x30, 0x00, 0x41),
629 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x30), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
630 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x30, 0x00),
631 RGB(0x41, 0x41, 0x00), RGB(0x30, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
632
633 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x30),
634 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x30, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
635 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x30, 0x20, 0x41), RGB(0x38, 0x20, 0x41),
636 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x38), RGB(0x41, 0x20, 0x30), RGB(0x41, 0x20, 0x28),
637 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x30, 0x20), RGB(0x41, 0x38, 0x20),
638 RGB(0x41, 0x41, 0x20), RGB(0x38, 0x41, 0x20), RGB(0x30, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
639 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x30), RGB(0x20, 0x41, 0x38),
640 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x38, 0x41), RGB(0x20, 0x30, 0x41), RGB(0x20, 0x28, 0x41),
641 RGB(0x2C, 0x2C, 0x41), RGB(0x30, 0x2C, 0x41), RGB(0x34, 0x2C, 0x41), RGB(0x3C, 0x2C, 0x41),
642 RGB(0x41, 0x2C, 0x41), RGB(0x41, 0x2C, 0x3C), RGB(0x41, 0x2C, 0x34), RGB(0x41, 0x2C, 0x30),
643 RGB(0x41, 0x2C, 0x2C), RGB(0x41, 0x30, 0x2C), RGB(0x41, 0x34, 0x2C), RGB(0x41, 0x3C, 0x2C),
644 RGB(0x41, 0x41, 0x2C), RGB(0x3C, 0x41, 0x2C), RGB(0x34, 0x41, 0x2C), RGB(0x30, 0x41, 0x2C),
645 RGB(0x2C, 0x41, 0x2C), RGB(0x2C, 0x41, 0x30), RGB(0x2C, 0x41, 0x34), RGB(0x2C, 0x41, 0x3C),
646 RGB(0x2C, 0x41, 0x41), RGB(0x2C, 0x3C, 0x41), RGB(0x2C, 0x34, 0x41), RGB(0x2C, 0x30, 0x41),
647 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
648 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
649 };
650
651 #endif
652
653 static CONST UCHAR Font8x8[VGA_FONT_CHARACTERS * 8] =
654 {
655 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656 0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E,
657 0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E,
658 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
659 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,
660 0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x92, 0x10, 0x7C,
661 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C,
662 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00,
663 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF,
664 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
665 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF,
666 0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78,
667 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18,
668 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0,
669 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0,
670 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99,
671 0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00,
672 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00,
673 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18,
674 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00,
675 0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00,
676 0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0x86, 0xFC,
677 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00,
678 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF,
679 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00,
680 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00,
681 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00,
682 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
683 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00,
684 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
685 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00,
686 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00,
687 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
688 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00,
689 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
690 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
691 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00,
692 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00,
693 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00,
694 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
695 0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00,
696 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00,
697 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
698 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
699 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30,
700 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
701 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
702 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
703 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00,
704 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00,
705 0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00,
706 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00,
707 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00,
708 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00,
709 0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00,
710 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00,
711 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00,
712 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00,
713 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
714 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
715 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00,
716 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00,
717 0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00,
718 0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00,
719 0x7C, 0xC6, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00,
720 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00,
721 0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00,
722 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00,
723 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00,
724 0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
725 0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00,
726 0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00,
727 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00,
728 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
729 0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
730 0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00,
731 0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00,
732 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
733 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00,
734 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
735 0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,
736 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x0E, 0x00,
737 0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00,
738 0x7C, 0xC6, 0xE0, 0x78, 0x0E, 0xC6, 0x7C, 0x00,
739 0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
740 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00,
741 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
742 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
743 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00,
744 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00,
745 0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00,
746 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00,
747 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00,
748 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00,
749 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
750 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
751 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
752 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
753 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00,
754 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00,
755 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00,
756 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
757 0x38, 0x6C, 0x64, 0xF0, 0x60, 0x60, 0xF0, 0x00,
758 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
759 0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00,
760 0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
761 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78,
762 0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
763 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
764 0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xD6, 0x00,
765 0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
766 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
767 0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0,
768 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
769 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0xF0, 0x00,
770 0x00, 0x00, 0x7C, 0xC0, 0x70, 0x1C, 0xF8, 0x00,
771 0x10, 0x30, 0xFC, 0x30, 0x30, 0x34, 0x18, 0x00,
772 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
773 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
774 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
775 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00,
776 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
777 0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00,
778 0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00,
779 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00,
780 0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00,
781 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
782 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00,
783 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x0C, 0x06, 0x7C,
784 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
785 0x1C, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
786 0x7E, 0x81, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0x00,
787 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
788 0xE0, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
789 0x30, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
790 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x78, 0x0C, 0x38,
791 0x7E, 0x81, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00,
792 0xCC, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
793 0xE0, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
794 0xCC, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
795 0x7C, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
796 0xE0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
797 0xC6, 0x10, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
798 0x30, 0x30, 0x00, 0x78, 0xCC, 0xFC, 0xCC, 0x00,
799 0x1C, 0x00, 0xFC, 0x60, 0x78, 0x60, 0xFC, 0x00,
800 0x00, 0x00, 0x7F, 0x0C, 0x7F, 0xCC, 0x7F, 0x00,
801 0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00,
802 0x78, 0x84, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
803 0x00, 0xCC, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
804 0x00, 0xE0, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
805 0x78, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
806 0x00, 0xE0, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
807 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
808 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00,
809 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
810 0x18, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x18,
811 0x38, 0x6C, 0x64, 0xF0, 0x60, 0xE6, 0xFC, 0x00,
812 0xCC, 0xCC, 0x78, 0x30, 0xFC, 0x30, 0xFC, 0x30,
813 0xF8, 0xCC, 0xCC, 0xFA, 0xC6, 0xCF, 0xC6, 0xC3,
814 0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0xD8, 0x70,
815 0x1C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
816 0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
817 0x00, 0x1C, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
818 0x00, 0x1C, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
819 0x00, 0xF8, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0x00,
820 0xFC, 0x00, 0xCC, 0xEC, 0xFC, 0xDC, 0xCC, 0x00,
821 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00,
822 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00,
823 0x18, 0x00, 0x18, 0x18, 0x30, 0x66, 0x3C, 0x00,
824 0x00, 0x00, 0x00, 0xFC, 0xC0, 0xC0, 0x00, 0x00,
825 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x0C, 0x00, 0x00,
826 0xC6, 0xCC, 0xD8, 0x36, 0x6B, 0xC2, 0x84, 0x0F,
827 0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6D, 0xCF, 0x03,
828 0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00,
829 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
830 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00,
831 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
832 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
833 0xDB, 0xF6, 0xDB, 0x6F, 0xDB, 0x7E, 0xD7, 0xED,
834 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
835 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18,
836 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
837 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36,
838 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36,
839 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
840 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36,
841 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
842 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36,
843 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00,
844 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00,
845 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00,
846 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18,
847 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00,
848 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
849 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18,
850 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
851 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
852 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18,
853 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
854 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36,
855 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00,
856 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36,
857 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00,
858 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36,
859 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36,
860 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
861 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36,
862 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
863 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00,
864 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18,
865 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36,
866 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00,
867 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00,
868 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
869 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36,
870 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36,
871 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18,
872 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00,
873 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18,
874 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
875 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
876 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
877 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
878 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
879 0x00, 0x00, 0x76, 0xDC, 0xC8, 0xDC, 0x76, 0x00,
880 0x00, 0x78, 0xCC, 0xF8, 0xCC, 0xF8, 0xC0, 0xC0,
881 0x00, 0xFC, 0xCC, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
882 0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x00,
883 0xFC, 0xCC, 0x60, 0x30, 0x60, 0xCC, 0xFC, 0x00,
884 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0x70, 0x00,
885 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
886 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00,
887 0xFC, 0x30, 0x78, 0xCC, 0xCC, 0x78, 0x30, 0xFC,
888 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x6C, 0x38, 0x00,
889 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x6C, 0xEE, 0x00,
890 0x1C, 0x30, 0x18, 0x7C, 0xCC, 0xCC, 0x78, 0x00,
891 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00,
892 0x06, 0x0C, 0x7E, 0xDB, 0xDB, 0x7E, 0x60, 0xC0,
893 0x38, 0x60, 0xC0, 0xF8, 0xC0, 0x60, 0x38, 0x00,
894 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
895 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00,
896 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00,
897 0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xFC, 0x00,
898 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xFC, 0x00,
899 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18,
900 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70,
901 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00,
902 0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00,
903 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
904 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
905 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
906 0x0F, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C,
907 0x58, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00,
908 0x70, 0x98, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00,
909 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00,
910 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
911 };
912
913 static CONST UCHAR Font8x14[VGA_FONT_CHARACTERS * 14] =
914 {
915 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
916 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
917 0x00, 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81,
918 0x81, 0xBD, 0x99, 0x81, 0x7E, 0x00, 0x00,
919 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xDB, 0xFF,
920 0xFF, 0xC3, 0xE7, 0xFF, 0x7E, 0x00, 0x00,
921 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE,
922 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00,
923 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C,
924 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00,
925 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0xE7,
926 0xE7, 0xE7, 0x18, 0x18, 0x3C, 0x00, 0x00,
927 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF,
928 0xFF, 0x7E, 0x18, 0x18, 0x3C, 0x00, 0x00,
929 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
930 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
931 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7,
932 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF,
933 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66,
934 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00,
935 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99,
936 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF,
937 0x00, 0x00, 0x00, 0x1E, 0x0E, 0x1A, 0x32,
938 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00,
939 0x00, 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66,
940 0x3C, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
941 0x00, 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30,
942 0x30, 0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00,
943 0x00, 0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63,
944 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00,
945 0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C,
946 0xE7, 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00,
947 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF8,
948 0xFE, 0xF8, 0xE0, 0xC0, 0x80, 0x00, 0x00,
949 0x00, 0x00, 0x00, 0x02, 0x06, 0x0E, 0x3E,
950 0xFE, 0x3E, 0x0E, 0x06, 0x02, 0x00, 0x00,
951 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
952 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
953 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
954 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00,
955 0x00, 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB,
956 0x7B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00,
957 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6,
958 0x6C, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00,
959 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
960 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE,
961 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
962 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00,
963 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18,
964 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
965 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
966 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00,
967 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C,
968 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00,
969 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60,
970 0xFE, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00,
971 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
972 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00,
973 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6C,
974 0xFE, 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00,
975 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
976 0x7C, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00,
977 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C,
978 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00,
979 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
980 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
981 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C,
982 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00,
983 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00,
984 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
985 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C,
986 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00,
987 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0,
988 0x7C, 0x06, 0x86, 0xC6, 0x7C, 0x18, 0x18,
989 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6,
990 0x0C, 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00,
991 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
992 0x76, 0xDC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
993 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30,
994 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
995 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30,
996 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00,
997 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C,
998 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00,
999 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C,
1000 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00,
1001 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1002 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1003 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1004 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
1005 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1006 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1007 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
1009 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
1010 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
1011 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1012 0xD6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00,
1013 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18,
1014 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00,
1015 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C,
1016 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00,
1017 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06,
1018 0x3C, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1019 0x00, 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C,
1020 0xCC, 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
1021 0x00, 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0,
1022 0xFC, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1023 0x00, 0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0,
1024 0xFC, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1025 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C,
1026 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00,
1027 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1028 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1029 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1030 0x7E, 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00,
1031 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1032 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
1033 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1034 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00,
1035 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60,
1036 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00,
1037 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1038 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1039 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C,
1040 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00,
1041 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C,
1042 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00,
1043 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE,
1044 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00,
1045 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6,
1046 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1047 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1048 0x7C, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00,
1049 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1050 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00,
1051 0x00, 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66,
1052 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00,
1053 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68,
1054 0x78, 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00,
1055 0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68,
1056 0x78, 0x68, 0x60, 0x60, 0xF0, 0x00, 0x00,
1057 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1058 0xC0, 0xDE, 0xC6, 0x66, 0x3A, 0x00, 0x00,
1059 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1060 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1061 0x00, 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18,
1062 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1063 0x00, 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C,
1064 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1065 0x00, 0x00, 0x00, 0xE6, 0x66, 0x6C, 0x6C,
1066 0x78, 0x6C, 0x6C, 0x66, 0xE6, 0x00, 0x00,
1067 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60,
1068 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00,
1069 0x00, 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xD6,
1070 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1071 0x00, 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE,
1072 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1073 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1074 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1075 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1076 0x7C, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00,
1077 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1078 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x0E, 0x00,
1079 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66,
1080 0x7C, 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00,
1081 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60,
1082 0x38, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1083 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x5A, 0x18,
1084 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1085 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1086 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1087 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1088 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00,
1089 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1090 0xD6, 0xD6, 0xFE, 0x6C, 0x6C, 0x00, 0x00,
1091 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7C,
1092 0x38, 0x7C, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1093 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1094 0x3C, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1095 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x8C, 0x18,
1096 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00,
1097 0x00, 0x00, 0x00, 0x3C, 0x30, 0x30, 0x30,
1098 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00,
1099 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70,
1100 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00,
1101 0x00, 0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C,
1102 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x00,
1103 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
1104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1106 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1107 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
1110 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1111 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x78,
1112 0x6C, 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00,
1113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1114 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1115 0x00, 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C,
1116 0x6C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1118 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1119 0x00, 0x00, 0x00, 0x1C, 0x36, 0x32, 0x30,
1120 0x7C, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00,
1121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1122 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x78,
1123 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C,
1124 0x76, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00,
1125 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x38,
1126 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1127 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E,
1128 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C,
1129 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66,
1130 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00,
1131 0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18,
1132 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC,
1134 0xFE, 0xD6, 0xD6, 0xD6, 0xD6, 0x00, 0x00,
1135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1136 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00,
1137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1138 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1140 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xF0,
1141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1142 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
1143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC,
1144 0x76, 0x66, 0x60, 0x60, 0xF0, 0x00, 0x00,
1145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1146 0xC6, 0x70, 0x1C, 0xC6, 0x7C, 0x00, 0x00,
1147 0x00, 0x00, 0x00, 0x10, 0x30, 0x30, 0xFC,
1148 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00,
1149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC,
1150 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1152 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00,
1153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1154 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00,
1155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1156 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00,
1157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6,
1158 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
1159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1160 0xCC, 0x18, 0x30, 0x66, 0xFE, 0x00, 0x00,
1161 0x00, 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18,
1162 0x70, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00,
1163 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1164 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
1165 0x00, 0x00, 0x00, 0x70, 0x18, 0x18, 0x18,
1166 0x0E, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00,
1167 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
1170 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00, 0x00,
1171 0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0,
1172 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x18, 0x70,
1173 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0xCC,
1174 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1175 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x7C,
1176 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1177 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x78,
1178 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1179 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x78,
1180 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1181 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 0x78,
1182 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1183 0x00, 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78,
1184 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
1186 0xC6, 0xC0, 0xC0, 0xC6, 0x7C, 0x18, 0x70,
1187 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C,
1188 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1189 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x7C,
1190 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1191 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C,
1192 0xC6, 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00,
1193 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x38,
1194 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1195 0x00, 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38,
1196 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1197 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x38,
1198 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1199 0x00, 0xC6, 0x00, 0x10, 0x38, 0x6C, 0xC6,
1200 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1201 0x38, 0x6C, 0x38, 0x10, 0x38, 0x6C, 0xC6,
1202 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1203 0x0C, 0x18, 0x00, 0xFE, 0x66, 0x62, 0x68,
1204 0x78, 0x68, 0x62, 0x66, 0xFE, 0x00, 0x00,
1205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC,
1206 0x36, 0x76, 0xDC, 0xD8, 0x6E, 0x00, 0x00,
1207 0x00, 0x00, 0x00, 0x3E, 0x6C, 0xCC, 0xCC,
1208 0xFE, 0xCC, 0xCC, 0xCC, 0xCE, 0x00, 0x00,
1209 0x00, 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C,
1210 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1211 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x7C,
1212 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1213 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C,
1214 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1215 0x00, 0x00, 0x30, 0x78, 0xCC, 0x00, 0xCC,
1216 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1217 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 0xCC,
1218 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1219 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0xC6,
1220 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C,
1221 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1222 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1223 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6,
1224 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1225 0x00, 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6,
1226 0xC0, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
1227 0x00, 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60,
1228 0xF0, 0x60, 0x60, 0x66, 0xFC, 0x00, 0x00,
1229 0x00, 0x00, 0x00, 0x66, 0x66, 0x3C, 0x18,
1230 0x7E, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
1231 0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x7C,
1232 0x62, 0x66, 0x6F, 0x66, 0xF3, 0x00, 0x00,
1233 0x00, 0x00, 0x00, 0x0E, 0x1B, 0x18, 0x18,
1234 0x7E, 0x18, 0x18, 0xD8, 0x70, 0x00, 0x00,
1235 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78,
1236 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1237 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x38,
1238 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00,
1239 0x00, 0x00, 0x06, 0x0C, 0x18, 0x00, 0x7C,
1240 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1241 0x00, 0x00, 0x0C, 0x18, 0x30, 0x00, 0xCC,
1242 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00,
1243 0x00, 0x00, 0x00, 0x76, 0xDC, 0x00, 0xDC,
1244 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00,
1245 0x76, 0xDC, 0x00, 0xC6, 0xE6, 0xF6, 0xFE,
1246 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00,
1247 0x00, 0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x36,
1248 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1249 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
1250 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00,
1251 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30,
1252 0x30, 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1254 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
1255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1256 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00,
1257 0x00, 0x60, 0xE0, 0x63, 0x66, 0x6C, 0x18,
1258 0x30, 0x6E, 0xC3, 0x06, 0x0C, 0x1F, 0x00,
1259 0x00, 0x60, 0xE0, 0x63, 0x66, 0x6C, 0x18,
1260 0x36, 0x6E, 0xDA, 0x3F, 0x06, 0x06, 0x00,
1261 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18,
1262 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00,
1263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1264 0x36, 0x6C, 0xD8, 0x6C, 0x36, 0x00, 0x00,
1265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1266 0xD8, 0x6C, 0x36, 0x6C, 0xD8, 0x00, 0x00,
1267 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11,
1268 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1269 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1270 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
1271 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD,
1272 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1273 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1274 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1275 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1276 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1277 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18,
1278 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1279 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1280 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1282 0xFE, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1283 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18,
1284 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1285 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06,
1286 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1287 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1288 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1289 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06,
1290 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1291 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06,
1292 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1293 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1294 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1295 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18,
1296 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1298 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1299 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1300 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1301 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1302 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1304 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1305 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1306 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1308 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1309 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1310 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1311 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18,
1312 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1313 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1314 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1315 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30,
1316 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1317 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30,
1318 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1319 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00,
1320 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1321 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1322 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1323 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30,
1324 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1325 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1326 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1327 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00,
1328 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1329 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00,
1330 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1331 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1332 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1333 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
1334 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1336 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1337 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1338 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1339 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18,
1340 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1341 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18,
1342 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1344 0x3F, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1345 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1346 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1347 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18,
1348 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1349 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1350 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1352 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1353 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1354 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1356 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1357 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1358 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1359 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1360 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1361 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1364 0xDC, 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00,
1365 0x00, 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8,
1366 0xCC, 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00,
1367 0x00, 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC0,
1368 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00,
1369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1370 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00,
1371 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x60, 0x30,
1372 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00,
1373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1374 0xD8, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00,
1375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66,
1376 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
1377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76,
1378 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00,
1379 0x00, 0x00, 0x00, 0x7E, 0x18, 0x3C, 0x66,
1380 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00,
1381 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1382 0xFE, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00,
1383 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1384 0xC6, 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00,
1385 0x00, 0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C,
1386 0x3E, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00,
1387 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB,
1388 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1389 0x00, 0x00, 0x00, 0x03, 0x06, 0x7E, 0xDB,
1390 0xDB, 0xF3, 0x7E, 0x60, 0xC0, 0x00, 0x00,
1391 0x00, 0x00, 0x00, 0x1E, 0x30, 0x60, 0x60,
1392 0x7E, 0x60, 0x60, 0x30, 0x1E, 0x00, 0x00,
1393 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6,
1394 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00,
1395 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
1396 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
1397 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1398 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
1399 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06,
1400 0x0C, 0x18, 0x30, 0x00, 0x7E, 0x00, 0x00,
1401 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60,
1402 0x30, 0x18, 0x0C, 0x00, 0x7E, 0x00, 0x00,
1403 0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18,
1404 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1405 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1406 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00,
1407 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
1408 0x7E, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
1409 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1410 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1411 0x00, 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38,
1412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1414 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1416 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1417 0x00, 0x00, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C,
1418 0x0C, 0xEC, 0x6C, 0x3C, 0x1C, 0x00, 0x00,
1419 0x00, 0x00, 0x00, 0x6C, 0x36, 0x36, 0x36,
1420 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
1421 0x00, 0x00, 0x00, 0x3C, 0x66, 0x0C, 0x18,
1422 0x32, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1423 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E,
1424 0x7E, 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00,
1425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1427 };
1428
1429 static CONST UCHAR Font8x16[VGA_FONT_CHARACTERS * 16] =
1430 {
1431 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1432 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1433 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD,
1434 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00,
1435 0x00, 0x00, 0x7C, 0xFE, 0xFE, 0xD6, 0xFE, 0xFE,
1436 0xBA, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00,
1437 0x00, 0x00, 0x00, 0x6C, 0xEE, 0xFE, 0xFE, 0xFE,
1438 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1439 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C,
1440 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1441 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x10, 0x6C,
1442 0xEE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
1443 0x00, 0x00, 0x10, 0x38, 0x7C, 0x7C, 0xFE, 0xFE,
1444 0xFE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
1445 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C,
1446 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1447 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3,
1448 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1449 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x66, 0x66,
1450 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1451 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0x99, 0x99,
1452 0x99, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1453 0x00, 0x00, 0x1E, 0x0E, 0x1E, 0x36, 0x78, 0xCC,
1454 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1455 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18,
1456 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1457 0x00, 0x00, 0x1E, 0x1A, 0x1E, 0x18, 0x18, 0x18,
1458 0x18, 0x78, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00,
1459 0x00, 0x00, 0x3E, 0x36, 0x3E, 0x36, 0x36, 0x76,
1460 0xF6, 0x66, 0x0E, 0x1E, 0x0C, 0x00, 0x00, 0x00,
1461 0x00, 0x00, 0x18, 0xDB, 0x7E, 0x3C, 0x66, 0x66,
1462 0x3C, 0x7E, 0xDB, 0x18, 0x00, 0x00, 0x00, 0x00,
1463 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xFE,
1464 0xFC, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00,
1465 0x00, 0x00, 0x00, 0x02, 0x0E, 0x3E, 0x7E, 0xFE,
1466 0x7E, 0x3E, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00,
1467 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1468 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1469 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
1470 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1471 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0xDB, 0x7B,
1472 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00,
1473 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x7C, 0xF6,
1474 0xDE, 0x7C, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
1475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1476 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00,
1477 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1478 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1479 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
1480 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1481 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1482 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1483 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0xFF,
1484 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1485 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xFE,
1486 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1487 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
1488 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1489 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF,
1490 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1491 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x7C,
1492 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1493 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x7C,
1494 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
1495 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1496 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1497 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x3C, 0x18,
1498 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1499 0x00, 0x36, 0x36, 0x36, 0x36, 0x14, 0x00, 0x00,
1500 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1501 0x00, 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C,
1502 0xFE, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1503 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0x78,
1504 0x3C, 0x06, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
1505 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x66, 0x0C,
1506 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00, 0x00, 0x00,
1507 0x00, 0x00, 0x38, 0x6C, 0x38, 0x30, 0x76, 0x7E,
1508 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1509 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1510 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1511 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30,
1512 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1513 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C,
1514 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1515 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x38, 0xFE,
1516 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1517 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E,
1518 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1519 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1520 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1521 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1522 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1523 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1524 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1525 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
1526 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
1527 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xCE, 0xDE, 0xF6,
1528 0xE6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1529 0x00, 0x00, 0x18, 0x78, 0x18, 0x18, 0x18, 0x18,
1530 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1531 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x06, 0x0C, 0x18,
1532 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1533 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06,
1534 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1535 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xCC,
1536 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00,
1537 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06,
1538 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1539 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xFC, 0xC6,
1540 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1541 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C, 0x18, 0x30,
1542 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
1543 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6,
1544 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1545 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E,
1546 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1547 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1548 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1549 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1550 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1551 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0xC0,
1552 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1553 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
1554 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1555 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06,
1556 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
1557 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18,
1558 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1559 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xDE, 0xDE,
1560 0xDE, 0xDC, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00,
1561 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE,
1562 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1563 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66,
1564 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1565 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0,
1566 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1567 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66,
1568 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,
1569 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1570 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1571 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1572 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1573 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0,
1574 0xCE, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1575 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6,
1576 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1577 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1578 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1579 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1580 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1581 0x00, 0x00, 0xC6, 0xC6, 0xCC, 0xD8, 0xF0, 0xF0,
1582 0xD8, 0xCC, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1583 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60,
1584 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1585 0x00, 0x00, 0xC6, 0xC6, 0xEE, 0xEE, 0xFE, 0xD6,
1586 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1587 0x00, 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xF6, 0xDE,
1588 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1589 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1590 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1591 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x66, 0x7C,
1592 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1593 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1594 0xC6, 0xD6, 0xD6, 0x7C, 0x06, 0x00, 0x00, 0x00,
1595 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x78,
1596 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1597 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0x70, 0x1C,
1598 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1599 0x00, 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18,
1600 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1601 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1602 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1603 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1604 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1605 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6,
1606 0xFE, 0xEE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1607 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x38,
1608 0x6C, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1609 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C,
1610 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1611 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30,
1612 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1613 0x00, 0x00, 0x7C, 0x60, 0x60, 0x60, 0x60, 0x60,
1614 0x60, 0x60, 0x60, 0x7C, 0x00, 0x00, 0x00, 0x00,
1615 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30,
1616 0x18, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1617 0x00, 0x00, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
1618 0x0C, 0x0C, 0x0C, 0x7C, 0x00, 0x00, 0x00, 0x00,
1619 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00,
1620 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1622 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
1623 0x00, 0x18, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x00,
1624 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1625 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1626 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1627 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1628 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1629 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1630 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1631 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC,
1632 0xCC, 0xCC, 0xCC, 0x7E, 0x00, 0x00, 0x00, 0x00,
1633 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1634 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1635 0x00, 0x00, 0x1C, 0x36, 0x30, 0x30, 0xFC, 0x30,
1636 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00,
1637 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCE, 0xC6,
1638 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1639 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1640 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1641 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18,
1642 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1643 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x0C,
1644 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1645 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x66, 0x6C,
1646 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1647 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1648 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00,
1649 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xD6,
1650 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1651 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1652 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1653 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1654 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1655 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1656 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x00,
1657 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC,
1658 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
1659 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x60,
1660 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1661 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1662 0x7C, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1663 0x00, 0x00, 0x30, 0x30, 0x30, 0xFC, 0x30, 0x30,
1664 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,
1665 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC,
1666 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1667 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1668 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1669 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6,
1670 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00,
1671 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x6C,
1672 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1673 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1674 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1675 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x86, 0x0C,
1676 0x18, 0x30, 0x62, 0xFE, 0x00, 0x00, 0x00, 0x00,
1677 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18,
1678 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00,
1679 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
1680 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1681 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18,
1682 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
1683 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1684 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1685 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
1686 0x6C, 0x6C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1687 0x00, 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0xC6,
1688 0x66, 0x3C, 0x18, 0x0C, 0xCC, 0x38, 0x00, 0x00,
1689 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1690 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1691 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1692 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1693 0x00, 0x30, 0x78, 0xCC, 0x00, 0x78, 0x0C, 0x7C,
1694 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1695 0x00, 0x00, 0xCC, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1696 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1697 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C,
1698 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1699 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78, 0x0C, 0x7C,
1700 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1701 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0,
1702 0xC6, 0x7C, 0x18, 0x0C, 0x6C, 0x38, 0x00, 0x00,
1703 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1704 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1705 0x00, 0x00, 0xCC, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1706 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1707 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1708 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1709 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
1710 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1711 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18,
1712 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1713 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18,
1714 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1715 0x00, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6,
1716 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1717 0x38, 0x6C, 0x38, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1718 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1719 0x0C, 0x18, 0x30, 0x00, 0xFE, 0x60, 0x60, 0x7C,
1720 0x60, 0x60, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00,
1721 0x00, 0x00, 0x00, 0x00, 0x66, 0xDB, 0x1B, 0x7F,
1722 0xD8, 0xD8, 0xDF, 0x76, 0x00, 0x00, 0x00, 0x00,
1723 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xD8, 0xFE,
1724 0xD8, 0xD8, 0xD8, 0xDE, 0x00, 0x00, 0x00, 0x00,
1725 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1726 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1727 0x00, 0x00, 0xC6, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1728 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1729 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1730 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1731 0x00, 0x30, 0x78, 0xCC, 0x00, 0xC6, 0xC6, 0xC6,
1732 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1733 0x00, 0x60, 0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6,
1734 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1735 0x00, 0x18, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18,
1736 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1737 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6,
1738 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1739 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1740 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1741 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0xC0,
1742 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1743 0x00, 0x38, 0x6C, 0x60, 0x60, 0xF0, 0x60, 0x60,
1744 0x60, 0x66, 0xF6, 0x6C, 0x00, 0x00, 0x00, 0x00,
1745 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E,
1746 0x18, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1747 0x00, 0x00, 0x3E, 0x63, 0x63, 0x30, 0x1C, 0x06,
1748 0x63, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1749 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x63, 0x38,
1750 0x0E, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1751 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78, 0x0C, 0x7C,
1752 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1753 0x00, 0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18,
1754 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1755 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1756 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1757 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC,
1758 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1759 0x00, 0x00, 0x76, 0xDC, 0x00, 0xBC, 0x66, 0x66,
1760 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1761 0x00, 0x76, 0xDC, 0x00, 0xC6, 0xC6, 0xE6, 0xF6,
1762 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1763 0x00, 0x21, 0x1E, 0x00, 0x1E, 0x33, 0x60, 0x60,
1764 0x67, 0x63, 0x33, 0x1D, 0x00, 0x00, 0x00, 0x00,
1765 0x00, 0x42, 0x3C, 0x00, 0x3B, 0x66, 0x66, 0x66,
1766 0x3E, 0x06, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1767 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30,
1768 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1769 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1770 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
1771 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1772 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
1773 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x30,
1774 0x60, 0xDC, 0x36, 0x0C, 0x18, 0x3E, 0x00, 0x00,
1775 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x36,
1776 0x6E, 0xDE, 0x36, 0x7E, 0x06, 0x06, 0x00, 0x00,
1777 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x3C,
1778 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1779 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6C, 0xD8,
1780 0x6C, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1781 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x6C, 0x36,
1782 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1783 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1784 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1785 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1786 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1787 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1788 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1789 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1790 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1791 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1792 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1793 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1794 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1795 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6,
1796 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1797 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1798 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1799 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8,
1800 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1801 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xF6,
1802 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1803 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1804 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1805 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6,
1806 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1807 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xFE,
1808 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1809 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE,
1810 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1811 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1812 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1813 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
1814 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1815 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1816 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1817 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1818 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1819 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1820 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1821 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1822 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1823 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1824 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1825 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1826 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1827 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1828 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1829 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
1830 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1831 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3F,
1832 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1833 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37,
1834 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1835 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF,
1836 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1837 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7,
1838 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1839 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37,
1840 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1841 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1843 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7,
1844 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1845 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF,
1846 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1847 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1848 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1849 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1850 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1851 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1852 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1853 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F,
1854 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1855 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1856 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1857 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F,
1858 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1859 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
1860 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1861 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1862 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1863 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF,
1864 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1865 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1866 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1867 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
1868 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1869 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1870 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1871 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1872 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1873 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1874 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1875 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1876 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1877 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1878 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1879 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0xD8, 0xD8,
1880 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1881 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8, 0xFC, 0xC6,
1882 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00, 0x00, 0x00,
1883 0x00, 0x00, 0xFE, 0x66, 0x62, 0x60, 0x60, 0x60,
1884 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00,
1885 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x6C, 0x6C,
1886 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1887 0x00, 0x00, 0xFE, 0xC6, 0x62, 0x30, 0x18, 0x18,
1888 0x30, 0x62, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1889 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xCC,
1890 0xCC, 0xCC, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1891 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1892 0x66, 0x7C, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
1893 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18,
1894 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1895 0x00, 0x00, 0xFE, 0x38, 0x38, 0x6C, 0xC6, 0xC6,
1896 0x6C, 0x38, 0x38, 0xFE, 0x00, 0x00, 0x00, 0x00,
1897 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE,
1898 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
1899 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6,
1900 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00, 0x00, 0x00,
1901 0x00, 0x00, 0x3E, 0x60, 0x60, 0x3C, 0x66, 0xC6,
1902 0xC6, 0xC6, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1903 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB,
1904 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1905 0x00, 0x00, 0x02, 0x06, 0x7C, 0xCE, 0xDE, 0xF6,
1906 0xF6, 0x7C, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00,
1907 0x00, 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C,
1908 0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00,
1909 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1910 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1911 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE,
1912 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1913 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1914 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1915 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18,
1916 0x30, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1917 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18,
1918 0x0C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1919 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1E, 0x1A, 0x18,
1920 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1921 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1922 0x18, 0x18, 0x58, 0x78, 0x30, 0x00, 0x00, 0x00,
1923 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E,
1924 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1925 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1926 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1927 0x00, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1928 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1929 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1930 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1931 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1932 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1933 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18,
1934 0xD8, 0xD8, 0x78, 0x38, 0x18, 0x00, 0x00, 0x00,
1935 0x00, 0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
1936 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1937 0x00, 0x00, 0x70, 0xD8, 0x18, 0x30, 0x60, 0xF8,
1938 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1939 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E,
1940 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1941 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1942 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1943 };
1944
1945 /* PRIVATE FUNCTIONS **********************************************************/
1946
1947 static BOOLEAN VidBiosScrollWindow(SCROLL_DIRECTION Direction,
1948 DWORD Amount,
1949 SMALL_RECT Rectangle,
1950 BYTE Page,
1951 BYTE FillAttribute)
1952 {
1953 INT i, j;
1954 DWORD VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Page * Bda->VideoPageSize);
1955 WORD FillCharacter = MAKEWORD(' ', FillAttribute);
1956
1957 WORD WindowWidth, WindowHeight;
1958
1959 /* Fixup the rectangle if needed */
1960 Rectangle.Left = min(max(Rectangle.Left , 0), Bda->ScreenColumns - 1);
1961 Rectangle.Right = min(max(Rectangle.Right , 0), Bda->ScreenColumns - 1);
1962 Rectangle.Top = min(max(Rectangle.Top , 0), Bda->ScreenRows);
1963 Rectangle.Bottom = min(max(Rectangle.Bottom, 0), Bda->ScreenRows);
1964
1965 WindowWidth = Rectangle.Right - Rectangle.Left + 1;
1966 WindowHeight = Rectangle.Bottom - Rectangle.Top + 1;
1967
1968 /* Amount == 0 means we clear all the rectangle */
1969 if ((Amount == 0) ||
1970 (((Direction == SCROLL_UP ) || (Direction == SCROLL_DOWN )) && (Amount >= WindowHeight)) ||
1971 (((Direction == SCROLL_LEFT) || (Direction == SCROLL_RIGHT)) && (Amount >= WindowWidth )))
1972 {
1973 /* Fill the rectangle */
1974 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
1975 {
1976 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
1977 {
1978 EmulatorWriteMemory(&EmulatorContext,
1979 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
1980 (LPVOID)&FillCharacter,
1981 sizeof(FillCharacter));
1982 }
1983 }
1984
1985 return TRUE;
1986 }
1987
1988 switch (Direction)
1989 {
1990 case SCROLL_UP:
1991 {
1992 /* Move text lines up */
1993 for (i = Rectangle.Top + Amount; i <= Rectangle.Bottom; i++)
1994 {
1995 EmulatorWriteMemory(&EmulatorContext,
1996 VideoAddress + ((i - Amount) * Bda->ScreenColumns + Rectangle.Left) * sizeof(WORD),
1997 REAL_TO_PHYS(VideoAddress + ( i * Bda->ScreenColumns + Rectangle.Left) * sizeof(WORD)),
1998 (Rectangle.Right - Rectangle.Left + 1) * sizeof(WORD));
1999 }
2000
2001 /* Fill the bottom of the rectangle */
2002 for (i = Rectangle.Bottom - Amount + 1; i <= Rectangle.Bottom; i++)
2003 {
2004 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
2005 {
2006 EmulatorWriteMemory(&EmulatorContext,
2007 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2008 (LPVOID)&FillCharacter,
2009 sizeof(FillCharacter));
2010 }
2011 }
2012
2013 break;
2014 }
2015
2016 case SCROLL_DOWN:
2017 {
2018 INT Bottom;
2019
2020 /* Move text lines down */
2021 for (i = Rectangle.Bottom - Amount; i >= Rectangle.Top; i--)
2022 {
2023 EmulatorWriteMemory(&EmulatorContext,
2024 VideoAddress + ((i + Amount) * Bda->ScreenColumns + Rectangle.Left) * sizeof(WORD),
2025 REAL_TO_PHYS(VideoAddress + ( i * Bda->ScreenColumns + Rectangle.Left) * sizeof(WORD)),
2026 (Rectangle.Right - Rectangle.Left + 1) * sizeof(WORD));
2027 }
2028
2029 /* Fill the top of the rectangle */
2030 Bottom = Rectangle.Top + Amount - 1;
2031 for (i = Rectangle.Top; i <= Bottom; i++)
2032 {
2033 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
2034 {
2035 EmulatorWriteMemory(&EmulatorContext,
2036 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2037 (LPVOID)&FillCharacter,
2038 sizeof(FillCharacter));
2039 }
2040 }
2041
2042 break;
2043 }
2044
2045 case SCROLL_LEFT:
2046 {
2047 /* Move text lines left */
2048 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2049 {
2050 EmulatorWriteMemory(&EmulatorContext,
2051 VideoAddress + (i * Bda->ScreenColumns + Rectangle.Left ) * sizeof(WORD),
2052 REAL_TO_PHYS(VideoAddress + (i * Bda->ScreenColumns + Rectangle.Left + Amount) * sizeof(WORD)),
2053 (Rectangle.Right - Rectangle.Left - Amount + 1) * sizeof(WORD));
2054 }
2055
2056 /* Fill the right of the rectangle */
2057 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2058 {
2059 for (j = Rectangle.Right - Amount + 1; j <= Rectangle.Right; j++)
2060 {
2061 EmulatorWriteMemory(&EmulatorContext,
2062 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2063 (LPVOID)&FillCharacter,
2064 sizeof(FillCharacter));
2065 }
2066 }
2067
2068 break;
2069 }
2070
2071 case SCROLL_RIGHT:
2072 {
2073 /* Move text lines right */
2074 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2075 {
2076 EmulatorWriteMemory(&EmulatorContext,
2077 VideoAddress + (i * Bda->ScreenColumns + Rectangle.Left + Amount) * sizeof(WORD),
2078 REAL_TO_PHYS(VideoAddress + (i * Bda->ScreenColumns + Rectangle.Left ) * sizeof(WORD)),
2079 (Rectangle.Right - Rectangle.Left - Amount + 1) * sizeof(WORD));
2080 }
2081
2082 /* Fill the left of the rectangle */
2083 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2084 {
2085 INT Right = Rectangle.Left + Amount - 1;
2086 for (j = Rectangle.Left; j <= Right; j++)
2087 {
2088 EmulatorWriteMemory(&EmulatorContext,
2089 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2090 (LPVOID)&FillCharacter,
2091 sizeof(FillCharacter));
2092 }
2093 }
2094
2095 break;
2096 }
2097 }
2098
2099 return TRUE;
2100 }
2101
2102 static __inline VOID VgaSetSinglePaletteRegister(BYTE Index, BYTE Value)
2103 {
2104 /* Write the index */
2105 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2106 IOWriteB(VGA_AC_INDEX, Index);
2107
2108 /* Write the data */
2109 IOWriteB(VGA_AC_WRITE, Value);
2110 }
2111
2112 static BOOLEAN VgaSetRegisters(PVGA_REGISTERS Registers)
2113 {
2114 INT i;
2115
2116 if (Registers == NULL) return FALSE;
2117
2118 /* Disable interrupts */
2119 setIF(0);
2120
2121 /*
2122 * Set the CRT base address according to the selected mode,
2123 * monochrome or color. The following macros:
2124 * VGA_INSTAT1_READ, VGA_CRTC_INDEX and VGA_CRTC_DATA are then
2125 * used to access the correct VGA I/O ports.
2126 */
2127 Bda->CrtBasePort = (Registers->Misc & 0x01) ? VGA_CRTC_INDEX_COLOR
2128 : VGA_CRTC_INDEX_MONO;
2129 /* Bit 1 indicates whether display is color (0) or monochrome (1) */
2130 Bda->VGAOptions = (Bda->VGAOptions & 0xFD) | (!(Registers->Misc & 0x01) << 1);
2131
2132 /* Turn the video off */
2133 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_CLOCK_REG);
2134 IOWriteB(VGA_SEQ_DATA , IOReadB(VGA_SEQ_DATA) | VGA_SEQ_CLOCK_SD);
2135
2136 /* Write the misc register */
2137 IOWriteB(VGA_MISC_WRITE, Registers->Misc);
2138
2139 /* Synchronous reset on */
2140 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_RESET_REG);
2141 IOWriteB(VGA_SEQ_DATA , VGA_SEQ_RESET_AR );
2142
2143 /* Write the sequencer registers */
2144 for (i = 1; i < VGA_SEQ_MAX_REG; i++)
2145 {
2146 IOWriteB(VGA_SEQ_INDEX, i);
2147 IOWriteB(VGA_SEQ_DATA , Registers->Sequencer[i]);
2148 }
2149
2150 /* Synchronous reset off */
2151 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_RESET_REG);
2152 IOWriteB(VGA_SEQ_DATA , VGA_SEQ_RESET_SR | VGA_SEQ_RESET_AR);
2153
2154 /* Unlock CRTC registers 0-7 */
2155 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_END_HORZ_BLANKING_REG);
2156 IOWriteB(VGA_CRTC_DATA , IOReadB(VGA_CRTC_DATA) | 0x80);
2157 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_VERT_RETRACE_END_REG);
2158 IOWriteB(VGA_CRTC_DATA , IOReadB(VGA_CRTC_DATA) & ~0x80);
2159 // Make sure they remain unlocked
2160 Registers->CRT[VGA_CRTC_END_HORZ_BLANKING_REG] |= 0x80;
2161 Registers->CRT[VGA_CRTC_VERT_RETRACE_END_REG] &= ~0x80;
2162
2163 /* Write the CRTC registers */
2164 for (i = 0; i < VGA_CRTC_MAX_REG; i++)
2165 {
2166 IOWriteB(VGA_CRTC_INDEX, i);
2167 IOWriteB(VGA_CRTC_DATA , Registers->CRT[i]);
2168 }
2169
2170 /* Write the GC registers */
2171 for (i = 0; i < VGA_GC_MAX_REG; i++)
2172 {
2173 IOWriteB(VGA_GC_INDEX, i);
2174 IOWriteB(VGA_GC_DATA , Registers->Graphics[i]);
2175 }
2176
2177 /* Write the AC registers */
2178 for (i = 0; i < VGA_AC_MAX_REG; i++)
2179 {
2180 VgaSetSinglePaletteRegister(i, Registers->Attribute[i]);
2181 }
2182
2183 /* Set the PEL mask */
2184 IOWriteB(VGA_DAC_MASK, 0xFF);
2185
2186 /* Enable screen and disable palette access */
2187 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2188 IOWriteB(VGA_AC_INDEX, 0x20);
2189
2190 /* Turn the video on */
2191 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_CLOCK_REG);
2192 IOWriteB(VGA_SEQ_DATA , IOReadB(VGA_SEQ_DATA) & ~VGA_SEQ_CLOCK_SD);
2193
2194 /* Enable interrupts */
2195 setIF(1);
2196
2197 return TRUE;
2198 }
2199
2200 static VOID VgaSetPalette(const COLORREF* Palette, ULONG Size)
2201 {
2202 ULONG i;
2203
2204 // /* Disable screen and enable palette access */
2205 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2206 // IOWriteB(VGA_AC_INDEX, 0x00);
2207
2208 for (i = 0; i < Size; i++)
2209 {
2210 IOWriteB(VGA_DAC_WRITE_INDEX, i);
2211 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetRValue(Palette[i])));
2212 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetGValue(Palette[i])));
2213 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetBValue(Palette[i])));
2214 }
2215
2216 /* The following step might be optional */
2217 for (i = Size; i < VGA_MAX_COLORS; i++)
2218 {
2219 IOWriteB(VGA_DAC_WRITE_INDEX, i);
2220 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
2221 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
2222 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
2223 }
2224
2225 /* Enable screen and disable palette access */
2226 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2227 // IOWriteB(VGA_AC_INDEX, 0x20);
2228 }
2229
2230 static VOID VgaChangePalette(BYTE ModeNumber)
2231 {
2232 const COLORREF* Palette;
2233 ULONG Size;
2234
2235 if (ModeNumber >= 0x13)
2236 {
2237 /* VGA modes */
2238 Palette = VgaPalette;
2239 Size = ARRAYSIZE(VgaPalette);
2240 }
2241 else if (ModeNumber == 0x10) // || (ModeNumber == 0x0D) || (ModeNumber == 0x0E)
2242 {
2243 /* EGA HiRes mode */
2244 Palette = EgaPalette__HiRes;
2245 Size = ARRAYSIZE(EgaPalette__HiRes);
2246 }
2247 #if 0
2248 else if ((ModeNumber == 0x04) || (ModeNumber == 0x05))
2249 {
2250 /*
2251 * CGA modes; this palette contains both normal and
2252 * bright versions of CGA palettes 0 and 1
2253 */
2254 Palette = CgaPalette2;
2255 Size = ARRAYSIZE(CgaPalette2);
2256 }
2257 #endif
2258 else // if ((ModeNumber == 0x0D) || (ModeNumber == 0x0E))
2259 {
2260 /* EGA modes */
2261 Palette = EgaPalette__16Colors;
2262 Size = ARRAYSIZE(EgaPalette__16Colors);
2263 }
2264
2265 VgaSetPalette(Palette, Size);
2266 }
2267
2268 static VOID VidBiosGetCursorPosition(PBYTE Row, PBYTE Column, BYTE Page)
2269 {
2270 /* Make sure the selected video page is valid */
2271 if (Page >= BIOS_MAX_PAGES) return;
2272
2273 /* Get the cursor location */
2274 *Row = HIBYTE(Bda->CursorPosition[Page]);
2275 *Column = LOBYTE(Bda->CursorPosition[Page]);
2276 }
2277
2278 static VOID VidBiosSetCursorPosition(BYTE Row, BYTE Column, BYTE Page)
2279 {
2280 /* Make sure the selected video page is valid */
2281 if (Page >= BIOS_MAX_PAGES) return;
2282
2283 /* Update the position in the BDA */
2284 Bda->CursorPosition[Page] = MAKEWORD(Column, Row);
2285
2286 /* Check if this is the current video page */
2287 if (Page == Bda->VideoPage)
2288 {
2289 WORD Offset = Row * Bda->ScreenColumns + Column;
2290
2291 /* Modify the CRTC registers */
2292 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_LOW_REG);
2293 IOWriteB(VGA_CRTC_DATA , LOBYTE(Offset));
2294 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_HIGH_REG);
2295 IOWriteB(VGA_CRTC_DATA , HIBYTE(Offset));
2296 }
2297 }
2298
2299 static VOID VidBiosSetCursorShape(WORD CursorStartEnd)
2300 {
2301 /* Only valid in text-mode */
2302 if ((Bda->VideoMode > 0x03) && (Bda->VideoMode != 0x07)) return;
2303
2304 /* Update the BDA */
2305 Bda->CursorStartLine = HIBYTE(CursorStartEnd) & 0x1F;
2306 Bda->CursorEndLine = LOBYTE(CursorStartEnd) & 0x1F;
2307
2308 /*
2309 * In cursor emulation mode, we suppose the cursor scanlines
2310 * to be in CGA mode, so that we need to adjust them
2311 *
2312 * WARNING!!
2313 * =========
2314 * Contrary to what is mentioned in lots of literature out there, e.g. in:
2315 * http://webpages.charter.net/danrollins/techhelp/0072.HTM
2316 * http://www.bioscentral.com/misc/bda.htm
2317 * and in other various places, bit 0 of Bda->VGAOptions is 0 when
2318 * cursor emulation is ENABLED, and is 1 when it is DISABLED.
2319 *
2320 * The following documentation is right about this fact:
2321 * http://www.cs.nyu.edu/~mwalfish/classes/ut/s12-cs372h/ref/hardware/vgadoc/VGABIOS.TXT
2322 * https://sites.google.com/site/pcdosretro/biosdata
2323 *
2324 * A proof that it is OK is that in the following code samples it is
2325 * explicitely mentioned that setting bit 0 disables cursor emulation:
2326 * - Code snippets in PC Magazine vol.5 num.15 of 16/09/1986, p.291-292;
2327 * - CardFile DOS utility (Jeff Prosise, PC Magazine vol.6 num.17 of 13/10/1987, p.403-416):
2328 * https://ia600700.us.archive.org/1/items/srccode-00000020/cardfile.asm.txt
2329 * (function 'show_cursor', "or ega_info,1 ;disable EGA cursor emulation")
2330 */
2331 if (!(Bda->VGAOptions & 0x01))
2332 {
2333 // HACK: Quick "fix" for cursor scanline adjustment. This must be reworked.
2334 DPRINT1("HACK: Using HACK for cursor scanlines adjustment\n");
2335 CursorStartEnd = MAKEWORD((LOBYTE(CursorStartEnd) & 0x1F) * 2,
2336 (HIBYTE(CursorStartEnd) & 0x1F) * 2 | (HIBYTE(CursorStartEnd) & 0xE0));
2337 }
2338
2339 /* Modify the CRTC registers */
2340 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_START_REG);
2341 IOWriteB(VGA_CRTC_DATA , HIBYTE(CursorStartEnd));
2342 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_END_REG);
2343 IOWriteB(VGA_CRTC_DATA , LOBYTE(CursorStartEnd));
2344 }
2345
2346 VOID VidBiosSyncCursorPosition(VOID)
2347 {
2348 BYTE Row, Column;
2349 BYTE Low, High;
2350 SHORT ScreenColumns = VgaGetDisplayResolution().X;
2351 WORD Offset;
2352
2353 /* Get the cursor location */
2354 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_LOW_REG);
2355 Low = IOReadB(VGA_CRTC_DATA);
2356 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_HIGH_REG);
2357 High = IOReadB(VGA_CRTC_DATA);
2358
2359 Offset = MAKEWORD(Low, High);
2360
2361 Row = (BYTE)(Offset / ScreenColumns);
2362 Column = (BYTE)(Offset % ScreenColumns);
2363
2364 /* Synchronize our cursor position with VGA */
2365 VidBiosSetCursorPosition(Row, Column, Bda->VideoPage);
2366 }
2367
2368 static inline BYTE VidBiosGetVideoMode(VOID)
2369 {
2370 /* Bit 7 of VideoMode is determined by bit 7 of VGAOptions */
2371 return Bda->VideoMode | (Bda->VGAOptions & 0x80);
2372 }
2373
2374 static BOOLEAN VidBiosSetVideoMode(BYTE ModeNumber)
2375 {
2376 BYTE Page;
2377 COORD Resolution;
2378 PVGA_REGISTERS VgaMode;
2379
2380 BYTE OrgModeNumber = ModeNumber;
2381
2382 /*
2383 * IBM standard modes do not clear the screen if the
2384 * high bit of AL is set (EGA or higher only).
2385 * See Ralf Brown: http://www.ctyme.com/intr/rb-0069.htm
2386 * for more information.
2387 */
2388 BOOLEAN DoNotClear = !!(ModeNumber & 0x80);
2389
2390 /* Retrieve the real mode number and check its validity */
2391 ModeNumber &= 0x7F;
2392 // if (ModeNumber >= ARRAYSIZE(VideoModes))
2393 if (ModeNumber > BIOS_MAX_VIDEO_MODE)
2394 {
2395 DPRINT1("VidBiosSetVideoMode -- Mode %02Xh invalid\n", ModeNumber);
2396 return FALSE;
2397 }
2398
2399 VgaMode = VideoModes[ModeNumber];
2400
2401 DPRINT1("Switching to mode %02Xh (%02Xh) %s clearing the screen; VgaMode = 0x%p\n",
2402 ModeNumber, OrgModeNumber, (DoNotClear ? "without" : "and"), VgaMode);
2403
2404 if (!VgaSetRegisters(VgaMode)) return FALSE;
2405
2406 VgaChangePalette(ModeNumber);
2407
2408 /* Clear the VGA memory if needed */
2409 if (!DoNotClear) VgaClearMemory();
2410
2411 // Bda->CrtModeControl;
2412 // Bda->CrtColorPaletteMask;
2413 // Bda->EGAFlags;
2414 // Bda->VGAFlags;
2415
2416 /* Update the values in the BDA */
2417 Bda->VideoMode = ModeNumber;
2418 Bda->VideoPageSize = VideoModePageSize[ModeNumber];
2419 Bda->VideoPage = 0;
2420 Bda->VideoPageOffset = Bda->VideoPage * Bda->VideoPageSize;
2421
2422 /* 256 KB Video RAM; set bit 7 if we do not clear the screen */
2423 Bda->VGAOptions = 0x60 | (Bda->VGAOptions & 0x7F) | (DoNotClear ? 0x80 : 0x00);
2424 Bda->VGASwitches = 0xF9; /* High-resolution */
2425
2426 /* Set the start address in the CRTC */
2427 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG);
2428 IOWriteB(VGA_CRTC_DATA , LOBYTE(Bda->VideoPageOffset));
2429 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_HIGH_REG);
2430 IOWriteB(VGA_CRTC_DATA , HIBYTE(Bda->VideoPageOffset));
2431
2432 /* Update the character height */
2433 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_MAX_SCAN_LINE_REG);
2434 Bda->CharacterHeight = 1 + (IOReadB(VGA_CRTC_DATA) & 0x1F);
2435
2436 /* Update the screen size */
2437 Resolution = VgaGetDisplayResolution();
2438 Bda->ScreenColumns = Resolution.X;
2439 Bda->ScreenRows = Resolution.Y - 1;
2440
2441 /*
2442 * Update the cursor shape (text-mode only).
2443 * Use the default CGA cursor scanline values,
2444 * see: http://vitaly_filatov.tripod.com/ng/asm/asm_023.2.html
2445 */
2446 if ((ModeNumber >= 0x00 && ModeNumber <= 0x03) || (ModeNumber == 0x07))
2447 // FIXME: we might read the CRT registers and do the adjustment?
2448 VidBiosSetCursorShape(MAKEWORD(0x07, 0x06));
2449
2450 /* Set the cursor position for each page */
2451 for (Page = 0; Page < BIOS_MAX_PAGES; ++Page)
2452 VidBiosSetCursorPosition(0, 0, Page);
2453
2454 // FIXME: We need to reset the fonts and the font vectors. (INT 1Fh and 43h).
2455
2456 // HACK: We clear here all the text memory. TODO: Do it better!
2457 if (!DoNotClear && ((ModeNumber >= 0x00 && ModeNumber <= 0x03) || (ModeNumber == 0x07)))
2458 {
2459 INT i, j;
2460 DWORD VideoAddress;
2461 WORD FillCharacter = MAKEWORD(' ', DEFAULT_ATTRIBUTE);
2462
2463 for (Page = 0; Page < BIOS_MAX_PAGES; ++Page)
2464 {
2465 VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Page * Bda->VideoPageSize);
2466
2467 for (i = 0; i <= Bda->ScreenRows; i++)
2468 {
2469 for (j = 0; j <= Bda->ScreenColumns - 1; j++)
2470 {
2471 /* Write to video memory */
2472 EmulatorWriteMemory(&EmulatorContext,
2473 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2474 (LPVOID)&FillCharacter,
2475 sizeof(FillCharacter));
2476 }
2477 }
2478 }
2479 }
2480
2481 /* Refresh display */
2482 VgaRefreshDisplay();
2483
2484 return TRUE;
2485 }
2486
2487 static BOOLEAN VidBiosSetVideoPage(BYTE PageNumber)
2488 {
2489 BYTE Row, Column;
2490
2491 /* Check if the page exists */
2492 if (PageNumber >= BIOS_MAX_PAGES) return FALSE;
2493
2494 /* Check if this is the same page */
2495 if (PageNumber == Bda->VideoPage) return TRUE;
2496
2497 /* Update the values in the BDA */
2498 Bda->VideoPage = PageNumber;
2499 Bda->VideoPageOffset = Bda->VideoPage * Bda->VideoPageSize;
2500
2501 /* Set the start address in the CRTC */
2502 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG);
2503 IOWriteB(VGA_CRTC_DATA , LOBYTE(Bda->VideoPageOffset));
2504 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_HIGH_REG);
2505 IOWriteB(VGA_CRTC_DATA , HIBYTE(Bda->VideoPageOffset));
2506
2507 /*
2508 * Get the cursor location (we don't update anything on the BIOS side
2509 * but we update the cursor location on the VGA side).
2510 */
2511 VidBiosGetCursorPosition(&Row, &Column, PageNumber);
2512 VidBiosSetCursorPosition(Row, Column, PageNumber);
2513
2514 return TRUE;
2515 }
2516
2517 static VOID VidBiosPrintCharacter(CHAR Character, BYTE Attribute, BYTE Page)
2518 {
2519 WORD CharData = MAKEWORD(Character, Attribute);
2520 BYTE Row, Column;
2521
2522 /* Make sure the page exists */
2523 if (Page >= BIOS_MAX_PAGES) return;
2524
2525 /* Get the cursor location */
2526 VidBiosGetCursorPosition(&Row, &Column, Page);
2527
2528 if (Character == '\a')
2529 {
2530 /* Bell control character */
2531 // NOTE: We may use what the terminal emulator offers to us...
2532 Beep(800, 200);
2533 return;
2534 }
2535 else if (Character == '\b')
2536 {
2537 /* Backspace control character */
2538 if (Column > 0)
2539 {
2540 Column--;
2541 }
2542 else if (Row > 0)
2543 {
2544 Column = Bda->ScreenColumns - 1;
2545 Row--;
2546 }
2547
2548 /* Erase the existing character */
2549 CharData = MAKEWORD(' ', Attribute);
2550 EmulatorWriteMemory(&EmulatorContext,
2551 TO_LINEAR(TEXT_VIDEO_SEG,
2552 Page * Bda->VideoPageSize +
2553 (Row * Bda->ScreenColumns + Column) * sizeof(WORD)),
2554 (LPVOID)&CharData,
2555 sizeof(WORD));
2556 }
2557 else if (Character == '\t')
2558 {
2559 /* Horizontal Tabulation control character */
2560 do
2561 {
2562 // Taken from DOSBox
2563 VidBiosPrintCharacter(' ', Attribute, Page);
2564 VidBiosGetCursorPosition(&Row, &Column, Page);
2565 } while (Column % 8);
2566 }
2567 else if (Character == '\n')
2568 {
2569 /* Line Feed control character */
2570 Row++;
2571 }
2572 else if (Character == '\r')
2573 {
2574 /* Carriage Return control character */
2575 Column = 0;
2576 }
2577 else
2578 {
2579 /* Default character */
2580
2581 /* Write the character */
2582 EmulatorWriteMemory(&EmulatorContext,
2583 TO_LINEAR(TEXT_VIDEO_SEG,
2584 Page * Bda->VideoPageSize +
2585 (Row * Bda->ScreenColumns + Column) * sizeof(WORD)),
2586 (LPVOID)&CharData,
2587 sizeof(WORD));
2588
2589 /* Advance the cursor */
2590 Column++;
2591 }
2592
2593 /* Check if it passed the end of the row */
2594 if (Column >= Bda->ScreenColumns)
2595 {
2596 /* Return to the first column and go to the next line */
2597 Column = 0;
2598 Row++;
2599 }
2600
2601 /* Scroll the screen up if needed */
2602 if (Row > Bda->ScreenRows)
2603 {
2604 /* The screen must be scrolled up */
2605 SMALL_RECT Rectangle = { 0, 0, Bda->ScreenColumns - 1, Bda->ScreenRows };
2606 VidBiosScrollWindow(SCROLL_UP, 1, Rectangle, Page, DEFAULT_ATTRIBUTE/*Attribute*/);
2607 Row--;
2608 }
2609
2610 /* Set the cursor position */
2611 VidBiosSetCursorPosition(Row, Column, Page);
2612 }
2613
2614 /* PUBLIC FUNCTIONS ***********************************************************/
2615
2616 VOID WINAPI VidBiosVideoService(LPWORD Stack)
2617 {
2618 switch (getAH())
2619 {
2620 /* Set Video Mode */
2621 case 0x00:
2622 {
2623 VidBiosSetVideoMode(getAL());
2624 break;
2625 }
2626
2627 /* Set Text-Mode Cursor Shape */
2628 case 0x01:
2629 {
2630 VidBiosSetCursorShape(getCX());
2631 break;
2632 }
2633
2634 /* Set Cursor Position */
2635 case 0x02:
2636 {
2637 VidBiosSetCursorPosition(getDH(), getDL(), getBH());
2638 break;
2639 }
2640
2641 /* Get Cursor Position and Shape */
2642 case 0x03:
2643 {
2644 /* Make sure the selected video page exists */
2645 if (getBH() >= BIOS_MAX_PAGES) break;
2646
2647 /* Return the result */
2648 setCX(MAKEWORD(Bda->CursorEndLine, Bda->CursorStartLine));
2649 setDX(Bda->CursorPosition[getBH()]);
2650 break;
2651 }
2652
2653 /* Query Light Pen */
2654 case 0x04:
2655 {
2656 /*
2657 * On modern BIOSes, this function returns 0
2658 * so that we can ignore the other registers.
2659 */
2660 setAX(0);
2661 break;
2662 }
2663
2664 /* Select Active Display Page */
2665 case 0x05:
2666 {
2667 VidBiosSetVideoPage(getAL());
2668 break;
2669 }
2670
2671 /* Scroll Window Up/Down */
2672 case 0x06:
2673 case 0x07:
2674 {
2675 SMALL_RECT Rectangle = { getCL(), getCH(), getDL(), getDH() };
2676
2677 VidBiosScrollWindow((getAH() == 0x06) ? SCROLL_UP : SCROLL_DOWN,
2678 getAL(), Rectangle, Bda->VideoPage, getBH());
2679
2680 break;
2681 }
2682
2683 /* Read Character and Attribute at Cursor Position */
2684 case 0x08:
2685 {
2686 WORD CharacterData;
2687 BYTE Page = getBH();
2688 DWORD Offset;
2689
2690 /* Check if the page exists */
2691 if (Page >= BIOS_MAX_PAGES) break;
2692
2693 /* Find the offset of the character */
2694 Offset = Page * Bda->VideoPageSize +
2695 (HIBYTE(Bda->CursorPosition[Page]) * Bda->ScreenColumns +
2696 LOBYTE(Bda->CursorPosition[Page])) * 2;
2697
2698 /* Read from the video memory */
2699 EmulatorReadMemory(&EmulatorContext,
2700 TO_LINEAR(TEXT_VIDEO_SEG, Offset),
2701 (LPVOID)&CharacterData,
2702 sizeof(WORD));
2703
2704 /* Return the character data in AX */
2705 setAX(CharacterData);
2706
2707 break;
2708 }
2709
2710 /* Write Character and Attribute at Cursor Position */
2711 case 0x09:
2712 /* Write Character only (PCjr: + Attribute) at Cursor Position */
2713 case 0x0A:
2714 {
2715 WORD CharacterData = MAKEWORD(getAL(), getBL());
2716 BYTE Page = getBH();
2717 DWORD Offset, Counter = getCX();
2718
2719 /* Check if the page exists */
2720 if (Page >= BIOS_MAX_PAGES) break;
2721
2722 /* Find the offset of the character */
2723 Offset = Page * Bda->VideoPageSize +
2724 (HIBYTE(Bda->CursorPosition[Page]) * Bda->ScreenColumns +
2725 LOBYTE(Bda->CursorPosition[Page])) * 2;
2726
2727 /* Write to video memory a certain number of times */
2728 while (Counter > 0)
2729 {
2730 EmulatorWriteMemory(&EmulatorContext,
2731 TO_LINEAR(TEXT_VIDEO_SEG, Offset),
2732 (LPVOID)&CharacterData,
2733 (getAH() == 0x09) ? sizeof(WORD) : sizeof(BYTE));
2734 Offset += 2;
2735 Counter--;
2736 }
2737
2738 break;
2739 }
2740
2741 /* Set Video Colors */
2742 case 0x0B:
2743 {
2744 if (Bda->VideoMode < 0x04 || Bda->VideoMode > 0x06)
2745 {
2746 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X is unsupported for non-CGA modes\n",
2747 getBH());
2748 break;
2749 }
2750
2751 switch (getBH())
2752 {
2753 case 0x00: /* Set Background/Border Color */
2754 {
2755 #ifdef DOSBOX
2756 BYTE Index = getBL();
2757
2758 /* See: http://www.bioscentral.com/misc/bda.htm */
2759 Bda->CrtColorPaletteMask = (Bda->CrtColorPaletteMask & 0xE0) | (Index & 0x1F);
2760
2761 Index = ((Index << 1) & 0x10) | (Index & 0x7);
2762
2763 /* Always set the overscan color */
2764 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Index);
2765
2766 /* Don't set any extra colors when in text mode */
2767 if (Bda->VideoMode <= 0x03) break;
2768
2769 VgaSetSinglePaletteRegister(0x00, Index);
2770
2771 Index = (Bda->CrtColorPaletteMask & 0x10) | 0x02 | ((Bda->CrtColorPaletteMask & 0x20) >> 5);
2772
2773 VgaSetSinglePaletteRegister(0x01, Index);
2774 Index += 2;
2775 VgaSetSinglePaletteRegister(0x02, Index);
2776 Index += 2;
2777 VgaSetSinglePaletteRegister(0x03, Index);
2778 #else
2779 /* Background/Border Color is modifiable via the first index */
2780 VgaSetSinglePaletteRegister(0x00, getBL());
2781 #endif
2782
2783 /* Enable screen and disable palette access */
2784 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2785 IOWriteB(VGA_AC_INDEX, 0x20);
2786 break;
2787 }
2788
2789 case 0x01: /* Set Palette */
2790 {
2791 BYTE Index = getBL();
2792
2793 /* See: http://www.bioscentral.com/misc/bda.htm */
2794 /* Reset bit 5: foreground colors index (0: green/red/yellow; 1: cyan/magenta/white) */
2795 Bda->CrtColorPaletteMask = (Bda->CrtColorPaletteMask & 0xDF) | ((Index & 1) ? 0x20 : 0x00);
2796
2797 /* Don't set any extra colors when in text mode */
2798 if (Bda->VideoMode <= 0x03) break;
2799
2800 Index = (Bda->CrtColorPaletteMask & 0x10) | 0x02 | Index;
2801
2802 VgaSetSinglePaletteRegister(0x01, Index);
2803 Index += 2;
2804 VgaSetSinglePaletteRegister(0x02, Index);
2805 Index += 2;
2806 VgaSetSinglePaletteRegister(0x03, Index);
2807
2808 /* Enable screen and disable palette access */
2809 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2810 IOWriteB(VGA_AC_INDEX, 0x20);
2811 break;
2812 }
2813
2814 default:
2815 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X NOT IMPLEMENTED\n",
2816 getAH(), getBH());
2817 break;
2818 }
2819
2820 break;
2821 }
2822
2823 /* Teletype Output */
2824 case 0x0E:
2825 {
2826 VidBiosPrintCharacter(getAL(), getBL(), getBH());
2827 break;
2828 }
2829
2830 /* Get Current Video Mode */
2831 case 0x0F:
2832 {
2833 setAX(MAKEWORD(VidBiosGetVideoMode(), Bda->ScreenColumns));
2834 setBH(Bda->VideoPage);
2835 break;
2836 }
2837
2838 /* Palette Control */
2839 case 0x10:
2840 {
2841 switch (getAL())
2842 {
2843 /* Set Single Palette Register */
2844 case 0x00:
2845 {
2846 VgaSetSinglePaletteRegister(getBL(), getBH());
2847
2848 /* Enable screen and disable palette access */
2849 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2850 IOWriteB(VGA_AC_INDEX, 0x20);
2851 break;
2852 }
2853
2854 /* Set Overscan Color */
2855 case 0x01:
2856 {
2857 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, getBH());
2858
2859 /* Enable screen and disable palette access */
2860 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2861 IOWriteB(VGA_AC_INDEX, 0x20);
2862 break;
2863 }
2864
2865 /* Set All Palette Registers */
2866 case 0x02:
2867 {
2868 INT i;
2869 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
2870
2871 /* Set the palette registers */
2872 for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
2873 {
2874 VgaSetSinglePaletteRegister(i, Buffer[i]);
2875 }
2876
2877 /* Set the overscan register */
2878 // VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Buffer[VGA_AC_PAL_F_REG + 1]);
2879 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
2880 IOWriteB(VGA_AC_WRITE, Buffer[VGA_AC_PAL_F_REG + 1]);
2881
2882 /* Enable screen and disable palette access */
2883 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2884 IOWriteB(VGA_AC_INDEX, 0x20);
2885 break;
2886 }
2887
2888 /* Get Single Palette Register */
2889 case 0x07:
2890 {
2891 /* Write the index */
2892 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2893 IOWriteB(VGA_AC_INDEX, getBL());
2894
2895 /* Read the data */
2896 setBH(IOReadB(VGA_AC_READ));
2897
2898 /* Enable screen and disable palette access */
2899 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2900 IOWriteB(VGA_AC_INDEX, 0x20);
2901 break;
2902 }
2903
2904 /* Get Overscan Color */
2905 case 0x08:
2906 {
2907 /* Write the index */
2908 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2909 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
2910
2911 /* Read the data */
2912 setBH(IOReadB(VGA_AC_READ));
2913
2914 /* Enable screen and disable palette access */
2915 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2916 IOWriteB(VGA_AC_INDEX, 0x20);
2917 break;
2918 }
2919
2920 /* Get All Palette Registers */
2921 case 0x09:
2922 {
2923 INT i;
2924 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
2925
2926 /* Get the palette registers */
2927 for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
2928 {
2929 /* Write the index */
2930 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2931 IOWriteB(VGA_AC_INDEX, i);
2932
2933 /* Read the data */
2934 Buffer[i] = IOReadB(VGA_AC_READ);
2935 }
2936
2937 /* Get the overscan register */
2938 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
2939 Buffer[VGA_AC_PAL_F_REG + 1] = IOReadB(VGA_AC_READ);
2940
2941 /* Enable screen and disable palette access */
2942 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2943 IOWriteB(VGA_AC_INDEX, 0x20);
2944 break;
2945 }
2946
2947 /* Set Individual DAC Register */
2948 case 0x10:
2949 {
2950 /* Write the index */
2951 // Certainly in BL and not in BX as said by Ralf Brown...
2952 IOWriteB(VGA_DAC_WRITE_INDEX, getBL());
2953
2954 /* Write the data in this order: Red, Green, Blue */
2955 IOWriteB(VGA_DAC_DATA, getDH());
2956 IOWriteB(VGA_DAC_DATA, getCH());
2957 IOWriteB(VGA_DAC_DATA, getCL());
2958
2959 break;
2960 }
2961
2962 /* Set Block of DAC Registers */
2963 case 0x12:
2964 {
2965 INT i;
2966 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
2967
2968 /* Write the index */
2969 // Certainly in BL and not in BX as said by Ralf Brown...
2970 IOWriteB(VGA_DAC_WRITE_INDEX, getBL());
2971
2972 for (i = 0; i < getCX(); i++)
2973 {
2974 /* Write the data in this order: Red, Green, Blue */
2975 IOWriteB(VGA_DAC_DATA, *Buffer++);
2976 IOWriteB(VGA_DAC_DATA, *Buffer++);
2977 IOWriteB(VGA_DAC_DATA, *Buffer++);
2978 }
2979
2980 break;
2981 }
2982
2983 /* Get Individual DAC Register */
2984 case 0x15:
2985 {
2986 /* Write the index */
2987 IOWriteB(VGA_DAC_READ_INDEX, getBL());
2988
2989 /* Read the data in this order: Red, Green, Blue */
2990 setDH(IOReadB(VGA_DAC_DATA));
2991 setCH(IOReadB(VGA_DAC_DATA));
2992 setCL(IOReadB(VGA_DAC_DATA));
2993
2994 break;
2995 }
2996
2997 /* Get Block of DAC Registers */
2998 case 0x17:
2999 {
3000 INT i;
3001 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3002
3003 /* Write the index */
3004 // Certainly in BL and not in BX as said by Ralf Brown...
3005 IOWriteB(VGA_DAC_READ_INDEX, getBL());
3006
3007 for (i = 0; i < getCX(); i++)
3008 {
3009 /* Write the data in this order: Red, Green, Blue */
3010 *Buffer++ = IOReadB(VGA_DAC_DATA);
3011 *Buffer++ = IOReadB(VGA_DAC_DATA);
3012 *Buffer++ = IOReadB(VGA_DAC_DATA);
3013 }
3014
3015 break;
3016 }
3017
3018 default:
3019 {
3020 DPRINT1("BIOS Palette Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3021 getAL());
3022 break;
3023 }
3024 }
3025
3026 break;
3027 }
3028
3029 /* Font Control */
3030 case 0x11:
3031 {
3032 switch (getAL())
3033 {
3034 /* Set User 8x8 Graphics Chars (Setup INT 1Fh Vector) */
3035 case 0x20:
3036 {
3037 /* Update the BIOS INT 1Fh vector to user-defined ES:BP pointer */
3038 // Far pointer to the 8x8 characters 80h-FFh
3039 ((PULONG)BaseAddress)[0x1F] = MAKELONG(getBP(), getES());
3040 break;
3041 }
3042
3043 /* Setup ROM 8x8 Font for Graphics Mode */
3044 case 0x23:
3045 {
3046 // FIXME: Use BL and DL for the number of screen rows
3047
3048 /* Write the default font to the VGA font plane */
3049 VgaWriteFont(0, Font8x8, ARRAYSIZE(Font8x8) / VGA_FONT_CHARACTERS);
3050
3051 /* Update the BIOS INT 43h vector */
3052 // Far pointer to the 8x8 characters 00h-...
3053 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x8_OFFSET, VIDEO_BIOS_DATA_SEG);
3054
3055 break;
3056 }
3057
3058 /* Setup ROM 8x16 Font for Graphics Mode */
3059 case 0x24:
3060 {
3061 // FIXME: Use BL and DL for the number of screen rows
3062
3063 /* Write the default font to the VGA font plane */
3064 VgaWriteFont(0, Font8x16, ARRAYSIZE(Font8x16) / VGA_FONT_CHARACTERS);
3065
3066 /* Update the BIOS INT 43h vector */
3067 // Far pointer to the 8x16 characters 00h-...
3068 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
3069
3070 break;
3071 }
3072
3073 /* Get Current Character Font Information */
3074 case 0x30:
3075 {
3076 ULONG Address = (ULONG)NULL;
3077
3078 switch (getBH())
3079 {
3080 /* 00h - INT 0x1F pointer */
3081 case 0x00:
3082 Address = ((PULONG)BaseAddress)[0x1F];
3083 break;
3084
3085 /* 01h - INT 0x43 pointer */
3086 case 0x01:
3087 Address = ((PULONG)BaseAddress)[0x43];
3088 break;
3089
3090 /* 02h - 8x14 font */
3091 case 0x02:
3092 Address = MAKELONG(FONT_8x14_OFFSET, VIDEO_BIOS_DATA_SEG);
3093 break;
3094
3095 /* 03h - 8x8 font */
3096 case 0x03:
3097 Address = MAKELONG(FONT_8x8_OFFSET, VIDEO_BIOS_DATA_SEG);
3098 break;
3099
3100 /* 04h - 8x8 font, upper half */
3101 case 0x04:
3102 Address = MAKELONG(FONT_8x8_HIGH_OFFSET, VIDEO_BIOS_DATA_SEG);
3103 break;
3104
3105 /* 05h - NOT IMPLEMENTED - 9x14 font */
3106 case 0x05:
3107 break;
3108
3109 /* 06h - 8x16 font */
3110 case 0x06:
3111 Address = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
3112 break;
3113
3114 /* 07h - NOT IMPLEMENTED - 9x16 font */
3115 case 0x07:
3116 break;
3117
3118 default:
3119 DPRINT1("INT 10h, AL=30h Function BH = 0x%02X NOT IMPLEMENTED\n",
3120 getBH());
3121 }
3122
3123 /* Return the data */
3124 setES(HIWORD(Address));
3125 setBP(LOWORD(Address));
3126 setCX(Bda->CharacterHeight);
3127 setDL(Bda->ScreenRows);
3128
3129 break;
3130 }
3131
3132 default:
3133 {
3134 DPRINT1("BIOS Font Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3135 getAL());
3136 }
3137 }
3138
3139 break;
3140 }
3141
3142 /* Alternate Function Select */
3143 case 0x12:
3144 {
3145 switch (getBL())
3146 {
3147 /* Get EGA/VGA Information */
3148 case 0x10:
3149 {
3150 setBH((Bda->VGAOptions & 0x02) >> 1); /* Color (0) or monochrome (1) display */
3151 setBL((Bda->VGAOptions & 0x60) >> 5); /* Video RAM size */
3152 setCH((Bda->VGASwitches & 0xF0) >> 4); /* Features settings */
3153 setCL( Bda->VGASwitches & 0x0F); /* Switches settings */
3154 break;
3155 }
3156
3157 /* Enable/Disable Cursor Emulation */
3158 case 0x34:
3159 {
3160 BYTE State = getAL();
3161
3162 /* Check for validity */
3163 if (State > 1) break;
3164
3165 /*
3166 * Enable (State == 0) or disable (State == 1) cursor emulation.
3167 * Please read the WARNING in the 'VidBiosSetCursorShape'
3168 * function for more details.
3169 */
3170 Bda->VGAOptions = (Bda->VGAOptions & 0xFE) | (State & 0x01);
3171
3172 /* Return success */
3173 setAL(0x12);
3174 break;
3175 }
3176
3177 /* Enable/Disable screen refresh */
3178 case 0x36:
3179 {
3180 BYTE State = getAL();
3181 BYTE Clocking;
3182
3183 /* Check for validity */
3184 if (State > 1) break;
3185
3186 /* Turn the video on (State == 0) or off (State == 1) */
3187 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_CLOCK_REG);
3188 Clocking = IOReadB(VGA_SEQ_DATA);
3189
3190 if (State == 0)
3191 Clocking &= ~VGA_SEQ_CLOCK_SD;
3192 else
3193 Clocking |= VGA_SEQ_CLOCK_SD;
3194
3195 IOWriteB(VGA_SEQ_DATA, Clocking);
3196
3197 /* Return success */
3198 setAL(0x12);
3199 break;
3200 }
3201
3202 default:
3203 {
3204 DPRINT1("BIOS Function INT 10h, AH = 12h (Alternate Function Select), BX = 0x%04X NOT IMPLEMENTED\n",
3205 getBX());
3206 break;
3207 }
3208 }
3209
3210 break;
3211 }
3212
3213 /* Write String */
3214 case 0x13:
3215 {
3216 DPRINT1("BIOS Function INT 13h (Write String) is UNIMPLEMENTED\n");
3217 break;
3218 }
3219
3220 /* Get/Set Display combination code */
3221 case 0x1A:
3222 {
3223 switch (getAL())
3224 {
3225 case 0x00: /* Get Display combination code */
3226 setAX(MAKEWORD(0x1A, 0x1A));
3227 setBX(MAKEWORD(0x08, 0x00)); /* VGA w/ color analog display */
3228 break;
3229 case 0x01: /* Set Display combination code */
3230 DPRINT1("Set Display combination code - Unsupported\n");
3231 break;
3232 default:
3233 break;
3234 }
3235 break;
3236 }
3237
3238 default:
3239 {
3240 DPRINT1("BIOS Function INT 10h, AH = 0x%02X, AL = 0x%02X, BH = 0x%02X NOT IMPLEMENTED\n",
3241 getAH(), getAL(), getBH());
3242 }
3243 }
3244 }
3245
3246
3247 /*
3248 * Those attach / detach functions are work-in-progress
3249 */
3250
3251 static BOOL Attached = TRUE;
3252
3253 VOID VidBiosAttachToConsole(VOID)
3254 {
3255 // VgaRefreshDisplay();
3256 if (!Attached)
3257 {
3258 VgaAttachToConsole();
3259 Attached = TRUE;
3260 }
3261
3262 VgaRefreshDisplay();
3263 VidBiosSyncCursorPosition();
3264 }
3265
3266 VOID VidBiosDetachFromConsole(VOID)
3267 {
3268 /* Perform another screen refresh */
3269 VgaRefreshDisplay();
3270
3271 /* Detach from the console */
3272 VgaDetachFromConsole(FALSE);
3273 Attached = FALSE;
3274 }
3275
3276 BOOLEAN VidBiosInitialize(VOID)
3277 {
3278 /* Some interrupts are in fact addresses to tables */
3279 ((PULONG)BaseAddress)[0x1D] = (ULONG)NULL;
3280 // Far pointer to the 8x8 characters 80h-FFh
3281 ((PULONG)BaseAddress)[0x1F] = MAKELONG(FONT_8x8_HIGH_OFFSET, VIDEO_BIOS_DATA_SEG);
3282 // ((PULONG)BaseAddress)[0x42] = (ULONG)NULL;
3283 // Far pointer to the 8x16 characters 00h-...
3284 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
3285 ((PULONG)BaseAddress)[0x44] = (ULONG)NULL;
3286 // ((PULONG)BaseAddress)[0x6D] = (ULONG)NULL;
3287
3288 /* Fill the tables */
3289 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x8_OFFSET),
3290 Font8x8, sizeof(Font8x8));
3291 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x16_OFFSET),
3292 Font8x16, sizeof(Font8x16));
3293 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x14_OFFSET),
3294 Font8x14, sizeof(Font8x14));
3295
3296 /* Write the default font to the VGA font plane */
3297 VgaWriteFont(0, Font8x16, ARRAYSIZE(Font8x16) / VGA_FONT_CHARACTERS);
3298
3299 //
3300 // FIXME: At the moment we always set a VGA mode. In the future,
3301 // we should set this mode **only** when:
3302 // - an app starts to use directly the video memory
3303 // (that should be done in emulator.c)
3304 // - or starts to use non-stream I/O interrupts
3305 // (that should be done here, or maybe in VGA ??)
3306 //
3307
3308 /* Set the default video mode */
3309 VidBiosSetVideoMode(BIOS_DEFAULT_VIDEO_MODE);
3310
3311 /* Synchronize our cursor position with VGA */
3312 VidBiosSyncCursorPosition();
3313
3314 /* Register the BIOS support BOPs */
3315 RegisterBop(BOP_VIDEO_INT, VidBiosVideoService);
3316
3317 return TRUE;
3318 }
3319
3320 VOID VidBiosCleanup(VOID)
3321 {
3322 }
3323
3324 /* EOF */