blob: 6dfceaa820e42f99e682c4860fdbf06c5fb69cc1 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001// SPDX-License-Identifier: GPL-2.0
Paul Mackerras9b6b5632005-10-06 12:06:20 +10002/*
3 * Procedures for drawing on the screen early on in the boot process.
4 *
5 * Benjamin Herrenschmidt <benh@kernel.crashing.org>
6 */
Paul Mackerras9b6b5632005-10-06 12:06:20 +10007#include <linux/kernel.h>
8#include <linux/string.h>
9#include <linux/init.h>
Paul Gortmaker4b16f8e2011-07-22 18:24:23 -040010#include <linux/export.h>
Yinghai Lu95f72d12010-07-12 14:36:09 +100011#include <linux/memblock.h>
Paul Mackerras9b6b5632005-10-06 12:06:20 +100012
13#include <asm/sections.h>
14#include <asm/prom.h>
15#include <asm/btext.h>
Paul Mackerras9b6b5632005-10-06 12:06:20 +100016#include <asm/page.h>
17#include <asm/mmu.h>
18#include <asm/pgtable.h>
19#include <asm/io.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
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +110029#define __force_data __attribute__((__section__(".data")))
Paul Mackerras9b6b5632005-10-06 12:06:20 +100030
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +110031static int g_loc_X __force_data;
32static int g_loc_Y __force_data;
33static int g_max_loc_X __force_data;
34static int g_max_loc_Y __force_data;
35
36static int dispDeviceRowBytes __force_data;
37static int dispDeviceDepth __force_data;
38static int dispDeviceRect[4] __force_data;
39static unsigned char *dispDeviceBase __force_data;
40static unsigned char *logicalDisplayBase __force_data;
Paul Mackerras9b6b5632005-10-06 12:06:20 +100041
42unsigned long disp_BAT[2] __initdata = {0, 0};
43
44#define cmapsz (16*256)
45
46static unsigned char vga_font[cmapsz];
47
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +110048int boot_text_mapped __force_data = 0;
Paul Mackerras9b6b5632005-10-06 12:06:20 +100049int force_printk_to_btext = 0;
50
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +100051extern void rmci_on(void);
52extern void rmci_off(void);
53
54static inline void rmci_maybe_on(void)
55{
Benjamin Herrenschmidtee372bc2013-08-27 16:01:23 +100056#if defined(CONFIG_PPC_EARLY_DEBUG_BOOTX) && defined(CONFIG_PPC64)
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +100057 if (!(mfmsr() & MSR_DR))
58 rmci_on();
59#endif
60}
61
62static inline void rmci_maybe_off(void)
63{
Benjamin Herrenschmidtee372bc2013-08-27 16:01:23 +100064#if defined(CONFIG_PPC_EARLY_DEBUG_BOOTX) && defined(CONFIG_PPC64)
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +100065 if (!(mfmsr() & MSR_DR))
66 rmci_off();
67#endif
68}
69
70
Paul Mackerras40ef8cb2005-10-10 22:50:37 +100071#ifdef CONFIG_PPC32
Paul Mackerras9b6b5632005-10-06 12:06:20 +100072/* Calc BAT values for mapping the display and store them
73 * in disp_BAT. Those values are then used from head.S to map
74 * the display during identify_machine() and MMU_Init()
75 *
76 * The display is mapped to virtual address 0xD0000000, rather
77 * than 1:1, because some some CHRP machines put the frame buffer
Michael Ellermanb5666f72005-12-05 10:24:33 -060078 * in the region starting at 0xC0000000 (PAGE_OFFSET).
Paul Mackerras9b6b5632005-10-06 12:06:20 +100079 * This mapping is temporary and will disappear as soon as the
80 * setup done by MMU_Init() is applied.
81 *
82 * For now, we align the BAT and then map 8Mb on 601 and 16Mb
83 * on other PPCs. This may cause trouble if the framebuffer
84 * is really badly aligned, but I didn't encounter this case
85 * yet.
86 */
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +110087void __init btext_prepare_BAT(void)
Paul Mackerras9b6b5632005-10-06 12:06:20 +100088{
Michael Ellermanb5666f72005-12-05 10:24:33 -060089 unsigned long vaddr = PAGE_OFFSET + 0x10000000;
Paul Mackerras9b6b5632005-10-06 12:06:20 +100090 unsigned long addr;
91 unsigned long lowbits;
92
93 addr = (unsigned long)dispDeviceBase;
94 if (!addr) {
95 boot_text_mapped = 0;
96 return;
97 }
98 if (PVR_VER(mfspr(SPRN_PVR)) != 1) {
99 /* 603, 604, G3, G4, ... */
100 lowbits = addr & ~0xFF000000UL;
101 addr &= 0xFF000000UL;
102 disp_BAT[0] = vaddr | (BL_16M<<2) | 2;
103 disp_BAT[1] = addr | (_PAGE_NO_CACHE | _PAGE_GUARDED | BPP_RW);
104 } else {
105 /* 601 */
106 lowbits = addr & ~0xFF800000UL;
107 addr &= 0xFF800000UL;
108 disp_BAT[0] = vaddr | (_PAGE_NO_CACHE | PP_RWXX) | 4;
109 disp_BAT[1] = addr | BL_8M | 0x40;
110 }
111 logicalDisplayBase = (void *) (vaddr + lowbits);
112}
Paul Mackerras40ef8cb2005-10-10 22:50:37 +1000113#endif
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000114
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100115
116/* This function can be used to enable the early boot text when doing
117 * OF booting or within bootx init. It must be followed by a btext_unmap()
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300118 * call before the logical address becomes unusable
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000119 */
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100120void __init btext_setup_display(int width, int height, int depth, int pitch,
121 unsigned long address)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000122{
123 g_loc_X = 0;
124 g_loc_Y = 0;
125 g_max_loc_X = width / 8;
126 g_max_loc_Y = height / 16;
127 logicalDisplayBase = (unsigned char *)address;
128 dispDeviceBase = (unsigned char *)address;
129 dispDeviceRowBytes = pitch;
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000130 dispDeviceDepth = depth == 15 ? 16 : depth;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000131 dispDeviceRect[0] = dispDeviceRect[1] = 0;
132 dispDeviceRect[2] = width;
133 dispDeviceRect[3] = height;
134 boot_text_mapped = 1;
135}
136
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100137void __init btext_unmap(void)
138{
139 boot_text_mapped = 0;
140}
141
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000142/* Here's a small text engine to use during early boot
143 * or for debugging purposes
144 *
145 * todo:
146 *
147 * - build some kind of vgacon with it to enable early printk
148 * - move to a separate file
149 * - add a few video driver hooks to keep in sync with display
150 * changes.
151 */
152
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +1000153void btext_map(void)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000154{
155 unsigned long base, offset, size;
156 unsigned char *vbase;
157
158 /* By default, we are no longer mapped */
159 boot_text_mapped = 0;
Mathieu Malaterred8731522018-04-13 20:41:43 +0200160 if (!dispDeviceBase)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000161 return;
162 base = ((unsigned long) dispDeviceBase) & 0xFFFFF000UL;
163 offset = ((unsigned long) dispDeviceBase) - base;
164 size = dispDeviceRowBytes * dispDeviceRect[3] + offset
165 + dispDeviceRect[0];
Christophe Leroyaa91796e2018-10-09 13:51:41 +0000166 vbase = ioremap_wc(base, size);
Mathieu Malaterred8731522018-04-13 20:41:43 +0200167 if (!vbase)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000168 return;
169 logicalDisplayBase = vbase + offset;
170 boot_text_mapped = 1;
171}
172
Mathieu Malaterre86e11b62018-03-22 21:19:52 +0100173static int btext_initialize(struct device_node *np)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000174{
175 unsigned int width, height, depth, pitch;
176 unsigned long address = 0;
Jeremy Kerra7f67bd2006-07-12 15:35:54 +1000177 const u32 *prop;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000178
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000179 prop = of_get_property(np, "linux,bootx-width", NULL);
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000180 if (prop == NULL)
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000181 prop = of_get_property(np, "width", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000182 if (prop == NULL)
183 return -EINVAL;
184 width = *prop;
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000185 prop = of_get_property(np, "linux,bootx-height", NULL);
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000186 if (prop == NULL)
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000187 prop = of_get_property(np, "height", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000188 if (prop == NULL)
189 return -EINVAL;
190 height = *prop;
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000191 prop = of_get_property(np, "linux,bootx-depth", NULL);
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000192 if (prop == NULL)
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000193 prop = of_get_property(np, "depth", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000194 if (prop == NULL)
195 return -EINVAL;
196 depth = *prop;
197 pitch = width * ((depth + 7) / 8);
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000198 prop = of_get_property(np, "linux,bootx-linebytes", NULL);
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000199 if (prop == NULL)
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000200 prop = of_get_property(np, "linebytes", NULL);
Benjamin Herrenschmidt441cbd82006-10-26 15:38:10 +1000201 if (prop && *prop != 0xffffffffu)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000202 pitch = *prop;
203 if (pitch == 1)
204 pitch = 0x1000;
Benjamin Herrenschmidtb7a2da12007-11-13 13:46:52 +1100205 prop = of_get_property(np, "linux,bootx-addr", NULL);
206 if (prop == NULL)
207 prop = of_get_property(np, "address", NULL);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000208 if (prop)
209 address = *prop;
210
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100211 /* FIXME: Add support for PCI reg properties. Right now, only
212 * reliable on macs
213 */
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000214 if (address == 0)
215 return -EINVAL;
216
217 g_loc_X = 0;
218 g_loc_Y = 0;
219 g_max_loc_X = width / 8;
220 g_max_loc_Y = height / 16;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000221 dispDeviceBase = (unsigned char *)address;
222 dispDeviceRowBytes = pitch;
Benjamin Herrenschmidtab134462006-07-03 17:19:48 +1000223 dispDeviceDepth = depth == 15 ? 16 : depth;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000224 dispDeviceRect[0] = dispDeviceRect[1] = 0;
225 dispDeviceRect[2] = width;
226 dispDeviceRect[3] = height;
227
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +1000228 btext_map();
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000229
230 return 0;
231}
232
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100233int __init btext_find_display(int allow_nonstdout)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000234{
Rob Herring5b8d6be2018-11-16 16:10:59 -0600235 struct device_node *np = of_stdout;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000236 int rc = -ENODEV;
237
Rob Herring5b8d6be2018-11-16 16:10:59 -0600238 if (!of_node_is_type(np, "display")) {
239 printk("boot stdout isn't a display !\n");
240 np = NULL;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000241 }
242 if (np)
243 rc = btext_initialize(np);
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100244 if (rc == 0 || !allow_nonstdout)
245 return rc;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000246
Cyrill Gorcunov3329c0d2007-11-30 06:45:47 +1100247 for_each_node_by_type(np, "display") {
Stephen Rothwelle2eb6392007-04-03 22:26:41 +1000248 if (of_get_property(np, "linux,opened", NULL)) {
Rob Herringb7c670d2017-08-21 10:16:47 -0500249 printk("trying %pOF ...\n", np);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000250 rc = btext_initialize(np);
251 printk("result: %d\n", rc);
252 }
253 if (rc == 0)
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100254 break;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000255 }
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100256 return rc;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000257}
258
259/* Calc the base address of a given point (x,y) */
260static unsigned char * calc_base(int x, int y)
261{
262 unsigned char *base;
263
264 base = logicalDisplayBase;
Mathieu Malaterred8731522018-04-13 20:41:43 +0200265 if (!base)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000266 base = dispDeviceBase;
267 base += (x + dispDeviceRect[0]) * (dispDeviceDepth >> 3);
268 base += (y + dispDeviceRect[1]) * dispDeviceRowBytes;
269 return base;
270}
271
272/* Adjust the display to a new resolution */
273void btext_update_display(unsigned long phys, int width, int height,
274 int depth, int pitch)
275{
Mathieu Malaterred8731522018-04-13 20:41:43 +0200276 if (!dispDeviceBase)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000277 return;
278
279 /* check it's the same frame buffer (within 256MB) */
280 if ((phys ^ (unsigned long)dispDeviceBase) & 0xf0000000)
281 return;
282
283 dispDeviceBase = (__u8 *) phys;
284 dispDeviceRect[0] = 0;
285 dispDeviceRect[1] = 0;
286 dispDeviceRect[2] = width;
287 dispDeviceRect[3] = height;
288 dispDeviceDepth = depth;
289 dispDeviceRowBytes = pitch;
290 if (boot_text_mapped) {
291 iounmap(logicalDisplayBase);
292 boot_text_mapped = 0;
293 }
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +1000294 btext_map();
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000295 g_loc_X = 0;
296 g_loc_Y = 0;
297 g_max_loc_X = width / 8;
298 g_max_loc_Y = height / 16;
299}
300EXPORT_SYMBOL(btext_update_display);
301
302void btext_clearscreen(void)
303{
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100304 unsigned int *base = (unsigned int *)calc_base(0, 0);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000305 unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100306 (dispDeviceDepth >> 3)) >> 2;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000307 int i,j;
308
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +1000309 rmci_maybe_on();
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000310 for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1]); i++)
311 {
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100312 unsigned int *ptr = base;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000313 for(j=width; j; --j)
314 *(ptr++) = 0;
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100315 base += (dispDeviceRowBytes >> 2);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000316 }
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +1000317 rmci_maybe_off();
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000318}
319
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100320void btext_flushscreen(void)
321{
322 unsigned int *base = (unsigned int *)calc_base(0, 0);
323 unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
324 (dispDeviceDepth >> 3)) >> 2;
325 int i,j;
326
327 for (i=0; i < (dispDeviceRect[3] - dispDeviceRect[1]); i++)
328 {
329 unsigned int *ptr = base;
330 for(j = width; j > 0; j -= 8) {
331 __asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
332 ptr += 8;
333 }
334 base += (dispDeviceRowBytes >> 2);
335 }
336 __asm__ __volatile__ ("sync" ::: "memory");
337}
338
339void btext_flushline(void)
340{
341 unsigned int *base = (unsigned int *)calc_base(0, g_loc_Y << 4);
342 unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
343 (dispDeviceDepth >> 3)) >> 2;
344 int i,j;
345
346 for (i=0; i < 16; i++)
347 {
348 unsigned int *ptr = base;
349 for(j = width; j > 0; j -= 8) {
350 __asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
351 ptr += 8;
352 }
353 base += (dispDeviceRowBytes >> 2);
354 }
355 __asm__ __volatile__ ("sync" ::: "memory");
356}
357
358
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000359#ifndef NO_SCROLL
360static void scrollscreen(void)
361{
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100362 unsigned int *src = (unsigned int *)calc_base(0,16);
363 unsigned int *dst = (unsigned int *)calc_base(0,0);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000364 unsigned long width = ((dispDeviceRect[2] - dispDeviceRect[0]) *
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100365 (dispDeviceDepth >> 3)) >> 2;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000366 int i,j;
367
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +1000368 rmci_maybe_on();
369
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000370 for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1] - 16); i++)
371 {
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100372 unsigned int *src_ptr = src;
373 unsigned int *dst_ptr = dst;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000374 for(j=width; j; --j)
375 *(dst_ptr++) = *(src_ptr++);
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100376 src += (dispDeviceRowBytes >> 2);
377 dst += (dispDeviceRowBytes >> 2);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000378 }
379 for (i=0; i<16; i++)
380 {
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100381 unsigned int *dst_ptr = dst;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000382 for(j=width; j; --j)
383 *(dst_ptr++) = 0;
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100384 dst += (dispDeviceRowBytes >> 2);
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000385 }
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +1000386
387 rmci_maybe_off();
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000388}
389#endif /* ndef NO_SCROLL */
390
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +1000391static unsigned int expand_bits_8[16] = {
392 0x00000000,
393 0x000000ff,
394 0x0000ff00,
395 0x0000ffff,
396 0x00ff0000,
397 0x00ff00ff,
398 0x00ffff00,
399 0x00ffffff,
400 0xff000000,
401 0xff0000ff,
402 0xff00ff00,
403 0xff00ffff,
404 0xffff0000,
405 0xffff00ff,
406 0xffffff00,
407 0xffffffff
408};
409
410static unsigned int expand_bits_16[4] = {
411 0x00000000,
412 0x0000ffff,
413 0xffff0000,
414 0xffffffff
415};
416
417
418static void draw_byte_32(unsigned char *font, unsigned int *base, int rb)
419{
420 int l, bits;
421 int fg = 0xFFFFFFFFUL;
422 int bg = 0x00000000UL;
423
424 for (l = 0; l < 16; ++l)
425 {
426 bits = *font++;
427 base[0] = (-(bits >> 7) & fg) ^ bg;
428 base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
429 base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
430 base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
431 base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
432 base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
433 base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
434 base[7] = (-(bits & 1) & fg) ^ bg;
435 base = (unsigned int *) ((char *)base + rb);
436 }
437}
438
439static inline void draw_byte_16(unsigned char *font, unsigned int *base, int rb)
440{
441 int l, bits;
442 int fg = 0xFFFFFFFFUL;
443 int bg = 0x00000000UL;
444 unsigned int *eb = (int *)expand_bits_16;
445
446 for (l = 0; l < 16; ++l)
447 {
448 bits = *font++;
449 base[0] = (eb[bits >> 6] & fg) ^ bg;
450 base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
451 base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
452 base[3] = (eb[bits & 3] & fg) ^ bg;
453 base = (unsigned int *) ((char *)base + rb);
454 }
455}
456
457static inline void draw_byte_8(unsigned char *font, unsigned int *base, int rb)
458{
459 int l, bits;
460 int fg = 0x0F0F0F0FUL;
461 int bg = 0x00000000UL;
462 unsigned int *eb = (int *)expand_bits_8;
463
464 for (l = 0; l < 16; ++l)
465 {
466 bits = *font++;
467 base[0] = (eb[bits >> 4] & fg) ^ bg;
468 base[1] = (eb[bits & 0xf] & fg) ^ bg;
469 base = (unsigned int *) ((char *)base + rb);
470 }
471}
472
473static noinline void draw_byte(unsigned char c, long locX, long locY)
474{
475 unsigned char *base = calc_base(locX << 3, locY << 4);
476 unsigned char *font = &vga_font[((unsigned int)c) * 16];
477 int rb = dispDeviceRowBytes;
478
479 rmci_maybe_on();
480 switch(dispDeviceDepth) {
481 case 24:
482 case 32:
483 draw_byte_32(font, (unsigned int *)base, rb);
484 break;
485 case 15:
486 case 16:
487 draw_byte_16(font, (unsigned int *)base, rb);
488 break;
489 case 8:
490 draw_byte_8(font, (unsigned int *)base, rb);
491 break;
492 }
493 rmci_maybe_off();
494}
495
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000496void btext_drawchar(char c)
497{
498 int cline = 0;
499#ifdef NO_SCROLL
500 int x;
501#endif
502 if (!boot_text_mapped)
503 return;
504
505 switch (c) {
506 case '\b':
507 if (g_loc_X > 0)
508 --g_loc_X;
509 break;
510 case '\t':
511 g_loc_X = (g_loc_X & -8) + 8;
512 break;
513 case '\r':
514 g_loc_X = 0;
515 break;
516 case '\n':
517 g_loc_X = 0;
518 g_loc_Y++;
519 cline = 1;
520 break;
521 default:
522 draw_byte(c, g_loc_X++, g_loc_Y);
523 }
524 if (g_loc_X >= g_max_loc_X) {
525 g_loc_X = 0;
526 g_loc_Y++;
527 cline = 1;
528 }
529#ifndef NO_SCROLL
530 while (g_loc_Y >= g_max_loc_Y) {
531 scrollscreen();
532 g_loc_Y--;
533 }
534#else
535 /* wrap around from bottom to top of screen so we don't
536 waste time scrolling each line. -- paulus. */
537 if (g_loc_Y >= g_max_loc_Y)
538 g_loc_Y = 0;
539 if (cline) {
540 for (x = 0; x < g_max_loc_X; ++x)
541 draw_byte(' ', x, g_loc_Y);
542 }
543#endif
544}
545
546void btext_drawstring(const char *c)
547{
548 if (!boot_text_mapped)
549 return;
550 while (*c)
551 btext_drawchar(*c++);
552}
553
Benjamin Herrenschmidt51d30822005-11-23 17:57:25 +1100554void btext_drawtext(const char *c, unsigned int len)
555{
556 if (!boot_text_mapped)
557 return;
558 while (len--)
559 btext_drawchar(*c++);
560}
561
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000562void btext_drawhex(unsigned long v)
563{
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000564 if (!boot_text_mapped)
565 return;
566#ifdef CONFIG_PPC64
Harvey Harrison542ad5d2008-07-31 05:29:03 +1000567 btext_drawchar(hex_asc_hi(v >> 56));
568 btext_drawchar(hex_asc_lo(v >> 56));
569 btext_drawchar(hex_asc_hi(v >> 48));
570 btext_drawchar(hex_asc_lo(v >> 48));
571 btext_drawchar(hex_asc_hi(v >> 40));
572 btext_drawchar(hex_asc_lo(v >> 40));
573 btext_drawchar(hex_asc_hi(v >> 32));
574 btext_drawchar(hex_asc_lo(v >> 32));
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000575#endif
Harvey Harrison542ad5d2008-07-31 05:29:03 +1000576 btext_drawchar(hex_asc_hi(v >> 24));
577 btext_drawchar(hex_asc_lo(v >> 24));
578 btext_drawchar(hex_asc_hi(v >> 16));
579 btext_drawchar(hex_asc_lo(v >> 16));
580 btext_drawchar(hex_asc_hi(v >> 8));
581 btext_drawchar(hex_asc_lo(v >> 8));
582 btext_drawchar(hex_asc_hi(v));
583 btext_drawchar(hex_asc_lo(v));
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000584 btext_drawchar(' ');
585}
586
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +1000587void __init udbg_init_btext(void)
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000588{
Benjamin Herrenschmidt7191b612013-07-25 12:12:32 +1000589 /* If btext is enabled, we might have a BAT setup for early display,
590 * thus we do enable some very basic udbg output
591 */
592 udbg_putc = btext_drawchar;
Paul Mackerras9b6b5632005-10-06 12:06:20 +1000593}
594
595static unsigned char vga_font[cmapsz] = {
5960x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5970x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
5980x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff,
5990xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
6000x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10,
6010x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
6020x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
6030x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
6040x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c,
6050x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
6060x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
6070xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
6080x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,
6090x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
6100xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e,
6110x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
6120x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
6130x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
6140x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63,
6150x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
6160x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18,
6170x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
6180xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e,
6190x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
6200x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00,
6210x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
6220x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb,
6230xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
6240x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6,
6250x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6260xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
6270x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
6280x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
6290x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
6300x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6310x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6320x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00,
6330x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
6340xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6350x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6360x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00,
6370x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
6380x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6390x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6400x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
6410x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
6420x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c,
6430x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
6440x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c,
6450x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
6460x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
6470x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
6480x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6490x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
6500x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
6510x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
6520x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00,
6530x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
6540x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6550x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
6560x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
6570x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6580x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6590x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
6600x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c,
6610x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
6620x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
6630x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
6640x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c,
6650x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
6660x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
6670xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
6680x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
6690x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
6700x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
6710xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
6720x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78,
6730x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
6740x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6750x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
6760x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06,
6770x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
6780x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
6790x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
6800x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
6810x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde,
6820xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
6830x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
6840x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc,
6850x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
6860xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c,
6870x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
6880x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe,
6890x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
6900x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
6910xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
6920x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
6930x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
6940x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
6950x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
6960x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6,
6970x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
6980x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xe7,
6990xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
7000x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6,
7010x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
7020xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66,
7030x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
7040x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c,
7050x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
7060x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
7070xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7080x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7090x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
7100xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
7110xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
7120x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66,
7130x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18,
7140x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
7150xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
7160x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff,
7170x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
7180x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
7190xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
7200x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c,
7210x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
7220x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7230x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
7240x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7250x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
7260xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60,
7270x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
7280x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
7290x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
7300xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7310x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7320x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0,
7330x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
7340xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60,
7350x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
7360x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7370x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
7380x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60,
7390x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
7400x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7410x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb,
7420xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7430x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
7440x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
7450x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
7460x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
7470x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
7480x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0,
7490x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
7500x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
7510x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
7520x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
7530x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3,
7540xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7550x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00,
7560x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3,
7570x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
7580xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
7590x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
7600x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e,
7610x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
7620x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
7630x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
7640x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7650x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
7660xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
7670xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,
7680x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
7690x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
7700xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
7710x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
7720x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
7730x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
7740xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38,
7750x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
7760x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06,
7770x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
7780xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
7790x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7800x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c,
7810x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
7820x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
7830x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
7840x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
7850x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
7860xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00,
7870x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
7880x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe,
7890x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b,
7900x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c,
7910xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
7920x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
7930x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
7940xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
7950x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
7960x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
7970x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
7980xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
7990x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
8000x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
8010x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
8020xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
8030xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
8040x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc,
8050x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18,
8060xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66,
8070x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00,
8080x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18,
8090xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
8100xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
8110x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
8120x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
8130x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
8140xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
8150x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
8160x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
8170x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00,
8180x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
8190x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8200x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c,
8210x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
8220xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8230x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
8240x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06,
8250x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30,
8260x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
8270x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
8280x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
8290x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
8300x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
8310x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
8320x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
8330x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
8340xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18,
8350x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8360x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
8370x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
8380x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
8390x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8400x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36,
8410x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8,
8420x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
8430x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8440x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8450x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
8460x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8470x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8480x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00,
8490x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
8500x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8510x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8520x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
8530x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
8540x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8550x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8560x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
8570x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
8580x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
8590x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8600x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
8610x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
8620x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8630x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8640x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
8650x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
8660x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8670x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8680x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
8690x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
8700x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
8710x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8720x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
8730x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
8740x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8750x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8760x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36,
8770x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
8780x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
8790x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8800x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
8810x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
8820x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8830x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
8840x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18,
8850x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
8860x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8870x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
8880xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
8890xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
8900xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0,
8910xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
8920x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
8930x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
8940x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8950x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
8960x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc,
8970x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
8980xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8990xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
9000x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe,
9010x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8,
9020xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9030x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
9040x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
9050x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66,
9060x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
9070x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
9080x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee,
9090x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66,
9100x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9110x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9120x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0,
9130x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60,
9140x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
9150xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
9160x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00,
9170x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
9180x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
9190x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
9200x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e,
9210x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18,
9220x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
9230x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
9240x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00,
9250x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
9260x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
9270x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9280x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
9290x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9300x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c,
9310x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
9320x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00,
9330x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00,
9340x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9350x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
9360x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9370x00, 0x00, 0x00, 0x00,
938};
David Gibson719c91c2007-02-13 15:54:22 +1100939