blob: 9f9377745490d966ff434f728bc1e15581c3dace [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>
David S. Millerd9b2b2a2008-02-13 16:56:49 -080019#include <asm/prom.h>
Paul Mackerras9b6b5632005-10-06 12:06:20 +100020#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
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000164 prop = of_get_property(np, "linux,bootx-width", NULL);
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000165 if (prop == NULL)
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000166 prop = of_get_property(np, "width", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000167 if (prop == NULL)
168 return -EINVAL;
169 width = *prop;
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000170 prop = of_get_property(np, "linux,bootx-height", NULL);
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000171 if (prop == NULL)
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000172 prop = of_get_property(np, "height", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000173 if (prop == NULL)
174 return -EINVAL;
175 height = *prop;
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000176 prop = of_get_property(np, "linux,bootx-depth", NULL);
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000177 if (prop == NULL)
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000178 prop = of_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);
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000183 prop = of_get_property(np, "linux,bootx-linebytes", NULL);
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000184 if (prop == NULL)
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000185 prop = of_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;
Benjamin Herrenschmidtb7a2da12007-11-13 13:46:52 +1100190 prop = of_get_property(np, "linux,bootx-addr", NULL);
191 if (prop == NULL)
192 prop = of_get_property(np, "address", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000193 if (prop)
194 address = *prop;
195
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100196 /* FIXME: Add support for PCI reg properties. Right now, only
197 * reliable on macs
198 */
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000199 if (address == 0)
200 return -EINVAL;
201
202 g_loc_X = 0;
203 g_loc_Y = 0;
204 g_max_loc_X = width / 8;
205 g_max_loc_Y = height / 16;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000206 dispDeviceBase = (unsigned char *)address;
207 dispDeviceRowBytes = pitch;
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000208 dispDeviceDepth = depth == 15 ? 16 : depth;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000209 dispDeviceRect[0] = dispDeviceRect[1] = 0;
210 dispDeviceRect[2] = width;
211 dispDeviceRect[3] = height;
212
213 map_boot_text();
214
215 return 0;
216}
217
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100218int __init btext_find_display(int allow_nonstdout)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000219{
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000220 const char *name;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000221 struct device_node *np = NULL;
222 int rc = -ENODEV;
223
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000224 name = of_get_property(of_chosen, "linux,stdout-path", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000225 if (name != NULL) {
226 np = of_find_node_by_path(name);
227 if (np != NULL) {
228 if (strcmp(np->type, "display") != 0) {
229 printk("boot stdout isn't a display !\n");
230 of_node_put(np);
231 np = NULL;
232 }
233 }
234 }
235 if (np)
236 rc = btext_initialize(np);
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100237 if (rc == 0 || !allow_nonstdout)
238 return rc;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000239
Cyrill Gorcunov3329c0d2007-11-30 06:45:47 +1100240 for_each_node_by_type(np, "display") {
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000241 if (of_get_property(np, "linux,opened", NULL)) {
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000242 printk("trying %s ...\n", np->full_name);
243 rc = btext_initialize(np);
244 printk("result: %d\n", rc);
245 }
246 if (rc == 0)
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100247 break;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000248 }
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100249 return rc;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000250}
251
252/* Calc the base address of a given point (x,y) */
253static unsigned char * calc_base(int x, int y)
254{
255 unsigned char *base;
256
257 base = logicalDisplayBase;
258 if (base == 0)
259 base = dispDeviceBase;
260 base += (x + dispDeviceRect[0]) * (dispDeviceDepth >> 3);
261 base += (y + dispDeviceRect[1]) * dispDeviceRowBytes;
262 return base;
263}
264
265/* Adjust the display to a new resolution */
266void btext_update_display(unsigned long phys, int width, int height,
267 int depth, int pitch)
268{
269 if (dispDeviceBase == 0)
270 return;
271
272 /* check it's the same frame buffer (within 256MB) */
273 if ((phys ^ (unsigned long)dispDeviceBase) & 0xf0000000)
274 return;
275
276 dispDeviceBase = (__u8 *) phys;
277 dispDeviceRect[0] = 0;
278 dispDeviceRect[1] = 0;
279 dispDeviceRect[2] = width;
280 dispDeviceRect[3] = height;
281 dispDeviceDepth = depth;
282 dispDeviceRowBytes = pitch;
283 if (boot_text_mapped) {
284 iounmap(logicalDisplayBase);
285 boot_text_mapped = 0;
286 }
287 map_boot_text();
288 g_loc_X = 0;
289 g_loc_Y = 0;
290 g_max_loc_X = width / 8;
291 g_max_loc_Y = height / 16;
292}
293EXPORT_SYMBOL(btext_update_display);
294
295void btext_clearscreen(void)
296{
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100297 unsigned int *base = (unsigned int *)calc_base(0, 0);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000298 unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100299 (dispDeviceDepth >> 3)) >> 2;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000300 int i,j;
301
302 for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1]); i++)
303 {
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100304 unsigned int *ptr = base;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000305 for(j=width; j; --j)
306 *(ptr++) = 0;
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100307 base += (dispDeviceRowBytes >> 2);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000308 }
309}
310
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100311void btext_flushscreen(void)
312{
313 unsigned int *base = (unsigned int *)calc_base(0, 0);
314 unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
315 (dispDeviceDepth >> 3)) >> 2;
316 int i,j;
317
318 for (i=0; i < (dispDeviceRect[3] - dispDeviceRect[1]); i++)
319 {
320 unsigned int *ptr = base;
321 for(j = width; j > 0; j -= 8) {
322 __asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
323 ptr += 8;
324 }
325 base += (dispDeviceRowBytes >> 2);
326 }
327 __asm__ __volatile__ ("sync" ::: "memory");
328}
329
330void btext_flushline(void)
331{
332 unsigned int *base = (unsigned int *)calc_base(0, g_loc_Y << 4);
333 unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
334 (dispDeviceDepth >> 3)) >> 2;
335 int i,j;
336
337 for (i=0; i < 16; i++)
338 {
339 unsigned int *ptr = base;
340 for(j = width; j > 0; j -= 8) {
341 __asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
342 ptr += 8;
343 }
344 base += (dispDeviceRowBytes >> 2);
345 }
346 __asm__ __volatile__ ("sync" ::: "memory");
347}
348
349
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000350#ifndef NO_SCROLL
351static void scrollscreen(void)
352{
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100353 unsigned int *src = (unsigned int *)calc_base(0,16);
354 unsigned int *dst = (unsigned int *)calc_base(0,0);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000355 unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100356 (dispDeviceDepth >> 3)) >> 2;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000357 int i,j;
358
359 for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1] - 16); i++)
360 {
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100361 unsigned int *src_ptr = src;
362 unsigned int *dst_ptr = dst;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000363 for(j=width; j; --j)
364 *(dst_ptr++) = *(src_ptr++);
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100365 src += (dispDeviceRowBytes >> 2);
366 dst += (dispDeviceRowBytes >> 2);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000367 }
368 for (i=0; i<16; i++)
369 {
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100370 unsigned int *dst_ptr = dst;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000371 for(j=width; j; --j)
372 *(dst_ptr++) = 0;
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100373 dst += (dispDeviceRowBytes >> 2);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000374 }
375}
376#endif /* ndef NO_SCROLL */
377
378void btext_drawchar(char c)
379{
380 int cline = 0;
381#ifdef NO_SCROLL
382 int x;
383#endif
384 if (!boot_text_mapped)
385 return;
386
387 switch (c) {
388 case '\b':
389 if (g_loc_X > 0)
390 --g_loc_X;
391 break;
392 case '\t':
393 g_loc_X = (g_loc_X & -8) + 8;
394 break;
395 case '\r':
396 g_loc_X = 0;
397 break;
398 case '\n':
399 g_loc_X = 0;
400 g_loc_Y++;
401 cline = 1;
402 break;
403 default:
404 draw_byte(c, g_loc_X++, g_loc_Y);
405 }
406 if (g_loc_X >= g_max_loc_X) {
407 g_loc_X = 0;
408 g_loc_Y++;
409 cline = 1;
410 }
411#ifndef NO_SCROLL
412 while (g_loc_Y >= g_max_loc_Y) {
413 scrollscreen();
414 g_loc_Y--;
415 }
416#else
417 /* wrap around from bottom to top of screen so we don't
418 waste time scrolling each line. -- paulus. */
419 if (g_loc_Y >= g_max_loc_Y)
420 g_loc_Y = 0;
421 if (cline) {
422 for (x = 0; x < g_max_loc_X; ++x)
423 draw_byte(' ', x, g_loc_Y);
424 }
425#endif
426}
427
428void btext_drawstring(const char *c)
429{
430 if (!boot_text_mapped)
431 return;
432 while (*c)
433 btext_drawchar(*c++);
434}
435
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100436void btext_drawtext(const char *c, unsigned int len)
437{
438 if (!boot_text_mapped)
439 return;
440 while (len--)
441 btext_drawchar(*c++);
442}
443
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000444void btext_drawhex(unsigned long v)
445{
446 char *hex_table = "0123456789abcdef";
447
448 if (!boot_text_mapped)
449 return;
450#ifdef CONFIG_PPC64
451 btext_drawchar(hex_table[(v >> 60) & 0x0000000FUL]);
452 btext_drawchar(hex_table[(v >> 56) & 0x0000000FUL]);
453 btext_drawchar(hex_table[(v >> 52) & 0x0000000FUL]);
454 btext_drawchar(hex_table[(v >> 48) & 0x0000000FUL]);
455 btext_drawchar(hex_table[(v >> 44) & 0x0000000FUL]);
456 btext_drawchar(hex_table[(v >> 40) & 0x0000000FUL]);
457 btext_drawchar(hex_table[(v >> 36) & 0x0000000FUL]);
458 btext_drawchar(hex_table[(v >> 32) & 0x0000000FUL]);
459#endif
460 btext_drawchar(hex_table[(v >> 28) & 0x0000000FUL]);
461 btext_drawchar(hex_table[(v >> 24) & 0x0000000FUL]);
462 btext_drawchar(hex_table[(v >> 20) & 0x0000000FUL]);
463 btext_drawchar(hex_table[(v >> 16) & 0x0000000FUL]);
464 btext_drawchar(hex_table[(v >> 12) & 0x0000000FUL]);
465 btext_drawchar(hex_table[(v >> 8) & 0x0000000FUL]);
466 btext_drawchar(hex_table[(v >> 4) & 0x0000000FUL]);
467 btext_drawchar(hex_table[(v >> 0) & 0x0000000FUL]);
468 btext_drawchar(' ');
469}
470
471static void draw_byte(unsigned char c, long locX, long locY)
472{
473 unsigned char *base = calc_base(locX << 3, locY << 4);
474 unsigned char *font = &vga_font[((unsigned int)c) * 16];
475 int rb = dispDeviceRowBytes;
476
477 switch(dispDeviceDepth) {
478 case 24:
479 case 32:
480 draw_byte_32(font, (unsigned int *)base, rb);
481 break;
482 case 15:
483 case 16:
484 draw_byte_16(font, (unsigned int *)base, rb);
485 break;
486 case 8:
487 draw_byte_8(font, (unsigned int *)base, rb);
488 break;
489 }
490}
491
492static unsigned int expand_bits_8[16] = {
493 0x00000000,
494 0x000000ff,
495 0x0000ff00,
496 0x0000ffff,
497 0x00ff0000,
498 0x00ff00ff,
499 0x00ffff00,
500 0x00ffffff,
501 0xff000000,
502 0xff0000ff,
503 0xff00ff00,
504 0xff00ffff,
505 0xffff0000,
506 0xffff00ff,
507 0xffffff00,
508 0xffffffff
509};
510
511static unsigned int expand_bits_16[4] = {
512 0x00000000,
513 0x0000ffff,
514 0xffff0000,
515 0xffffffff
516};
517
518
519static void draw_byte_32(unsigned char *font, unsigned int *base, int rb)
520{
521 int l, bits;
522 int fg = 0xFFFFFFFFUL;
523 int bg = 0x00000000UL;
524
525 for (l = 0; l < 16; ++l)
526 {
527 bits = *font++;
528 base[0] = (-(bits >> 7) & fg) ^ bg;
529 base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
530 base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
531 base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
532 base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
533 base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
534 base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
535 base[7] = (-(bits & 1) & fg) ^ bg;
536 base = (unsigned int *) ((char *)base + rb);
537 }
538}
539
540static void draw_byte_16(unsigned char *font, unsigned int *base, int rb)
541{
542 int l, bits;
543 int fg = 0xFFFFFFFFUL;
544 int bg = 0x00000000UL;
545 unsigned int *eb = (int *)expand_bits_16;
546
547 for (l = 0; l < 16; ++l)
548 {
549 bits = *font++;
550 base[0] = (eb[bits >> 6] & fg) ^ bg;
551 base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
552 base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
553 base[3] = (eb[bits & 3] & fg) ^ bg;
554 base = (unsigned int *) ((char *)base + rb);
555 }
556}
557
558static void draw_byte_8(unsigned char *font, unsigned int *base, int rb)
559{
560 int l, bits;
561 int fg = 0x0F0F0F0FUL;
562 int bg = 0x00000000UL;
563 unsigned int *eb = (int *)expand_bits_8;
564
565 for (l = 0; l < 16; ++l)
566 {
567 bits = *font++;
568 base[0] = (eb[bits >> 4] & fg) ^ bg;
569 base[1] = (eb[bits & 0xf] & fg) ^ bg;
570 base = (unsigned int *) ((char *)base + rb);
571 }
572}
573
574static unsigned char vga_font[cmapsz] = {
5750x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5760x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
5770x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff,
5780xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
5790x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10,
5800x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
5810x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
5820x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
5830x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c,
5840x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
5850x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
5860xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
5870x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,
5880x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
5890xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e,
5900x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
5910x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
5920x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
5930x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63,
5940x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
5950x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18,
5960x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
5970xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e,
5980x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
5990x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00,
6000x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
6010x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb,
6020xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
6030x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6,
6040x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6050xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
6060x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
6070x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
6080x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
6090x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6100x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6110x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00,
6120x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
6130xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6140x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6150x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00,
6160x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
6170x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6180x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6190x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
6200x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
6210x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c,
6220x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
6230x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c,
6240x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
6250x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
6260x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
6270x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6280x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
6290x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
6300x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
6310x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00,
6320x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
6330x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6340x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
6350x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
6360x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6370x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6380x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
6390x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c,
6400x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
6410x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
6420x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
6430x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c,
6440x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
6450x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
6460xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
6470x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
6480x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
6490x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
6500xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
6510x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78,
6520x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
6530x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6540x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
6550x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06,
6560x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
6570x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
6580x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
6590x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
6600x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde,
6610xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
6620x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
6630x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc,
6640x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
6650xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c,
6660x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
6670x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe,
6680x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
6690x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
6700xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
6710x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
6720x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
6730x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
6740x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
6750x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6,
6760x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
6770x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xe7,
6780xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
6790x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6,
6800x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
6810xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66,
6820x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
6830x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c,
6840x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
6850x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
6860xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
6870x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
6880x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
6890xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
6900xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
6910x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66,
6920x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18,
6930x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
6940xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
6950x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff,
6960x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
6970x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
6980xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
6990x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c,
7000x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
7010x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7020x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
7030x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7040x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
7050xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60,
7060x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
7070x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
7080x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
7090xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7100x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7110x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0,
7120x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
7130xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60,
7140x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
7150x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7160x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
7170x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60,
7180x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
7190x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7200x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb,
7210xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7220x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
7230x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
7240x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
7250x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
7260x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
7270x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0,
7280x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
7290x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
7300x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
7310x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
7320x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3,
7330xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7340x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00,
7350x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3,
7360x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
7370xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
7380x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
7390x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e,
7400x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
7410x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
7420x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
7430x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7440x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
7450xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
7460xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,
7470x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
7480x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
7490xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
7500x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
7510x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
7520x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
7530xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38,
7540x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
7550x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06,
7560x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
7570xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
7580x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7590x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c,
7600x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
7610x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
7620x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
7630x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7640x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
7650xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00,
7660x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
7670x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe,
7680x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b,
7690x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c,
7700xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
7710x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
7720x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
7730xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
7740x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7750x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
7760x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
7770xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
7780x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
7790x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
7800x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
7810xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
7820xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
7830x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc,
7840x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18,
7850xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66,
7860x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00,
7870x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18,
7880xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
7890xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
7900x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
7910x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
7920x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
7930xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
7940x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
7950x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
7960x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00,
7970x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
7980x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7990x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c,
8000x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
8010xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8020x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
8030x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06,
8040x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30,
8050x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
8060x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
8070x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
8080x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
8090x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
8100x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
8110x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
8120x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
8130xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18,
8140x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8150x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
8160x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
8170x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
8180x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8190x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36,
8200x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8,
8210x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
8220x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8230x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8240x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
8250x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8260x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8270x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00,
8280x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
8290x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8300x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8310x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
8320x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
8330x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8340x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8350x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
8360x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
8370x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
8380x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8390x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
8400x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
8410x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8420x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8430x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
8440x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
8450x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8460x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8470x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
8480x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
8490x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
8500x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8510x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
8520x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
8530x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8540x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8550x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36,
8560x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
8570x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
8580x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8590x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
8600x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
8610x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8620x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8630x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18,
8640x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
8650x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8660x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8670xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
8680xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
8690xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0,
8700xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
8710x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
8720x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
8730x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8740x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
8750x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc,
8760x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
8770xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8780xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
8790x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe,
8800x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8,
8810xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8820x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
8830x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8840x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66,
8850x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
8860x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
8870x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee,
8880x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66,
8890x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8900x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8910x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0,
8920x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60,
8930x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
8940xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
8950x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00,
8960x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
8970x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
8980x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
8990x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e,
9000x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18,
9010x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
9020x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
9030x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00,
9040x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
9050x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
9060x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9070x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
9080x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9090x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c,
9100x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
9110x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00,
9120x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00,
9130x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9140x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
9150x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9160x00, 0x00, 0x00, 0x00,
917};
David Gibson719c91c2007-02-13 15:54:22 +1100918
919void __init udbg_init_btext(void)
920{
921 /* If btext is enabled, we might have a BAT setup for early display,
922 * thus we do enable some very basic udbg output
923 */
924 udbg_putc = btext_drawchar;
925}