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