Linux Audio

Check our new training course

Loading...
v6.8
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 * Procedures for drawing on the screen early on in the boot process.
  4 *
  5 * Benjamin Herrenschmidt <benh@kernel.crashing.org>
  6 */
  7#include <linux/kernel.h>
  8#include <linux/string.h>
  9#include <linux/init.h>
 10#include <linux/export.h>
 11#include <linux/font.h>
 12#include <linux/memblock.h>
 13#include <linux/pgtable.h>
 14#include <linux/of.h>
 15
 16#include <asm/sections.h>
 
 17#include <asm/btext.h>
 18#include <asm/page.h>
 19#include <asm/mmu.h>
 
 20#include <asm/io.h>
 21#include <asm/processor.h>
 22#include <asm/udbg.h>
 23
 24#define NO_SCROLL
 25
 26#ifndef NO_SCROLL
 27static void scrollscreen(void);
 28#endif
 29
 30#define __force_data __section(".data")
 31
 32static int g_loc_X __force_data;
 33static int g_loc_Y __force_data;
 34static int g_max_loc_X __force_data;
 35static int g_max_loc_Y __force_data;
 36
 37static int dispDeviceRowBytes __force_data;
 38static int dispDeviceDepth  __force_data;
 39static int dispDeviceRect[4] __force_data;
 40static unsigned char *dispDeviceBase __force_data;
 41static unsigned char *logicalDisplayBase __force_data;
 42
 43unsigned long disp_BAT[2] __initdata = {0, 0};
 44
 45static int boot_text_mapped __force_data;
 
 
 
 
 
 46
 47extern void rmci_on(void);
 48extern void rmci_off(void);
 49
 50static inline void rmci_maybe_on(void)
 51{
 52#if defined(CONFIG_PPC_EARLY_DEBUG_BOOTX) && defined(CONFIG_PPC64)
 53	if (!(mfmsr() & MSR_DR))
 54		rmci_on();
 55#endif
 56}
 57
 58static inline void rmci_maybe_off(void)
 59{
 60#if defined(CONFIG_PPC_EARLY_DEBUG_BOOTX) && defined(CONFIG_PPC64)
 61	if (!(mfmsr() & MSR_DR))
 62		rmci_off();
 63#endif
 64}
 65
 66
 67#ifdef CONFIG_PPC32
 68/* Calc BAT values for mapping the display and store them
 69 * in disp_BAT.  Those values are then used from head.S to map
 70 * the display during identify_machine() and MMU_Init()
 71 *
 72 * The display is mapped to virtual address 0xD0000000, rather
 73 * than 1:1, because some CHRP machines put the frame buffer
 74 * in the region starting at 0xC0000000 (PAGE_OFFSET).
 75 * This mapping is temporary and will disappear as soon as the
 76 * setup done by MMU_Init() is applied.
 77 *
 78 * For now, we align the BAT and then map 8Mb on 601 and 16Mb
 79 * on other PPCs. This may cause trouble if the framebuffer
 80 * is really badly aligned, but I didn't encounter this case
 81 * yet.
 82 */
 83void __init btext_prepare_BAT(void)
 84{
 85	unsigned long vaddr = PAGE_OFFSET + 0x10000000;
 86	unsigned long addr;
 87	unsigned long lowbits;
 88
 89	addr = (unsigned long)dispDeviceBase;
 90	if (!addr) {
 91		boot_text_mapped = 0;
 92		return;
 93	}
 94	lowbits = addr & ~0xFF000000UL;
 95	addr &= 0xFF000000UL;
 96	disp_BAT[0] = vaddr | (BL_16M<<2) | 2;
 97	disp_BAT[1] = addr | (_PAGE_NO_CACHE | _PAGE_GUARDED | BPP_RW);
 
 
 
 
 
 
 
 
 
 98	logicalDisplayBase = (void *) (vaddr + lowbits);
 99}
