blob: 3678997339d6270cfcf5065979965ab4bf15fefa [file] [log] [blame]
Paul Mackerras9b6b5632005-10-06 12:06:20 +10001/*
2 * Procedures for drawing on the screen early on in the boot process.
3 *
4 * Benjamin Herrenschmidt <benh@kernel.crashing.org>
5 */
Paul Mackerras9b6b5632005-10-06 12:06:20 +10006#include <linux/kernel.h>
7#include <linux/string.h>
8#include <linux/init.h>
9#include <linux/module.h>
10
11#include <asm/sections.h>
12#include <asm/prom.h>
13#include <asm/btext.h>
14#include <asm/prom.h>
15#include <asm/page.h>
16#include <asm/mmu.h>
17#include <asm/pgtable.h>
18#include <asm/io.h>
19#include <asm/lmb.h>
20#include <asm/processor.h>
David Gibson719c91c2007-02-13 15:54:22 +110021#include <asm/udbg.h>
Paul Mackerras9b6b5632005-10-06 12:06:20 +100022
23#define NO_SCROLL
24
25#ifndef NO_SCROLL
26static void scrollscreen(void);
27#endif
28
29static void draw_byte(unsigned char c, long locX, long locY);
30static void draw_byte_32(unsigned char *bits, unsigned int *base, int rb);
31static void draw_byte_16(unsigned char *bits, unsigned int *base, int rb);
32static void draw_byte_8(unsigned char *bits, unsigned int *base, int rb);
33
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +110034#define __force_data __attribute__((__section__(".data")))
Paul Mackerras9b6b5632005-10-06 12:06:20 +100035
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +110036static int g_loc_X __force_data;
37static int g_loc_Y __force_data;
38static int g_max_loc_X __force_data;
39static int g_max_loc_Y __force_data;
40
41static int dispDeviceRowBytes __force_data;
42static int dispDeviceDepth __force_data;
43static int dispDeviceRect[4] __force_data;
44static unsigned char *dispDeviceBase __force_data;
45static unsigned char *logicalDisplayBase __force_data;
Paul Mackerras9b6b5632005-10-06 12:06:20 +100046
47unsigned long disp_BAT[2] __initdata = {0, 0};
48
49#define cmapsz (16*256)
50
51static unsigned char vga_font[cmapsz];
52
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +110053int boot_text_mapped __force_data = 0;
Paul Mackerras9b6b5632005-10-06 12:06:20 +100054int force_printk_to_btext = 0;
55
Paul Mackerras40ef8cb2005-10-10 22:50:37 +100056#ifdef CONFIG_PPC32
Paul Mackerras9b6b5632005-10-06 12:06:20 +100057/* Calc BAT values for mapping the display and store them
58 * in disp_BAT. Those values are then used from head.S to map
59 * the display during identify_machine() and MMU_Init()
60 *
61 * The display is mapped to virtual address 0xD0000000, rather
62 * than 1:1, because some some CHRP machines put the frame buffer
Michael Ellermanb5666f72005-12-05 10:24:33 -060063 * in the region starting at 0xC0000000 (PAGE_OFFSET).
Paul Mackerras9b6b5632005-10-06 12:06:20 +100064 * This mapping is temporary and will disappear as soon as the
65 * setup done by MMU_Init() is applied.
66 *
67 * For now, we align the BAT and then map 8Mb on 601 and 16Mb
68 * on other PPCs. This may cause trouble if the framebuffer
69 * is really badly aligned, but I didn't encounter this case
70 * yet.
71 */
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +110072void __init btext_prepare_BAT(void)
Paul Mackerras9b6b5632005-10-06 12:06:20 +100073{
Michael Ellermanb5666f72005-12-05 10:24:33 -060074 unsigned long vaddr = PAGE_OFFSET + 0x10000000;
Paul Mackerras9b6b5632005-10-06 12:06:20 +100075 unsigned long addr;
76 unsigned long lowbits;
77
78 addr = (unsigned long)dispDeviceBase;
79 if (!addr) {
80 boot_text_mapped = 0;
81 return;
82 }
83 if (PVR_VER(mfspr(SPRN_PVR)) != 1) {
84 /* 603, 604, G3, G4, ... */
85 lowbits = addr & ~0xFF000000UL;
86 addr &= 0xFF000000UL;
87 disp_BAT[0] = vaddr | (BL_16M<<2) | 2;
88 disp_BAT[1] = addr | (_PAGE_NO_CACHE | _PAGE_GUARDED | BPP_RW);
89 } else {
90 /* 601 */
91 lowbits = addr & ~0xFF800000UL;
92 addr &= 0xFF800000UL;
93 disp_BAT[0] = vaddr | (_PAGE_NO_CACHE | PP_RWXX) | 4;
94 disp_BAT[1] = addr | BL_8M | 0x40;
95 }
96 logicalDisplayBase = (void *) (vaddr + lowbits);
97}
Paul Mackerras40ef8cb2005-10-10 22:50:37 +100098#endif
Paul Mackerras9b6b5632005-10-06 12:06:20 +100099
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100100
101/* This function can be used to enable the early boot text when doing
102 * OF booting or within bootx init. It must be followed by a btext_unmap()
103 * call before the logical address becomes unuseable
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000104 */
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100105void __init btext_setup_display(int width, int height, int depth, int pitch,
106 unsigned long address)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000107{
108 g_loc_X = 0;
109 g_loc_Y = 0;
110 g_max_loc_X = width / 8;
111 g_max_loc_Y = height / 16;
112 logicalDisplayBase = (unsigned char *)address;
113 dispDeviceBase = (unsigned char *)address;
114 dispDeviceRowBytes = pitch;
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000115 dispDeviceDepth = depth == 15 ? 16 : depth;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000116 dispDeviceRect[0] = dispDeviceRect[1] = 0;
117 dispDeviceRect[2] = width;
118 dispDeviceRect[3] = height;
119 boot_text_mapped = 1;
120}
121
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100122void __init btext_unmap(void)
123{
124 boot_text_mapped = 0;
125}
126
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000127/* Here's a small text engine to use during early boot
128 * or for debugging purposes
129 *
130 * todo:
131 *
132 * - build some kind of vgacon with it to enable early printk
133 * - move to a separate file
134 * - add a few video driver hooks to keep in sync with display
135 * changes.
136 */
137
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100138static void map_boot_text(void)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000139{
140 unsigned long base, offset, size;
141 unsigned char *vbase;
142
143 /* By default, we are no longer mapped */
144 boot_text_mapped = 0;
145 if (dispDeviceBase == 0)
146 return;
147 base = ((unsigned long) dispDeviceBase) & 0xFFFFF000UL;
148 offset = ((unsigned long) dispDeviceBase) - base;
149 size = dispDeviceRowBytes * dispDeviceRect[3] + offset
150 + dispDeviceRect[0];
151 vbase = __ioremap(base, size, _PAGE_NO_CACHE);
152 if (vbase == 0)
153 return;
154 logicalDisplayBase = vbase + offset;
155 boot_text_mapped = 1;
156}
157
158int btext_initialize(struct device_node *np)
159{
160 unsigned int width, height, depth, pitch;
161 unsigned long address = 0;
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000162 const u32 *prop;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000163
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000164 prop = get_property(np, "linux,bootx-width", NULL);
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000165 if (prop == NULL)
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000166 prop = get_property(np, "width", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000167 if (prop == NULL)
168 return -EINVAL;
169 width = *prop;
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000170 prop = get_property(np, "linux,bootx-height", NULL);
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000171 if (prop == NULL)
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000172 prop = get_property(np, "height", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000173 if (prop == NULL)
174 return -EINVAL;
175 height = *prop;
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000176 prop = get_property(np, "linux,bootx-depth", NULL);
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000177 if (prop == NULL)
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000178 prop = get_property(np, "depth", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000179 if (prop == NULL)
180 return -EINVAL;
181 depth = *prop;
182 pitch = width * ((depth + 7) / 8);
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000183 prop = get_property(np, "linux,bootx-linebytes", NULL);
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000184 if (prop == NULL)
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000185 prop = get_property(np, "linebytes", NULL);
Benjamin Herrenschmidt441cbd82006-10-26 15:38:10 +1000186 if (prop && *prop != 0xffffffffu)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000187 pitch = *prop;
188 if (pitch == 1)
189 pitch = 0x1000;
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000190 prop = get_property(np, "address", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000191 if (prop)
192 address = *prop;
193
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100194 /* FIXME: Add support for PCI reg properties. Right now, only
195 * reliable on macs
196 */
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000197 if (address == 0)
198 return -EINVAL;
199
200 g_loc_X = 0;
201 g_loc_Y = 0;
202 g_max_loc_X = width / 8;
203 g_max_loc_Y = height / 16;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000204 dispDeviceBase = (unsigned char *)address;
205 dispDeviceRowBytes = pitch;
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000206 dispDeviceDepth = depth == 15 ? 16 : depth;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000207 dispDeviceRect[0] = dispDeviceRect[1] = 0;
208 dispDeviceRect[2] = width;
209 dispDeviceRect[3] = height;
210
211 map_boot_text();
212
213 return 0;
214}
215
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100216int __init btext_find_display(int allow_nonstdout)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000217{
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000218 const char *name;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000219 struct device_node *np = NULL;
220 int rc = -ENODEV;
221
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000222 name = get_property(of_chosen, "linux,stdout-path", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000223 if (name != NULL) {
224 np = of_find_node_by_path(name);
225 if (np != NULL) {
226 if (strcmp(np->type, "display") != 0) {
227 printk("boot stdout isn't a display !\n");
228 of_node_put(np);
229 np = NULL;
230 }
231 }
232 }
233 if (np)
234 rc = btext_initialize(np);
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100235 if (rc == 0 || !allow_nonstdout)
236 return rc;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000237
238 for (np = NULL; (np = of_find_node_by_type(np, "display"));) {
239 if (get_property(np, "linux,opened", NULL)) {
240 printk("trying %s ...\n", np->full_name);
241 rc = btext_initialize(np);
242 printk("result: %d\n", rc);
243 }
244 if (rc == 0)
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100245 break;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000246 }
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100247 return rc;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000248}
249
250/* Calc the base address of a given point (x,y) */
251static unsigned char * calc_base(int x, int y)
252{
253 unsigned char *base;
254
255 base = logicalDisplayBase;
256 if (base == 0)
257 base = dispDeviceBase;
258 base += (x + dispDeviceRect[0]) * (dispDeviceDepth >> 3);
259 base += (y + dispDeviceRect[1]) * dispDeviceRowBytes;
260 return base;
261}
262
263/* Adjust the display to a new resolution */
264void btext_update_display(unsigned long phys, int width, int height,
265 int depth, int pitch)
266{
267 if (dispDeviceBase == 0)
268 return;
269
270 /* check it's the same frame buffer (within 256MB) */
271 if ((phys ^ (unsigned long)dispDeviceBase) & 0xf0000000)
272 return;
273
274 dispDeviceBase = (__u8 *) phys;
275 dispDeviceRect[0] = 0;
276 dispDeviceRect[1] = 0;
277 dispDeviceRect[2] = width;
278 dispDeviceRect[3] = height;
279 dispDeviceDepth = depth;
280 dispDeviceRowBytes = pitch;
281 if (boot_text_mapped) {
282 iounmap(logicalDisplayBase);
283 boot_text_mapped = 0;
284 }
285 map_boot_text();
286 g_loc_X = 0;
287 g_loc_Y = 0;
288 g_max_loc_X = width / 8;
289 g_max_loc_Y = height / 16;
290}
291EXPORT_SYMBOL(btext_update_display);
292
293void btext_clearscreen(void)
294{
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100295 unsigned int *base = (unsigned int *)calc_base(0, 0);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000296 unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100297 (dispDeviceDepth >> 3)) >> 2;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000298 int i,j;
299
300 for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1]); i++)
301 {
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100302 unsigned int *ptr = base;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000303 for(j=width; j; --j)
304 *(ptr++) = 0;
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100305 base += (dispDeviceRowBytes >> 2);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000306 }
307}
308
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100309void btext_flushscreen(void)
310{
311 unsigned int *base = (unsigned int *)calc_base(0, 0);
312 unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
313 (dispDeviceDepth >> 3)) >> 2;
314 int i,j;
315
316 for (i=0; i < (dispDeviceRect[3] - dispDeviceRect[1]); i++)
317 {
318 unsigned int *ptr = base;
319 for(j = width; j > 0; j -= 8) {
320 __asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
321 ptr += 8;
322 }
323 base += (dispDeviceRowBytes >> 2);
324 }
325 __asm__ __volatile__ ("sync" ::: "memory");
326}
327
328void btext_flushline(void)
329{
330 unsigned int *base = (unsigned int *)calc_base(0, g_loc_Y << 4);
331 unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
332 (dispDeviceDepth >> 3)) >> 2;
333 int i,j;
334
335 for (i=0; i < 16; i++)
336 {
337 unsigned int *ptr = base;
338 for(j = width; j > 0; j -= 8) {
339 __asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
340 ptr += 8;
341 }
342 base += (dispDeviceRowBytes >> 2);
343 }
344 __asm__ __volatile__ ("sync" ::: "memory");
345}
346
347
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000348#ifndef NO_SCROLL
349static void scrollscreen(void)
350{
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100351 unsigned int *src = (unsigned int *)calc_base(0,16);
352 unsigned int *dst = (unsigned int *)calc_base(0,0);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000353 unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100354 (dispDeviceDepth >> 3)) >> 2;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000355 int i,j;
356
357 for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1] - 16); i++)
358 {
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100359 unsigned int *src_ptr = src;
360 unsigned int *dst_ptr = dst;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000361 for(j=width; j; --j)
362 *(dst_ptr++) = *(src_ptr++);
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100363 src += (dispDeviceRowBytes >> 2);
364 dst += (dispDeviceRowBytes >> 2);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000365 }
366 for (i=0; i<16; i++)
367 {
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100368 unsigned int *dst_ptr = dst;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000369 for(j=width; j; --j)
370 *(dst_ptr++) = 0;
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100371 dst += (dispDeviceRowBytes >> 2);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000372 }
373}
374#endif /* ndef NO_SCROLL */
375
376void btext_drawchar(char c)
377{
378 int cline = 0;
379#ifdef NO_SCROLL
380 int x;
381#endif
382 if (!boot_text_mapped)
383 return;
384
385 switch (c) {
386 case '\b':
387 if (g_loc_X > 0)
388 --g_loc_X;
389 break;
390 case '\t':
391 g_loc_X = (g_loc_X & -8) + 8;
392 break;
393 case '\r':
394 g_loc_X = 0;
395 break;
396 case '\n':
397 g_loc_X = 0;
398 g_loc_Y++;
399 cline = 1;
400 break;
401 default:
402 draw_byte(c, g_loc_X++, g_loc_Y);
403 }
404 if (g_loc_X >= g_max_loc_X) {
405 g_loc_X = 0;
406 g_loc_Y++;
407 cline = 1;
408 }
409#ifndef NO_SCROLL
410 while (g_loc_Y >= g_max_loc_Y) {
411 scrollscreen();
412 g_loc_Y--;
413 }
414#else
415 /* wrap around from bottom to top of screen so we don't
416 waste time scrolling each line. -- paulus. */
417 if (g_loc_Y >= g_max_loc_Y)
418 g_loc_Y = 0;
419 if (cline) {
420 for (x = 0; x < g_max_loc_X; ++x)
421 draw_byte(' ', x, g_loc_Y);
422 }
423#endif
424}
425
426void btext_drawstring(const char *c)
427{
428 if (!boot_text_mapped)
429 return;
430 while (*c)
431 btext_drawchar(*c++);
432}
433
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100434void btext_drawtext(const char *c, unsigned int len)
435{
436 if (!boot_text_mapped)
437 return;
438 while (len--)
439 btext_drawchar(*c++);
440}
441
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000442void btext_drawhex(unsigned long v)
443{
444 char *hex_table = "0123456789abcdef";
445
446 if (!boot_text_mapped)
447 return;
448#ifdef CONFIG_PPC64
449 btext_drawchar(hex_table[(v >> 60) & 0x0000000FUL]);
450 btext_drawchar(hex_table[(v >> 56) & 0x0000000FUL]);
451 btext_drawchar(hex_table[(v >> 52) & 0x0000000FUL]);
452 btext_drawchar(hex_table[(v >> 48) & 0x0000000FUL]);
453 btext_drawchar(hex_table[(v >> 44) & 0x0000000FUL]);
454 btext_drawchar(hex_table[(v >> 40) & 0x0000000FUL]);
455 btext_drawchar(hex_table[(v >> 36) & 0x0000000FUL]);
456 btext_drawchar(hex_table[(v >> 32) & 0x0000000FUL]);
457#endif
458 btext_drawchar(hex_table[(v >> 28) & 0x0000000FUL]);
459 btext_drawchar(hex_table[(v >> 24) & 0x0000000FUL]);
460 btext_drawchar(hex_table[(v >> 20) & 0x0000000FUL]);
461 btext_drawchar(hex_table[(v >> 16) & 0x0000000FUL]);
462 btext_drawchar(hex_table[(v >> 12) & 0x0000000FUL]);
463 btext_drawchar(hex_table[(v >> 8) & 0x0000000FUL]);
464 btext_drawchar(hex_table[(v >> 4) & 0x0000000FUL]);
465 btext_drawchar(hex_table[(v >> 0) & 0x0000000FUL]);
466 btext_drawchar(' ');
467}
468
469static void draw_byte(unsigned char c, long locX, long locY)
470{
471 unsigned char *base = calc_base(locX << 3, locY << 4);
472 unsigned char *font = &vga_font[((unsigned int)c) * 16];
473 int rb = dispDeviceRowBytes;
474
475 switch(dispDeviceDepth) {
476 case 24:
477 case 32:
478 draw_byte_32(font, (unsigned int *)base, rb);
479 break;
480 case 15:
481 case 16:
482 draw_byte_16(font, (unsigned int *)base, rb);
483 break;
484 case 8:
485 draw_byte_8(font, (unsigned int *)base, rb);
486 break;
487 }
488}
489
490static unsigned int expand_bits_8[16] = {
491 0x00000000,
492 0x000000ff,
493 0x0000ff00,
494 0x0000ffff,
495 0x00ff0000,
496 0x00ff00ff,
497 0x00ffff00,
498 0x00ffffff,
499 0xff000000,
500 0xff0000ff,
501 0xff00ff00,
502 0xff00ffff,
503 0xffff0000,
504 0xffff00ff,
505 0xffffff00,
506 0xffffffff
507};
508
509static unsigned int expand_bits_16[4] = {
510 0x00000000,
511 0x0000ffff,
512 0xffff0000,
513 0xffffffff
514};
515
516
517static void draw_byte_32(unsigned char *font, unsigned int *base, int rb)
518{
519 int l, bits;
520 int fg = 0xFFFFFFFFUL;
521 int bg = 0x00000000UL;
522
523 for (l = 0; l < 16; ++l)
524 {
525 bits = *font++;
526 base[0] = (-(bits >> 7) & fg) ^ bg;
527 base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
528 base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
529 base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
530 base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
531 base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
532 base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
533 base[7] = (-(bits & 1) & fg) ^ bg;
534 base = (unsigned int *) ((char *)base + rb);
535 }
536}
537
538static void draw_byte_16(unsigned char *font, unsigned int *base, int rb)
539{
540 int l, bits;
541 int fg = 0xFFFFFFFFUL;
542 int bg = 0x00000000UL;
543 unsigned int *eb = (int *)expand_bits_16;
544
545 for (l = 0; l < 16; ++l)
546 {
547 bits = *font++;
548 base[0] = (eb[bits >> 6] & fg) ^ bg;
549 base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
550 base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
551 base[3] = (eb[bits & 3] & fg) ^ bg;
552 base = (unsigned int *) ((char *)base + rb);
553 }
554}
555
556static void draw_byte_8(unsigned char *font, unsigned int *base, int rb)
557{
558 int l, bits;
559 int fg = 0x0F0F0F0FUL;
560 int bg = 0x00000000UL;
561 unsigned int *eb = (int *)expand_bits_8;
562
563 for (l = 0; l < 16; ++l)
564 {
565 bits = *font++;
566 base[0] = (eb[bits >> 4] & fg) ^ bg;
567 base[1] = (eb[bits & 0xf] & fg) ^ bg;
568 base = (unsigned int *) ((char *)base + rb);
569 }
570}
571
572static unsigned char vga_font[cmapsz] = {
5730x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5740x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
5750x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff,
5760xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
5770x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10,
5780x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
5790x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
5800x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
5810x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c,
5820x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
5830x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
5840xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5850x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,
5860x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
5870xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e,
5880x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
5890x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
5900x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
5910x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63,
5920x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
5930x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18,
5940x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
5950xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e,
5960x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
5970x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00,
5980x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
5990x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb,
6000xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
6010x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6,
6020x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6030xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
6040x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
6050x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
6060x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
6070x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6080x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6090x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00,
6100x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
6110xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6120x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6130x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00,
6140x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
6150x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6160x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6170x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
6180x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
6190x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c,
6200x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
6210x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c,
6220x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
6230x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
6240x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
6250x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6260x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
6270x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
6280x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
6290x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00,
6300x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
6310x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6320x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
6330x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
6340x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6350x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6360x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
6370x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c,
6380x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
6390x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
6400x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
6410x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c,
6420x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
6430x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
6440xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
6450x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
6460x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
6470x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
6480xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
6490x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78,
6500x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
6510x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6520x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
6530x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06,
6540x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
6550x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
6560x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
6570x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
6580x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde,
6590xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
6600x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
6610x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc,
6620x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
6630xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c,
6640x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
6650x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe,
6660x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
6670x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
6680xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
6690x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
6700x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
6710x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
6720x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
6730x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6,
6740x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
6750x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xe7,
6760xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
6770x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6,
6780x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
6790xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66,
6800x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
6810x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c,
6820x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
6830x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
6840xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
6850x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
6860x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
6870xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
6880xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
6890x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66,
6900x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18,
6910x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
6920xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
6930x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff,
6940x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
6950x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
6960xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
6970x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c,
6980x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
6990x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7000x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
7010x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7020x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
7030xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60,
7040x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
7050x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
7060x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
7070xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7080x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7090x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0,
7100x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
7110xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60,
7120x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
7130x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7140x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
7150x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60,
7160x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
7170x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7180x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb,
7190xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7200x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
7210x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
7220x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
7230x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
7240x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
7250x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0,
7260x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
7270x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
7280x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
7290x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
7300x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3,
7310xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7320x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00,
7330x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3,
7340x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
7350xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
7360x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
7370x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e,
7380x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
7390x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
7400x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
7410x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7420x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
7430xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
7440xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,
7450x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
7460x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
7470xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
7480x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
7490x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
7500x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
7510xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38,
7520x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
7530x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06,
7540x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
7550xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
7560x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7570x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c,
7580x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
7590x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
7600x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
7610x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7620x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
7630xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00,
7640x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
7650x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe,
7660x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b,
7670x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c,
7680xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
7690x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
7700x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
7710xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
7720x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7730x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
7740x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
7750xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
7760x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
7770x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
7780x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
7790xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
7800xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
7810x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc,
7820x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18,
7830xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66,
7840x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00,
7850x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18,
7860xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
7870xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
7880x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
7890x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
7900x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
7910xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
7920x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
7930x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
7940x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00,
7950x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
7960x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7970x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c,
7980x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
7990xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8000x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
8010x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06,
8020x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30,
8030x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
8040x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
8050x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
8060x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
8070x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
8080x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
8090x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
8100x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
8110xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18,
8120x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8130x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
8140x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
8150x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
8160x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8170x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36,
8180x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8,
8190x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
8200x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8210x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8220x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
8230x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8240x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8250x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00,
8260x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
8270x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8280x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8290x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
8300x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
8310x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8320x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8330x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
8340x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
8350x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
8360x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8370x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
8380x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
8390x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8400x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8410x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
8420x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
8430x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8440x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8450x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
8460x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
8470x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
8480x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8490x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
8500x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
8510x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8520x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8530x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36,
8540x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
8550x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
8560x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8570x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
8580x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
8590x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8600x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8610x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18,
8620x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
8630x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8640x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8650xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
8660xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
8670xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0,
8680xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
8690x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
8700x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
8710x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8720x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
8730x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc,
8740x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
8750xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8760xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
8770x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe,
8780x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8,
8790xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8800x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
8810x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8820x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66,
8830x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
8840x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
8850x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee,
8860x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66,
8870x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8880x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8890x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0,
8900x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60,
8910x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
8920xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
8930x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00,
8940x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
8950x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
8960x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
8970x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e,
8980x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18,
8990x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
9000x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
9010x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00,
9020x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
9030x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
9040x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9050x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
9060x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9070x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c,
9080x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
9090x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00,
9100x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00,
9110x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9120x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
9130x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9140x00, 0x00, 0x00, 0x00,
915};
David Gibson719c91c2007-02-13 15:54:22 +1100916
917void __init udbg_init_btext(void)
918{
919 /* If btext is enabled, we might have a BAT setup for early display,
920 * thus we do enable some very basic udbg output
921 */
922 udbg_putc = btext_drawchar;
923}