This source file includes following definitions.
- __set_origin
- hide_cursor
- cursor_reverse
- set_cursor
- render_screen
- con_type_init
- get_scrmem
- set_scrmem
- set_get_font
- con_adjust_height
- set_get_cmap
- sun_clear_screen
- vesa_blank
- vesa_unblank
- set_vesa_blanking
- vesa_powerdown
- fb_open
- fb_ioctl
- fb_close
- fb_mmap
- set_palette
- console_restore_palette
- srmmu_get_pte
- get_phys
- cg6_restore_palette
- cg6_mmap
- cg6_loadcmap
- cg6_setcursor
- cg6_scursor
- cg6_ioctl
- cg6_setup
- cg3_loadcmap
- cg3_mmap
- cg3_setup
- bwtwo_mmap
- bwtwo_blank
- bwtwo_unblank
- bwtwo_setup
- cg14_setup
- known_card
- cg14_present
- sparc_console_probe
- sun_console_init
- sun_blitc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 #define GRAPHDEV_MAJOR 29
46
47 #define FRAME_BUFFERS 1
48
49 #include <linux/sched.h>
50 #include <linux/timer.h>
51 #include <linux/interrupt.h>
52 #include <linux/tty.h>
53 #include <linux/tty_flip.h>
54 #include <linux/kernel.h>
55 #include <linux/string.h>
56 #include <linux/errno.h>
57 #include <linux/kd.h>
58 #include <linux/malloc.h>
59 #include <linux/major.h>
60 #include <linux/mm.h>
61 #include <linux/types.h>
62
63 #include <asm/system.h>
64 #include <asm/segment.h>
65 #include <asm/page.h>
66 #include <asm/pgtable.h>
67 #include <asm/bitops.h>
68 #include <asm/oplib.h>
69 #include <asm/sbus.h>
70 #include <asm/fbio.h>
71 #include <asm/io.h>
72 #include <asm/pgtsun4c.h>
73
74 #include "../../char/kbd_kern.h"
75 #include "../../char/vt_kern.h"
76 #include "../../char/consolemap.h"
77 #include "../../char/selection.h"
78 #include "../../char/console_struct.h"
79
80 #define cmapsz 8192
81
82 extern void register_console(void (*proc)(const char *));
83 extern void console_print(const char *);
84 extern unsigned char vga_font[];
85 extern int graphics_on;
86 extern int serial_console;
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 static char con_name[40];
102
103
104 static int con_depth, con_width, con_height, con_type;
105
106 static int con_linebytes;
107
108
109 static unsigned char *con_fb_base;
110
111
112 static int chars_per_line;
113 static int ints_per_line;
114 static int skip_bytes;
115 static int x_margin, y_margin;
116 static int bytes_per_row;
117
118
119
120
121 static void (*restore_palette)(void);
122 void set_palette (void);
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143 #define SCREEN_WIDTH 1152
144 #define SCREEN_HEIGHT 900
145 #define CHARS_PER_LINE 144
146 #define NICE_Y_MARGIN 18
147 #define NICE_X_MARGIN 8
148 #define FBUF_TOP_SKIP 2592
149 #define CHAR_HEIGHT 16
150 #define ONE_ROW 2304
151
152
153
154
155 #define FBUF_OFFSET(cindex) \
156 (((FBUF_TOP_SKIP) + (((cindex)>>7) * ONE_ROW)) + \
157 ((NICE_X_MARGIN) + (((cindex)&127))))
158
159
160 #define COLOR_FBUF_OFFSET(cindex) \
161 (((skip_bytes) + (((cindex)>>7) * bytes_per_row)) + \
162 ((x_margin) + (((cindex)&127) << 3)))
163
164 void
165 __set_origin(unsigned short offset)
166 {
167
168
169
170 }
171
172
173
174
175
176
177 static int cursor_pos = -1;
178 void
179 hide_cursor(void)
180 {
181 unsigned long flags;
182 int j;
183
184 save_flags(flags); cli();
185
186 if(cursor_pos == -1) {
187 restore_flags (flags);
188 return;
189 }
190
191
192
193
194 switch (con_depth){
195 case 1: {
196 unsigned char *dst;
197 dst = (unsigned char *)((unsigned long)con_fb_base +
198 FBUF_OFFSET(cursor_pos));
199 for(j = 0; j < CHAR_HEIGHT; j++, dst += CHARS_PER_LINE)
200 *dst = ~(0);
201 break;
202 }
203 case 8: {
204 unsigned long *dst;
205 const int ipl = ints_per_line;
206
207 dst = (unsigned long *)((unsigned long)con_fb_base + COLOR_FBUF_OFFSET(cursor_pos));
208 for(j = 0; j < CHAR_HEIGHT; j++, dst += ipl) {
209 *dst = ~(0UL);
210 *(dst + 1) = ~(0UL);
211 }
212 break;
213 }
214 default:
215 break;
216 }
217 restore_flags(flags);
218 }
219
220
221
222
223
224
225
226 inline static void
227 cursor_reverse (long *dst, int height, const int ints_on_line)
228 {
229 int j;
230
231 for (j = 0; j < height; j++){
232 *dst = ~(*dst) & 0x0f0f0f0f;
233 *(dst+1) = ~(*(dst+1)) & 0x0f0f0f0f;
234 dst += ints_on_line;
235 }
236 }
237
238 void
239 set_cursor(int currcons)
240 {
241 int j, idx, oldpos;
242 unsigned long flags;
243
244 if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS)
245 return;
246
247 if (__real_origin != __origin)
248 __set_origin(__real_origin);
249
250 save_flags(flags); cli();
251
252 idx = (pos - video_mem_base) >> 1;
253 oldpos = cursor_pos;
254 cursor_pos = idx;
255 if (!deccm) {
256 hide_cursor ();
257 restore_flags (flags);
258 return;
259 }
260 switch (con_depth){
261 case 1: {
262 unsigned char *dst, *opos;
263
264 dst = (unsigned char *)((unsigned long)con_fb_base + FBUF_OFFSET(idx));
265 opos = (unsigned char *)((unsigned long)con_fb_base + FBUF_OFFSET(oldpos));
266 if(oldpos != -1) {
267
268 for(j=0; j < CHAR_HEIGHT; j++, opos += CHARS_PER_LINE) {
269 *opos = ~*opos;
270 }
271 }
272 for(j=0; j < 16; j++, dst+=CHARS_PER_LINE) {
273 *dst = ~*dst;
274 }
275 break;
276 }
277 case 8: {
278 unsigned long *dst, *opos;
279 dst = (unsigned long *)((unsigned long)con_fb_base + COLOR_FBUF_OFFSET(idx));
280 opos = (unsigned long *)((unsigned long)con_fb_base + COLOR_FBUF_OFFSET(oldpos));
281
282 if(oldpos != -1)
283 cursor_reverse(opos, CHAR_HEIGHT, ints_per_line);
284 cursor_reverse (dst, CHAR_HEIGHT, ints_per_line);
285 break;
286 }
287 default:
288 }
289 restore_flags(flags);
290 }
291
292
293
294
295
296 static void
297 render_screen(void)
298 {
299 int count;
300 unsigned short *contents;
301
302 count = video_num_columns * video_num_lines;
303 contents = (unsigned short *) video_mem_base;
304
305 for (;count--; contents++)
306 sun_blitc (*contents, (unsigned long) contents);
307 }
308
309 unsigned long
310 con_type_init(unsigned long kmem_start, const char **display_desc)
311 {
312 can_do_color = (con_type != FBTYPE_SUN2BW);
313
314 video_type = VIDEO_TYPE_SUN;
315 *display_desc = "SUN";
316
317 if (!serial_console) {
318
319 prom_putchar('\033'); prom_putchar('['); prom_putchar('H');
320
321
322
323
324 video_mem_base = kmem_start;
325 kmem_start += video_screen_size;
326 video_mem_term = kmem_start;
327
328 render_screen();
329 }
330 return kmem_start;
331 }
332
333
334
335
336
337 void
338 get_scrmem(int currcons)
339 {
340 memcpyw((unsigned short *)vc_scrbuf[currcons],
341 (unsigned short *)origin, video_screen_size);
342 origin = video_mem_start = (unsigned long)vc_scrbuf[currcons];
343 scr_end = video_mem_end = video_mem_start + video_screen_size;
344 pos = origin + y*video_size_row + (x<<1);
345 }
346
347 void
348 set_scrmem(int currcons, long offset)
349 {
350 if (video_mem_term - video_mem_base < offset + video_screen_size)
351 offset = 0;
352 memcpyw((unsigned short *)(video_mem_base + offset),
353 (unsigned short *) origin, video_screen_size);
354 video_mem_start = video_mem_base;
355 video_mem_end = video_mem_term;
356 origin = video_mem_base + offset;
357 scr_end = origin + video_screen_size;
358 pos = origin + y*video_size_row + (x<<1);
359 }
360
361
362
363
364 int
365 set_get_font(char * arg, int set, int ch512)
366 {
367 int error, i, line;
368
369 if (!arg)
370 return -EINVAL;
371 error = verify_area (set ? VERIFY_READ : VERIFY_WRITE, (void *) arg,
372 ch512 ? 2* cmapsz : cmapsz);
373 if (error)
374 return error;
375
376
377 if (!set){
378 memset (arg, 0, cmapsz);
379 for (i = 0; i < 256; i++)
380 for (line = 0; line < CHAR_HEIGHT; line++)
381 put_user (vga_font [i], arg+(i*32+line));
382 return 0;
383 }
384
385
386 for (i = 0; i < 256; i++)
387 for (line = 0; line < CHAR_HEIGHT; line++){
388 vga_font [i*CHAR_HEIGHT + line] = (get_user (arg + (i * 32 + line)));
389 if (con_depth == 1)
390 vga_font [i*CHAR_HEIGHT + line] = vga_font [i*CHAR_HEIGHT + line];
391 }
392 return 0;
393 }
394
395
396
397
398
399
400
401
402
403 int
404 con_adjust_height(unsigned long fontheight)
405 {
406 return -EINVAL;
407 }
408
409 int
410 set_get_cmap(unsigned char * arg, int set)
411 {
412 int i;
413
414 i = verify_area(set ? VERIFY_READ : VERIFY_WRITE, (void *)arg, 16*3);
415 if (i)
416 return i;
417
418 for (i=0; i<16; i++) {
419 if (set) {
420 default_red[i] = get_user(arg++) ;
421 default_grn[i] = get_user(arg++) ;
422 default_blu[i] = get_user(arg++) ;
423 } else {
424 put_user (default_red[i], arg++) ;
425 put_user (default_grn[i], arg++) ;
426 put_user (default_blu[i], arg++) ;
427 }
428 }
429 if (set) {
430 for (i=0; i<MAX_NR_CONSOLES; i++)
431 if (vc_cons_allocated(i)) {
432 int j, k ;
433 for (j=k=0; j<16; j++) {
434 vc_cons[i].d->vc_palette[k++] = default_red[j];
435 vc_cons[i].d->vc_palette[k++] = default_grn[j];
436 vc_cons[i].d->vc_palette[k++] = default_blu[j];
437 }
438 }
439 set_palette();
440 }
441
442 return 0;
443 }
444
445
446 void
447 sun_clear_screen(void)
448 {
449 memset (con_fb_base, (con_depth == 1 ? ~(0) : (0)),
450 (con_depth * con_height * con_width) / 8);
451
452 memset((char *)video_mem_base, 0, (video_mem_term - video_mem_base));
453 }
454
455
456
457
458
459 void vesa_blank(void)
460 {
461 }
462 void vesa_unblank(void)
463 {
464 }
465 void set_vesa_blanking(const unsigned long arg)
466 {
467 }
468
469 void vesa_powerdown(void)
470 {
471 }
472
473 #undef color
474
475 struct cg6_cursor {
476 short enable;
477 struct fbcurpos cpos;
478 struct fbcurpos chot;
479 struct fbcurpos size;
480 int bits[2][32];
481 char color [6];
482 };
483
484 struct cg6_info {
485 struct bt_regs *bt;
486 void *fbc;
487 struct cg6_fhc *fhc;
488 struct cg6_tec *tec;
489 struct cg6_thc *thc;
490 struct cg6_cursor cursor;
491 void *dhc;
492 };
493
494 struct bwtwo_info {
495 struct bwtwo_regs *regs;
496 };
497
498 struct cg3_info {
499 struct bt_regs *bt;
500 };
501
502
503 typedef struct {
504 union {
505 struct bwtwo_info bwtwo;
506 struct cg3_info cg3;
507 struct cg6_info cg6;
508 } info;
509 int space;
510 int blanked;
511 int open;
512 int mmaped;
513 int vtconsole;
514 long base;
515 struct fbtype type;
516 int (*mmap)(struct inode *, struct file *, struct vm_area_struct *, long fb_base, void *);
517 void (*loadcmap)(void *this, int index, int count);
518 void (*blank)(void *this);
519 void (*unblank)(void *this);
520 int (*ioctl)(struct inode *, struct file *, unsigned int, unsigned long, void *);
521 } fbinfo_t;
522
523 static fbinfo_t fbinfo [FRAME_BUFFERS];
524
525
526 static union {
527 unsigned char map[256][3];
528 unsigned int raw[256*3/4];
529 } color_map;
530
531 #define FB_MMAP_VM_FLAGS (VM_SHM| VM_LOCKED)
532
533 static int
534 fb_open (struct inode * inode, struct file * file)
535 {
536 int minor = MINOR (inode->i_rdev);
537
538 if (minor >= FRAME_BUFFERS)
539 return -EBADF;
540 if (fbinfo [minor].open)
541 return -EBUSY;
542 fbinfo [minor].open = 1;
543 fbinfo [minor].mmaped = 0;
544 return 0;
545 }
546
547 static int
548 fb_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
549 {
550 int minor = MINOR (inode->i_rdev);
551 fbinfo_t *fb;
552 struct fbcmap *cmap;
553 int i;
554
555 if (minor >= FRAME_BUFFERS)
556 return -EBADF;
557 fb = &fbinfo [minor];
558
559 switch (cmd){
560 case FBIOGTYPE:
561 i = verify_area (VERIFY_WRITE, (void *) arg, sizeof (struct fbtype));
562 if (i) return i;
563 *(struct fbtype *)arg = (fb->type);
564 break;
565 case FBIOGATTR:{
566 struct fbgattr *fba = (struct fbgattr *) arg;
567
568 i = verify_area (VERIFY_WRITE, (void *) arg, sizeof (struct fbgattr));
569 if (i) return i;
570 fba->real_type = fb->type.fb_type;
571 fba->owner = 0;
572 fba->fbtype = fb->type;
573 fba->sattr.flags = 0;
574 fba->sattr.emu_type = fb->type.fb_type;
575 fba->sattr.dev_specific [0] = -1;
576 fba->emu_types [0] = fb->type.fb_type;
577 fba->emu_types [1] = -1;
578 break;
579 }
580 case FBIOSVIDEO:
581 i = verify_area(VERIFY_READ, (void *)arg, sizeof(int));
582 if (i) return i;
583
584 if (*(int *)arg){
585 if (!fb->blanked || !fb->unblank)
586 break;
587 (*fb->unblank)(fb);
588 fb->blanked = 0;
589 } else {
590 if (fb->blanked || !fb->blank)
591 break;
592 (*fb->blank)(fb);
593 fb->blanked = 1;
594 }
595 break;
596 case FBIOGVIDEO:
597 i = verify_area (VERIFY_WRITE, (void *) arg, sizeof (int));
598 if (i) return i;
599 *(int *) arg = fb->blanked;
600 break;
601 case FBIOPUTCMAP: {
602 char *rp, *gp, *bp;
603 int end, count;;
604
605 if (!fb->loadcmap)
606 return -EINVAL;
607 i = verify_area (VERIFY_READ, (void *) arg, sizeof (struct fbcmap));
608 if (i) return i;
609 cmap = (struct fbcmap *) arg;
610 count = cmap->count;
611 if ((cmap->index < 0) || (cmap->index > 255))
612 return -EINVAL;
613 if (cmap->index + count > 256)
614 count = 256 - cmap->index;
615 i = verify_area (VERIFY_READ, rp = cmap->red, cmap->count);
616 if (i) return i;
617 i = verify_area (VERIFY_READ, gp = cmap->green, cmap->count);
618 if (i) return i;
619 i = verify_area (VERIFY_READ, bp = cmap->blue, cmap->count);
620 if (i) return i;
621
622 end = cmap->index + count;
623 for (i = cmap->index; i < end; i++){
624 color_map.map [i][0] = *rp++;
625 color_map.map [i][1] = *gp++;
626 color_map.map [i][2] = *bp++;
627 }
628 (*fb->loadcmap)(fb, cmap->index, count);
629 break;
630 }
631
632 default:
633 if (fb->ioctl){
634 i = fb->ioctl (inode, file, cmd, arg, fb);
635 if (i == -EINVAL)
636 printk ("[[FBIO: %8.8x]]\n", cmd);
637 return i;
638 }
639 printk ("[[FBIO: %8.8x]]\n", cmd);
640 return -EINVAL;
641 }
642 return 0;
643 }
644
645 static void
646 fb_close (struct inode * inode, struct file *filp)
647 {
648 int minor = MINOR(inode->i_rdev);
649 struct fbcursor cursor;
650
651 if (minor >= FRAME_BUFFERS)
652 return;
653 if (fbinfo [minor].open)
654 fbinfo [minor].open = 0;
655 vt_cons [fbinfo [minor].vtconsole]->vc_mode = KD_TEXT;
656
657
658 graphics_on = 0;
659 if (fbinfo [minor].mmaped)
660 sun_clear_screen ();
661 cursor.set = FB_CUR_SETCUR;
662 cursor.enable = 0;
663 fb_ioctl (inode, filp, FBIOSCURPOS, (unsigned long) &cursor);
664 set_palette ();
665 render_screen ();
666 return;
667 }
668
669 static int
670 fb_mmap (struct inode *inode, struct file *file, struct vm_area_struct *vma)
671 {
672 int minor = MINOR (inode->i_rdev);
673 fbinfo_t *fb;
674
675 if (minor >= FRAME_BUFFERS)
676 return -ENXIO;
677
678
679
680 if (vt_cons [fg_console]->vc_mode == KD_GRAPHICS)
681 return -ENXIO;
682 fbinfo [minor].vtconsole = fg_console;
683 fb = &fbinfo [minor];
684
685 if (fb->mmap){
686 int v;
687
688 v = (*fb->mmap)(inode, file, vma, fb->base, fb);
689 if (v) return v;
690 fbinfo [minor].mmaped = 1;
691 vt_cons [fg_console]->vc_mode = KD_GRAPHICS;
692 graphics_on = 1;
693 return 0;
694 } else
695 return -ENXIO;
696 }
697
698 static struct file_operations graphdev_fops =
699 {
700 NULL,
701 NULL,
702 NULL,
703 NULL,
704 NULL,
705 fb_ioctl,
706 fb_mmap,
707 fb_open,
708 fb_close,
709 };
710
711
712 void
713 set_palette (void)
714 {
715 if (console_blanked || vt_cons [fg_console]->vc_mode == KD_GRAPHICS)
716 return;
717
718 if (fbinfo [0].loadcmap){
719 int i, j;
720
721
722 for (i = 0; i < 16; i++){
723 j = color_table [i];
724 color_map.map [i][0] = default_red [j];
725 color_map.map [i][1] = default_grn [j];
726 color_map.map [i][2] = default_blu [j];
727 }
728 (*fbinfo [0].loadcmap)(&fbinfo [0], 0, 16);
729 }
730 }
731
732
733 void
734 console_restore_palette (void)
735 {
736 if (restore_palette)
737 (*restore_palette) ();
738 }
739
740
741 static __inline__ unsigned int
742 srmmu_get_pte (unsigned long addr)
743 {
744 register unsigned long entry;
745
746 __asm__ __volatile__("\n\tlda [%1] %2,%0\n\t" :
747 "=r" (entry):
748 "r" ((addr & 0xfffff000) | 0x400), "i" (ASI_M_FLUSH_PROBE));
749 return entry;
750 }
751
752 unsigned int
753 get_phys (unsigned int addr)
754 {
755 switch (sparc_cpu_model){
756 case sun4c:
757 return sun4c_get_pte (addr) << PAGE_SHIFT;
758 case sun4m:
759 return ((srmmu_get_pte (addr) & 0xffffff00) << 4);
760 default:
761 panic ("get_phys called for unsupported cpu model\n");
762 return 0;
763 }
764 }
765
766
767
768
769
770
771
772
773
774
775 #define CG6_ROM_OFFSET 0x0
776 #define CG6_BROOKTREE_OFFSET 0x200000
777 #define CG6_DHC_OFFSET 0x240000
778 #define CG6_ALT_OFFSET 0x280000
779 #define CG6_FHC_OFFSET 0x300000
780 #define CG6_THC_OFFSET 0x301000
781 #define CG6_FBC_OFFSET 0x700000
782 #define CG6_TEC_OFFSET 0x701000
783 #define CG6_RAM_OFFSET 0x800000
784
785 struct bt_regs {
786 unsigned int addr;
787 unsigned int color_map;
788 unsigned int control;
789 unsigned int cursor;
790 };
791
792
793 struct cg6_tec {
794 int tec_matrix;
795 int tec_clip;
796 int tec_vdc;
797 };
798
799 struct cg6_thc {
800 unsigned int thc_xxx0[512];
801 unsigned int thc_hsync1;
802 unsigned int thc_hsync2;
803 unsigned int thc_hsync3;
804 unsigned int thc_vsync1;
805 unsigned int thc_vsync2;
806 unsigned int thc_refresh;
807 unsigned int thc_misc;
808 unsigned int thc_xxx1[56];
809 unsigned int thc_cursxy;
810 unsigned int thc_cursmask[32];
811 unsigned int thc_cursbits[32];
812 };
813
814 static void
815 cg6_restore_palette (void)
816 {
817 volatile struct bt_regs *bt;
818
819 bt = fbinfo [0].info.cg6.bt;
820 bt->addr = 0;
821 bt->color_map = 0xffffffff;
822 bt->color_map = 0xffffffff;
823 bt->color_map = 0xffffffff;
824 }
825
826
827
828 static int
829 cg6_mmap (struct inode *inode, struct file *file, struct vm_area_struct *vma, long base, void *xx)
830 {
831 unsigned int size, page, r, map_size;
832 unsigned int map_offset = 0;
833 fbinfo_t *fb = (fbinfo_t *) xx;
834
835 size = vma->vm_end - vma->vm_start;
836 if (vma->vm_offset & ~PAGE_MASK)
837 return -ENXIO;
838
839
840 vma->vm_flags |= FB_MMAP_VM_FLAGS;
841
842
843 for (page = 0; page < size; ){
844 switch (vma->vm_offset+page){
845 case CG6_TEC:
846 map_size = PAGE_SIZE;
847 map_offset = get_phys ((uint)fb->info.cg6.tec);
848 break;
849 case CG6_FBC:
850 map_size = PAGE_SIZE;
851 map_offset = get_phys ((uint)fb->info.cg6.fbc);
852 break;
853 case CG6_FHC:
854 map_size = PAGE_SIZE;
855 map_offset = get_phys ((uint)fb->info.cg6.fhc);
856 break;
857 case CG6_THC:
858 map_size = PAGE_SIZE;
859 map_offset = get_phys ((uint)fb->info.cg6.thc);
860 break;
861 case CG6_BTREGS:
862 map_size = PAGE_SIZE;
863 map_offset = get_phys ((uint)fb->info.cg6.bt);
864 break;
865
866 case CG6_DHC:
867 map_size = PAGE_SIZE * 40;
868 map_offset = get_phys ((uint)fb->info.cg6.dhc);
869 break;
870
871 case CG6_ROM:
872 map_size = 0;
873 break;
874
875 case CG6_RAM:
876 map_size = size-page;
877 map_offset = get_phys ((uint) con_fb_base);
878 if (map_size < fb->type.fb_size)
879 map_size = fb->type.fb_size;
880 break;
881 default:
882 map_size = 0;
883 break;
884 }
885 if (!map_size){
886 page += PAGE_SIZE;
887 continue;
888 }
889 r = io_remap_page_range (vma->vm_start+page,
890 map_offset,
891 map_size, vma->vm_page_prot,
892 fb->space);
893 if (r) return -EAGAIN;
894 page += map_size;
895 }
896 vma->vm_inode = inode;
897 inode->i_count++;
898 return 0;
899 }
900
901 #define BT_D4M3(x) ((((x) >> 2) << 1) + ((x) >> 2))
902 #define BT_D4M4(x) ((x) & ~3)
903
904 static void
905 cg6_loadcmap (void *fbinfo, int index, int count)
906 {
907 fbinfo_t *fb = (fbinfo_t *) fbinfo;
908 struct bt_regs *bt = fb->info.cg6.bt;
909 int i;
910
911 bt->addr = index << 24;
912 for (i = index; count--; i++){
913 bt->color_map = color_map.map [i][0] << 24;
914 bt->color_map = color_map.map [i][1] << 24;
915 bt->color_map = color_map.map [i][2] << 24;
916 }
917 }
918
919
920 static void
921 cg6_setcursor (struct cg6_info *info)
922 {
923 unsigned int v;
924 struct cg6_cursor *c = &info->cursor;
925
926 if (c->enable){
927 v = ((c->cpos.fbx - c->chot.fbx) << 16)
928 |((c->cpos.fby - c->chot.fby) & 0xffff);
929 } else {
930
931 v = ((65536-32) << 16) | (65536-32);
932 }
933 info->thc->thc_cursxy = v;
934 }
935
936 #undef pos
937 static int
938 cg6_scursor (struct fbcursor *cursor, fbinfo_t *fb)
939 {
940 int op = cursor->set;
941 volatile struct cg6_thc *thc = fb->info.cg6.thc;
942 struct cg6_cursor *cursor_info = &fb->info.cg6.cursor;
943 int i, bytes = 0;
944
945 if (op & FB_CUR_SETSHAPE){
946 if ((unsigned int) cursor->size.fbx > 32)
947 return -EINVAL;
948 if ((unsigned int) cursor->size.fby > 32)
949 return -EINVAL;
950 bytes = (cursor->size.fby * 32)/8;
951 i = verify_area (VERIFY_READ, cursor->image, bytes);
952 if (i) return i;
953 i = verify_area (VERIFY_READ, cursor->mask, bytes);
954 if (i) return i;
955 }
956 if (op & (FB_CUR_SETCUR | FB_CUR_SETPOS | FB_CUR_SETHOT)){
957 if (op & FB_CUR_SETCUR)
958 cursor_info->enable = cursor->enable;
959 if (op & FB_CUR_SETPOS)
960 cursor_info->cpos = cursor->pos;
961 if (op & FB_CUR_SETHOT)
962 cursor_info->chot = cursor->hot;
963 cg6_setcursor (&fb->info.cg6);
964 }
965 if (op & FB_CUR_SETSHAPE){
966 unsigned int u;
967
968 cursor_info->size = cursor->size;
969 memset ((void *)&cursor_info->bits, 0, sizeof (cursor_info->size));
970 memcpy (cursor_info->bits [0], cursor->mask, bytes);
971 memcpy (cursor_info->bits [1], cursor->image, bytes);
972 u = ~0;
973 if (cursor_info->size.fbx < 32)
974 u = ~(u >> cursor_info->size.fbx);
975 for (i = 0; i < 32; i++){
976 int m = cursor_info->bits [0][i] & u;
977 thc->thc_cursmask [i] = m;
978 thc->thc_cursbits [i] = m & cursor_info->bits [1][i];
979 }
980 }
981 return 0;
982 }
983
984
985 static int
986 cg6_ioctl (struct inode *inode, struct file *file, unsigned cmd, unsigned long arg, fbinfo_t *fb)
987 {
988 int i;
989
990 switch (cmd){
991 case FBIOGCURMAX:
992 i = verify_area (VERIFY_WRITE, (void *) arg, sizeof (struct fbcurpos));
993 if (i) return i;
994 ((struct fbcurpos *) arg)->fbx = 32;
995 ((struct fbcurpos *) arg)->fby = 32;
996 break;
997
998 case FBIOSVIDEO:
999
1000 break;
1001
1002 case FBIOSCURSOR:
1003 return cg6_scursor ((struct fbcursor *) arg, fb);
1004
1005 case FBIOSCURPOS:
1006
1007
1008
1009
1010 fb->info.cg6.cursor.cpos = *(struct fbcurpos *)arg;
1011 cg6_setcursor (&fb->info.cg6);
1012 break;
1013 default:
1014 return -EINVAL;
1015 }
1016 return 0;
1017 }
1018
1019 static void
1020 cg6_setup (int slot, unsigned int cg6, int cg6_io)
1021 {
1022 struct cg6_info *cg6info;
1023
1024 printk ("cgsix%d at 0x%8.8x\n", slot, (unsigned int) cg6);
1025
1026
1027 fbinfo [slot].type.fb_cmsize = 256;
1028 fbinfo [slot].mmap = cg6_mmap;
1029 fbinfo [slot].loadcmap = cg6_loadcmap;
1030 fbinfo [slot].ioctl = (void *) cg6_ioctl;
1031 fbinfo [slot].blank = 0;
1032 fbinfo [slot].unblank = 0;
1033
1034 cg6info = (struct cg6_info *) &fbinfo [slot].info.cg6;
1035
1036
1037 cg6info->bt = sparc_alloc_io ((void *) cg6+CG6_BROOKTREE_OFFSET, 0,
1038 sizeof (struct bt_regs),"cgsix_dac", cg6_io, 0);
1039 cg6info->fhc = sparc_alloc_io ((void *) cg6+CG6_FHC_OFFSET, 0,
1040 sizeof (int), "cgsix_fhc", cg6_io, 0);
1041 cg6info->thc = sparc_alloc_io ((void *) cg6+CG6_THC_OFFSET, 0,
1042 sizeof (struct cg6_thc), "cgsix_thc", cg6_io, 0);
1043 cg6info->tec = sparc_alloc_io ((void *) cg6+CG6_TEC_OFFSET, 0,
1044 sizeof (struct cg6_tec), "cgsix_tec", cg6_io, 0);
1045 cg6info->dhc = sparc_alloc_io ((void *) cg6+CG6_DHC_OFFSET, 0,
1046 0x40000, "cgsix_dhc", cg6_io, 0);
1047 cg6info->fbc = sparc_alloc_io ((void *) cg6+CG6_FBC_OFFSET, 0,
1048 0x1000, "cgsix_fbc", cg6_io, 0);
1049 if (!con_fb_base){
1050 con_fb_base = sparc_alloc_io ((void *) cg6+CG6_RAM_OFFSET, 0,
1051 fbinfo [slot].type.fb_size, "cgsix_ram", cg6_io, 0);
1052 }
1053 if (!slot)
1054 restore_palette = cg6_restore_palette;
1055 }
1056
1057
1058 #define CG3_REGS 0x400000
1059 #define CG3_RAM 0x800000
1060 #define D4M3(x) ((((x)>>2)<<1) + ((x)>>2))
1061 #define D4M4(x) ((x)&~0x3)
1062
1063
1064
1065 static void
1066 cg3_loadcmap (void *fbinfo, int index, int count)
1067 {
1068 fbinfo_t *fb = (fbinfo_t *) fbinfo;
1069 struct bt_regs *bt = fb->info.cg3.bt;
1070 int *i, steps;
1071
1072 i = &color_map.raw [D4M3(index)];
1073 steps = D4M3(index+count-1) - D4M3(index)+3;
1074 bt->addr = D4M4(index);
1075 while (steps--)
1076 bt->color_map = *i++;
1077 }
1078
1079
1080
1081 static int
1082 cg3_mmap (struct inode *inode, struct file *file, struct vm_area_struct *vma, long base, void *xx)
1083 {
1084 unsigned int size, page, r, map_size;
1085 unsigned int map_offset = 0;
1086 fbinfo_t *fb = (fbinfo_t *) xx;
1087
1088 size = vma->vm_end - vma->vm_start;
1089 if (vma->vm_offset & ~PAGE_MASK)
1090 return -ENXIO;
1091
1092
1093 vma->vm_flags |= FB_MMAP_VM_FLAGS;
1094
1095
1096 for (page = 0; page < size; ){
1097 switch (vma->vm_offset+page){
1098 case CG3_MMAP_OFFSET:
1099 map_size = size-page;
1100 map_offset = get_phys ((uint) con_fb_base);
1101 if (map_size > fb->type.fb_size)
1102 map_size = fb->type.fb_size;
1103 break;
1104 default:
1105 map_size = 0;
1106 break;
1107 }
1108 if (!map_size){
1109 page += PAGE_SIZE;
1110 continue;
1111 }
1112 r = io_remap_page_range (vma->vm_start+page,
1113 map_offset,
1114 map_size, vma->vm_page_prot,
1115 fb->space);
1116 if (r) return -EAGAIN;
1117 page += map_size;
1118 }
1119 vma->vm_inode = inode;
1120 inode->i_count++;
1121 return 0;
1122 }
1123
1124 static void
1125 cg3_setup (int slot, unsigned int cg3, int cg3_io)
1126 {
1127 struct cg3_info *cg3info;
1128
1129 printk ("cgthree%d at 0x%8.8x\n", slot, cg3);
1130
1131
1132 fbinfo [slot].type.fb_cmsize = 256;
1133 fbinfo [slot].mmap = cg3_mmap;
1134 fbinfo [slot].loadcmap = cg3_loadcmap;
1135 fbinfo [slot].ioctl = 0;
1136
1137 cg3info = (struct cg3_info *) &fbinfo [slot].info.cg3;
1138
1139
1140 cg3info->bt = sparc_alloc_io ((void *) cg3+CG3_REGS, 0,
1141 sizeof (struct bt_regs),"cg3_bt", cg3_io, 0);
1142
1143 if (!con_fb_base){
1144 con_fb_base=sparc_alloc_io ((void*) cg3+CG3_RAM, 0,
1145 fbinfo [slot].type.fb_size, "cg3_ram", cg3_io, 0);
1146 }
1147 }
1148
1149
1150 #define BWTWO_REGISTER_OFFSET 0x400000
1151
1152 struct bwtwo_regs {
1153 char unknown [16];
1154 #define BWTWO_ENABLE_VIDEO 0x40
1155 unsigned char control;
1156 char unknown2 [15];
1157 };
1158
1159 static int
1160 bwtwo_mmap (struct inode *inode, struct file *file, struct vm_area_struct *vma, long base, void *xx)
1161 {
1162 unsigned int size, map_offset, r;
1163 fbinfo_t *fb = (fbinfo_t *) xx;
1164 int map_size;
1165
1166 map_size = size = vma->vm_end - vma->vm_start;
1167
1168 if (vma->vm_offset & ~PAGE_MASK)
1169 return -ENXIO;
1170
1171
1172 vma->vm_flags |= FB_MMAP_VM_FLAGS;
1173 printk ("base=%8.8xl start=%8.8xl size=%x offset=%8.8x\n",
1174 (unsigned int) base,
1175 (unsigned int) vma->vm_start, size,
1176 (unsigned int) vma->vm_offset);
1177
1178
1179 map_offset = get_phys ((uint) con_fb_base);
1180 r = io_remap_page_range (vma->vm_start, map_offset, map_size, vma->vm_page_prot,
1181 fb->space);
1182 if (r) return -EAGAIN;
1183 vma->vm_inode = inode;
1184 inode->i_count++;
1185 return 0;
1186 }
1187
1188 static void
1189 bwtwo_blank (void *xx)
1190 {
1191 fbinfo_t *fb = (fbinfo_t *) xx;
1192
1193 fb->info.bwtwo.regs->control &= ~BWTWO_ENABLE_VIDEO;
1194 }
1195
1196 static void
1197 bwtwo_unblank (void *xx)
1198 {
1199 fbinfo_t *fb = (fbinfo_t *) xx;
1200 fb->info.bwtwo.regs->control |= BWTWO_ENABLE_VIDEO;
1201 }
1202
1203 static void
1204 bwtwo_setup (int slot, unsigned int bwtwo, int bw2_io)
1205 {
1206 printk ("bwtwo%d at 0x%8.8x\n", slot, bwtwo);
1207 fbinfo [slot].type.fb_cmsize = 2;
1208 fbinfo [slot].mmap = bwtwo_mmap;
1209 fbinfo [slot].loadcmap = 0;
1210 fbinfo [slot].ioctl = 0;
1211 fbinfo [slot].blank = bwtwo_blank;
1212 fbinfo [slot].unblank = bwtwo_unblank;
1213 fbinfo [slot].info.bwtwo.regs = sparc_alloc_io ((void *) bwtwo+BWTWO_REGISTER_OFFSET,
1214 0, sizeof (struct bwtwo_regs), "bwtwo_regs", bw2_io, 0);
1215 }
1216
1217 static void
1218 cg14_setup (int slot, unsigned int cg14, int cg14_io)
1219 {
1220 printk ("cgfourteen%d at 0x%8.8x\n", slot, cg14);
1221 fbinfo [slot].type.fb_cmsize = 256;
1222 fbinfo [slot].mmap = 0;
1223 fbinfo [slot].loadcmap = 0;
1224 fbinfo [slot].ioctl = 0;
1225 fbinfo [slot].blank = 0;
1226 fbinfo [slot].unblank = 0;
1227 }
1228
1229 static char *known_cards [] = {
1230 "cgsix", "cgthree", "bwtwo", "SUNW,tcx", "cgfourteen", 0
1231 };
1232
1233 static int
1234 known_card (char *name)
1235 {
1236 int i;
1237
1238 for (i = 0; known_cards [i]; i++)
1239 if (strcmp (name, known_cards [i]) == 0)
1240 return 1;
1241 return 0;
1242 }
1243
1244 static struct {
1245 int depth;
1246 int resx, resy;
1247 int x_margin, y_margin;
1248 } scr_def [] = {
1249 { 1, 1152, 900, 8, 18 },
1250 { 8, 1152, 900, 64, 18 },
1251 { 8, 1280, 1024, 96, 80 },
1252 { 8, 1024, 768, 0, 0 },
1253 { 0 },
1254 };
1255
1256 static int
1257 cg14_present(void)
1258 {
1259 int root, n;
1260
1261 prom_printf ("Looking for cg14\n");
1262 root = prom_getchild (prom_root_node);
1263 if ((n = prom_searchsiblings (root, "obio")) == 0)
1264 return 0;
1265
1266 n = prom_getchild (n);
1267 if ((n = prom_searchsiblings (n, "cgfourteen")) == 0)
1268 return 0;
1269 prom_printf ("Cg14 found!\n");
1270 return n;
1271 }
1272
1273 static int
1274 sparc_console_probe(void)
1275 {
1276 int propl, con_node, i;
1277 struct linux_sbus_device *sbdp;
1278 unsigned int fbbase = 0xb001b001;
1279 int fbiospace = 0;
1280 int cg14 = 0;
1281
1282
1283 con_node = 0;
1284 switch(prom_vers) {
1285 case PROM_V0:
1286
1287 con_type = FBTYPE_NOTYPE;
1288 if(SBus_chain == 0) {
1289 prom_printf("SBUS chain is NULL, bailing out...\n");
1290 prom_halt();
1291 }
1292 for_each_sbusdev(sbdp, SBus_chain) {
1293 con_node = sbdp->prom_node;
1294
1295
1296 if(sbdp->num_vaddrs) {
1297 if(!strncmp(sbdp->prom_name, "cgsix", 5)) {
1298 con_type = FBTYPE_SUNFAST_COLOR;
1299 fbbase = (uint) sbdp->reg_addrs [0].phys_addr;
1300 fbiospace = sbdp->reg_addrs[0].which_io;
1301 break;
1302 } else if(!strncmp(sbdp->prom_name, "cgthree", 7)) {
1303 con_type = FBTYPE_SUN3COLOR;
1304 fbbase = (uint) sbdp->reg_addrs [0].phys_addr;
1305 fbiospace = sbdp->reg_addrs[0].which_io;
1306 break;
1307 } else if (!strncmp(sbdp->prom_name, "bwtwo", 5)) {
1308 con_type = FBTYPE_SUN2BW;
1309 fbbase = (uint) sbdp->reg_addrs [0].phys_addr;
1310 fbiospace = sbdp->reg_addrs[0].which_io;
1311 break;
1312 }
1313 }
1314 }
1315 if(con_type == FBTYPE_NOTYPE) return -1;
1316 con_fb_base = (unsigned char *) sbdp->sbus_vaddrs[0];
1317 strncpy(con_name, sbdp->prom_name, sizeof (con_name));
1318 break;
1319 case PROM_V2:
1320 case PROM_V3:
1321 case PROM_P1275:
1322 for_each_sbusdev(sbdp, SBus_chain) {
1323 prom_printf ("Trying: %s\n", sbdp->prom_name);
1324 if (known_card (sbdp->prom_name))
1325 break;
1326 }
1327 if (!sbdp){
1328 if (!(cg14 = cg14_present ())){
1329 prom_printf ("Could not find a known video card on this machine\n");
1330 prom_halt ();
1331 }
1332 }
1333 if (!cg14){
1334 prom_apply_sbus_ranges (&sbdp->reg_addrs [0], sbdp->num_registers);
1335 fbbase = (long) sbdp->reg_addrs [0].phys_addr;
1336 fbiospace = sbdp->reg_addrs[0].which_io;
1337 con_node = (*romvec->pv_v2devops.v2_inst2pkg)
1338 (*romvec->pv_v2bootargs.fd_stdout);
1339
1340
1341
1342 propl = prom_getproperty(con_node, "emulation", con_name, sizeof (con_name));
1343 if (propl < 0 || propl >= sizeof (con_name)) {
1344
1345 propl = prom_getproperty(con_node, "name", con_name, sizeof (con_name));
1346 if (propl < 0) {
1347 prom_printf("console: no device name!!\n");
1348 return -1;
1349 }
1350 }
1351 if(!strncmp(con_name, "cgsix", sizeof (con_name))) {
1352 con_type = FBTYPE_SUNFAST_COLOR;
1353 } else if(!strncmp(con_name, "cgthree", sizeof (con_name))) {
1354 con_type = FBTYPE_SUN3COLOR;
1355 } else if(!strncmp(con_name, "cgfourteen", sizeof (con_name))) {
1356 con_type = FBTYPE_MDICOLOR;
1357 } else if(!strncmp(con_name, "bwtwo", sizeof (con_name))) {
1358 con_type = FBTYPE_SUN2BW;
1359 } else if(!strncmp(con_name,"SUNW,tcx", sizeof (con_name))){
1360 con_type = FBTYPE_SUN3COLOR;
1361 } else {
1362 prom_printf("console: \"%s\" is unsupported\n", con_name);
1363 return -1;
1364 }
1365 propl = prom_getproperty(con_node, "address", (char *) &con_fb_base, 4);
1366 if (propl != 4) {
1367 con_fb_base = 0;
1368 }
1369 } else {
1370 int bases [2];
1371
1372 con_node = cg14;
1373 prom_printf ("Found a cg14\n");
1374 propl = prom_getproperty (cg14, "address",
1375 (char *) &bases[0], 8);
1376 prom_printf ("Size=%d, %x\n", propl, bases [1]);
1377 con_fb_base = (unsigned char *) bases [1];
1378 con_type = FBTYPE_MDICOLOR;
1379 }
1380 break;
1381 default:
1382 return -1;
1383 };
1384
1385
1386 con_linebytes = prom_getintdefault(con_node, "linebytes", 1152);
1387 con_width = prom_getintdefault(con_node, "width", 1152);
1388 con_height = prom_getintdefault(con_node, "height", 900);
1389
1390
1391 if (con_type == FBTYPE_SUN2BW) {
1392 con_depth = 1;
1393 } else {
1394 con_depth = 8;
1395 }
1396 for (i = 0; scr_def [i].depth; i++){
1397 if (scr_def [i].resx != con_width || scr_def [i].resy != con_height)
1398 continue;
1399 if (scr_def [i].depth != con_depth)
1400 continue;
1401 x_margin = scr_def [i].x_margin;
1402 y_margin = scr_def [i].y_margin;
1403 chars_per_line = (con_width * con_depth) / 8;
1404 skip_bytes = chars_per_line * y_margin;
1405 ints_per_line = chars_per_line / 4;
1406 bytes_per_row = CHAR_HEIGHT * chars_per_line;
1407 break;
1408 }
1409 if (!scr_def [i].depth){
1410 x_margin = y_margin = 0;
1411 prom_printf ("PenguinCon: unknown video resolution %dx%d may be slow\n", con_width, con_height);
1412 prom_halt ();
1413 }
1414
1415 if ((con_linebytes*8) / con_depth != con_width) {
1416 prom_printf("console: UNUSUAL VIDEO, linebytes=%d, width=%d, depth=%d\n",
1417 con_linebytes, con_width, con_depth);
1418 return -1;
1419 }
1420
1421
1422 if (con_depth == 1)
1423 for(i=0; i<(16 * 256); i++)
1424 vga_font[i] = ~vga_font[i];
1425
1426
1427 fbinfo [0].type.fb_type = con_type;
1428 fbinfo [0].type.fb_height = con_height;
1429 fbinfo [0].type.fb_width = con_width;
1430 fbinfo [0].type.fb_depth = con_depth;
1431 fbinfo [0].type.fb_size = PAGE_ALIGN((con_linebytes) * (con_height));
1432 fbinfo [0].space = fbiospace;
1433 fbinfo [0].blanked = 0;
1434
1435
1436 fbinfo [0].mmap = 0;
1437 fbinfo [0].loadcmap = 0;
1438 fbinfo [0].ioctl = 0;
1439 fbinfo [0].blank = 0;
1440 fbinfo [0].unblank = 0;
1441
1442 if (fbbase == 0xb001b001){
1443 printk ("Mail miguel@nuclecu.unam.mx video_card=%d (%s)\n", con_type, con_name);
1444 }
1445
1446
1447 switch (con_type){
1448 case FBTYPE_SUN3COLOR:
1449 cg3_setup (0, fbbase, fbiospace);
1450 break;
1451 case FBTYPE_SUNFAST_COLOR:
1452 cg6_setup (0, fbbase, fbiospace);
1453 break;
1454 case FBTYPE_SUN2BW:
1455 bwtwo_setup (0, fbbase, fbiospace);
1456 break;
1457 case FBTYPE_MDICOLOR:
1458 cg14_setup (0, fbbase, fbiospace);
1459 break;
1460 default:
1461 break;
1462 }
1463 if (!con_fb_base){
1464 prom_printf ("PROM does not have an 'address' property for this\n"
1465 "frame buffer and the Linux drivers do not know how\n"
1466 "to map the video of this device\n");
1467 prom_halt ();
1468 }
1469 fbinfo [0].base = (long) con_fb_base;
1470
1471
1472 if (register_chrdev (GRAPHDEV_MAJOR, "graphics", &graphdev_fops)){
1473 printk ("Could not register graphics device\n");
1474 return -EIO;
1475 }
1476 return 0;
1477 }
1478
1479
1480
1481
1482 void
1483 sun_console_init(void)
1484 {
1485 if(serial_console)
1486 return;
1487
1488 if(sparc_console_probe()) {
1489 prom_printf("Could not probe console, bailing out...\n");
1490 prom_halt();
1491 }
1492 sun_clear_screen();
1493 }
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504 static unsigned int
1505 fontmask_bits[16] = {
1506 0x00000000,
1507 0x000000ff,
1508 0x0000ff00,
1509 0x0000ffff,
1510 0x00ff0000,
1511 0x00ff00ff,
1512 0x00ffff00,
1513 0x00ffffff,
1514 0xff000000,
1515 0xff0000ff,
1516 0xff00ff00,
1517 0xff00ffff,
1518 0xffff0000,
1519 0xffff00ff,
1520 0xffffff00,
1521 0xffffffff
1522 };
1523
1524 int
1525 sun_blitc(unsigned int charattr, unsigned long addr)
1526 {
1527 int j, idx;
1528 unsigned char *font_row;
1529
1530 #ifndef DEBUGGING_X
1531 if (graphics_on)
1532 return 0;
1533 #endif
1534 idx = (addr - video_mem_base) >> 1;
1535
1536
1537 if(idx == cursor_pos)
1538 cursor_pos = -1;
1539 font_row = &vga_font[(charattr & 0xff) << 4];
1540
1541 switch (con_depth){
1542 case 1: {
1543 register unsigned char *dst;
1544
1545 dst = (unsigned char *)(((unsigned long)con_fb_base) + FBUF_OFFSET(idx));
1546 for(j = 0; j < CHAR_HEIGHT; j++, font_row++, dst+=CHARS_PER_LINE)
1547 *dst = *font_row;
1548 break;
1549 }
1550 case 8: {
1551 register unsigned long *dst;
1552 unsigned long fgmask, bgmask, data, rowbits, attrib;
1553 const int ipl = ints_per_line;
1554
1555 dst = (unsigned long *)(((unsigned long)con_fb_base) + COLOR_FBUF_OFFSET(idx));
1556 attrib = (charattr >> 8) & 0x0ff;
1557 fgmask = attrib & 0x0f;
1558 bgmask = (attrib >> 4) & 0x0f;
1559 fgmask = fgmask << 8 | fgmask;
1560 fgmask |= fgmask << 16;
1561 bgmask = bgmask << 8 | bgmask;
1562 bgmask |= bgmask << 16;
1563
1564 for(j = 0; j < CHAR_HEIGHT; j++, font_row++, dst += ipl) {
1565 rowbits = *font_row;
1566 data = fontmask_bits[(rowbits>>4)&0xf];
1567 data = (data & fgmask) | (~data & bgmask);
1568 *dst = data;
1569 data = fontmask_bits[rowbits&0xf];
1570 data = (data & fgmask) | (~data & bgmask);
1571 *(dst+1) = data;
1572 }
1573 break;
1574 }
1575 }
1576 return (0);
1577 }
1578
1579 unsigned char vga_font[cmapsz] = {
1580 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1581 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
1582 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff,
1583 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
1584 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10,
1585 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
1586 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1587 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
1588 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c,
1589 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
1590 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
1591 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1592 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,
1593 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
1594 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e,
1595 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
1596 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
1597 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
1598 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63,
1599 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
1600 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18,
1601 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
1602 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e,
1603 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1604 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00,
1605 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
1606 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb,
1607 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
1608 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6,
1609 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1610 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
1611 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
1612 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1613 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1614 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1615 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1616 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00,
1617 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
1618 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1619 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1620 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00,
1621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
1622 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1623 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1624 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
1625 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
1626 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c,
1627 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
1628 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c,
1629 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
1630 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
1631 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
1632 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1633 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
1634 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
1635 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1636 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00,
1637 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
1638 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1639 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
1640 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
1641 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1642 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1643 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
1644 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c,
1645 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
1646 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
1647 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
1648 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c,
1649 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
1650 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
1651 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1652 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1653 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
1654 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
1655 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1656 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78,
1657 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
1658 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1659 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1660 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06,
1661 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
1662 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
1663 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
1664 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
1665 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde,
1666 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
1667 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
1668 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc,
1669 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
1670 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c,
1671 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
1672 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe,
1673 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
1674 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
1675 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
1676 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1677 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
1678 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
1679 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
1680 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6,
1681 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
1682 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xe7,
1683 0xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
1684 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6,
1685 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1686 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66,
1687 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
1688 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c,
1689 0x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
1690 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
1691 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1692 0x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1693 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1694 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
1695 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
1696 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66,
1697 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18,
1698 0x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
1699 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
1700 0x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff,
1701 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
1702 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1703 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1704 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c,
1705 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
1706 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1707 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
1708 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1709 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
1710 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60,
1711 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
1712 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
1713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
1714 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1715 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1716 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0,
1717 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
1718 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60,
1719 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
1720 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1721 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
1722 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60,
1723 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
1724 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1725 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb,
1726 0xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1727 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1728 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1729 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
1730 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
1731 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
1732 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0,
1733 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
1734 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
1735 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
1736 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
1737 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3,
1738 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1739 0x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00,
1740 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3,
1741 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
1742 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
1743 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
1744 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e,
1745 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
1746 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
1747 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
1748 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1749 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
1750 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
1751 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,
1752 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
1753 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
1754 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
1755 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
1756 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
1757 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
1758 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38,
1759 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
1760 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06,
1761 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
1762 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
1763 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1764 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c,
1765 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
1766 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
1767 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
1768 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
1769 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
1770 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00,
1771 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
1772 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe,
1773 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b,
1774 0x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c,
1775 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
1776 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1777 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
1778 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
1779 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
1780 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
1781 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
1782 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
1783 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
1784 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1785 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
1786 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
1787 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1788 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc,
1789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18,
1790 0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66,
1791 0x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00,
1792 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18,
1793 0xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
1794 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
1795 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
1796 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
1797 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
1798 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
1799 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1800 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
1801 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00,
1802 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
1803 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1804 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c,
1805 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
1806 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1807 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
1808 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06,
1809 0x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30,
1810 0x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
1811 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
1812 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
1813 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
1814 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
1815 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1816 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
1817 0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
1818 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18,
1819 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1820 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
1821 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
1822 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
1823 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1824 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36,
1825 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8,
1826 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
1827 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1828 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1829 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
1830 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1831 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1832 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00,
1833 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
1834 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1835 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1836 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
1837 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
1838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1839 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1840 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
1841 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
1842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1843 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1844 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
1845 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
1846 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1847 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1848 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
1849 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
1850 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1851 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1852 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
1853 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
1854 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
1855 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1856 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
1857 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
1858 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1859 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1860 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36,
1861 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
1862 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
1863 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1864 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
1865 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
1866 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1867 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1868 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18,
1869 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
1870 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1871 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1872 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1873 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
1874 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0,
1875 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
1876 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
1877 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
1878 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1879 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
1880 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc,
1881 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
1882 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1883 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
1884 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe,
1885 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8,
1886 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1887 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
1888 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1889 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66,
1890 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
1891 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
1892 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee,
1893 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66,
1894 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1895 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1896 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0,
1897 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60,
1898 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
1899 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
1900 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00,
1901 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
1902 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
1903 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
1904 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e,
1905 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18,
1906 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1907 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
1908 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00,
1909 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
1910 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
1911 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1912 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
1913 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1914 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c,
1915 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
1916 0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00,
1917 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00,
1918 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1919 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
1920 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1921 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1922 };