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