[NTVDM]: Fix INT 10h, AH=09h/0Ah by correctly advancing the write position (but scrol...
[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, BOOLEAN UseAttr, 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 UseAttr ? sizeof(WORD) : sizeof(BYTE));
2580 break;
2581 }
2582
2583 /* 4-color CGA */
2584 case 0x04:
2585 case 0x05:
2586 {
2587 WORD i;
2588 WORD CgaSegment[] = { CGA_EVEN_VIDEO_SEG, CGA_ODD_VIDEO_SEG };
2589 PUCHAR Font = (PUCHAR)FAR_POINTER(((PULONG)BaseAddress)[0x43]);
2590 PUCHAR Glyph = &Font[LOBYTE(CharData) * Bda->CharacterHeight];
2591 BOOLEAN Xor = (HIBYTE(CharData) & 0x80) ? TRUE : FALSE;
2592 BYTE OldRotate;
2593 BYTE DoubledBits[] =
2594 {
2595 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,
2596 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF
2597 };
2598
2599 if (Xor)
2600 {
2601 /* Set the logical operation to XOR */
2602 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2603 OldRotate = IOReadB(VGA_GC_DATA);
2604 IOWriteB(VGA_GC_DATA, OldRotate | 0x18);
2605 }
2606
2607 for (i = 0; i < Bda->CharacterHeight; i++)
2608 {
2609 WORD Pixel = MAKEWORD(DoubledBits[Glyph[i] >> 4],
2610 DoubledBits[Glyph[i] & 0x0F]);
2611 if (Xor)
2612 {
2613 USHORT Dummy;
2614
2615 /* Read from VGA memory to load the latch register */
2616 EmulatorReadMemory(&EmulatorContext,
2617 TO_LINEAR(CgaSegment[(Row + i) & 1],
2618 ((((Row + i) >> 1) * Bda->ScreenColumns) >> 2) + Column * 2),
2619 (LPVOID)&Dummy,
2620 sizeof(USHORT));
2621 }
2622
2623 EmulatorWriteMemory(&EmulatorContext,
2624 TO_LINEAR(CgaSegment[(Row + i) & 1],
2625 ((((Row + i) >> 1) * Bda->ScreenColumns) >> 2) + Column * 2),
2626 (LPVOID)&Pixel,
2627 sizeof(USHORT));
2628 }
2629
2630 if (Xor)
2631 {
2632 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2633 IOWriteB(VGA_GC_DATA, OldRotate);
2634 }
2635
2636 break;
2637 }
2638
2639 /* 2-color CGA */
2640 case 0x06:
2641 {
2642 WORD i;
2643 WORD CgaSegment[] = { CGA_EVEN_VIDEO_SEG, CGA_ODD_VIDEO_SEG };
2644 PUCHAR Font = (PUCHAR)FAR_POINTER(((PULONG)BaseAddress)[0x43]);
2645 PUCHAR Glyph = &Font[LOBYTE(CharData) * Bda->CharacterHeight];
2646 BOOLEAN Xor = (HIBYTE(CharData) & 0x80) ? TRUE : FALSE;
2647 BYTE OldRotate;
2648
2649 if (Xor)
2650 {
2651 /* Set the logical operation to XOR */
2652 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2653 OldRotate = IOReadB(VGA_GC_DATA);
2654 IOWriteB(VGA_GC_DATA, OldRotate | 0x18);
2655 }
2656
2657 for (i = 0; i < Bda->CharacterHeight; i++)
2658 {
2659 if (Xor)
2660 {
2661 UCHAR Dummy;
2662
2663 /* Read from VGA memory to load the latch register */
2664 EmulatorReadMemory(&EmulatorContext,
2665 TO_LINEAR(CgaSegment[(Row + i) & 1],
2666 ((((Row + i) >> 1) * Bda->ScreenColumns) >> 3) + Column),
2667 (LPVOID)&Dummy,
2668 sizeof(UCHAR));
2669 }
2670
2671 EmulatorWriteMemory(&EmulatorContext,
2672 TO_LINEAR(CgaSegment[(Row + i) & 1],
2673 ((((Row + i) >> 1) * Bda->ScreenColumns) >> 3) + Column),
2674 (LPVOID)&Glyph[i],
2675 sizeof(UCHAR));
2676 }
2677
2678 if (Xor)
2679 {
2680 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2681 IOWriteB(VGA_GC_DATA, OldRotate);
2682 }
2683
2684 break;
2685 }
2686
2687 /* 16-color modes */
2688 case 0x0D:
2689 case 0x0E:
2690 case 0x10:
2691 case 0x11:
2692 case 0x12:
2693 {
2694 WORD i;
2695 PUCHAR Font = (PUCHAR)FAR_POINTER(((PULONG)BaseAddress)[0x43]);
2696 PUCHAR Glyph = &Font[LOBYTE(CharData) * Bda->CharacterHeight];
2697 BOOLEAN Xor = (HIBYTE(CharData) & 0x80) ? TRUE : FALSE;
2698 BYTE OldPlaneWrite, OldReset, OldEnableReset, OldRotate, OldMode;
2699
2700 /* Write to all planes */
2701 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_MASK_REG);
2702 OldPlaneWrite = IOReadB(VGA_SEQ_DATA);
2703 IOWriteB(VGA_SEQ_DATA, 0x0F);
2704
2705 /* Zero the planes whose bits are set in the enable set/reset register */
2706 IOWriteB(VGA_GC_INDEX, VGA_GC_RESET_REG);
2707 OldReset = IOReadB(VGA_GC_DATA);
2708 IOWriteB(VGA_GC_DATA, 0x00);
2709
2710 /* Set the enable set/reset register to the inverse of the color */
2711 IOWriteB(VGA_GC_INDEX, VGA_GC_ENABLE_RESET_REG);
2712 OldEnableReset = IOReadB(VGA_GC_DATA);
2713 IOWriteB(VGA_GC_DATA, (~HIBYTE(CharData)) & 0x0F);
2714
2715 /* Make sure we're in write mode 0 */
2716 IOWriteB(VGA_GC_INDEX, VGA_GC_MODE_REG);
2717 OldMode = IOReadB(VGA_GC_DATA);
2718 IOWriteB(VGA_GC_DATA, 0x00);
2719
2720 if (Xor)
2721 {
2722 /* Set the logical operation to XOR */
2723 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2724 OldRotate = IOReadB(VGA_GC_DATA);
2725 IOWriteB(VGA_GC_DATA, OldRotate | 0x18);
2726 }
2727
2728 for (i = 0; i < Bda->CharacterHeight; i++)
2729 {
2730 if (Xor)
2731 {
2732 UCHAR Dummy;
2733
2734 /* Read from VGA memory to load the latch register */
2735 EmulatorReadMemory(&EmulatorContext,
2736 TO_LINEAR(GRAPHICS_VIDEO_SEG,
2737 (((Row + i) * Bda->ScreenColumns) >> 3) + Column),
2738 (LPVOID)&Dummy,
2739 sizeof(UCHAR));
2740 }
2741
2742 EmulatorWriteMemory(&EmulatorContext,
2743 TO_LINEAR(GRAPHICS_VIDEO_SEG,
2744 (((Row + i) * Bda->ScreenColumns) >> 3) + Column),
2745 (LPVOID)&Glyph[i],
2746 sizeof(UCHAR));
2747 }
2748
2749 /* Restore the registers */
2750 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_MASK_REG);
2751 IOWriteB(VGA_SEQ_DATA, OldPlaneWrite);
2752 IOWriteB(VGA_GC_INDEX, VGA_GC_RESET_REG);
2753 IOWriteB(VGA_GC_DATA, OldReset);
2754 IOWriteB(VGA_GC_INDEX, VGA_GC_ENABLE_RESET_REG);
2755 IOWriteB(VGA_GC_DATA, OldEnableReset);
2756 IOWriteB(VGA_GC_INDEX, VGA_GC_MODE_REG);
2757 IOWriteB(VGA_GC_DATA, OldMode);
2758
2759 if (Xor)
2760 {
2761 IOWriteB(VGA_GC_INDEX, VGA_GC_ROTATE_REG);
2762 IOWriteB(VGA_GC_DATA, OldRotate);
2763 }
2764
2765 break;
2766 }
2767
2768 /* 256-color mode */
2769 case 0x13:
2770 {
2771 WORD i, j;
2772 PUCHAR Font = (PUCHAR)FAR_POINTER(((PULONG)BaseAddress)[0x43]);
2773 PUCHAR Glyph = &Font[LOBYTE(CharData) * Bda->CharacterHeight];
2774 BYTE PixelBuffer[8];
2775
2776 for (i = 0; i < Bda->CharacterHeight; i++)
2777 {
2778 for (j = 0; j < 8; j++)
2779 {
2780 PixelBuffer[j] = (Glyph[i] & (1 << (7 - j))) ? HIBYTE(CharData) : 0;
2781 }
2782
2783 EmulatorWriteMemory(&EmulatorContext,
2784 TO_LINEAR(GRAPHICS_VIDEO_SEG,
2785 (Row + i) * Bda->ScreenColumns + Column * 8),
2786 (LPVOID)PixelBuffer,
2787 sizeof(PixelBuffer));
2788 }
2789
2790 break;
2791 }
2792
2793 default:
2794 {
2795 DPRINT1("Drawing glyphs in mode %02Xh is not supported.\n", Bda->VideoMode);
2796 }
2797 }
2798 }
2799
2800 static VOID VidBiosPrintCharacter(CHAR Character, BYTE Attribute, BYTE Page)
2801 {
2802 WORD CharData = MAKEWORD(Character, Attribute);
2803 BYTE Row, Column;
2804
2805 /* Make sure the page exists */
2806 if (Page >= BIOS_MAX_PAGES) return;
2807
2808 /* Get the cursor location */
2809 VidBiosGetCursorPosition(&Row, &Column, Page);
2810
2811 if (Character == '\a')
2812 {
2813 /* Bell control character */
2814 // NOTE: We may use what the terminal emulator offers to us...
2815 Beep(800, 200);
2816 return;
2817 }
2818 else if (Character == '\b')
2819 {
2820 /* Backspace control character */
2821 if (Column > 0)
2822 {
2823 Column--;
2824 }
2825 else if (Row > 0)
2826 {
2827 Column = Bda->ScreenColumns - 1;
2828 Row--;
2829 }
2830
2831 /* Erase the existing character */
2832 CharData = MAKEWORD(' ', Attribute);
2833 VidBiosDrawGlyph(CharData, TRUE, Page, Row, Column);
2834 }
2835 else if (Character == '\t')
2836 {
2837 /* Horizontal Tabulation control character */
2838 do
2839 {
2840 // Taken from DOSBox
2841 VidBiosPrintCharacter(' ', Attribute, Page);
2842 VidBiosGetCursorPosition(&Row, &Column, Page);
2843 } while (Column % 8);
2844 }
2845 else if (Character == '\n')
2846 {
2847 /* Line Feed control character */
2848 Row++;
2849 }
2850 else if (Character == '\r')
2851 {
2852 /* Carriage Return control character */
2853 Column = 0;
2854 }
2855 else
2856 {
2857 /* Default character */
2858
2859 /* Write the character and advance the cursor */
2860 VidBiosDrawGlyph(CharData, TRUE, Page, Row, Column);
2861 Column++;
2862 }
2863
2864 /* Check if it passed the end of the row */
2865 if (Column >= Bda->ScreenColumns)
2866 {
2867 /* Return to the first column and go to the next line */
2868 Column = 0;
2869 Row++;
2870 }
2871
2872 /* Scroll the screen up if needed */
2873 if (Row > Bda->ScreenRows)
2874 {
2875 /* The screen must be scrolled up */
2876 SMALL_RECT Rectangle = { 0, 0, Bda->ScreenColumns - 1, Bda->ScreenRows };
2877 VidBiosScrollWindow(SCROLL_UP, 1, Rectangle, Page, DEFAULT_ATTRIBUTE/*Attribute*/);
2878 Row--;
2879 }
2880
2881 /* Set the cursor position */
2882 VidBiosSetCursorPosition(Row, Column, Page);
2883 }
2884
2885 /* PUBLIC FUNCTIONS ***********************************************************/
2886
2887 VOID WINAPI VidBiosVideoService(LPWORD Stack)
2888 {
2889 switch (getAH())
2890 {
2891 /* Set Video Mode */
2892 case 0x00:
2893 {
2894 VidBiosSetVideoMode(getAL());
2895 break;
2896 }
2897
2898 /* Set Text-Mode Cursor Shape */
2899 case 0x01:
2900 {
2901 VidBiosSetCursorShape(getCX());
2902 break;
2903 }
2904
2905 /* Set Cursor Position */
2906 case 0x02:
2907 {
2908 VidBiosSetCursorPosition(getDH(), getDL(), getBH());
2909 break;
2910 }
2911
2912 /* Get Cursor Position and Shape */
2913 case 0x03:
2914 {
2915 /* Make sure the selected video page exists */
2916 if (getBH() >= BIOS_MAX_PAGES) break;
2917
2918 /* Return the result */
2919 setCX(MAKEWORD(Bda->CursorEndLine, Bda->CursorStartLine));
2920 setDX(Bda->CursorPosition[getBH()]);
2921 break;
2922 }
2923
2924 /* Query Light Pen */
2925 case 0x04:
2926 {
2927 /*
2928 * On modern BIOSes, this function returns 0
2929 * so that we can ignore the other registers.
2930 */
2931 setAX(0);
2932 break;
2933 }
2934
2935 /* Select Active Display Page */
2936 case 0x05:
2937 {
2938 VidBiosSetVideoPage(getAL());
2939 break;
2940 }
2941
2942 /* Scroll Window Up/Down */
2943 case 0x06:
2944 case 0x07:
2945 {
2946 SMALL_RECT Rectangle = { getCL(), getCH(), getDL(), getDH() };
2947
2948 VidBiosScrollWindow((getAH() == 0x06) ? SCROLL_UP : SCROLL_DOWN,
2949 getAL(), Rectangle, Bda->VideoPage, getBH());
2950
2951 break;
2952 }
2953
2954 /* Read Character and Attribute at Cursor Position */
2955 case 0x08:
2956 {
2957 WORD CharData;
2958 BYTE Page = getBH();
2959 DWORD Offset;
2960
2961 /* Check if the page exists */
2962 if (Page >= BIOS_MAX_PAGES) break;
2963
2964 /* Find the offset of the character */
2965 Offset = Page * Bda->VideoPageSize +
2966 (HIBYTE(Bda->CursorPosition[Page]) * Bda->ScreenColumns +
2967 LOBYTE(Bda->CursorPosition[Page])) * 2;
2968
2969 /* Read from the video memory */
2970 EmulatorReadMemory(&EmulatorContext,
2971 TO_LINEAR(TEXT_VIDEO_SEG, Offset),
2972 (LPVOID)&CharData,
2973 sizeof(WORD));
2974
2975 /* Return the character data in AX */
2976 setAX(CharData);
2977
2978 break;
2979 }
2980
2981 /* Write Character and Attribute at Cursor Position */
2982 case 0x09:
2983 /* Write Character only (PCjr: + Attribute) at Cursor Position */
2984 case 0x0A:
2985 {
2986 WORD Counter = getCX();
2987 WORD CharData = MAKEWORD(getAL(), getBL());
2988 BOOLEAN UseAttr = (getAH() == 0x09);
2989 BYTE Page = getBH();
2990 BYTE Row, Column;
2991
2992 /* Check if the page exists */
2993 if (Page >= BIOS_MAX_PAGES) break;
2994
2995 /* Get the cursor location */
2996 // VidBiosGetCursorPosition(&Row, &Column, Page);
2997 Row = HIBYTE(Bda->CursorPosition[Page]);
2998 Column = LOBYTE(Bda->CursorPosition[Page]);
2999
3000 /* Write to video memory a certain number of times */
3001 while (Counter-- > 0)
3002 {
3003 /* Write the character and advance the position */
3004 VidBiosDrawGlyph(CharData, UseAttr, Page, Row, Column);
3005 Column++;
3006
3007 /* Check if it passed the end of the row */
3008 if (Column >= Bda->ScreenColumns)
3009 {
3010 /* Return to the first column and go to the next line */
3011 Column = 0;
3012 Row++;
3013 }
3014
3015 /* Contrary to the "Teletype Output" function, the screen is not scrolled */
3016 if (Row > Bda->ScreenRows)
3017 {
3018 Row = Bda->ScreenRows;
3019 }
3020 }
3021
3022 break;
3023 }
3024
3025 /* Set Video Colors */
3026 case 0x0B:
3027 {
3028 if (Bda->VideoMode < 0x04 || Bda->VideoMode > 0x06)
3029 {
3030 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X is unsupported for non-CGA modes\n",
3031 getBH());
3032 break;
3033 }
3034
3035 switch (getBH())
3036 {
3037 case 0x00: /* Set Background/Border Color */
3038 {
3039 #ifdef DOSBOX
3040 BYTE Index = getBL();
3041
3042 /* See: http://www.bioscentral.com/misc/bda.htm */
3043 Bda->CrtColorPaletteMask = (Bda->CrtColorPaletteMask & 0xE0) | (Index & 0x1F);
3044
3045 Index = ((Index << 1) & 0x10) | (Index & 0x7);
3046
3047 /* Always set the overscan color */
3048 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Index);
3049
3050 /* Don't set any extra colors when in text mode */
3051 if (Bda->VideoMode <= 0x03) break;
3052
3053 VgaSetSinglePaletteRegister(0x00, Index);
3054
3055 Index = (Bda->CrtColorPaletteMask & 0x10) | 0x02 | ((Bda->CrtColorPaletteMask & 0x20) >> 5);
3056
3057 VgaSetSinglePaletteRegister(0x01, Index);
3058 Index += 2;
3059 VgaSetSinglePaletteRegister(0x02, Index);
3060 Index += 2;
3061 VgaSetSinglePaletteRegister(0x03, Index);
3062 #else
3063 /* Background/Border Color is modifiable via the first index */
3064 VgaSetSinglePaletteRegister(0x00, getBL());
3065 #endif
3066
3067 /* Enable screen and disable palette access */
3068 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3069 IOWriteB(VGA_AC_INDEX, 0x20);
3070 break;
3071 }
3072
3073 case 0x01: /* Set Palette */
3074 {
3075 BYTE Index = getBL();
3076
3077 /* See: http://www.bioscentral.com/misc/bda.htm */
3078 /* Reset bit 5: foreground colors index (0: green/red/yellow; 1: cyan/magenta/white) */
3079 Bda->CrtColorPaletteMask = (Bda->CrtColorPaletteMask & 0xDF) | ((Index & 1) ? 0x20 : 0x00);
3080
3081 /* Don't set any extra colors when in text mode */
3082 if (Bda->VideoMode <= 0x03) break;
3083
3084 Index = (Bda->CrtColorPaletteMask & 0x10) | 0x02 | Index;
3085
3086 VgaSetSinglePaletteRegister(0x01, Index);
3087 Index += 2;
3088 VgaSetSinglePaletteRegister(0x02, Index);
3089 Index += 2;
3090 VgaSetSinglePaletteRegister(0x03, Index);
3091
3092 /* Enable screen and disable palette access */
3093 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3094 IOWriteB(VGA_AC_INDEX, 0x20);
3095 break;
3096 }
3097
3098 default:
3099 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X NOT IMPLEMENTED\n",
3100 getAH(), getBH());
3101 break;
3102 }
3103
3104 break;
3105 }
3106
3107 /* Teletype Output */
3108 case 0x0E:
3109 {
3110 VidBiosPrintCharacter(getAL(), getBL(), getBH());
3111 break;
3112 }
3113
3114 /* Get Current Video Mode */
3115 case 0x0F:
3116 {
3117 setAX(MAKEWORD(VidBiosGetVideoMode(), Bda->ScreenColumns));
3118 setBH(Bda->VideoPage);
3119 break;
3120 }
3121
3122 /* Palette Control */
3123 case 0x10:
3124 {
3125 switch (getAL())
3126 {
3127 /* Set Single Palette Register */
3128 case 0x00:
3129 {
3130 VgaSetSinglePaletteRegister(getBL(), getBH());
3131
3132 /* Enable screen and disable palette access */
3133 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3134 IOWriteB(VGA_AC_INDEX, 0x20);
3135 break;
3136 }
3137
3138 /* Set Overscan Color */
3139 case 0x01:
3140 {
3141 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, getBH());
3142
3143 /* Enable screen and disable palette access */
3144 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3145 IOWriteB(VGA_AC_INDEX, 0x20);
3146 break;
3147 }
3148
3149 /* Set All Palette Registers */
3150 case 0x02:
3151 {
3152 INT i;
3153 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3154
3155 /* Set the palette registers */
3156 for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
3157 {
3158 VgaSetSinglePaletteRegister(i, Buffer[i]);
3159 }
3160
3161 /* Set the overscan register */
3162 // VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Buffer[VGA_AC_PAL_F_REG + 1]);
3163 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
3164 IOWriteB(VGA_AC_WRITE, Buffer[VGA_AC_PAL_F_REG + 1]);
3165
3166 /* Enable screen and disable palette access */
3167 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3168 IOWriteB(VGA_AC_INDEX, 0x20);
3169 break;
3170 }
3171
3172 /* Toggle Intensity/Blinking Bit */
3173 case 0x03:
3174 {
3175 /* Read the old AC mode control register value */
3176 BYTE VgaAcControlReg;
3177 IOWriteB(VGA_AC_INDEX, VGA_AC_CONTROL_REG);
3178 VgaAcControlReg = IOReadB(VGA_AC_READ);
3179
3180 /* Toggle the blinking bit and write the new value */
3181 if (getBL())
3182 {
3183 VgaAcControlReg |= VGA_AC_CONTROL_BLINK;
3184 Bda->CrtModeControl |= (1 << 5);
3185 }
3186 else
3187 {
3188 VgaAcControlReg &= ~VGA_AC_CONTROL_BLINK;
3189 Bda->CrtModeControl &= ~(1 << 5);
3190 }
3191
3192 IOWriteB(VGA_AC_INDEX, VGA_AC_CONTROL_REG);
3193 IOWriteB(VGA_AC_WRITE, VgaAcControlReg);
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 Single Palette Register */
3202 case 0x07:
3203 {
3204 /* Write the index */
3205 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3206 IOWriteB(VGA_AC_INDEX, getBL());
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 Overscan Color */
3218 case 0x08:
3219 {
3220 /* Write the index */
3221 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3222 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
3223
3224 /* Read the data */
3225 setBH(IOReadB(VGA_AC_READ));
3226
3227 /* Enable screen and disable palette access */
3228 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3229 IOWriteB(VGA_AC_INDEX, 0x20);
3230 break;
3231 }
3232
3233 /* Get All Palette Registers */
3234 case 0x09:
3235 {
3236 INT i;
3237 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3238
3239 /* Get the palette registers */
3240 for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
3241 {
3242 /* Write the index */
3243 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3244 IOWriteB(VGA_AC_INDEX, i);
3245
3246 /* Read the data */
3247 Buffer[i] = IOReadB(VGA_AC_READ);
3248 }
3249
3250 /* Get the overscan register */
3251 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
3252 Buffer[VGA_AC_PAL_F_REG + 1] = IOReadB(VGA_AC_READ);
3253
3254 /* Enable screen and disable palette access */
3255 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
3256 IOWriteB(VGA_AC_INDEX, 0x20);
3257 break;
3258 }
3259
3260 /* Set Individual DAC Register */
3261 case 0x10:
3262 {
3263 /* Write the index */
3264 // Certainly in BL and not in BX as said by Ralf Brown...
3265 IOWriteB(VGA_DAC_WRITE_INDEX, getBL());
3266
3267 /* Write the data in this order: Red, Green, Blue */
3268 IOWriteB(VGA_DAC_DATA, getDH());
3269 IOWriteB(VGA_DAC_DATA, getCH());
3270 IOWriteB(VGA_DAC_DATA, getCL());
3271
3272 break;
3273 }
3274
3275 /* Set Block of DAC Registers */
3276 case 0x12:
3277 {
3278 INT i;
3279 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3280
3281 /* Write the index */
3282 // Certainly in BL and not in BX as said by Ralf Brown...
3283 IOWriteB(VGA_DAC_WRITE_INDEX, getBL());
3284
3285 for (i = 0; i < getCX(); i++)
3286 {
3287 /* Write the data in this order: Red, Green, Blue */
3288 IOWriteB(VGA_DAC_DATA, *Buffer++);
3289 IOWriteB(VGA_DAC_DATA, *Buffer++);
3290 IOWriteB(VGA_DAC_DATA, *Buffer++);
3291 }
3292
3293 break;
3294 }
3295
3296 /* Get Individual DAC Register */
3297 case 0x15:
3298 {
3299 /* Write the index */
3300 IOWriteB(VGA_DAC_READ_INDEX, getBL());
3301
3302 /* Read the data in this order: Red, Green, Blue */
3303 setDH(IOReadB(VGA_DAC_DATA));
3304 setCH(IOReadB(VGA_DAC_DATA));
3305 setCL(IOReadB(VGA_DAC_DATA));
3306
3307 break;
3308 }
3309
3310 /* Get Block of DAC Registers */
3311 case 0x17:
3312 {
3313 INT i;
3314 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
3315
3316 /* Write the index */
3317 // Certainly in BL and not in BX as said by Ralf Brown...
3318 IOWriteB(VGA_DAC_READ_INDEX, getBL());
3319
3320 for (i = 0; i < getCX(); i++)
3321 {
3322 /* Write the data in this order: Red, Green, Blue */
3323 *Buffer++ = IOReadB(VGA_DAC_DATA);
3324 *Buffer++ = IOReadB(VGA_DAC_DATA);
3325 *Buffer++ = IOReadB(VGA_DAC_DATA);
3326 }
3327
3328 break;
3329 }
3330
3331 default:
3332 {
3333 DPRINT1("BIOS Palette Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3334 getAL());
3335 break;
3336 }
3337 }
3338
3339 break;
3340 }
3341
3342 /* Font Control */
3343 case 0x11:
3344 {
3345 switch (getAL())
3346 {
3347 // FIXME: At the moment we support only graphics-mode functions!
3348
3349 /* Set User 8x8 Graphics Chars (Setup INT 1Fh Vector) */
3350 case 0x20:
3351 {
3352 /* Update the BIOS INT 1Fh vector to user-defined ES:BP pointer */
3353 // Far pointer to the 8x8 characters 80h-FFh
3354 ((PULONG)BaseAddress)[0x1F] = MAKELONG(getBP(), getES());
3355 break;
3356 }
3357
3358 /* Set User Graphics Characters */
3359 case 0x21:
3360 {
3361 // /* Write the font to the VGA font plane */
3362 // VgaWriteFont(0, Font8x8, ARRAYSIZE(Font8x8) / VGA_FONT_CHARACTERS);
3363
3364 /* Update the BIOS INT 43h vector */
3365 ((PULONG)BaseAddress)[0x43] = MAKELONG(getBP(), getES());
3366
3367 /* Update BDA */
3368 Bda->CharacterHeight = getCX();
3369 switch (getBL())
3370 {
3371 case 0x00: Bda->ScreenRows = getDL()-1; break;
3372 case 0x01: Bda->ScreenRows = 13; break;
3373 case 0x03: Bda->ScreenRows = 42; break;
3374 case 0x02:
3375 default : Bda->ScreenRows = 24; break;
3376 }
3377
3378 break;
3379 }
3380
3381 /* Setup ROM 8x14 Font for Graphics Mode */
3382 case 0x22:
3383 {
3384 /*
3385 * Write the default font to the VGA font plane
3386 * and update the BIOS INT 43h vector (far pointer
3387 * to the character range 00h-...)
3388 */
3389 VgaWriteFont(0, Font8x14, ARRAYSIZE(Font8x14) / VGA_FONT_CHARACTERS);
3390 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x14_OFFSET, VIDEO_BIOS_DATA_SEG);
3391
3392 /* Update BDA */
3393 Bda->CharacterHeight = 14;
3394 switch (getBL())
3395 {
3396 case 0x00: Bda->ScreenRows = getDL()-1; break;
3397 case 0x01: Bda->ScreenRows = 13; break;
3398 case 0x03: Bda->ScreenRows = 42; break;
3399 case 0x02:
3400 default : Bda->ScreenRows = 24; break;
3401 }
3402
3403 break;
3404 }
3405
3406 /* Setup ROM 8x8 Font for Graphics Mode */
3407 case 0x23:
3408 {
3409 /*
3410 * Write the default font to the VGA font plane
3411 * and update the BIOS INT 43h vector (far pointer
3412 * to the character range 00h-...)
3413 */
3414 VgaWriteFont(0, Font8x8, ARRAYSIZE(Font8x8) / VGA_FONT_CHARACTERS);
3415 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x8_OFFSET, VIDEO_BIOS_DATA_SEG);
3416
3417 /* Update BDA */
3418 Bda->CharacterHeight = 8;
3419 switch (getBL())
3420 {
3421 case 0x00: Bda->ScreenRows = getDL()-1; break;
3422 case 0x01: Bda->ScreenRows = 13; break;
3423 case 0x03: Bda->ScreenRows = 42; break;
3424 case 0x02:
3425 default : Bda->ScreenRows = 24; break;
3426 }
3427
3428 break;
3429 }
3430
3431 /* Setup ROM 8x16 Font for Graphics Mode */
3432 case 0x24:
3433 {
3434 /*
3435 * Write the default font to the VGA font plane
3436 * and update the BIOS INT 43h vector (far pointer
3437 * to the character range 00h-...)
3438 */
3439 VgaWriteFont(0, Font8x16, ARRAYSIZE(Font8x16) / VGA_FONT_CHARACTERS);
3440 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
3441
3442 /* Update BDA */
3443 Bda->CharacterHeight = 16;
3444 switch (getBL())
3445 {
3446 case 0x00: Bda->ScreenRows = getDL()-1; break;
3447 case 0x01: Bda->ScreenRows = 13; break;
3448 case 0x03: Bda->ScreenRows = 42; break;
3449 case 0x02:
3450 default : Bda->ScreenRows = 24; break;
3451 }
3452
3453 break;
3454 }
3455
3456 /* Get Current Character Font Information */
3457 case 0x30:
3458 {
3459 ULONG Address = (ULONG)NULL;
3460
3461 switch (getBH())
3462 {
3463 /* 00h - INT 0x1F pointer */
3464 case 0x00:
3465 Address = ((PULONG)BaseAddress)[0x1F];
3466 break;
3467
3468 /* 01h - INT 0x43 pointer */
3469 case 0x01:
3470 Address = ((PULONG)BaseAddress)[0x43];
3471 break;
3472
3473 /* 02h - 8x14 font */
3474 case 0x02:
3475 Address = MAKELONG(FONT_8x14_OFFSET, VIDEO_BIOS_DATA_SEG);
3476 break;
3477
3478 /* 03h - 8x8 font */
3479 case 0x03:
3480 Address = MAKELONG(FONT_8x8_OFFSET, VIDEO_BIOS_DATA_SEG);
3481 break;
3482
3483 /* 04h - 8x8 font, upper half */
3484 case 0x04:
3485 Address = MAKELONG(FONT_8x8_HIGH_OFFSET, VIDEO_BIOS_DATA_SEG);
3486 break;
3487
3488 /* 05h - NOT IMPLEMENTED - 9x14 font */
3489 case 0x05:
3490 break;
3491
3492 /* 06h - 8x16 font */
3493 case 0x06:
3494 Address = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
3495 break;
3496
3497 /* 07h - NOT IMPLEMENTED - 9x16 font */
3498 case 0x07:
3499 break;
3500
3501 default:
3502 DPRINT1("INT 10h, AL=30h Function BH = 0x%02X NOT IMPLEMENTED\n",
3503 getBH());
3504 }
3505
3506 /* Return the data */
3507 setES(HIWORD(Address));
3508 setBP(LOWORD(Address));
3509 setCX(Bda->CharacterHeight);
3510 setDL(Bda->ScreenRows);
3511
3512 break;
3513 }
3514
3515 default:
3516 {
3517 DPRINT1("BIOS Font Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
3518 getAL());
3519 }
3520 }
3521
3522 break;
3523 }
3524
3525 /* Alternate Function Select */
3526 case 0x12:
3527 {
3528 switch (getBL())
3529 {
3530 /* Get EGA/VGA Information */
3531 case 0x10:
3532 {
3533 setBH((Bda->VGAOptions & 0x02) >> 1); /* Color (0) or monochrome (1) display */
3534 setBL((Bda->VGAOptions & 0x60) >> 5); /* Video RAM size */
3535 setCH((Bda->VGASwitches & 0xF0) >> 4); /* Features settings */
3536 setCL( Bda->VGASwitches & 0x0F); /* Switches settings */
3537 break;
3538 }
3539
3540 /* Enable/Disable Cursor Emulation */
3541 case 0x34:
3542 {
3543 BYTE State = getAL();
3544
3545 /* Check for validity */
3546 if (State > 1) break;
3547
3548 /*
3549 * Enable (State == 0) or disable (State == 1) cursor emulation.
3550 * Please read the WARNING in the 'VidBiosSetCursorShape'
3551 * function for more details.
3552 */
3553 Bda->VGAOptions = (Bda->VGAOptions & 0xFE) | (State & 0x01);
3554
3555 /* Return success */
3556 setAL(0x12);
3557 break;
3558 }
3559
3560 /* Enable/Disable screen refresh */
3561 case 0x36:
3562 {
3563 BYTE State = getAL();
3564 BYTE Clocking;
3565
3566 /* Check for validity */
3567 if (State > 1) break;
3568
3569 /* Turn the video on (State == 0) or off (State == 1) */
3570 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_CLOCK_REG);
3571 Clocking = IOReadB(VGA_SEQ_DATA);
3572
3573 if (State == 0)
3574 Clocking &= ~VGA_SEQ_CLOCK_SD;
3575 else
3576 Clocking |= VGA_SEQ_CLOCK_SD;
3577
3578 IOWriteB(VGA_SEQ_DATA, Clocking);
3579
3580 /* Return success */
3581 setAL(0x12);
3582 break;
3583 }
3584
3585 default:
3586 {
3587 DPRINT1("BIOS Function INT 10h, AH = 12h (Alternate Function Select), BX = 0x%04X NOT IMPLEMENTED\n",
3588 getBX());
3589 break;
3590 }
3591 }
3592
3593 break;
3594 }
3595
3596 /* Write String */
3597 case 0x13:
3598 {
3599 DPRINT1("BIOS Function INT 13h (Write String) is UNIMPLEMENTED\n");
3600 break;
3601 }
3602
3603 /* Get/Set Display combination code */
3604 case 0x1A:
3605 {
3606 switch (getAL())
3607 {
3608 case 0x00: /* Get Display combination code */
3609 {
3610 setBL(Bda->VGADccIDActive);
3611 setBH(0x00); // No alternate display
3612
3613 /* Return success */
3614 setAL(0x1A);
3615 break;
3616 }
3617 case 0x01: /* Set Display combination code */
3618 {
3619 DPRINT1("Set Display combination code - Unsupported\n");
3620 break;
3621 }
3622 default:
3623 break;
3624 }
3625 break;
3626 }
3627
3628 /* Functionality/State Information (VGA) */
3629 case 0x1B:
3630 {
3631 PVGA_DYNAMIC_FUNC_TABLE Table = SEG_OFF_TO_PTR(getES(), getDI());
3632
3633 /* Check for only supported subfunction */
3634 if (getBX() != 0x0000)
3635 {
3636 DPRINT1("INT 10h, AH=1Bh, unsupported subfunction 0x%04x\n", getBX());
3637 break;
3638 }
3639
3640 /* Fill the VGA dynamic functionality table with our information */
3641
3642 Table->StaticFuncTablePtr = MAKELONG(VIDEO_STATE_INFO_OFFSET, VIDEO_BIOS_DATA_SEG);
3643
3644 Table->VideoMode = Bda->VideoMode;
3645 Table->ScreenColumns = Bda->ScreenColumns;
3646 Table->VideoPageSize = Bda->VideoPageSize;
3647 Table->VideoPageOffset = Bda->VideoPageOffset;
3648 RtlCopyMemory(Table->CursorPosition, Bda->CursorPosition, sizeof(Bda->CursorPosition));
3649 Table->CursorEndLine = Bda->CursorEndLine;
3650 Table->CursorStartLine = Bda->CursorStartLine;
3651 Table->VideoPage = Bda->VideoPage;
3652 Table->CrtBasePort = Bda->CrtBasePort;
3653 Table->CrtModeControl = Bda->CrtModeControl;
3654 Table->CrtColorPaletteMask = Bda->CrtColorPaletteMask;
3655 Table->ScreenRows = Bda->ScreenRows;
3656 Table->CharacterHeight = Bda->CharacterHeight;
3657
3658 Table->VGADccIDActive = Bda->VGADccIDActive;
3659 Table->VGADccIDAlternate = 0x00; // No alternate display
3660 // Table->CurrModeSupportedColorsNum;
3661 // Table->CurrModeSupportedPagesNum;
3662 // Table->Scanlines;
3663 // Table->PrimaryCharTable;
3664 // Table->SecondaryCharTable;
3665 // Table->VGAFlags;
3666 Table->VGAAvailMemory = (Bda->VGAOptions & 0x60) >> 5;
3667 // Table->VGASavePtrStateFlags;
3668 // Table->VGADispInfo;
3669 UNIMPLEMENTED;
3670
3671 /* Return success */
3672 setAL(0x1B);
3673 break;
3674 }
3675
3676 default:
3677 {
3678 DPRINT1("BIOS Function INT 10h, AH = 0x%02X, AL = 0x%02X, BH = 0x%02X NOT IMPLEMENTED\n",
3679 getAH(), getAL(), getBH());
3680 }
3681 }
3682 }
3683
3684
3685 /*
3686 * Those attach / detach functions are work-in-progress
3687 */
3688
3689 static BOOL Attached = TRUE;
3690
3691 VOID VidBiosAttachToConsole(VOID)
3692 {
3693 // VgaRefreshDisplay();
3694 if (!Attached)
3695 {
3696 VgaAttachToConsole();
3697 Attached = TRUE;
3698 }
3699
3700 VgaRefreshDisplay();
3701 VidBiosSyncCursorPosition();
3702 }
3703
3704 VOID VidBiosDetachFromConsole(VOID)
3705 {
3706 /* Perform another screen refresh */
3707 VgaRefreshDisplay();
3708
3709 /* Detach from the console */
3710 VgaDetachFromConsole(FALSE);
3711 Attached = FALSE;
3712 }
3713
3714 BOOLEAN VidBiosInitialize(VOID)
3715 {
3716 /* Some vectors are in fact addresses to tables */
3717 ((PULONG)BaseAddress)[0x1D] = (ULONG)NULL; // Video Parameter Tables
3718 // Far pointer to the 8x8 graphics font for the 8x8 characters 80h-FFh
3719 ((PULONG)BaseAddress)[0x1F] = MAKELONG(FONT_8x8_HIGH_OFFSET, VIDEO_BIOS_DATA_SEG);
3720 // Far pointer to the character table (EGA, MCGA, VGA) for the 8x16 characters 00h-...
3721 ((PULONG)BaseAddress)[0x43] = MAKELONG(FONT_8x16_OFFSET, VIDEO_BIOS_DATA_SEG);
3722 ((PULONG)BaseAddress)[0x44] = (ULONG)NULL; // ROM BIOS Character Font, Characters 00h-7Fh (PCjr)
3723
3724 /* Relocated services by the BIOS (when needed) */
3725 ((PULONG)BaseAddress)[0x42] = (ULONG)NULL; // Relocated Default INT 10h Video Services
3726 ((PULONG)BaseAddress)[0x6D] = (ULONG)NULL; // Video BIOS Entry Point
3727
3728 /* Initialize the VGA static function table */
3729 VgaStaticFuncTable = SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, VIDEO_STATE_INFO_OFFSET);
3730 RtlZeroMemory(VgaStaticFuncTable, sizeof(*VgaStaticFuncTable));
3731 VgaStaticFuncTable->SupportedModes[0] = 0xFF; // Modes 0x00 to 0x07 supported
3732 VgaStaticFuncTable->SupportedModes[1] = 0xFF; // Modes 0x08 to 0x0F supported
3733 VgaStaticFuncTable->SupportedModes[2] = 0x0F; // Modes 0x10 to 0x13 supported
3734 VgaStaticFuncTable->SupportedScanlines = 0x07; // Scanlines 200, 350 and 400 supported
3735 VgaStaticFuncTable->TextCharBlocksNumber = 0;
3736 VgaStaticFuncTable->MaxActiveTextCharBlocksNumber = 0;
3737 VgaStaticFuncTable->VGAFuncSupportFlags = 0x0CFD; // See: http://www.ctyme.com/intr/rb-0221.htm#Table46
3738 VgaStaticFuncTable->VGASavePtrFuncFlags = 0x18; // See: http://www.ctyme.com/intr/rb-0221.htm#Table47
3739
3740 /* Fill the font tables */
3741 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x8_OFFSET),
3742 Font8x8, sizeof(Font8x8));
3743 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x16_OFFSET),
3744 Font8x16, sizeof(Font8x16));
3745 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x14_OFFSET),
3746 Font8x14, sizeof(Font8x14));
3747
3748 //
3749 // FIXME: At the moment we always set a VGA mode. In the future,
3750 // we should set this mode **only** when:
3751 // - an app starts to use directly the video memory
3752 // (that should be done in emulator.c)
3753 // - or starts to use non-stream I/O interrupts
3754 // (that should be done here, or maybe in VGA ??)
3755 //
3756
3757 Bda->CrtModeControl = 0x00;
3758 Bda->CrtColorPaletteMask = 0x00;
3759 Bda->VGADccIDActive = 0x08; // VGA w/ color analog active display
3760
3761 /* Set the default video mode */
3762 VidBiosSetVideoMode(BIOS_DEFAULT_VIDEO_MODE);
3763
3764 /* Synchronize our cursor position with VGA */
3765 VidBiosSyncCursorPosition();
3766
3767 /* Register the BIOS support BOPs */
3768 RegisterBop(BOP_VIDEO_INT, VidBiosVideoService);
3769
3770 return TRUE;
3771 }
3772
3773 VOID VidBiosCleanup(VOID)
3774 {
3775 }
3776
3777 /* EOF */