c40673d4155aa7f01c0b6f9823e7d5de714572d1
[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 32-bit 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 CharacterWidth;
1941 WORD CharacterHeight;
1942 // PCOLORREF Palette;
1943 } VGA_MODE, *PVGA_MODE;
1944
1945 static CONST VGA_MODE VideoModes[BIOS_MAX_VIDEO_MODE + 1] =
1946 {
1947 {&VideoMode_40x25_text, 0x0800, 9, 16}, /* Mode 00h - 16 color (mono) */
1948 {&VideoMode_40x25_text, 0x0800, 9, 16}, /* Mode 01h - 16 color */
1949 {&VideoMode_80x25_text, 0x1000, 9, 16}, /* Mode 02h - 16 color (mono) */
1950 {&VideoMode_80x25_text, 0x1000, 9, 16}, /* Mode 03h - 16 color */
1951 {&VideoMode_320x200_4color, 0x4000, 8, 8}, /* Mode 04h - CGA 4 color */
1952 {&VideoMode_320x200_4color, 0x4000, 8, 8}, /* Mode 05h - CGA same (m) (uses 3rd CGA palette) */
1953 {&VideoMode_640x200_2color, 0x4000, 8, 8}, /* Mode 06h - CGA 640*200 2 color */
1954 {NULL, 0x1000, 1, 1}, /* Mode 07h - MDA monochrome text 80*25 */
1955 {NULL, 0x0000, 1, 1}, /* Mode 08h - PCjr */
1956 {NULL, 0x0000, 1, 1}, /* Mode 09h - PCjr */
1957 {NULL, 0x0000, 1, 1}, /* Mode 0Ah - PCjr */
1958 {NULL, 0x0000, 1, 1}, /* Mode 0Bh - Reserved */
1959 {NULL, 0x0000, 1, 1}, /* Mode 0Ch - Reserved */
1960 {&VideoMode_320x200_16color, 0x2000, 8, 8}, /* Mode 0Dh - EGA 320*200 16 color */
1961 {&VideoMode_640x200_16color, 0x4000, 8, 8}, /* Mode 0Eh - EGA 640*200 16 color */
1962 {NULL, 0x8000, 1, 1}, /* Mode 0Fh - EGA 640*350 mono */
1963 {&VideoMode_640x350_16color, 0x8000, 8, 14}, /* Mode 10h - EGA 640*350 HiRes 16 color */
1964 {&VideoMode_640x480_2color, 0xA000, 8, 16}, /* Mode 11h - VGA 640*480 mono */
1965 {&VideoMode_640x480_16color, 0xA000, 8, 16}, /* Mode 12h - VGA */
1966 {&VideoMode_320x200_256color, 0x2000, 8, 8}, /* Mode 13h - VGA */
1967 };
1968
1969 #define IS_TEXT_MODE(ModeNumber) \
1970 (((ModeNumber) >= 0x00 && (ModeNumber) <= 0x03) || ((ModeNumber) == 0x07))
1971
1972 static PVGA_STATIC_FUNC_TABLE VgaStaticFuncTable;
1973 static BOOLEAN VbeInitialized = FALSE;
1974
1975 /* PRIVATE FUNCTIONS **********************************************************/
1976
1977 static BOOLEAN VidBiosScrollWindow(SCROLL_DIRECTION Direction,
1978 DWORD Amount,
1979 SMALL_RECT Rectangle,
1980 BYTE Page,
1981 BYTE FillAttribute)
1982 {
1983 INT i, j;
1984 DWORD VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Page * Bda->VideoPageSize);
1985 WORD FillCharacter = MAKEWORD(' ', FillAttribute);
1986
1987 WORD WindowWidth, WindowHeight;
1988
1989 /* Fixup the rectangle if needed */
1990 Rectangle.Left = min(max(Rectangle.Left , 0), Bda->ScreenColumns - 1);
1991 Rectangle.Right = min(max(Rectangle.Right , 0), Bda->ScreenColumns - 1);
1992 Rectangle.Top = min(max(Rectangle.Top , 0), Bda->ScreenRows);
1993 Rectangle.Bottom = min(max(Rectangle.Bottom, 0), Bda->ScreenRows);
1994
1995 WindowWidth = Rectangle.Right - Rectangle.Left + 1;
1996 WindowHeight = Rectangle.Bottom - Rectangle.Top + 1;
1997
1998 /* Amount == 0 means we clear all the rectangle */
1999 if ((Amount == 0) ||
2000 (((Direction == SCROLL_UP ) || (Direction == SCROLL_DOWN )) && (Amount >= WindowHeight)) ||
2001 (((Direction == SCROLL_LEFT) || (Direction == SCROLL_RIGHT)) && (Amount >= WindowWidth )))
2002 {
2003 /* Fill the rectangle */
2004 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2005 {
2006 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
2007 {
2008 EmulatorWriteMemory(&EmulatorContext,
2009 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2010 (LPVOID)&FillCharacter,
2011 sizeof(FillCharacter));
2012 }
2013 }
2014
2015 return TRUE;
2016 }
2017
2018 switch (Direction)
2019 {
2020 case SCROLL_UP:
2021 {
2022 /* Move text lines up */
2023 for (i = Rectangle.Top + Amount; i <= Rectangle.Bottom; i++)
2024 {
2025 EmulatorCopyMemory(&EmulatorContext,
2026 VideoAddress + ((i - Amount) * Bda->ScreenColumns + Rectangle.Left) * sizeof(WORD),
2027 VideoAddress + ( i * Bda->ScreenColumns + Rectangle.Left) * sizeof(WORD),
2028 (Rectangle.Right - Rectangle.Left + 1) * sizeof(WORD));
2029 }
2030
2031 /* Fill the bottom of the rectangle */
2032 for (i = Rectangle.Bottom - Amount + 1; i <= Rectangle.Bottom; i++)
2033 {
2034 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
2035 {
2036 EmulatorWriteMemory(&EmulatorContext,
2037 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2038 (LPVOID)&FillCharacter,
2039 sizeof(FillCharacter));
2040 }
2041 }
2042
2043 break;
2044 }
2045
2046 case SCROLL_DOWN:
2047 {
2048 INT Bottom;
2049
2050 /* Move text lines down */
2051 for (i = Rectangle.Bottom - Amount; i >= Rectangle.Top; i--)
2052 {
2053 EmulatorCopyMemory(&EmulatorContext,
2054 VideoAddress + ((i + Amount) * Bda->ScreenColumns + Rectangle.Left) * sizeof(WORD),
2055 VideoAddress + ( i * Bda->ScreenColumns + Rectangle.Left) * sizeof(WORD),
2056 (Rectangle.Right - Rectangle.Left + 1) * sizeof(WORD));
2057 }
2058
2059 /* Fill the top of the rectangle */
2060 Bottom = Rectangle.Top + Amount - 1;
2061 for (i = Rectangle.Top; i <= Bottom; i++)
2062 {
2063 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
2064 {
2065 EmulatorWriteMemory(&EmulatorContext,
2066 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2067 (LPVOID)&FillCharacter,
2068 sizeof(FillCharacter));
2069 }
2070 }
2071
2072 break;
2073 }
2074
2075 case SCROLL_LEFT:
2076 {
2077 /* Move text lines left */
2078 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2079 {
2080 EmulatorCopyMemory(&EmulatorContext,
2081 VideoAddress + (i * Bda->ScreenColumns + Rectangle.Left ) * sizeof(WORD),
2082 VideoAddress + (i * Bda->ScreenColumns + Rectangle.Left + Amount) * sizeof(WORD),
2083 (Rectangle.Right - Rectangle.Left - Amount + 1) * sizeof(WORD));
2084 }
2085
2086 /* Fill the right of the rectangle */
2087 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2088 {
2089 for (j = Rectangle.Right - Amount + 1; j <= Rectangle.Right; j++)
2090 {
2091 EmulatorWriteMemory(&EmulatorContext,
2092 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2093 (LPVOID)&FillCharacter,
2094 sizeof(FillCharacter));
2095 }
2096 }
2097
2098 break;
2099 }
2100
2101 case SCROLL_RIGHT:
2102 {
2103 INT Right;
2104
2105 /* Move text lines right */
2106 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2107 {
2108 EmulatorCopyMemory(&EmulatorContext,
2109 VideoAddress + (i * Bda->ScreenColumns + Rectangle.Left + Amount) * sizeof(WORD),
2110 VideoAddress + (i * Bda->ScreenColumns + Rectangle.Left ) * sizeof(WORD),
2111 (Rectangle.Right - Rectangle.Left - Amount + 1) * sizeof(WORD));
2112 }
2113
2114 /* Fill the left of the rectangle */
2115 Right = Rectangle.Left + Amount - 1;
2116 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
2117 {
2118 for (j = Rectangle.Left; j <= Right; j++)
2119 {
2120 EmulatorWriteMemory(&EmulatorContext,
2121 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
2122 (LPVOID)&FillCharacter,
2123 sizeof(FillCharacter));
2124 }
2125 }
2126
2127 break;
2128 }
2129 }
2130
2131 return TRUE;
2132 }
2133
2134 static __inline VOID VgaSetSinglePaletteRegister(BYTE Index, BYTE Value)
2135 {
2136 /* Write the index */
2137 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2138 IOWriteB(VGA_AC_INDEX, Index);
2139
2140 /* Write the data */
2141 IOWriteB(VGA_AC_WRITE, Value);
2142 }
2143
2144 static BOOLEAN VgaSetRegisters(PVGA_REGISTERS Registers)
2145 {
2146 UINT i;
2147
2148 if (Registers == NULL) return FALSE;
2149
2150 /* Disable interrupts */
2151 setIF(0);
2152
2153 /*
2154 * Set the CRT base address according to the selected mode,
2155 * monochrome or color. The following macros:
2156 * VGA_INSTAT1_READ, VGA_CRTC_INDEX and VGA_CRTC_DATA are then
2157 * used to access the correct VGA I/O ports.
2158 */
2159 Bda->CrtBasePort = (Registers->Misc & 0x01) ? VGA_CRTC_INDEX_COLOR
2160 : VGA_CRTC_INDEX_MONO;
2161 /* Bit 1 indicates whether display is color (0) or monochrome (1) */
2162 Bda->VGAOptions = (Bda->VGAOptions & 0xFD) | (!(Registers->Misc & 0x01) << 1);
2163 Bda->CrtModeControl = (Bda->CrtModeControl & 0xFB) | (!(Registers->Misc & 0x01) << 1);
2164
2165 /* Update blink bit in BDA */
2166 if (Registers->Attribute[VGA_AC_CONTROL_REG] & VGA_AC_CONTROL_BLINK)
2167 Bda->CrtModeControl |= (1 << 5);
2168 else
2169 Bda->CrtModeControl &= ~(1 << 5);
2170
2171 /* Turn the video off */
2172 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_CLOCK_REG);
2173 IOWriteB(VGA_SEQ_DATA , IOReadB(VGA_SEQ_DATA) | VGA_SEQ_CLOCK_SD);
2174
2175 /* Write the misc register */
2176 IOWriteB(VGA_MISC_WRITE, Registers->Misc);
2177
2178 /* Synchronous reset on */
2179 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_RESET_REG);
2180 IOWriteB(VGA_SEQ_DATA , VGA_SEQ_RESET_AR );
2181
2182 /* Write the sequencer registers */
2183 for (i = 1; i < VGA_SEQ_MAX_REG; i++)
2184 {
2185 IOWriteB(VGA_SEQ_INDEX, i);
2186 IOWriteB(VGA_SEQ_DATA , Registers->Sequencer[i]);
2187 }
2188
2189 /* Synchronous reset off */
2190 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_RESET_REG);
2191 IOWriteB(VGA_SEQ_DATA , VGA_SEQ_RESET_SR | VGA_SEQ_RESET_AR);
2192
2193 /* Unlock CRTC registers 0-7 */
2194 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_END_HORZ_BLANKING_REG);
2195 IOWriteB(VGA_CRTC_DATA , IOReadB(VGA_CRTC_DATA) | 0x80);
2196 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_VERT_RETRACE_END_REG);
2197 IOWriteB(VGA_CRTC_DATA , IOReadB(VGA_CRTC_DATA) & ~0x80);
2198 // Make sure they remain unlocked
2199 Registers->CRT[VGA_CRTC_END_HORZ_BLANKING_REG] |= 0x80;
2200 Registers->CRT[VGA_CRTC_VERT_RETRACE_END_REG] &= ~0x80;
2201
2202 /* Write the CRTC registers */
2203 for (i = 0; i < VGA_CRTC_MAX_REG; i++)
2204 {
2205 IOWriteB(VGA_CRTC_INDEX, i);
2206 IOWriteB(VGA_CRTC_DATA , Registers->CRT[i]);
2207 }
2208
2209 /* Write the GC registers */
2210 for (i = 0; i < VGA_GC_MAX_REG; i++)
2211 {
2212 IOWriteB(VGA_GC_INDEX, i);
2213 IOWriteB(VGA_GC_DATA , Registers->Graphics[i]);
2214 }
2215
2216 /* Write the AC registers */
2217 for (i = 0; i < VGA_AC_MAX_REG; i++)
2218 {
2219 VgaSetSinglePaletteRegister(i, Registers->Attribute[i]);
2220 }
2221
2222 /* Set the PEL mask */
2223 IOWriteB(VGA_DAC_MASK, 0xFF);
2224
2225 /* Enable screen and disable palette access */
2226 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2227 IOWriteB(VGA_AC_INDEX, 0x20);
2228
2229 /* Turn the video on */
2230 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_CLOCK_REG);
2231 IOWriteB(VGA_SEQ_DATA , IOReadB(VGA_SEQ_DATA) & ~VGA_SEQ_CLOCK_SD);
2232
2233 /* Enable interrupts */
2234 setIF(1);
2235
2236 return TRUE;
2237 }
2238
2239 static VOID VgaSetPalette(const COLORREF* Palette, ULONG Size)
2240 {
2241 ULONG i;
2242
2243 // /* Disable screen and enable palette access */
2244 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2245 // IOWriteB(VGA_AC_INDEX, 0x00);
2246
2247 for (i = 0; i < Size; i++)
2248 {
2249 IOWriteB(VGA_DAC_WRITE_INDEX, i);
2250 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetRValue(Palette[i])));
2251 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetGValue(Palette[i])));
2252 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetBValue(Palette[i])));
2253 }
2254
2255 /* The following step might be optional */
2256 for (i = Size; i < VGA_MAX_COLORS; i++)
2257 {
2258 IOWriteB(VGA_DAC_WRITE_INDEX, i);
2259 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
2260 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
2261 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
2262 }
2263
2264 /* Enable screen and disable palette access */
2265 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2266 // IOWriteB(VGA_AC_INDEX, 0x20);
2267 }
2268
2269 static VOID VgaChangePalette(BYTE ModeNumber)
2270 {
2271 const COLORREF* Palette;
2272 ULONG Size;
2273
2274 if (ModeNumber >= 0x13)
2275 {
2276 /* VGA modes */
2277 Palette = VgaPalette;
2278 Size = ARRAYSIZE(VgaPalette);
2279 }
2280 else if (ModeNumber == 0x10) // || (ModeNumber == 0x0D) || (ModeNumber == 0x0E)
2281 {
2282 /* EGA HiRes mode */
2283 Palette = EgaPalette__HiRes;
2284 Size = ARRAYSIZE(EgaPalette__HiRes);
2285 }
2286 #if 0
2287 else if ((ModeNumber == 0x04) || (ModeNumber == 0x05))
2288 {
2289 /*
2290 * CGA modes; this palette contains both normal and
2291 * bright versions of CGA palettes 0 and 1
2292 */
2293 Palette = CgaPalette2;
2294 Size = ARRAYSIZE(CgaPalette2);
2295 }
2296 #endif
2297 else // if ((ModeNumber == 0x0D) || (ModeNumber == 0x0E))
2298 {
2299 /* EGA modes */
2300 Palette = EgaPalette__16Colors;
2301 Size = ARRAYSIZE(EgaPalette__16Colors);
2302 }
2303
2304 VgaSetPalette(Palette, Size);
2305 }
2306
2307 static __inline VOID VidBiosGetCursorPosition(PBYTE Row, PBYTE Column, BYTE Page)
2308 {
2309 *Row = HIBYTE(Bda->CursorPosition[Page]);
2310 *Column = LOBYTE(Bda->CursorPosition[Page]);
2311 }
2312
2313 static VOID VidBiosSetCursorPosition(BYTE Row, BYTE Column, BYTE Page)
2314 {
2315 /* Update the position in the BDA */
2316 Bda->CursorPosition[Page] = MAKEWORD(Column, Row);
2317
2318 /* Check if this is the current video page */
2319 if (Page == Bda->VideoPage)
2320 {
2321 WORD Offset = Row * Bda->ScreenColumns + Column;
2322
2323 /* Modify the CRTC registers */
2324 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_LOW_REG);
2325 IOWriteB(VGA_CRTC_DATA , LOBYTE(Offset));
2326 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_HIGH_REG);
2327 IOWriteB(VGA_CRTC_DATA , HIBYTE(Offset));
2328 }
2329 }
2330
2331 static VOID VidBiosSetCursorShape(WORD CursorStartEnd)
2332 {
2333 /* Only valid in text-mode */
2334 if (!IS_TEXT_MODE(Bda->VideoMode)) return;
2335
2336 /* Update the BDA */
2337 Bda->CursorStartLine = HIBYTE(CursorStartEnd) & 0x1F;
2338 Bda->CursorEndLine = LOBYTE(CursorStartEnd) & 0x1F;
2339
2340 /*
2341 * In cursor emulation mode, we suppose the cursor scanlines
2342 * to be in CGA mode, so that we need to adjust them
2343 *
2344 * WARNING!!
2345 * =========
2346 * Contrary to what is mentioned in lots of literature out there, e.g. in:
2347 * http://webpages.charter.net/danrollins/techhelp/0072.HTM
2348 * http://www.bioscentral.com/misc/bda.htm
2349 * and in other various places, bit 0 of Bda->VGAOptions is 0 when
2350 * cursor emulation is ENABLED, and is 1 when it is DISABLED.
2351 *
2352 * The following documentation is right about this fact:
2353 * http://www.cs.nyu.edu/~mwalfish/classes/ut/s12-cs372h/ref/hardware/vgadoc/VGABIOS.TXT
2354 * https://sites.google.com/site/pcdosretro/biosdata
2355 *
2356 * A proof that it is OK is that in the following code samples it is
2357 * explicitely mentioned that setting bit 0 disables cursor emulation:
2358 * - Code snippets in PC Magazine vol.5 num.15 of 16/09/1986, p.291-292;
2359 * - CardFile DOS utility (Jeff Prosise, PC Magazine vol.6 num.17 of 13/10/1987, p.403-416):
2360 * https://ia600700.us.archive.org/1/items/srccode-00000020/cardfile.asm.txt
2361 * (function 'show_cursor', "or ega_info,1 ;disable EGA cursor emulation")
2362 */
2363 if (!(Bda->VGAOptions & 0x01))
2364 {
2365 // HACK: Quick "fix" for cursor scanline adjustment. This must be reworked.
2366 DPRINT1("HACK: Using HACK for cursor scanlines adjustment\n");
2367 CursorStartEnd = MAKEWORD((LOBYTE(CursorStartEnd) & 0x1F) * 2,
2368 (HIBYTE(CursorStartEnd) & 0x1F) * 2 | (HIBYTE(CursorStartEnd) & 0xE0));
2369 }
2370
2371 /* Modify the CRTC registers */
2372 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_START_REG);
2373 IOWriteB(VGA_CRTC_DATA , HIBYTE(CursorStartEnd));
2374 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_END_REG);
2375 IOWriteB(VGA_CRTC_DATA , LOBYTE(CursorStartEnd));
2376 }
2377
2378 static VOID VidBiosSyncCursorPosition(VOID)
2379 {
2380 BYTE Row, Column;
2381 BYTE Low, High;
2382 SHORT ScreenColumns = Bda->ScreenColumns;
2383 WORD Offset;
2384
2385 /* Get the cursor position */
2386 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_LOW_REG);
2387 Low = IOReadB(VGA_CRTC_DATA);
2388 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_HIGH_REG);
2389 High = IOReadB(VGA_CRTC_DATA);
2390
2391 Offset = MAKEWORD(Low, High);
2392
2393 Row = (BYTE)(Offset / ScreenColumns);
2394 Column = (BYTE)(Offset % ScreenColumns);
2395
2396 /* Synchronize our cursor position with VGA */
2397 VidBiosSetCursorPosition(Row, Column, Bda->VideoPage);
2398 }
2399
2400 static inline BYTE VidBiosGetVideoMode(VOID)
2401 {
2402 /* Bit 7 of VideoMode is determined by bit 7 of VGAOptions */
2403 return Bda->VideoMode | (Bda->VGAOptions & 0x80);
2404 }
2405
2406 static inline VOID VidBiosClearScreen(VOID)
2407 {
2408 static const DWORD MemoryMaps[4] = { 0xA0000, 0xA0000, 0xB0000, 0xB8000 };
2409 static const DWORD MemorySizes[4] = { 0x20000, 0x10000, 0x08000, 0x08000 };
2410
2411 DWORD VideoAddress;
2412 DWORD BufferSize;
2413 BYTE Misc;
2414 BYTE Buffer[0x20000];
2415
2416 /* Read the misc register */
2417 IOWriteB(VGA_GC_INDEX, VGA_GC_MISC_REG);
2418 Misc = IOReadB(VGA_GC_DATA);
2419
2420 /* Get the video address and buffer size */
2421 VideoAddress = MemoryMaps[(Misc >> 2) & 3];
2422 BufferSize = MemorySizes[(Misc >> 2) & 3];
2423
2424 // !IS_TEXT_MODE(Bda->VideoMode)
2425 if (Misc & 1)
2426 {
2427 /* Graphics mode */
2428 RtlZeroMemory(Buffer, BufferSize);
2429 }
2430 else
2431 {
2432 /* Text mode */
2433 UINT i;
2434 for (i = 0; i < (BufferSize >> 1); i++)
2435 {
2436 ((PWORD)Buffer)[i] = MAKEWORD(' ', DEFAULT_ATTRIBUTE);
2437 }
2438 }
2439
2440 /* Write to video memory */
2441 EmulatorWriteMemory(&EmulatorContext, VideoAddress, Buffer, BufferSize);
2442 }
2443
2444 static BOOLEAN VidBiosSetVideoMode(BYTE ModeNumber)
2445 {
2446 BYTE Page;
2447 COORD Resolution;
2448 BYTE OrgModeNumber = ModeNumber;
2449
2450 /*
2451 * IBM standard modes do not clear the screen if the
2452 * high bit of AL is set (EGA or higher only).
2453 * See Ralf Brown: http://www.ctyme.com/intr/rb-0069.htm
2454 * for more information.
2455 */
2456 BOOLEAN DoNotClear = !!(ModeNumber & 0x80);
2457
2458 /* Retrieve the real mode number and check its validity */
2459 ModeNumber &= 0x7F;
2460 // if (ModeNumber >= ARRAYSIZE(VideoModes))
2461 if (ModeNumber > BIOS_MAX_VIDEO_MODE)
2462 {
2463 DPRINT1("VidBiosSetVideoMode -- Mode %02Xh invalid\n", ModeNumber);
2464 return FALSE;
2465 }
2466
2467 DPRINT1("Switching to mode %02Xh (%02Xh) %s clearing the screen; VgaRegisters = 0x%p\n",
2468 ModeNumber, OrgModeNumber, (DoNotClear ? "without" : "and"), VideoModes[ModeNumber].VgaRegisters);
2469
2470 if (!VgaSetRegisters(VideoModes[ModeNumber].VgaRegisters)) return FALSE;
2471
2472 VgaChangePalette(ModeNumber);
2473
2474 /* Clear the VGA memory if needed */
2475 if (!DoNotClear) VgaClearMemory();
2476
2477 /* Update the values in the BDA */
2478 Bda->VideoMode = ModeNumber;
2479 Bda->VideoPageSize = VideoModes[ModeNumber].PageSize;
2480 Bda->VideoPage = 0;
2481 Bda->VideoPageOffset = Bda->VideoPage * Bda->VideoPageSize;
2482
2483 /* 256 KB Video RAM; set bit 7 if we do not clear the screen */
2484 Bda->VGAOptions = 0x60 | (Bda->VGAOptions & 0x7F) | (DoNotClear ? 0x80 : 0x00);
2485 Bda->VGASwitches = 0xF9; /* High-resolution */
2486
2487 // Bda->VGAFlags;
2488 // Bda->CrtModeControl;
2489 // Bda->CrtColorPaletteMask;
2490
2491 /* Set the start address in the CRTC */
2492 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG);
2493 IOWriteB(VGA_CRTC_DATA , LOBYTE(Bda->VideoPageOffset));
2494 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_HIGH_REG);
2495 IOWriteB(VGA_CRTC_DATA , HIBYTE(Bda->VideoPageOffset));
2496
2497 /* Update the screen size */
2498 Resolution = VgaGetDisplayResolution();
2499 // This could be simplified if the VGA helper always returned the resolution
2500 // in number of pixels, instead of in number of cells for text-modes only...
2501 if (!IS_TEXT_MODE(ModeNumber))
2502 {
2503 Resolution.X /= VideoModes[ModeNumber].CharacterWidth ;
2504 Resolution.Y /= VideoModes[ModeNumber].CharacterHeight;
2505 }
2506 Bda->ScreenColumns = Resolution.X;
2507 Bda->ScreenRows = Resolution.Y - 1;
2508
2509 /* Update the current font */
2510 Bda->CharacterHeight = VideoModes[ModeNumber].CharacterHeight;
2511 switch (Bda->CharacterHeight)
2512 {
2513 /*
2514 * Write the default font to the VGA font plane for text-modes only.
2515 * Update the BIOS INT 43h vector (far pointer to the character range 00h-...).
2516 */
2517 case 8:
2518 {
2519 if (IS_TEXT_MODE(ModeNumber))
2520 VgaWriteTextModeFont(0, Font8x8, ARRAYSIZE(Font8x8) / VGA_FONT_CHARACTERS);
2521
2522 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x8_OFFSET, VIDEO_BIOS_DATA_SEG);
2523 break;
2524 }
2525 case 14:
2526 {
2527 if (IS_TEXT_MODE(ModeNumber))
2528 VgaWriteTextModeFont(0, Font8x14, ARRAYSIZE(Font8x14) / VGA_FONT_CHARACTERS);
2529
2530 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x14_OFFSET, VIDEO_BIOS_DATA_SEG);
2531 break;
2532 }
2533 case 16:
2534 {
2535 if (IS_TEXT_MODE(ModeNumber))
2536 VgaWriteTextModeFont(0, Font8x16, ARRAYSIZE(Font8x16) / VGA_FONT_CHARACTERS);
2537
2538 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
2539 break;
2540 }
2541 }
2542
2543 #if 0 // Commented, because I need to think about how to change correctly the ScreenRows
2544 // in the code that really use it (the Font generator functions of INT 10h, AH=11h)
2545 // so that it also changes the screen resolution *in text mode only*.
2546 switch (getBL())
2547 {
2548 case 0x00: Bda->ScreenRows = getDL()-1; break;
2549 case 0x01: Bda->ScreenRows = 13; break;
2550 case 0x03: Bda->ScreenRows = 42; break;
2551 case 0x02:
2552 default : Bda->ScreenRows = 24; break;
2553 }
2554 #endif
2555
2556 /*
2557 * Update the cursor shape (text-mode only).
2558 * Use the default CGA cursor scanline values,
2559 * see: http://vitaly_filatov.tripod.com/ng/asm/asm_023.2.html
2560 */
2561 if (IS_TEXT_MODE(ModeNumber))
2562 // FIXME: we might read the CRT registers and do the adjustment?
2563 VidBiosSetCursorShape(MAKEWORD(0x07, 0x06));
2564
2565 /* Set the cursor position for each page */
2566 for (Page = 0; Page < BIOS_MAX_PAGES; ++Page)
2567 VidBiosSetCursorPosition(0, 0, Page);
2568
2569 if (!DoNotClear) VidBiosClearScreen();
2570
2571 /* Refresh display */
2572 VgaRefreshDisplay();
2573
2574 return TRUE;
2575 }
2576
2577 static BOOLEAN VidBiosSetVideoPage(BYTE PageNumber)
2578 {
2579 BYTE Row, Column;
2580
2581 /* Check if the page exists */
2582 if (PageNumber >= BIOS_MAX_PAGES) return FALSE;
2583
2584 /* Check if this is the same page */
2585 if (PageNumber == Bda->VideoPage) return TRUE;
2586
2587 /* Update the values in the BDA */
2588 Bda->VideoPage = PageNumber;
2589 Bda->VideoPageOffset = Bda->VideoPage * Bda->VideoPageSize;
2590
2591 /* Set the start address in the CRTC */
2592 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG);
2593 IOWriteB(VGA_CRTC_DATA , LOBYTE(Bda->VideoPageOffset));
2594 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_HIGH_REG);
2595 IOWriteB(VGA_CRTC_DATA , HIBYTE(Bda->VideoPageOffset));
2596
2597 /*
2598 * Get the cursor position (we don't update anything on the BIOS side
2599 * but we update the cursor position on the VGA side).
2600 */
2601 VidBiosGetCursorPosition(&Row, &Column, PageNumber);
2602 VidBiosSetCursorPosition( Row, Column, PageNumber);
2603
2604 return TRUE;
2605 }
2606
2607 static VOID VidBiosDrawGlyph(WORD CharData, BOOLEAN UseAttr, BYTE Page, BYTE Row, BYTE Column)
2608 {
2609 switch (Bda->VideoMode)
2610 {
2611 /* Alphanumeric mode */
2612 case 0x00:
2613 case 0x01:
2614 case 0x02:
2615 case 0x03:
2616 case 0x07:
2617 {
2618 EmulatorWriteMemory(&EmulatorContext,
2619 TO_LINEAR(TEXT_VIDEO_SEG,
2620 Page * Bda->VideoPageSize +
2621 (Row * Bda->ScreenColumns + Column) * sizeof(WORD)),
2622 (LPVOID)&CharData,
2623 UseAttr ? sizeof(WORD) : sizeof(BYTE));
2624 break;
2625 }
2626
2627 /* 4-color CGA */
2628 case 0x04:
2629 case 0x05:
2630 {
2631 WORD i;
2632 WORD CgaSegment[] = { CGA_EVEN_VIDEO_SEG, CGA_ODD_VIDEO_SEG };
2633 PUCHAR Font = (PUCHAR)FAR_POINTER(((PULONG)BaseAddress)[0x43]);
2634 PUCHAR Glyph = &Font[LOBYTE(CharData) * Bda->CharacterHeight];
2635 BOOLEAN Xor = (HIBYTE(CharData) & 0x80) ? TRUE : FALSE;
2636 BYTE OldRotate;
2637 BYTE DoubledBits[] =
2638 {
2639 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,
2640 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF
2641 };
2642
2643 if (Xor)
2644 {
2645 /* Set the logical operation to XOR */
2646 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2647 OldRotate = IOReadB(VGA_GC_DATA);
2648 IOWriteB(VGA_GC_DATA, OldRotate | 0x18);
2649 }
2650
2651 for (i = 0; i < Bda->CharacterHeight; i++)
2652 {
2653 WORD Pixel = MAKEWORD(DoubledBits[Glyph[i] >> 4],
2654 DoubledBits[Glyph[i] & 0x0F]);
2655 if (Xor)
2656 {
2657 USHORT Dummy;
2658
2659 /* Read from VGA memory to load the latch register */
2660 EmulatorReadMemory(&EmulatorContext,
2661 TO_LINEAR(CgaSegment[(Row * Bda->CharacterHeight + i) & 1],
2662 (((Row * Bda->CharacterHeight + i) >> 1)
2663 * Bda->ScreenColumns + Column) * 2),
2664 (LPVOID)&Dummy,
2665 sizeof(USHORT));
2666 }
2667
2668 EmulatorWriteMemory(&EmulatorContext,
2669 TO_LINEAR(CgaSegment[(Row * Bda->CharacterHeight + i) & 1],
2670 (((Row * Bda->CharacterHeight + i) >> 1)
2671 * Bda->ScreenColumns + Column) * 2),
2672 (LPVOID)&Pixel,
2673 sizeof(USHORT));
2674 }
2675
2676 if (Xor)
2677 {
2678 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2679 IOWriteB(VGA_GC_DATA, OldRotate);
2680 }
2681
2682 break;
2683 }
2684
2685 /* 2-color CGA */
2686 case 0x06:
2687 {
2688 WORD i;
2689 WORD CgaSegment[] = { CGA_EVEN_VIDEO_SEG, CGA_ODD_VIDEO_SEG };
2690 PUCHAR Font = (PUCHAR)FAR_POINTER(((PULONG)BaseAddress)[0x43]);
2691 PUCHAR Glyph = &Font[LOBYTE(CharData) * Bda->CharacterHeight];
2692 BOOLEAN Xor = (HIBYTE(CharData) & 0x80) ? TRUE : FALSE;
2693 BYTE OldRotate;
2694
2695 if (Xor)
2696 {
2697 /* Set the logical operation to XOR */
2698 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2699 OldRotate = IOReadB(VGA_GC_DATA);
2700 IOWriteB(VGA_GC_DATA, OldRotate | 0x18);
2701 }
2702
2703 for (i = 0; i < Bda->CharacterHeight; i++)
2704 {
2705 if (Xor)
2706 {
2707 UCHAR Dummy;
2708
2709 /* Read from VGA memory to load the latch register */
2710 EmulatorReadMemory(&EmulatorContext,
2711 TO_LINEAR(CgaSegment[(Row * Bda->CharacterHeight + i) & 1],
2712 (((Row * Bda->CharacterHeight + i) >> 1)
2713 * Bda->ScreenColumns) + Column),
2714 (LPVOID)&Dummy,
2715 sizeof(UCHAR));
2716 }
2717
2718 EmulatorWriteMemory(&EmulatorContext,
2719 TO_LINEAR(CgaSegment[(Row * Bda->CharacterHeight + i) & 1],
2720 (((Row * Bda->CharacterHeight + i) >> 1)
2721 * Bda->ScreenColumns) + Column),
2722 (LPVOID)&Glyph[i],
2723 sizeof(UCHAR));
2724 }
2725
2726 if (Xor)
2727 {
2728 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2729 IOWriteB(VGA_GC_DATA, OldRotate);
2730 }
2731
2732 break;
2733 }
2734
2735 /* 16-color modes */
2736 case 0x0D:
2737 case 0x0E:
2738 case 0x10:
2739 case 0x11:
2740 case 0x12:
2741 {
2742 WORD i;
2743 PUCHAR Font = (PUCHAR)FAR_POINTER(((PULONG)BaseAddress)[0x43]);
2744 PUCHAR Glyph = &Font[LOBYTE(CharData) * Bda->CharacterHeight];
2745 BOOLEAN Xor = (HIBYTE(CharData) & 0x80) ? TRUE : FALSE;
2746 BYTE OldPlaneWrite, OldReset, OldEnableReset, OldRotate, OldMode;
2747
2748 /* Write to all planes */
2749 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_MASK_REG);
2750 OldPlaneWrite = IOReadB(VGA_SEQ_DATA);
2751 IOWriteB(VGA_SEQ_DATA, 0x0F);
2752
2753 /* Zero the planes whose bits are set in the enable set/reset register */
2754 IOWriteB(VGA_GC_INDEX, VGA_GC_RESET_REG);
2755 OldReset = IOReadB(VGA_GC_DATA);
2756 IOWriteB(VGA_GC_DATA, 0x00);
2757
2758 /* Set the enable set/reset register to the inverse of the color */
2759 IOWriteB(VGA_GC_INDEX, VGA_GC_ENABLE_RESET_REG);
2760 OldEnableReset = IOReadB(VGA_GC_DATA);
2761 IOWriteB(VGA_GC_DATA, (~HIBYTE(CharData)) & 0x0F);
2762
2763 /* Make sure we're in write mode 0 */
2764 IOWriteB(VGA_GC_INDEX, VGA_GC_MODE_REG);
2765 OldMode = IOReadB(VGA_GC_DATA);
2766 IOWriteB(VGA_GC_DATA, 0x00);
2767
2768 if (Xor)
2769 {
2770 /* Set the logical operation to XOR */
2771 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2772 OldRotate = IOReadB(VGA_GC_DATA);
2773 IOWriteB(VGA_GC_DATA, OldRotate | 0x18);
2774 }
2775
2776 for (i = 0; i < Bda->CharacterHeight; i++)
2777 {
2778 if (Xor)
2779 {
2780 UCHAR Dummy;
2781
2782 /* Read from VGA memory to load the latch register */
2783 EmulatorReadMemory(&EmulatorContext,
2784 TO_LINEAR(GRAPHICS_VIDEO_SEG,
2785 ((Row * Bda->CharacterHeight + i)
2786 * Bda->ScreenColumns) + Column),
2787 (LPVOID)&Dummy,
2788 sizeof(UCHAR));
2789 }
2790
2791 EmulatorWriteMemory(&EmulatorContext,
2792 TO_LINEAR(GRAPHICS_VIDEO_SEG,
2793 ((Row * Bda->CharacterHeight + i)
2794 * Bda->ScreenColumns) + Column),
2795 (LPVOID)&Glyph[i],
2796 sizeof(UCHAR));
2797 }
2798
2799 /* Restore the registers */
2800 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_MASK_REG);
2801 IOWriteB(VGA_SEQ_DATA, OldPlaneWrite);
2802 IOWriteB(VGA_GC_INDEX, VGA_GC_RESET_REG);
2803 IOWriteB(VGA_GC_DATA, OldReset);
2804 IOWriteB(VGA_GC_INDEX, VGA_GC_ENABLE_RESET_REG);
2805 IOWriteB(VGA_GC_DATA, OldEnableReset);
2806 IOWriteB(VGA_GC_INDEX, VGA_GC_MODE_REG);
2807 IOWriteB(VGA_GC_DATA, OldMode);
2808
2809 if (Xor)
2810 {
2811 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2812 IOWriteB(VGA_GC_DATA, OldRotate);
2813 }
2814
2815 break;
2816 }
2817
2818 /* 256-color mode */
2819 case 0x13:
2820 {
2821 WORD i, j;
2822 PUCHAR Font = (PUCHAR)FAR_POINTER(((PULONG)BaseAddress)[0x43]);
2823 PUCHAR Glyph = &Font[LOBYTE(CharData) * Bda->CharacterHeight];
2824 BYTE PixelBuffer[8]; // 8 == CharacterWidth
2825
2826 for (i = 0; i < Bda->CharacterHeight; i++)
2827 {
2828 for (j = 0; j < ARRAYSIZE(PixelBuffer); j++)
2829 {
2830 PixelBuffer[j] = (Glyph[i] & (1 << (7 - j))) ? HIBYTE(CharData) : 0;
2831 }
2832
2833 EmulatorWriteMemory(&EmulatorContext,
2834 TO_LINEAR(GRAPHICS_VIDEO_SEG,
2835 ((Row * Bda->CharacterHeight + i)
2836 * Bda->ScreenColumns + Column) * 8),
2837 (LPVOID)PixelBuffer,
2838 sizeof(PixelBuffer));
2839 }
2840
2841 break;
2842 }
2843
2844 default:
2845 {
2846 DPRINT1("Drawing glyphs in mode %02Xh is not supported.\n", Bda->VideoMode);
2847 }
2848 }
2849 }
2850
2851 static VOID VidBiosPrintCharacter(CHAR Character, BYTE Attribute, BOOLEAN UseAttr, BYTE Page)
2852 {
2853 WORD CharData = MAKEWORD(Character, Attribute);
2854 BYTE Row, Column;
2855
2856 /* Get the cursor position */
2857 VidBiosGetCursorPosition(&Row, &Column, Page);
2858
2859 if (Character == '\a')
2860 {
2861 /* Bell control character */
2862 // NOTE: We may use what the terminal emulator offers to us...
2863 Beep(800, 200);
2864 return;
2865 }
2866 else if (Character == '\b')
2867 {
2868 /* Backspace control character */
2869 if (Column > 0)
2870 {
2871 Column--;
2872 }
2873 else if (Row > 0)
2874 {
2875 Column = Bda->ScreenColumns - 1;
2876 Row--;
2877 }
2878
2879 /* Erase the existing character */
2880 CharData = MAKEWORD(' ', Attribute);
2881 VidBiosDrawGlyph(CharData, UseAttr, Page, Row, Column);
2882 }
2883 else if (Character == '\t')
2884 {
2885 /* Horizontal Tabulation control character */
2886 do
2887 {
2888 // Taken from DOSBox
2889 VidBiosPrintCharacter(' ', Attribute, UseAttr, Page);
2890 VidBiosGetCursorPosition(&Row, &Column, Page);
2891 } while (Column % 8);
2892 }
2893 else if (Character == '\n')
2894 {
2895 /* Line Feed control character */
2896 Row++;
2897 }
2898 else if (Character == '\r')
2899 {
2900 /* Carriage Return control character */
2901 Column = 0;
2902 }
2903 else
2904 {
2905 /* Default character */
2906
2907 /* Write the character and advance the cursor */
2908 VidBiosDrawGlyph(CharData, UseAttr, Page, Row, Column);
2909 Column++;
2910 }
2911
2912 /* Check if it passed the end of the row */
2913 if (Column >= Bda->ScreenColumns)
2914 {
2915 /* Return to the first column and go to the next line */
2916 Column = 0;
2917 Row++;
2918 }
2919
2920 /* Scroll the screen up if needed */
2921 if (Row > Bda->ScreenRows)
2922 {
2923 /* The screen must be scrolled up */
2924 SMALL_RECT Rectangle = { 0, 0, Bda->ScreenColumns - 1, Bda->ScreenRows };
2925 VidBiosScrollWindow(SCROLL_UP, 1, Rectangle, Page, DEFAULT_ATTRIBUTE/*Attribute*/);
2926 Row--;
2927 }
2928
2929 /* Set the cursor position */
2930 VidBiosSetCursorPosition(Row, Column, Page);
2931 }
2932
2933 /* PUBLIC FUNCTIONS ***********************************************************/
2934
2935 VOID WINAPI VidBiosVideoService(LPWORD Stack)
2936 {
2937 switch (getAH())
2938 {
2939 /* Set Video Mode */
2940 case 0x00:
2941 {
2942 VidBiosSetVideoMode(getAL());
2943 break;
2944 }
2945
2946 /* Set Text-Mode Cursor Shape */
2947 case 0x01:
2948 {
2949 VidBiosSetCursorShape(getCX());
2950 break;
2951 }
2952
2953 /* Set Cursor Position */
2954 case 0x02:
2955 {
2956 BYTE Page = getBH();
2957
2958 /* Validate the selected video page */
2959 if (Page >= BIOS_MAX_PAGES) break;
2960
2961 VidBiosSetCursorPosition(getDH(), getDL(), Page);
2962 break;
2963 }
2964
2965 /* Get Cursor Position and Shape */
2966 case 0x03:
2967 {
2968 BYTE Page = getBH();
2969
2970 /* Validate the selected video page */
2971 if (Page == 0xFF) // Special case: use the current video page
2972 Page = Bda->VideoPage;
2973 else if (Page >= BIOS_MAX_PAGES)
2974 break;
2975
2976 /* Return the result */
2977 setCX(MAKEWORD(Bda->CursorEndLine, Bda->CursorStartLine));
2978 setDX(Bda->CursorPosition[Page]);
2979 break;
2980 }
2981
2982 /* Query Light Pen */
2983 case 0x04:
2984 {
2985 /*
2986 * On modern BIOSes, this function returns 0
2987 * so that we can ignore the other registers.
2988 */
2989 setAX(0);
2990 break;
2991 }
2992
2993 /* Select Active Display Page */
2994 case 0x05:
2995 {
2996 VidBiosSetVideoPage(getAL());
2997 break;
2998 }
2999
3000 /* Scroll Window Up/Down */
3001 case 0x06:
3002 case 0x07:
3003 {
3004 SMALL_RECT Rectangle = { getCL(), getCH(), getDL(), getDH() };
3005
3006 VidBiosScrollWindow((getAH() == 0x06) ? SCROLL_UP : SCROLL_DOWN,
3007 getAL(), Rectangle, Bda->VideoPage, getBH());
3008
3009 break;
3010 }
3011
3012 /* Read Character and Attribute at Cursor Position */
3013 case 0x08:
3014 {
3015 WORD CharData;
3016 BYTE Page = getBH();
3017 DWORD Offset;
3018
3019 /* Validate the selected video page */
3020 if (Page == 0xFF) // Special case: use the current video page
3021 Page = Bda->VideoPage;
3022 else if (Page >= BIOS_MAX_PAGES)
3023 break;
3024
3025 /* Find the offset of the character */
3026 Offset = Page * Bda->VideoPageSize +
3027 (HIBYTE(Bda->CursorPosition[Page]) * Bda->ScreenColumns +
3028 LOBYTE(Bda->CursorPosition[Page])) * 2;
3029
3030 /* Read from the video memory */
3031 EmulatorReadMemory(&EmulatorContext,
3032 TO_LINEAR(TEXT_VIDEO_SEG, Offset),
3033 (LPVOID)&CharData,
3034 sizeof(WORD));
3035
3036 /* Return the character data in AX */
3037 setAX(CharData);
3038
3039 break;
3040 }
3041
3042 /* Write Character and Attribute at Cursor Position */
3043 case 0x09:
3044 /* Write Character only (PCjr: + Attribute) at Cursor Position */
3045 case 0x0A:
3046 {
3047 WORD Counter = getCX();
3048 WORD CharData = MAKEWORD(getAL(), getBL());
3049 BOOLEAN UseAttr = (getAH() == 0x09);
3050 BYTE Page = getBH();
3051 BYTE Row, Column;
3052
3053 /* Validate the selected video page */
3054 if (Page == 0xFF) // Special case: use the current video page
3055 Page = Bda->VideoPage;
3056 else if (Page >= BIOS_MAX_PAGES)
3057 break;
3058
3059 /* Get the cursor position */
3060 VidBiosGetCursorPosition(&Row, &Column, Page);
3061
3062 /* Write to video memory a certain number of times */
3063 while (Counter-- > 0)
3064 {
3065 /* Write the character and advance the position */
3066 VidBiosDrawGlyph(CharData, UseAttr, Page, Row, Column);
3067 Column++;
3068
3069 /* Check if it passed the end of the row */
3070 if (Column >= Bda->ScreenColumns)
3071 {
3072 /* Return to the first column and go to the next line */
3073 Column = 0;
3074 Row++;
3075 }
3076
3077 /* Contrary to the "Teletype Output" function, the screen is not scrolled */
3078 if (Row > Bda->ScreenRows)
3079 {
3080 Row = Bda->ScreenRows;
3081 }
3082 }
3083
3084 break;
3085 }
3086
3087 /* Set Video Colors */
3088 case 0x0B:
3089 {
3090 if (Bda->VideoMode < 0x04 || Bda->VideoMode > 0x06)
3091 {
3092 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X is unsupported for non-CGA modes\n",
3093 getBH());
3094 break;
3095 }
3096
3097 switch (getBH())
3098 {
3099 case 0x00: /* Set Background/Border Color */
3100 {
3101 #ifdef DOSBOX
3102 BYTE Index = getBL();
3103
3104 /* See: http://www.bioscentral.com/misc/bda.htm */
3105 Bda->CrtColorPaletteMask = (Bda->CrtColorPaletteMask & 0xE0) | (Index & 0x1F);
3106
3107 Index = ((Index << 1) & 0x10) | (Index & 0x7);
3108
3109 /* Always set the overscan color */
3110 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Index);
3111
3112 /* Don't set any extra colors when in text mode */
3113 if (Bda->VideoMode <= 0x03) break;
3114
3115 VgaSetSinglePaletteRegister(0x00, Index);
3116
3117 Index = (Bda->CrtColorPaletteMask & 0x10) | 0x02 | ((Bda->CrtColorPaletteMask & 0x20) >> 5);
3118
3119 VgaSetSinglePaletteRegister(0x01, Index);
3120 Index += 2;
3121 VgaSetSinglePaletteRegister(0x02, Index);
3122 Index += 2;
3123 VgaSetSinglePaletteRegister(0x03, Index);
3124 #else
3125 /* Background/Border Color is modifiable via the first index */
3126 VgaSetSinglePaletteRegister(0x00, getBL());
3127 #endif
3128
3129 /* Enable screen and disable palette access */
3130 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3131 IOWriteB(VGA_AC_INDEX, 0x20);
3132 break;
3133 }
3134
3135 case 0x01: /* Set Palette */
3136 {
3137 BYTE Index = getBL();
3138
3139 /* See: http://www.bioscentral.com/misc/bda.htm */
3140 /* Reset bit 5: foreground colors index (0: green/red/yellow; 1: cyan/magenta/white) */
3141 Bda->CrtColorPaletteMask = (Bda->CrtColorPaletteMask & 0xDF) | ((Index & 1) ? 0x20 : 0x00);
3142
3143 /* Don't set any extra colors when in text mode */
3144 if (Bda->VideoMode <= 0x03) break;
3145
3146 Index = (Bda->CrtColorPaletteMask & 0x10) | 0x02 | Index;
3147
3148 VgaSetSinglePaletteRegister(0x01, Index);
3149 Index += 2;
3150 VgaSetSinglePaletteRegister(0x02, Index);
3151 Index += 2;
3152 VgaSetSinglePaletteRegister(0x03, Index);
3153
3154 /* Enable screen and disable palette access */
3155 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3156 IOWriteB(VGA_AC_INDEX, 0x20);
3157 break;
3158 }
3159
3160 default:
3161 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X NOT IMPLEMENTED\n",
3162 getAH(), getBH());
3163 break;
3164 }
3165
3166 break;
3167 }
3168
3169 /* Teletype Output */
3170 case 0x0E:
3171 {
3172 BYTE Page = getBH();
3173
3174 /* Validate the selected video page */
3175 if (Page == 0xFF) // Special case: use the current video page
3176 Page = Bda->VideoPage;
3177 else if (Page >= BIOS_MAX_PAGES)
3178 break;
3179
3180 VidBiosPrintCharacter(getAL(), getBL(), !IS_TEXT_MODE(Bda->VideoMode), Page);
3181 break;
3182 }
3183
3184 /* Get Current Video Mode */
3185 case 0x0F:
3186 {
3187 setAX(MAKEWORD(VidBiosGetVideoMode(), Bda->ScreenColumns));
3188 setBH(Bda->VideoPage);
3189 break;
3190 }
3191
3192 /* Palette Control */
3193 case 0x10:
3194 {
3195 switch (getAL())
3196 {
3197 /* Set Single Palette Register */
3198 case 0x00:
3199 {
3200 VgaSetSinglePaletteRegister(getBL(), getBH());
3201
3202 /* Enable screen and disable palette access */
3203 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3204 IOWriteB(VGA_AC_INDEX, 0x20);
3205 break;
3206 }
3207
3208 /* Set Overscan Color */
3209 case 0x01:
3210 {
3211 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, getBH());
3212
3213 /* Enable screen and disable palette access */
3214 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3215 IOWriteB(VGA_AC_INDEX, 0x20);
3216 break;
3217 }
3218
3219 /* Set All Palette Registers */
3220 case 0x02:
3221 {
3222 UINT i;
3223 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3224
3225 /* Set the palette registers */
3226 for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
3227 {
3228 VgaSetSinglePaletteRegister(i, Buffer[i]);
3229 }
3230
3231 /* Set the overscan register */
3232 // VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Buffer[VGA_AC_PAL_F_REG + 1]);
3233 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
3234 IOWriteB(VGA_AC_WRITE, Buffer[VGA_AC_PAL_F_REG + 1]);
3235
3236 /* Enable screen and disable palette access */
3237 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3238 IOWriteB(VGA_AC_INDEX, 0x20);
3239 break;
3240 }
3241
3242 /* Toggle Intensity/Blinking Bit */
3243 case 0x03:
3244 {
3245 /* Read the old AC mode control register value */
3246 BYTE VgaAcControlReg;
3247 IOWriteB(VGA_AC_INDEX, VGA_AC_CONTROL_REG);
3248 VgaAcControlReg = IOReadB(VGA_AC_READ);
3249
3250 /* Toggle the blinking bit and write the new value */
3251 if (getBL())
3252 {
3253 VgaAcControlReg |= VGA_AC_CONTROL_BLINK;
3254 Bda->CrtModeControl |= (1 << 5);
3255 }
3256 else
3257 {
3258 VgaAcControlReg &= ~VGA_AC_CONTROL_BLINK;
3259 Bda->CrtModeControl &= ~(1 << 5);
3260 }
3261
3262 IOWriteB(VGA_AC_INDEX, VGA_AC_CONTROL_REG);
3263 IOWriteB(VGA_AC_WRITE, VgaAcControlReg);
3264
3265 /* Enable screen and disable palette access */
3266 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3267 IOWriteB(VGA_AC_INDEX, 0x20);
3268 break;
3269 }
3270
3271 /* Get Single Palette Register */
3272 case 0x07:
3273 {
3274 /* Write the index */
3275 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3276 IOWriteB(VGA_AC_INDEX, getBL());
3277
3278 /* Read the data */
3279 setBH(IOReadB(VGA_AC_READ));
3280
3281 /* Enable screen and disable palette access */
3282 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3283 IOWriteB(VGA_AC_INDEX, 0x20);
3284 break;
3285 }
3286
3287 /* Get Overscan Color */
3288 case 0x08:
3289 {
3290 /* Write the index */
3291 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3292 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
3293
3294 /* Read the data */
3295 setBH(IOReadB(VGA_AC_READ));
3296
3297 /* Enable screen and disable palette access */
3298 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3299 IOWriteB(VGA_AC_INDEX, 0x20);
3300 break;
3301 }
3302
3303 /* Get All Palette Registers */
3304 case 0x09:
3305 {
3306 UINT i;
3307 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3308
3309 /* Get the palette registers */
3310 for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
3311 {
3312 /* Write the index */
3313 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3314 IOWriteB(VGA_AC_INDEX, i);
3315
3316 /* Read the data */
3317 Buffer[i] = IOReadB(VGA_AC_READ);
3318 }
3319
3320 /* Get the overscan register */
3321 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
3322 Buffer[VGA_AC_PAL_F_REG + 1] = IOReadB(VGA_AC_READ);
3323
3324 /* Enable screen and disable palette access */
3325 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3326 IOWriteB(VGA_AC_INDEX, 0x20);
3327 break;
3328 }
3329
3330 /* Set Individual DAC Register */
3331 case 0x10:
3332 {
3333 /* Write the index */
3334 // Certainly in BL and not in BX as said by Ralf Brown...
3335 IOWriteB(VGA_DAC_WRITE_INDEX, getBL());
3336
3337 /* Write the data in this order: Red, Green, Blue */
3338 IOWriteB(VGA_DAC_DATA, getDH());
3339 IOWriteB(VGA_DAC_DATA, getCH());
3340 IOWriteB(VGA_DAC_DATA, getCL());
3341
3342 break;
3343 }
3344
3345 /* Set Block of DAC Registers */
3346 case 0x12:
3347 {
3348 UINT i;
3349 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3350
3351 /* Write the index */
3352 // Certainly in BL and not in BX as said by Ralf Brown...
3353 IOWriteB(VGA_DAC_WRITE_INDEX, getBL());
3354
3355 for (i = 0; i < getCX(); i++)
3356 {
3357 /* Write the data in this order: Red, Green, Blue */
3358 IOWriteB(VGA_DAC_DATA, *Buffer++);
3359 IOWriteB(VGA_DAC_DATA, *Buffer++);
3360 IOWriteB(VGA_DAC_DATA, *Buffer++);
3361 }
3362
3363 break;
3364 }
3365
3366 /* Get Individual DAC Register */
3367 case 0x15:
3368 {
3369 /* Write the index */
3370 IOWriteB(VGA_DAC_READ_INDEX, getBL());
3371
3372 /* Read the data in this order: Red, Green, Blue */
3373 setDH(IOReadB(VGA_DAC_DATA));
3374 setCH(IOReadB(VGA_DAC_DATA));
3375 setCL(IOReadB(VGA_DAC_DATA));
3376
3377 break;
3378 }
3379
3380 /* Get Block of DAC Registers */
3381 case 0x17:
3382 {
3383 UINT i;
3384 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3385
3386 /* Write the index */
3387 // Certainly in BL and not in BX as said by Ralf Brown...
3388 IOWriteB(VGA_DAC_READ_INDEX, getBL());
3389
3390 for (i = 0; i < getCX(); i++)
3391 {
3392 /* Write the data in this order: Red, Green, Blue */
3393 *Buffer++ = IOReadB(VGA_DAC_DATA);
3394 *Buffer++ = IOReadB(VGA_DAC_DATA);
3395 *Buffer++ = IOReadB(VGA_DAC_DATA);
3396 }
3397
3398 break;
3399 }
3400
3401 /* Set PEL Mask */
3402 case 0x18:
3403 {
3404 IOWriteB(VGA_DAC_MASK, getBL());
3405 break;
3406 }
3407
3408 /* Get PEL Mask */
3409 case 0x19:
3410 {
3411 setBL(IOReadB(VGA_DAC_MASK));
3412 break;
3413 }
3414
3415 default:
3416 {
3417 DPRINT1("BIOS Palette Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3418 getAL());
3419 break;
3420 }
3421 }
3422
3423 break;
3424 }
3425
3426 /* Font Control */
3427 case 0x11:
3428 {
3429 switch (getAL())
3430 {
3431 // FIXME: At the moment we support only graphics-mode functions!
3432
3433 /* Load User-specified Patterns (Character Set) for Text Mode */
3434 case 0x00:
3435 case 0x10: // FIXME: 0x1x performs a full mode reset
3436 {
3437 // FIXME: BL == ??
3438
3439 /* Write the default font to the VGA font plane */
3440 // VgaWriteTextModeFont(0, Font8x8, ARRAYSIZE(Font8x8) / VGA_FONT_CHARACTERS);
3441
3442 UNIMPLEMENTED;
3443 break;
3444 }
3445
3446 /* Load ROM Monochrome 8x14 Patterns (Character Set) for Text Mode */
3447 case 0x01:
3448 case 0x11: // FIXME: 0x1x performs a full mode reset
3449 {
3450 // FIXME: BL == ??
3451
3452 /* Write the default font to the VGA font plane */
3453 VgaWriteTextModeFont(0, Font8x14, ARRAYSIZE(Font8x14) / VGA_FONT_CHARACTERS);
3454
3455 UNIMPLEMENTED;
3456 break;
3457 }
3458
3459 /* Load ROM 8x8 Double-dot Patterns (Character Set) for Text Mode */
3460 case 0x02:
3461 case 0x12: // FIXME: 0x1x performs a full mode reset
3462 {
3463 // FIXME: BL == ??
3464
3465 /* Write the default font to the VGA font plane */
3466 VgaWriteTextModeFont(0, Font8x8, ARRAYSIZE(Font8x8) / VGA_FONT_CHARACTERS);
3467
3468 UNIMPLEMENTED;
3469 break;
3470 }
3471
3472 /* Load ROM 8x16 Character Set for Text Mode */
3473 case 0x04:
3474 case 0x14: // FIXME: 0x1x performs a full mode reset
3475 {
3476 // FIXME: BL == ??
3477
3478 /* Write the default font to the VGA font plane */
3479 VgaWriteTextModeFont(0, Font8x16, ARRAYSIZE(Font8x16) / VGA_FONT_CHARACTERS);
3480
3481 UNIMPLEMENTED;
3482 break;
3483 }
3484
3485 /* Set User 8x8 Graphics Chars (Setup INT 1Fh Vector) */
3486 case 0x20:
3487 {
3488 /* Update the BIOS INT 1Fh vector to user-defined ES:BP pointer */
3489 // Far pointer to the 8x8 characters 80h-FFh
3490 ((PULONG)BaseAddress)[0x1F] = MAKELONG(getBP(), getES());
3491 break;
3492 }
3493
3494 /* Set User Graphics Characters */
3495 case 0x21:
3496 {
3497 /*
3498 * Update the BIOS INT 43h vector (far pointer
3499 * to the character range 00h-...)
3500 */
3501 ((PULONG)BaseAddress)[0x43] = MAKELONG(getBP(), getES());
3502
3503 /* Update BDA */
3504 Bda->CharacterHeight = getCX();
3505 switch (getBL())
3506 {
3507 case 0x00: Bda->ScreenRows = getDL()-1; break;
3508 case 0x01: Bda->ScreenRows = 13; break;
3509 case 0x03: Bda->ScreenRows = 42; break;
3510 case 0x02:
3511 default : Bda->ScreenRows = 24; break;
3512 }
3513
3514 break;
3515 }
3516
3517 /* Setup ROM 8x14 Font for Graphics Mode */
3518 case 0x22:
3519 {
3520 /*
3521 * Update the BIOS INT 43h vector (far pointer
3522 * to the character range 00h-...)
3523 */
3524 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x14_OFFSET, VIDEO_BIOS_DATA_SEG);
3525
3526 /* Update BDA */
3527 Bda->CharacterHeight = 14;
3528 switch (getBL())
3529 {
3530 case 0x00: Bda->ScreenRows = getDL()-1; break;
3531 case 0x01: Bda->ScreenRows = 13; break;
3532 case 0x03: Bda->ScreenRows = 42; break;
3533 case 0x02:
3534 default : Bda->ScreenRows = 24; break;
3535 }
3536
3537 break;
3538 }
3539
3540 /* Setup ROM 8x8 Font for Graphics Mode */
3541 case 0x23:
3542 {
3543 /*
3544 * Update the BIOS INT 43h vector (far pointer
3545 * to the character range 00h-...)
3546 */
3547 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x8_OFFSET, VIDEO_BIOS_DATA_SEG);
3548
3549 /* Update BDA */
3550 Bda->CharacterHeight = 8;
3551 switch (getBL())
3552 {
3553 case 0x00: Bda->ScreenRows = getDL()-1; break;
3554 case 0x01: Bda->ScreenRows = 13; break;
3555 case 0x03: Bda->ScreenRows = 42; break;
3556 case 0x02:
3557 default : Bda->ScreenRows = 24; break;
3558 }
3559
3560 break;
3561 }
3562
3563 /* Setup ROM 8x16 Font for Graphics Mode */
3564 case 0x24:
3565 {
3566 /*
3567 * Update the BIOS INT 43h vector (far pointer
3568 * to the character range 00h-...).
3569 */
3570 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
3571
3572 /* Update BDA */
3573 Bda->CharacterHeight = 16;
3574 switch (getBL())
3575 {
3576 case 0x00: Bda->ScreenRows = getDL()-1; break;
3577 case 0x01: Bda->ScreenRows = 13; break;
3578 case 0x03: Bda->ScreenRows = 42; break;
3579 case 0x02:
3580 default : Bda->ScreenRows = 24; break;
3581 }
3582
3583 break;
3584 }
3585
3586 /* Get Current Character Font Information */
3587 case 0x30:
3588 {
3589 ULONG Address = (ULONG)NULL;
3590
3591 switch (getBH())
3592 {
3593 /* 00h - INT 0x1F pointer */
3594 case 0x00:
3595 Address = ((PULONG)BaseAddress)[0x1F];
3596 break;
3597
3598 /* 01h - INT 0x43 pointer */
3599 case 0x01:
3600 Address = ((PULONG)BaseAddress)[0x43];
3601 break;
3602
3603 /* 02h - 8x14 font */
3604 case 0x02:
3605 Address = MAKELONG(FONT_8x14_OFFSET, VIDEO_BIOS_DATA_SEG);
3606 break;
3607
3608 /* 03h - 8x8 font */
3609 case 0x03:
3610 Address = MAKELONG(FONT_8x8_OFFSET, VIDEO_BIOS_DATA_SEG);
3611 break;
3612
3613 /* 04h - 8x8 font, upper half */
3614 case 0x04:
3615 Address = MAKELONG(FONT_8x8_HIGH_OFFSET, VIDEO_BIOS_DATA_SEG);
3616 break;
3617
3618 /* 05h - NOT IMPLEMENTED - 9x14 font */
3619 case 0x05:
3620 break;
3621
3622 /* 06h - 8x16 font */
3623 case 0x06:
3624 Address = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
3625 break;
3626
3627 /* 07h - NOT IMPLEMENTED - 9x16 font */
3628 case 0x07:
3629 break;
3630
3631 default:
3632 DPRINT1("INT 10h, AL=30h Function BH = 0x%02X NOT IMPLEMENTED\n",
3633 getBH());
3634 }
3635
3636 /* Return the data */
3637 setES(HIWORD(Address));
3638 setBP(LOWORD(Address));
3639 setCX(Bda->CharacterHeight);
3640 setDL(Bda->ScreenRows);
3641
3642 break;
3643 }
3644
3645 default:
3646 {
3647 DPRINT1("BIOS Font Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3648 getAL());
3649 }
3650 }
3651
3652 break;
3653 }
3654
3655 /* Alternate Function Select */
3656 case 0x12:
3657 {
3658 switch (getBL())
3659 {
3660 /* Get EGA/VGA Information */
3661 case 0x10:
3662 {
3663 setBH((Bda->VGAOptions & 0x02) >> 1); /* Color (0) or monochrome (1) display */
3664 setBL((Bda->VGAOptions & 0x60) >> 5); /* Video RAM size */
3665 setCH((Bda->VGASwitches & 0xF0) >> 4); /* Features settings */
3666 setCL( Bda->VGASwitches & 0x0F); /* Switches settings */
3667 break;
3668 }
3669
3670 /* Enable/Disable Cursor Emulation */
3671 case 0x34:
3672 {
3673 BYTE State = getAL();
3674
3675 /* Check for validity */
3676 if (State > 1) break;
3677
3678 /*
3679 * Enable (State == 0) or disable (State == 1) cursor emulation.
3680 * Please read the WARNING in the 'VidBiosSetCursorShape'
3681 * function for more details.
3682 */
3683 Bda->VGAOptions = (Bda->VGAOptions & 0xFE) | (State & 0x01);
3684
3685 /* Return success */
3686 setAL(0x12);
3687 break;
3688 }
3689
3690 /* Enable/Disable screen refresh */
3691 case 0x36:
3692 {
3693 BYTE State = getAL();
3694 BYTE Clocking;
3695
3696 /* Check for validity */
3697 if (State > 1) break;
3698
3699 /* Turn the video on (State == 0) or off (State == 1) */
3700 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_CLOCK_REG);
3701 Clocking = IOReadB(VGA_SEQ_DATA);
3702
3703 if (State == 0)
3704 Clocking &= ~VGA_SEQ_CLOCK_SD;
3705 else
3706 Clocking |= VGA_SEQ_CLOCK_SD;
3707
3708 IOWriteB(VGA_SEQ_DATA, Clocking);
3709
3710 /* Return success */
3711 setAL(0x12);
3712 break;
3713 }
3714
3715 default:
3716 {
3717 DPRINT1("BIOS Function INT 10h, AH = 12h (Alternate Function Select), BX = 0x%04X NOT IMPLEMENTED\n",
3718 getBX());
3719 break;
3720 }
3721 }
3722
3723 break;
3724 }
3725
3726 /* Write String */
3727 case 0x13:
3728 {
3729 PCHAR String = (PCHAR)SEG_OFF_TO_PTR(getES(), getBP());
3730 WORD Counter = getCX();
3731 BYTE Row, Column;
3732 BYTE OldRow, OldColumn;
3733 CHAR Character;
3734 BYTE Attribute = getBL(); // Default attribute in case the string contains only characters.
3735 BYTE Page = getBH();
3736 BYTE Flags = getAL();
3737
3738 /* Validate the selected video page */
3739 if (Page == 0xFF) // Special case: use the current video page
3740 Page = Bda->VideoPage;
3741 else if (Page >= BIOS_MAX_PAGES)
3742 break;
3743
3744 /* Get the original cursor position */
3745 VidBiosGetCursorPosition(&OldRow, &OldColumn, Page);
3746
3747 /* Set the new cursor position */
3748 Row = getDH();
3749 Column = getDL();
3750 if (Row == 0xFF) // Special case: use the current cursor position
3751 {
3752 Row = OldRow;
3753 Column = OldColumn;
3754 }
3755 VidBiosSetCursorPosition(Row, Column, Page);
3756
3757 while (Counter-- > 0)
3758 {
3759 Character = *String++;
3760 if (Flags & 0x02) Attribute = *String++;
3761 VidBiosPrintCharacter(Character, Attribute, TRUE, Page);
3762 }
3763
3764 /* Reset the cursor position to its original value if we don't want to update it */
3765 if (!(Flags & 0x01)) VidBiosSetCursorPosition(OldRow, OldColumn, Page);
3766
3767 break;
3768 }
3769
3770 /* Get/Set Display combination code */
3771 case 0x1A:
3772 {
3773 switch (getAL())
3774 {
3775 case 0x00: /* Get Display combination code */
3776 {
3777 setBL(Bda->VGADccIDActive);
3778 setBH(0x00); // No alternate display
3779
3780 /* Return success */
3781 setAL(0x1A);
3782 break;
3783 }
3784 case 0x01: /* Set Display combination code */
3785 {
3786 DPRINT1("Set Display combination code - Unsupported\n");
3787 break;
3788 }
3789 default:
3790 break;
3791 }
3792 break;
3793 }
3794
3795 /* Functionality/State Information (VGA) */
3796 case 0x1B:
3797 {
3798 PVGA_DYNAMIC_FUNC_TABLE Table = SEG_OFF_TO_PTR(getES(), getDI());
3799
3800 /* Check for only supported subfunction */
3801 if (getBX() != 0x0000)
3802 {
3803 DPRINT1("INT 10h, AH=1Bh, unsupported subfunction 0x%04x\n", getBX());
3804 break;
3805 }
3806
3807 /* Fill the VGA dynamic functionality table with our information */
3808
3809 Table->StaticFuncTablePtr = MAKELONG(VIDEO_STATE_INFO_OFFSET, VIDEO_BIOS_DATA_SEG);
3810
3811 Table->VideoMode = Bda->VideoMode;
3812 Table->ScreenColumns = Bda->ScreenColumns;
3813 Table->VideoPageSize = Bda->VideoPageSize;
3814 Table->VideoPageOffset = Bda->VideoPageOffset;
3815 RtlCopyMemory(Table->CursorPosition, Bda->CursorPosition, sizeof(Bda->CursorPosition));
3816 Table->CursorEndLine = Bda->CursorEndLine;
3817 Table->CursorStartLine = Bda->CursorStartLine;
3818 Table->VideoPage = Bda->VideoPage;
3819 Table->CrtBasePort = Bda->CrtBasePort;
3820 Table->CrtModeControl = Bda->CrtModeControl;
3821 Table->CrtColorPaletteMask = Bda->CrtColorPaletteMask;
3822 Table->ScreenRows = Bda->ScreenRows;
3823 Table->CharacterHeight = Bda->CharacterHeight;
3824
3825 Table->VGADccIDActive = Bda->VGADccIDActive;
3826 Table->VGADccIDAlternate = 0x00; // No alternate display
3827 // Table->CurrModeSupportedColorsNum;
3828 // Table->CurrModeSupportedPagesNum;
3829 // Table->Scanlines;
3830 // Table->PrimaryCharTable;
3831 // Table->SecondaryCharTable;
3832 // Table->VGAFlags;
3833 Table->VGAAvailMemory = (Bda->VGAOptions & 0x60) >> 5;
3834 // Table->VGASavePtrStateFlags;
3835 // Table->VGADispInfo;
3836 UNIMPLEMENTED;
3837
3838 /* Return success */
3839 setAL(0x1B);
3840 break;
3841 }
3842
3843 /* VESA BIOS Extensions */
3844 case 0x4F:
3845 {
3846 if (VbeInitialized) VbeService(Stack);
3847 break;
3848 }
3849
3850 default:
3851 {
3852 DPRINT1("BIOS Function INT 10h, AH = 0x%02X, AL = 0x%02X, BH = 0x%02X NOT IMPLEMENTED\n",
3853 getAH(), getAL(), getBH());
3854 }
3855 }
3856 }
3857
3858
3859 /*
3860 * Those attach / detach functions are work-in-progress
3861 */
3862
3863 static BOOL Attached = TRUE;
3864
3865 VOID VidBiosAttachToConsole(VOID)
3866 {
3867 if (!Attached)
3868 {
3869 VgaAttachToConsole();
3870 Attached = TRUE;
3871 }
3872
3873 /* Refresh display */
3874 VgaRefreshDisplay();
3875 VidBiosSyncCursorPosition();
3876 }
3877
3878 VOID VidBiosDetachFromConsole(VOID)
3879 {
3880 if (!Attached) return;
3881
3882 /* Refresh display */
3883 VgaRefreshDisplay();
3884
3885 /* Detach from the console */
3886 VgaDetachFromConsole();
3887 Attached = FALSE;
3888 }
3889
3890 VOID VidBiosPost(VOID)
3891 {
3892 /*
3893 * Initialize VGA BIOS32 RAM dynamic data
3894 */
3895
3896 /* Some vectors are in fact addresses to tables */
3897 ((PULONG)BaseAddress)[0x1D] = (ULONG)NULL; // Video Parameter Tables
3898 // Far pointer to the 8x8 graphics font for the 8x8 characters 80h-FFh
3899 ((PULONG)BaseAddress)[0x1F] = MAKELONG(FONT_8x8_HIGH_OFFSET, VIDEO_BIOS_DATA_SEG);
3900 // Far pointer to the character table (EGA, MCGA, VGA) for the 8x16 characters 00h-...
3901 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
3902 ((PULONG)BaseAddress)[0x44] = (ULONG)NULL; // ROM BIOS Character Font, Characters 00h-7Fh (PCjr)
3903
3904 /* Relocated services by the BIOS (when needed) */
3905 ((PULONG)BaseAddress)[0x42] = (ULONG)NULL; // Relocated Default INT 10h Video Services
3906 ((PULONG)BaseAddress)[0x6D] = (ULONG)NULL; // Video BIOS Entry Point
3907
3908 //
3909 // FIXME: At the moment we always set a VGA mode. In the future,
3910 // we should set this mode **only** when:
3911 // - an app starts to use directly the video memory
3912 // (that should be done in emulator.c)
3913 // - or starts to use non-stream I/O interrupts
3914 // (that should be done here, or maybe in VGA ??)
3915 //
3916
3917 Bda->CrtModeControl = 0x00;
3918 Bda->CrtColorPaletteMask = 0x00;
3919 Bda->VGADccIDActive = 0x08; // VGA w/ color analog active display
3920
3921 /* Set the default video mode */
3922 VidBiosSetVideoMode(BIOS_DEFAULT_VIDEO_MODE);
3923
3924 /* Synchronize our cursor position with VGA */
3925 VidBiosSyncCursorPosition();
3926
3927 /* Register the BIOS 32-bit Interrupts */
3928 RegisterBiosInt32(BIOS_VIDEO_INTERRUPT, VidBiosVideoService);
3929
3930 /* Vectors that should be implemented */
3931 RegisterBiosInt32(0x42, NULL); // Relocated Default INT 10h Video Services
3932 RegisterBiosInt32(0x6D, NULL); // Video BIOS Entry Point
3933
3934 /* Initialize VBE */
3935 VbeInitialized = VbeInitialize();
3936 if (!VbeInitialized) DPRINT1("Couldn't initialize VBE!\n");
3937 }
3938
3939 BOOLEAN VidBiosInitialize(VOID)
3940 {
3941 UCHAR Checksum;
3942
3943 /*
3944 * Initialize VGA BIOS32 static data
3945 */
3946
3947 /* This is a ROM of size 'VIDEO_BIOS_ROM_SIZE' */
3948 *(PWORD)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, 0x0000)) = 0xAA55;
3949 *(PBYTE)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, 0x0002)) = VIDEO_BIOS_ROM_SIZE / 512; // Size in blocks of 512 bytes
3950
3951 /* Bootstrap code */
3952 *(PWORD)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, 0x0003)) = 0x90CB; // retf, nop
3953 // RtlCopyMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, 0xFFF0), Bootstrap, sizeof(Bootstrap));
3954
3955 /* Video BIOS Information */
3956 RtlCopyMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, 0x0005), BiosInfo, sizeof(BiosInfo)-1);
3957
3958 /* Initialize the VGA static function table */
3959 VgaStaticFuncTable = SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, VIDEO_STATE_INFO_OFFSET);
3960 RtlZeroMemory(VgaStaticFuncTable, sizeof(*VgaStaticFuncTable));
3961 VgaStaticFuncTable->SupportedModes[0] = 0xFF; // Modes 0x00 to 0x07 supported
3962 VgaStaticFuncTable->SupportedModes[1] = 0xFF; // Modes 0x08 to 0x0F supported
3963 VgaStaticFuncTable->SupportedModes[2] = 0x0F; // Modes 0x10 to 0x13 supported
3964 VgaStaticFuncTable->SupportedScanlines = 0x07; // Scanlines 200, 350 and 400 supported
3965 VgaStaticFuncTable->TextCharBlocksNumber = 0;
3966 VgaStaticFuncTable->MaxActiveTextCharBlocksNumber = 0;
3967 VgaStaticFuncTable->VGAFuncSupportFlags = 0x0CFD; // See: http://www.ctyme.com/intr/rb-0221.htm#Table46
3968 VgaStaticFuncTable->VGASavePtrFuncFlags = 0x18; // See: http://www.ctyme.com/intr/rb-0221.htm#Table47
3969
3970 /* Fill the font tables */
3971 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x8_OFFSET),
3972 Font8x8, sizeof(Font8x8));
3973 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x16_OFFSET),
3974 Font8x16, sizeof(Font8x16));
3975 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x14_OFFSET),
3976 Font8x14, sizeof(Font8x14));
3977
3978 VidBios32Initialize();
3979
3980 /* Compute the ROM checksum and store it */
3981 *(PBYTE)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, VIDEO_BIOS_ROM_SIZE - 1)) = 0x00;
3982 Checksum = CalcRomChecksum(TO_LINEAR(VIDEO_BIOS_DATA_SEG, 0x0000), VIDEO_BIOS_ROM_SIZE);
3983 *(PBYTE)(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, VIDEO_BIOS_ROM_SIZE - 1)) = (0xFF - Checksum + 1) & 0xFF;
3984
3985 WriteProtectRom((PVOID)TO_LINEAR(VIDEO_BIOS_DATA_SEG, 0x0000),
3986 VIDEO_BIOS_ROM_SIZE);
3987
3988 return TRUE;
3989 }
3990
3991 VOID VidBiosCleanup(VOID)
3992 {
3993 }
3994
3995 /* EOF */