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