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