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