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