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
author lq150181
date Thu, 12 Jan 2006 18:17:46 -0800
parents dcc3e0f788c9
children b12a29236803
files usr/src/cmd/svc/milestone/console-login usr/src/cmd/svc/milestone/make-console-login-xml usr/src/cmd/ttymon/tmexpress.c usr/src/pkgdefs/SUNWckr/prototype_i386 usr/src/pkgdefs/SUNWckr/prototype_sparc usr/src/psm/promif/ieee1275/common/prom_env.c usr/src/psm/promif/ieee1275/common/prom_fb.c usr/src/psm/promif/ieee1275/common/prom_io.c usr/src/tools/scripts/bfu.sh usr/src/uts/common/Makefile.files usr/src/uts/common/io/12x22.c usr/src/uts/common/io/6x10.c usr/src/uts/common/io/7x14.c usr/src/uts/common/io/cons.c usr/src/uts/common/io/consconfig_dacf.c usr/src/uts/common/io/tem.c usr/src/uts/common/io/tem_safe.c usr/src/uts/common/io/terminal-emulator.c usr/src/uts/common/io/wscons.c usr/src/uts/common/os/console.c usr/src/uts/common/os/space.c usr/src/uts/common/sys/consconfig_dacf.h usr/src/uts/common/sys/consdev.h usr/src/uts/common/sys/console.h usr/src/uts/common/sys/font.h usr/src/uts/common/sys/isa_defs.h usr/src/uts/common/sys/tem.h usr/src/uts/common/sys/tem_impl.h usr/src/uts/common/sys/terminal-emulator.h usr/src/uts/common/sys/visual_io.h usr/src/uts/common/sys/wscons.h usr/src/uts/i86pc/os/machdep.c usr/src/uts/intel/Makefile.intel.shared usr/src/uts/intel/io/consplat.c usr/src/uts/intel/tem/Makefile usr/src/uts/intel/terminal-emulator/Makefile usr/src/uts/intel/wc/Makefile usr/src/uts/sparc/Makefile.sparc.shared usr/src/uts/sparc/io/consplat.c usr/src/uts/sparc/os/polled_io.c usr/src/uts/sparc/sys/polled_io.h usr/src/uts/sparc/tem/Makefile usr/src/uts/sparc/wc/Makefile usr/src/uts/sun/sys/promif.h usr/src/uts/sun/sys/promimpl.h usr/src/uts/sun4/os/startup.c
diffstat 46 files changed, 12297 insertions(+), 3416 deletions(-) [+]
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