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