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