100#endif
101
102
103/* This function can be used to enable the early boot text when doing
104 * OF booting or within bootx init. It must be followed by a btext_unmap()
105 * call before the logical address becomes unusable
106 */
107void __init btext_setup_display(int width, int height, int depth, int pitch,
108				unsigned long address)
109{
110	g_loc_X = 0;
111	g_loc_Y = 0;
112	g_max_loc_X = width / 8;
113	g_max_loc_Y = height / 16;
114	logicalDisplayBase = (unsigned char *)address;
115	dispDeviceBase = (unsigned char *)address;
116	dispDeviceRowBytes = pitch;
117	dispDeviceDepth = depth == 15 ? 16 : depth;
118	dispDeviceRect[0] = dispDeviceRect[1] = 0;
119	dispDeviceRect[2] = width;
120	dispDeviceRect[3] = height;
121	boot_text_mapped = 1;
122}
123
124void __init btext_unmap(void)
125{
126	boot_text_mapped = 0;
127}
128
129/* Here's a small text engine to use during early boot
130 * or for debugging purposes
131 *
132 * todo:
133 *
134 *  - build some kind of vgacon with it to enable early printk
135 *  - move to a separate file
136 *  - add a few video driver hooks to keep in sync with display
137 *    changes.
138 */
139
140void btext_map(void)
141{
142	unsigned long base, offset, size;
143	unsigned char *vbase;
144
145	/* By default, we are no longer mapped */
146	boot_text_mapped = 0;
147	if (!dispDeviceBase)
148		return;
149	base = ((unsigned long) dispDeviceBase) & 0xFFFFF000UL;
150	offset = ((unsigned long) dispDeviceBase) - base;
151	size = dispDeviceRowBytes * dispDeviceRect[3] + offset
152		+ dispDeviceRect[0];
153	vbase = ioremap_wc(base, size);
154	if (!vbase)
155		return;
156	logicalDisplayBase = vbase + offset;
157	boot_text_mapped = 1;
158}
159
160static int __init btext_initialize(struct device_node *np)
161{
162	unsigned int width, height, depth, pitch;
163	unsigned long address = 0;
164	const u32 *prop;
165
166	prop = of_get_property(np, "linux,bootx-width", NULL);
167	if (prop == NULL)
168		prop = of_get_property(np, "width", NULL);
169	if (prop == NULL)
170		return -EINVAL;
171	width = *prop;
172	prop = of_get_property(np, "linux,bootx-height", NULL);
173	if (prop == NULL)
174		prop = of_get_property(np, "height", NULL);
175	if (prop == NULL)
176		return -EINVAL;
177	height = *prop;
178	prop = of_get_property(np, "linux,bootx-depth", NULL);
179	if (prop == NULL)
180		prop = of_get_property(np, "depth", NULL);
181	if (prop == NULL)
182		return -EINVAL;
183	depth = *prop;
184	pitch = width * ((depth + 7) / 8);
185	prop = of_get_property(np, "linux,bootx-linebytes", NULL);
186	if (prop == NULL)
187		prop = of_get_property(np, "linebytes", NULL);
188	if (prop && *prop != 0xffffffffu)
189		pitch = *prop;
190	if (pitch == 1)
191		pitch = 0x1000;
192	prop = of_get_property(np, "linux,bootx-addr", NULL);
193	if (prop == NULL)
194		prop = of_get_property(np, "address", NULL);
195	if (prop)
196		address = *prop;
197
198	/* FIXME: Add support for PCI reg properties. Right now, only
199	 * reliable on macs
200	 */
201	if (address == 0)
202		return -EINVAL;
203
204	g_loc_X = 0;
205	g_loc_Y = 0;
206	g_max_loc_X = width / 8;
207	g_max_loc_Y = height / 16;
208	dispDeviceBase = (unsigned char *)address;
209	dispDeviceRowBytes = pitch;
210	dispDeviceDepth = depth == 15 ? 16 : depth;
211	dispDeviceRect[0] = dispDeviceRect[1] = 0;
212	dispDeviceRect[2] = width;
213	dispDeviceRect[3] = height;
214
215	btext_map();
216
217	return 0;
218}
219
220int __init btext_find_display(int allow_nonstdout)
221{
222	struct device_node *np = of_stdout;
 
223	int rc = -ENODEV;
224
225	if (!of_node_is_type(np, "display")) {
226		printk("boot stdout isn't a display !\n");
227		np = NULL;
 
 
 
 
 
 
 
228	}
229	if (np)
230		rc = btext_initialize(np);
231	if (rc == 0 || !allow_nonstdout)
232		return rc;
233
234	for_each_node_by_type(np, "display") {
235		if (of_property_read_bool(np, "linux,opened")) {
236			printk("trying %pOF ...\n", np);
237			rc = btext_initialize(np);
238			printk("result: %d\n", rc);
239		}
240		if (rc == 0) {
241			of_node_put(np);
242			break;
243		}
244	}
245	return rc;
246}
247
248/* Calc the base address of a given point (x,y) */
249static unsigned char * calc_base(int x, int y)
250{
251	unsigned char *base;
252
253	base = logicalDisplayBase;
254	if (!base)
255		base = dispDeviceBase;
256	base += (x + dispDeviceRect[0]) * (dispDeviceDepth >> 3);
257	base += (y + dispDeviceRect[1]) * dispDeviceRowBytes;
258	return base;
259}
260
261/* Adjust the display to a new resolution */
262void btext_update_display(unsigned long phys, int width, int height,
263			  int depth, int pitch)
264{
265	if (!dispDeviceBase)
266		return;
267
268	/* check it's the same frame buffer (within 256MB) */
269	if ((phys ^ (unsigned long)dispDeviceBase) & 0xf0000000)
270		return;
271
272	dispDeviceBase = (__u8 *) phys;
273	dispDeviceRect[0] = 0;
274	dispDeviceRect[1] = 0;
275	dispDeviceRect[2] = width;
276	dispDeviceRect[3] = height;
277	dispDeviceDepth = depth;
278	dispDeviceRowBytes = pitch;
279	if (boot_text_mapped) {
280		iounmap(logicalDisplayBase);
281		boot_text_mapped = 0;
282	}
283	btext_map();
284	g_loc_X = 0;
285	g_loc_Y = 0;
286	g_max_loc_X = width / 8;
287	g_max_loc_Y = height / 16;
288}
289EXPORT_SYMBOL(btext_update_display);
290
291void __init btext_clearscreen(void)
292{
293	unsigned int *base	= (unsigned int *)calc_base(0, 0);
294	unsigned long width 	= ((dispDeviceRect[2] - dispDeviceRect[0]) *
295					(dispDeviceDepth >> 3)) >> 2;
296	int i,j;
297
298	rmci_maybe_on();
299	for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1]); i++)
300	{
301		unsigned int *ptr = base;
302		for(j=width; j; --j)
303			*(ptr++) = 0;
304		base += (dispDeviceRowBytes >> 2);
305	}
306	rmci_maybe_off();
307}
308
309void __init btext_flushscreen(void)
310{
311	unsigned int *base	= (unsigned int *)calc_base(0, 0);
312	unsigned long width 	= ((dispDeviceRect[2] - dispDeviceRect[0]) *
313					(dispDeviceDepth >> 3)) >> 2;
314	int i,j;
315
316	for (i=0; i < (dispDeviceRect[3] - dispDeviceRect[1]); i++)
317	{
318		unsigned int *ptr = base;
319		for(j = width; j > 0; j -= 8) {
320			__asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
321			ptr += 8;
322		}
323		base += (dispDeviceRowBytes >> 2);
324	}
325	__asm__ __volatile__ ("sync" ::: "memory");
326}
327
328void __init btext_flushline(void)
329{
330	unsigned int *base	= (unsigned int *)calc_base(0, g_loc_Y << 4);
331	unsigned long width 	= ((dispDeviceRect[2] - dispDeviceRect[0]) *
332					(dispDeviceDepth >> 3)) >> 2;
333	int i,j;
334
335	for (i=0; i < 16; i++)
336	{
337		unsigned int *ptr = base;
338		for(j = width; j > 0; j -= 8) {
339			__asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
340			ptr += 8;
341		}
342		base += (dispDeviceRowBytes >> 2);
343	}
344	__asm__ __volatile__ ("sync" ::: "memory");
345}
346
347
348#ifndef NO_SCROLL
349static void scrollscreen(void)
350{
351	unsigned int *src     	= (unsigned int *)calc_base(0,16);
352	unsigned int *dst     	= (unsigned int *)calc_base(0,0);
353	unsigned long width    	= ((dispDeviceRect[2] - dispDeviceRect[0]) *
354				   (dispDeviceDepth >> 3)) >> 2;
355	int i,j;
356
357	rmci_maybe_on();
358
359	for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1] - 16); i++)
360	{
361		unsigned int *src_ptr = src;
362		unsigned int *dst_ptr = dst;
363		for(j=width; j; --j)
364			*(dst_ptr++) = *(src_ptr++);
365		src += (dispDeviceRowBytes >> 2);
366		dst += (dispDeviceRowBytes >> 2);
367	}
368	for (i=0; i<16; i++)
369	{
370		unsigned int *dst_ptr = dst;
371		for(j=width; j; --j)
372			*(dst_ptr++) = 0;
373		dst += (dispDeviceRowBytes >> 2);
374	}
375
376	rmci_maybe_off();
377}
378#endif /* ndef NO_SCROLL */
379
380static unsigned int expand_bits_8[16] = {
381	0x00000000,
382	0x000000ff,
383	0x0000ff00,
384	0x0000ffff,
385	0x00ff0000,
386	0x00ff00ff,
387	0x00ffff00,
388	0x00ffffff,
389	0xff000000,
390	0xff0000ff,
391	0xff00ff00,
392	0xff00ffff,
393	0xffff0000,
394	0xffff00ff,
395	0xffffff00,
396	0xffffffff
397};
398
399static unsigned int expand_bits_16[4] = {
400	0x00000000,
401	0x0000ffff,
402	0xffff0000,
403	0xffffffff
404};
405
406
407static void draw_byte_32(const unsigned char *font, unsigned int *base, int rb)
408{
409	int l, bits;
410	int fg = 0xFFFFFFFFUL;
411	int bg = 0x00000000UL;
412
413	for (l = 0; l < 16; ++l)
414	{
415		bits = *font++;
416		base[0] = (-(bits >> 7) & fg) ^ bg;
417		base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
418		base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
419		base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
420		base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
421		base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
422		base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
423		base[7] = (-(bits & 1) & fg) ^ bg;
424		base = (unsigned int *) ((char *)base + rb);
425	}
426}
427
428static inline void draw_byte_16(const unsigned char *font, unsigned int *base, int rb)
429{
430	int l, bits;
431	int fg = 0xFFFFFFFFUL;
432	int bg = 0x00000000UL;
433	unsigned int *eb = (int *)expand_bits_16;
434
435	for (l = 0; l < 16; ++l)
436	{
437		bits = *font++;
438		base[0] = (eb[bits >> 6] & fg) ^ bg;
439		base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
440		base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
441		base[3] = (eb[bits & 3] & fg) ^ bg;
442		base = (unsigned int *) ((char *)base + rb);
443	}
444}
445
446static inline void draw_byte_8(const unsigned char *font, unsigned int *base, int rb)
447{
448	int l, bits;
449	int fg = 0x0F0F0F0FUL;
450	int bg = 0x00000000UL;
451	unsigned int *eb = (int *)expand_bits_8;
452
453	for (l = 0; l < 16; ++l)
454	{
455		bits = *font++;
456		base[0] = (eb[bits >> 4] & fg) ^ bg;
457		base[1] = (eb[bits & 0xf] & fg) ^ bg;
458		base = (unsigned int *) ((char *)base + rb);
459	}
460}
461
462static noinline void draw_byte(unsigned char c, long locX, long locY)
463{
464	unsigned char *base	= calc_base(locX << 3, locY << 4);
465	unsigned int font_index = c * 16;
466	const unsigned char *font	= font_sun_8x16.data + font_index;
467	int rb			= dispDeviceRowBytes;
468
469	rmci_maybe_on();
470	switch(dispDeviceDepth) {
471	case 24:
472	case 32:
473		draw_byte_32(font, (unsigned int *)base, rb);
474		break;
475	case 15:
476	case 16:
477		draw_byte_16(font, (unsigned int *)base, rb);
478		break;
479	case 8:
480		draw_byte_8(font, (unsigned int *)base, rb);
481		break;
482	}
483	rmci_maybe_off();
484}
485
486void btext_drawchar(char c)
487{
488	int cline = 0;
489#ifdef NO_SCROLL
490	int x;
491#endif
492	if (!boot_text_mapped)
493		return;
494
495	switch (c) {
496	case '\b':
497		if (g_loc_X > 0)
498			--g_loc_X;
499		break;
500	case '\t':
501		g_loc_X = (g_loc_X & -8) + 8;
502		break;
503	case '\r':
504		g_loc_X = 0;
505		break;
506	case '\n':
507		g_loc_X = 0;
508		g_loc_Y++;
509		cline = 1;
510		break;
511	default:
512		draw_byte(c, g_loc_X++, g_loc_Y);
513	}
514	if (g_loc_X >= g_max_loc_X) {
515		g_loc_X = 0;
516		g_loc_Y++;
517		cline = 1;
518	}
519#ifndef NO_SCROLL
520	while (g_loc_Y >= g_max_loc_Y) {
521		scrollscreen();
522		g_loc_Y--;
523	}
524#else
525	/* wrap around from bottom to top of screen so we don't
526	   waste time scrolling each line.  -- paulus. */
527	if (g_loc_Y >= g_max_loc_Y)
528		g_loc_Y = 0;
529	if (cline) {
530		for (x = 0; x < g_max_loc_X; ++x)
531			draw_byte(' ', x, g_loc_Y);
532	}
533#endif
534}
535
536void btext_drawstring(const char *c)
537{
538	if (!boot_text_mapped)
539		return;
540	while (*c)
541		btext_drawchar(*c++);
542}
543
544void __init btext_drawtext(const char *c, unsigned int len)
545{
546	if (!boot_text_mapped)
547		return;
548	while (len--)
549		btext_drawchar(*c++);
550}
551
552void __init btext_drawhex(unsigned long v)
553{
554	if (!boot_text_mapped)
555		return;
556#ifdef CONFIG_PPC64
557	btext_drawchar(hex_asc_hi(v >> 56));
558	btext_drawchar(hex_asc_lo(v >> 56));
559	btext_drawchar(hex_asc_hi(v >> 48));
560	btext_drawchar(hex_asc_lo(v >> 48));
561	btext_drawchar(hex_asc_hi(v >> 40));
562	btext_drawchar(hex_asc_lo(v >> 40));
563	btext_drawchar(hex_asc_hi(v >> 32));
564	btext_drawchar(hex_asc_lo(v >> 32));
565#endif
566	btext_drawchar(hex_asc_hi(v >> 24));
567	btext_drawchar(hex_asc_lo(v >> 24));
568	btext_drawchar(hex_asc_hi(v >> 16));
569	btext_drawchar(hex_asc_lo(v >> 16));
570	btext_drawchar(hex_asc_hi(v >> 8));
571	btext_drawchar(hex_asc_lo(v >> 8));
572	btext_drawchar(hex_asc_hi(v));
573	btext_drawchar(hex_asc_lo(v));
574	btext_drawchar(' ');
575}
576
577void __init udbg_init_btext(void)
578{
579	/* If btext is enabled, we might have a BAT setup for early display,
580	 * thus we do enable some very basic udbg output
581	 */
582	udbg_putc = btext_drawchar;
583}
v3.15
 
  1/*
  2 * Procedures for drawing on the screen early on in the boot process.
  3 *
  4 * Benjamin Herrenschmidt <benh@kernel.crashing.org>
  5 */
  6#include <linux/kernel.h>
  7#include <linux/string.h>
  8#include <linux/init.h>
  9#include <linux/export.h>
 
 10#include <linux/memblock.h>
 
 
 11
 12#include <asm/sections.h>
 13#include <asm/prom.h>
 14#include <asm/btext.h>
 15#include <asm/page.h>
 16#include <asm/mmu.h>
 17#include <asm/pgtable.h>
 18#include <asm/io.h>
 19#include <asm/processor.h>
 20#include <asm/udbg.h>
 21
 22#define NO_SCROLL
 23
 24#ifndef NO_SCROLL
 25static void scrollscreen(void);
 26#endif
 27
 28#define __force_data __attribute__((__section__(".data")))
 29
 30static int g_loc_X __force_data;
 31static int g_loc_Y __force_data;
 32static int g_max_loc_X __force_data;
 33static int g_max_loc_Y __force_data;
 34
 35static int dispDeviceRowBytes __force_data;
 36static int dispDeviceDepth  __force_data;
 37static int dispDeviceRect[4] __force_data;
 38static unsigned char *dispDeviceBase __force_data;
 39static unsigned char *logicalDisplayBase __force_data;
 40
 41unsigned long disp_BAT[2] __initdata = {0, 0};
 42
 43#define cmapsz	(16*256)
 44
 45static unsigned char vga_font[cmapsz];
 46
 47int boot_text_mapped __force_data = 0;
 48int force_printk_to_btext = 0;
 49
 50extern void rmci_on(void);
 51extern void rmci_off(void);
 52
 53static inline void rmci_maybe_on(void)
 54{
 55#if defined(CONFIG_PPC_EARLY_DEBUG_BOOTX) && defined(CONFIG_PPC64)
 56	if (!(mfmsr() & MSR_DR))
 57		rmci_on();
 58#endif
 59}
 60
 61static inline void rmci_maybe_off(void)
 62{
 63#if defined(CONFIG_PPC_EARLY_DEBUG_BOOTX) && defined(CONFIG_PPC64)
 64	if (!(mfmsr() & MSR_DR))
 65		rmci_off();
 66#endif
 67}
 68
 69
 70#ifdef CONFIG_PPC32
 71/* Calc BAT values for mapping the display and store them
 72 * in disp_BAT.  Those values are then used from head.S to map
 73 * the display during identify_machine() and MMU_Init()
 74 *
 75 * The display is mapped to virtual address 0xD0000000, rather
 76 * than 1:1, because some some CHRP machines put the frame buffer
 77 * in the region starting at 0xC0000000 (PAGE_OFFSET).
 78 * This mapping is temporary and will disappear as soon as the
 79 * setup done by MMU_Init() is applied.
 80 *
 81 * For now, we align the BAT and then map 8Mb on 601 and 16Mb
 82 * on other PPCs. This may cause trouble if the framebuffer
 83 * is really badly aligned, but I didn't encounter this case
 84 * yet.
 85 */
 86void __init btext_prepare_BAT(void)
 87{
 88	unsigned long vaddr = PAGE_OFFSET + 0x10000000;
 89	unsigned long addr;
 90	unsigned long lowbits;
 91
 92	addr = (unsigned long)dispDeviceBase;
 93	if (!addr) {
 94		boot_text_mapped = 0;
 95		return;
 96	}
 97	if (PVR_VER(mfspr(SPRN_PVR)) != 1) {
 98		/* 603, 604, G3, G4, ... */
 99		lowbits = addr & ~0xFF000000UL;
100		addr &= 0xFF000000UL;
101		disp_BAT[0] = vaddr | (BL_16M<<2) | 2;
102		disp_BAT[1] = addr | (_PAGE_NO_CACHE | _PAGE_GUARDED | BPP_RW);	
103	} else {
104		/* 601 */
105		lowbits = addr & ~0xFF800000UL;
106		addr &= 0xFF800000UL;
107		disp_BAT[0] = vaddr | (_PAGE_NO_CACHE | PP_RWXX) | 4;
108		disp_BAT[1] = addr | BL_8M | 0x40;
109	}
110	logicalDisplayBase = (void *) (vaddr + lowbits);
111}
112#endif
113
114
115/* This function can be used to enable the early boot text when doing
116 * OF booting or within bootx init. It must be followed by a btext_unmap()
117 * call before the logical address becomes unusable
118 */
119void __init btext_setup_display(int width, int height, int depth, int pitch,
120				unsigned long address)
121{
122	g_loc_X = 0;
123	g_loc_Y = 0;
124	g_max_loc_X = width / 8;
125	g_max_loc_Y = height / 16;
126	logicalDisplayBase = (unsigned char *)address;
127	dispDeviceBase = (unsigned char *)address;
128	dispDeviceRowBytes = pitch;
129	dispDeviceDepth = depth == 15 ? 16 : depth;
130	dispDeviceRect[0] = dispDeviceRect[1] = 0;
131	dispDeviceRect[2] = width;
132	dispDeviceRect[3] = height;
133	boot_text_mapped = 1;
134}
135
136void __init btext_unmap(void)
137{
138	boot_text_mapped = 0;
139}
140
141/* Here's a small text engine to use during early boot
142 * or for debugging purposes
143 *
144 * todo:
145 *
146 *  - build some kind of vgacon with it to enable early printk
147 *  - move to a separate file
148 *  - add a few video driver hooks to keep in sync with display
149 *    changes.
150 */
151
152void btext_map(void)
153{
154	unsigned long base, offset, size;
155	unsigned char *vbase;
156
157	/* By default, we are no longer mapped */
158	boot_text_mapped = 0;
159	if (dispDeviceBase == 0)
160		return;
161	base = ((unsigned long) dispDeviceBase) & 0xFFFFF000UL;
162	offset = ((unsigned long) dispDeviceBase) - base;
163	size = dispDeviceRowBytes * dispDeviceRect[3] + offset
164		+ dispDeviceRect[0];
165	vbase = __ioremap(base, size, _PAGE_NO_CACHE);
166	if (vbase == 0)
167		return;
168	logicalDisplayBase = vbase + offset;
169	boot_text_mapped = 1;
170}
171
172int btext_initialize(struct device_node *np)
173{
174	unsigned int width, height, depth, pitch;
175	unsigned long address = 0;
176	const u32 *prop;
177
178	prop = of_get_property(np, "linux,bootx-width", NULL);
179	if (prop == NULL)
180		prop = of_get_property(np, "width", NULL);
181	if (prop == NULL)
182		return -EINVAL;
183	width = *prop;
184	prop = of_get_property(np, "linux,bootx-height", NULL);
185	if (prop == NULL)
186		prop = of_get_property(np, "height", NULL);
187	if (prop == NULL)
188		return -EINVAL;
189	height = *prop;
190	prop = of_get_property(np, "linux,bootx-depth", NULL);
191	if (prop == NULL)
192		prop = of_get_property(np, "depth", NULL);
193	if (prop == NULL)
194		return -EINVAL;
195	depth = *prop;
196	pitch = width * ((depth + 7) / 8);
197	prop = of_get_property(np, "linux,bootx-linebytes", NULL);
198	if (prop == NULL)
199		prop = of_get_property(np, "linebytes", NULL);
200	if (prop && *prop != 0xffffffffu)
201		pitch = *prop;
202	if (pitch == 1)
203		pitch = 0x1000;
204	prop = of_get_property(np, "linux,bootx-addr", NULL);
205	if (prop == NULL)
206		prop = of_get_property(np, "address", NULL);
207	if (prop)
208		address = *prop;
209
210	/* FIXME: Add support for PCI reg properties. Right now, only
211	 * reliable on macs
212	 */
213	if (address == 0)
214		return -EINVAL;
215
216	g_loc_X = 0;
217	g_loc_Y = 0;
218	g_max_loc_X = width / 8;
219	g_max_loc_Y = height / 16;
220	dispDeviceBase = (unsigned char *)address;
221	dispDeviceRowBytes = pitch;
222	dispDeviceDepth = depth == 15 ? 16 : depth;
223	dispDeviceRect[0] = dispDeviceRect[1] = 0;
224	dispDeviceRect[2] = width;
225	dispDeviceRect[3] = height;
226
227	btext_map();
228
229	return 0;
230}
231
232int __init btext_find_display(int allow_nonstdout)
233{
234	const char *name;
235	struct device_node *np = NULL; 
236	int rc = -ENODEV;
237
238	name = of_get_property(of_chosen, "linux,stdout-path", NULL);
239	if (name != NULL) {
240		np = of_find_node_by_path(name);
241		if (np != NULL) {
242			if (strcmp(np->type, "display") != 0) {
243				printk("boot stdout isn't a display !\n");
244				of_node_put(np);
245				np = NULL;
246			}
247		}
248	}
249	if (np)
250		rc = btext_initialize(np);
251	if (rc == 0 || !allow_nonstdout)
252		return rc;
253
254	for_each_node_by_type(np, "display") {
255		if (of_get_property(np, "linux,opened", NULL)) {
256			printk("trying %s ...\n", np->full_name);
257			rc = btext_initialize(np);
258			printk("result: %d\n", rc);
259		}
260		if (rc == 0)
 
261			break;
 
262	}
263	return rc;
264}
265
266/* Calc the base address of a given point (x,y) */
267static unsigned char * calc_base(int x, int y)
268{
269	unsigned char *base;
270
271	base = logicalDisplayBase;
272	if (base == 0)
273		base = dispDeviceBase;
274	base += (x + dispDeviceRect[0]) * (dispDeviceDepth >> 3);
275	base += (y + dispDeviceRect[1]) * dispDeviceRowBytes;
276	return base;
277}
278
279/* Adjust the display to a new resolution */
280void btext_update_display(unsigned long phys, int width, int height,
281			  int depth, int pitch)
282{
283	if (dispDeviceBase == 0)
284		return;
285
286	/* check it's the same frame buffer (within 256MB) */
287	if ((phys ^ (unsigned long)dispDeviceBase) & 0xf0000000)
288		return;
289
290	dispDeviceBase = (__u8 *) phys;
291	dispDeviceRect[0] = 0;
292	dispDeviceRect[1] = 0;
293	dispDeviceRect[2] = width;
294	dispDeviceRect[3] = height;
295	dispDeviceDepth = depth;
296	dispDeviceRowBytes = pitch;
297	if (boot_text_mapped) {
298		iounmap(logicalDisplayBase);
299		boot_text_mapped = 0;
300	}
301	btext_map();
302	g_loc_X = 0;
303	g_loc_Y = 0;
304	g_max_loc_X = width / 8;
305	g_max_loc_Y = height / 16;
306}
307EXPORT_SYMBOL(btext_update_display);
308
309void btext_clearscreen(void)
310{
311	unsigned int *base	= (unsigned int *)calc_base(0, 0);
312	unsigned long width 	= ((dispDeviceRect[2] - dispDeviceRect[0]) *
313					(dispDeviceDepth >> 3)) >> 2;
314	int i,j;
315
316	rmci_maybe_on();
317	for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1]); i++)
318	{
319		unsigned int *ptr = base;
320		for(j=width; j; --j)
321			*(ptr++) = 0;
322		base += (dispDeviceRowBytes >> 2);
323	}
324	rmci_maybe_off();
325}
326
327void btext_flushscreen(void)
328{
329	unsigned int *base	= (unsigned int *)calc_base(0, 0);
330	unsigned long width 	= ((dispDeviceRect[2] - dispDeviceRect[0]) *
331					(dispDeviceDepth >> 3)) >> 2;
332	int i,j;
333
334	for (i=0; i < (dispDeviceRect[3] - dispDeviceRect[1]); i++)
335	{
336		unsigned int *ptr = base;
337		for(j = width; j > 0; j -= 8) {
338			__asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
339			ptr += 8;
340		}
341		base += (dispDeviceRowBytes >> 2);
342	}
343	__asm__ __volatile__ ("sync" ::: "memory");
344}
345
346void btext_flushline(void)
347{
348	unsigned int *base	= (unsigned int *)calc_base(0, g_loc_Y << 4);
349	unsigned long width 	= ((dispDeviceRect[2] - dispDeviceRect[0]) *
350					(dispDeviceDepth >> 3)) >> 2;
351	int i,j;
352
353	for (i=0; i < 16; i++)
354	{
355		unsigned int *ptr = base;
356		for(j = width; j > 0; j -= 8) {
357			__asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
358			ptr += 8;
359		}
360		base += (dispDeviceRowBytes >> 2);
361	}
362	__asm__ __volatile__ ("sync" ::: "memory");
363}
364
365
366#ifndef NO_SCROLL
367static void scrollscreen(void)
368{
369	unsigned int *src     	= (unsigned int *)calc_base(0,16);
370	unsigned int *dst     	= (unsigned int *)calc_base(0,0);
371	unsigned long width    	= ((dispDeviceRect[2] - dispDeviceRect[0]) *
372				   (dispDeviceDepth >> 3)) >> 2;
373	int i,j;
374
375	rmci_maybe_on();
376
377	for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1] - 16); i++)
378	{
379		unsigned int *src_ptr = src;
380		unsigned int *dst_ptr = dst;
381		for(j=width; j; --j)
382			*(dst_ptr++) = *(src_ptr++);
383		src += (dispDeviceRowBytes >> 2);
384		dst += (dispDeviceRowBytes >> 2);
385	}
386	for (i=0; i<16; i++)
387	{
388		unsigned int *dst_ptr = dst;
389		for(j=width; j; --j)
390			*(dst_ptr++) = 0;
391		dst += (dispDeviceRowBytes >> 2);
392	}
393
394	rmci_maybe_off();
395}
396#endif /* ndef NO_SCROLL */
397
398static unsigned int expand_bits_8[16] = {
399	0x00000000,
400	0x000000ff,
401	0x0000ff00,
402	0x0000ffff,
403	0x00ff0000,
404	0x00ff00ff,
405	0x00ffff00,
406	0x00ffffff,
407	0xff000000,
408	0xff0000ff,
409	0xff00ff00,
410	0xff00ffff,
411	0xffff0000,
412	0xffff00ff,
413	0xffffff00,
414	0xffffffff
415};
416
417static unsigned int expand_bits_16[4] = {
418	0x00000000,
419	0x0000ffff,
420	0xffff0000,
421	0xffffffff
422};
423
424
425static void draw_byte_32(unsigned char *font, unsigned int *base, int rb)
426{
427	int l, bits;
428	int fg = 0xFFFFFFFFUL;
429	int bg = 0x00000000UL;
430
431	for (l = 0; l < 16; ++l)
432	{
433		bits = *font++;
434		base[0] = (-(bits >> 7) & fg) ^ bg;
435		base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
436		base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
437		base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
438		base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
439		base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
440		base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
441		base[7] = (-(bits & 1) & fg) ^ bg;
442		base = (unsigned int *) ((char *)base + rb);
443	}
444}
445
446static inline void draw_byte_16(unsigned char *font, unsigned int *base, int rb)
447{
448	int l, bits;
449	int fg = 0xFFFFFFFFUL;
450	int bg = 0x00000000UL;
451	unsigned int *eb = (int *)expand_bits_16;
452
453	for (l = 0; l < 16; ++l)
454	{
455		bits = *font++;
456		base[0] = (eb[bits >> 6] & fg) ^ bg;
457		base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
458		base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
459		base[3] = (eb[bits & 3] & fg) ^ bg;
460		base = (unsigned int *) ((char *)base + rb);
461	}
462}
463
464static inline void draw_byte_8(unsigned char *font, unsigned int *base, int rb)
465{
466	int l, bits;
467	int fg = 0x0F0F0F0FUL;
468	int bg = 0x00000000UL;
469	unsigned int *eb = (int *)expand_bits_8;
470
471	for (l = 0; l < 16; ++l)
472	{
473		bits = *font++;
474		base[0] = (eb[bits >> 4] & fg) ^ bg;
475		base[1] = (eb[bits & 0xf] & fg) ^ bg;
476		base = (unsigned int *) ((char *)base + rb);
477	}
478}
479
480static noinline void draw_byte(unsigned char c, long locX, long locY)
481{
482	unsigned char *base	= calc_base(locX << 3, locY << 4);
483	unsigned char *font	= &vga_font[((unsigned int)c) * 16];
 
484	int rb			= dispDeviceRowBytes;
485
486	rmci_maybe_on();
487	switch(dispDeviceDepth) {
488	case 24:
489	case 32:
490		draw_byte_32(font, (unsigned int *)base, rb);
491		break;
492	case 15:
493	case 16:
494		draw_byte_16(font, (unsigned int *)base, rb);
495		break;
496	case 8:
497		draw_byte_8(font, (unsigned int *)base, rb);
498		break;
499	}
500	rmci_maybe_off();
501}
502
503void btext_drawchar(char c)
504{
505	int cline = 0;
506#ifdef NO_SCROLL
507	int x;
508#endif
509	if (!boot_text_mapped)
510		return;
511
512	switch (c) {
513	case '\b':
514		if (g_loc_X > 0)
515			--g_loc_X;
516		break;
517	case '\t':
518		g_loc_X = (g_loc_X & -8) + 8;
519		break;
520	case '\r':
521		g_loc_X = 0;
522		break;
523	case '\n':
524		g_loc_X = 0;
525		g_loc_Y++;
526		cline = 1;
527		break;
528	default:
529		draw_byte(c, g_loc_X++, g_loc_Y);
530	}
531	if (g_loc_X >= g_max_loc_X) {
532		g_loc_X = 0;
533		g_loc_Y++;
534		cline = 1;
535	}
536#ifndef NO_SCROLL
537	while (g_loc_Y >= g_max_loc_Y) {
538		scrollscreen();
539		g_loc_Y--;
540	}
541#else
542	/* wrap around from bottom to top of screen so we don't
543	   waste time scrolling each line.  -- paulus. */
544	if (g_loc_Y >= g_max_loc_Y)
545		g_loc_Y = 0;
546	if (cline) {
547		for (x = 0; x < g_max_loc_X; ++x)
548			draw_byte(' ', x, g_loc_Y);
549	}
550#endif
551}
552
553void btext_drawstring(const char *c)
554{
555	if (!boot_text_mapped)
556		return;
557	while (*c)
558		btext_drawchar(*c++);
559}
560
561void btext_drawtext(const char *c, unsigned int len)
562{
563	if (!boot_text_mapped)
564		return;
565	while (len--)
566		btext_drawchar(*c++);
567}
568
569void btext_drawhex(unsigned long v)
570{
571	if (!boot_text_mapped)
572		return;
573#ifdef CONFIG_PPC64
574	btext_drawchar(hex_asc_hi(v >> 56));
575	btext_drawchar(hex_asc_lo(v >> 56));
576	btext_drawchar(hex_asc_hi(v >> 48));
577	btext_drawchar(hex_asc_lo(v >> 48));
578	btext_drawchar(hex_asc_hi(v >> 40));
579	btext_drawchar(hex_asc_lo(v >> 40));
580	btext_drawchar(hex_asc_hi(v >> 32));
581	btext_drawchar(hex_asc_lo(v >> 32));
582#endif
583	btext_drawchar(hex_asc_hi(v >> 24));
584	btext_drawchar(hex_asc_lo(v >> 24));
585	btext_drawchar(hex_asc_hi(v >> 16));
586	btext_drawchar(hex_asc_lo(v >> 16));
587	btext_drawchar(hex_asc_hi(v >> 8));
588	btext_drawchar(hex_asc_lo(v >> 8));
589	btext_drawchar(hex_asc_hi(v));
590	btext_drawchar(hex_asc_lo(v));
591	btext_drawchar(' ');
592}
593
594void __init udbg_init_btext(void)
595{
596	/* If btext is enabled, we might have a BAT setup for early display,
597	 * thus we do enable some very basic udbg output
598	 */
599	udbg_putc = btext_drawchar;
600}
601
602static unsigned char vga_font[cmapsz] = {
6030x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6040x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
6050x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff,
6060xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
6070x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10,
6080x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
6090x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
6100x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
6110x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c,
6120x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
6130x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
6140xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6150x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,
6160x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
6170xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e,
6180x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
6190x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
6200x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
6210x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63,
6220x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
6230x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18,
6240x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
6250xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e,
6260x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
6270x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00,
6280x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
6290x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb,
6300xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
6310x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6,
6320x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6330xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
6340x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
6350x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
6360x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
6370x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6380x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6390x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00,
6400x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
6410xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6420x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6430x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00,
6440x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
6450x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6460x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6470x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
6480x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
6490x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c,
6500x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
6510x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c,
6520x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
6530x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
6540x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
6550x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6560x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
6570x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
6580x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
6590x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00,
6600x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
6610x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6620x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
6630x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
6640x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6650x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6660x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
6670x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c,
6680x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
6690x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
6700x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
6710x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c,
6720x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
6730x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
6740xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
6750x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
6760x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
6770x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
6780xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
6790x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78,
6800x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
6810x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6820x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
6830x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06,
6840x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
6850x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
6860x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
6870x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
6880x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde,
6890xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
6900x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
6910x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc,
6920x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
6930xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c,
6940x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
6950x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe,
6960x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
6970x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
6980xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
6990x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
7000x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
7010x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
7020x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
7030x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6,
7040x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
7050x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xe7,
7060xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
7070x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6,
7080x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
7090xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66,
7100x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
7110x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c,
7120x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
7130x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
7140xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7150x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7160x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
7170xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
7180xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
7190x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66,
7200x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18,
7210x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
7220xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
7230x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff,
7240x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
7250x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
7260xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
7270x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c,
7280x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
7290x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7300x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
7310x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7320x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
7330xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60,
7340x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
7350x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
7360x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
7370xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7380x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7390x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0,
7400x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
7410xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60,
7420x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
7430x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7440x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
7450x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60,
7460x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
7470x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7480x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb,
7490xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7500x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
7510x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
7520x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
7530x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
7540x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
7550x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0,
7560x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
7570x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
7580x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
7590x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
7600x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3,
7610xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7620x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00,
7630x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3,
7640x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
7650xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
7660x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
7670x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e,
7680x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
7690x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
7700x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
7710x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7720x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
7730xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
7740xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,
7750x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
7760x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
7770xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
7780x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
7790x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
7800x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
7810xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38,
7820x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
7830x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06,
7840x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
7850xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
7860x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7870x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c,
7880x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
7890x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
7900x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
7910x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7920x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
7930xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00,
7940x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
7950x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe,
7960x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b,
7970x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c,
7980xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
7990x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
8000x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
8010xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
8020x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
8030x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
8040x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
8050xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
8060x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
8070x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
8080x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
8090xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
8100xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
8110x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc,
8120x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18,
8130xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66,
8140x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00,
8150x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18,
8160xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
8170xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
8180x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
8190x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
8200x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
8210xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
8220x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
8230x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
8240x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00,
8250x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
8260x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8270x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c,
8280x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
8290xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8300x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
8310x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06,
8320x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30,
8330x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
8340x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
8350x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
8360x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
8370x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
8380x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
8390x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
8400x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
8410xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18,
8420x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8430x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
8440x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
8450x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
8460x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8470x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36,
8480x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8,
8490x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
8500x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8510x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8520x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
8530x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8540x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8550x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00,
8560x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
8570x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8580x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8590x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
8600x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
8610x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8620x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8630x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
8640x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
8650x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
8660x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8670x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
8680x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
8690x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8700x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8710x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
8720x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
8730x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8740x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8750x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
8760x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
8770x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
8780x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8790x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
8800x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
8810x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8820x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8830x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36,
8840x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
8850x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
8860x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8870x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
8880x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
8890x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8900x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8910x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18,
8920x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
8930x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8940x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8950xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
8960xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
8970xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0,
8980xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
8990x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
9000x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
9010x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9020x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
9030x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc,
9040x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
9050xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9060xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
9070x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe,
9080x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8,
9090xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9100x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
9110x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
9120x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66,
9130x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
9140x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
9150x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee,
9160x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66,
9170x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9180x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9190x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0,
9200x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60,
9210x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
9220xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
9230x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00,
9240x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
9250x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
9260x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
9270x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e,
9280x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18,
9290x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
9300x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
9310x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00,
9320x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
9330x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
9340x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9350x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
9360x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9370x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c,
9380x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
9390x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00,
9400x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00,
9410x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9420x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
9430x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9440x00, 0x00, 0x00, 0x00,
945};
946