Mercurial > illumos > illumos-gate
changeset 1253:0df630a41817
PSARC 2003/432 Coherent Console
PSARC 2004/105 Simplified Visual_io Versioning
PSARC 2004/118 Change how $TERM is set for console
PSARC 2004/236 Update to Coherent Console
4873799 SPARC console should be weaned from OBP
4927198 Integrate Coherent Console
line wrap: on
line diff
--- a/usr/src/cmd/svc/milestone/console-login Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/cmd/svc/milestone/console-login Thu Jan 12 18:17:46 2006 -0800 @@ -3,9 +3,8 @@ # CDDL HEADER START # # The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. @@ -20,11 +19,12 @@ # # CDDL HEADER END # + # -# Copyright 2004 Sun Microsystems, Inc. All rights reserved. +# Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # -#ident "%Z%%M% %I% %E% SMI" +# ident "%Z%%M% %I% %E% SMI" # # For modifying parameters passed to ttymon, do not edit # this script. Instead use svccfg(1m) to modify the SMF @@ -39,7 +39,7 @@ getproparg() { val=`svcprop -p $2 $FMRI` - [ -n "$val" ] && echo $1 $val + [ -n "$val" ] && [ "$val" != "\"\"" ] && echo $1 $val } args="-g" @@ -50,7 +50,9 @@ args="$args -d $val" args="$args `getproparg -l ttymon/label`" + args="$args `getproparg -T ttymon/terminal_type`" + args="$args `getproparg -m ttymon/modules`" val=`svcprop -p ttymon/nohangup $FMRI`
--- a/usr/src/cmd/svc/milestone/make-console-login-xml Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/cmd/svc/milestone/make-console-login-xml Thu Jan 12 18:17:46 2006 -0800 @@ -3,9 +3,8 @@ # CDDL HEADER START # # The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. @@ -20,28 +19,17 @@ # # CDDL HEADER END # + # -# Copyright 2004 Sun Microsystems, Inc. All rights reserved. +# Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # -#ident "%Z%%M% %I% %E% SMI" - -case "$MACH" in - sparc) - TTY_TYPE=sun - ;; - i386) - TTY_TYPE=sun-color - ;; - *) - echo "Unknown machine type $MACH" >&2 - exit 1 -esac +# ident "%Z%%M% %I% %E% SMI" cat >console-login.xml <<EOF <?xml version="1.0"?> <!-- - Copyright 2004 Sun Microsystems, Inc. All rights reserved. + Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. ident "%Z%%M% %I% %E% SMI" @@ -132,7 +120,7 @@ <propval name='prompt' type='astring' value='\`uname -n\` console login:' /> <propval name='terminal_type' type='astring' - value='$TTY_TYPE' /> + value='' /> </property_group> <stability value='Evolving' />
--- a/usr/src/cmd/ttymon/tmexpress.c Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/cmd/ttymon/tmexpress.c Thu Jan 12 18:17:46 2006 -0800 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -19,8 +18,9 @@ * * CDDL HEADER END */ + /* - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ @@ -43,6 +43,9 @@ #include <dirent.h> #include <sys/param.h> #include <sys/acl.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/console.h> #include "ttymon.h" #include "tmextern.h" #include "tmstruct.h" @@ -165,6 +168,8 @@ static char p_server[] = "/usr/bin/login"; extern char *lastname(); extern void getty_account(); + static char termbuf[MAX_TERM_TYPE_LEN]; + static struct cons_getterm cnterm = {sizeof (termbuf), termbuf}; /* initialize fields to some default first */ pmtab->p_tag = ""; @@ -190,9 +195,34 @@ pmtab->p_ttylabel = "300"; getty_options(argc, argv, pmtab); } else { + int cn_fd; + pmtab->p_ttylabel = "9600"; ttymon_options(argc, argv, pmtab); + + /* + * The following code is only reached if -g was specified. + * It attempts to determine a suitable terminal type for + * the console login process. + * + * If -d /dev/console also specified, we send an ioctl + * to the console device to query the TERM type. + * + * If any of the tests, system calls, or ioctls fail + * then pmtab->p_termtype retains its default value + * of "". otherwise it is set to a term type value + * that was returned. + */ + if ((strlen(pmtab->p_termtype) == 0) && + (strcmp(pmtab->p_device, "/dev/console") == 0) && + ((cn_fd = open("/dev/console", O_RDONLY)) != -1)) { + + if (ioctl(cn_fd, CONS_GETTERM, &cnterm) != -1) + pmtab->p_termtype = cnterm.cn_term_type; + (void) close(cn_fd); + } } + if ((pmtab->p_device != NULL) && (*(pmtab->p_device) != '\0')) getty_account(pmtab->p_device); /* utmp accounting */ return (0);
--- a/usr/src/pkgdefs/SUNWckr/prototype_i386 Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/pkgdefs/SUNWckr/prototype_i386 Thu Jan 12 18:17:46 2006 -0800 @@ -2,9 +2,8 @@ # CDDL HEADER START # # The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. @@ -19,11 +18,12 @@ # # CDDL HEADER END # + # -# Copyright 2005 Sun Microsystems, Inc. All rights reserved. +# Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # -#pragma ident "%Z%%M% %I% %E% SMI" +# ident "%Z%%M% %I% %E% SMI" # # This required package information file contains a list of package contents. # The 'pkgmk' command uses this file to identify the contents of a package @@ -171,7 +171,7 @@ l none kernel/misc/sha1=../../kernel/crypto/sha1 l none kernel/misc/sha2=../../kernel/crypto/sha2 f none kernel/misc/strplumb 755 root sys -f none kernel/misc/terminal-emulator 755 root sys +f none kernel/misc/tem 755 root sys f none kernel/misc/tlimod 755 root sys f none kernel/misc/zmod 755 root sys f none kernel/sched/TS 755 root sys @@ -337,7 +337,7 @@ l none kernel/misc/amd64/sha1=../../../kernel/crypto/amd64/sha1 l none kernel/misc/amd64/sha2=../../../kernel/crypto/amd64/sha2 f none kernel/misc/amd64/strplumb 755 root sys -f none kernel/misc/amd64/terminal-emulator 755 root sys +f none kernel/misc/amd64/tem 755 root sys f none kernel/misc/amd64/tlimod 755 root sys f none kernel/misc/amd64/zmod 755 root sys d none kernel/sched/amd64 755 root sys
--- a/usr/src/pkgdefs/SUNWckr/prototype_sparc Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/pkgdefs/SUNWckr/prototype_sparc Thu Jan 12 18:17:46 2006 -0800 @@ -2,9 +2,8 @@ # CDDL HEADER START # # The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. @@ -19,8 +18,9 @@ # # CDDL HEADER END # + # -# Copyright 2005 Sun Microsystems, Inc. All rights reserved. +# Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -178,6 +178,7 @@ f none kernel/misc/sparcv9/strplumb 755 root sys f none kernel/misc/sparcv9/swapgeneric 755 root sys f none kernel/misc/sparcv9/tlimod 755 root sys +f none kernel/misc/sparcv9/tem 755 root sys f none kernel/misc/sparcv9/zmod 755 root sys d none kernel/sched/sparcv9 755 root sys f none kernel/sched/sparcv9/TS 755 root sys
--- a/usr/src/psm/promif/ieee1275/common/prom_env.c Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/psm/promif/ieee1275/common/prom_env.c Thu Jan 12 18:17:46 2006 -0800 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -19,8 +18,9 @@ * * CDDL HEADER END */ + /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -69,6 +69,23 @@ static promif_preprom_f *promif_preprom_fn; static promif_postprom_f *promif_postprom_fn; +/* + * When this is set, the PROM output functions attempt to + * redirect output to the kernel terminal emulator. + */ +promif_redir_t promif_redirect; +promif_redir_arg_t promif_redirect_arg; + +/* + * Sets new callback and argument, returns previous callback. + */ +void +prom_set_stdout_redirect(promif_redir_t new_fn, promif_redir_arg_t opaque_arg) +{ + promif_redirect_arg = opaque_arg; + promif_redirect = new_fn; +} + void prom_set_preprom(promif_preprom_f *new) {
--- a/usr/src/psm/promif/ieee1275/common/prom_fb.c Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/psm/promif/ieee1275/common/prom_fb.c Thu Jan 12 18:17:46 2006 -0800 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -19,8 +18,9 @@ * * CDDL HEADER END */ + /* - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -39,3 +39,89 @@ OBP_DISPLAY); return (remember); } + +/* + * get current cursor position from the stdout handle, which + * containing the instance handle of the OBP console output device. + */ +void +prom_get_tem_pos(uint32_t *row, uint32_t *col) +{ + prom_interpret( + "my-self >r stdout @ is my-self " + "line# swap l! column# swap l! " + "r> is my-self", + (uintptr_t)row, (uintptr_t)col, 0, 0, 0); +} + + +/* + * get the font size and the start window top of + * OBP terminal emulator + */ +void +prom_get_term_font_size(int *charheight, int *window_top) +{ + prom_interpret( + "my-self >r stdout @ is my-self " + "char-height swap l! window-top swap l! " + "r> is my-self", + (uintptr_t)charheight, (uintptr_t)window_top, 0, 0, 0); + +} + +/* Clear the spining "|" character and hide the PROM cursor. */ +void +prom_hide_cursor(void) +{ + prom_interpret( + "my-self >r stdout @ is my-self " + "toggle-cursor " + "1 delete-characters " + "r> is my-self", + 0, 0, 0, 0, 0); +} + +static size_t +prom_atol(const char *str, int len) +{ + size_t n = 0; + + while (len-- && (*str != '\0')) { + n = n * 10 + (*str - '0'); + str++; + } + + return (n); +} + +/* + * Here we use the "screen-#columns" and "screen-#rows" settings of + * PROM to help us decide the console size and cursor position. The + * actual sizes of PROM's TEM and the console might be different with + * those "screen-#.." settings, in cases that they are too big to + * accommodate. + */ +void +prom_get_tem_size(size_t *height, size_t *width) +{ + char buf[MAXPATHLEN]; + char name[16]; + pnode_t node; + int len; + + if ((node = prom_optionsnode()) == OBP_BADNODE) + return; + + (void) prom_strcpy(name, "screen-#rows"); + if ((len = prom_getproplen(node, (caddr_t)name)) > 0) { + (void) prom_getprop(node, (caddr_t)name, (caddr_t)buf); + *height = prom_atol(buf, len); + } + + (void) prom_strcpy(name, "screen-#columns"); + if ((len = prom_getproplen(node, (caddr_t)name)) > 0) { + (void) prom_getprop(node, (caddr_t)name, (caddr_t)buf); + *width = prom_atol(buf, len); + } +}
--- a/usr/src/psm/promif/ieee1275/common/prom_io.c Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/psm/promif/ieee1275/common/prom_io.c Thu Jan 12 18:17:46 2006 -0800 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -19,8 +18,9 @@ * * CDDL HEADER END */ + /* - * Copyright 1994,1998,2001-2002 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -136,12 +136,19 @@ return (p1275_cell2size(ci[6])); /* Res1: actual length */ } +/* + * prom_write is the only prom_*() function we have to intercept + * because all the other prom_*() io interfaces eventually call + * into prom_write(). + */ /*ARGSUSED3*/ ssize_t prom_write(ihandle_t fd, caddr_t buf, size_t len, uint_t startblk, char devtype) { cell_t ci[7]; promif_owrap_t *ow; + ssize_t rlen; + #ifdef PROM_32BIT_ADDRS caddr_t obuf = NULL; static char smallbuf[256]; @@ -160,6 +167,7 @@ * promplat_alloc() can block on a mutex and so * is called here before calling promif_preprom(). */ + if (len > sizeof (smallbuf)) { obuf = buf; buf = promplat_alloc(len); @@ -190,16 +198,33 @@ } } #endif + /* + * If the callback address is set, attempt to redirect + * console output back into kernel terminal emulator. + */ + if (promif_redirect != NULL && + fd == prom_stdout_ihandle()) { + /* + * even if we're re-directing output to the kernel + * console device, we still have to call promif_preout() + * and promif_preprom() because these functions make sure + * that the console device is powered up before sending + * output to it. + */ + rlen = promif_redirect(promif_redirect_arg, + (uchar_t *)buf, len); + } else { + ci[0] = p1275_ptr2cell("write"); /* Service name */ + ci[1] = (cell_t)3; /* #argument cells */ + ci[2] = (cell_t)1; /* #result cells */ + ci[3] = p1275_uint2cell((uint_t)fd); /* Arg1: ihandle */ + ci[4] = p1275_ptr2cell(buf); /* Arg2: buffer addr */ + ci[5] = p1275_size2cell(len); /* Arg3: buffer len */ + ci[6] = (cell_t)-1; /* Res1: Prime result */ - ci[0] = p1275_ptr2cell("write"); /* Service name */ - ci[1] = (cell_t)3; /* #argument cells */ - ci[2] = (cell_t)1; /* #result cells */ - ci[3] = p1275_uint2cell((uint_t)fd); /* Arg1: ihandle */ - ci[4] = p1275_ptr2cell(buf); /* Arg2: buffer address */ - ci[5] = p1275_size2cell(len); /* Arg3: buffer length */ - ci[6] = (cell_t)-1; /* Res1: Prime result */ - - (void) p1275_cif_handler(&ci); + (void) p1275_cif_handler(&ci); + rlen = p1275_cell2size(ci[6]); /* Res1: actual len */ + } promif_postprom(); promif_postout(ow); @@ -209,7 +234,7 @@ promplat_free(buf, len); #endif - return (p1275_cell2size(ci[6])); /* Res1: actual length */ + return (rlen); } int
--- a/usr/src/tools/scripts/bfu.sh Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/tools/scripts/bfu.sh Thu Jan 12 18:17:46 2006 -0800 @@ -4585,6 +4585,18 @@ # new: need to remove going backwards: rm -f $root/etc/snmp/conf/mibiisa.rsrc- + # remove old terminal emulator module: + # (renamed from 'terminal-emulator' to 'tem') + # + # old: need to remove going forwards: + rm -f $root/kernel/misc/terminal-emulator + rm -f $root/kernel/misc/amd64/terminal-emulator + # + # new: need to remove going backwards: + rm -f $root/kernel/misc/tem + rm -f $root/kernel/misc/amd64/tem + rm -f $root/kernel/misc/sparcv9/tem + # # Remove /dev/mc symlink and /platform/sun4u/kernel/drv/mc-us3.conf # if any.
--- a/usr/src/uts/common/Makefile.files Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/uts/common/Makefile.files Thu Jan 12 18:17:46 2006 -0800 @@ -2,9 +2,8 @@ # CDDL HEADER START # # The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. @@ -19,6 +18,7 @@ # # CDDL HEADER END # + # # Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. @@ -1038,7 +1038,7 @@ CONSCONFIG_DACF_OBJS += consconfig_dacf.o consplat.o -TERMINAL_EMULATOR_OBJS += terminal-emulator.o 7x14.o +TEM_OBJS += tem.o tem_safe.o 6x10.o 7x14.o 12x22.o KBTRANS_OBJS += \ kbtrans.o \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/uts/common/io/12x22.c Thu Jan 12 18:17:46 2006 -0800 @@ -0,0 +1,5282 @@ +/* + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include <sys/types.h> +#include <sys/param.h> /* for NULL */ +#include <sys/font.h> + + +/* BEGIN CSTYLED */ +/* This is a derivation of a BDF font from the X consolidation */ +/* COMMENT Originally a BSD vfont. */ +/* FONT -Sun-Gallant-Demi-R-Normal--19-190-72-72-M-120-ISO8859-1 */ + +unsigned char FONTDATA[] = { + + +/* 0x01 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* xx */ +0x0f, 0xc0, /* xxxx */ +0x1f, 0x80, /* xxxxxx */ +0x3f, 0xc0, /* xxxxxxxx */ +0x7f, 0xe0, /* xxxxxxxxxx */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0x7f, 0xe0, /* xxxxxxxxxx */ +0x3f, 0xc0, /* xxxxxxxx */ +0x1f, 0x80, /* xxxxxx */ +0x0f, 0xc0, /* xxxx */ +0x06, 0x80, /* xx */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + + +/* 0x02 */ +0x33, 0x30, /* xx xx xx */ +0xcc, 0xc0, /* xx xx xx */ +0x33, 0x30, /* xx xx xx */ +0xcc, 0xc0, /* xx xx xx */ +0x33, 0x30, /* xx xx xx */ +0xcc, 0xc0, /* xx xx xx */ +0x33, 0x30, /* xx xx xx */ +0xcc, 0xc0, /* xx xx xx */ +0x33, 0x30, /* xx xx xx */ +0xcc, 0xc0, /* xx xx xx */ +0x33, 0x30, /* xx xx xx */ +0xcc, 0xc0, /* xx xx xx */ +0x33, 0x30, /* xx xx xx */ +0xcc, 0xc0, /* xx xx xx */ +0x33, 0x30, /* xx xx xx */ +0xcc, 0xc0, /* xx xx xx */ +0x33, 0x30, /* xx xx xx */ +0xcc, 0xc0, /* xx xx xx */ +0x33, 0x30, /* xx xx xx */ +0xcc, 0xc0, /* xx xx xx */ +0x33, 0x30, /* xx xx xx */ +0xcc, 0xc0, /* xx xx xx */ + + +/* 0x0b */ +0x06, 0x00, /* xx */ +0x06, 0x80, /* xx */ +0x06, 0x80, /* xx */ +0x06, 0x80, /* xx */ +0x06, 0x80, /* xx */ +0x06, 0x80, /* xx */ +0x06, 0x80, /* xx */ +0x06, 0x80, /* xx */ +0x06, 0x80, /* xx */ +0x06, 0x80, /* xx */ +0xfe, 0x00, /* xxxxxxx */ +0xfe, 0x00, /* xxxxxxx */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0x0c */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xfe, 0x00, /* xxxxxxx */ +0xfe, 0x00, /* xxxxxxx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ + +/* 0x0d */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x07, 0xf0, /* xxxxxxx */ +0x07, 0xf0, /* xxxxxxx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ + +/* 0x0e */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x07, 0xf0, /* xxxxxxx */ +0x07, 0xf0, /* xxxxxxx */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0x10 */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0x11 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0x12 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0x13 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0x14 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0xff, 0xf0, /* xxxxxxxxxxxx */ + +/* 0x0f */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ + + + /* 0x15 */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x07, 0xf0, /* xxxxxxx */ +0x07, 0xf0, /* xxxxxxx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ + +/* 0x16 */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0xfe, 0x00, /* xxxxxxx */ +0xfe, 0x00, /* xxxxxxx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ + +/* 0x17 */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0x18 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0xff, 0xf0, /* xxxxxxxxxxxx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ + +/* 0x19 */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x06, 0x00, /* xx */ +0x00, 0x00, /* xx */ + +/* ' ' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '!' */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '"' */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '#' */ +0x00, 0x00, /* */ +0x03, 0x30, /* XX XX */ +0x03, 0x30, /* XX XX */ +0x03, 0x30, /* XX XX */ +0x06, 0x60, /* XX XX */ +0x1f, 0xf0, /* XXXXXXXXX */ +0x1f, 0xf0, /* XXXXXXXXX */ +0x0c, 0xc0, /* XX XX */ +0x0c, 0xc0, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x7f, 0xc0, /* XXXXXXXXX */ +0x7f, 0xc0, /* XXXXXXXXX */ +0x33, 0x00, /* XX XX */ +0x66, 0x00, /* XX XX */ +0x66, 0x00, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '$' */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x3f, 0xc0, /* XXXXXXXX */ +0x66, 0xe0, /* XX XX XXX */ +0x66, 0x60, /* XX XX XX */ +0x66, 0x00, /* XX XX */ +0x3e, 0x00, /* XXXXX */ +0x1f, 0x80, /* XXXXXX */ +0x07, 0xc0, /* XXXXX */ +0x06, 0x60, /* XX XX */ +0x06, 0x60, /* XX XX */ +0x66, 0x60, /* XX XX XX */ +0x7f, 0xc0, /* XXXXXXXXX */ +0x3f, 0x80, /* XXXXXXX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '%' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x38, 0xc0, /* XXX XX */ +0x4c, 0xc0, /* X XX XX */ +0x45, 0x80, /* X X XX */ +0x65, 0x80, /* XX X XX */ +0x3b, 0x00, /* XXX XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0d, 0xc0, /* XX XXX */ +0x1a, 0x60, /* XX X XX */ +0x1a, 0x20, /* XX X X */ +0x33, 0x20, /* XX XX X */ +0x31, 0xc0, /* XX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '&' */ +0x00, 0x00, /* */ +0x07, 0x00, /* XXX */ +0x0f, 0x80, /* XXXXX */ +0x18, 0xc0, /* XX XX */ +0x18, 0xc0, /* XX XX */ +0x18, 0xc0, /* XX XX */ +0x0f, 0x80, /* XXXXX */ +0x1e, 0x00, /* XXXX */ +0x3e, 0x00, /* XXXXX */ +0x77, 0x00, /* XXX XXX */ +0x63, 0x60, /* XX XX XX */ +0x61, 0xe0, /* XX XXXX */ +0x61, 0xc0, /* XX XXX */ +0x61, 0x80, /* XX XX */ +0x3f, 0xe0, /* XXXXXXXXX */ +0x1e, 0x60, /* XXXX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* ''' */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x1e, 0x00, /* XXXX */ +0x1e, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x10, 0x00, /* X */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '(' */ +0x00, 0x00, /* */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x01, 0x80, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* ')' */ +0x00, 0x00, /* */ +0x18, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '*' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x66, 0x60, /* XX XX XX */ +0x76, 0xe0, /* XXX XX XXX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x76, 0xe0, /* XXX XX XXX */ +0x66, 0x60, /* XX XX XX */ +0x06, 0x00, /* XX */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '+' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* ',' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x1e, 0x00, /* XXXX */ +0x1e, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x10, 0x00, /* X */ +0x00, 0x00, /* */ + +/* '-' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '.' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x1e, 0x00, /* XXXX */ +0x1e, 0x00, /* XXXX */ +0x0c, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '/' */ +0x00, 0x00, /* */ +0x00, 0x60, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x01, 0x80, /* XX */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '0' */ +0x00, 0x00, /* */ +0x07, 0x00, /* XXX */ +0x0f, 0x80, /* XXXXX */ +0x11, 0x80, /* X XX */ +0x10, 0xc0, /* X XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0x80, /* XX X */ +0x18, 0x80, /* XX X */ +0x1f, 0x00, /* XXXXX */ +0x0e, 0x00, /* XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '1' */ +0x00, 0x00, /* */ +0x02, 0x00, /* X */ +0x06, 0x00, /* XX */ +0x0e, 0x00, /* XXX */ +0x1e, 0x00, /* XXXX */ +0x36, 0x00, /* XX XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x3f, 0xc0, /* XXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '2' */ +0x00, 0x00, /* */ +0x1f, 0x00, /* XXXXX */ +0x3f, 0x80, /* XXXXXXX */ +0x61, 0xc0, /* XX XXX */ +0x40, 0xc0, /* X XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x30, 0x20, /* XX X */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '3' */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x1f, 0xc0, /* XXXXXXX */ +0x20, 0xe0, /* X XXX */ +0x40, 0x60, /* X XX */ +0x00, 0x60, /* XX */ +0x00, 0xe0, /* XXX */ +0x07, 0xc0, /* XXXXX */ +0x0f, 0xc0, /* XXXXXX */ +0x00, 0xe0, /* XXX */ +0x00, 0x60, /* XX */ +0x00, 0x60, /* XX */ +0x40, 0x60, /* X XX */ +0x60, 0x40, /* XX X */ +0x3f, 0x80, /* XXXXXXX */ +0x1f, 0x00, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '4' */ +0x00, 0x00, /* */ +0x01, 0x80, /* XX */ +0x03, 0x80, /* XXX */ +0x03, 0x80, /* XXX */ +0x05, 0x80, /* X XX */ +0x05, 0x80, /* X XX */ +0x09, 0x80, /* X XX */ +0x09, 0x80, /* X XX */ +0x11, 0x80, /* X XX */ +0x11, 0x80, /* X XX */ +0x21, 0x80, /* X XX */ +0x3f, 0xe0, /* XXXXXXXXX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x01, 0x80, /* XX */ +0x01, 0x80, /* XX */ +0x01, 0x80, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '5' */ +0x00, 0x00, /* */ +0x0f, 0xc0, /* XXXXXX */ +0x0f, 0xc0, /* XXXXXX */ +0x10, 0x00, /* X */ +0x10, 0x00, /* X */ +0x20, 0x00, /* X */ +0x3f, 0x80, /* XXXXXXX */ +0x31, 0xc0, /* XX XXX */ +0x00, 0xe0, /* XXX */ +0x00, 0x60, /* XX */ +0x00, 0x60, /* XX */ +0x00, 0x60, /* XX */ +0x40, 0x60, /* X XX */ +0x60, 0x60, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '6' */ +0x00, 0x00, /* */ +0x07, 0x00, /* XXX */ +0x0c, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x67, 0x80, /* XX XXXX */ +0x6f, 0xc0, /* XX XXXXXX */ +0x70, 0xe0, /* XXX XXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x70, 0x40, /* XXX X */ +0x3f, 0x80, /* XXXXXXX */ +0x1f, 0x00, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '7' */ +0x00, 0x00, /* */ +0x1f, 0xe0, /* XXXXXXXX */ +0x3f, 0xe0, /* XXXXXXXXX */ +0x60, 0x40, /* XX X */ +0x00, 0x40, /* X */ +0x00, 0xc0, /* XX */ +0x00, 0x80, /* X */ +0x00, 0x80, /* X */ +0x01, 0x80, /* XX */ +0x01, 0x00, /* X */ +0x01, 0x00, /* X */ +0x03, 0x00, /* XX */ +0x02, 0x00, /* X */ +0x02, 0x00, /* X */ +0x06, 0x00, /* XX */ +0x04, 0x00, /* X */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '8' */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x11, 0x80, /* X XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x18, 0x80, /* XX X */ +0x0d, 0x00, /* XX X */ +0x06, 0x00, /* XX */ +0x0b, 0x00, /* X XX */ +0x11, 0x80, /* X XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x18, 0x80, /* XX X */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '9' */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xe0, /* X XXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x70, 0xe0, /* XXX XXX */ +0x3f, 0x60, /* XXXXXX XX */ +0x1e, 0x60, /* XXXX XX */ +0x00, 0x60, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x01, 0x80, /* XX */ +0x07, 0x00, /* XXX */ +0x3c, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* ':' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x1e, 0x00, /* XXXX */ +0x1e, 0x00, /* XXXX */ +0x0c, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x1e, 0x00, /* XXXX */ +0x1e, 0x00, /* XXXX */ +0x0c, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* ';' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x1e, 0x00, /* XXXX */ +0x1e, 0x00, /* XXXX */ +0x0c, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x1e, 0x00, /* XXXX */ +0x1e, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x10, 0x00, /* X */ +0x00, 0x00, /* */ + +/* '<' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x60, /* XX */ +0x01, 0xc0, /* XXX */ +0x07, 0x00, /* XXX */ +0x1c, 0x00, /* XXX */ +0x70, 0x00, /* XXX */ +0x70, 0x00, /* XXX */ +0x1c, 0x00, /* XXX */ +0x07, 0x00, /* XXX */ +0x01, 0xc0, /* XXX */ +0x00, 0x60, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '=' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '>' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x60, 0x00, /* XX */ +0x38, 0x00, /* XXX */ +0x0e, 0x00, /* XXX */ +0x03, 0x80, /* XXX */ +0x00, 0xe0, /* XXX */ +0x00, 0xe0, /* XXX */ +0x03, 0x80, /* XXX */ +0x0e, 0x00, /* XXX */ +0x38, 0x00, /* XXX */ +0x60, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '?' */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x1f, 0x80, /* XXXXXX */ +0x39, 0xc0, /* XXX XXX */ +0x20, 0xc0, /* X XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '@' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x3f, 0xc0, /* XXXXXXXX */ +0x30, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x67, 0x20, /* XX XXX X */ +0x6f, 0xa0, /* XX XXXXX X */ +0x6c, 0xa0, /* XX XX X X */ +0x6c, 0xa0, /* XX XX X X */ +0x67, 0xe0, /* XX XXXXXX */ +0x60, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x3f, 0xe0, /* XXXXXXXXX */ +0x0f, 0xe0, /* XXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'A' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0b, 0x00, /* X XX */ +0x0b, 0x00, /* X XX */ +0x09, 0x00, /* X X */ +0x11, 0x80, /* X XX */ +0x11, 0x80, /* X XX */ +0x10, 0x80, /* X X */ +0x3f, 0xc0, /* XXXXXXXX */ +0x20, 0xc0, /* X XX */ +0x20, 0x40, /* X X */ +0x40, 0x60, /* X XX */ +0x40, 0x60, /* X XX */ +0xe0, 0xf0, /* XXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'B' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xff, 0x00, /* XXXXXXXX */ +0x60, 0x80, /* XX X */ +0x60, 0xc0, /* XX XX */ +0x60, 0xc0, /* XX XX */ +0x60, 0xc0, /* XX XX */ +0x61, 0x80, /* XX XX */ +0x7f, 0x80, /* XXXXXXXX */ +0x60, 0xc0, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0xc0, /* XX XX */ +0xff, 0x80, /* XXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'C' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0xc0, /* XXXXXX */ +0x10, 0x60, /* X XX */ +0x20, 0x20, /* X X */ +0x20, 0x00, /* X */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x20, 0x00, /* X */ +0x30, 0x20, /* XX X */ +0x18, 0x40, /* XX X */ +0x0f, 0x80, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'D' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xff, 0x00, /* XXXXXXXX */ +0x61, 0xc0, /* XX XXX */ +0x60, 0xc0, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x40, /* XX X */ +0x61, 0x80, /* XX XX */ +0xfe, 0x00, /* XXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'E' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x7f, 0xc0, /* XXXXXXXXX */ +0x30, 0x40, /* XX X */ +0x30, 0x40, /* XX X */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x80, /* XX X */ +0x3f, 0x80, /* XXXXXXX */ +0x30, 0x80, /* XX X */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x20, /* XX X */ +0x30, 0x20, /* XX X */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'F' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x7f, 0xc0, /* XXXXXXXXX */ +0x30, 0x40, /* XX X */ +0x30, 0x40, /* XX X */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x80, /* XX X */ +0x3f, 0x80, /* XXXXXXX */ +0x30, 0x80, /* XX X */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x78, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'G' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0xc0, /* XXXXXX */ +0x10, 0x60, /* X XX */ +0x20, 0x20, /* X X */ +0x20, 0x00, /* X */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x61, 0xf0, /* XX XXXXX */ +0x60, 0x60, /* XX XX */ +0x20, 0x60, /* X XX */ +0x30, 0x60, /* XX XX */ +0x18, 0x60, /* XX XX */ +0x0f, 0x80, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'H' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xf0, 0xf0, /* XXXX XXXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0xf0, 0xf0, /* XXXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'I' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0x80, /* XXXXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'J' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0x80, /* XXXXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x04, 0x00, /* X */ +0x38, 0x00, /* XXX */ +0x30, 0x00, /* XX */ +0x00, 0x00, /* */ + +/* 'K' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xf0, 0xe0, /* XXXX XXX */ +0x61, 0x80, /* XX XX */ +0x63, 0x00, /* XX XX */ +0x66, 0x00, /* XX XX */ +0x6c, 0x00, /* XX XX */ +0x78, 0x00, /* XXXX */ +0x78, 0x00, /* XXXX */ +0x7c, 0x00, /* XXXXX */ +0x6e, 0x00, /* XX XXX */ +0x67, 0x00, /* XX XXX */ +0x63, 0x80, /* XX XXX */ +0x61, 0xc0, /* XX XXX */ +0x60, 0xe0, /* XX XXX */ +0xf0, 0x70, /* XXXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'L' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x78, 0x00, /* XXXX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x20, /* XX X */ +0x30, 0x20, /* XX X */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'M' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xe0, 0x70, /* XXX XXX */ +0x60, 0xe0, /* XX XXX */ +0x70, 0xe0, /* XXX XXX */ +0x70, 0xe0, /* XXX XXX */ +0x70, 0xe0, /* XXX XXX */ +0x59, 0x60, /* X XX X XX */ +0x59, 0x60, /* X XX X XX */ +0x59, 0x60, /* X XX X XX */ +0x4d, 0x60, /* X XX X XX */ +0x4e, 0x60, /* X XXX XX */ +0x4e, 0x60, /* X XXX XX */ +0x44, 0x60, /* X X XX */ +0x44, 0x60, /* X X XX */ +0xe4, 0xf0, /* XXX X XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'N' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xc0, 0x70, /* XX XXX */ +0x60, 0x20, /* XX X */ +0x70, 0x20, /* XXX X */ +0x78, 0x20, /* XXXX X */ +0x58, 0x20, /* X XX X */ +0x4c, 0x20, /* X XX X */ +0x46, 0x20, /* X XX X */ +0x47, 0x20, /* X XXX X */ +0x43, 0x20, /* X XX X */ +0x41, 0xa0, /* X XX X */ +0x40, 0xe0, /* X XXX */ +0x40, 0xe0, /* X XXX */ +0x40, 0x60, /* X XX */ +0xe0, 0x30, /* XXX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'O' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xc0, /* X XX */ +0x20, 0x60, /* X XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x20, 0x40, /* X X */ +0x30, 0x40, /* XX X */ +0x18, 0x80, /* XX X */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'P' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x7f, 0x80, /* XXXXXXXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x37, 0x80, /* XX XXXX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x78, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'Q' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xc0, /* X XX */ +0x20, 0x60, /* X XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x30, 0x40, /* XX X */ +0x38, 0x40, /* XXX X */ +0x1f, 0x80, /* XXXXXX */ +0x0e, 0x00, /* XXX */ +0x1f, 0x00, /* XXXXX */ +0x23, 0x90, /* X XXX X */ +0x01, 0xe0, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'R' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xff, 0x00, /* XXXXXXXX */ +0x61, 0x80, /* XX XX */ +0x60, 0xc0, /* XX XX */ +0x60, 0xc0, /* XX XX */ +0x60, 0xc0, /* XX XX */ +0x60, 0x80, /* XX X */ +0x7f, 0x00, /* XXXXXXX */ +0x7c, 0x00, /* XXXXX */ +0x6e, 0x00, /* XX XXX */ +0x67, 0x00, /* XX XXX */ +0x63, 0x80, /* XX XXX */ +0x61, 0xc0, /* XX XXX */ +0x60, 0xe0, /* XX XXX */ +0xf0, 0x70, /* XXXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'S' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0xe0, /* XXXXXXXX */ +0x30, 0x60, /* XX XX */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x70, 0x00, /* XXX */ +0x3c, 0x00, /* XXXX */ +0x1e, 0x00, /* XXXX */ +0x07, 0x80, /* XXXX */ +0x01, 0xc0, /* XXX */ +0x00, 0xe0, /* XXX */ +0x40, 0x60, /* X XX */ +0x40, 0x60, /* X XX */ +0x60, 0xc0, /* XX XX */ +0x7f, 0x80, /* XXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'T' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x46, 0x20, /* X XX X */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'U' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xf0, 0x70, /* XXXX XXX */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x70, 0x40, /* XXX X */ +0x3f, 0xc0, /* XXXXXXXX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'V' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xe0, 0xe0, /* XXX XXX */ +0x60, 0x40, /* XX X */ +0x30, 0x80, /* XX X */ +0x30, 0x80, /* XX X */ +0x30, 0x80, /* XX X */ +0x19, 0x00, /* XX X */ +0x19, 0x00, /* XX X */ +0x19, 0x00, /* XX X */ +0x0a, 0x00, /* X X */ +0x0e, 0x00, /* XXX */ +0x0e, 0x00, /* XXX */ +0x04, 0x00, /* X */ +0x04, 0x00, /* X */ +0x04, 0x00, /* X */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'W' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xfe, 0xf0, /* XXXXXXX XXXX */ +0x66, 0x20, /* XX XX X */ +0x66, 0x20, /* XX XX X */ +0x66, 0x20, /* XX XX X */ +0x76, 0x20, /* XXX XX X */ +0x77, 0x40, /* XXX XXX X */ +0x33, 0x40, /* XX XX X */ +0x37, 0x40, /* XX XXX X */ +0x3b, 0xc0, /* XXX XXXX */ +0x3b, 0x80, /* XXX XXX */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'X' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xf0, 0x70, /* XXXX XXX */ +0x60, 0x20, /* XX X */ +0x30, 0x40, /* XX X */ +0x38, 0x80, /* XXX X */ +0x18, 0x80, /* XX X */ +0x0d, 0x00, /* XX X */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0b, 0x00, /* X XX */ +0x11, 0x80, /* X XX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xc0, /* X XX */ +0x40, 0x60, /* X XX */ +0xe0, 0xf0, /* XXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'Y' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xf0, 0x70, /* XXXX XXX */ +0x60, 0x20, /* XX X */ +0x30, 0x40, /* XX X */ +0x18, 0x80, /* XX X */ +0x18, 0x80, /* XX X */ +0x0d, 0x00, /* XX X */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'Z' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x3f, 0xe0, /* XXXXXXXXX */ +0x20, 0xc0, /* X XX */ +0x00, 0xc0, /* XX */ +0x01, 0x80, /* XX */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x18, 0x20, /* XX X */ +0x3f, 0xe0, /* XXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '[' */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x0f, 0x80, /* XXXXX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0f, 0x80, /* XXXXX */ +0x0f, 0x80, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '\' */ +0x00, 0x00, /* */ +0x60, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x01, 0x80, /* XX */ +0x01, 0x80, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0x60, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* ']' */ +0x00, 0x00, /* */ +0x1f, 0x00, /* XXXXX */ +0x1f, 0x00, /* XXXXX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x1f, 0x00, /* XXXXX */ +0x1f, 0x00, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '^' */ +0x00, 0x00, /* */ +0x04, 0x00, /* X */ +0x0e, 0x00, /* XXX */ +0x1b, 0x00, /* XX XX */ +0x31, 0x80, /* XX XX */ +0x60, 0xc0, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '_' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xff, 0xf0, /* XXXXXXXXXXXX */ +0xff, 0xf0, /* XXXXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '`' */ +0x00, 0x00, /* */ +0x01, 0x00, /* X */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x07, 0x80, /* XXXX */ +0x07, 0x80, /* XXXX */ +0x03, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'a' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x18, 0xc0, /* XX XX */ +0x10, 0xc0, /* X XX */ +0x03, 0xc0, /* XXXX */ +0x1c, 0xc0, /* XXX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x1e, 0xe0, /* XXXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'b' */ +0x00, 0x00, /* */ +0x20, 0x00, /* X */ +0x60, 0x00, /* XX */ +0xe0, 0x00, /* XXX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x67, 0x80, /* XX XXXX */ +0x6f, 0xc0, /* XX XXXXXX */ +0x70, 0xe0, /* XXX XXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x70, 0x60, /* XXX XX */ +0x78, 0xc0, /* XXXX XX */ +0x4f, 0x80, /* X XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'c' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0x80, /* XXXXXX */ +0x31, 0xc0, /* XX XXX */ +0x20, 0xc0, /* X XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x70, 0x40, /* XXX X */ +0x30, 0xc0, /* XX XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'd' */ +0x00, 0x00, /* */ +0x00, 0x60, /* XX */ +0x00, 0xe0, /* XXX */ +0x00, 0x60, /* XX */ +0x00, 0x60, /* XX */ +0x00, 0x60, /* XX */ +0x0f, 0x60, /* XXXX XX */ +0x31, 0xe0, /* XX XXXX */ +0x20, 0xe0, /* X XXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x70, 0xe0, /* XXX XXX */ +0x39, 0x60, /* XXX X XX */ +0x1e, 0x70, /* XXXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'e' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x30, 0xc0, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x18, 0x60, /* XX XX */ +0x0f, 0x80, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'f' */ +0x00, 0x00, /* */ +0x03, 0x80, /* XXX */ +0x04, 0xc0, /* X XX */ +0x04, 0xc0, /* X XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x3f, 0x80, /* XXXXXXX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x1e, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'g' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0x20, /* XXXXX X */ +0x31, 0xe0, /* XX XXXX */ +0x60, 0xc0, /* XX XX */ +0x60, 0xc0, /* XX XX */ +0x60, 0xc0, /* XX XX */ +0x31, 0x80, /* XX XX */ +0x3f, 0x00, /* XXXXXX */ +0x60, 0x00, /* XX */ +0x7f, 0xc0, /* XXXXXXXXX */ +0x3f, 0xe0, /* XXXXXXXXX */ +0x20, 0x60, /* X XX */ +0x40, 0x20, /* X X */ +0x40, 0x20, /* X X */ +0x7f, 0xc0, /* XXXXXXXXX */ +0x3f, 0x80, /* XXXXXXX */ +0x00, 0x00, /* */ + +/* 'h' */ +0x00, 0x00, /* */ +0x10, 0x00, /* X */ +0x30, 0x00, /* XX */ +0x70, 0x00, /* XXX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x37, 0x80, /* XX XXXX */ +0x39, 0xc0, /* XXX XXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x79, 0xe0, /* XXXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'i' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1e, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'j' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x03, 0xc0, /* XXXX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x20, 0xc0, /* X XX */ +0x30, 0xc0, /* XX XX */ +0x38, 0x80, /* XXX X */ +0x1f, 0x00, /* XXXXX */ +0x0e, 0x00, /* XXX */ +0x00, 0x00, /* */ + +/* 'k' */ +0x00, 0x00, /* */ +0x60, 0x00, /* XX */ +0xe0, 0x00, /* XXX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x61, 0xc0, /* XX XXX */ +0x63, 0x00, /* XX XX */ +0x66, 0x00, /* XX XX */ +0x7c, 0x00, /* XXXXX */ +0x78, 0x00, /* XXXX */ +0x7c, 0x00, /* XXXXX */ +0x6e, 0x00, /* XX XXX */ +0x67, 0x00, /* XX XXX */ +0x63, 0x80, /* XX XXX */ +0xf1, 0xe0, /* XXXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'l' */ +0x00, 0x00, /* */ +0x1e, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'm' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xdd, 0xc0, /* XX XXX XXX */ +0x6e, 0xe0, /* XX XXX XXX */ +0x66, 0x60, /* XX XX XX */ +0x66, 0x60, /* XX XX XX */ +0x66, 0x60, /* XX XX XX */ +0x66, 0x60, /* XX XX XX */ +0x66, 0x60, /* XX XX XX */ +0x66, 0x60, /* XX XX XX */ +0x66, 0x60, /* XX XX XX */ +0xef, 0x70, /* XXX XXXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'n' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x27, 0x80, /* X XXXX */ +0x79, 0xc0, /* XXXX XXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x79, 0xe0, /* XXXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'o' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xe0, /* X XXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x70, 0x40, /* XXX X */ +0x38, 0x80, /* XXX X */ +0x1f, 0x00, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'p' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xef, 0x80, /* XXX XXXXX */ +0x71, 0xc0, /* XXX XXX */ +0x60, 0xe0, /* XX XXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x40, /* XX X */ +0x70, 0x80, /* XXX X */ +0x7f, 0x00, /* XXXXXXX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0xf0, 0x00, /* XXXX */ +0x00, 0x00, /* */ + +/* 'q' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x20, /* XXXX X */ +0x11, 0xe0, /* X XXXX */ +0x20, 0xe0, /* X XXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x70, 0x60, /* XXX XX */ +0x38, 0xe0, /* XXX XXX */ +0x1f, 0xe0, /* XXXXXXXX */ +0x00, 0x60, /* XX */ +0x00, 0x60, /* XX */ +0x00, 0x60, /* XX */ +0x00, 0x60, /* XX */ +0x00, 0xf0, /* XXXX */ +0x00, 0x00, /* */ + +/* 'r' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x73, 0x80, /* XXX XXX */ +0x34, 0xc0, /* XX X XX */ +0x38, 0xc0, /* XXX XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x78, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 's' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0xc0, /* XXXXXXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0x40, /* XX X */ +0x38, 0x00, /* XXX */ +0x1e, 0x00, /* XXXX */ +0x07, 0x80, /* XXXX */ +0x01, 0xc0, /* XXX */ +0x20, 0xc0, /* X XX */ +0x30, 0xc0, /* XX XX */ +0x3f, 0x80, /* XXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 't' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x04, 0x00, /* X */ +0x04, 0x00, /* X */ +0x0c, 0x00, /* XX */ +0x7f, 0xc0, /* XXXXXXXXX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x0c, 0x20, /* XX X */ +0x0e, 0x40, /* XXX X */ +0x07, 0x80, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'u' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x79, 0xe0, /* XXXX XXXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x1e, 0x60, /* XXXX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'v' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xf0, 0x70, /* XXXX XXX */ +0x60, 0x20, /* XX X */ +0x30, 0x40, /* XX X */ +0x30, 0x40, /* XX X */ +0x18, 0x80, /* XX X */ +0x18, 0x80, /* XX X */ +0x0d, 0x00, /* XX X */ +0x0d, 0x00, /* XX X */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'w' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xff, 0x70, /* XXXXXXXX XXX */ +0x66, 0x20, /* XX XX X */ +0x66, 0x20, /* XX XX X */ +0x66, 0x20, /* XX XX X */ +0x37, 0x40, /* XX XXX X */ +0x3b, 0x40, /* XXX XX X */ +0x3b, 0x40, /* XXX XX X */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'x' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xf8, 0xf0, /* XXXXX XXXX */ +0x70, 0x40, /* XXX X */ +0x38, 0x80, /* XXX X */ +0x1d, 0x00, /* XXX X */ +0x0e, 0x00, /* XXX */ +0x07, 0x00, /* XXX */ +0x0b, 0x80, /* X XXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xe0, /* X XXX */ +0xf1, 0xf0, /* XXXX XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 'y' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xf0, 0xf0, /* XXXX XXXX */ +0x60, 0x20, /* XX X */ +0x30, 0x40, /* XX X */ +0x30, 0x40, /* XX X */ +0x18, 0x80, /* XX X */ +0x18, 0x80, /* XX X */ +0x0d, 0x00, /* XX X */ +0x0d, 0x00, /* XX X */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x04, 0x00, /* X */ +0x0c, 0x00, /* XX */ +0x08, 0x00, /* X */ +0x78, 0x00, /* XXXX */ +0x70, 0x00, /* XXX */ +0x00, 0x00, /* */ + +/* 'z' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x60, 0xe0, /* XX XXX */ +0x41, 0xc0, /* X XXX */ +0x03, 0x80, /* XXX */ +0x07, 0x00, /* XXX */ +0x0e, 0x00, /* XXX */ +0x1c, 0x00, /* XXX */ +0x38, 0x20, /* XXX X */ +0x70, 0x60, /* XXX XX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '{' */ +0x00, 0x00, /* */ +0x03, 0x80, /* XXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x38, 0x00, /* XXX */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x03, 0x80, /* XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '|' */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ + +/* '}' */ +0x00, 0x00, /* */ +0x1c, 0x00, /* XXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x01, 0xc0, /* XXX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1c, 0x00, /* XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* '~' */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1c, 0x20, /* XXX X */ +0x3e, 0x60, /* XXXXX XX */ +0x67, 0xc0, /* XX XXXXX */ +0x43, 0x80, /* X XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xa0 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xa1 */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xa2 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x36, 0xc0, /* XX XX XX */ +0x26, 0xc0, /* X XX XX */ +0x66, 0x00, /* XX XX */ +0x66, 0x00, /* XX XX */ +0x66, 0x00, /* XX XX */ +0x66, 0x00, /* XX XX */ +0x76, 0x40, /* XXX XX X */ +0x36, 0xc0, /* XX XX XX */ +0x1f, 0x80, /* XXXXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xa3 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x1c, 0xc0, /* XXX XX */ +0x18, 0xc0, /* XX XX */ +0x18, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x7e, 0x00, /* XXXXXX */ +0x7e, 0x00, /* XXXXXX */ +0x18, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x3e, 0x20, /* XXXXX X */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x61, 0xc0, /* XX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xa4 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x60, 0x60, /* XX XX */ +0x2f, 0x40, /* X XXXX X */ +0x1f, 0x80, /* XXXXXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x1f, 0x80, /* XXXXXX */ +0x2f, 0x40, /* X XXXX X */ +0x60, 0x60, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xa5 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x0f, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x1f, 0x80, /* XXXXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xa6 */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ + +/* 0xa7 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0x00, /* XXXXX */ +0x31, 0x80, /* XX XX */ +0x31, 0x80, /* XX XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x1f, 0x00, /* XXXXX */ +0x31, 0x80, /* XX XX */ +0x31, 0x80, /* XX XX */ +0x1f, 0x00, /* XXXXX */ +0x01, 0x80, /* XX */ +0x01, 0x80, /* XX */ +0x31, 0x80, /* XX XX */ +0x31, 0x80, /* XX XX */ +0x1f, 0x00, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xa8 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xa9 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0x80, /* XXXXXX */ +0x20, 0x40, /* X X */ +0x4f, 0x20, /* X XXXX X */ +0x59, 0xa0, /* X XX XX X */ +0x58, 0x20, /* X XX X */ +0x58, 0x20, /* X XX X */ +0x59, 0xa0, /* X XX XX X */ +0x4f, 0x20, /* X XXXX X */ +0x20, 0x40, /* X X */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xaa */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0x00, /* XXXXX */ +0x31, 0x80, /* XX XX */ +0x01, 0x80, /* XX */ +0x07, 0x80, /* XXXX */ +0x19, 0x80, /* XX XX */ +0x31, 0x80, /* XX XX */ +0x31, 0x80, /* XX XX */ +0x33, 0x80, /* XX XXX */ +0x1d, 0xc0, /* XXX XXX */ +0x00, 0x00, /* */ +0x3f, 0xc0, /* XXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xab */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x60, /* XX XX */ +0x0c, 0xc0, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x33, 0x00, /* XX XX */ +0x66, 0x00, /* XX XX */ +0x33, 0x00, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x0c, 0xc0, /* XX XX */ +0x06, 0x60, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xac */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x3f, 0xc0, /* XXXXXXXX */ +0x3f, 0xc0, /* XXXXXXXX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xad */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xae */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0x80, /* XXXXXX */ +0x20, 0x40, /* X X */ +0x5f, 0x20, /* X XXXXX X */ +0x59, 0xa0, /* X XX XX X */ +0x59, 0xa0, /* X XX XX X */ +0x5f, 0x20, /* X XXXXX X */ +0x59, 0xa0, /* X XX XX X */ +0x59, 0xa0, /* X XX XX X */ +0x20, 0x40, /* X X */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xaf */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0x80, /* XXXXXX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xb0 */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xb1 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xb2 */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x1f, 0x80, /* XXXXXX */ +0x31, 0x80, /* XX XX */ +0x21, 0x80, /* X XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x18, 0x40, /* XX X */ +0x3f, 0xc0, /* XXXXXXXX */ +0x3f, 0xc0, /* XXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xb3 */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x1b, 0x80, /* XX XXX */ +0x21, 0x80, /* X XX */ +0x01, 0x80, /* XX */ +0x0f, 0x00, /* XXXX */ +0x03, 0x80, /* XXX */ +0x01, 0x80, /* XX */ +0x31, 0x80, /* XX XX */ +0x3f, 0x80, /* XXXXXXX */ +0x1f, 0x00, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xb4 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xb5 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x36, 0xe0, /* XX XX XXX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xb6 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0xf0, /* XXXXXXXXX */ +0x3c, 0xc0, /* XXXX XX */ +0x7c, 0xc0, /* XXXXX XX */ +0x7c, 0xc0, /* XXXXX XX */ +0x7c, 0xc0, /* XXXXX XX */ +0x3c, 0xc0, /* XXXX XX */ +0x1c, 0xc0, /* XXX XX */ +0x0c, 0xc0, /* XX XX */ +0x0c, 0xc0, /* XX XX */ +0x0c, 0xc0, /* XX XX */ +0x0c, 0xc0, /* XX XX */ +0x0c, 0xc0, /* XX XX */ +0x0c, 0xc0, /* XX XX */ +0x1c, 0xe0, /* XXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xb7 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x0f, 0x00, /* XXXX */ +0x0f, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xb8 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x01, 0x80, /* XX */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xb9 */ +0x00, 0x00, /* */ +0x02, 0x00, /* X */ +0x06, 0x00, /* XX */ +0x0e, 0x00, /* XXX */ +0x16, 0x00, /* X XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xba */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x07, 0x00, /* XXX */ +0x19, 0x80, /* XX XX */ +0x10, 0xc0, /* X XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0x80, /* XX X */ +0x19, 0x80, /* XX XX */ +0x0e, 0x00, /* XXX */ +0x00, 0x00, /* */ +0x3f, 0xc0, /* XXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xbb */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x66, 0x00, /* XX XX */ +0x33, 0x00, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x0c, 0xc0, /* XX XX */ +0x06, 0x60, /* XX XX */ +0x0c, 0xc0, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x33, 0x00, /* XX XX */ +0x66, 0x00, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xbc */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x10, 0x00, /* X */ +0x30, 0x00, /* XX */ +0x10, 0x00, /* X */ +0x10, 0x40, /* X X */ +0x10, 0x80, /* X X */ +0x11, 0x00, /* X X */ +0x3a, 0x40, /* XXX X X */ +0x04, 0xc0, /* X XX */ +0x09, 0x40, /* X X X */ +0x12, 0x40, /* X X X */ +0x24, 0x40, /* X X X */ +0x47, 0xe0, /* X XXXXXX */ +0x00, 0x40, /* X */ +0x00, 0x40, /* X */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xbd */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x10, 0x00, /* X */ +0x30, 0x00, /* XX */ +0x10, 0x00, /* X */ +0x10, 0x40, /* X X */ +0x10, 0x80, /* X X */ +0x11, 0x00, /* X X */ +0x3a, 0x00, /* XXX X */ +0x05, 0xc0, /* X XXX */ +0x0a, 0x20, /* X X X */ +0x10, 0x20, /* X X */ +0x20, 0xc0, /* X XX */ +0x41, 0x00, /* X X */ +0x02, 0x00, /* X */ +0x03, 0xe0, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xbe */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x38, 0x00, /* XXX */ +0x44, 0x00, /* X X */ +0x04, 0x00, /* X */ +0x18, 0x40, /* XX X */ +0x04, 0x80, /* X X */ +0x45, 0x00, /* X X X */ +0x3a, 0x40, /* XXX X X */ +0x04, 0xc0, /* X XX */ +0x09, 0x40, /* X X X */ +0x12, 0x40, /* X X X */ +0x24, 0x40, /* X X X */ +0x47, 0xe0, /* X XXXXXX */ +0x00, 0x40, /* X */ +0x00, 0x40, /* X */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xbf */ +0x00, 0x00, /* */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x03, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x18, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x40, /* XX X */ +0x39, 0xc0, /* XXX XXX */ +0x1f, 0x80, /* XXXXXX */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xc0 */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0b, 0x00, /* X XX */ +0x0b, 0x00, /* X XX */ +0x19, 0x80, /* XX XX */ +0x11, 0x80, /* X XX */ +0x3f, 0xc0, /* XXXXXXXX */ +0x20, 0xc0, /* X XX */ +0x60, 0x60, /* XX XX */ +0x40, 0x60, /* X XX */ +0xe0, 0xf0, /* XXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xc1 */ +0x00, 0x00, /* */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0b, 0x00, /* X XX */ +0x0b, 0x00, /* X XX */ +0x19, 0x80, /* XX XX */ +0x11, 0x80, /* X XX */ +0x3f, 0xc0, /* XXXXXXXX */ +0x20, 0xc0, /* X XX */ +0x60, 0x60, /* XX XX */ +0x40, 0x60, /* X XX */ +0xe0, 0xf0, /* XXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xc2 */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x0f, 0x00, /* XXXX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0b, 0x00, /* X XX */ +0x0b, 0x00, /* X XX */ +0x19, 0x80, /* XX XX */ +0x11, 0x80, /* X XX */ +0x3f, 0xc0, /* XXXXXXXX */ +0x20, 0xc0, /* X XX */ +0x60, 0x60, /* XX XX */ +0x40, 0x60, /* X XX */ +0xe0, 0xf0, /* XXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xc3 */ +0x00, 0x00, /* */ +0x1c, 0x40, /* XXX X */ +0x3f, 0xc0, /* XXXXXXXX */ +0x23, 0x80, /* X XXX */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0b, 0x00, /* X XX */ +0x0b, 0x00, /* X XX */ +0x19, 0x80, /* XX XX */ +0x11, 0x80, /* X XX */ +0x3f, 0xc0, /* XXXXXXXX */ +0x20, 0xc0, /* X XX */ +0x60, 0x60, /* XX XX */ +0x40, 0x60, /* X XX */ +0xe0, 0xf0, /* XXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xc4 */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x04, 0x00, /* X */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0b, 0x00, /* X XX */ +0x0b, 0x00, /* X XX */ +0x19, 0x80, /* XX XX */ +0x11, 0x80, /* X XX */ +0x3f, 0xc0, /* XXXXXXXX */ +0x20, 0xc0, /* X XX */ +0x60, 0x60, /* XX XX */ +0x40, 0x60, /* X XX */ +0xe0, 0xf0, /* XXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xc5 */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x19, 0x80, /* XX XX */ +0x0f, 0x00, /* XXXX */ +0x04, 0x00, /* X */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0b, 0x00, /* X XX */ +0x0b, 0x00, /* X XX */ +0x19, 0x80, /* XX XX */ +0x11, 0x80, /* X XX */ +0x3f, 0xc0, /* XXXXXXXX */ +0x20, 0xc0, /* X XX */ +0x60, 0x60, /* XX XX */ +0x40, 0x60, /* X XX */ +0xe0, 0xf0, /* XXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xc6 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x03, 0xf0, /* XXXXXX */ +0x07, 0x10, /* XXX X */ +0x07, 0x10, /* XXX X */ +0x0b, 0x00, /* X XX */ +0x0b, 0x00, /* X XX */ +0x0b, 0x20, /* X XX X */ +0x13, 0xe0, /* X XXXXX */ +0x13, 0x20, /* X XX X */ +0x3f, 0x00, /* XXXXXX */ +0x23, 0x00, /* X XX */ +0x23, 0x00, /* X XX */ +0x43, 0x10, /* X XX X */ +0x43, 0x10, /* X XX X */ +0xe7, 0xf0, /* XXX XXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xc7 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0xc0, /* XXXXXX */ +0x10, 0x60, /* X XX */ +0x20, 0x20, /* X X */ +0x20, 0x00, /* X */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x20, 0x00, /* X */ +0x30, 0x20, /* XX X */ +0x18, 0x40, /* XX X */ +0x0f, 0x80, /* XXXXX */ +0x06, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x01, 0x80, /* XX */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xc8 */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x01, 0x00, /* X */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x30, 0x20, /* XX X */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x80, /* XX X */ +0x3f, 0x80, /* XXXXXXX */ +0x30, 0x80, /* XX X */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x20, /* XX X */ +0x30, 0x20, /* XX X */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xc9 */ +0x00, 0x00, /* */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x08, 0x00, /* X */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x30, 0x20, /* XX X */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x80, /* XX X */ +0x3f, 0x80, /* XXXXXXX */ +0x30, 0x80, /* XX X */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x20, /* XX X */ +0x30, 0x20, /* XX X */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xca */ +0x00, 0x00, /* */ +0x07, 0x00, /* XXX */ +0x0d, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x30, 0x20, /* XX X */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x80, /* XX X */ +0x3f, 0x80, /* XXXXXXX */ +0x30, 0x80, /* XX X */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x20, /* XX X */ +0x30, 0x20, /* XX X */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xcb */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x30, 0x20, /* XX X */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x80, /* XX X */ +0x3f, 0x80, /* XXXXXXX */ +0x30, 0x80, /* XX X */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x20, /* XX X */ +0x30, 0x20, /* XX X */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xcc */ +0x00, 0x00, /* */ +0x18, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x02, 0x00, /* X */ +0x1f, 0x80, /* XXXXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xcd */ +0x00, 0x00, /* */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x04, 0x00, /* X */ +0x1f, 0x80, /* XXXXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xce */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x0f, 0x00, /* XXXX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x1f, 0x80, /* XXXXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xcf */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x1f, 0x80, /* XXXXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xd0 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x7f, 0x00, /* XXXXXXX */ +0x31, 0xc0, /* XX XXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0x60, /* XX XX */ +0xfc, 0x60, /* XXXXXX XX */ +0xfc, 0x60, /* XXXXXX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0x40, /* XX X */ +0x31, 0x80, /* XX XX */ +0x7e, 0x00, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xd1 */ +0x00, 0x00, /* */ +0x1c, 0x40, /* XXX X */ +0x3f, 0xc0, /* XXXXXXXX */ +0x23, 0x80, /* X XXX */ +0xc0, 0x70, /* XX XXX */ +0x60, 0x20, /* XX X */ +0x70, 0x20, /* XXX X */ +0x78, 0x20, /* XXXX X */ +0x5c, 0x20, /* X XXX X */ +0x4e, 0x20, /* X XXX X */ +0x47, 0x20, /* X XXX X */ +0x43, 0xa0, /* X XXX X */ +0x41, 0xe0, /* X XXXX */ +0x40, 0xe0, /* X XXX */ +0x40, 0x60, /* X XX */ +0xe0, 0x30, /* XXX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xd2 */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x01, 0x00, /* X */ +0x0f, 0x80, /* XXXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xc0, /* X XX */ +0x20, 0x60, /* X XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x20, 0x40, /* X X */ +0x30, 0x40, /* XX X */ +0x18, 0x80, /* XX X */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xd3 */ +0x00, 0x00, /* */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x04, 0x00, /* X */ +0x0f, 0x80, /* XXXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xc0, /* X XX */ +0x20, 0x60, /* X XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x20, 0x40, /* X X */ +0x30, 0x40, /* XX X */ +0x18, 0x80, /* XX X */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xd4 */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x09, 0x00, /* X X */ +0x10, 0x80, /* X X */ +0x0f, 0x00, /* XXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xc0, /* X XX */ +0x20, 0x60, /* X XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x20, 0x40, /* X X */ +0x30, 0x40, /* XX X */ +0x18, 0x80, /* XX X */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xd5 */ +0x00, 0x00, /* */ +0x1c, 0x60, /* XXX XX */ +0x3f, 0xc0, /* XXXXXXXX */ +0x22, 0x80, /* X X X */ +0x0f, 0x80, /* XXXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xc0, /* X XX */ +0x20, 0x60, /* X XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x20, 0x40, /* X X */ +0x30, 0x40, /* XX X */ +0x18, 0x80, /* XX X */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xd6 */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xc0, /* X XX */ +0x20, 0x60, /* X XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x20, 0x40, /* X X */ +0x30, 0x40, /* XX X */ +0x18, 0x80, /* XX X */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xd7 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x60, 0x60, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x0f, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x0f, 0x00, /* XXXX */ +0x19, 0x80, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xd8 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x80, /* X */ +0x0f, 0x80, /* XXXXX */ +0x11, 0xc0, /* X XXX */ +0x21, 0xc0, /* X XXX */ +0x22, 0x60, /* X X XX */ +0x62, 0x60, /* XX X XX */ +0x62, 0x60, /* XX X XX */ +0x64, 0x60, /* XX X XX */ +0x64, 0x60, /* XX X XX */ +0x64, 0x60, /* XX X XX */ +0x28, 0x40, /* X X X */ +0x38, 0x40, /* XXX X */ +0x18, 0x80, /* XX X */ +0x1f, 0x00, /* XXXXX */ +0x10, 0x00, /* X */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xd9 */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0xe3, 0x30, /* XXX XX XX */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x70, 0x40, /* XXX X */ +0x3f, 0xc0, /* XXXXXXXX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xda */ +0x00, 0x00, /* */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0xe6, 0x30, /* XXX XX XX */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x70, 0x40, /* XXX X */ +0x3f, 0xc0, /* XXXXXXXX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xdb */ +0x00, 0x00, /* */ +0x07, 0x00, /* XXX */ +0x0d, 0x80, /* XX XX */ +0xe8, 0xb0, /* XXX X X XX */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x70, 0x40, /* XXX X */ +0x3f, 0xc0, /* XXXXXXXX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xdc */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0xe0, 0x30, /* XXX XX */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x60, 0x20, /* XX X */ +0x70, 0x40, /* XXX X */ +0x3f, 0xc0, /* XXXXXXXX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xdd */ +0x00, 0x00, /* */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0xe6, 0x70, /* XXX XX XXX */ +0x60, 0x20, /* XX X */ +0x30, 0x40, /* XX X */ +0x18, 0x80, /* XX X */ +0x0d, 0x00, /* XX X */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xde */ +0x00, 0x00, /* */ +0x78, 0x00, /* XXXX */ +0x30, 0x00, /* XX */ +0x3f, 0x80, /* XXXXXXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x3f, 0x80, /* XXXXXXX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x78, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xdf */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x19, 0x80, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x31, 0x80, /* XX XX */ +0x37, 0x80, /* XX XXXX */ +0x31, 0x80, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x31, 0x80, /* XX XX */ +0x77, 0x00, /* XXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xe0 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x18, 0xc0, /* XX XX */ +0x10, 0xc0, /* X XX */ +0x03, 0xc0, /* XXXX */ +0x1c, 0xc0, /* XXX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x1e, 0xe0, /* XXXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xe1 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x18, 0xc0, /* XX XX */ +0x10, 0xc0, /* X XX */ +0x03, 0xc0, /* XXXX */ +0x1c, 0xc0, /* XXX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x1e, 0xe0, /* XXXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xe2 */ +0x00, 0x00, /* */ +0x02, 0x00, /* X */ +0x07, 0x00, /* XXX */ +0x0d, 0x80, /* XX XX */ +0x18, 0xc0, /* XX XX */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x18, 0xc0, /* XX XX */ +0x10, 0xc0, /* X XX */ +0x03, 0xc0, /* XXXX */ +0x1c, 0xc0, /* XXX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x1e, 0xe0, /* XXXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xe3 */ +0x00, 0x00, /* */ +0x0e, 0x40, /* XXX X */ +0x1f, 0xc0, /* XXXXXXX */ +0x13, 0x80, /* X XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x18, 0xc0, /* XX XX */ +0x10, 0xc0, /* X XX */ +0x03, 0xc0, /* XXXX */ +0x1c, 0xc0, /* XXX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x1e, 0xe0, /* XXXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xe4 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x18, 0xc0, /* XX XX */ +0x10, 0xc0, /* X XX */ +0x03, 0xc0, /* XXXX */ +0x1c, 0xc0, /* XXX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x1e, 0xe0, /* XXXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xe5 */ +0x00, 0x00, /* */ +0x07, 0x00, /* XXX */ +0x0d, 0x80, /* XX XX */ +0x0d, 0x80, /* XX XX */ +0x07, 0x00, /* XXX */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x18, 0xc0, /* XX XX */ +0x10, 0xc0, /* X XX */ +0x03, 0xc0, /* XXXX */ +0x1c, 0xc0, /* XXX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x1e, 0xe0, /* XXXX XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xe6 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x3d, 0xe0, /* XXXX XXXX */ +0x66, 0x30, /* XX XX XX */ +0x46, 0x30, /* X XX XX */ +0x06, 0x30, /* XX XX */ +0x3f, 0xf0, /* XXXXXXXXXX */ +0x66, 0x00, /* XX XX */ +0xc6, 0x00, /* XX XX */ +0xc6, 0x00, /* XX XX */ +0xe7, 0x30, /* XXX XXX XX */ +0x7d, 0xe0, /* XXXXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xe7 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1f, 0x80, /* XXXXXX */ +0x31, 0xc0, /* XX XXX */ +0x20, 0xc0, /* X XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x70, 0x40, /* XXX X */ +0x30, 0xc0, /* XX XX */ +0x1f, 0x80, /* XXXXXX */ +0x06, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x01, 0x80, /* XX */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xe8 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x30, 0xc0, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x18, 0x60, /* XX XX */ +0x0f, 0x80, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xe9 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x30, 0xc0, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x18, 0x60, /* XX XX */ +0x0f, 0x80, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xea */ +0x00, 0x00, /* */ +0x02, 0x00, /* X */ +0x07, 0x00, /* XXX */ +0x0d, 0x80, /* XX XX */ +0x18, 0xc0, /* XX XX */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x30, 0xc0, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x18, 0x60, /* XX XX */ +0x0f, 0x80, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xeb */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x00, /* XXXX */ +0x30, 0xc0, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x60, 0x00, /* XX */ +0x60, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x18, 0x60, /* XX XX */ +0x0f, 0x80, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xec */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x18, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x1e, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xed */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x1e, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xee */ +0x00, 0x00, /* */ +0x04, 0x00, /* X */ +0x0e, 0x00, /* XXX */ +0x1b, 0x00, /* XX XX */ +0x31, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x1e, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xef */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x1e, 0x00, /* XXXX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x1f, 0x80, /* XXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xf0 */ +0x00, 0x00, /* */ +0x1c, 0x00, /* XXX */ +0x06, 0xc0, /* XX XX */ +0x03, 0x00, /* XX */ +0x0d, 0x80, /* XX XX */ +0x00, 0xc0, /* XX */ +0x00, 0xc0, /* XX */ +0x00, 0x60, /* XX */ +0x0f, 0x60, /* XXXX XX */ +0x18, 0xe0, /* XX XXX */ +0x30, 0x60, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x18, 0xc0, /* XX XX */ +0x0f, 0x00, /* XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xf1 */ +0x00, 0x00, /* */ +0x1c, 0x40, /* XXX X */ +0x3f, 0xc0, /* XXXXXXXX */ +0x23, 0x80, /* X XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x27, 0x80, /* X XXXX */ +0x79, 0xc0, /* XXXX XXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x79, 0xe0, /* XXXX XXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xf2 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x03, 0x00, /* XX */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xe0, /* X XXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x70, 0x40, /* XXX X */ +0x38, 0x80, /* XXX X */ +0x1f, 0x00, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xf3 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xe0, /* X XXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x70, 0x40, /* XXX X */ +0x38, 0x80, /* XXX X */ +0x1f, 0x00, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xf4 */ +0x00, 0x00, /* */ +0x02, 0x00, /* X */ +0x07, 0x00, /* XXX */ +0x0d, 0x80, /* XX XX */ +0x18, 0xc0, /* XX XX */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xe0, /* X XXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x70, 0x40, /* XXX X */ +0x38, 0x80, /* XXX X */ +0x1f, 0x00, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xf5 */ +0x00, 0x00, /* */ +0x1c, 0x40, /* XXX X */ +0x3f, 0xc0, /* XXXXXXXX */ +0x23, 0x80, /* X XXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xe0, /* X XXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x70, 0x40, /* XXX X */ +0x38, 0x80, /* XXX X */ +0x1f, 0x00, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xf6 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x0f, 0x80, /* XXXXX */ +0x11, 0xc0, /* X XXX */ +0x20, 0xe0, /* X XXX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x60, 0x60, /* XX XX */ +0x70, 0x40, /* XXX X */ +0x38, 0x80, /* XXX X */ +0x1f, 0x00, /* XXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xf7 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x7f, 0xe0, /* XXXXXXXXXX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xf8 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x10, /* X */ +0x0f, 0xa0, /* XXXXX X */ +0x11, 0xc0, /* X XXX */ +0x20, 0xe0, /* X XXX */ +0x61, 0x60, /* XX X XX */ +0x62, 0x60, /* XX X XX */ +0x64, 0x60, /* XX X XX */ +0x68, 0x60, /* XX X XX */ +0x70, 0x40, /* XXX X */ +0x38, 0x80, /* XXX X */ +0x5f, 0x00, /* X XXXXX */ +0x80, 0x00, /* X */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xf9 */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x18, 0x00, /* XX */ +0x0c, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x79, 0xe0, /* XXXX XXXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x1e, 0x60, /* XXXX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xfa */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0x79, 0xe0, /* XXXX XXXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x1e, 0x60, /* XXXX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xfb */ +0x00, 0x00, /* */ +0x02, 0x00, /* X */ +0x07, 0x00, /* XXX */ +0x0d, 0x80, /* XX XX */ +0x18, 0xc0, /* XX XX */ +0x00, 0x00, /* */ +0x79, 0xe0, /* XXXX XXXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x1e, 0x60, /* XXXX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xfc */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x79, 0xe0, /* XXXX XXXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x39, 0xc0, /* XXX XXX */ +0x1e, 0x60, /* XXXX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ + +/* 0xfd */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x01, 0x80, /* XX */ +0x03, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x00, 0x00, /* */ +0xf0, 0xf0, /* XXXX XXXX */ +0x60, 0x20, /* XX X */ +0x30, 0x40, /* XX X */ +0x30, 0x40, /* XX X */ +0x18, 0x80, /* XX X */ +0x18, 0x80, /* XX X */ +0x0d, 0x00, /* XX X */ +0x0d, 0x00, /* XX X */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x04, 0x00, /* X */ +0x0c, 0x00, /* XX */ +0x08, 0x00, /* X */ +0x78, 0x00, /* XXXX */ +0x70, 0x00, /* XXX */ +0x00, 0x00, /* */ + +/* 0xfe */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x78, 0x00, /* XXXX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x3f, 0x80, /* XXXXXXX */ +0x30, 0xc0, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0x60, /* XX XX */ +0x30, 0xc0, /* XX XX */ +0x3f, 0x80, /* XXXXXXX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x30, 0x00, /* XX */ +0x78, 0x00, /* XXXX */ +0x00, 0x00, /* */ + +/* 0xff */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0x19, 0x80, /* XX XX */ +0x19, 0x80, /* XX XX */ +0x00, 0x00, /* */ +0x00, 0x00, /* */ +0xf0, 0xf0, /* XXXX XXXX */ +0x60, 0x20, /* XX X */ +0x30, 0x40, /* XX X */ +0x30, 0x40, /* XX X */ +0x18, 0x80, /* XX X */ +0x18, 0x80, /* XX X */ +0x0d, 0x00, /* XX X */ +0x0d, 0x00, /* XX X */ +0x06, 0x00, /* XX */ +0x06, 0x00, /* XX */ +0x04, 0x00, /* X */ +0x0c, 0x00, /* XX */ +0x08, 0x00, /* X */ +0x78, 0x00, /* XXXX */ +0x70, 0x00, /* XXX */ +0x00, 0x00, /* */ + +}; + +unsigned char *ENCODINGS[256] = { + FONTDATA+748, + FONTDATA+0, + FONTDATA+44, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+88, + FONTDATA+132, + FONTDATA+176, + FONTDATA+220, + FONTDATA+484, + FONTDATA+264, + FONTDATA+308, + FONTDATA+352, + FONTDATA+396, + FONTDATA+440, + FONTDATA+528, + FONTDATA+572, + FONTDATA+616, + FONTDATA+660, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+44+748, + FONTDATA+88+748, + FONTDATA+132+748, + FONTDATA+176+748, + FONTDATA+220+748, + FONTDATA+264+748, + FONTDATA+308+748, + FONTDATA+352+748, + FONTDATA+396+748, + FONTDATA+440+748, + FONTDATA+484+748, + FONTDATA+528+748, + FONTDATA+572+748, + FONTDATA+616+748, + FONTDATA+660+748, + FONTDATA+704+748, + FONTDATA+748+748, + FONTDATA+792+748, + FONTDATA+836+748, + FONTDATA+880+748, + FONTDATA+924+748, + FONTDATA+968+748, + FONTDATA+1012+748, + FONTDATA+1056+748, + FONTDATA+1100+748, + FONTDATA+1144+748, + FONTDATA+1188+748, + FONTDATA+1232+748, + FONTDATA+1276+748, + FONTDATA+1320+748, + FONTDATA+1364+748, + FONTDATA+1408+748, + FONTDATA+1452+748, + FONTDATA+1496+748, + FONTDATA+1540+748, + FONTDATA+1584+748, + FONTDATA+1628+748, + FONTDATA+1672+748, + FONTDATA+1716+748, + FONTDATA+1760+748, + FONTDATA+1804+748, + FONTDATA+1848+748, + FONTDATA+1892+748, + FONTDATA+1936+748, + FONTDATA+1980+748, + FONTDATA+2024+748, + FONTDATA+2068+748, + FONTDATA+2112+748, + FONTDATA+2156+748, + FONTDATA+2200+748, + FONTDATA+2244+748, + FONTDATA+2288+748, + FONTDATA+2332+748, + FONTDATA+2376+748, + FONTDATA+2420+748, + FONTDATA+2464+748, + FONTDATA+2508+748, + FONTDATA+2552+748, + FONTDATA+2596+748, + FONTDATA+2640+748, + FONTDATA+2684+748, + FONTDATA+2728+748, + FONTDATA+2772+748, + FONTDATA+2816+748, + FONTDATA+2860+748, + FONTDATA+2904+748, + FONTDATA+2948+748, + FONTDATA+2992+748, + FONTDATA+3036+748, + FONTDATA+3080+748, + FONTDATA+3124+748, + FONTDATA+3168+748, + FONTDATA+3212+748, + FONTDATA+3256+748, + FONTDATA+3300+748, + FONTDATA+3344+748, + FONTDATA+3388+748, + FONTDATA+3432+748, + FONTDATA+3476+748, + FONTDATA+3520+748, + FONTDATA+3564+748, + FONTDATA+3608+748, + FONTDATA+3652+748, + FONTDATA+3696+748, + FONTDATA+3740+748, + FONTDATA+3784+748, + FONTDATA+3828+748, + FONTDATA+3872+748, + FONTDATA+3916+748, + FONTDATA+3960+748, + FONTDATA+4004+748, + FONTDATA+4048+748, + FONTDATA+4092+748, + FONTDATA+4136+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+748, + FONTDATA+4180+748, + FONTDATA+4224+748, + FONTDATA+4268+748, + FONTDATA+4312+748, + FONTDATA+4356+748, + FONTDATA+4400+748, + FONTDATA+4444+748, + FONTDATA+4488+748, + FONTDATA+4532+748, + FONTDATA+4576+748, + FONTDATA+4620+748, + FONTDATA+4664+748, + FONTDATA+4708+748, + FONTDATA+4752+748, + FONTDATA+4796+748, + FONTDATA+4840+748, + FONTDATA+4884+748, + FONTDATA+4928+748, + FONTDATA+4972+748, + FONTDATA+5016+748, + FONTDATA+5060+748, + FONTDATA+5104+748, + FONTDATA+5148+748, + FONTDATA+5192+748, + FONTDATA+5236+748, + FONTDATA+5280+748, + FONTDATA+5324+748, + FONTDATA+5368+748, + FONTDATA+5412+748, + FONTDATA+5456+748, + FONTDATA+5500+748, + FONTDATA+5544+748, + FONTDATA+5588+748, + FONTDATA+5632+748, + FONTDATA+5676+748, + FONTDATA+5720+748, + FONTDATA+5764+748, + FONTDATA+5808+748, + FONTDATA+5852+748, + FONTDATA+5896+748, + FONTDATA+5940+748, + FONTDATA+5984+748, + FONTDATA+6028+748, + FONTDATA+6072+748, + FONTDATA+6116+748, + FONTDATA+6160+748, + FONTDATA+6204+748, + FONTDATA+6248+748, + FONTDATA+6292+748, + FONTDATA+6336+748, + FONTDATA+6380+748, + FONTDATA+6424+748, + FONTDATA+6468+748, + FONTDATA+6512+748, + FONTDATA+6556+748, + FONTDATA+6600+748, + FONTDATA+6644+748, + FONTDATA+6688+748, + FONTDATA+6732+748, + FONTDATA+6776+748, + FONTDATA+6820+748, + FONTDATA+6864+748, + FONTDATA+6908+748, + FONTDATA+6952+748, + FONTDATA+6996+748, + FONTDATA+7480+748, + FONTDATA+7084+748, + FONTDATA+7128+748, + FONTDATA+7172+748, + FONTDATA+7216+748, + FONTDATA+7260+748, + FONTDATA+7304+748, + FONTDATA+7348+748, + FONTDATA+7392+748, + FONTDATA+7436+748, + FONTDATA+7480+748, + FONTDATA+7524+748, + FONTDATA+7568+748, + FONTDATA+7612+748, + FONTDATA+7656+748, + FONTDATA+7700+748, + FONTDATA+7744+748, + FONTDATA+7788+748, + FONTDATA+7832+748, + FONTDATA+7876+748, + FONTDATA+7920+748, + FONTDATA+7964+748, + FONTDATA+8008+748, + FONTDATA+8052+748, + FONTDATA+8096+748, + FONTDATA+8140+748, + FONTDATA+8184+748, + FONTDATA+8228+748, + FONTDATA+8272+748, + FONTDATA+8316+748, + FONTDATA+8360+748, +}; + +bitmap_data_t font_data_12x22 = { + 12, 22, + FONTDATA, + ENCODINGS, +}; +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/uts/common/io/6x10.c Thu Jan 12 18:17:46 2006 -0800 @@ -0,0 +1,2799 @@ +/* + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include <sys/types.h> +#include <sys/param.h> /* for NULL */ +#include <sys/font.h> + + +/* BEGIN CSTYLED */ +/* This is a derivation of a BDF font from the X consolidation */ +/* COMMENT $XConsortium: 6x10.bdf,v 1.7 94/04/10 20:47:50 gildea Exp $ */ +/* COMMENT Upper half by gildea April 1994 */ +/* FONT -Misc-Fixed-Medium-R-Normal--10-100-75-75-C-60-ISO8859-1 */ +/* Copyright notice from .bdf file: */ +/* COPYRIGHT "Public domain terminal emulator font. Share and enjoy." */ + + +static unsigned char FONTDATA[] = { + +/* FONTDATA + 0x0000 */ +0x00, /* */ +0x10, /* X */ +0x38, /* XXX */ +0x38, /* XXX */ +0x7c, /* XXXXX */ +0x38, /* XXX */ +0x38, /* XXX */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x000a */ +0x00, /* */ +0x54, /* X X X */ +0x28, /* X X */ +0x54, /* X X X */ +0x28, /* X X */ +0x54, /* X X X */ +0x28, /* X X */ +0x54, /* X X X */ +0x00, /* */ +0x00, /* */ + + +/* FONTDATA + 0x0014 */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0xf0, /* XXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x001e */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0xf0, /* XXXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ + +/* FONTDATA + 0x0028 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x1c, /* XXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ + +/* FONTDATA + 0x0032 */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x1c, /* XXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x003c */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0xfc, /* XXXXXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ + +/* FONTDATA + 0x0046 */ +0xfc, /* XXXXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0050 */ +0x00, /* */ +0x00, /* */ +0xfc, /* XXXXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x005a */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0xfc, /* XXXXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0064 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0xfc, /* XXXXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x006e */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0xfc, /* XXXXXX */ +0x00, /* */ + +/* FONTDATA + 0x0078 */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x1c, /* XXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ + +/* FONTDATA + 0x0082 */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0xf0, /* XXXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ + +/* FONTDATA + 0x008c */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0xfc, /* XXXXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0096 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0xfc, /* XXXXXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ + +/* FONTDATA + 0x00a0 */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ + +/* FONTDATA + 0x00aa */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x00b4 */ +0x00, /* */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x00, /* */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x00be */ +0x00, /* */ +0x28, /* X X */ +0x28, /* X X */ +0x28, /* X X */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x00c8 */ +0x00, /* */ +0x28, /* X X */ +0x28, /* X X */ +0x7c, /* XXXXX */ +0x28, /* X X */ +0x7c, /* XXXXX */ +0x28, /* X X */ +0x28, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x00d2 */ +0x00, /* */ +0x10, /* X */ +0x38, /* XXX */ +0x50, /* X X */ +0x38, /* XXX */ +0x14, /* X X */ +0x38, /* XXX */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x00dc */ +0x00, /* */ +0x24, /* X X */ +0x54, /* X X X */ +0x28, /* X X */ +0x10, /* X */ +0x28, /* X X */ +0x54, /* X X X */ +0x48, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x00e6 */ +0x00, /* */ +0x20, /* X */ +0x50, /* X X */ +0x50, /* X X */ +0x20, /* X */ +0x54, /* X X X */ +0x48, /* X X */ +0x34, /* XX X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x00f0 */ +0x00, /* */ +0x18, /* XX */ +0x10, /* X */ +0x20, /* X */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x00fa */ +0x00, /* */ +0x08, /* X */ +0x10, /* X */ +0x20, /* X */ +0x20, /* X */ +0x20, /* X */ +0x10, /* X */ +0x08, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0104 */ +0x00, /* */ +0x20, /* X */ +0x10, /* X */ +0x08, /* X */ +0x08, /* X */ +0x08, /* X */ +0x10, /* X */ +0x20, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x010e */ +0x00, /* */ +0x00, /* */ +0x44, /* X X */ +0x28, /* X X */ +0x7c, /* XXXXX */ +0x28, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0118 */ +0x00, /* */ +0x00, /* */ +0x10, /* X */ +0x10, /* X */ +0x7c, /* XXXXX */ +0x10, /* X */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0122 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x18, /* XX */ +0x10, /* X */ +0x20, /* X */ +0x00, /* */ + +/* FONTDATA + 0x012c */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0136 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x10, /* X */ +0x38, /* XXX */ +0x10, /* X */ +0x00, /* */ + +/* FONTDATA + 0x0140 */ +0x00, /* */ +0x04, /* X */ +0x04, /* X */ +0x08, /* X */ +0x10, /* X */ +0x20, /* X */ +0x40, /* X */ +0x40, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x014a */ +0x00, /* */ +0x10, /* X */ +0x28, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x28, /* X X */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0154 */ +0x00, /* */ +0x10, /* X */ +0x30, /* XX */ +0x50, /* X X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x015e */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x04, /* X */ +0x18, /* XX */ +0x20, /* X */ +0x40, /* X */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0168 */ +0x00, /* */ +0x7c, /* XXXXX */ +0x04, /* X */ +0x08, /* X */ +0x18, /* XX */ +0x04, /* X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0172 */ +0x00, /* */ +0x08, /* X */ +0x18, /* XX */ +0x28, /* X X */ +0x48, /* X X */ +0x7c, /* XXXXX */ +0x08, /* X */ +0x08, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x017c */ +0x00, /* */ +0x7c, /* XXXXX */ +0x40, /* X */ +0x58, /* X XX */ +0x64, /* XX X */ +0x04, /* X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0186 */ +0x00, /* */ +0x18, /* XX */ +0x20, /* X */ +0x40, /* X */ +0x58, /* X XX */ +0x64, /* XX X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0190 */ +0x00, /* */ +0x7c, /* XXXXX */ +0x04, /* X */ +0x08, /* X */ +0x08, /* X */ +0x10, /* X */ +0x20, /* X */ +0x20, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x019a */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x01a4 */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x4c, /* X XX */ +0x34, /* XX X */ +0x04, /* X */ +0x08, /* X */ +0x30, /* XX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x01ae */ +0x00, /* */ +0x00, /* */ +0x10, /* X */ +0x38, /* XXX */ +0x10, /* X */ +0x00, /* */ +0x10, /* X */ +0x38, /* XXX */ +0x10, /* X */ +0x00, /* */ + +/* FONTDATA + 0x01b8 */ +0x00, /* */ +0x00, /* */ +0x10, /* X */ +0x38, /* XXX */ +0x10, /* X */ +0x00, /* */ +0x18, /* XX */ +0x10, /* X */ +0x20, /* X */ +0x00, /* */ + +/* FONTDATA + 0x01c2 */ +0x00, /* */ +0x04, /* X */ +0x08, /* X */ +0x10, /* X */ +0x20, /* X */ +0x10, /* X */ +0x08, /* X */ +0x04, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x01cc */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x7c, /* XXXXX */ +0x00, /* */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x01d6 */ +0x00, /* */ +0x40, /* X */ +0x20, /* X */ +0x10, /* X */ +0x08, /* X */ +0x10, /* X */ +0x20, /* X */ +0x40, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x01e0 */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x08, /* X */ +0x10, /* X */ +0x10, /* X */ +0x00, /* */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x01ea */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x4c, /* X XX */ +0x54, /* X X X */ +0x58, /* X XX */ +0x40, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x01f4 */ +0x00, /* */ +0x10, /* X */ +0x28, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x01fe */ +0x00, /* */ +0x78, /* XXXX */ +0x24, /* X X */ +0x24, /* X X */ +0x38, /* XXX */ +0x24, /* X X */ +0x24, /* X X */ +0x78, /* XXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0208 */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x40, /* X */ +0x40, /* X */ +0x40, /* X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0212 */ +0x00, /* */ +0x78, /* XXXX */ +0x24, /* X X */ +0x24, /* X X */ +0x24, /* X X */ +0x24, /* X X */ +0x24, /* X X */ +0x78, /* XXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x021c */ +0x00, /* */ +0x7c, /* XXXXX */ +0x40, /* X */ +0x40, /* X */ +0x78, /* XXXX */ +0x40, /* X */ +0x40, /* X */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0226 */ +0x00, /* */ +0x7c, /* XXXXX */ +0x40, /* X */ +0x40, /* X */ +0x78, /* XXXX */ +0x40, /* X */ +0x40, /* X */ +0x40, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0230 */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x40, /* X */ +0x40, /* X */ +0x4c, /* X XX */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x023a */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0244 */ +0x00, /* */ +0x38, /* XXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x024e */ +0x00, /* */ +0x1c, /* XXX */ +0x04, /* X */ +0x04, /* X */ +0x04, /* X */ +0x04, /* X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0258 */ +0x00, /* */ +0x44, /* X X */ +0x48, /* X X */ +0x50, /* X X */ +0x60, /* XX */ +0x50, /* X X */ +0x48, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0262 */ +0x00, /* */ +0x40, /* X */ +0x40, /* X */ +0x40, /* X */ +0x40, /* X */ +0x40, /* X */ +0x40, /* X */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x026c */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x6c, /* XX XX */ +0x54, /* X X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0276 */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x64, /* XX X */ +0x54, /* X X X */ +0x4c, /* X XX */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0280 */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x028a */ +0x00, /* */ +0x78, /* XXXX */ +0x44, /* X X */ +0x44, /* X X */ +0x78, /* XXXX */ +0x40, /* X */ +0x40, /* X */ +0x40, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0294 */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x54, /* X X X */ +0x38, /* XXX */ +0x04, /* X */ +0x00, /* */ + +/* FONTDATA + 0x029e */ +0x00, /* */ +0x78, /* XXXX */ +0x44, /* X X */ +0x44, /* X X */ +0x78, /* XXXX */ +0x50, /* X X */ +0x48, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x02a8 */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x40, /* X */ +0x38, /* XXX */ +0x04, /* X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x02b2 */ +0x00, /* */ +0x7c, /* XXXXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x02bc */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x02c6 */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x28, /* X X */ +0x28, /* X X */ +0x28, /* X X */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x02d0 */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x54, /* X X X */ +0x54, /* X X X */ +0x6c, /* XX XX */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x02da */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x28, /* X X */ +0x10, /* X */ +0x28, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x02e4 */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x28, /* X X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x02ee */ +0x00, /* */ +0x7c, /* XXXXX */ +0x04, /* X */ +0x08, /* X */ +0x10, /* X */ +0x20, /* X */ +0x40, /* X */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x02f8 */ +0x00, /* */ +0x38, /* XXX */ +0x20, /* X */ +0x20, /* X */ +0x20, /* X */ +0x20, /* X */ +0x20, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0302 */ +0x00, /* */ +0x40, /* X */ +0x40, /* X */ +0x20, /* X */ +0x10, /* X */ +0x08, /* X */ +0x04, /* X */ +0x04, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x030c */ +0x00, /* */ +0x38, /* XXX */ +0x08, /* X */ +0x08, /* X */ +0x08, /* X */ +0x08, /* X */ +0x08, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0316 */ +0x00, /* */ +0x10, /* X */ +0x28, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0320 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x7c, /* XXXXX */ +0x00, /* */ + +/* FONTDATA + 0x032a */ +0x00, /* */ +0x30, /* XX */ +0x10, /* X */ +0x08, /* X */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0334 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x38, /* XXX */ +0x04, /* X */ +0x3c, /* XXXX */ +0x44, /* X X */ +0x3c, /* XXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x033e */ +0x00, /* */ +0x40, /* X */ +0x40, /* X */ +0x58, /* X XX */ +0x64, /* XX X */ +0x44, /* X X */ +0x64, /* XX X */ +0x58, /* X XX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0348 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x40, /* X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0352 */ +0x00, /* */ +0x04, /* X */ +0x04, /* X */ +0x34, /* XX X */ +0x4c, /* X XX */ +0x44, /* X X */ +0x4c, /* X XX */ +0x34, /* XX X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x035c */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x40, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0366 */ +0x00, /* */ +0x18, /* XX */ +0x24, /* X X */ +0x20, /* X */ +0x78, /* XXXX */ +0x20, /* X */ +0x20, /* X */ +0x20, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0370 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x34, /* XX X */ +0x48, /* X X */ +0x30, /* XX */ +0x40, /* X */ +0x38, /* XXX */ +0x44, /* X X */ +0x38, /* XXX */ + +/* FONTDATA + 0x037a */ +0x00, /* */ +0x40, /* X */ +0x40, /* X */ +0x58, /* X XX */ +0x64, /* XX X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0384 */ +0x00, /* */ +0x10, /* X */ +0x00, /* */ +0x30, /* XX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x038e */ +0x00, /* */ +0x08, /* X */ +0x00, /* */ +0x18, /* XX */ +0x08, /* X */ +0x08, /* X */ +0x08, /* X */ +0x48, /* X X */ +0x48, /* X X */ +0x30, /* XX */ + +/* FONTDATA + 0x0398 */ +0x00, /* */ +0x40, /* X */ +0x40, /* X */ +0x44, /* X X */ +0x48, /* X X */ +0x70, /* XXX */ +0x48, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x03a2 */ +0x00, /* */ +0x30, /* XX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x03ac */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x68, /* XX X */ +0x54, /* X X X */ +0x54, /* X X X */ +0x54, /* X X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x03b6 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x58, /* X XX */ +0x64, /* XX X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x03c0 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x03ca */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x58, /* X XX */ +0x64, /* XX X */ +0x64, /* XX X */ +0x58, /* X XX */ +0x40, /* X */ +0x40, /* X */ +0x40, /* X */ + +/* FONTDATA + 0x03d4 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x34, /* XX X */ +0x4c, /* X XX */ +0x4c, /* X XX */ +0x34, /* XX X */ +0x04, /* X */ +0x04, /* X */ +0x04, /* X */ + +/* FONTDATA + 0x03de */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x58, /* X XX */ +0x64, /* XX X */ +0x40, /* X */ +0x40, /* X */ +0x40, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x03e8 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x38, /* XXX */ +0x40, /* X */ +0x38, /* XXX */ +0x04, /* X */ +0x78, /* XXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x03f2 */ +0x00, /* */ +0x20, /* X */ +0x20, /* X */ +0x78, /* XXXX */ +0x20, /* X */ +0x20, /* X */ +0x24, /* X X */ +0x18, /* XX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x03fc */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x4c, /* X XX */ +0x34, /* XX X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0406 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x28, /* X X */ +0x28, /* X X */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0410 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x54, /* X X X */ +0x54, /* X X X */ +0x28, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x041a */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x44, /* X X */ +0x28, /* X X */ +0x10, /* X */ +0x28, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0424 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x4c, /* X XX */ +0x34, /* XX X */ +0x04, /* X */ +0x44, /* X X */ +0x38, /* XXX */ + +/* FONTDATA + 0x042e */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x7c, /* XXXXX */ +0x08, /* X */ +0x10, /* X */ +0x20, /* X */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0438 */ +0x00, /* */ +0x0c, /* XX */ +0x10, /* X */ +0x08, /* X */ +0x30, /* XX */ +0x08, /* X */ +0x10, /* X */ +0x0c, /* XX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0442 */ +0x00, /* */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x044c */ +0x00, /* */ +0x60, /* XX */ +0x10, /* X */ +0x20, /* X */ +0x18, /* XX */ +0x20, /* X */ +0x10, /* X */ +0x60, /* XX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0456 */ +0x00, /* */ +0x24, /* X X */ +0x54, /* X X X */ +0x48, /* X X */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0460 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x046a */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0474 */ +0x00, /* */ +0x10, /* X */ +0x00, /* */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x047e */ +0x00, /* */ +0x00, /* */ +0x10, /* X */ +0x3c, /* XXXX */ +0x50, /* X X */ +0x50, /* X X */ +0x50, /* X X */ +0x3c, /* XXXX */ +0x10, /* X */ +0x00, /* */ + +/* FONTDATA + 0x0488 */ +0x00, /* */ +0x18, /* XX */ +0x24, /* X X */ +0x20, /* X */ +0x70, /* XXX */ +0x20, /* X */ +0x24, /* X X */ +0x58, /* X XX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0492 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x44, /* X X */ +0x38, /* XXX */ +0x28, /* X X */ +0x38, /* XXX */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x049c */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x28, /* X X */ +0x10, /* X */ +0x7c, /* XXXXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x00, /* */ + +/* FONTDATA + 0x04a6 */ +0x00, /* */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x00, /* */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x04b0 */ +0x00, /* */ +0x38, /* XXX */ +0x40, /* X */ +0x70, /* XXX */ +0x48, /* X X */ +0x24, /* X X */ +0x1c, /* XXX */ +0x04, /* X */ +0x38, /* XXX */ +0x00, /* */ + +/* FONTDATA + 0x04ba */ +0x28, /* X X */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x04c4 */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x54, /* X X X */ +0x64, /* XX X */ +0x54, /* X X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x04ce */ +0x00, /* */ +0x38, /* XXX */ +0x48, /* X X */ +0x58, /* X XX */ +0x28, /* X X */ +0x00, /* */ +0x78, /* XXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x04d8 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x24, /* X X */ +0x48, /* X X */ +0x90, /* X X */ +0x48, /* X X */ +0x24, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x04e2 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x78, /* XXXX */ +0x08, /* X */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x04ec */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x04f6 */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x74, /* XXX X */ +0x64, /* XX X */ +0x64, /* XX X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0500 */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x050a */ +0x00, /* */ +0x10, /* X */ +0x28, /* X X */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0514 */ +0x00, /* */ +0x00, /* */ +0x10, /* X */ +0x10, /* X */ +0x7c, /* XXXXX */ +0x10, /* X */ +0x10, /* X */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x051e */ +0x30, /* XX */ +0x48, /* X X */ +0x10, /* X */ +0x20, /* X */ +0x78, /* XXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0528 */ +0x70, /* XXX */ +0x08, /* X */ +0x30, /* XX */ +0x08, /* X */ +0x70, /* XXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0532 */ +0x18, /* XX */ +0x30, /* XX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x053c */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x64, /* XX X */ +0x58, /* X XX */ +0x40, /* X */ +0x00, /* */ + +/* FONTDATA + 0x0546 */ +0x00, /* */ +0x3c, /* XXXX */ +0x74, /* XXX X */ +0x74, /* XXX X */ +0x34, /* XX X */ +0x14, /* X X */ +0x14, /* X X */ +0x14, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0550 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x055a */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x10, /* X */ +0x20, /* X */ + +/* FONTDATA + 0x0564 */ +0x10, /* X */ +0x30, /* XX */ +0x10, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x056e */ +0x00, /* */ +0x30, /* XX */ +0x48, /* X X */ +0x48, /* X X */ +0x30, /* XX */ +0x00, /* */ +0x78, /* XXXX */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0578 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x90, /* X X */ +0x48, /* X X */ +0x24, /* X X */ +0x48, /* X X */ +0x90, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0582 */ +0x40, /* X */ +0xc0, /* XX */ +0x40, /* X */ +0x40, /* X */ +0xe4, /* XXX X */ +0x0c, /* XX */ +0x14, /* X X */ +0x3c, /* XXXX */ +0x04, /* X */ +0x00, /* */ + +/* FONTDATA + 0x058c */ +0x40, /* X */ +0xc0, /* XX */ +0x40, /* X */ +0x40, /* X */ +0xe8, /* XXX X */ +0x14, /* X X */ +0x04, /* X */ +0x08, /* X */ +0x1c, /* XXX */ +0x00, /* */ + +/* FONTDATA + 0x0596 */ +0x60, /* XX */ +0x10, /* X */ +0x20, /* X */ +0x10, /* X */ +0x64, /* XX X */ +0x0c, /* XX */ +0x14, /* X X */ +0x3c, /* XXXX */ +0x04, /* X */ +0x00, /* */ + +/* FONTDATA + 0x05a0 */ +0x00, /* */ +0x10, /* X */ +0x00, /* */ +0x10, /* X */ +0x10, /* X */ +0x20, /* X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x05aa */ +0x20, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x05b4 */ +0x08, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x05be */ +0x10, /* X */ +0x28, /* X X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x05c8 */ +0x24, /* X X */ +0x58, /* X XX */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x05d2 */ +0x28, /* X X */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x05dc */ +0x10, /* X */ +0x28, /* X X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x05e6 */ +0x00, /* */ +0x3c, /* XXXX */ +0x50, /* X X */ +0x90, /* X X */ +0x9c, /* X XXX */ +0xf0, /* XXXX */ +0x90, /* X X */ +0x9c, /* X XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x05f0 */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x40, /* X */ +0x40, /* X */ +0x40, /* X */ +0x44, /* X X */ +0x38, /* XXX */ +0x10, /* X */ +0x20, /* X */ + +/* FONTDATA + 0x05fa */ +0x20, /* X */ +0x7c, /* XXXXX */ +0x40, /* X */ +0x40, /* X */ +0x78, /* XXXX */ +0x40, /* X */ +0x40, /* X */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0604 */ +0x08, /* X */ +0x7c, /* XXXXX */ +0x40, /* X */ +0x40, /* X */ +0x78, /* XXXX */ +0x40, /* X */ +0x40, /* X */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x060e */ +0x10, /* X */ +0x7c, /* XXXXX */ +0x40, /* X */ +0x40, /* X */ +0x78, /* XXXX */ +0x40, /* X */ +0x40, /* X */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0618 */ +0x28, /* X X */ +0x7c, /* XXXXX */ +0x40, /* X */ +0x40, /* X */ +0x78, /* XXXX */ +0x40, /* X */ +0x40, /* X */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0622 */ +0x20, /* X */ +0x38, /* XXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x062c */ +0x08, /* X */ +0x38, /* XXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0636 */ +0x10, /* X */ +0x38, /* XXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0640 */ +0x28, /* X X */ +0x38, /* XXX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x064a */ +0x00, /* */ +0x78, /* XXXX */ +0x24, /* X X */ +0x24, /* X X */ +0x74, /* XXX X */ +0x24, /* X X */ +0x24, /* X X */ +0x78, /* XXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0654 */ +0x18, /* XX */ +0x44, /* X X */ +0x44, /* X X */ +0x64, /* XX X */ +0x54, /* X X X */ +0x4c, /* X XX */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x065e */ +0x20, /* X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0668 */ +0x08, /* X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0672 */ +0x10, /* X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x067c */ +0x38, /* XXX */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0686 */ +0x28, /* X X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0690 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x44, /* X X */ +0x28, /* X X */ +0x10, /* X */ +0x28, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x069a */ +0x00, /* */ +0x38, /* XXX */ +0x4c, /* X XX */ +0x4c, /* X XX */ +0x54, /* X X X */ +0x64, /* XX X */ +0x64, /* XX X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x06a4 */ +0x20, /* X */ +0x54, /* X X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x06ae */ +0x08, /* X */ +0x54, /* X X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x06b8 */ +0x10, /* X */ +0x6c, /* XX XX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x06c2 */ +0x28, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x06cc */ +0x08, /* X */ +0x54, /* X X X */ +0x44, /* X X */ +0x28, /* X X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x06d6 */ +0x00, /* */ +0x40, /* X */ +0x78, /* XXXX */ +0x44, /* X X */ +0x78, /* XXXX */ +0x40, /* X */ +0x40, /* X */ +0x40, /* X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x06e0 */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x78, /* XXXX */ +0x44, /* X X */ +0x44, /* X X */ +0x78, /* XXXX */ +0x40, /* X */ +0x00, /* */ + +/* FONTDATA + 0x06ea */ +0x00, /* */ +0x20, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x04, /* X */ +0x3c, /* XXXX */ +0x44, /* X X */ +0x3c, /* XXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x06f4 */ +0x00, /* */ +0x08, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x04, /* X */ +0x3c, /* XXXX */ +0x44, /* X X */ +0x3c, /* XXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x06fe */ +0x00, /* */ +0x10, /* X */ +0x28, /* X X */ +0x38, /* XXX */ +0x04, /* X */ +0x3c, /* XXXX */ +0x44, /* X X */ +0x3c, /* XXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0708 */ +0x00, /* */ +0x14, /* X X */ +0x28, /* X X */ +0x38, /* XXX */ +0x04, /* X */ +0x3c, /* XXXX */ +0x44, /* X X */ +0x3c, /* XXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0712 */ +0x00, /* */ +0x28, /* X X */ +0x00, /* */ +0x38, /* XXX */ +0x04, /* X */ +0x3c, /* XXXX */ +0x44, /* X X */ +0x3c, /* XXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x071c */ +0x10, /* X */ +0x28, /* X X */ +0x10, /* X */ +0x38, /* XXX */ +0x04, /* X */ +0x3c, /* XXXX */ +0x44, /* X X */ +0x3c, /* XXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0726 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x78, /* XXXX */ +0x14, /* X X */ +0x7c, /* XXXXX */ +0x90, /* X X */ +0x7c, /* XXXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0730 */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x40, /* X */ +0x44, /* X X */ +0x38, /* XXX */ +0x10, /* X */ +0x20, /* X */ + +/* FONTDATA + 0x073a */ +0x00, /* */ +0x20, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x40, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0744 */ +0x00, /* */ +0x08, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x40, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x074e */ +0x00, /* */ +0x10, /* X */ +0x28, /* X X */ +0x38, /* XXX */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x40, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0758 */ +0x00, /* */ +0x28, /* X X */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x7c, /* XXXXX */ +0x40, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0762 */ +0x20, /* X */ +0x10, /* X */ +0x00, /* */ +0x30, /* XX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x076c */ +0x10, /* X */ +0x20, /* X */ +0x00, /* */ +0x30, /* XX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0776 */ +0x10, /* X */ +0x28, /* X X */ +0x00, /* */ +0x30, /* XX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0780 */ +0x00, /* */ +0x28, /* X X */ +0x00, /* */ +0x30, /* XX */ +0x10, /* X */ +0x10, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x078a */ +0x00, /* */ +0x60, /* XX */ +0x18, /* XX */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0794 */ +0x00, /* */ +0x14, /* X X */ +0x28, /* X X */ +0x58, /* X XX */ +0x64, /* XX X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x079e */ +0x00, /* */ +0x20, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x07a8 */ +0x00, /* */ +0x08, /* X */ +0x10, /* X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x07b2 */ +0x00, /* */ +0x10, /* X */ +0x28, /* X X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x07bc */ +0x00, /* */ +0x14, /* X X */ +0x28, /* X X */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x07c6 */ +0x00, /* */ +0x28, /* X X */ +0x00, /* */ +0x38, /* XXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x38, /* XXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x07d0 */ +0x00, /* */ +0x00, /* */ +0x10, /* X */ +0x00, /* */ +0x7c, /* XXXXX */ +0x00, /* */ +0x10, /* X */ +0x00, /* */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x07da */ +0x00, /* */ +0x00, /* */ +0x00, /* */ +0x3c, /* XXXX */ +0x4c, /* X XX */ +0x54, /* X X X */ +0x64, /* XX X */ +0x78, /* XXXX */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x07e4 */ +0x00, /* */ +0x20, /* X */ +0x10, /* X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x4c, /* X XX */ +0x34, /* XX X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x07ee */ +0x00, /* */ +0x08, /* X */ +0x10, /* X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x4c, /* X XX */ +0x34, /* XX X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x07f8 */ +0x00, /* */ +0x10, /* X */ +0x28, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x4c, /* X XX */ +0x34, /* XX X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x0802 */ +0x00, /* */ +0x28, /* X X */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x4c, /* X XX */ +0x34, /* XX X */ +0x00, /* */ +0x00, /* */ + +/* FONTDATA + 0x080c */ +0x00, /* */ +0x08, /* X */ +0x10, /* X */ +0x44, /* X X */ +0x44, /* X X */ +0x4c, /* X XX */ +0x34, /* XX X */ +0x04, /* X */ +0x44, /* X X */ +0x38, /* XXX */ + +/* FONTDATA + 0x0816 */ +0x00, /* */ +0x00, /* */ +0x40, /* X */ +0x78, /* XXXX */ +0x44, /* X X */ +0x44, /* X X */ +0x44, /* X X */ +0x78, /* XXXX */ +0x40, /* X */ +0x40, /* X */ + +/* FONTDATA + 0x0820 */ +0x00, /* */ +0x28, /* X X */ +0x00, /* */ +0x44, /* X X */ +0x44, /* X X */ +0x4c, /* X XX */ +0x34, /* XX X */ +0x04, /* X */ +0x44, /* X X */ +0x38, /* XXX */ +}; + +static unsigned char *ENCODINGS[256] = { +/* 000 */ FONTDATA + 0x0000, +/* 001 */ FONTDATA + 0x0000, +/* 002 */ FONTDATA + 0x0000, +/* 003 */ FONTDATA + 0x0000, +/* 004 */ FONTDATA + 0x0000, +/* 005 */ FONTDATA + 0x0000, +/* 006 */ FONTDATA + 0x0000, +/* 007 */ FONTDATA + 0x0000, +/* 008 */ FONTDATA + 0x0000, +/* 009 */ FONTDATA + 0x0000, +/* 010 */ FONTDATA + 0x0000, +/* 011 */ FONTDATA + 0x0000, +/* 012 */ FONTDATA + 0x0000, +/* 013 */ FONTDATA + 0x0000, +/* 014 */ FONTDATA + 0x0000, +/* 015 */ FONTDATA + 0x0000, +/* 016 */ FONTDATA + 0x0000, +/* 017 */ FONTDATA + 0x0000, +/* 018 */ FONTDATA + 0x0000, +/* 019 */ FONTDATA + 0x0000, +/* 020 */ FONTDATA + 0x0000, +/* 021 */ FONTDATA + 0x0000, +/* 022 */ FONTDATA + 0x0000, +/* 023 */ FONTDATA + 0x0000, +/* 024 */ FONTDATA + 0x0000, +/* 025 */ FONTDATA + 0x0000, +/* 026 */ FONTDATA + 0x0000, +/* 027 */ FONTDATA + 0x0000, +/* 028 */ FONTDATA + 0x0000, +/* 029 */ FONTDATA + 0x0000, +/* 030 */ FONTDATA + 0x0000, +/* 031 */ FONTDATA + 0x0000, +/* 032 */ FONTDATA + 0x00aa, +/* 033 */ FONTDATA + 0x00b4, +/* 034 */ FONTDATA + 0x00be, +/* 035 */ FONTDATA + 0x00c8, +/* 036 */ FONTDATA + 0x00d2, +/* 037 */ FONTDATA + 0x00dc, +/* 038 */ FONTDATA + 0x00e6, +/* 039 */ FONTDATA + 0x00f0, +/* 040 */ FONTDATA + 0x00fa, +/* 041 */ FONTDATA + 0x0104, +/* 042 */ FONTDATA + 0x010e, +/* 043 */ FONTDATA + 0x0118, +/* 044 */ FONTDATA + 0x0122, +/* 045 */ FONTDATA + 0x012c, +/* 046 */ FONTDATA + 0x0136, +/* 047 */ FONTDATA + 0x0140, +/* 048 */ FONTDATA + 0x014a, +/* 049 */ FONTDATA + 0x0154, +/* 050 */ FONTDATA + 0x015e, +/* 051 */ FONTDATA + 0x0168, +/* 052 */ FONTDATA + 0x0172, +/* 053 */ FONTDATA + 0x017c, +/* 054 */ FONTDATA + 0x0186, +/* 055 */ FONTDATA + 0x0190, +/* 056 */ FONTDATA + 0x019a, +/* 057 */ FONTDATA + 0x01a4, +/* 058 */ FONTDATA + 0x01ae, +/* 059 */ FONTDATA + 0x01b8, +/* 060 */ FONTDATA + 0x01c2, +/* 061 */ FONTDATA + 0x01cc, +/* 062 */ FONTDATA + 0x01d6, +/* 063 */ FONTDATA + 0x01e0, +/* 064 */ FONTDATA + 0x01ea, +/* 065 */ FONTDATA + 0x01f4, +/* 066 */ FONTDATA + 0x01fe, +/* 067 */ FONTDATA + 0x0208, +/* 068 */ FONTDATA + 0x0212, +/* 069 */ FONTDATA + 0x021c, +/* 070 */ FONTDATA + 0x0226, +/* 071 */ FONTDATA + 0x0230, +/* 072 */ FONTDATA + 0x023a, +/* 073 */ FONTDATA + 0x0244, +/* 074 */ FONTDATA + 0x024e, +/* 075 */ FONTDATA + 0x0258, +/* 076 */ FONTDATA + 0x0262, +/* 077 */ FONTDATA + 0x026c, +/* 078 */ FONTDATA + 0x0276, +/* 079 */ FONTDATA + 0x0280, +/* 080 */ FONTDATA + 0x028a, +/* 081 */ FONTDATA + 0x0294, +/* 082 */ FONTDATA + 0x029e, +/* 083 */ FONTDATA + 0x02a8, +/* 084 */ FONTDATA + 0x02b2, +/* 085 */ FONTDATA + 0x02bc, +/* 086 */ FONTDATA + 0x02c6, +/* 087 */ FONTDATA + 0x02d0, +/* 088 */ FONTDATA + 0x02da, +/* 089 */ FONTDATA + 0x02e4, +/* 090 */ FONTDATA + 0x02ee, +/* 091 */ FONTDATA + 0x02f8, +/* 092 */ FONTDATA + 0x0302, +/* 093 */ FONTDATA + 0x030c, +/* 094 */ FONTDATA + 0x0316, +/* 095 */ FONTDATA + 0x0320, +/* 096 */ FONTDATA + 0x032a, +/* 097 */ FONTDATA + 0x0334, +/* 098 */ FONTDATA + 0x033e, +/* 099 */ FONTDATA + 0x0348, +/* 100 */ FONTDATA + 0x0352, +/* 101 */ FONTDATA + 0x035c, +/* 102 */ FONTDATA + 0x0366, +/* 103 */ FONTDATA + 0x0370, +/* 104 */ FONTDATA + 0x037a, +/* 105 */ FONTDATA + 0x0384, +/* 106 */ FONTDATA + 0x038e, +/* 107 */ FONTDATA + 0x0398, +/* 108 */ FONTDATA + 0x03a2, +/* 109 */ FONTDATA + 0x03ac, +/* 110 */ FONTDATA + 0x03b6, +/* 111 */ FONTDATA + 0x03c0, +/* 112 */ FONTDATA + 0x03ca, +/* 113 */ FONTDATA + 0x03d4, +/* 114 */ FONTDATA + 0x03de, +/* 115 */ FONTDATA + 0x03e8, +/* 116 */ FONTDATA + 0x03f2, +/* 117 */ FONTDATA + 0x03fc, +/* 118 */ FONTDATA + 0x0406, +/* 119 */ FONTDATA + 0x0410, +/* 120 */ FONTDATA + 0x041a, +/* 121 */ FONTDATA + 0x0424, +/* 122 */ FONTDATA + 0x042e, +/* 123 */ FONTDATA + 0x0438, +/* 124 */ FONTDATA + 0x0442, +/* 125 */ FONTDATA + 0x044c, +/* 126 */ FONTDATA + 0x0456, +/* 127 */ FONTDATA + 0x0000, +/* 128 */ FONTDATA + 0x0000, +/* 129 */ FONTDATA + 0x0000, +/* 130 */ FONTDATA + 0x0000, +/* 131 */ FONTDATA + 0x0000, +/* 132 */ FONTDATA + 0x0000, +/* 133 */ FONTDATA + 0x0000, +/* 134 */ FONTDATA + 0x0000, +/* 135 */ FONTDATA + 0x0000, +/* 136 */ FONTDATA + 0x0000, +/* 137 */ FONTDATA + 0x0000, +/* 138 */ FONTDATA + 0x0000, +/* 139 */ FONTDATA + 0x0000, +/* 140 */ FONTDATA + 0x0000, +/* 141 */ FONTDATA + 0x0000, +/* 142 */ FONTDATA + 0x0000, +/* 143 */ FONTDATA + 0x0000, +/* 144 */ FONTDATA + 0x0000, +/* 145 */ FONTDATA + 0x0000, +/* 146 */ FONTDATA + 0x0000, +/* 147 */ FONTDATA + 0x0000, +/* 148 */ FONTDATA + 0x0000, +/* 149 */ FONTDATA + 0x0000, +/* 150 */ FONTDATA + 0x0000, +/* 151 */ FONTDATA + 0x0000, +/* 152 */ FONTDATA + 0x0000, +/* 153 */ FONTDATA + 0x0000, +/* 154 */ FONTDATA + 0x0000, +/* 155 */ FONTDATA + 0x0000, +/* 156 */ FONTDATA + 0x0000, +/* 157 */ FONTDATA + 0x0000, +/* 158 */ FONTDATA + 0x0000, +/* 159 */ FONTDATA + 0x0000, +/* 160 */ FONTDATA + 0x0000, +/* 161 */ FONTDATA + 0x0474, +/* 162 */ FONTDATA + 0x047e, +/* 163 */ FONTDATA + 0x0488, +/* 164 */ FONTDATA + 0x0492, +/* 165 */ FONTDATA + 0x049c, +/* 166 */ FONTDATA + 0x04a6, +/* 167 */ FONTDATA + 0x04b0, +/* 168 */ FONTDATA + 0x04ba, +/* 169 */ FONTDATA + 0x04c4, +/* 170 */ FONTDATA + 0x04ce, +/* 171 */ FONTDATA + 0x04d8, +/* 172 */ FONTDATA + 0x04e2, +/* 173 */ FONTDATA + 0x04ec, +/* 174 */ FONTDATA + 0x04f6, +/* 175 */ FONTDATA + 0x0500, +/* 176 */ FONTDATA + 0x050a, +/* 177 */ FONTDATA + 0x0514, +/* 178 */ FONTDATA + 0x051e, +/* 179 */ FONTDATA + 0x0528, +/* 180 */ FONTDATA + 0x0532, +/* 181 */ FONTDATA + 0x053c, +/* 182 */ FONTDATA + 0x0546, +/* 183 */ FONTDATA + 0x0550, +/* 184 */ FONTDATA + 0x055a, +/* 185 */ FONTDATA + 0x0564, +/* 186 */ FONTDATA + 0x056e, +/* 187 */ FONTDATA + 0x0578, +/* 188 */ FONTDATA + 0x0582, +/* 189 */ FONTDATA + 0x058c, +/* 190 */ FONTDATA + 0x0596, +/* 191 */ FONTDATA + 0x05a0, +/* 192 */ FONTDATA + 0x05aa, +/* 193 */ FONTDATA + 0x05b4, +/* 194 */ FONTDATA + 0x05be, +/* 195 */ FONTDATA + 0x05c8, +/* 196 */ FONTDATA + 0x05d2, +/* 197 */ FONTDATA + 0x05dc, +/* 198 */ FONTDATA + 0x05e6, +/* 199 */ FONTDATA + 0x05f0, +/* 200 */ FONTDATA + 0x05fa, +/* 201 */ FONTDATA + 0x0604, +/* 202 */ FONTDATA + 0x060e, +/* 203 */ FONTDATA + 0x0618, +/* 204 */ FONTDATA + 0x0622, +/* 205 */ FONTDATA + 0x062c, +/* 206 */ FONTDATA + 0x0636, +/* 207 */ FONTDATA + 0x0640, +/* 208 */ FONTDATA + 0x064a, +/* 209 */ FONTDATA + 0x0654, +/* 210 */ FONTDATA + 0x065e, +/* 211 */ FONTDATA + 0x0668, +/* 212 */ FONTDATA + 0x0672, +/* 213 */ FONTDATA + 0x067c, +/* 214 */ FONTDATA + 0x0686, +/* 215 */ FONTDATA + 0x0690, +/* 216 */ FONTDATA + 0x069a, +/* 217 */ FONTDATA + 0x06a4, +/* 218 */ FONTDATA + 0x06ae, +/* 219 */ FONTDATA + 0x06b8, +/* 220 */ FONTDATA + 0x06c2, +/* 221 */ FONTDATA + 0x06cc, +/* 222 */ FONTDATA + 0x06d6, +/* 223 */ FONTDATA + 0x06e0, +/* 224 */ FONTDATA + 0x06ea, +/* 225 */ FONTDATA + 0x06f4, +/* 226 */ FONTDATA + 0x06fe, +/* 227 */ FONTDATA + 0x0708, +/* 228 */ FONTDATA + 0x0712, +/* 229 */ FONTDATA + 0x071c, +/* 230 */ FONTDATA + 0x0726, +/* 231 */ FONTDATA + 0x0730, +/* 232 */ FONTDATA + 0x073a, +/* 233 */ FONTDATA + 0x0744, +/* 234 */ FONTDATA + 0x074e, +/* 235 */ FONTDATA + 0x0758, +/* 236 */ FONTDATA + 0x0762, +/* 237 */ FONTDATA + 0x076c, +/* 238 */ FONTDATA + 0x0776, +/* 239 */ FONTDATA + 0x0780, +/* 240 */ FONTDATA + 0x078a, +/* 241 */ FONTDATA + 0x0794, +/* 242 */ FONTDATA + 0x079e, +/* 243 */ FONTDATA + 0x07a8, +/* 244 */ FONTDATA + 0x07b2, +/* 245 */ FONTDATA + 0x07bc, +/* 246 */ FONTDATA + 0x07c6, +/* 247 */ FONTDATA + 0x07d0, +/* 248 */ FONTDATA + 0x07da, +/* 249 */ FONTDATA + 0x07e4, +/* 250 */ FONTDATA + 0x07ee, +/* 251 */ FONTDATA + 0x07f8, +/* 252 */ FONTDATA + 0x0802, +/* 253 */ FONTDATA + 0x080c, +/* 254 */ FONTDATA + 0x0816, +/* 255 */ FONTDATA + 0x0820, +}; + +bitmap_data_t font_data_6x10 = { + 6, 10, /* width, height */ + FONTDATA, /* image */ + ENCODINGS /* encoding */ +}; + +
--- a/usr/src/uts/common/io/7x14.c Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/uts/common/io/7x14.c Thu Jan 12 18:17:46 2006 -0800 @@ -1,7 +1,8 @@ /* - * Copyright (c) 1995 by Sun Microsystems, Inc. - * All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. */ + #pragma ident "%Z%%M% %I% %E% SMI" #include <sys/types.h> @@ -10,6 +11,7 @@ /* BEGIN CSTYLED */ +/* This is a derivation of a BDF font from the X consolidation */ /* COMMENT */ /* COMMENT Donated by H. Kagotani <kagotani@cs.titech.ac.jp>; public domain */ /* COMMENT font from Japan */ @@ -18,7 +20,7 @@ /* Copyright notice from .bdf file: */ /* COPYRIGHT "Public domain font. Share and enjoy." */ -unsigned char FONTDATA[] = { +static unsigned char FONTDATA[] = { /* 0x01 */ 0x00, /* */ @@ -3365,7 +3367,7 @@ 0x30, /* XX */ }; -unsigned char *ENCODINGS[256] = { +static unsigned char *ENCODINGS[256] = { FONTDATA+238, FONTDATA+0, FONTDATA+14, @@ -3623,10 +3625,10 @@ FONTDATA+2898, FONTDATA+2912, }; -bitmap_data_t builtin_font_data = { - 7, 14, /* width, height */ - FONTDATA, 0, /* image, image_size */ - ENCODINGS, 0, /* encoding, encoding_size */ +bitmap_data_t font_data_7x14 = { + 7, 14, /* width, height */ + FONTDATA, /* image */ + ENCODINGS, /* encoding */ }; /* END CSTYLED */
--- a/usr/src/uts/common/io/cons.c Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/uts/common/io/cons.c Thu Jan 12 18:17:46 2006 -0800 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -19,8 +18,9 @@ * * CDDL HEADER END */ + /* - * Copyright 1987-2003 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -408,13 +408,40 @@ /* ARGSUSED */ static int +cnprivateioc(dev_t dev, int cmd, intptr_t arg, int flag, struct cred *cred, + int *rvalp) +{ + + /* currently we only support one ioctl */ + if (cmd != CONS_GETTERM) + return (EINVAL); + + /* Confirm iwscn is immediate target of cn redirection */ + if (rconsvp != wsconsvp) + return (ENODEV); + + /* + * If the redirection client is not wc, it should return + * error upon receiving the CONS_GETTERM ioctl. + * + * if it is wc, we know that the target supports the CONS_GETTERM + * ioctl, which very conviently has the exact same data + * format as this ioctl... so let's just pass it on. + */ + return (cdev_ioctl(rconsdev, CONS_GETTERM, arg, flag, cred, rvalp)); +} + +/* ARGSUSED */ +static int cnioctl(dev_t dev, int cmd, intptr_t arg, int flag, struct cred *cred, int *rvalp) { if (rconsvp == NULL) return (0); - if (rconsvp->v_stream != NULL) + if ((cmd & _CNIOC_MASK) == _CNIOC) + return (cnprivateioc(dev, cmd, arg, flag, cred, rvalp)); + else if (rconsvp->v_stream != NULL) return (strioctl(rconsvp, cmd, arg, flag, U_TO_K, cred, rvalp)); else
--- a/usr/src/uts/common/io/consconfig_dacf.c Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/uts/common/io/consconfig_dacf.c Thu Jan 12 18:17:46 2006 -0800 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -19,8 +18,9 @@ * * CDDL HEADER END */ + /* - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -100,6 +100,8 @@ #include <sys/strsubr.h> #include <sys/consdev.h> +#include <sys/console.h> +#include <sys/wscons.h> #include <sys/kbio.h> #include <sys/debug.h> #include <sys/reboot.h> @@ -120,6 +122,7 @@ #include <sys/devops.h> #include <sys/note.h> +#include <sys/tem_impl.h> #include <sys/polled_io.h> #include <sys/kmem.h> #include <sys/dacf.h> @@ -295,7 +298,7 @@ if (!l) { return; } -#endif +#endif /* DEBUG */ if (l < consconfig_errlevel) { return; } @@ -703,6 +706,18 @@ static void cons_build_upper_layer(cons_state_t *sp) { + ldi_handle_t wc_lh; + struct strioctl strioc; + int rval; + dev_t wc_dev; + dev_t dev; +#ifdef _HAVE_TEM_FIRMWARE + dev_info_t *dip; + int *int_array; + uint_t nint; + boolean_t kfb_mode; +#endif /* _HAVE_TEM_FIRMWARE */ + /* * Build the wc->conskbd portion of the keyboard console stream. * Even if no keyboard is attached to the system, the upper @@ -775,50 +790,79 @@ cmn_err(CE_PANIC, "consconfig: " "unable to find iwscn device"); -#if defined(_CONSOLE_OUTPUT_VIA_SOFTWARE) + if (cons_tem_disable) + return; + if (sp->cons_fb_path == NULL) { +#if defined(i386) || defined(__i386) || defined(__ia64) cmn_err(CE_WARN, "consconfig: no screen found"); +#endif /* defined(i386) || defined(__i386) || defined(__ia64) */ + return; + } + + /* make sure the frame buffer device exists */ + dev = ddi_pathname_to_dev_t(sp->cons_fb_path); + if (dev == NODEV) { + cmn_err(CE_WARN, "consconfig: " + "cannot find driver for screen device %s", + sp->cons_fb_path); return; - } else { - ldi_handle_t wc_lh; - struct strioctl strioc; - dev_t wc_dev; - int err, rval; + } - /* make sure the frame buffer device exists */ - if (ddi_pathname_to_dev_t(sp->cons_fb_path) == NODEV) { - cmn_err(CE_NOTE, "consconfig: " - "cannot find driver for screen device %s", - sp->cons_fb_path); - return; - } +#ifdef _HAVE_TEM_FIRMWARE + /* + * Here we hold the driver and check "tem-support" property. + * We're doing this with e_ddi_hold_devi_by_dev and + * ddi_prop_lookup_int_array before opening the driver since + * some video cards that don't support the kernel terminal + * emulator could hang or crash if opened too early during + * boot. + */ + if ((dip = e_ddi_hold_devi_by_dev(dev, 0)) == NULL) { + cmn_err(CE_WARN, "consconfig: cannot hold fb dev %s", + sp->cons_fb_path); + return; + } - /* tell wc to open the frame buffer device */ - wc_dev = sp->cons_wc_vp->v_rdev; - err = ldi_open_by_dev(&wc_dev, OTYP_CHR, FREAD|FWRITE|FNOCTTY, - kcred, &wc_lh, sp->cons_li); - ASSERT(wc_dev == sp->cons_wc_vp->v_rdev); - if (err) { - panic("cons_build_upper_layer: " - "unable to open wc device"); - /*NOTREACHED*/ - } + /* + * Check the existance of the tem-support property AND that + * it be equal to 1. + */ + kfb_mode = B_FALSE; + if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, + DDI_PROP_DONTPASS, "tem-support", &int_array, &nint) == + DDI_SUCCESS) { + if (nint > 0) + kfb_mode = int_array[0] == 1; + ddi_prop_free(int_array); + } + ddi_release_devi(dip); + if (!kfb_mode) + return; +#endif /* _HAVE_TEM_FIRMWARE */ - strioc.ic_cmd = WC_OPEN_FB; - strioc.ic_timout = INFTIM; - strioc.ic_len = strlen(sp->cons_fb_path) + 1; - strioc.ic_dp = sp->cons_fb_path; + /* tell wc to open the frame buffer device */ + wc_dev = sp->cons_wc_vp->v_rdev; + if (ldi_open_by_dev(&wc_dev, OTYP_CHR, FREAD|FWRITE|FNOCTTY, kcred, + &wc_lh, sp->cons_li)) { + cmn_err(CE_PANIC, "cons_build_upper_layer: " + "unable to open wc device"); + return; + } + ASSERT(wc_dev == sp->cons_wc_vp->v_rdev); - err = ldi_ioctl(wc_lh, I_STR, (intptr_t)&strioc, - FKIOCTL, kcred, &rval); - if (err) { - cmn_err(CE_WARN, "cons_build_upper_layer: " - "could not attach frame buffer, error %d", err); - } + strioc.ic_cmd = WC_OPEN_FB; + strioc.ic_timout = INFTIM; + strioc.ic_len = strlen(sp->cons_fb_path) + 1; + strioc.ic_dp = sp->cons_fb_path; - (void) ldi_close(wc_lh, FREAD|FWRITE, kcred); - } -#endif /* _CONSOLE_OUTPUT_VIA_SOFTWARE */ + if (ldi_ioctl(wc_lh, I_STR, (intptr_t)&strioc, + FKIOCTL, kcred, &rval) == 0) + consmode = CONS_KFB; + else + cmn_err(CE_WARN, + "consconfig: terminal emulator failed to initialize"); + (void) ldi_close(wc_lh, FREAD|FWRITE, kcred); } static void
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/uts/common/io/tem.c Thu Jan 12 18:17:46 2006 -0800 @@ -0,0 +1,707 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +/* + * ANSI terminal emulator module; parse ANSI X3.64 escape sequences and + * the like. + */ + +#include <sys/types.h> +#include <sys/file.h> +#include <sys/conf.h> +#include <sys/errno.h> +#include <sys/open.h> +#include <sys/cred.h> +#include <sys/cred_impl.h> +#include <sys/kmem.h> +#include <sys/ascii.h> +#include <sys/consdev.h> +#include <sys/font.h> +#include <sys/fbio.h> +#include <sys/conf.h> +#include <sys/modctl.h> +#include <sys/strsubr.h> +#include <sys/stat.h> +#include <sys/visual_io.h> +#include <sys/mutex.h> +#include <sys/param.h> +#include <sys/debug.h> +#include <sys/cmn_err.h> +#include <sys/console.h> +#include <sys/ddi.h> +#include <sys/sunddi.h> +#include <sys/sunldi.h> +#include <sys/tem_impl.h> +#include <sys/tem.h> +#ifdef _HAVE_TEM_FIRMWARE +#include <sys/promif.h> +#endif /* _HAVE_TEM_FIRMWARE */ +#include <sys/consconfig_dacf.h> + +/* Terminal emulator functions */ +static int tem_setup_terminal(struct vis_devinit *, tem_t *, + size_t, size_t); +static void tem_modechange_callback(tem_t *, struct vis_devinit *); +static void tem_free(tem_t *); + +static int tem_adjust_row(tem_t *, int, cred_t *); + +/* + * Globals + */ +ldi_ident_t term_li = NULL; + + +extern struct mod_ops mod_miscops; + +static struct modlmisc modlmisc = { + &mod_miscops, /* modops */ + "ANSI Terminal Emulator", /* name */ +}; + +static struct modlinkage modlinkage = { + MODREV_1, (void *)&modlmisc, NULL +}; + +int +_init(void) +{ + int ret; + ret = mod_install(&modlinkage); + if (ret != 0) + return (ret); + ret = ldi_ident_from_mod(&modlinkage, &term_li); + if (ret != 0) { + (void) mod_remove(&modlinkage); + return (ret); + } + return (0); +} + +int +_fini() +{ + int ret; + + ret = mod_remove(&modlinkage); + if (ret == 0) { + ldi_ident_release(term_li); + term_li = NULL; + } + return (ret); +} + +int +_info(struct modinfo *modinfop) +{ + return (mod_info(&modlinkage, modinfop)); +} + +int +tem_fini(tem_t *tem) +{ + int lyr_rval; + + mutex_enter(&tem->lock); + + ASSERT(tem->hdl != NULL); + + /* + * Allow layered on driver to clean up console private + * data. + */ + (void) ldi_ioctl(tem->hdl, VIS_DEVFINI, + 0, FKIOCTL, kcred, &lyr_rval); + + /* + * Close layered on driver + */ + (void) ldi_close(tem->hdl, NULL, kcred); + tem->hdl = NULL; + + mutex_exit(&tem->lock); + + tem_free(tem); + + return (0); +} + +static int +tem_init_failed(tem_t *tem, cred_t *credp, boolean_t finish_ioctl) +{ + int lyr_rval; + + if (finish_ioctl) + (void) ldi_ioctl(tem->hdl, VIS_DEVFINI, 0, FWRITE|FKIOCTL, + credp, &lyr_rval); + + (void) ldi_close(tem->hdl, NULL, credp); + tem_free(tem); + return (ENXIO); +} + +static void +tem_free_state(struct tem_state *tems) +{ + ASSERT(tems != NULL); + + if (tems->a_outbuf != NULL) + kmem_free(tems->a_outbuf, + tems->a_c_dimension.width); + if (tems->a_blank_line != NULL) + kmem_free(tems->a_blank_line, + tems->a_c_dimension.width); + if (tems->a_pix_data != NULL) + kmem_free(tems->a_pix_data, + tems->a_pix_data_size); + kmem_free(tems, sizeof (struct tem_state)); +} + +static void +tem_free(tem_t *tem) +{ + ASSERT(tem != NULL); + + if (tem->state != NULL) + tem_free_state(tem->state); + + kmem_free(tem, sizeof (struct tem)); +} + +/* + * This is the main entry point to the module. It handles output requests + * during normal system operation, when (e.g.) mutexes are available. + */ +void +tem_write(tem_t *tem, uchar_t *buf, ssize_t len, cred_t *credp) +{ + mutex_enter(&tem->lock); + + ASSERT(tem->hdl != NULL); + + tem_check_first_time(tem, credp, CALLED_FROM_NORMAL); + tem_terminal_emulate(tem, buf, len, credp, CALLED_FROM_NORMAL); + + mutex_exit(&tem->lock); +} + +int +tem_init(tem_t **ptem, char *pathname, cred_t *credp) +{ + struct vis_devinit devinit; + tem_t *tem; + size_t height = 0; + size_t width = 0; + uint32_t row = 0; + uint32_t col = 0; + char *pathbuf; + int err = 0; + int lyr_rval; + + tem = kmem_zalloc(sizeof (struct tem), KM_SLEEP); + + mutex_init(&tem->lock, (char *)NULL, MUTEX_DRIVER, NULL); + +#ifdef _HAVE_TEM_FIRMWARE + tem->cons_wrtvec = tem_write; +#endif /* _HAVE_TEM_FIRMWARE */ + + /* + * Open the layered device using the devfs physical device name + * after adding the /devices prefix. + */ + pathbuf = kmem_alloc(MAXPATHLEN, KM_SLEEP); + (void) strcpy(pathbuf, "/devices"); + if (i_ddi_prompath_to_devfspath(pathname, + pathbuf + strlen("/devices")) != DDI_SUCCESS) { + cmn_err(CE_WARN, "terminal emulator: Path conversion error"); + kmem_free(pathbuf, MAXPATHLEN); + tem_free(tem); + return (ENXIO); + } + if (ldi_open_by_name(pathbuf, FWRITE, credp, &tem->hdl, term_li) != 0) { + cmn_err(CE_WARN, "terminal emulator: Device path open error"); + kmem_free(pathbuf, MAXPATHLEN); + tem_free(tem); + return (ENXIO); + } + kmem_free(pathbuf, MAXPATHLEN); + + devinit.modechg_cb = (vis_modechg_cb_t)tem_modechange_callback; + devinit.modechg_arg = (struct vis_modechg_arg *)tem; + + /* + * Initialize the console and get the device parameters + */ + if ((err = ldi_ioctl(tem->hdl, VIS_DEVINIT, + (intptr_t)&devinit, FWRITE|FKIOCTL, credp, &lyr_rval)) != 0) { + cmn_err(CE_WARN, "terminal emulator: Compatible fb not found"); + return (tem_init_failed(tem, credp, B_FALSE)); + } + + /* Make sure the fb driver and terminal emulator versions match */ + if (devinit.version != VIS_CONS_REV) { + cmn_err(CE_WARN, + "terminal emulator: VIS_CONS_REV %d (see sys/visual_io.h) " + "of console fb driver not supported", devinit.version); + return (tem_init_failed(tem, credp, B_TRUE)); + } + + if ((tem->fb_polledio = devinit.polledio) == NULL) { + cmn_err(CE_WARN, "terminal emulator: fb doesn't support polled " + "I/O"); + return (tem_init_failed(tem, credp, B_TRUE)); + } + + /* other sanity checks */ + if (!((devinit.depth == 4) || (devinit.depth == 8) || + (devinit.depth == 24) || (devinit.depth == 32))) { + cmn_err(CE_WARN, "terminal emulator: unsupported depth"); + return (tem_init_failed(tem, credp, B_TRUE)); + } + + if ((devinit.mode != VIS_TEXT) && (devinit.mode != VIS_PIXEL)) { + cmn_err(CE_WARN, "terminal emulator: unsupported mode"); + return (tem_init_failed(tem, credp, B_TRUE)); + } + + if ((devinit.mode == VIS_PIXEL) && plat_stdout_is_framebuffer()) { + plat_tem_get_prom_size(&height, &width); + } + + /* + * Initialize the terminal emulator + */ + mutex_enter(&tem->lock); + if ((err = tem_setup_terminal(&devinit, tem, height, width)) != 0) { + cmn_err(CE_WARN, "terminal emulator: Init failed"); + (void) ldi_ioctl(tem->hdl, VIS_DEVFINI, 0, FWRITE|FKIOCTL, + credp, &lyr_rval); + (void) ldi_close(tem->hdl, NULL, credp); + mutex_exit(&tem->lock); + tem_free(tem); + return (err); + } + + /* + * On SPARC don't clear the screen if the console is the framebuffer. + * Otherwise it needs to be cleared to get rid of junk that may be + * in frameuffer memory, since the screen isn't cleared when + * boot messages are directed elsewhere. + */ + if (devinit.mode == VIS_TEXT) { + /* + * The old getting current cursor position code, which + * is not needed here, has been in tem_write/tem_polled_write. + */ + tem_reset_display(tem, credp, CALLED_FROM_NORMAL, 0); + } else if (plat_stdout_is_framebuffer()) { + ASSERT(devinit.mode == VIS_PIXEL); + plat_tem_hide_prom_cursor(); + tem_reset_display(tem, credp, CALLED_FROM_NORMAL, 0); + + /* + * We are getting the current cursor position in pixel + * mode so that we don't over-write the console output + * during boot. + */ + plat_tem_get_prom_pos(&row, &col); + + /* + * Adjust the row if necessary when the font of our + * kernel console tem is different with that of prom + * tem. + */ + row = tem_adjust_row(tem, row, credp); + + /* first line of our kernel console output */ + tem->state->first_line = row + 1; + + /* re-set and align cusror position */ + tem->state->a_c_cursor.row = row; + tem->state->a_c_cursor.col = 0; + tem_align_cursor(tem); + } else { + tem_reset_display(tem, credp, CALLED_FROM_NORMAL, 1); + } + +#ifdef _HAVE_TEM_FIRMWARE + if (plat_stdout_is_framebuffer()) { + /* + * Drivers in the console stream may emit additional + * messages before we are ready. This causes text + * overwrite on the screen. So we set the redirection + * here. It is safe because the ioctl in consconfig_dacf + * will succeed and consmode will be set to CONS_KFB. + */ + prom_set_stdout_redirect(console_prom_write_cb, + (promif_redir_arg_t)tem); + + } +#endif /* _HAVE_TEM_FIRMWARE */ + + mutex_exit(&tem->lock); + *ptem = tem; /* Return tem to caller only upon success */ + return (0); +} + +/* + * This is a callback function that we register with the frame + * buffer driver layered underneath. It gets invoked from + * the underlying frame buffer driver to reconfigure the terminal + * emulator to a new screen size and depth in conjunction with + * framebuffer videomode changes. + */ +void +tem_modechange_callback(tem_t *tem, struct vis_devinit *devinit) +{ + mutex_enter(&tem->lock); + + ASSERT(tem->hdl != NULL); + + (void) tem_setup_terminal(devinit, tem, + tem->state->a_c_dimension.height, + tem->state->a_c_dimension.width); + + tem_reset_display(tem, kcred, CALLED_FROM_NORMAL, 1); + + mutex_exit(&tem->lock); + + if (tem->modechg_cb != NULL) + tem->modechg_cb(tem->modechg_arg); +} + +static int +tem_setup_terminal( + struct vis_devinit *devinit, + tem_t *tem, + size_t height, size_t width) +{ + int i; + struct tem_state *new_state, *prev_state; + + ASSERT(MUTEX_HELD(&tem->lock)); + + prev_state = tem->state; + + new_state = kmem_zalloc(sizeof (struct tem_state), KM_SLEEP); + + new_state->a_pdepth = devinit->depth; + new_state->display_mode = devinit->mode; + new_state->linebytes = devinit->linebytes; + + switch (devinit->mode) { + case VIS_TEXT: + new_state->a_p_dimension.width = 0; + new_state->a_p_dimension.height = 0; + new_state->a_c_dimension.width = devinit->width; + new_state->a_c_dimension.height = devinit->height; + + new_state->in_fp.f_display = tem_text_display; + new_state->in_fp.f_copy = tem_text_copy; + new_state->in_fp.f_cursor = tem_text_cursor; + new_state->in_fp.f_cls = tem_text_cls; + new_state->in_fp.f_bit2pix = NULL; + + new_state->a_blank_line = + kmem_alloc(new_state->a_c_dimension.width, KM_SLEEP); + + for (i = 0; i < new_state->a_c_dimension.width; i++) + new_state->a_blank_line[i] = ' '; + + break; + case VIS_PIXEL: + + /* + * First check to see if the user has specified a screen size. + * If so, use those values. Else use 34x80 as the default. + */ + if (width == 0) { + width = TEM_DEFAULT_COLS; + height = TEM_DEFAULT_ROWS; + } + new_state->a_c_dimension.height = height; + new_state->a_c_dimension.width = width; + + new_state->a_p_dimension.height = devinit->height; + new_state->a_p_dimension.width = devinit->width; + + new_state->in_fp.f_display = tem_pix_display; + new_state->in_fp.f_copy = tem_pix_copy; + new_state->in_fp.f_cursor = tem_pix_cursor; + new_state->in_fp.f_cls = tem_pix_cls; + + new_state->a_blank_line = NULL; + + /* + * set_font() will select a appropriate sized font for + * the number of rows and columns selected. If we don't + * have a font that will fit, then it will use the + * default builtin font and adjust the rows and columns + * to fit on the screen. + */ + set_font(&new_state->a_font, + &new_state->a_c_dimension.height, + &new_state->a_c_dimension.width, + new_state->a_p_dimension.height, + new_state->a_p_dimension.width); + + new_state->a_p_offset.y = + (new_state->a_p_dimension.height - + (new_state->a_c_dimension.height * + new_state->a_font.height)) / 2; + + new_state->a_p_offset.x = + (new_state->a_p_dimension.width - + (new_state->a_c_dimension.width * + new_state->a_font.width)) / 2; + + switch (devinit->depth) { + case 4: + new_state->in_fp.f_bit2pix = bit_to_pix4; + new_state->a_pix_data_size = + (((new_state->a_font.width * 4) + + NBBY - 1) / NBBY) * new_state->a_font.height; + break; + case 8: + new_state->in_fp.f_bit2pix = bit_to_pix8; + new_state->a_pix_data_size = + new_state->a_font.width * + new_state->a_font.height; + break; + case 24: + case 32: + new_state->in_fp.f_bit2pix = bit_to_pix24; + new_state->a_pix_data_size = + new_state->a_font.width * + new_state->a_font.height; + new_state->a_pix_data_size *= 4; + break; + } + + new_state->a_pix_data = + kmem_alloc(new_state->a_pix_data_size, KM_SLEEP); + + break; + + default: + /* + * The layered fb driver conveyed an unrecognized rendering + * mode. We cannot proceed with tem initialization. + */ + kmem_free(new_state, sizeof (struct tem_state)); + return (ENXIO); + } + + new_state->a_outbuf = + kmem_alloc(new_state->a_c_dimension.width, KM_SLEEP); + + /* + * Change state atomically so that polled I/O requests + * can be safely and reliably serviced anytime after the terminal + * emulator is originally initialized and the console mode has been + * switched over from the PROM, even while a videomode change + * callback is being processed. + */ + tem->state = new_state; + + if (prev_state != NULL) + tem_free_state(prev_state); + + return (0); +} + +/* + * This function is used to display a rectangular blit of data + * of a given size and location via the underlying framebuffer driver. + * The blit can be as small as a pixel or as large as the screen. + */ +void +tem_display_layered( + tem_t *tem, + struct vis_consdisplay *pda, + cred_t *credp) +{ + int rval; + + (void) ldi_ioctl(tem->hdl, VIS_CONSDISPLAY, + (intptr_t)pda, FKIOCTL, credp, &rval); +} + +/* + * This function is used to invoke a block copy operation in the + * underlying framebuffer driver. Rectangle copies are how scrolling + * is implemented, as well as horizontal text shifting escape seqs. + * such as from vi when deleting characters and words. + */ +void +tem_copy_layered( + tem_t *tem, + struct vis_conscopy *pma, + cred_t *credp) +{ + int rval; + + (void) ldi_ioctl(tem->hdl, VIS_CONSCOPY, + (intptr_t)pma, FKIOCTL, credp, &rval); +} + +/* + * This function is used to show or hide a rectangluar monochrom + * pixel inverting, text block cursor via the underlying framebuffer. + */ +void +tem_cursor_layered( + tem_t *tem, + struct vis_conscursor *pca, + cred_t *credp) +{ + int rval; + + (void) ldi_ioctl(tem->hdl, VIS_CONSCURSOR, + (intptr_t)pca, FKIOCTL, credp, &rval); +} + +void +tem_reset_colormap( + tem_t *tem, + cred_t *credp, + enum called_from called_from) +{ + struct vis_cmap cm; + int rval; + + if (called_from == CALLED_FROM_STANDALONE) + return; + + switch (tem->state->a_pdepth) { + case 8: + cm.index = 0; + cm.count = 16; + cm.red = cmap4_to_24.red; /* 8-bits (1/3 of TrueColor 24) */ + cm.blue = cmap4_to_24.blue; /* 8-bits (1/3 of TrueColor 24) */ + cm.green = cmap4_to_24.green; /* 8-bits (1/3 of TrueColor 24) */ + (void) ldi_ioctl(tem->hdl, VIS_PUTCMAP, (intptr_t)&cm, + FKIOCTL, credp, &rval); + break; + } +} + +void +tem_get_size(tem_t *tem, ushort_t *r, ushort_t *c, + ushort_t *x, ushort_t *y) +{ + *r = (ushort_t)tem->state->a_c_dimension.height; + *c = (ushort_t)tem->state->a_c_dimension.width; + *x = (ushort_t)tem->state->a_p_dimension.width; + *y = (ushort_t)tem->state->a_p_dimension.height; +} + +void +tem_register_modechg_cb(tem_t *tem, tem_modechg_cb_t func, + tem_modechg_cb_arg_t arg) +{ + tem->modechg_cb = func; + tem->modechg_arg = arg; +} + +/* + * This function is to scroll up the OBP output, which has + * different screen height and width with our kernel console. + */ +static void +tem_prom_scroll_up(struct tem *tem, int nrows, cred_t *credp) +{ + struct tem_state *tems = tem->state; + struct vis_conscopy ma; + int ncols, width; + + /* copy */ + ma.s_row = nrows * tems->a_font.height; + ma.e_row = tems->a_p_dimension.height - 1; + ma.t_row = 0; + + ma.s_col = 0; + ma.e_col = tems->a_p_dimension.width - 1; + ma.t_col = 0; + + tem_copy(tem, &ma, credp, CALLED_FROM_NORMAL); + + /* clear */ + width = tems->a_font.width; + ncols = (tems->a_p_dimension.width + + (width - 1))/ width; + + tem_pix_cls_range(tem, + 0, nrows, tems->a_p_offset.y, + 0, ncols, 0, + B_TRUE, credp, CALLED_FROM_NORMAL); +} + +#define PROM_DEFAULT_FONT_HEIGHT 22 +#define PROM_DEFAULT_WINDOW_TOP 0x8a + +/* + * This function is to compute the starting row of the console, according to + * PROM cursor's position. Here we have to take different fonts into account. + */ +static int +tem_adjust_row(tem_t *tem, int prom_row, cred_t *credp) +{ + int tem_row; + int tem_y; + int prom_charheight = 0; + int prom_window_top = 0; + int scroll_up_lines; + + plat_tem_get_prom_font_size(&prom_charheight, &prom_window_top); + if (prom_charheight == 0) + prom_charheight = PROM_DEFAULT_FONT_HEIGHT; + if (prom_window_top == 0) + prom_window_top = PROM_DEFAULT_WINDOW_TOP; + + tem_y = (prom_row + 1) * prom_charheight + prom_window_top - + tem->state->a_p_offset.y; + tem_row = (tem_y + tem->state->a_font.height - 1) / + tem->state->a_font.height - 1; + + if (tem_row < 0) { + tem_row = 0; + } else if (tem_row >= (tem->state->a_c_dimension.height - 1)) { + /* + * Scroll up the prom outputs if the PROM cursor's position is + * below our tem's lower boundary. + */ + scroll_up_lines = tem_row - + (tem->state->a_c_dimension.height - 1); + tem_prom_scroll_up(tem, scroll_up_lines, credp); + tem_row = tem->state->a_c_dimension.height - 1; + } + + return (tem_row); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/uts/common/io/tem_safe.c Thu Jan 12 18:17:46 2006 -0800 @@ -0,0 +1,2215 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +/* + * Polled I/O safe ANSI terminal emulator module; + * Supporting TERM types 'sun' and 'sun-color, parsing + * ANSI x3.64 escape sequences, and the like. (See wscons(7d) + * for more information). + * + * IMPORTANT: + * + * The functions in this file *must* be able to function in + * standalone mode, ie. on a quiesced system. In that state, + * access is single threaded, only one CPU is running. + * System services are NOT available. + * + * The following restrictions pertain to every function + * in this file: + * + * - CANNOT use the DDI or LDI interfaces + * - CANNOT call system services + * - CANNOT use mutexes + * - CANNOT wait for interrupts + * - CANNOT allocate memory + * + */ + +#include <sys/types.h> +#include <sys/ascii.h> +#include <sys/visual_io.h> +#include <sys/font.h> +#include <sys/tem.h> +#include <sys/tem_impl.h> +#include <sys/ksynch.h> +#include <sys/sysmacros.h> +#include <sys/mutex.h> + +static void tem_display(struct tem *, + struct vis_consdisplay *, + cred_t *, enum called_from); +static void tem_cursor(struct tem *, + struct vis_conscursor *, + cred_t *, enum called_from); +static void tem_control(struct tem *, uchar_t, + cred_t *, enum called_from); +static void tem_setparam(struct tem *, int, int); +static void tem_selgraph(struct tem *); +static void tem_chkparam(struct tem *, uchar_t, + cred_t *, enum called_from); +static void tem_getparams(struct tem *, uchar_t, + cred_t *, enum called_from); +static void tem_outch(struct tem *, uchar_t, + cred_t *, enum called_from); +static void tem_parse(struct tem *, uchar_t, + cred_t *, enum called_from); + +static void tem_new_line(struct tem *, + cred_t *, enum called_from); +static void tem_cr(struct tem *); +static void tem_lf(struct tem *, + cred_t *, enum called_from); +static void tem_send_data(struct tem *, cred_t *, + enum called_from); +static void tem_cls(struct tem *, + cred_t *, enum called_from); +static void tem_tab(struct tem *, + cred_t *, enum called_from); +static void tem_back_tab(struct tem *, + cred_t *, enum called_from); +static void tem_clear_tabs(struct tem *, int); +static void tem_set_tab(struct tem *); +static void tem_mv_cursor(struct tem *, int, int, + cred_t *, enum called_from); +static void tem_shift(struct tem *, int, int, + cred_t *, enum called_from); +static void tem_scroll(struct tem *, int, int, + int, int, cred_t *, enum called_from); +static void tem_clear_chars(struct tem *tem, + int count, screen_pos_t row, screen_pos_t col, + cred_t *credp, enum called_from called_from); +static void tem_copy_area(struct tem *tem, + screen_pos_t s_col, screen_pos_t s_row, + screen_pos_t e_col, screen_pos_t e_row, + screen_pos_t t_col, screen_pos_t t_row, + cred_t *credp, enum called_from called_from); +static void tem_image_display(struct tem *, uchar_t *, + int, int, screen_pos_t, screen_pos_t, + cred_t *, enum called_from); +static void tem_bell(struct tem *tem, + enum called_from called_from); +static void tem_get_color(struct tem *tem, + text_color_t *fg, text_color_t *bg); +static void tem_pix_clear_prom_output(struct tem *tem, + cred_t *credp, enum called_from called_from); + +#ifdef _HAVE_TEM_FIRMWARE +#define DEFAULT_ANSI_FOREGROUND ANSI_COLOR_BLACK +#define DEFAULT_ANSI_BACKGROUND ANSI_COLOR_WHITE +#else /* _HAVE_TEM_FIRMWARE */ +#define DEFAULT_ANSI_FOREGROUND ANSI_COLOR_WHITE +#define DEFAULT_ANSI_BACKGROUND ANSI_COLOR_BLACK +#endif + + +/* BEGIN CSTYLED */ +/* Bk Rd Gr Br Bl Mg Cy Wh */ +static text_color_t fg_dim_xlate[] = { 1, 5, 3, 7, 2, 6, 4, 8 }; +static text_color_t fg_brt_xlate[] = { 9, 13, 11, 15, 10, 14, 12, 0 }; +static text_color_t bg_xlate[] = { 1, 5, 3, 7, 2, 6, 4, 0 }; +/* END CSTYLED */ + + +text_cmap_t cmap4_to_24 = { +/* BEGIN CSTYLED */ +/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + Wh+ Bk Bl Gr Cy Rd Mg Br Wh Bk+ Bl+ Gr+ Cy+ Rd+ Mg+ Yw */ + 0xff,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x40,0x00,0x00,0x00,0xff,0xff,0xff, + 0xff,0x00,0x00,0x80,0x80,0x00,0x00,0x80,0x80,0x40,0x00,0xff,0xff,0x00,0x00,0xff, + 0xff,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x40,0xff,0x00,0xff,0x00,0xff,0x00 +/* END CSTYLED */ +}; + +#define PIX4TO32(pix4) (pixel32_t)( \ + cmap4_to_24.red[pix4] << 16 | \ + cmap4_to_24.green[pix4] << 8 | \ + cmap4_to_24.blue[pix4]) + +/* + * Fonts are statically linked with this module. At some point an + * RFE might be desireable to allow dynamic font loading. The + * original intention to facilitate dynamic fonts can be seen + * by examining the data structures and set_font(). As much of + * the original code is retained but modified to be suited to + * traversing a list of static fonts. + */ +extern struct fontlist fonts[]; + +#define DEFAULT_FONT_DATA font_data_12x22 + +extern bitmap_data_t font_data_12x22; +extern bitmap_data_t font_data_7x14; +extern bitmap_data_t font_data_6x10; +/* + * Must be sorted by font size in descending order + */ +struct fontlist fonts[] = { + { &font_data_12x22, NULL }, + { &font_data_7x14, NULL }, + { &font_data_6x10, NULL }, + { NULL, NULL } +}; + +#define INVERSE(ch) (ch ^ 0xff) + +#define BIT_TO_PIX(tem, c, fg, bg) { \ + ASSERT((tem)->state->in_fp.f_bit2pix != NULL); \ + (void) (*(tem)->state->in_fp.f_bit2pix)((tem), (c), (fg), (bg));\ +} + +void +tem_check_first_time( + struct tem *tem, + cred_t *credp, + enum called_from called_from) +{ + static int first_time = 1; + + /* + * Realign the console cursor. We did this in tem_init(). + * However, drivers in the console stream may emit additional + * messages before we are ready. This causes text overwrite + * on the screen. This is a workaround. + */ + if (first_time && tem->state->display_mode == VIS_TEXT) { + tem_text_cursor(tem, VIS_GET_CURSOR, credp, called_from); + tem_align_cursor(tem); + } + first_time = 0; + +} + +/* + * This entry point handles output requests from restricted contexts like + * kmdb, where services like mutexes are not available. This function + * is entered when OBP or when a kernel debugger (such as kmdb) + * are generating console output. In those cases, power management + * concerns are handled by the abort sequence initiation (ie. when + * the user hits L1+A or the equivalent to enter OBP or the debugger.). + * It is also entered when the kernel is panicing. + */ +void +tem_polled_write( + struct tem *tem, + uchar_t *buf, + int len) +{ + + ASSERT(tem->hdl != NULL); + + tem_check_first_time(tem, kcred, CALLED_FROM_STANDALONE); + tem_terminal_emulate(tem, buf, len, NULL, CALLED_FROM_STANDALONE); +} + + +/* + * This is the main entry point into the terminal emulator. + * + * For each data message coming downstream, ANSI assumes that it is composed + * of ASCII characters, which are treated as a byte-stream input to the + * parsing state machine. All data is parsed immediately -- there is + * no enqueing. + */ +void +tem_terminal_emulate( + struct tem *tem, + uchar_t *buf, + int len, + cred_t *credp, + enum called_from called_from) +{ + struct tem_state *tems = tem->state; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + (*tems->in_fp.f_cursor) + (tem, VIS_HIDE_CURSOR, credp, called_from); + + for (; len > 0; len--, buf++) { + tem_parse(tem, *buf, credp, called_from); + } + + /* + * Send the data we just got to the framebuffer. + */ + tem_send_data(tem, credp, called_from); + + (*tems->in_fp.f_cursor) + (tem, VIS_DISPLAY_CURSOR, credp, called_from); +} + +/* + * Display an rectangular image on the frame buffer using the + * mechanism appropriate for the system state being called + * from quiesced or normal (ie. use polled I/O vs. layered ioctls) + */ +static void +tem_display( + struct tem *tem, + struct vis_consdisplay *pda, + cred_t *credp, + enum called_from called_from) +{ + if (called_from == CALLED_FROM_STANDALONE) + tem->fb_polledio->display(tem->fb_polledio->arg, pda); + else + tem_display_layered(tem, pda, credp); +} + +/* + * Copy a rectangle from one location to another on the frame buffer + * using the mechanism appropriate for the system state being called + * from, quiesced or normal (ie. use polled I/O vs. layered ioctls) + */ +void +tem_copy( + struct tem *tem, + struct vis_conscopy *pca, + cred_t *credp, + enum called_from called_from) +{ + if (called_from == CALLED_FROM_STANDALONE) + tem->fb_polledio->copy(tem->fb_polledio->arg, pca); + else + tem_copy_layered(tem, pca, credp); +} + +/* + * Display or hide a rectangular block text cursor of a specificsize + * at a specific location on frame buffer* using the mechanism + * appropriate for the system state being called from, quisced or + * normal (ie. use polled I/O vs. layered ioctls). + */ +static void +tem_cursor( + struct tem *tem, + struct vis_conscursor *pca, + cred_t *credp, + enum called_from called_from) +{ + if (called_from == CALLED_FROM_STANDALONE) + tem->fb_polledio->cursor(tem->fb_polledio->arg, pca); + else + tem_cursor_layered(tem, pca, credp); +} + +/* + * send the appropriate control message or set state based on the + * value of the control character ch + */ + +static void +tem_control( + struct tem *tem, + uchar_t ch, + cred_t *credp, + enum called_from called_from) +{ + struct tem_state *tems = tem->state; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + tems->a_state = A_STATE_START; + switch (ch) { + case A_BEL: + tem_bell(tem, called_from); + break; + + case A_BS: + tem_mv_cursor(tem, + tems->a_c_cursor.row, + tems->a_c_cursor.col - 1, + credp, called_from); + break; + + case A_HT: + tem_tab(tem, credp, called_from); + break; + + case A_NL: + /* + * tem_send_data(tem, credp, called_from); + * tem_new_line(tem, credp, called_from); + * break; + */ + + case A_VT: + tem_send_data(tem, credp, called_from); + tem_lf(tem, credp, called_from); + break; + + case A_FF: + tem_send_data(tem, credp, called_from); + tem_cls(tem, credp, called_from); + break; + + case A_CR: + tem_send_data(tem, credp, called_from); + tem_cr(tem); + break; + + case A_ESC: + tems->a_state = A_STATE_ESC; + break; + + case A_CSI: + { + int i; + tems->a_curparam = 0; + tems->a_paramval = 0; + tems->a_gotparam = B_FALSE; + /* clear the parameters */ + for (i = 0; i < TEM_MAXPARAMS; i++) + tems->a_params[i] = -1; + tems->a_state = A_STATE_CSI; + } + break; + + case A_GS: + tem_back_tab(tem, credp, called_from); + break; + + default: + break; + } +} + + +/* + * if parameters [0..count - 1] are not set, set them to the value + * of newparam. + */ + +static void +tem_setparam(struct tem *tem, int count, int newparam) +{ + int i; + + for (i = 0; i < count; i++) { + if (tem->state->a_params[i] == -1) + tem->state->a_params[i] = newparam; + } +} + + +/* + * select graphics mode based on the param vals stored in a_params + */ +static void +tem_selgraph(struct tem *tem) +{ + struct tem_state *tems = tem->state; + int curparam; + int count = 0; + int param; + + curparam = tems->a_curparam; + do { + param = tems->a_params[count]; + + switch (param) { + case -1: + case 0: + if (tems->a_flags & TEM_ATTR_SCREEN_REVERSE) { + tems->a_flags |= TEM_ATTR_REVERSE; + } else { + tems->a_flags &= ~TEM_ATTR_REVERSE; + } + tems->a_flags &= ~TEM_ATTR_BOLD; + tems->a_flags &= ~TEM_ATTR_BLINK; + tems->fg_color = DEFAULT_ANSI_FOREGROUND; + tems->bg_color = DEFAULT_ANSI_BACKGROUND; + break; + + case 1: /* Bold Intense */ + tems->a_flags |= TEM_ATTR_BOLD; + break; + + case 5: /* Blink */ + tems->a_flags |= TEM_ATTR_BLINK; + break; + + case 7: /* Reverse video */ + if (tems->a_flags & TEM_ATTR_SCREEN_REVERSE) { + tems->a_flags &= ~TEM_ATTR_REVERSE; + } else { + tems->a_flags |= TEM_ATTR_REVERSE; + } + break; + + case 30: /* black (grey) foreground */ + case 31: /* red (light red) foreground */ + case 32: /* green (light green) foreground */ + case 33: /* brown (yellow) foreground */ + case 34: /* blue (light blue) foreground */ + case 35: /* magenta (light magenta) foreground */ + case 36: /* cyan (light cyan) foreground */ + case 37: /* white (bright white) foreground */ + tems->fg_color = param - 30; + break; + + case 40: /* black (grey) background */ + case 41: /* red (light red) background */ + case 42: /* green (light green) background */ + case 43: /* brown (yellow) background */ + case 44: /* blue (light blue) background */ + case 45: /* magenta (light magenta) background */ + case 46: /* cyan (light cyan) background */ + case 47: /* white (bright white) background */ + tems->bg_color = param - 40; + break; + + default: + break; + } + count++; + curparam--; + + } while (curparam > 0); + + + tems->a_state = A_STATE_START; +} + +/* + * perform the appropriate action for the escape sequence + * + * General rule: This code does not validate the arguments passed. + * It assumes that the next lower level will do so. + */ +static void +tem_chkparam( + struct tem *tem, + uchar_t ch, + cred_t *credp, + enum called_from called_from) +{ + struct tem_state *tems = tem->state; + int i; + int row; + int col; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + row = tems->a_c_cursor.row; + col = tems->a_c_cursor.col; + + switch (ch) { + + case 'm': /* select terminal graphics mode */ + tem_send_data(tem, credp, called_from); + tem_selgraph(tem); + break; + + case '@': /* insert char */ + tem_setparam(tem, 1, 1); + tem_shift(tem, tems->a_params[0], TEM_SHIFT_RIGHT, + credp, called_from); + break; + + case 'A': /* cursor up */ + tem_setparam(tem, 1, 1); + tem_mv_cursor(tem, row - tems->a_params[0], col, + credp, called_from); + break; + + case 'd': /* VPA - vertical position absolute */ + tem_setparam(tem, 1, 1); + tem_mv_cursor(tem, tems->a_params[0] - 1, col, + credp, called_from); + break; + + case 'e': /* VPR - vertical position relative */ + case 'B': /* cursor down */ + tem_setparam(tem, 1, 1); + tem_mv_cursor(tem, row + tems->a_params[0], col, + credp, called_from); + break; + + case 'a': /* HPR - horizontal position relative */ + case 'C': /* cursor right */ + tem_setparam(tem, 1, 1); + tem_mv_cursor(tem, row, col + tems->a_params[0], + credp, called_from); + break; + + case '`': /* HPA - horizontal position absolute */ + tem_setparam(tem, 1, 1); + tem_mv_cursor(tem, row, tems->a_params[0] - 1, + credp, called_from); + break; + + case 'D': /* cursor left */ + tem_setparam(tem, 1, 1); + tem_mv_cursor(tem, row, col - tems->a_params[0], + credp, called_from); + break; + + case 'E': /* CNL cursor next line */ + tem_setparam(tem, 1, 1); + tem_mv_cursor(tem, row + tems->a_params[0], 0, + credp, called_from); + break; + + case 'F': /* CPL cursor previous line */ + tem_setparam(tem, 1, 1); + tem_mv_cursor(tem, row - tems->a_params[0], 0, + credp, called_from); + break; + + case 'G': /* cursor horizontal position */ + tem_setparam(tem, 1, 1); + tem_mv_cursor(tem, row, tems->a_params[0] - 1, + credp, called_from); + break; + + case 'g': /* clear tabs */ + tem_setparam(tem, 1, 0); + tem_clear_tabs(tem, tems->a_params[0]); + break; + + case 'f': /* HVP Horizontal and Vertical Position */ + case 'H': /* CUP position cursor */ + tem_setparam(tem, 2, 1); + tem_mv_cursor(tem, + tems->a_params[0] - 1, + tems->a_params[1] - 1, + credp, called_from); + break; + + case 'I': /* CHT - Cursor Horizontal Tab */ + /* Not implemented */ + break; + + case 'J': /* ED - Erase in Display */ + tem_send_data(tem, credp, called_from); + tem_setparam(tem, 1, 0); + switch (tems->a_params[0]) { + case 0: + /* erase cursor to end of screen */ + /* FIRST erase cursor to end of line */ + tem_clear_chars(tem, + tems->a_c_dimension.width - + tems->a_c_cursor.col, + tems->a_c_cursor.row, + tems->a_c_cursor.col, credp, called_from); + + /* THEN erase lines below the cursor */ + for (row = tems->a_c_cursor.row + 1; + row < tems->a_c_dimension.height; + row++) { + tem_clear_chars(tem, + tems->a_c_dimension.width, + row, 0, credp, called_from); + } + break; + + case 1: + /* erase beginning of screen to cursor */ + /* FIRST erase lines above the cursor */ + for (row = 0; + row < tems->a_c_cursor.row; + row++) { + tem_clear_chars(tem, + tems->a_c_dimension.width, + row, 0, credp, called_from); + } + /* THEN erase beginning of line to cursor */ + tem_clear_chars(tem, + tems->a_c_cursor.col + 1, + tems->a_c_cursor.row, + 0, credp, called_from); + break; + + case 2: + /* erase whole screen */ + for (row = 0; + row < tems->a_c_dimension.height; + row++) { + tem_clear_chars(tem, + tems->a_c_dimension.width, + row, 0, credp, called_from); + } + break; + } + break; + + case 'K': /* EL - Erase in Line */ + tem_send_data(tem, credp, called_from); + tem_setparam(tem, 1, 0); + switch (tems->a_params[0]) { + case 0: + /* erase cursor to end of line */ + tem_clear_chars(tem, + (tems->a_c_dimension.width - + tems->a_c_cursor.col), + tems->a_c_cursor.row, + tems->a_c_cursor.col, + credp, called_from); + break; + + case 1: + /* erase beginning of line to cursor */ + tem_clear_chars(tem, + tems->a_c_cursor.col + 1, + tems->a_c_cursor.row, + 0, credp, called_from); + break; + + case 2: + /* erase whole line */ + tem_clear_chars(tem, + tems->a_c_dimension.width, + tems->a_c_cursor.row, + 0, credp, called_from); + break; + } + break; + + case 'L': /* insert line */ + tem_send_data(tem, credp, called_from); + tem_setparam(tem, 1, 1); + tem_scroll(tem, + tems->a_c_cursor.row, + tems->a_c_dimension.height - 1, + tems->a_params[0], TEM_SCROLL_DOWN, + credp, called_from); + break; + + case 'M': /* delete line */ + tem_send_data(tem, credp, called_from); + tem_setparam(tem, 1, 1); + tem_scroll(tem, + tems->a_c_cursor.row, + tems->a_c_dimension.height - 1, + tems->a_params[0], TEM_SCROLL_UP, + credp, called_from); + break; + + case 'P': /* DCH - delete char */ + tem_setparam(tem, 1, 1); + tem_shift(tem, tems->a_params[0], TEM_SHIFT_LEFT, + credp, called_from); + break; + + case 'S': /* scroll up */ + tem_send_data(tem, credp, called_from); + tem_setparam(tem, 1, 1); + tem_scroll(tem, 0, + tems->a_c_dimension.height - 1, + tems->a_params[0], TEM_SCROLL_UP, + credp, called_from); + break; + + case 'T': /* scroll down */ + tem_send_data(tem, credp, called_from); + tem_setparam(tem, 1, 1); + tem_scroll(tem, 0, + tems->a_c_dimension.height - 1, + tems->a_params[0], TEM_SCROLL_DOWN, + credp, called_from); + break; + + case 'X': /* erase char */ + tem_setparam(tem, 1, 1); + tem_clear_chars(tem, + tems->a_params[0], + tems->a_c_cursor.row, + tems->a_c_cursor.col, + credp, called_from); + break; + + case 'Z': /* cursor backward tabulation */ + tem_setparam(tem, 1, 1); + + /* + * Rule exception - We do sanity checking here. + * + * Restrict the count to a sane value to keep from + * looping for a long time. There can't be more than one + * tab stop per column, so use that as a limit. + */ + if (tems->a_params[0] > tems->a_c_dimension.width) + tems->a_params[0] = tems->a_c_dimension.width; + + for (i = 0; i < tems->a_params[0]; i++) + tem_back_tab(tem, credp, called_from); + break; + } + tems->a_state = A_STATE_START; +} + + +/* + * Gather the parameters of an ANSI escape sequence + */ +static void +tem_getparams(struct tem *tem, uchar_t ch, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + if ((ch >= '0' && ch <= '9') && + (tems->a_state != A_STATE_ESC_Q_DELM)) { + tems->a_paramval = + ((tems->a_paramval * 10) + (ch - '0')); + tems->a_gotparam = B_TRUE; /* Remember got parameter */ + return; /* Return immediately */ + } + switch (tems->a_state) { /* Handle letter based on state */ + + case A_STATE_ESC_Q: /* <ESC>Q<num> ? */ + tems->a_params[1] = ch; /* Save string delimiter */ + tems->a_params[2] = 0; /* String length 0 to start */ + tems->a_state = A_STATE_ESC_Q_DELM; /* Read string next */ + break; + + case A_STATE_ESC_Q_DELM: /* <ESC>Q<num><delm> ? */ + if (ch == tems->a_params[1]) { /* End of string? */ + tems->a_state = A_STATE_START; + /* End of <ESC> sequence */ + } else if (ch == '^') + /* Control char escaped with '^'? */ + tems->a_state = A_STATE_ESC_Q_DELM_CTRL; + /* Read control character next */ + + else if (ch != '\0') { + /* Not a null? Add to string */ + tems->a_fkey[tems->a_params[2]++] = ch; + if (tems->a_params[2] >= TEM_MAXFKEY) /* Full? */ + tems->a_state = A_STATE_START; + /* End of <ESC> sequence */ + } + break; + + case A_STATE_ESC_Q_DELM_CTRL: /* Contrl character escaped with '^' */ + tems->a_state = A_STATE_ESC_Q_DELM; /* rd more later */ + ch -= ' '; /* Convert to control character */ + if (ch != '\0') { /* Not a null? Add to string */ + tems->a_fkey[tems->a_params[2]++] = ch; + if (tems->a_params[2] >= TEM_MAXFKEY) /* Full? */ + tems->a_state = A_STATE_START; + /* End of <ESC> sequence */ + } + break; + + default: /* All other states */ + if (tems->a_gotparam) { + if (tems->a_curparam >= TEM_MAXPARAMS) { + /* + * Too many parameters. Abort the + * sequence. + */ + tems->a_state = A_STATE_START; + break; + } + /* + * Previous number parameter? Save and + * point to next free parameter. + */ + tems->a_params[tems->a_curparam] = + tems->a_paramval; + tems->a_curparam++; + } + + if (ch == ';') { + /* Multiple param separator? */ + /* Restart parameter search */ + tems->a_gotparam = B_FALSE; + tems->a_paramval = 0; /* No parame value yet */ + } else if (tems->a_state == A_STATE_CSI_EQUAL || + tems->a_state == A_STATE_CSI_QMARK) { + tems->a_state = A_STATE_START; + } else /* Regular letter */ + /* Handle escape sequence */ + tem_chkparam(tem, ch, credp, called_from); + break; + } +} + +/* + * Add character to internal buffer. + * When its full, send it to the next layer. + */ + +static void +tem_outch(struct tem *tem, uchar_t ch, + cred_t *credp, enum called_from called_from) +{ + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + /* buffer up the character until later */ + + tem->state->a_outbuf[tem->state->a_outindex++] = ch; + tem->state->a_c_cursor.col++; + if (tem->state->a_c_cursor.col >= tem->state->a_c_dimension.width) { + tem_send_data(tem, credp, called_from); + tem_new_line(tem, credp, called_from); + } +} + +static void +tem_new_line(struct tem *tem, + cred_t *credp, enum called_from called_from) +{ + tem_cr(tem); + tem_lf(tem, credp, called_from); +} + +static void +tem_cr(struct tem *tem) +{ + tem->state->a_c_cursor.col = 0; + tem_align_cursor(tem); +} + +static void +tem_lf(struct tem *tem, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + int row; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + /* + * Sanity checking notes: + * . a_nscroll was validated when it was set. + * . Regardless of that, tem_scroll and tem_mv_cursor will prevent + * anything bad from happening. + */ + row = tems->a_c_cursor.row + 1; + + if (row >= tems->a_c_dimension.height) { + if (tems->a_nscroll != 0) { + tem_scroll(tem, 0, + tems->a_c_dimension.height - 1, + tems->a_nscroll, TEM_SCROLL_UP, + credp, called_from); + row = tems->a_c_dimension.height - + tems->a_nscroll; + } else { /* no scroll */ + /* + * implement Esc[#r when # is zero. This means no + * scroll but just return cursor to top of screen, + * do not clear screen. + */ + row = 0; + } + } + + tem_mv_cursor(tem, row, tems->a_c_cursor.col, + credp, called_from); + + if (tems->a_nscroll == 0) { + /* erase rest of cursor line */ + tem_clear_chars(tem, + tems->a_c_dimension.width - + tems->a_c_cursor.col, + tems->a_c_cursor.row, + tems->a_c_cursor.col, + credp, called_from); + + } + + tem_align_cursor(tem); +} + +static void +tem_send_data(struct tem *tem, cred_t *credp, + enum called_from called_from) +{ + struct tem_state *tems = tem->state; + text_color_t fg_color; + text_color_t bg_color; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + if (tems->a_outindex != 0) { + + if (tems->a_flags & TEM_ATTR_REVERSE) { + fg_color = ansi_fg_to_solaris(tem, + tems->bg_color); + bg_color = ansi_bg_to_solaris(tem, + tems->fg_color); + } else { + fg_color = ansi_fg_to_solaris(tem, + tems->fg_color); + bg_color = ansi_bg_to_solaris(tem, + tems->bg_color); + } + + /* + * Call the primitive to render this data. + */ + (*tems->in_fp.f_display)(tem, + tems->a_outbuf, + tems->a_outindex, + tems->a_s_cursor.row, + tems->a_s_cursor.col, + fg_color, bg_color, + credp, called_from); + tems->a_outindex = 0; + } + tem_align_cursor(tem); +} + + +/* + * We have just done something to the current output point. Reset the start + * point for the buffered data in a_outbuf. There shouldn't be any data + * buffered yet. + */ +void +tem_align_cursor(struct tem *tem) +{ + tem->state->a_s_cursor.row = tem->state->a_c_cursor.row; + tem->state->a_s_cursor.col = tem->state->a_c_cursor.col; +} + + + +/* + * State machine parser based on the current state and character input + * major terminations are to control character or normal character + */ + +static void +tem_parse(struct tem *tem, uchar_t ch, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + int i; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + if (tems->a_state == A_STATE_START) { /* Normal state? */ + if (ch == A_CSI || ch == A_ESC || ch < ' ') /* Control? */ + tem_control(tem, ch, credp, called_from); + else + /* Display */ + tem_outch(tem, ch, credp, called_from); + return; + } + + /* In <ESC> sequence */ + if (tems->a_state != A_STATE_ESC) { /* Need to get parameters? */ + if (tems->a_state != A_STATE_CSI) { + tem_getparams(tem, ch, credp, called_from); + return; + } + + switch (ch) { + case '?': + tems->a_state = A_STATE_CSI_QMARK; + return; + case '=': + tems->a_state = A_STATE_CSI_EQUAL; + return; + case 's': + /* + * As defined below, this sequence + * saves the cursor. However, Sun + * defines ESC[s as reset. We resolved + * the conflict by selecting reset as it + * is exported in the termcap file for + * sun-mon, while the "save cursor" + * definition does not exist anywhere in + * /etc/termcap. + * However, having no coherent + * definition of reset, we have not + * implemented it. + */ + + /* + * Original code + * tems->a_r_cursor.row = tems->a_c_cursor.row; + * tems->a_r_cursor.col = tems->a_c_cursor.col; + * tems->a_state = A_STATE_START; + */ + + tems->a_state = A_STATE_START; + return; + case 'u': + tem_mv_cursor(tem, tems->a_r_cursor.row, + tems->a_r_cursor.col, credp, called_from); + tems->a_state = A_STATE_START; + return; + case 'p': /* sunbow */ + tem_send_data(tem, credp, called_from); + /* + * Don't set anything if we are + * already as we want to be. + */ + if (tems->a_flags & TEM_ATTR_SCREEN_REVERSE) { + tems->a_flags &= ~TEM_ATTR_SCREEN_REVERSE; + /* + * If we have switched the characters to be the + * inverse from the screen, then switch them as + * well to keep them the inverse of the screen. + */ + if (tems->a_flags & TEM_ATTR_REVERSE) { + tems->a_flags &= ~TEM_ATTR_REVERSE; + } else { + tems->a_flags |= TEM_ATTR_REVERSE; + } + } + tem_cls(tem, credp, called_from); + tems->a_state = A_STATE_START; + return; + case 'q': /* sunwob */ + tem_send_data(tem, credp, called_from); + /* + * Don't set anything if we are + * already where as we want to be. + */ + if (!(tems->a_flags & TEM_ATTR_SCREEN_REVERSE)) { + tems->a_flags |= TEM_ATTR_SCREEN_REVERSE; + /* + * If we have switched the characters to be the + * inverse from the screen, then switch them as + * well to keep them the inverse of the screen. + */ + if (!(tems->a_flags & TEM_ATTR_REVERSE)) { + tems->a_flags |= TEM_ATTR_REVERSE; + } else { + tems->a_flags &= ~TEM_ATTR_REVERSE; + } + } + + tem_cls(tem, credp, called_from); + tems->a_state = A_STATE_START; + return; + case 'r': /* sunscrl */ + /* + * Rule exception: check for validity here. + */ + tems->a_nscroll = tems->a_paramval; + if (tems->a_nscroll > tems->a_c_dimension.height) + tems->a_nscroll = tems->a_c_dimension.height; + if (tems->a_nscroll < 0) + tems->a_nscroll = 1; + tems->a_state = A_STATE_START; + return; + default: + tem_getparams(tem, ch, credp, called_from); + return; + } + } + + /* Previous char was <ESC> */ + if (ch == '[') { + tems->a_curparam = 0; + tems->a_paramval = 0; + tems->a_gotparam = B_FALSE; + /* clear the parameters */ + for (i = 0; i < TEM_MAXPARAMS; i++) + tems->a_params[i] = -1; + tems->a_state = A_STATE_CSI; + } else if (ch == 'Q') { /* <ESC>Q ? */ + tems->a_curparam = 0; + tems->a_paramval = 0; + tems->a_gotparam = B_FALSE; + for (i = 0; i < TEM_MAXPARAMS; i++) + tems->a_params[i] = -1; /* Clr */ + /* Next get params */ + tems->a_state = A_STATE_ESC_Q; + } else if (ch == 'C') { /* <ESC>C ? */ + tems->a_curparam = 0; + tems->a_paramval = 0; + tems->a_gotparam = B_FALSE; + for (i = 0; i < TEM_MAXPARAMS; i++) + tems->a_params[i] = -1; /* Clr */ + /* Next get params */ + tems->a_state = A_STATE_ESC_C; + } else { + tems->a_state = A_STATE_START; + if (ch == 'c') + /* ESC c resets display */ + tem_reset_display(tem, credp, called_from, 1); + else if (ch == 'H') + /* ESC H sets a tab */ + tem_set_tab(tem); + else if (ch == '7') { + /* ESC 7 Save Cursor position */ + tems->a_r_cursor.row = tems->a_c_cursor.row; + tems->a_r_cursor.col = tems->a_c_cursor.col; + } else if (ch == '8') + /* ESC 8 Restore Cursor position */ + tem_mv_cursor(tem, tems->a_r_cursor.row, + tems->a_r_cursor.col, credp, called_from); + /* check for control chars */ + else if (ch < ' ') + tem_control(tem, ch, credp, called_from); + else + tem_outch(tem, ch, credp, called_from); + } +} + +/* ARGSUSED */ +static void +tem_bell(struct tem *tem, enum called_from called_from) +{ + if (called_from == CALLED_FROM_STANDALONE) + beep_polled(BEEP_CONSOLE); + else + beep(BEEP_CONSOLE); +} + + +static void +tem_scroll(tem_t *tem, int start, int end, int count, int direction, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + int row; + int lines_affected; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + lines_affected = end - start + 1; + if (count > lines_affected) + count = lines_affected; + if (count <= 0) + return; + + switch (direction) { + case TEM_SCROLL_UP: + if (count < lines_affected) { + tem_copy_area(tem, 0, start + count, + tems->a_c_dimension.width - 1, end, + 0, start, credp, called_from); + } + for (row = (end - count) + 1; row <= end; row++) { + tem_clear_chars(tem, tems->a_c_dimension.width, + row, 0, credp, called_from); + } + break; + + case TEM_SCROLL_DOWN: + if (count < lines_affected) { + tem_copy_area(tem, 0, start, + tems->a_c_dimension.width - 1, + end - count, 0, start + count, + credp, called_from); + } + for (row = start; row < start + count; row++) { + tem_clear_chars(tem, tems->a_c_dimension.width, + row, 0, credp, called_from); + } + break; + } +} + +static void +tem_copy_area(struct tem *tem, + screen_pos_t s_col, screen_pos_t s_row, + screen_pos_t e_col, screen_pos_t e_row, + screen_pos_t t_col, screen_pos_t t_row, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + int rows; + int cols; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + if (s_col < 0 || s_row < 0 || + e_col < 0 || e_row < 0 || + t_col < 0 || t_row < 0 || + s_col >= tems->a_c_dimension.width || + e_col >= tems->a_c_dimension.width || + t_col >= tems->a_c_dimension.width || + s_row >= tems->a_c_dimension.height || + e_row >= tems->a_c_dimension.height || + t_row >= tems->a_c_dimension.height) + return; + + if (s_row > e_row || s_col > e_col) + return; + + rows = e_row - s_row + 1; + cols = e_col - s_col + 1; + if (t_row + rows > tems->a_c_dimension.height || + t_col + cols > tems->a_c_dimension.width) + return; + + (*tems->in_fp.f_copy)(tem, s_col, s_row, + e_col, e_row, t_col, t_row, credp, called_from); +} + +static void +tem_clear_chars(struct tem *tem, int count, screen_pos_t row, + screen_pos_t col, cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + if (row < 0 || row >= tems->a_c_dimension.height || + col < 0 || col >= tems->a_c_dimension.width || + count < 0) + return; + + /* + * Note that very large values of "count" could cause col+count + * to overflow, so we check "count" independently. + */ + if (count > tems->a_c_dimension.width || + col + count > tems->a_c_dimension.width) + count = tems->a_c_dimension.width - col; + + (*tems->in_fp.f_cls)(tem, count, row, col, credp, called_from); +} + +void +tem_text_display(struct tem *tem, uchar_t *string, + int count, screen_pos_t row, screen_pos_t col, + text_color_t fg_color, text_color_t bg_color, + cred_t *credp, enum called_from called_from) +{ + struct vis_consdisplay da; + + da.data = string; + da.width = count; + da.row = row; + da.col = col; + + da.fg_color = fg_color; + da.bg_color = bg_color; + + tem_display(tem, &da, credp, called_from); +} + +/* + * This function is used to blit a rectangular color image, + * unperturbed on the underlying framebuffer, to render + * icons and pictures. The data is a pixel pattern that + * fills a rectangle bounded to the width and height parameters. + * The color pixel data must to be pre-adjusted by the caller + * for the current video depth. + * + * This function is unused now. + */ +void +tem_image_display(struct tem *tem, uchar_t *image, + int height, int width, screen_pos_t row, screen_pos_t col, + cred_t *credp, enum called_from called_from) +{ + struct vis_consdisplay da; + + da.data = image; + da.width = width; + da.height = height; + da.row = row; + da.col = col; + + tem_display(tem, &da, credp, called_from); +} + + +void +tem_text_copy(struct tem *tem, + screen_pos_t s_col, screen_pos_t s_row, + screen_pos_t e_col, screen_pos_t e_row, + screen_pos_t t_col, screen_pos_t t_row, + cred_t *credp, enum called_from called_from) +{ + struct vis_conscopy da; + + da.s_row = s_row; + da.s_col = s_col; + da.e_row = e_row; + da.e_col = e_col; + da.t_row = t_row; + da.t_col = t_col; + + tem_copy(tem, &da, credp, called_from); +} + +void +tem_text_cls(struct tem *tem, + int count, screen_pos_t row, screen_pos_t col, cred_t *credp, + enum called_from called_from) +{ + struct vis_consdisplay da; + + da.data = tem->state->a_blank_line; + da.width = count; + da.row = row; + da.col = col; + + tem_get_color(tem, &da.fg_color, &da.bg_color); + tem_display(tem, &da, credp, called_from); +} + + + +void +tem_pix_display(struct tem *tem, + uchar_t *string, int count, + screen_pos_t row, screen_pos_t col, + text_color_t fg_color, text_color_t bg_color, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + struct vis_consdisplay da; + int i; + da.data = (uchar_t *)tems->a_pix_data; + da.width = tems->a_font.width; + da.height = tems->a_font.height; + da.row = (row * da.height) + tems->a_p_offset.y; + da.col = (col * da.width) + tems->a_p_offset.x; + + for (i = 0; i < count; i++) { + BIT_TO_PIX(tem, string[i], fg_color, bg_color); + tem_display(tem, &da, credp, called_from); + da.col += da.width; + } +} + +void +tem_pix_copy(struct tem *tem, + screen_pos_t s_col, screen_pos_t s_row, + screen_pos_t e_col, screen_pos_t e_row, + screen_pos_t t_col, screen_pos_t t_row, + cred_t *credp, + enum called_from called_from) +{ + struct tem_state *tems = tem->state; + struct vis_conscopy ma; + static boolean_t need_clear = B_TRUE; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + if (need_clear && tems->first_line > 0) { + /* + * Clear OBP output above our kernel console term + * when our kernel console term begins to scroll up, + * we hope it is user friendly. + * (Also see comments on tem_pix_clear_prom_output) + * + * This is only one time call. + */ + tem_pix_clear_prom_output(tem, credp, called_from); + } + need_clear = B_FALSE; + + ma.s_row = s_row * tems->a_font.height + tems->a_p_offset.y; + ma.e_row = (e_row + 1) * tems->a_font.height + tems->a_p_offset.y - 1; + ma.t_row = t_row * tems->a_font.height + tems->a_p_offset.y; + + /* + * Check if we're in process of clearing OBP's columns area, + * which only happens when term scrolls up a whole line. + */ + if (tems->first_line > 0 && t_row < s_row && t_col == 0 && + e_col == tems->a_c_dimension.width - 1) { + /* + * We need to clear OBP's columns area outside our kernel + * console term. So that we set ma.e_col to entire row here. + */ + ma.s_col = s_col * tems->a_font.width; + ma.e_col = tems->a_p_dimension.width - 1; + + ma.t_col = t_col * tems->a_font.width; + } else { + ma.s_col = s_col * tems->a_font.width + tems->a_p_offset.x; + ma.e_col = (e_col + 1) * tems->a_font.width + + tems->a_p_offset.x - 1; + ma.t_col = t_col * tems->a_font.width + tems->a_p_offset.x; + } + + tem_copy(tem, &ma, credp, called_from); + + if (tems->first_line > 0 && t_row < s_row) { + /* We have scrolled up (s_row - t_row) rows. */ + tems->first_line -= (s_row - t_row); + if (tems->first_line <= 0) { + /* All OBP rows have been cleared. */ + tems->first_line = 0; + } + } + +} + +/* + * This function only clears count of columns in one row + */ +void +tem_pix_cls(struct tem *tem, int count, + screen_pos_t row, screen_pos_t col, cred_t *credp, + enum called_from called_from) +{ + struct tem_state *tems = tem->state; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + tem_pix_cls_range(tem, row, 1, tems->a_p_offset.y, + col, count, tems->a_p_offset.x, B_FALSE, credp, called_from); +} + +/* + * This function clears OBP output above our kernel console term area + * because OBP's term may have a bigger terminal window than that of + * our kernel console term. So we need to clear OBP output garbage outside + * of our kernel console term at a proper time, which is when the first + * row output of our kernel console term scrolls at the first screen line. + * + * _________________________________ + * | _____________________ | ---> OBP's bigger term window + * | | | | + * |___| | | + * | | | | | + * | | | | | + * |_|_|___________________|_______| + * | | | ---> first line + * | |___________________|---> our kernel console term window + * | + * |---> columns area to be cleared + * + * This function only takes care of the output above our kernel console term, + * and tem_prom_scroll_up takes care of columns area outside of our kernel + * console term. + */ +static void +tem_pix_clear_prom_output(struct tem *tem, cred_t *credp, + enum called_from called_from) +{ + struct tem_state *tems = tem->state; + int nrows, ncols, width, height; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + width = tems->a_font.width; + height = tems->a_font.height; + + nrows = (tems->a_p_offset.y + (height - 1))/ height; + ncols = (tems->a_p_dimension.width + (width - 1))/ width; + + tem_pix_cls_range(tem, 0, nrows, 0, 0, ncols, 0, + B_FALSE, credp, called_from); +} + +/* + * clear the whole screen for pixel mode + */ +static void +tem_pix_clear_entire_screen(struct tem *tem, cred_t *credp, + enum called_from called_from) +{ + struct tem_state *tems = tem->state; + int nrows, ncols, width, height; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + width = tems->a_font.width; + height = tems->a_font.height; + + nrows = (tems->a_p_dimension.height + (height - 1))/ height; + ncols = (tems->a_p_dimension.width + (width - 1))/ width; + + tem_pix_cls_range(tem, 0, nrows, 0, 0, ncols, 0, + B_FALSE, credp, called_from); + + tems->a_c_cursor.row = 0; + tems->a_c_cursor.col = 0; + tem_align_cursor(tem); + + /* + * Since the whole screen is cleared, we don't need + * to clear OBP output later. + */ + if (tems->first_line > 0) { + tems->first_line = 0; + } +} + +/* + * clear the whole screen + */ +static void +tem_cls(struct tem *tem, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + int row; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + if (tems->display_mode == VIS_TEXT) { + for (row = 0; row < tems->a_c_dimension.height; row++) { + tem_clear_chars(tem, tems->a_c_dimension.width, + row, 0, credp, called_from); + } + tems->a_c_cursor.row = 0; + tems->a_c_cursor.col = 0; + tem_align_cursor(tem); + return; + } + + ASSERT(tems->display_mode == VIS_PIXEL); + + tem_pix_clear_entire_screen(tem, credp, called_from); +} + +static void +tem_back_tab(struct tem *tem, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + int i; + screen_pos_t tabstop; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + tabstop = 0; + + for (i = tems->a_ntabs - 1; i >= 0; i--) { + if (tems->a_tabs[i] < tems->a_c_cursor.col) { + tabstop = tems->a_tabs[i]; + break; + } + } + + tem_mv_cursor(tem, tems->a_c_cursor.row, + tabstop, credp, called_from); +} + +static void +tem_tab(struct tem *tem, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + int i; + screen_pos_t tabstop; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + tabstop = tems->a_c_dimension.width - 1; + + for (i = 0; i < tems->a_ntabs; i++) { + if (tems->a_tabs[i] > tems->a_c_cursor.col) { + tabstop = tems->a_tabs[i]; + break; + } + } + + tem_mv_cursor(tem, tems->a_c_cursor.row, + tabstop, credp, called_from); +} + +static void +tem_set_tab(struct tem *tem) +{ + struct tem_state *tems = tem->state; + int i; + int j; + + if (tems->a_ntabs == TEM_MAXTAB) + return; + if (tems->a_ntabs == 0 || + tems->a_tabs[tems->a_ntabs] < tems->a_c_cursor.col) { + tems->a_tabs[tems->a_ntabs++] = tems->a_c_cursor.col; + return; + } + for (i = 0; i < tems->a_ntabs; i++) { + if (tems->a_tabs[i] == tems->a_c_cursor.col) + return; + if (tems->a_tabs[i] > tems->a_c_cursor.col) { + for (j = tems->a_ntabs - 1; j >= i; j--) + tems->a_tabs[j+ 1] = tems->a_tabs[j]; + tems->a_tabs[i] = tems->a_c_cursor.col; + tems->a_ntabs++; + return; + } + } +} + +static void +tem_clear_tabs(struct tem *tem, int action) +{ + struct tem_state *tems = tem->state; + int i; + int j; + + switch (action) { + case 3: /* clear all tabs */ + tems->a_ntabs = 0; + break; + case 0: /* clr tab at cursor */ + + for (i = 0; i < tems->a_ntabs; i++) { + if (tems->a_tabs[i] == tems->a_c_cursor.col) { + tems->a_ntabs--; + for (j = i; j < tems->a_ntabs; j++) + tems->a_tabs[j] = tems->a_tabs[j + 1]; + return; + } + } + break; + } +} + +static void +tem_mv_cursor(struct tem *tem, int row, int col, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + /* + * Sanity check and bounds enforcement. Out of bounds requests are + * clipped to the screen boundaries. This seems to be what SPARC + * does. + */ + if (row < 0) + row = 0; + if (row >= tems->a_c_dimension.height) + row = tems->a_c_dimension.height - 1; + if (col < 0) + col = 0; + if (col >= tems->a_c_dimension.width) + col = tems->a_c_dimension.width - 1; + + tem_send_data(tem, credp, called_from); + tems->a_c_cursor.row = row; + tems->a_c_cursor.col = col; + tem_align_cursor(tem); +} + +/* ARGSUSED */ +void +tem_reset_emulator(struct tem *tem, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + int j; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + tems->a_c_cursor.row = 0; + tems->a_c_cursor.col = 0; + tems->a_r_cursor.row = 0; + tems->a_r_cursor.col = 0; + tems->a_s_cursor.row = 0; + tems->a_s_cursor.col = 0; + tems->a_outindex = 0; + tems->a_state = A_STATE_START; + tems->a_gotparam = B_FALSE; + tems->a_curparam = 0; + tems->a_paramval = 0; + tems->a_flags = 0; + tems->a_nscroll = 1; + tems->fg_color = DEFAULT_ANSI_FOREGROUND; + tems->bg_color = DEFAULT_ANSI_BACKGROUND; + + /* + * set up the initial tab stops + */ + tems->a_ntabs = 0; + for (j = 8; j < tems->a_c_dimension.width; j += 8) + tems->a_tabs[tems->a_ntabs++] = (screen_pos_t)j; + + for (j = 0; j < TEM_MAXPARAMS; j++) + tems->a_params[j] = 0; +} + +void +tem_reset_display(struct tem *tem, + cred_t *credp, enum called_from called_from, int clear_txt) +{ + struct tem_state *tems = tem->state; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + tem_reset_emulator(tem, credp, called_from); + tem_reset_colormap(tem, credp, called_from); + + if (clear_txt) { + (*tems->in_fp.f_cursor)(tem, + VIS_HIDE_CURSOR, credp, called_from); + + tem_cls(tem, credp, called_from); + + (*tems->in_fp.f_cursor)(tem, + VIS_DISPLAY_CURSOR, credp, called_from); + } + + tems->a_initialized = 1; +} + + +static void +tem_shift( + struct tem *tem, + int count, + int direction, + cred_t *credp, + enum called_from called_from) +{ + struct tem_state *tems = tem->state; + int rest_of_line; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + rest_of_line = tems->a_c_dimension.width - tems->a_c_cursor.col; + if (count > rest_of_line) + count = rest_of_line; + + if (count <= 0) + return; + + switch (direction) { + case TEM_SHIFT_LEFT: + if (count < rest_of_line) { + tem_copy_area(tem, + tems->a_c_cursor.col + count, + tems->a_c_cursor.row, + tems->a_c_dimension.width - 1, + tems->a_c_cursor.row, + tems->a_c_cursor.col, + tems->a_c_cursor.row, + credp, called_from); + } + + tem_clear_chars(tem, count, tems->a_c_cursor.row, + (tems->a_c_dimension.width - count), credp, + called_from); + break; + case TEM_SHIFT_RIGHT: + if (count < rest_of_line) { + tem_copy_area(tem, + tems->a_c_cursor.col, + tems->a_c_cursor.row, + tems->a_c_dimension.width - count - 1, + tems->a_c_cursor.row, + tems->a_c_cursor.col + count, + tems->a_c_cursor.row, + credp, called_from); + } + + tem_clear_chars(tem, count, tems->a_c_cursor.row, + tems->a_c_cursor.col, credp, called_from); + break; + } +} + +void +tem_text_cursor(struct tem *tem, short action, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + struct vis_conscursor ca; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + ca.row = tems->a_c_cursor.row; + ca.col = tems->a_c_cursor.col; + ca.action = action; + + tem_cursor(tem, &ca, credp, called_from); + + if (action == VIS_GET_CURSOR) { + tems->a_c_cursor.row = ca.row; + tems->a_c_cursor.col = ca.col; + } +} + + +void +tem_pix_cursor(struct tem *tem, short action, + cred_t *credp, enum called_from called_from) +{ + struct tem_state *tems = tem->state; + struct vis_conscursor ca; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + ca.row = tems->a_c_cursor.row * tems->a_font.height + + tems->a_p_offset.y; + ca.col = tems->a_c_cursor.col * tems->a_font.width + + tems->a_p_offset.x; + ca.width = tems->a_font.width; + ca.height = tems->a_font.height; + if (tems->a_pdepth == 8 || tems->a_pdepth == 4) { + if (tems->a_flags & TEM_ATTR_REVERSE) { + ca.fg_color.mono = TEM_TEXT_WHITE; + ca.bg_color.mono = TEM_TEXT_BLACK; + } else { + ca.fg_color.mono = TEM_TEXT_BLACK; + ca.bg_color.mono = TEM_TEXT_WHITE; + } + } else if (tems->a_pdepth == 24 || tems->a_pdepth == 32) { + if (tems->a_flags & TEM_ATTR_REVERSE) { + ca.fg_color.twentyfour[0] = TEM_TEXT_WHITE24_RED; + ca.fg_color.twentyfour[1] = TEM_TEXT_WHITE24_GREEN; + ca.fg_color.twentyfour[2] = TEM_TEXT_WHITE24_BLUE; + + ca.bg_color.twentyfour[0] = TEM_TEXT_BLACK24_RED; + ca.bg_color.twentyfour[1] = TEM_TEXT_BLACK24_GREEN; + ca.bg_color.twentyfour[2] = TEM_TEXT_BLACK24_BLUE; + } else { + ca.fg_color.twentyfour[0] = TEM_TEXT_BLACK24_RED; + ca.fg_color.twentyfour[1] = TEM_TEXT_BLACK24_GREEN; + ca.fg_color.twentyfour[2] = TEM_TEXT_BLACK24_BLUE; + + ca.bg_color.twentyfour[0] = TEM_TEXT_WHITE24_RED; + ca.bg_color.twentyfour[1] = TEM_TEXT_WHITE24_GREEN; + ca.bg_color.twentyfour[2] = TEM_TEXT_WHITE24_BLUE; + } + } + + ca.action = action; + + tem_cursor(tem, &ca, credp, called_from); +} + +#define BORDER_PIXELS 10 +void +set_font(struct font *f, short *rows, short *cols, short height, short width) +{ + bitmap_data_t *font_selected = NULL; + struct fontlist *fl; + + /* + * Find best font for these dimensions, or use default + * + * A 1 pixel border is the absolute minimum we could have + * as a border around the text window (BORDER_PIXELS = 2), + * however a slightly larger border not only looks better + * but for the fonts currently statically built into the + * emulator causes much better font selection for the + * normal range of screen resolutions. + */ + for (fl = fonts; fl->data; fl++) { + if ((((*rows * fl->data->height) + BORDER_PIXELS) <= height) && + (((*cols * fl->data->width) + BORDER_PIXELS) <= width)) { + font_selected = fl->data; + break; + } + } + /* + * The minus 2 is to make sure we have at least a 1 pixel + * boarder around the entire screen. + */ + if (font_selected == NULL) { + if (((*rows * DEFAULT_FONT_DATA.height) > height) || + ((*cols * DEFAULT_FONT_DATA.width) > width)) { + *rows = (height - 2) / DEFAULT_FONT_DATA.height; + *cols = (width - 2) / DEFAULT_FONT_DATA.width; + } + font_selected = &DEFAULT_FONT_DATA; + } + + f->width = font_selected->width; + f->height = font_selected->height; + bcopy((caddr_t)font_selected->encoding, (caddr_t)f->char_ptr, + sizeof (f->char_ptr)); + f->image_data = font_selected->image; + +} + +/* + * bit_to_pix4 is for 4-bit frame buffers. It will write one output byte + * for each 2 bits of input bitmap. It inverts the input bits before + * doing the output translation, for reverse video. + * + * Assuming foreground is 0001 and background is 0000... + * An input data byte of 0x53 will output the bit pattern + * 00000001 00000001 00000000 00010001. + */ + +void +bit_to_pix4( + struct tem *tem, + uchar_t c, + text_color_t fg_color, + text_color_t bg_color) +{ + struct tem_state *tems = tem->state; + int row; + int byte; + int i; + uint8_t *cp; + uint8_t data; + uint8_t nibblett; + int bytes_wide; + uint8_t *dest; + + dest = (uint8_t *)tems->a_pix_data; + + cp = tems->a_font.char_ptr[c]; + bytes_wide = (tems->a_font.width + 7) / 8; + + for (row = 0; row < tems->a_font.height; row++) { + for (byte = 0; byte < bytes_wide; byte++) { + data = *cp++; + for (i = 0; i < 4; i++) { + nibblett = (data >> ((3-i) * 2)) & 0x3; + switch (nibblett) { + case 0x0: + *dest++ = bg_color << 4 | bg_color; + break; + case 0x1: + *dest++ = bg_color << 4 | fg_color; + break; + case 0x2: + *dest++ = fg_color << 4 | bg_color; + break; + case 0x3: + *dest++ = fg_color << 4 | fg_color; + break; + } + } + } + } +} + +/* + * bit_to_pix8 is for 8-bit frame buffers. It will write one output byte + * for each bit of input bitmap. It inverts the input bits before + * doing the output translation, for reverse video. + * + * Assuming foreground is 00000001 and background is 00000000... + * An input data byte of 0x53 will output the bit pattern + * 0000000 000000001 00000000 00000001 00000000 00000000 00000001 00000001. + */ + +void +bit_to_pix8( + struct tem *tem, + uchar_t c, + text_color_t fg_color, + text_color_t bg_color) +{ + struct tem_state *tems = tem->state; + int row; + int byte; + int i; + uint8_t *cp; + uint8_t data; + int bytes_wide; + uint8_t mask; + int bitsleft, nbits; + uint8_t *dest; + + dest = (uint8_t *)tems->a_pix_data; + + cp = tems->a_font.char_ptr[c]; + bytes_wide = (tems->a_font.width + 7) / 8; + + for (row = 0; row < tems->a_font.height; row++) { + bitsleft = tems->a_font.width; + for (byte = 0; byte < bytes_wide; byte++) { + data = *cp++; + mask = 0x80; + nbits = MIN(8, bitsleft); + bitsleft -= nbits; + for (i = 0; i < nbits; i++) { + *dest++ = (data & mask ? fg_color: bg_color); + mask = mask >> 1; + } + } + } +} + +/* + * bit_to_pix24 is for 24-bit frame buffers. It will write four output bytes + * for each bit of input bitmap. It inverts the input bits before + * doing the output translation, for reverse video. Note that each + * 24-bit RGB value is finally stored in a 32-bit unsigned int, with the + * high-order byte set to zero. + * + * Assuming foreground is 00000000 11111111 11111111 11111111 + * and background is 00000000 00000000 00000000 00000000 + * An input data byte of 0x53 will output the bit pattern + * + * 00000000 00000000 00000000 00000000 + * 00000000 11111111 11111111 11111111 + * 00000000 00000000 00000000 00000000 + * 00000000 11111111 11111111 11111111 + * 00000000 00000000 00000000 00000000 + * 00000000 00000000 00000000 00000000 + * 00000000 11111111 11111111 11111111 + * 00000000 11111111 11111111 11111111 + * + */ +typedef uint32_t pixel32_t; + +void +bit_to_pix24( + struct tem *tem, + uchar_t c, + text_color_t fg_color4, + text_color_t bg_color4) +{ + struct tem_state *tems = tem->state; + int row; + int byte; + int i; + uint8_t *cp; + uint8_t data; + int bytes_wide; + int bitsleft, nbits; + + pixel32_t fg_color32, bg_color32, *destp; + + ASSERT(fg_color4 < 16 && bg_color4 < 16); + + fg_color32 = PIX4TO32(fg_color4); + bg_color32 = PIX4TO32(bg_color4); + + destp = (pixel32_t *)tems->a_pix_data; + cp = tems->a_font.char_ptr[c]; + bytes_wide = (tems->a_font.width + 7) / 8; + + for (row = 0; row < tems->a_font.height; row++) { + bitsleft = tems->a_font.width; + for (byte = 0; byte < bytes_wide; byte++) { + data = *cp++; + nbits = MIN(8, bitsleft); + bitsleft -= nbits; + for (i = 0; i < nbits; i++) { + *destp++ = ((data << i) & 0x80 ? + fg_color32 : bg_color32); + } + } + } +} + +/* ARGSUSED */ +text_color_t +ansi_bg_to_solaris(struct tem *tem, int ansi) +{ + return (bg_xlate[ansi]); +} + +text_color_t +ansi_fg_to_solaris(struct tem *tem, int ansi) +{ + if (tem->state->a_flags & TEM_ATTR_BOLD) + return (fg_brt_xlate[ansi]); + else + return (fg_dim_xlate[ansi]); +} + +static void +tem_get_color(struct tem *tem, text_color_t *fg, text_color_t *bg) +{ + if (tem->state->a_flags & TEM_ATTR_SCREEN_REVERSE) { + *fg = ansi_fg_to_solaris(tem, + DEFAULT_ANSI_BACKGROUND); + *bg = ansi_bg_to_solaris(tem, + DEFAULT_ANSI_FOREGROUND); + } else { + *fg = ansi_fg_to_solaris(tem, + DEFAULT_ANSI_FOREGROUND); + *bg = ansi_bg_to_solaris(tem, + DEFAULT_ANSI_BACKGROUND); + } +} + +/* + * Clear a rectangle of screen for pixel mode. + * + * arguments: + * row: start row# + * nrows: the number of rows to clear + * offset_y: the offset of height in pixels to begin clear + * col: start col# + * ncols: the number of cols to clear + * offset_x: the offset of width in pixels to begin clear + * scroll_up: whether this function is called during sroll up, + * which is called only once. + */ +void +tem_pix_cls_range(tem_t *tem, + screen_pos_t row, int nrows, int offset_y, + screen_pos_t col, int ncols, int offset_x, + boolean_t sroll_up, cred_t *credp, + enum called_from called_from) +{ + struct tem_state *tems = tem->state; + struct vis_consdisplay da; + int i, j; + int row_add = 0; + text_color_t fg_color; + text_color_t bg_color; + + ASSERT((called_from == CALLED_FROM_STANDALONE) || + MUTEX_HELD(&tem->lock)); + + if (sroll_up) + row_add = tems->a_c_dimension.height - 1; + + da.width = tems->a_font.width; + da.height = tems->a_font.height; + + tem_get_color(tem, &fg_color, &bg_color); + + BIT_TO_PIX(tem, ' ', fg_color, bg_color); + da.data = (uchar_t *)tems->a_pix_data; + + for (i = 0; i < nrows; i++, row++) { + da.row = (row + row_add) * da.height + offset_y; + da.col = col * da.width + offset_x; + for (j = 0; j < ncols; j++) { + tem_display(tem, &da, credp, called_from); + da.col += da.width; + } + } +}
--- a/usr/src/uts/common/io/terminal-emulator.c Thu Jan 12 17:28:32 2006 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2502 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -/* - * ANSI terminal emulator module; parse ANSI X3.64 escape sequences and - * the like. - */ - -#include <sys/types.h> -#include <sys/file.h> -#include <sys/conf.h> -#include <sys/errno.h> -#include <sys/open.h> -#include <sys/cred.h> -#include <sys/kmem.h> -#include <sys/ascii.h> -#include <sys/consdev.h> -#include <sys/font.h> -#include <sys/fbio.h> -#include <sys/conf.h> -#include <sys/modctl.h> -#include <sys/strsubr.h> -#include <sys/stat.h> -#include <sys/visual_io.h> -#include <sys/tem_impl.h> -#include <sys/terminal-emulator.h> -#include <sys/param.h> -#include <sys/debug.h> -#include <sys/cmn_err.h> -#include <sys/console.h> -#include <sys/ddi.h> -#include <sys/sunddi.h> -#include <sys/sunldi.h> -#include <sys/beep.h> -#include <sys/promif.h> - -/* Terminal emulator functions */ -static int tem_setup_terminal(struct vis_devinit *, - struct terminal_emulator *); -static void tem_control(struct terminal_emulator *, unsigned char, - cred_t *, enum called_from); -static void tem_setparam(struct terminal_emulator *, int, int); -static void tem_selgraph(struct terminal_emulator *); -static void tem_chkparam(struct terminal_emulator *, unsigned char, - cred_t *, enum called_from); -static void tem_getparams(struct terminal_emulator *, unsigned char, - cred_t *, enum called_from); -static void tem_outch(struct terminal_emulator *, unsigned char, - cred_t *, enum called_from); -static void tem_parse(struct terminal_emulator *, unsigned char, - cred_t *, enum called_from); -static void tem_new_line(struct terminal_emulator *, - cred_t *, enum called_from); -static void tem_cr(struct terminal_emulator *); -static void tem_lf(struct terminal_emulator *, - cred_t *, enum called_from); -static void tem_send_data(struct terminal_emulator *, cred_t *, - enum called_from); -static void tem_align_cursor(struct terminal_emulator *); -static void tem_cls(struct terminal_emulator *, - cred_t *, enum called_from); -static void tem_clear_entire(struct terminal_emulator *, - cred_t *, enum called_from); -static void tem_reset_emulator(struct terminal_emulator *); -static void tem_reset_colormap(struct terminal_emulator *, - cred_t *, enum called_from); -static void tem_reset_display(struct terminal_emulator *, - cred_t *, enum called_from, int); -static void tem_tab(struct terminal_emulator *, - cred_t *, enum called_from); -static void tem_back_tab(struct terminal_emulator *, - cred_t *, enum called_from); -static void tem_clear_tabs(struct terminal_emulator *, int); -static void tem_set_tab(struct terminal_emulator *); -static void tem_mv_cursor(struct terminal_emulator *, int, int, - cred_t *, enum called_from); -static void tem_shift(struct terminal_emulator *, int, int, - cred_t *, enum called_from); -static void tem_scroll(struct terminal_emulator *, int, int, - int, int, cred_t *, enum called_from); -static void tem_clear_chars(struct terminal_emulator *tem, - int count, screen_pos_t row, screen_pos_t col, - cred_t *credp, enum called_from called_from); -static void tem_copy_area(struct terminal_emulator *tem, - screen_pos_t s_col, screen_pos_t s_row, - screen_pos_t e_col, screen_pos_t e_row, - screen_pos_t t_col, screen_pos_t t_row, - cred_t *credp, enum called_from called_from); -static void tem_free(struct terminal_emulator *); -static void tem_terminal_emulate(struct terminal_emulator *, - unsigned char *, int, cred_t *, enum called_from); -static void tem_text_display(struct terminal_emulator *, unsigned char *, - int, screen_pos_t, screen_pos_t, - text_color_t, text_color_t, - cred_t *, enum called_from); -static void tem_text_copy(struct terminal_emulator *, - screen_pos_t, screen_pos_t, - screen_pos_t, screen_pos_t, - screen_pos_t, screen_pos_t, - cred_t *, enum called_from); -static void tem_text_cursor(struct terminal_emulator *, short, - cred_t *, enum called_from); -static void tem_text_cls(struct terminal_emulator *tem, - int count, screen_pos_t row, screen_pos_t col, - cred_t *credp, enum called_from called_from); -static void tem_pix_display(struct terminal_emulator *, unsigned char *, - int, screen_pos_t, screen_pos_t, - text_color_t, text_color_t, - cred_t *, enum called_from); -static void tem_pix_copy(struct terminal_emulator *, - screen_pos_t, screen_pos_t, - screen_pos_t, screen_pos_t, - screen_pos_t, screen_pos_t, - cred_t *, enum called_from); -static void tem_pix_cursor(struct terminal_emulator *, short, cred_t *, - enum called_from); -static void tem_pix_cls(struct terminal_emulator *tem, - int count, screen_pos_t row, screen_pos_t col, - cred_t *credp, enum called_from called_from); -static void tem_bell(struct terminal_emulator *tem, - enum called_from called_from); -static void tem_reset_colormap(struct terminal_emulator *, - cred_t *, enum called_from); -static text_color_t ansi_bg_to_solaris(struct terminal_emulator *tem, - int ansi); -static text_color_t ansi_fg_to_solaris(struct terminal_emulator *tem, - int ansi); -static void tem_display(struct terminal_emulator *tem, - struct vis_consdisplay *pda, cred_t *credp, - enum called_from called_from); -static void tem_copy(struct terminal_emulator *tem, - struct vis_conscopy *pma, cred_t *credp, - enum called_from called_from); -static void tem_cursor(struct terminal_emulator *tem, - struct vis_conscursor *pca, cred_t *credp, - enum called_from called_from); - -static void set_font(struct font *, short *, short *, short, short); - -#ifdef HAVE_1BIT -static void bit_to_pix1(struct terminal_emulator *, unsigned char, - text_color_t, text_color_t); -#endif -static void bit_to_pix4(struct terminal_emulator *, unsigned char, - text_color_t, text_color_t); -static void bit_to_pix8(struct terminal_emulator *, unsigned char, - text_color_t, text_color_t); -static void bit_to_pix24(struct terminal_emulator *, unsigned char, - text_color_t, text_color_t); - -#define INVERSE(ch) (ch ^ 0xff) - -extern bitmap_data_t builtin_font_data; -extern struct fontlist fonts[]; - - -#define BIT_TO_PIX(tem, c, fg, bg) { \ - ASSERT((tem)->in_fp.f_bit2pix != NULL); \ - (void) (*(tem)->in_fp.f_bit2pix)((tem), (c), (fg), (bg)); \ -} - -#define NELEM(a) (sizeof (a) / sizeof (*(a))) - - -/* - * Globals - */ -ldi_ident_t term_li = NULL; -int default_ansi_fg = 7; /* WHITE */ -int default_ansi_bg = 0; /* BLACK */ - - -extern struct mod_ops mod_miscops; - -static struct modlmisc modlmisc = { - &mod_miscops, /* modops */ - "ANSI Terminal Emulator", /* name */ -}; - -static struct modlinkage modlinkage = { - MODREV_1, (void *)&modlmisc, NULL -}; - -int -_init(void) -{ - int ret; - ret = mod_install(&modlinkage); - if (ret != 0) - return (ret); - ret = ldi_ident_from_mod(&modlinkage, &term_li); - if (ret != 0) { - (void) mod_remove(&modlinkage); - return (ret); - } - return (0); -} - -int -_fini() -{ - int ret; - - ret = mod_remove(&modlinkage); - if (ret == 0) { - ldi_ident_release(term_li); - term_li = NULL; - } - return (ret); -} - -int -_info(struct modinfo *modinfop) -{ - return (mod_info(&modlinkage, modinfop)); -} - -struct fontlist fonts[] = { - {"fonts/large.pcf", NULL, NULL}, - {"fonts/med.pcf", NULL, NULL}, - {"fonts/small.pcf", NULL, NULL}, - {NULL, NULL, NULL} -}; - -int -tem_fini(struct terminal_emulator *tem) -{ - int lyr_rval; - - mutex_enter(&tem->lock); - - if (tem->hdl != NULL) { - /* - * Allow layered on driver to clean up console private - * data. - */ - (void) ldi_ioctl(tem->hdl, VIS_DEVFINI, - 0, FKIOCTL, kcred, &lyr_rval); - - /* - * Close layered on driver - */ - (void) ldi_close(tem->hdl, NULL, kcred); - tem->hdl = NULL; - } - - mutex_exit(&tem->lock); - - tem_free(tem); - - return (0); -} - -/* - * This is the main entry point to the module. It handles output requests - * during normal system operation, when (e.g.) mutexes are available. - */ -int -tem_write( - struct terminal_emulator *tem, - unsigned char *buf, - int len, - cred_t *credp) -{ - static int first_time = 1; - - mutex_enter(&tem->lock); - - if (tem->hdl == NULL) { - mutex_exit(&tem->lock); - return (ENXIO); - } - - /* - * Realign the console cursor. We did this in tem_init(). - * However, drivers in the console stream may emit additional - * messages before we are ready. This causes text overwrite - * on the screen. This is a workaround. - */ - if (first_time && tem->display_mode == VIS_TEXT) { - tem_text_cursor(tem, VIS_GET_CURSOR, credp, CALLED_FROM_NORMAL); - tem_align_cursor(tem); - } - first_time = 0; - - tem_terminal_emulate(tem, buf, len, credp, CALLED_FROM_NORMAL); - - mutex_exit(&tem->lock); - return (0); -} - -/* - * This entry point handles output requests from restricted contexts like - * kmdb, where services like mutexes are not available. - */ -int -tem_polled_write( - struct terminal_emulator *tem, - unsigned char *buf, - int len) -{ - if (tem->hdl == NULL) - return (ENXIO); - - if (tem->standalone_writes_ok) { - tem_terminal_emulate(tem, buf, len, NULL, - CALLED_FROM_STANDALONE); - } - - return (0); -} - -int -tem_init( - struct terminal_emulator **ptem, - char *pathname, - cred_t *credp, - int default_rows, - int default_cols) -{ - int err = 0, lyr_rval; - struct vis_devinit temargs; - struct terminal_emulator *tem; - char *pathbuf; - - tem = (struct terminal_emulator *) - kmem_alloc(sizeof (struct terminal_emulator), KM_SLEEP); - - *ptem = tem; - - mutex_init(&tem->lock, (char *)NULL, MUTEX_DRIVER, NULL); - mutex_enter(&tem->lock); - - tem->default_dims.height = default_rows; - tem->default_dims.width = default_cols; - - /* - * Open the layered device using the devfs physical device name - * after adding the /devices prefix. - */ - pathbuf = kmem_alloc(MAXPATHLEN, KM_SLEEP); - (void) strcpy(pathbuf, "/devices"); - if (i_ddi_prompath_to_devfspath(pathname, - pathbuf + strlen("/devices")) != DDI_SUCCESS) { - cmn_err(CE_WARN, "terminal-emulator: path conversion error"); - kmem_free(pathbuf, MAXPATHLEN); - tem->hdl = NULL; - err = ENXIO; - goto fail_1; - } - if (ldi_open_by_name(pathbuf, FWRITE, credp, &tem->hdl, term_li) != 0) { - cmn_err(CE_WARN, "terminal-emulator: device path open error"); - kmem_free(pathbuf, MAXPATHLEN); - tem->hdl = NULL; - err = ENXIO; - goto fail_1; - } - kmem_free(pathbuf, MAXPATHLEN); - - /* - * Initialize the console and get the device parameters - */ - if (ldi_ioctl(tem->hdl, VIS_DEVINIT, - (intptr_t)&temargs, FWRITE|FKIOCTL, credp, &lyr_rval) != 0) { - cmn_err(CE_WARN, "terminal-emulator: VIS_DEVINIT failed"); - err = ENXIO; - goto fail_2; - } - - tem->linebytes = temargs.linebytes; - tem->display_mode = temargs.mode; - tem->fb_polledio = temargs.polledio; - - /* - * Initialize the terminal emulator - */ - err = tem_setup_terminal(&temargs, tem); - if (err != 0) { - cmn_err(CE_WARN, - "terminal-emulator: terminal emulator initialization failed."); - goto fail_3; - } - - tem_reset_display(tem, credp, CALLED_FROM_NORMAL, 0); - - /* - * Allow standalone writes. - */ - tem->standalone_writes_ok = B_TRUE; - mutex_exit(&tem->lock); - return (0); - -fail_3: - /* - * Allow layered driver to clean up console private - * data. - */ - (void) ldi_ioctl(tem->hdl, VIS_DEVFINI, 0, FWRITE|FKIOCTL, - credp, &lyr_rval); -fail_2: - (void) ldi_close(tem->hdl, NULL, credp); - tem->hdl = NULL; -fail_1: - mutex_exit(&tem->lock); - return (err); -} - -static int -tem_setup_terminal(struct vis_devinit *tp, struct terminal_emulator *tem) -{ - int i; - - /* Make sure the fb driver and terminal emulator versions match */ - if (tp->version != VIS_CONS_REV) { - return (EINVAL); - } - - tem->a_pdepth = tp->depth; - - switch (tp->mode) { - case VIS_TEXT: - tem->a_p_dimension.width = 0; - tem->a_p_dimension.height = 0; - tem->a_c_dimension.width = tp->width; - tem->a_c_dimension.height = tp->height; - tem->in_fp.f_display = tem_text_display; - tem->in_fp.f_copy = tem_text_copy; - tem->in_fp.f_cursor = tem_text_cursor; - tem->in_fp.f_bit2pix = NULL; - tem->in_fp.f_cls = tem_text_cls; - tem->a_blank_line = (unsigned char *) - kmem_alloc(tem->a_c_dimension.width, KM_SLEEP); - for (i = 0; i < tem->a_c_dimension.width; i++) - tem->a_blank_line[i] = ' '; - - break; - case VIS_PIXEL: - /* - * First check to see if the user has specified a screen size. - * If so, use those values. Else use 34x80 as the default. - */ - if (tem->default_dims.width != 0) - tem->a_c_dimension.width = tem->default_dims.width; - else - tem->a_c_dimension.width = TEM_DEFAULT_COLS; - - if (tem->default_dims.height != 0) - tem->a_c_dimension.height = tem->default_dims.height; - else - tem->a_c_dimension.height = TEM_DEFAULT_ROWS; - - tem->in_fp.f_display = tem_pix_display; - tem->in_fp.f_copy = tem_pix_copy; - tem->in_fp.f_cursor = tem_pix_cursor; - tem->in_fp.f_cls = tem_pix_cls; - tem->a_blank_line = NULL; - tem->a_p_dimension.height = tp->height; - tem->a_p_dimension.width = tp->width; - /* - * set_font() will select a appropriate sized font for - * the number of rows and columns selected. If we don't - * have a font that will fit, then it will use the - * default builtin font and adjust the rows and columns - * to fit on the screen. - */ - set_font(&tem->a_font, - &tem->a_c_dimension.height, &tem->a_c_dimension.width, - tem->a_p_dimension.height, tem->a_p_dimension.width); - tem->a_p_offset.y = (tem->a_p_dimension.height - - (tem->a_c_dimension.height * tem->a_font.height)) / 2; - tem->a_p_offset.x = (tem->a_p_dimension.width - - (tem->a_c_dimension.width * tem->a_font.width)) / 2; - - switch (tp->depth) { -#if defined(HAVE_1BIT) - case 1: - tem->in_fp.f_bit2pix = bit_to_pix1; - tem->a_pix_data_size = ((tem->a_font.width + NBBY - - 1) / NBBY) * tem->a_font.height; - break; -#endif /* HAVE_1BIT */ - case 4: - tem->in_fp.f_bit2pix = bit_to_pix4; - tem->a_pix_data_size = (((tem->a_font.width * 4) + - NBBY - 1) / NBBY) * tem->a_font.height; - break; - case 8: - tem->in_fp.f_bit2pix = bit_to_pix8; - tem->a_pix_data_size = tem->a_font.width * - tem->a_font.height; - break; - case 24: - tem->in_fp.f_bit2pix = bit_to_pix24; - tem->a_pix_data_size = tem->a_font.width * - tem->a_font.height; - tem->a_pix_data_size *= 4; - break; - } - - tem->a_pix_data = kmem_alloc(tem->a_pix_data_size, KM_SLEEP); - break; - - default: - tem_free(tem); - return (ENXIO); - } - - tem->a_outbuf = - (unsigned char *)kmem_alloc(tem->a_c_dimension.width, KM_SLEEP); - - return (0); -} - - -static void -tem_free(struct terminal_emulator *tem) -{ - if (tem == NULL) - return; - - if (tem->a_outbuf != NULL) - kmem_free(tem->a_outbuf, tem->a_c_dimension.width); - if (tem->a_blank_line != NULL) - kmem_free(tem->a_blank_line, tem->a_c_dimension.width); - if (tem->a_pix_data != NULL) - kmem_free(tem->a_pix_data, tem->a_pix_data_size); - if (tem->a_font.image_data != NULL && tem->a_font.image_data_size > 0) - kmem_free(tem->a_font.image_data, tem->a_font.image_data_size); - kmem_free(tem, sizeof (struct terminal_emulator)); -} - -/* - * This is the main entry point into the terminal emulator. - * - * For each data message coming downstream, ANSI assumes that it is composed - * of ASCII characters, which are treated as a byte-stream input to the - * parsing state machine. All data is parsed immediately -- there is - * no enqueing. - */ -static void -tem_terminal_emulate( - struct terminal_emulator *tem, - unsigned char *buf, - int len, - cred_t *credp, - enum called_from called_from) -{ - (*tem->in_fp.f_cursor)(tem, VIS_HIDE_CURSOR, credp, called_from); - - for (; len > 0; len--, buf++) - tem_parse(tem, *buf, credp, called_from); - - /* - * Send the data we just got to the framebuffer. - */ - tem_send_data(tem, credp, called_from); - - (*tem->in_fp.f_cursor)(tem, VIS_DISPLAY_CURSOR, credp, called_from); -} - -static void -tem_reset_colormap(struct terminal_emulator *tem, - cred_t *credp, enum called_from called_from) -{ - struct viscmap cm; - unsigned char r[1], b[1], g[1]; - int rval; - - if (called_from == CALLED_FROM_STANDALONE) - return; - - cm.red = r; - cm.blue = b; - cm.green = g; - - cm.index = TEM_TEXT_WHITE; - cm.count = 1; - r[0] = 0xff; - b[0] = 0xff; - g[0] = 0xff; - (void) ldi_ioctl(tem->hdl, VIS_PUTCMAP, (intptr_t)&cm, - FKIOCTL, credp, &rval); - - cm.index = TEM_TEXT_BLACK; - cm.count = 1; - r[0] = 0; - b[0] = 0; - g[0] = 0; - (void) ldi_ioctl(tem->hdl, VIS_PUTCMAP, (intptr_t)&cm, - FKIOCTL, credp, &rval); -} - -/* - * send the appropriate control message or set state based on the - * value of the control character ch - */ -static void -tem_control( - struct terminal_emulator *tem, - unsigned char ch, - cred_t *credp, - enum called_from called_from) -{ - tem->a_state = A_STATE_START; - switch (ch) { - case A_BEL: - tem_bell(tem, called_from); - break; - - case A_BS: - tem_mv_cursor(tem, - tem->a_c_cursor.row, tem->a_c_cursor.col - 1, - credp, called_from); - break; - - case A_HT: - tem_tab(tem, credp, called_from); - break; - - case A_NL: - /* - * tem_send_data(tem, credp, called_from); - * tem_new_line(tem, credp, called_from); - * break; - */ - - case A_VT: - tem_send_data(tem, credp, called_from); - tem_lf(tem, credp, called_from); - break; - - case A_FF: - tem_send_data(tem, credp, called_from); - tem_cls(tem, credp, called_from); - break; - - case A_CR: - tem_send_data(tem, credp, called_from); - tem_cr(tem); - break; - - case A_ESC: - tem->a_state = A_STATE_ESC; - break; - - case A_CSI: - { - int i; - tem->a_curparam = 0; - tem->a_paramval = 0; - tem->a_gotparam = B_FALSE; - /* clear the parameters */ - for (i = 0; i < TEM_MAXPARAMS; i++) - tem->a_params[i] = -1; - tem->a_state = A_STATE_CSI; - } - break; - - case A_GS: - tem_back_tab(tem, credp, called_from); - break; - - default: - break; - } -} - - -/* - * if parameters [0..count - 1] are not set, set them to the value of newparam. - */ - -static void -tem_setparam(struct terminal_emulator *tem, int count, int newparam) -{ - int i; - - for (i = 0; i < count; i++) { - if (tem->a_params[i] == -1) - tem->a_params[i] = newparam; - } -} - - -/* - * select graphics mode based on the param vals stored in a_params - */ -static void -tem_selgraph(struct terminal_emulator *tem) -{ - int curparam; - int count = 0; - int param; - - curparam = tem->a_curparam; - do { - param = tem->a_params[count]; - - switch (param) { - case -1: - case 0: - if (tem->a_flags & TEM_ATTR_SCREEN_REVERSE) { - tem->a_flags |= TEM_ATTR_REVERSE; - } else { - tem->a_flags &= ~TEM_ATTR_REVERSE; - } - tem->a_flags &= ~TEM_ATTR_BOLD; - tem->a_flags &= ~TEM_ATTR_BLINK; - tem->fg_color = default_ansi_fg; - tem->bg_color = default_ansi_bg; - break; - - case 1: /* Bold Intense */ - tem->a_flags |= TEM_ATTR_BOLD; - break; - - case 5: /* Blink */ - tem->a_flags |= TEM_ATTR_BLINK; - break; - - case 7: /* Reverse video */ - if (tem->a_flags & TEM_ATTR_SCREEN_REVERSE) { - tem->a_flags &= ~TEM_ATTR_REVERSE; - } else { - tem->a_flags |= TEM_ATTR_REVERSE; - } - break; - - case 30: /* black (grey) foreground */ - case 31: /* red (light red) foreground */ - case 32: /* green (light green) foreground */ - case 33: /* brown (yellow) foreground */ - case 34: /* blue (light blue) foreground */ - case 35: /* magenta (light magenta) foreground */ - case 36: /* cyan (light cyan) foreground */ - case 37: /* white (bright white) foreground */ - tem->fg_color = param - 30; - break; - - case 40: /* black (grey) background */ - case 41: /* red (light red) background */ - case 42: /* green (light green) background */ - case 43: /* brown (yellow) background */ - case 44: /* blue (light blue) background */ - case 45: /* magenta (light magenta) background */ - case 46: /* cyan (light cyan) background */ - case 47: /* white (bright white) background */ - tem->bg_color = param - 40; - break; - - default: - break; - } - count++; - curparam--; - - } while (curparam > 0); - - - tem->a_state = A_STATE_START; -} - -/* - * perform the appropriate action for the escape sequence - * - * General rule: This code does not validate the arguments passed. - * It assumes that the next lower level will do so. - */ -static void -tem_chkparam( - struct terminal_emulator *tem, - unsigned char ch, - cred_t *credp, - enum called_from called_from) -{ - int i; - int row; - int col; - - row = tem->a_c_cursor.row; - col = tem->a_c_cursor.col; - - switch (ch) { - - case 'm': /* select terminal graphics mode */ - tem_send_data(tem, credp, called_from); - tem_selgraph(tem); - break; - - case '@': /* insert char */ - tem_setparam(tem, 1, 1); - tem_shift(tem, tem->a_params[0], TEM_SHIFT_RIGHT, - credp, called_from); - break; - - case 'A': /* cursor up */ - tem_setparam(tem, 1, 1); - tem_mv_cursor(tem, row - tem->a_params[0], col, - credp, called_from); - break; - - case 'd': /* VPA - vertical position absolute */ - tem_setparam(tem, 1, 1); - tem_mv_cursor(tem, tem->a_params[0] - 1, col, - credp, called_from); - break; - - case 'e': /* VPR - vertical position relative */ - case 'B': /* cursor down */ - tem_setparam(tem, 1, 1); - tem_mv_cursor(tem, row + tem->a_params[0], col, - credp, called_from); - break; - - case 'a': /* HPR - horizontal position relative */ - case 'C': /* cursor right */ - tem_setparam(tem, 1, 1); - tem_mv_cursor(tem, row, col + tem->a_params[0], - credp, called_from); - break; - - case '`': /* HPA - horizontal position absolute */ - tem_setparam(tem, 1, 1); - tem_mv_cursor(tem, row, tem->a_params[0] - 1, - credp, called_from); - break; - - case 'D': /* cursor left */ - tem_setparam(tem, 1, 1); - tem_mv_cursor(tem, row, col - tem->a_params[0], - credp, called_from); - break; - - case 'E': /* CNL cursor next line */ - tem_setparam(tem, 1, 1); - tem_mv_cursor(tem, row + tem->a_params[0], 0, - credp, called_from); - break; - - case 'F': /* CPL cursor previous line */ - tem_setparam(tem, 1, 1); - tem_mv_cursor(tem, row - tem->a_params[0], 0, - credp, called_from); - break; - - case 'G': /* cursor horizontal position */ - tem_setparam(tem, 1, 1); - tem_mv_cursor(tem, row, tem->a_params[0] - 1, - credp, called_from); - break; - - case 'g': /* clear tabs */ - tem_setparam(tem, 1, 0); - tem_clear_tabs(tem, tem->a_params[0]); - break; - - case 'f': /* HVP Horizontal and Vertical Position */ - case 'H': /* CUP position cursor */ - tem_setparam(tem, 2, 1); - tem_mv_cursor(tem, - tem->a_params[0] - 1, tem->a_params[1] - 1, - credp, called_from); - break; - - case 'I': /* CHT - Cursor Horizontal Tab */ - /* Not implemented */ - break; - - case 'J': /* ED - Erase in Display */ - tem_send_data(tem, credp, called_from); - tem_setparam(tem, 1, 0); - switch (tem->a_params[0]) { - case 0: - /* erase cursor to end of screen */ - /* FIRST erase cursor to end of line */ - tem_clear_chars(tem, - tem->a_c_dimension.width - - tem->a_c_cursor.col, - tem->a_c_cursor.row, - tem->a_c_cursor.col, credp, called_from); - - /* THEN erase lines below the cursor */ - for (row = tem->a_c_cursor.row + 1; - row < tem->a_c_dimension.height; - row++) { - tem_clear_chars(tem, - tem->a_c_dimension.width, - row, 0, credp, called_from); - } - break; - - case 1: - /* erase beginning of screen to cursor */ - /* FIRST erase lines above the cursor */ - for (row = 0; - row < tem->a_c_cursor.row; - row++) { - tem_clear_chars(tem, - tem->a_c_dimension.width, - row, 0, credp, called_from); - } - /* THEN erase beginning of line to cursor */ - tem_clear_chars(tem, - tem->a_c_cursor.col + 1, - tem->a_c_cursor.row, 0, credp, called_from); - break; - - case 2: - /* erase whole screen */ - for (row = 0; - row < tem->a_c_dimension.height; - row++) { - tem_clear_chars(tem, - tem->a_c_dimension.width, - row, 0, credp, called_from); - } - break; - } - break; - - case 'K': /* EL - Erase in Line */ - tem_send_data(tem, credp, called_from); - tem_setparam(tem, 1, 0); - switch (tem->a_params[0]) { - case 0: - /* erase cursor to end of line */ - tem_clear_chars(tem, - (tem->a_c_dimension.width - - tem->a_c_cursor.col), - tem->a_c_cursor.row, - tem->a_c_cursor.col, credp, called_from); - break; - - case 1: - /* erase beginning of line to cursor */ - tem_clear_chars(tem, - tem->a_c_cursor.col + 1, - tem->a_c_cursor.row, 0, credp, called_from); - break; - - case 2: - /* erase whole line */ - tem_clear_chars(tem, - tem->a_c_dimension.width, - tem->a_c_cursor.row, 0, credp, called_from); - break; - } - break; - - case 'L': /* insert line */ - tem_send_data(tem, credp, called_from); - tem_setparam(tem, 1, 1); - tem_scroll(tem, - tem->a_c_cursor.row, - tem->a_c_dimension.height - 1, - tem->a_params[0], TEM_SCROLL_DOWN, credp, called_from); - break; - - case 'M': /* delete line */ - tem_send_data(tem, credp, called_from); - tem_setparam(tem, 1, 1); - tem_scroll(tem, - tem->a_c_cursor.row, - tem->a_c_dimension.height - 1, - tem->a_params[0], TEM_SCROLL_UP, credp, called_from); - break; - - case 'P': /* DCH - delete char */ - tem_setparam(tem, 1, 1); - tem_shift(tem, tem->a_params[0], TEM_SHIFT_LEFT, - credp, called_from); - break; - - case 'S': /* scroll up */ - tem_send_data(tem, credp, called_from); - tem_setparam(tem, 1, 1); - tem_scroll(tem, 0, - tem->a_c_dimension.height - 1, - tem->a_params[0], TEM_SCROLL_UP, credp, called_from); - break; - - case 'T': /* scroll down */ - tem_send_data(tem, credp, called_from); - tem_setparam(tem, 1, 1); - tem_scroll(tem, 0, - tem->a_c_dimension.height - 1, - tem->a_params[0], TEM_SCROLL_DOWN, credp, called_from); - break; - - case 'X': /* erase char */ - tem_setparam(tem, 1, 1); - tem_clear_chars(tem, - tem->a_params[0], - tem->a_c_cursor.row, - tem->a_c_cursor.col, credp, called_from); - break; - - case 'Z': /* cursor backward tabulation */ - tem_setparam(tem, 1, 1); - - /* - * Rule exception - We do sanity checking here. - * - * Restrict the count to a sane value to keep from - * looping for a long time. There can't be more than one - * tab stop per column, so use that as a limit. - */ - if (tem->a_params[0] > tem->a_c_dimension.width) - tem->a_params[0] = tem->a_c_dimension.width; - - for (i = 0; i < tem->a_params[0]; i++) - tem_back_tab(tem, credp, called_from); - break; - } - tem->a_state = A_STATE_START; -} - - -/* - * Gather the parameters of an ANSI escape sequence - */ -static void -tem_getparams(struct terminal_emulator *tem, unsigned char ch, - cred_t *credp, enum called_from called_from) -{ - if ((ch >= '0' && ch <= '9') && (tem->a_state != A_STATE_ESC_Q_DELM)) { - tem->a_paramval = ((tem->a_paramval * 10) + (ch - '0')); - tem->a_gotparam = B_TRUE; /* Remember got parameter */ - return; /* Return immediately */ - } - switch (tem->a_state) { /* Handle letter based on state */ - - case A_STATE_ESC_Q: /* <ESC>Q<num> ? */ - tem->a_params[1] = ch; /* Save string delimiter */ - tem->a_params[2] = 0; /* String length 0 to start */ - tem->a_state = A_STATE_ESC_Q_DELM; /* Read string next */ - break; - - case A_STATE_ESC_Q_DELM: /* <ESC>Q<num><delm> ? */ - if (ch == tem->a_params[1]) { /* End of string? */ - tem->a_state = A_STATE_START; - /* End of <ESC> sequence */ - } else if (ch == '^') - /* Control char escaped with '^'? */ - tem->a_state = A_STATE_ESC_Q_DELM_CTRL; - /* Read control character next */ - - else if (ch != '\0') { - /* Not a null? Add to string */ - tem->a_fkey[tem->a_params[2]++] = ch; - if (tem->a_params[2] >= TEM_MAXFKEY) /* Full? */ - tem->a_state = A_STATE_START; - /* End of <ESC> sequence */ - } - break; - - case A_STATE_ESC_Q_DELM_CTRL: /* Contrl character escaped with '^' */ - tem->a_state = A_STATE_ESC_Q_DELM; /* Read more string later */ - ch -= ' '; /* Convert to control character */ - if (ch != '\0') { /* Not a null? Add to string */ - tem->a_fkey[tem->a_params[2]++] = ch; - if (tem->a_params[2] >= TEM_MAXFKEY) /* Full? */ - tem->a_state = A_STATE_START; - /* End of <ESC> sequence */ - } - break; - - default: /* All other states */ - if (tem->a_gotparam) { - if (tem->a_curparam >= TEM_MAXPARAMS) { - /* - * Too many parameters. Abort the - * sequence. - */ - tem->a_state = A_STATE_START; - break; - } - /* - * Previous number parameter? Save and - * point to next free parameter. - */ - tem->a_params[tem->a_curparam] = tem->a_paramval; - tem->a_curparam++; - } - - if (ch == ';') { - /* Multiple param separator? */ - /* Restart parameter search */ - tem->a_gotparam = B_FALSE; - tem->a_paramval = 0; /* No parameter value yet */ - } else if (tem->a_state == A_STATE_CSI_EQUAL || - tem->a_state == A_STATE_CSI_QMARK) { - tem->a_state = A_STATE_START; - } else /* Regular letter */ - /* Handle escape sequence */ - tem_chkparam(tem, ch, credp, called_from); - break; - } -} - -/* - * Add character to internal buffer. - * When its full, send it to the next layer. - */ - -static void -tem_outch(struct terminal_emulator *tem, unsigned char ch, - cred_t *credp, enum called_from called_from) -{ - /* buffer up the character until later */ - - tem->a_outbuf[tem->a_outindex++] = ch; - tem->a_c_cursor.col++; - if (tem->a_c_cursor.col >= tem->a_c_dimension.width) { - tem_send_data(tem, credp, called_from); - tem_new_line(tem, credp, called_from); - } -} - -static void -tem_new_line(struct terminal_emulator *tem, - cred_t *credp, enum called_from called_from) -{ - tem_cr(tem); - tem_lf(tem, credp, called_from); -} - -static void -tem_cr(struct terminal_emulator *tem) -{ - tem->a_c_cursor.col = 0; - tem_align_cursor(tem); -} - -static void -tem_lf(struct terminal_emulator *tem, - cred_t *credp, enum called_from called_from) -{ - int row; - - /* - * Sanity checking notes: - * . a_nscroll was validated when it was set. - * . Regardless of that, tem_scroll and tem_mv_cursor will prevent - * anything bad from happening. - */ - row = tem->a_c_cursor.row + 1; - - if (row >= tem->a_c_dimension.height) { - if (tem->a_nscroll != 0) { - tem_scroll(tem, 0, - tem->a_c_dimension.height - 1, - tem->a_nscroll, TEM_SCROLL_UP, credp, called_from); - row = tem->a_c_dimension.height - tem->a_nscroll; - } else { /* no scroll */ - /* - * implement Esc[#r when # is zero. This means no - * scroll but just return cursor to top of screen, - * do not clear screen. - */ - row = 0; - } - } - - tem_mv_cursor(tem, row, tem->a_c_cursor.col, - credp, called_from); - - if (tem->a_nscroll == 0) { - /* erase rest of cursor line */ - tem_clear_chars(tem, - tem->a_c_dimension.width - tem->a_c_cursor.col, - tem->a_c_cursor.row, - tem->a_c_cursor.col, credp, called_from); - - } - - tem_align_cursor(tem); -} - -static void -tem_send_data(struct terminal_emulator *tem, cred_t *credp, - enum called_from called_from) -{ - text_color_t fg_color; - text_color_t bg_color; - - if (tem->a_outindex != 0) { - - if (tem->a_flags & TEM_ATTR_REVERSE) { - fg_color = ansi_fg_to_solaris(tem, tem->bg_color); - bg_color = ansi_bg_to_solaris(tem, tem->fg_color); - } else { - fg_color = ansi_fg_to_solaris(tem, tem->fg_color); - bg_color = ansi_bg_to_solaris(tem, tem->bg_color); - } - - /* - * Call the primitive to render this data. - */ - (*tem->in_fp.f_display)(tem, - tem->a_outbuf, - tem->a_outindex, - tem->a_s_cursor.row, tem->a_s_cursor.col, - fg_color, bg_color, - credp, called_from); - tem->a_outindex = 0; - } - tem_align_cursor(tem); -} - - -/* - * We have just done something to the current output point. Reset the start - * point for the buffered data in a_outbuf. There shouldn't be any data - * buffered yet. - */ -static void -tem_align_cursor(struct terminal_emulator *tem) -{ - tem->a_s_cursor.row = tem->a_c_cursor.row; - tem->a_s_cursor.col = tem->a_c_cursor.col; -} - - - -/* - * State machine parser based on the current state and character input - * major terminations are to control character or normal character - */ - -static void -tem_parse(struct terminal_emulator *tem, unsigned char ch, - cred_t *credp, enum called_from called_from) -{ - int i; - - if (tem->a_state == A_STATE_START) { /* Normal state? */ - if (ch == A_CSI || ch == A_ESC || ch < ' ') /* Control? */ - tem_control(tem, ch, credp, called_from); - else - /* Display */ - tem_outch(tem, ch, credp, called_from); - } else { /* In <ESC> sequence */ - /* Need to get parameters? */ - if (tem->a_state != A_STATE_ESC) { - if (tem->a_state == A_STATE_CSI) { - switch (ch) { - case '?': - tem->a_state = A_STATE_CSI_QMARK; - return; - case '=': - tem->a_state = A_STATE_CSI_EQUAL; - return; - case 's': - /* - * As defined below, this sequence - * saves the cursor. However, Sun - * defines ESC[s as reset. We resolved - * the conflict by selecting reset as it - * is exported in the termcap file for - * sun-mon, while the "save cursor" - * definition does not exist anywhere in - * /etc/termcap. - * However, having no coherent - * definition of reset, we have not - * implemented it. - */ - - /* - * Original code - * tem->a_r_cursor.row = - * tem->a_c_cursor.row; - * tem->a_r_cursor.col = - * tem->a_c_cursor.col; - * tem->a_state = A_STATE_START; - */ - - tem->a_state = A_STATE_START; - return; - case 'u': - tem_mv_cursor(tem, - tem->a_r_cursor.row, - tem->a_r_cursor.col, - credp, called_from); - tem->a_state = A_STATE_START; - return; - case 'p': /* sunbow */ - tem_send_data(tem, credp, called_from); - /* - * Don't set anything if we are - * already as we want to be. - */ - if (tem->a_flags & - TEM_ATTR_SCREEN_REVERSE) { - tem->a_flags &= - ~TEM_ATTR_SCREEN_REVERSE; - /* - * If we have switched the - * characters to be the - * inverse from the screen, - * then switch them as well - * to keep them the inverse - * of the screen. - */ - if (tem->a_flags & - TEM_ATTR_REVERSE) { - tem->a_flags &= - ~TEM_ATTR_REVERSE; - } else { - tem->a_flags |= - TEM_ATTR_REVERSE; - } - } - if (tem->display_mode == - VIS_PIXEL) { - tem_clear_entire(tem, - credp, called_from); - } else { - tem_cls(tem, - credp, called_from); - } - tem->a_state = A_STATE_START; - return; - case 'q': /* sunwob */ - tem_send_data(tem, credp, called_from); - /* - * Don't set anything if we are - * already where as we want to be. - */ - if (!(tem->a_flags & - TEM_ATTR_SCREEN_REVERSE)) { - tem->a_flags |= - TEM_ATTR_SCREEN_REVERSE; - /* - * If we have switched the - * characters to be the - * inverse from the screen, - * then switch them as well - * to keep them the inverse - * of the screen. - */ - if (!(tem->a_flags & - TEM_ATTR_REVERSE)) { - tem->a_flags |= - TEM_ATTR_REVERSE; - } else { - tem->a_flags &= - ~TEM_ATTR_REVERSE; - } - } - - if (tem->display_mode == - VIS_PIXEL) { - tem_clear_entire(tem, - credp, called_from); - } else { - tem_cls(tem, - credp, called_from); - } - tem->a_state = A_STATE_START; - return; - case 'r': /* sunscrl */ - /* - * Rule exception: check for - * validity here. - */ - tem->a_nscroll = tem->a_paramval; - if (tem->a_nscroll > - tem->a_c_dimension.height) { - tem->a_nscroll = - tem->a_c_dimension.height; - } - if (tem->a_nscroll < 0) - tem->a_nscroll = 1; - tem->a_state = A_STATE_START; - return; - } - } - tem_getparams(tem, ch, credp, called_from); - } else { /* Previous char was <ESC> */ - if (ch == '[') { - tem->a_curparam = 0; - tem->a_paramval = 0; - tem->a_gotparam = B_FALSE; - /* clear the parameters */ - for (i = 0; i < TEM_MAXPARAMS; i++) - tem->a_params[i] = -1; - tem->a_state = A_STATE_CSI; - } else if (ch == 'Q') { /* <ESC>Q ? */ - tem->a_curparam = 0; - tem->a_paramval = 0; - tem->a_gotparam = B_FALSE; - for (i = 0; i < TEM_MAXPARAMS; i++) - tem->a_params[i] = -1; /* Clear */ - /* Next get params */ - tem->a_state = A_STATE_ESC_Q; - } else if (ch == 'C') { /* <ESC>C ? */ - tem->a_curparam = 0; - tem->a_paramval = 0; - tem->a_gotparam = B_FALSE; - for (i = 0; i < TEM_MAXPARAMS; i++) - tem->a_params[i] = -1; /* Clear */ - /* Next get params */ - tem->a_state = A_STATE_ESC_C; - } else { - tem->a_state = A_STATE_START; - if (ch == 'c') - /* ESC c resets display */ - tem_reset_display(tem, credp, - called_from, 1); - else if (ch == 'H') - /* ESC H sets a tab */ - tem_set_tab(tem); - else if (ch == '7') { - /* ESC 7 Save Cursor position */ - tem->a_r_cursor.row = - tem->a_c_cursor.row; - tem->a_r_cursor.col = - tem->a_c_cursor.col; - } else if (ch == '8') - /* ESC 8 Restore Cursor position */ - tem_mv_cursor(tem, - tem->a_r_cursor.row, - tem->a_r_cursor.col, credp, - called_from); - /* check for control chars */ - else if (ch < ' ') - tem_control(tem, ch, credp, - called_from); - else - tem_outch(tem, ch, credp, - called_from); - } - } - } -} - -/* ARGSUSED */ -static void -tem_bell(struct terminal_emulator *tem, enum called_from called_from) -{ - if (called_from == CALLED_FROM_STANDALONE) - beep_polled(BEEP_CONSOLE); - else - beep(BEEP_CONSOLE); -} - - -static void -tem_scroll(struct terminal_emulator *tem, - int start, int end, int count, int direction, - cred_t *credp, enum called_from called_from) -{ - int row; - int lines_affected; - - lines_affected = end - start + 1; - if (count > lines_affected) - count = lines_affected; - if (count <= 0) - return; - - switch (direction) { - case TEM_SCROLL_UP: - if (count < lines_affected) { - tem_copy_area(tem, - 0, start + count, - tem->a_c_dimension.width - 1, end, - 0, start, - credp, called_from); - } - for (row = (end - count) + 1; row <= end; row++) { - tem_clear_chars(tem, - tem->a_c_dimension.width, - row, 0, credp, called_from); - } - break; - - case TEM_SCROLL_DOWN: - if (count < lines_affected) { - tem_copy_area(tem, - 0, start, - tem->a_c_dimension.width - 1, end - count, - 0, start + count, - credp, called_from); - } - for (row = start; row < start + count; row++) { - tem_clear_chars(tem, - tem->a_c_dimension.width, - row, 0, credp, called_from); - } - break; - } -} - -static void -tem_copy_area(struct terminal_emulator *tem, - screen_pos_t s_col, screen_pos_t s_row, - screen_pos_t e_col, screen_pos_t e_row, - screen_pos_t t_col, screen_pos_t t_row, - cred_t *credp, enum called_from called_from) -{ - int rows; - int cols; - - if (s_col < 0 || s_row < 0 || - e_col < 0 || e_row < 0 || - t_col < 0 || t_row < 0 || - s_col >= tem->a_c_dimension.width || - e_col >= tem->a_c_dimension.width || - t_col >= tem->a_c_dimension.width || - s_row >= tem->a_c_dimension.height || - e_row >= tem->a_c_dimension.height || - t_row >= tem->a_c_dimension.height) - return; - - if (s_row > e_row || s_col > e_col) - return; - - rows = e_row - s_row + 1; - cols = e_col - s_col + 1; - if (t_row + rows > tem->a_c_dimension.height || - t_col + cols > tem->a_c_dimension.width) - return; - - (*tem->in_fp.f_copy)(tem, - s_col, s_row, - e_col, e_row, - t_col, t_row, - credp, called_from); -} - -static void -tem_clear_chars(struct terminal_emulator *tem, - int count, screen_pos_t row, screen_pos_t col, cred_t *credp, - enum called_from called_from) -{ - if (row < 0 || row >= tem->a_c_dimension.height || - col < 0 || col >= tem->a_c_dimension.width || - count < 0) - return; - - /* - * Note that very large values of "count" could cause col+count - * to overflow, so we check "count" independently. - */ - if (count > tem->a_c_dimension.width || - col + count > tem->a_c_dimension.width) - count = tem->a_c_dimension.width - col; - - (*tem->in_fp.f_cls)(tem, count, row, col, credp, called_from); -} - -static void -tem_text_display(struct terminal_emulator *tem, unsigned char *string, - int count, screen_pos_t row, screen_pos_t col, - text_color_t fg_color, text_color_t bg_color, - cred_t *credp, enum called_from called_from) -{ - struct vis_consdisplay da; - - da.version = VIS_DISPLAY_VERSION; - da.data = string; - da.width = count; - da.row = row; - da.col = col; - - da.fg_color = fg_color; - da.bg_color = bg_color; - - tem_display(tem, &da, credp, called_from); -} - -static void -tem_text_copy(struct terminal_emulator *tem, - screen_pos_t s_col, screen_pos_t s_row, - screen_pos_t e_col, screen_pos_t e_row, - screen_pos_t t_col, screen_pos_t t_row, - cred_t *credp, enum called_from called_from) -{ - struct vis_conscopy ma; - - ma.version = VIS_COPY_VERSION; - ma.s_row = s_row; - ma.s_col = s_col; - ma.e_row = e_row; - ma.e_col = e_col; - ma.t_row = t_row; - ma.t_col = t_col; - - tem_copy(tem, &ma, credp, called_from); -} - -static void -tem_text_cls(struct terminal_emulator *tem, - int count, screen_pos_t row, screen_pos_t col, cred_t *credp, - enum called_from called_from) -{ - struct vis_consdisplay da; - - da.version = VIS_DISPLAY_VERSION; - da.data = tem->a_blank_line; - da.width = count; - da.row = row; - da.col = col; - - if (tem->a_flags & TEM_ATTR_SCREEN_REVERSE) { - da.fg_color = ansi_fg_to_solaris(tem, default_ansi_bg); - da.bg_color = ansi_bg_to_solaris(tem, default_ansi_fg); - } else { - da.fg_color = ansi_fg_to_solaris(tem, default_ansi_fg); - da.bg_color = ansi_bg_to_solaris(tem, default_ansi_bg); - } - - tem_display(tem, &da, credp, called_from); -} - -void -tem_pix_display(struct terminal_emulator *tem, - unsigned char *string, int count, - screen_pos_t row, screen_pos_t col, - text_color_t fg_color, text_color_t bg_color, - cred_t *credp, enum called_from called_from) -{ - struct vis_consdisplay da; - int i; - - da.version = VIS_DISPLAY_VERSION; - da.data = (unsigned char *)tem->a_pix_data; - da.width = tem->a_font.width; - da.height = tem->a_font.height; - da.row = (row * da.height) + tem->a_p_offset.y; - da.col = (col * da.width) + tem->a_p_offset.x; - - for (i = 0; i < count; i++) { - BIT_TO_PIX(tem, string[i], fg_color, bg_color); - tem_display(tem, &da, credp, called_from); - da.col += da.width; - } -} - -static void -tem_pix_copy(struct terminal_emulator *tem, - screen_pos_t s_col, screen_pos_t s_row, - screen_pos_t e_col, screen_pos_t e_row, - screen_pos_t t_col, screen_pos_t t_row, - cred_t *credp, - enum called_from called_from) -{ - struct vis_conscopy ma; - - ma.version = VIS_COPY_VERSION; - ma.s_row = s_row * tem->a_font.height + tem->a_p_offset.y; - ma.s_col = s_col * tem->a_font.width + tem->a_p_offset.x; - ma.e_row = (e_row + 1) * tem->a_font.height + - tem->a_p_offset.y - 1; - ma.e_col = (e_col + 1) * tem->a_font.width + - tem->a_p_offset.x - 1; - ma.t_row = t_row * tem->a_font.height + tem->a_p_offset.y; - ma.t_col = t_col * tem->a_font.width + tem->a_p_offset.x; - - tem_copy(tem, &ma, credp, called_from); -} - -void -tem_pix_cls(struct terminal_emulator *tem, int count, - screen_pos_t row, screen_pos_t col, cred_t *credp, - enum called_from called_from) -{ - struct vis_consdisplay da; - int i; - text_color_t fg_color; - text_color_t bg_color; - - da.version = VIS_DISPLAY_VERSION; - da.width = tem->a_font.width; - da.height = tem->a_font.height; - da.row = (row * da.height) + tem->a_p_offset.y; - da.col = (col * da.width) + tem->a_p_offset.x; - - if (tem->a_flags & TEM_ATTR_SCREEN_REVERSE) { - fg_color = ansi_fg_to_solaris(tem, default_ansi_bg); - bg_color = ansi_bg_to_solaris(tem, default_ansi_fg); - } else { - fg_color = ansi_fg_to_solaris(tem, default_ansi_fg); - bg_color = ansi_bg_to_solaris(tem, default_ansi_bg); - } - - BIT_TO_PIX(tem, ' ', fg_color, bg_color); - da.data = (unsigned char *)tem->a_pix_data; - - for (i = 0; i < count; i++) { - tem_display(tem, &da, credp, called_from); - da.col += da.width; - } -} - -static void -tem_back_tab(struct terminal_emulator *tem, - cred_t *credp, enum called_from called_from) -{ - int i; - screen_pos_t tabstop; - - tabstop = 0; - - for (i = tem->a_ntabs - 1; i >= 0; i--) { - if (tem->a_tabs[i] < tem->a_c_cursor.col) { - tabstop = tem->a_tabs[i]; - break; - } - } - - tem_mv_cursor(tem, tem->a_c_cursor.row, tabstop, credp, called_from); -} - - -static void -tem_tab(struct terminal_emulator *tem, - cred_t *credp, enum called_from called_from) -{ - int i; - screen_pos_t tabstop; - - tabstop = tem->a_c_dimension.width - 1; - - for (i = 0; i < tem->a_ntabs; i++) { - if (tem->a_tabs[i] > tem->a_c_cursor.col) { - tabstop = tem->a_tabs[i]; - break; - } - } - - tem_mv_cursor(tem, tem->a_c_cursor.row, tabstop, credp, called_from); -} - -static void -tem_set_tab(struct terminal_emulator *tem) -{ - int i; - int j; - - if (tem->a_ntabs == TEM_MAXTAB) - return; - if (tem->a_ntabs == 0 || - tem->a_tabs[tem->a_ntabs] < tem->a_c_cursor.col) { - tem->a_tabs[tem->a_ntabs++] = tem->a_c_cursor.col; - return; - } - for (i = 0; i < tem->a_ntabs; i++) { - if (tem->a_tabs[i] == tem->a_c_cursor.col) - return; - if (tem->a_tabs[i] > tem->a_c_cursor.col) { - for (j = tem->a_ntabs - 1; j >= i; j--) - tem->a_tabs[j+ 1] = tem->a_tabs[j]; - tem->a_tabs[i] = tem->a_c_cursor.col; - tem->a_ntabs++; - return; - } - } -} - - -static void -tem_clear_tabs(struct terminal_emulator *tem, int action) -{ - int i; - int j; - - switch (action) { - case 3: /* clear all tabs */ - tem->a_ntabs = 0; - break; - case 0: /* clr tab at cursor */ - - for (i = 0; i < tem->a_ntabs; i++) { - if (tem->a_tabs[i] == tem->a_c_cursor.col) { - tem->a_ntabs--; - for (j = i; j < tem->a_ntabs; j++) - tem->a_tabs[j] = tem->a_tabs[j + 1]; - return; - } - } - break; - } -} - -static void -tem_clear_entire(struct terminal_emulator *tem, cred_t *credp, - enum called_from called_from) -{ - int row; - int nrows; - int col; - int ncols; - struct vis_consdisplay da; - text_color_t fg_color; - text_color_t bg_color; - - da.version = VIS_DISPLAY_VERSION; - da.width = tem->a_font.width; - da.height = tem->a_font.height; - nrows = (tem->a_p_dimension.height + (da.height - 1))/ da.height; - ncols = (tem->a_p_dimension.width + (da.width - 1))/ da.width; - - if (tem->a_flags & TEM_ATTR_SCREEN_REVERSE) { - fg_color = ansi_fg_to_solaris(tem, default_ansi_bg); - bg_color = ansi_bg_to_solaris(tem, default_ansi_fg); - } else { - fg_color = ansi_fg_to_solaris(tem, default_ansi_fg); - bg_color = ansi_bg_to_solaris(tem, default_ansi_bg); - } - - BIT_TO_PIX(tem, ' ', fg_color, bg_color); - da.data = (unsigned char *)tem->a_pix_data; - - for (row = 0; row < nrows; row++) { - da.row = row * da.height; - da.col = 0; - for (col = 0; col < ncols; col++) { - tem_display(tem, &da, credp, called_from); - da.col += da.width; - } - } - - tem->a_c_cursor.row = 0; - tem->a_c_cursor.col = 0; - tem_align_cursor(tem); -} - -static void -tem_cls(struct terminal_emulator *tem, - cred_t *credp, enum called_from called_from) -{ - int row; - - for (row = 0; row < tem->a_c_dimension.height; row++) { - tem_clear_chars(tem, - tem->a_c_dimension.width, - row, 0, credp, called_from); - } - tem->a_c_cursor.row = 0; - tem->a_c_cursor.col = 0; - tem_align_cursor(tem); -} - -static void -tem_mv_cursor(struct terminal_emulator *tem, int row, int col, - cred_t *credp, enum called_from called_from) -{ - /* - * Sanity check and bounds enforcement. Out of bounds requests are - * clipped to the screen boundaries. This seems to be what SPARC - * does. - */ - if (row < 0) - row = 0; - if (row >= tem->a_c_dimension.height) - row = tem->a_c_dimension.height - 1; - if (col < 0) - col = 0; - if (col >= tem->a_c_dimension.width) - col = tem->a_c_dimension.width - 1; - - tem_send_data(tem, credp, called_from); - tem->a_c_cursor.row = row; - tem->a_c_cursor.col = col; - tem_align_cursor(tem); -} - - -static void -tem_reset_emulator(struct terminal_emulator *tem) -{ - int j; - - tem->a_c_cursor.row = 0; - tem->a_c_cursor.col = 0; - tem->a_r_cursor.row = 0; - tem->a_r_cursor.col = 0; - tem->a_s_cursor.row = 0; - tem->a_s_cursor.col = 0; - tem->a_outindex = 0; - tem->a_state = A_STATE_START; - tem->a_gotparam = B_FALSE; - tem->a_curparam = 0; - tem->a_paramval = 0; - tem->a_flags = 0; - tem->a_nscroll = 1; - tem->fg_color = default_ansi_fg; - tem->bg_color = default_ansi_bg; - - /* - * set up the initial tab stops - */ - tem->a_ntabs = 0; - for (j = 8; j < tem->a_c_dimension.width; j += 8) - tem->a_tabs[tem->a_ntabs++] = (screen_pos_t)j; - - for (j = 0; j < TEM_MAXPARAMS; j++) - tem->a_params[j] = 0; -} - -static void -tem_reset_display(struct terminal_emulator *tem, - cred_t *credp, enum called_from called_from, int clear_txt) -{ - tem_reset_emulator(tem); - tem_reset_colormap(tem, credp, called_from); - - (*tem->in_fp.f_cursor)(tem, VIS_HIDE_CURSOR, credp, called_from); - - if (tem->display_mode == VIS_PIXEL) { - tem_clear_entire(tem, credp, called_from); - } else if (clear_txt) { - tem_cls(tem, credp, called_from); - } else { - /* ask driver where cursor is */ - tem_text_cursor(tem, VIS_GET_CURSOR, credp, CALLED_FROM_NORMAL); - tem_align_cursor(tem); - } - - tem->a_initialized = 1; - (*tem->in_fp.f_cursor)(tem, VIS_DISPLAY_CURSOR, credp, called_from); -} - - -static void -tem_shift( - struct terminal_emulator *tem, - int count, - int direction, - cred_t *credp, - enum called_from called_from) -{ - int rest_of_line; - - rest_of_line = tem->a_c_dimension.width - tem->a_c_cursor.col; - if (count > rest_of_line) - count = rest_of_line; - - if (count <= 0) - return; - - switch (direction) { - case TEM_SHIFT_LEFT: - if (count < rest_of_line) { - tem_copy_area(tem, - tem->a_c_cursor.col + count, - tem->a_c_cursor.row, - tem->a_c_dimension.width - 1, - tem->a_c_cursor.row, - tem->a_c_cursor.col, - tem->a_c_cursor.row, - credp, called_from); - } - - tem_clear_chars(tem, - count, - tem->a_c_cursor.row, - (tem->a_c_dimension.width - count), credp, - called_from); - break; - case TEM_SHIFT_RIGHT: - if (count < rest_of_line) { - tem_copy_area(tem, - tem->a_c_cursor.col, - tem->a_c_cursor.row, - tem->a_c_dimension.width - count - 1, - tem->a_c_cursor.row, - tem->a_c_cursor.col + count, - tem->a_c_cursor.row, - credp, called_from); - } - - tem_clear_chars(tem, - count, - tem->a_c_cursor.row, - tem->a_c_cursor.col, credp, called_from); - break; - } -} - -static void -tem_text_cursor(struct terminal_emulator *tem, short action, - cred_t *credp, enum called_from called_from) -{ - struct vis_conscursor ca; - - ca.version = VIS_CURSOR_VERSION; - ca.row = tem->a_c_cursor.row; - ca.col = tem->a_c_cursor.col; - ca.action = action; - - tem_cursor(tem, &ca, credp, called_from); - - if (action == VIS_GET_CURSOR) { - tem->a_c_cursor.row = ca.row; - tem->a_c_cursor.col = ca.col; - } -} - - -static void -tem_pix_cursor(struct terminal_emulator *tem, short action, - cred_t *credp, enum called_from called_from) -{ - struct vis_conscursor ca; - - ca.version = VIS_CURSOR_VERSION; - ca.row = tem->a_c_cursor.row * tem->a_font.height + - tem->a_p_offset.y; - ca.col = tem->a_c_cursor.col * tem->a_font.width + - tem->a_p_offset.x; - ca.width = tem->a_font.width; - ca.height = tem->a_font.height; - if (tem->a_pdepth == 8 || tem->a_pdepth == 4 || tem->a_pdepth == 1) { - if (tem->a_flags & TEM_ATTR_REVERSE) { - ca.fg_color.mono = TEM_TEXT_WHITE; - ca.bg_color.mono = TEM_TEXT_BLACK; - } else { - ca.fg_color.mono = TEM_TEXT_BLACK; - ca.bg_color.mono = TEM_TEXT_WHITE; - } - } else if (tem->a_pdepth == 24) { - if (tem->a_flags & TEM_ATTR_REVERSE) { - ca.fg_color.twentyfour[0] = TEM_TEXT_WHITE24_RED; - ca.fg_color.twentyfour[1] = TEM_TEXT_WHITE24_GREEN; - ca.fg_color.twentyfour[2] = TEM_TEXT_WHITE24_BLUE; - - ca.bg_color.twentyfour[0] = TEM_TEXT_BLACK24_RED; - ca.bg_color.twentyfour[1] = TEM_TEXT_BLACK24_GREEN; - ca.bg_color.twentyfour[2] = TEM_TEXT_BLACK24_BLUE; - } else { - ca.fg_color.twentyfour[0] = TEM_TEXT_BLACK24_RED; - ca.fg_color.twentyfour[1] = TEM_TEXT_BLACK24_GREEN; - ca.fg_color.twentyfour[2] = TEM_TEXT_BLACK24_BLUE; - - ca.bg_color.twentyfour[0] = TEM_TEXT_WHITE24_RED; - ca.bg_color.twentyfour[1] = TEM_TEXT_WHITE24_GREEN; - ca.bg_color.twentyfour[2] = TEM_TEXT_WHITE24_BLUE; - } - } - - ca.action = action; - - tem_cursor(tem, &ca, credp, called_from); -} - -static void -set_font(struct font *f, short *rows, short *cols, short height, short width) -{ - bitmap_data_t *fontToUse = NULL; - struct fontlist *fl; - - /* - * Find best font for these dimensions, or use default - * - * The plus 2 is to make sure we have at least a 1 pixel - * boarder around the entire screen. - */ - for (fl = fonts; fl->name; fl++) { - if (fl->data && - (((*rows * fl->data->height) + 2) <= height) && - (((*cols * fl->data->width) + 2) <= width)) { - fontToUse = fl->data; - break; - } - } - - /* - * The minus 2 is to make sure we have at least a 1 pixel - * boarder around the entire screen. - */ - if (fontToUse == NULL) { - if (((*rows * builtin_font_data.height) > height) || - ((*cols * builtin_font_data.width) > width)) { - *rows = (height - 2) / builtin_font_data.height; - *cols = (width - 2) / builtin_font_data.width; - } - fontToUse = &builtin_font_data; - } - - f->width = fontToUse->width; - f->height = fontToUse->height; - bcopy((caddr_t)fontToUse->encoding, (caddr_t)f->char_ptr, - sizeof (f->char_ptr)); - f->image_data = fontToUse->image; - f->image_data_size = fontToUse->image_size; - - /* Free extra data structures and bitmaps */ - - for (fl = fonts; fl->name; fl++) { - if (fl->data) { - if (fontToUse != fl->data && fl->data->image_size) - kmem_free(fl->data->image, fl->data->image_size); - kmem_free(fl->data->encoding, fl->data->encoding_size); - kmem_free(fl->data, sizeof (*fl->data)); - } - } -} - -#if defined(HAVE_1BIT) -/* - * bit_to_pix1 is for 1-bit frame buffers. It will essentially pass-through - * the bitmap, possibly inverting it for reverse video. - * - * An input data byte of 0x53 will output the bit pattern 01010011. - * - * NEEDSWORK: Does this properly handle fonts that are not a multiple - * of 8 pixels wide? - */ - -static void -bit_to_pix1( - struct terminal_emulator *tem, - unsigned char c, - text_color_t fg_color, - text_color_t bg_color) -{ - int row; - int i; - uint8_t *cp; - int bytesWide; - uint8_t data; - uint8_t *dest; - unsigned short flags; - - dest = (uint8_t *)tem->a_pix_data; - cp = tem->a_font.char_ptr[c]; - bytesWide = (tem->a_font.width + 7) / 8; - flags = tem->a_flags; - - for (row = 0; row < tem->a_font.height; row++) { - for (i = 0; i < bytesWide; i++) { - data = *cp++; - if (flags & TEM_ATTR_REVERSE) { - *dest++ = INVERSE(data); - } else { - *dest++ = data; - } - } - } -} -#endif /* HAVE_1BIT */ - -/* - * bit_to_pix4 is for 4-bit frame buffers. It will write one output byte - * for each 2 bits of input bitmap. It inverts the input bits before - * doing the output translation, for reverse video. - * - * Assuming foreground is 0001 and background is 0000... - * An input data byte of 0x53 will output the bit pattern - * 00000001 00000001 00000000 00010001. - */ - -static void -bit_to_pix4( - struct terminal_emulator *tem, - unsigned char c, - text_color_t fg_color, - text_color_t bg_color) -{ - int row; - int byte; - int i; - uint8_t *cp; - uint8_t data; - uint8_t nibblett; - int bytesWide; - uint8_t *dest; - - dest = (uint8_t *)tem->a_pix_data; - - cp = tem->a_font.char_ptr[c]; - bytesWide = (tem->a_font.width + 7) / 8; - - for (row = 0; row < tem->a_font.height; row++) { - for (byte = 0; byte < bytesWide; byte++) { - data = *cp++; - for (i = 0; i < 4; i++) { - nibblett = (data >> ((3-i) * 2)) & 0x3; - switch (nibblett) { - case 0x0: - *dest++ = bg_color << 4 | bg_color; - break; - case 0x1: - *dest++ = bg_color << 4 | fg_color; - break; - case 0x2: - *dest++ = fg_color << 4 | bg_color; - break; - case 0x3: - *dest++ = fg_color << 4 | fg_color; - break; - } - } - } - } -} - -/* - * bit_to_pix8 is for 8-bit frame buffers. It will write one output byte - * for each bit of input bitmap. It inverts the input bits before - * doing the output translation, for reverse video. - * - * Assuming foreground is 00000001 and background is 00000000... - * An input data byte of 0x53 will output the bit pattern - * 0000000 000000001 00000000 00000001 00000000 00000000 00000001 00000001. - */ - - -static void -bit_to_pix8( - struct terminal_emulator *tem, - unsigned char c, - text_color_t fg_color, - text_color_t bg_color) -{ - int row; - int byte; - int i; - uint8_t *cp; - uint8_t data; - int bytesWide; - uint8_t mask; - int bitsleft, nbits; - uint8_t *dest; - - dest = (uint8_t *)tem->a_pix_data; - - cp = tem->a_font.char_ptr[c]; - bytesWide = (tem->a_font.width + 7) / 8; - - for (row = 0; row < tem->a_font.height; row++) { - bitsleft = tem->a_font.width; - for (byte = 0; byte < bytesWide; byte++) { - data = *cp++; - mask = 0x80; - nbits = min(8, bitsleft); - bitsleft -= nbits; - for (i = 0; i < nbits; i++) { - *dest++ = (data & mask ? fg_color: bg_color); - mask = mask >> 1; - } - } - } -} - -/* - * bit_to_pix24 is for 24-bit frame buffers. It will write four output bytes - * for each bit of input bitmap. It inverts the input bits before - * doing the output translation, for reverse video. - * - * Assuming foreground is 00000000 11111111 11111111 11111111 - * and background is 00000000 00000000 00000000 00000000 - * An input data byte of 0x53 will output the bit pattern - * - * 00000000 00000000 00000000 00000000 - * 00000000 11111111 11111111 11111111 - * 00000000 00000000 00000000 00000000 - * 00000000 11111111 11111111 11111111 - * 00000000 00000000 00000000 00000000 - * 00000000 00000000 00000000 00000000 - * 00000000 11111111 11111111 11111111 - * 00000000 11111111 11111111 11111111 - * - * FYI this is a pad byte followed by 1 byte each for R,G, and B. - */ - -/* - * A 24-bit pixel trapped in a 32-bit body. - */ -typedef uint32_t pixel32; - -/* - * Union for working with 24-bit pixels in 0RGB form, where the - * bytes in memory are 0 (a pad byte), red, green, and blue in that order. - */ -union pixel32_0RGB { - struct { - char pad; - char red; - char green; - char blue; - } bytes; - pixel32 pix; -}; - -struct { - unsigned char red[16]; - unsigned char green[16]; - unsigned char blue[16]; -} solaris_to_24 = { - /* BEGIN CSTYLED */ - /* Wh+ Bk Bl Gr Cy Rd Mg Br Wh Bk+ Bl+ Gr+ Cy+ Rd+ Mg+ Yw */ - 255,000,000,000,000,128,128,128,128, 64,000,000,000,255,255,255, - 255,000,000,128,128,000,000,128,128, 64,000,255,255,000,000,255, - 255,000,128,000,128,000,128,000,128, 64,255,000,255,000,255,000, - /* END CSTYLED */ -}; - -static void -bit_to_pix24( - struct terminal_emulator *tem, - unsigned char c, - text_color_t fg_color_4, - text_color_t bg_color_4) -{ - int row; - int byte; - int i; - uint8_t *cp; - uint8_t data; - int bytesWide; - union pixel32_0RGB fg_color; - union pixel32_0RGB bg_color; - int bitsleft, nbits; - pixel32 *destp; - - fg_color.bytes.pad = 0; - bg_color.bytes.pad = 0; - - fg_color.bytes.red = solaris_to_24.red[fg_color_4]; - fg_color.bytes.green = solaris_to_24.green[fg_color_4]; - fg_color.bytes.blue = solaris_to_24.blue[fg_color_4]; - bg_color.bytes.red = solaris_to_24.red[bg_color_4]; - bg_color.bytes.green = solaris_to_24.green[bg_color_4]; - bg_color.bytes.blue = solaris_to_24.blue[bg_color_4]; - - destp = (pixel32 *)tem->a_pix_data; - cp = tem->a_font.char_ptr[c]; - bytesWide = (tem->a_font.width + 7) / 8; - - for (row = 0; row < tem->a_font.height; row++) { - bitsleft = tem->a_font.width; - for (byte = 0; byte < bytesWide; byte++) { - data = *cp++; - nbits = min(8, bitsleft); - bitsleft -= nbits; - for (i = 0; i < nbits; i++) { - *destp++ = (data & 0x80 ? - fg_color.pix : bg_color.pix); - data <<= 1; - } - } - } -} - -typedef enum solaris_colors { - solaris_brt_white = 0, - solaris_black = 1, - solaris_blue = 2, - solaris_green = 3, - solaris_cyan = 4, - solaris_red = 5, - solaris_magenta = 6, - solaris_brown = 7, - solaris_white = 8, - solaris_grey = 9, - solaris_brt_blue = 10, - solaris_brt_green = 11, - solaris_brt_cyan = 12, - solaris_brt_red = 13, - solaris_brt_magenta = 14, - solaris_yellow = 15 -} solaris_colors_t; - -static const text_color_t ansi_bg_to_solaris_colors[8] = { - solaris_black, /* 0 - black */ - solaris_red, /* 1 - red */ - solaris_green, /* 2 - green */ - solaris_brown, /* 3 - brown */ - solaris_blue, /* 4 - blue */ - solaris_magenta, /* 5 - magenta */ - solaris_cyan, /* 6 - cyan */ - solaris_white /* 7 - white */ -}; - -static const text_color_t ansi_fg_to_solaris_colors[8] = { - solaris_black, /* 0 - black */ - solaris_red, /* 1 - red */ - solaris_green, /* 2 - green */ - solaris_brown, /* 3 - brown */ - solaris_blue, /* 4 - blue */ - solaris_magenta, /* 5 - magenta */ - solaris_cyan, /* 6 - cyan */ - solaris_white /* 7 - white */ -}; - -static const text_color_t ansi_fg_bold_to_solaris_colors[8] = { - solaris_grey, /* 0 - black */ - solaris_brt_red, /* 1 - red */ - solaris_brt_green, /* 2 - green */ - solaris_yellow, /* 3 - brown */ - solaris_brt_blue, /* 4 - blue */ - solaris_brt_magenta, /* 5 - magenta */ - solaris_brt_cyan, /* 6 - cyan */ - solaris_brt_white /* 7 - white */ -}; - -/* ARGSUSED */ -static text_color_t -ansi_bg_to_solaris(struct terminal_emulator *tem, int ansi) -{ - ASSERT(ansi < NELEM(ansi_bg_to_solaris_colors)); - return (ansi_bg_to_solaris_colors[ansi]); -} - -static text_color_t -ansi_fg_to_solaris(struct terminal_emulator *tem, int ansi) -{ - if (tem->a_flags & TEM_ATTR_BOLD) { - ASSERT(ansi < NELEM(ansi_fg_bold_to_solaris_colors)); - return (ansi_fg_bold_to_solaris_colors[ansi]); - } else { - ASSERT(ansi < NELEM(ansi_fg_to_solaris_colors)); - return (ansi_fg_to_solaris_colors[ansi]); - } -} - -static void -tem_display( - struct terminal_emulator *tem, - struct vis_consdisplay *pda, - cred_t *credp, - enum called_from called_from) -{ - int rval; - - if (called_from == CALLED_FROM_STANDALONE) - tem->fb_polledio->display(tem->fb_polledio->arg, pda); - else - (void) ldi_ioctl(tem->hdl, VIS_CONSDISPLAY, - (intptr_t)pda, FKIOCTL, credp, &rval); -} - -static void -tem_copy( - struct terminal_emulator *tem, - struct vis_conscopy *pma, - cred_t *credp, - enum called_from called_from) -{ - int rval; - - if (called_from == CALLED_FROM_STANDALONE) - tem->fb_polledio->copy(tem->fb_polledio->arg, pma); - else - (void) ldi_ioctl(tem->hdl, VIS_CONSCOPY, - (intptr_t)pma, FKIOCTL, credp, &rval); -} - -static void -tem_cursor( - struct terminal_emulator *tem, - struct vis_conscursor *pca, - cred_t *credp, - enum called_from called_from) -{ - int rval; - - if (called_from == CALLED_FROM_STANDALONE) - tem->fb_polledio->cursor(tem->fb_polledio->arg, pca); - else - (void) ldi_ioctl(tem->hdl, VIS_CONSCURSOR, - (intptr_t)pca, FKIOCTL, credp, &rval); -} - -void -tem_get_size(struct terminal_emulator *tem, int *r, int *c, int *x, int *y) -{ - *r = tem->a_c_dimension.height; - *c = tem->a_c_dimension.width; - *x = tem->a_p_dimension.width; - *y = tem->a_p_dimension.height; -}
--- a/usr/src/uts/common/io/wscons.c Thu Jan 12 17:28:32 2006 -0800 +++ b/usr/src/uts/common/io/wscons.c Thu Jan 12 18:17:46 2006 -0800 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -19,8 +18,9 @@ * * CDDL HEADER END */ + /* - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -63,9 +63,8 @@ #include <sys/ddi_impldefs.h> #include <sys/promif.h> #include <sys/policy.h> -#if defined(_CONSOLE_OUTPUT_VIA_SOFTWARE) -#include <sys/terminal-emulator.h> -#endif +#include <sys/tem.h> +#include <sys/wscons.h> #define MINLINES 10 #define MAXLINES 48 @@ -77,18 +76,16 @@ #define LOSCREENCOLS 80 #define HISCREENCOLS 120 -static struct wscons { +struct wscons { + struct tem *wc_tem; /* Terminal emulator state */ int wc_flags; /* random flags (protected by */ /* write-side exclusion lock */ dev_t wc_dev; /* major/minor for this device */ tty_common_t wc_ttycommon; /* data common to all tty drivers */ -#if defined(_CONSOLE_OUTPUT_VIA_FIRMWARE) +#ifdef _HAVE_TEM_FIRMWARE int wc_pendc; /* pending output character */ int wc_defer_output; /* set if output device is "slow" */ -#endif -#if defined(_CONSOLE_OUTPUT_VIA_SOFTWARE) - struct terminal_emulator *wc_tem; /* Terminal emulator state */ -#endif +#endif /* _HAVE_TEM_FIRMWARE */ queue_t *wc_kbdqueue; /* "console keyboard" device queue */ /* below us */ bufcall_id_t wc_bufcallid; /* id returned by qbufcall */ @@ -177,22 +174,22 @@ static void wcreioctl(void *); static void wcioctl(queue_t *, mblk_t *); -#if defined(_CONSOLE_OUTPUT_VIA_FIRMWARE) +#ifdef _HAVE_TEM_FIRMWARE static void wcopoll(void *); static void wconsout(void *); -#endif +#endif /* _HAVE_TEM_FIRMWARE */ static void wcrstrt(void *); static void wcstart(void); static void wc_open_kb_polledio(struct wscons *wc, queue_t *q, mblk_t *mp); static void wc_close_kb_polledio(struct wscons *wc, queue_t *q, mblk_t *mp); -#if defined(_CONSOLE_OUTPUT_VIA_SOFTWARE) -static void wc_putchar(struct cons_polledio_arg *arg, unsigned char c); -#endif -static boolean_t wc_ischar(struct cons_polledio_arg *arg); -static int wc_getchar(struct cons_polledio_arg *arg); +static void wc_polled_putchar(struct cons_polledio_arg *arg, + unsigned char c); +static boolean_t wc_polled_ischar(struct cons_polledio_arg *arg); +static int wc_polled_getchar(struct cons_polledio_arg *arg); static void wc_polled_enter(struct cons_polledio_arg *arg); static void wc_polled_exit(struct cons_polledio_arg *arg); static void wc_get_size(struct wscons *wscons); +static void wc_modechg_cb(tem_modechg_cb_arg_t arg); #include <sys/types.h> #include <sys/conf.h> @@ -212,7 +209,7 @@ static void wc_dprintf(const char *fmt, ...) __KPRINTFLIKE(1); #define DPRINTF(l, m, args) \ (((l) >= wc_errlevel) && ((m) & wc_errmask) ? \ - wc_dprintf args : \ + wc_dprintf args : \ (void) 0) /* @@ -278,6 +275,9 @@ return (-1); } wc_dip = devi; + + bzero(&(wscons.wc_polledio), sizeof (wscons.wc_polledio)); + return (DDI_SUCCESS); } @@ -307,18 +307,19 @@ return (error); } -#if defined(_CONSOLE_OUTPUT_VIA_FIRMWARE) +#ifdef _HAVE_TEM_FIRMWARE /* * Output buffer. Protected by the per-module inner perimeter. */ #define MAXHIWAT 2000 static char obuf[MAXHIWAT]; -#endif +#endif /* _HAVE_TEM_FIRMWARE */ /*ARGSUSED*/ static int wcopen(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *crp) { + static boolean_t polledio_inited = B_FALSE; struct termios *termiosp; int len; @@ -351,31 +352,39 @@ wscons.wc_ttycommon.t_iocpending = NULL; wscons.wc_flags = WCS_ISOPEN; + wscons.wc_dev = *devp; wc_get_size(&wscons); - bzero(&(wscons.wc_polledio), sizeof (wscons.wc_polledio)); - wscons.wc_polledio.cons_polledio_version = CONSPOLLEDIO_V0; - wscons.wc_polledio.cons_polledio_argument = - (struct cons_polledio_arg *)&wscons; -#if defined(_CONSOLE_OUTPUT_VIA_SOFTWARE) - wscons.wc_polledio.cons_polledio_putchar = wc_putchar; -#else - wscons.wc_polledio.cons_polledio_putchar = NULL; -#endif - wscons.wc_polledio.cons_polledio_getchar = wc_getchar; - wscons.wc_polledio.cons_polledio_ischar = wc_ischar; - wscons.wc_polledio.cons_polledio_enter = wc_polled_enter; - wscons.wc_polledio.cons_polledio_exit = wc_polled_exit; + if (!polledio_inited) { + polledio_inited = B_TRUE; -#if defined(_CONSOLE_OUTPUT_VIA_FIRMWARE) - /* - * If we're talking directly to a framebuffer, we assume - * that it's a "slow" device, so that rendering should be - * deferred to a timeout or softcall so that we write - * a bunch of characters at once. - */ - wscons.wc_defer_output = prom_stdout_is_framebuffer(); -#endif + /* + * Initialize the parts of the polled I/O struct that + * are common to both input and output modes, but which + * don't flag to the upper layers, which if any of the + * two modes are available. We don't know at this point + * if system is configured CONS_KFB, but we will when + * consconfig_dacf asks us with CONSOPENPOLLED I/O. + */ + wscons.wc_polledio.cons_polledio_version = + CONSPOLLEDIO_V0; + wscons.wc_polledio.cons_polledio_argument = + (struct cons_polledio_arg *)&wscons; + wscons.wc_polledio.cons_polledio_enter = + wc_polled_enter; + wscons.wc_polledio.cons_polledio_exit = + wc_polled_exit; + +#ifdef _HAVE_TEM_FIRMWARE + /* + * If we're talking directly to a framebuffer, we assume + * that it's a "slow" device, so that rendering should + * be deferred to a timeout or softcall so that we write + * a bunch of characters at once. + */ + wscons.wc_defer_output = prom_stdout_is_framebuffer(); +#endif /* _HAVE_TEM_FIRMWARE */ + } } if (wscons.wc_ttycommon.t_flags & TS_XCLUDE) { @@ -565,6 +574,46 @@ } } +static int +wc_getterm(mblk_t *mp) +{ + char *term; + intptr_t arg; + int flag = ((struct iocblk *)mp->b_rptr)->ioc_flag; + + STRUCT_DECL(cons_getterm, wcterm); + STRUCT_INIT(wcterm, flag); + + arg = *((intptr_t *)mp->b_cont->b_rptr); + + if (ddi_copyin((void *)arg, STRUCT_BUF(wcterm), + STRUCT_SIZE(wcterm), flag) != 0) { + return (EFAULT); + } + + if (consmode == CONS_FW) { + /* PROM terminal emulator */ + term = "sun"; + } else { + /* Kernel terminal emulator */ + ASSERT(consmode == CONS_KFB); + term = "sun-color"; + } + + if (STRUCT_FGET(wcterm, cn_term_len) < + strlen(term) + 1) { + return (EOVERFLOW); + } + + if (ddi_copyout(term, + STRUCT_FGETP(wcterm, cn_term_type), + strlen(term) + 1, flag) != 0) { + return (EFAULT); + } + + return (0); +} + /* * Process an "ioctl" message sent down to us. */ @@ -574,9 +623,7 @@ struct iocblk *iocp; size_t datasize; int error; -#if defined(_CONSOLE_OUTPUT_VIA_SOFTWARE) - int len; -#endif + long len; iocp = (struct iocblk *)mp->b_rptr; @@ -609,31 +656,27 @@ } /* - * If the keyboard driver does not support polled I/O - * then NAK this request. + * We are given an appropriate-sized data block, + * and return a pointer to our structure in it. */ - if (wscons.wc_kb_polledio != NULL) { - /* - * We are given an appropriate-sized data block, - * and return a pointer to our structure in it. - */ - *(struct cons_polledio **)mp->b_cont->b_rptr = - &wscons.wc_polledio; + if (consmode == CONS_KFB) + wscons.wc_polledio.cons_polledio_putchar = + wc_polled_putchar; + *(struct cons_polledio **)mp->b_cont->b_rptr = + &wscons.wc_polledio; - mp->b_datap->db_type = M_IOCACK; - } else { - /* - * The driver does not support polled mode, so NAK - * the request. - */ - miocnak(q, mp, 0, ENXIO); - return; - } + mp->b_datap->db_type = M_IOCACK; qreply(q, mp); break; -#if defined(_CONSOLE_OUTPUT_VIA_SOFTWARE) + case CONS_GETTERM: + if ((error = wc_getterm(mp)) != 0) + miocnak(q, mp, 0, error); + else + miocack(q, mp, 0, 0); + return; + case WC_OPEN_FB: /* * Start out pessimistic, so that we can just jump to @@ -681,8 +724,7 @@ * dimensions from a property, e.g. screen-#rows. */ iocp->ioc_error = tem_init(&wscons.wc_tem, - (char *)mp->b_cont->b_rptr, iocp->ioc_cr, - 0, 0); + (char *)mp->b_cont->b_rptr, iocp->ioc_cr); /* * Of course, if the terminal emulator initialization * failed, fail. @@ -690,6 +732,9 @@ if (iocp->ioc_error != 0) goto open_fail; + tem_register_modechg_cb(wscons.wc_tem, wc_modechg_cb, + (tem_modechg_cb_arg_t)&wscons); + /* * Refresh terminal size with info from terminal emulator. */ @@ -722,7 +767,6 @@ close_fail: qreply(q, mp); break; -#endif default: @@ -871,7 +915,7 @@ qreply(q, mp); } -#if defined(_CONSOLE_OUTPUT_VIA_FIRMWARE) +#ifdef _HAVE_TEM_FIRMWARE /* ARGSUSED */ static void wcopoll(void *arg) @@ -891,7 +935,7 @@ wscons.wc_timeoutid = qtimeout(q, wcopoll, NULL, 1); } } -#endif /* _CONSOLE_OUTPUT_VIA_FIRMWARE */ +#endif /* _HAVE_TEM_FIRMWARE */ /* * Restart output on the console after a timeout. @@ -911,10 +955,10 @@ static void wcstart(void) { -#if defined(_CONSOLE_OUTPUT_VIA_FIRMWARE) +#ifdef _HAVE_TEM_FIRMWARE int c; ssize_t cc; -#endif +#endif /* _HAVE_TEM_FIRMWARE */ queue_t *q; mblk_t *bp; mblk_t *nbp; @@ -926,7 +970,7 @@ * new. */ if (wscons.wc_flags & (WCS_DELAY|WCS_BUSY|WCS_STOPPED)) - goto out; + return; q = wscons.wc_ttycommon.t_writeq; /* @@ -936,7 +980,7 @@ */ for (;;) { if ((bp = getq(q)) == NULL) - goto out; /* nothing to transmit */ + return; /* nothing to transmit */ /* * We have a new message to work on. @@ -958,7 +1002,7 @@ (clock_t)(*(unsigned char *)bp->b_rptr + 6)); wscons.wc_flags |= WCS_DELAY; freemsg(bp); - goto out; /* wait for this to finish */ + return; /* wait for this to finish */ case M_IOCTL: /* @@ -970,23 +1014,29 @@ continue; } -#if defined(_CONSOLE_OUTPUT_VIA_SOFTWARE) - if (wscons.wc_tem != NULL) { - for (nbp = bp; nbp != NULL; nbp = nbp->b_cont) { - if (nbp->b_wptr > nbp->b_rptr) { - (void) tem_write(wscons.wc_tem, - nbp->b_rptr, nbp->b_wptr - nbp->b_rptr, - kcred); - } - } +#ifdef _HAVE_TEM_FIRMWARE + if (consmode == CONS_KFB) { +#endif /* _HAVE_TEM_FIRMWARE */ + if (wscons.wc_tem != NULL) { + for (nbp = bp; nbp != NULL; nbp = nbp->b_cont) { + if (nbp->b_wptr > nbp->b_rptr) { + (void) tem_write(wscons.wc_tem, + nbp->b_rptr, + nbp->b_wptr - nbp->b_rptr, + kcred); + } + } + freemsg(bp); + } +#ifdef _HAVE_TEM_FIRMWARE + continue; } - freemsg(bp); -#else /* _CONSOLE_OUTPUT_VIA_FIRMWARE */ + + /* consmode = CONS_FW */ if ((cc = bp->b_wptr - bp->b_rptr) == 0) { freemsg(bp); continue; } - /* * Direct output to the frame buffer if this device * is not the "hardware" console. @@ -999,18 +1049,17 @@ wscons.wc_flags |= WCS_BUSY; wscons.wc_pendc = -1; (void) putbq(q, bp); - if (q->q_count > 128) { /* do it soon */ + if (q->q_count > 128) { /* do it soon */ softcall(wconsout, NULL); - } else { /* wait a bit */ + } else { /* wait a bit */ if (wscons.wc_timeoutid != 0) (void) quntimeout(q, wscons.wc_timeoutid); wscons.wc_timeoutid = qtimeout(q, wconsout, NULL, hz / 30); } - goto out; + return; } - for (;;) { c = *bp->b_rptr++; cc--; @@ -1023,26 +1072,24 @@ wscons.wc_timeoutid = qtimeout(q, wcopoll, NULL, 1); if (bp != NULL) - /* not done with this message yet */ + /* not done with this message yet */ (void) putbq(q, bp); - goto out; + return; } while (cc <= 0) { nbp = bp; bp = bp->b_cont; freeb(nbp); if (bp == NULL) - goto out; + return; cc = bp->b_wptr - bp->b_rptr; } } -#endif +#endif /* _HAVE_TEM_FIRMWARE */ } -out: - ; } -#if defined(_CONSOLE_OUTPUT_VIA_FIRMWARE) +#ifdef _HAVE_TEM_FIRMWARE /* * Output to frame buffer console. * It takes a long time to scroll. @@ -1111,7 +1158,7 @@ wscons.wc_flags &= ~WCS_BUSY; wcstart(); } -#endif +#endif /* _HAVE_TEM_FIRMWARE */ /* * Put procedure for lower read queue. @@ -1174,7 +1221,13 @@ "ACK CONSOPENPOLLEDIO\n")); wscons.wc_kb_polledio = *(struct cons_polledio **) - mp->b_cont->b_rptr; + mp->b_cont->b_rptr; + wscons.wc_polledio. + cons_polledio_getchar = + wc_polled_getchar; + wscons.wc_polledio. + cons_polledio_ischar = + wc_polled_ischar; break; case CONSCLOSEPOLLEDIO: @@ -1183,6 +1236,10 @@ "ACK CONSCLOSEPOLLEDIO\n")); wscons.wc_kb_polledio = NULL; wscons.wc_kbdqueue = NULL; + wscons.wc_polledio. + cons_polledio_getchar = NULL; + wscons.wc_polledio. + cons_polledio_ischar = NULL; break; default: DPRINTF(PRINT_L1, PRINT_MASK_ALL, @@ -1207,6 +1264,10 @@ case CONSCLOSEPOLLEDIO: wscons.wc_kb_polledio = NULL; wscons.wc_kbdqueue = NULL; + wscons.wc_polledio. + cons_polledio_getchar = NULL; + wscons.wc_polledio. + cons_polledio_ischar = NULL; break; } break; @@ -1279,16 +1340,16 @@ * moved to space.c to allow "wc" to become a loadable module. */ -#if defined(_CONSOLE_OUTPUT_VIA_SOFTWARE) /* - * This is for systems without OBP. + * These are for systems without OBP, and for devices that cannot be