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