[comp.lang.apl] APL Font for wyse 60 terminals

vipoon@kepler1.UUCP (Victor I Poon) (08/06/89)

	This group doesn't seem to get much traffic (I know that I'm
the n-th person to say this but it's still true).  I've almost finished
a program which downloads an APL font into a Wyse 60 terminal.  It 
should also work for Wyse 50s and I was wondering if anyone out there
would be in need of such a thing or did I just re-invent the wheel?  

	We are using Dyalog APL which has a very nice feature.  It uses
input and output translation tables to remap the character set.  So as 
long you have a terminal that contains the APL character set, you can
generate a map tables and you get an instant APL terminal (with an ASCII
keyboard but you can't have everything).  My company once looked at APL
terminals and they were quite expensive.  This was definitely more cost
effective.


-- 
Victor I. Poon		{acsm, lilink, polyof, sbcs}!kepler1!vipoon
Kepler Financial Management, Ltd.
It was the best of times, It was the worst of times, ...

dag@fciva.FRANKLIN.COM (Daniel A. Graifer) (08/07/89)

In article <148@kepler1.UUCP> vipoon@kepler1.UUCP (Victor I Poon) writes:
>
>	This group doesn't seem to get much traffic  [...]
Yeah, I know.  Shame, isn't it?  I am posting this rather than E-mailing 
just to let people know that there is still some interest in APL.

>I've almost finished
>a program which downloads an APL font into a Wyse 60 terminal. [...]

We have a bunch of Wyse 60s here, because we have a bunch of Merge/MessyDOS
users that need the SCANCODE mode.  I am the only APLer, but could certainly
use such a font set.

>-- 
>Victor I. Poon		{acsm, lilink, polyof, sbcs}!kepler1!vipoon
>Kepler Financial Management, Ltd.

I must admit to some amazement;  I thought we were the only finance industry
company on the net!

Thanks in advance
Dan

ccdn@levels.sait.edu.au (DAVID NEWALL) (08/08/89)

In article <148@kepler1.UUCP>, vipoon@kepler1.UUCP (Victor I Poon) writes:
> I've almost finished a program which downloads an APL font into a Wyse 60
> terminal.  It should also work for Wyse 50s

How can you download a font into a wyse 50?


David Newall                     Phone:  +61 8 343 3160
Unix Systems Programmer          Fax:    +61 8 349 6939
Academic Computing Service       E-mail: ccdn@levels.sait.oz.au
SA Institute of Technology       Post:   The Levels, South Australia, 5095

                "Execute A assigned quote execute A quote"

vipoon@kepler1.UUCP (Victor I Poon) (08/14/89)

In article <1070@levels.sait.edu.au> ccdn@levels.sait.edu.au (DAVID NEWALL) writes:
>How can you download a font into a wyse 50?
>
>

	In the Wyse 60, there is an escape sequence to define a character;
it looks like the following:

	ESC c A kk pp bb bb ... bb ^Y		( 40 byte sequence )

	where kk is the font bank ("00" - "03"),
	      pp is the character position ("00" - "FF")
	      bb is the character bit map for one line of pixels (in hex)

I believe that it is the same for a Wyse 50.  The only difference between 
the two terminals is that the Wyse 60 has a bunch of internal functions
like a calculator, an alarm clock and an ASCII table.  It's been a while 
since I've used one of these but I have a friend who has one and I'll 
probably find out from him if it's possible to do the same thing.

Victor
-- 
Victor I. Poon		{acsm, lilink, polyof, sbcs}!kepler1!vipoon
Kepler Financial Management, Ltd.            vipoon@sbcs.sunysb.edu
It was the best of times, It was the worst of times, ...

vipoon@kepler1.UUCP (Victor I Poon) (08/14/89)

Apologies to anyone who doesn't believe that I should have posted this
program in this group.

"At the time, it seemed the logical thing to do."


#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  Font.desc MANIFEST Makefile README cvtfont.c waplfont.c
# Wrapped by vipoon@kepler1 on Sun Aug 13 18:05:15 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Font.desc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Font.desc'\"
else
echo shar: Extracting \"'Font.desc'\" \(5138 characters\)
sed "s/^X//" >'Font.desc' <<'END_OF_FILE'
X			APL Font Description
X
X   The following list gives a description of each character and their
Xcorresponding position in the array table.  There wasn't much room to
Xput comments in the program so I am including this file which defines
Xall of the characters that are created in the font banks.  This char-
Xacter set maps vaguely to the PC Equivalent Font of the Wyse 60 Term-
Xinals with APL characters substituting some of the more seldomly used
Xcharacters.
X---------------------------------------------------------------------
X
XTable
XEntry   	 Description
X-----		 -----------
X 32 		 Space
X 33 		 Quote Dot (Shriek Binomial Factorial)
X 34 		 Ascii Double Quote 
X 35 		 Hash
X 36 		 Dollar
X 37 		 Percent
X 38 		 Ascii Ampersand &
X 39 		 APL-Quote
X 39 		 Ascii Quote Single '
X 40 		 Left-Parenthesis
X 41 		 Right-Parenthesis
X 42 		 Star (Exponential Power)
X 43 		 Plus (Conjugate Add)
X 44 		 Comma (Ravel Catenate)
X 45 		 Bar (Negate Minus Subtract)
X 46 		 Dot
X 47 		 Slash (Replicate  Reduce)
X 48 		 0 Zero
X 49 		 1 One
X 50 		 2 Two
X 51 		 3 Three
X 52 		 4 Four
X 53 		 5 Five
X 54 		 6 Six
X 55 		 7 Seven
X 56 		 8 Eight
X 57 		 9 Nine
X 58 		 Colon
X 59 		 Semicolon
X 60 		 Left-Caret (Less than)
X 61 		 Equal
X 62 		 Right-Caret (Greater than)
X 63 		 Query (Roll Deal)
X 64 		 Ascii At sign @
X 65 		 Upper case A
X 66 		 Upper case B
X 67 		 Upper case C
X 68 		 Upper case D
X 69 		 Upper case E
X 70 		 Upper case F
X 71 		 Upper case G
X 72 		 Upper case H
X 73 		 Upper case I
X 74 		 Upper case J
X 75 		 Upper case K
X 76 		 Upper case L
X 77 		 Upper case M
X 78 		 Upper case N
X 79 		 Upper case O
X 80 		 Upper case P
X 81 		 Upper case Q
X 82 		 Upper case R
X 83 		 Upper case S
X 84 		 Upper case T
X 85 		 Upper case U
X 86 		 Upper case V
X 87 		 Upper case W
X 88 		 Upper case X
X 89 		 Upper case Y
X 90 		 Upper case Z
X 91 		 Left-Bracket
X 92 		 Back-Slash (Expand  Scan)
X 93 		 Right-Bracket
X 94 		 Up-Caret (And)
X 94 		 Ascii Caret
X 95 		 Underbar
X 96 		 Ascii Back Quote
X 97 		 Lower case a
X 98 		 Lower case b
X 99 		 Lower case c
X100 		 Lower case d
X101 		 Lower case e
X102 		 Lower case f
X103 		 Lower case g
X104 		 Lower case h
X105 		 Lower case i
X106 		 Lower case j
X107 		 Lower case k
X108 		 Lower case l
X109 		 Lower case m
X110 		 Lower case n
X111 		 Lower case o
X112 		 Lower case p
X113 		 Lower case q
X114 		 Lower case r
X115 		 Lower case s
X116 		 Lower case t
X117 		 Lower case u
X118 		 Lower case v
X119 		 Lower case w
X120 		 Lower case x
X121 		 Lower case y
X122 		 Lower case z
X123 		 Left-Brace
X124 		 Stile (Absolute Residue Modulus)
X124 		 Ascii Pipe
X125 		 Right-Brace
X126 		 Tilde (Not Exclude Without)
X127 		 Delta
X128 		 Delta underbar
X129 		 Upper case A underscore
X130 		 Upper case B underscore
X131 		 Upper case C underscore
X132 		 Upper case D underscore
X133 		 Upper case E underscore
X134 		 Upper case F underscore
X135 		 Upper case G underscore
X136 		 Upper case H underscore
X137 		 Upper case I underscore
X138 		 Upper case J underscore
X139 		 Upper case K underscore
X140 		 Upper case L underscore
X141 		 Upper case M underscore
X142 		 Upper case N underscore
X143 		 Upper case O underscore
X144 		 Upper case P underscore
X145 		 Upper case Q underscore
X146 		 Upper case R underscore
X147 		 Upper case S underscore
X148 		 Upper case T underscore
X149 		 Upper case U underscore
X150 		 Upper case V underscore
X151 		 Upper case W underscore
X152 		 Upper case X underscore
X153 		 Upper case Y underscore
X154 		 Upper case Z underscore
X155 		 Left Shoe Stile (Cent)
X156 		 L bar (Pound Sterling)
X157 		 Quad
X158 		 Quote Quad
X159 		 Quad Divide (Domino  Matrix Inverse)
X160		 Up-Arrow (Mix Take)
X161		 Down-Arrow (Split Drop)
X162		 Left-Arrow
X163		 Right-Arrow
X164 		 Down-Tack (decode base)
X165 		 Up-Tack (encode represent)
X166		 Left-Tack
X167		 Right-Tack
X168 		 Down-Tack Jot (Execute)
X169 		 Up-Tack Jot (Format)
X170 		 Slash Bar
X171 		 Back-Slash bar
X172		 Delta Stile (Up Grade)
X173		 Del Stile (Down Grade)
X174 		 Down-Caret Tilde (Nor)
X175 		 Up-Caret Tilde (Nand)
X176 		 Left-Shoe (Enclose)
X177		 Right-Shoe (Disclose)
X178 		 Down-Shoe (Union)
X179		 Vertical Bar
X180		 Right T
X186 		 Left-Bracket Right-Bracket (Squish)
X191		 Upper Right Corner
X192		 Lower Left Corner
X193		 Bottom T
X194		 Top T
X195		 Left T
X196		 Horiz Bar
X197 		 Stile Bar
X197		 Crossing Lines
X217		 Lower Right Corner
X218		 Upper Left Corner
X224 		 Alpha
X225		 Omega
X226 		 Iota (Index)
X227 		 Rho (Shape Reshape)
X228 		 Multiply (Signum)
X229 		 Overbar (High Minus)
X230		 Up-Tack Down-Tack (I-beam)
X231		 Del Tilde
X232 		 Circle Stile (Rotate)
X233 		 Circle Bar (Rotate 1st)
X234		 Circle Star (Power)
X235 		 Up-Shoe Jot (Lamp  Comment)
X236 		 Down-Caret (Or)
X237 		 Circle Backslash (Transpose)
X238 		 Epsilon (Type Membership)
X239 		 Up-Shoe (Intersection)
X240 		 Equal Underbar (Match)
X241		 Not-Equal Underbar (Natch)
X242 		 Greater-than-or-Equal
X243 		 Less-than-or-Equal
X244 		 Ceiling (Max)
X245 		 Floor (Min)
X246 		 Divide (Reciprocal)
X247 		 Not-Equal
X248 		 Jot (Compose)
X249 		 Circle (Trig)
X250 		 Zero Tilde (Zilde)
X251		 Diamond
X252 		 Comma Bar
X253		 Diaeresis (each)
X254 		 Diaeresis Tilde (Commute)
X255 		 Del (Function Edit)
END_OF_FILE
if test 5138 -ne `wc -c <'Font.desc'`; then
    echo shar: \"'Font.desc'\" unpacked with wrong size!
fi
# end of 'Font.desc'
fi
if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MANIFEST'\"
else
echo shar: Extracting \"'MANIFEST'\" \(497 characters\)
sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
X   File Name		Archive #	Description
X-----------------------------------------------------------
X MANIFEST                   1	This shipping list
X Makefile                   1	Control file for Unix make program
X README                     1	Acknowledgements, installation notes
X Font.desc                  1   A description of the characrters
X cvtfont.c                  1   Converts an ASCII display of fonts to decimal
X waplfont.c                 1   Downloads an APL font into the Wyse terminal
END_OF_FILE
if test 497 -ne `wc -c <'MANIFEST'`; then
    echo shar: \"'MANIFEST'\" unpacked with wrong size!
fi
# end of 'MANIFEST'
fi
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(309 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X#
X#   Makefile for Wyse APL Character Set Download
X#
X#   $Header: Makefile,v 1.0, 89/08/11 11:05:30   Victor Poon
X#
X
XCFLAGS = -O
XREMOVE = rm -f
X
Xall: waplfont cvtfont
X
Xcvtfont: cvtfont.c
X	cc $(CFLAGS) -o cvtfont cvtfont.c
X
Xwaplfont: waplfont.c
X	cc $(CFLAGS) -o waplfont waplfont.c
X
Xclean:
X	$(REMOVE) *.o core
END_OF_FILE
if test 309 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(3979 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
XIntroduction
X------------
X	Since APL is closely integrated into our environment, we were
Xlooking at APL terminals which we could attach to our serial ports.
XMost of the terminals which we looked at were quite expensive and it
Xwas then that I came across the idea of loading an APL font into a
XWyse 60 which we have lying around.
X
X	This set of sources is being released into the public domain. 
XYou can freely distribute it in any way you want.  If you enhance this
Xpackage, I would appreciate it if you can send me the diffs so that I
Xcan add it on to my own stuff.  The code is fairly simple so there
Xshould not be any problems compiling on different flavors of UNIX.
X
X
XWyse 60
X-------
X	The Wyse 60 has four font banks of which you can select a 
Xprimary and secondary bank.  Each bank hold 128 characters and this
Xgives you access to a total of 256 characters which is enough to
Xhold (quad) AV.  Each of the characters is an 8x16 bit-map and can be
Xdescribed as a 40 byte escape sequence.  Even at 2400 baud, it takes
Xless than 30 seconds to download the whole font.
X
X	The escape sequence to define a character looks like the
Xfollowing:
X
X	ESC c A kk pp bb bb ... bb ^Y		( 40 byte sequence )
X
X	where kk is the font bank ("00" - "03"),
X	      pp is the character position ("00" - "FF")
X	      bb is the character bit map for one pixel line (in hex)
X
XAll of the above values are sent to the terminal as a two-byte ASCII.
X
X	The largest problem with the Wyse or any ASCII terminal is that
Xit doesn't support overstriked characters; a unique function of APL
Xthat makes ASCII terminals almost useless for the language.  There isn't
Xany way around this problem unless you happen to have a very intelligent 
Xterminal (like a PC/XT).  However, we use a version of APL for Dyalog
Xwhich allows you to re-map the character set to any set of escape
Xsequences.
X
XHardware Problems:
X
X	o   The Wyse 60 does not seem to be fast enough to keep up
X	    with downloading a font at 9600 baud (w/ XON/XOFF control).
X	    I've included an option flag to add a delay loop which adds
X	    a small delay before sending the next escape sequence.
X
X	o   For some reason, (I haven't talk to Wyse about it yet) the 
X	    screen flickers and switches fonts even when you are NOT 
X	    downloading to the primary and secondary banks.  The screen
X	    returns to normal afterwards but it is quite distrubing to
X	    watch.
X
X
XDyalog APL
X----------
X	Dyalog APL uses an input and output translation table to map
Xthe APL character set.  This is a very convienent feature which allows
XDyalog is work with any terminal as long as you define two things:
X
X	How to display each character in (Quad) AV.
X	What keystroke sequence to input them from the keyboard.
X
XIf anyone would like a copy of the input and output translation tables
Xthat I am using, please drom me some email.
X
X
XSTSC APL
X--------
X	We have an MSDOS version of STSC APL and I don't believe that
Xthis will work with it.  You can get all of the other characters but
Xit will not able to generate the overstriked characters.  We do not own
Xa copy of STSC for UNIX so I'm not in any position to say.  Also, some of
Xthe characters have to be moved around which right now, is not an easy job.
X
X
Xcvtapl and waplfont
X-------------------
X	waplfont is the program which generates the escape sequences for
Xthe Wyse terminals.  There are two flags:
X
X	-p   This generates an printable display of all of the characters.
X	-s   Slow: Adds a delay loop after sending out each character.
X
X	cvtapl changes the printable display to decimal numbers which may
Xbe substituted back into the program with a little work in vi.
X
X
XMe, Myself, and I
X-----------------
X"I freely stole ideas from a number of people who have been good enough to
Xput their stuff out on Usenet."
X
XI stole the above comment from Rich $alz.  Thanks Rich.
X
X	Victor Poon
X	Kepler Financial Management
X	100 North Country Rd.
X	Setauket, NY  11733
X
X	vipoon@sbcs.sunysb.edu
X	{acsm, lilink, polyof, sbcs}!kepler1!vipoon
END_OF_FILE
if test 3979 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'cvtfont.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'cvtfont.c'\"
else
echo shar: Extracting \"'cvtfont.c'\" \(2639 characters\)
sed "s/^X//" >'cvtfont.c' <<'END_OF_FILE'
X#ifndef lint
Xstatic	char	c_cvtfont[] = "@(#)cvtfont.c	1.0   08/10/89";
X#endif
X
X/*	Convert Font Display to Decimal Numbers
X**	Author: Victor Poon
X*/
X#include <stdio.h>
X
X
X/*	ASCII to Bit-mapped Character
X**
X**	This takes a row of bits for one character and converts
X** it to a decimal number which represents its bit-mapped value.
X*/
Xatoc(bmap)
Xchar	*bmap;
X{
X	int	i,			/* Loop Counter */
X		bvalue = 128,		/* MSB Value */
X		total = 0;		/* Running Total */
X
X	for (i=0; i<8; i++) {
X		if (*(bmap+i) == '#')
X			total += bvalue;
X		bvalue /= 2;
X	}
X
X	return (unsigned char) total;
X}
X
X/*	Parse A Line
X**
X**	This routine takes each line of eight characters and
X** passes them to the atoc subroutine.  It stores the values
X** in an array to be printed when the entire character is
X** resolved.
X**
X** Note: There is no error checking done here.  It is assumed
X**       that once a character is detected, the next sixteen
X**       lines are error free.
X*/
Xparseline(buf, filep)
Xchar	*buf;
XFILE	*filep;
X{
X	int	i, j,			/* Loop Counters */
X		bitmap[8][16];		/* Decimal Table for 8 chars */
X	char	bits[8][16],		/* One Row of Bits for 8 chars */
X		line[128];		/* Line Buffer */
Xstatic	int	nchars = 0;		/* Character Counter */
X
X				/* 16 rows per character */
X	for (i=0; i<16; i++) {
X		fgets(line, sizeof(line), filep);
X		sscanf(line, "%s %s %s %s %s %s %s %s",
X			bits[0], bits[1], bits[2], bits[3],
X			bits[4], bits[5], bits[6], bits[7]);
X
X				/* 8 characters per row */
X		for (j=0; j<8; j++)
X			bitmap[j][i] = atoc(bits[j]);
X	}
X
X				/* Print what we have */
X	for (i=0; i<8; i++) {
X		printf("%3d: ", nchars++);
X		for (j=0; j<16; j++)
X			printf("%3d ", bitmap[i][j]);
X		printf("\n");
X	}
X}
X
X/*	Main Program
X**
X**	This program reads a line at a time and determines if it is
X** the start of a character map.  The start is detected if the first
X** character in the line is a '.' (period) or a '#' (pound sign).
X**
X** Note: There is really no error checking done in this program and
X**       hopefully, one day I'll have more time to do this correctly.
X*/
Xmain(argc, argv)
Xint	argc;
Xchar	**argv;
X{
X	char	buffer[80];		/* Temp Buffer */
X	FILE	*fp;			/* Pointer to input file */
X
X	switch(argc) {
X	case 1:				/* Take directly for stdin */
X		fp = stdin;
X		break;
X
X	case 2:				/* Open font file */
X		if ((fp = fopen(argv[1], "r")) == NULL) {
X			printf("Error: Cannot open %s for read\n", argv[1]);
X			exit(-1);
X		}
X		break;
X
X	default:			/* Print usage */
X		printf("Usage: cvtfont [fontfile]\n");
X		exit(-1);
X	}
X					/* Read each line */
X	while (fgets(buffer, sizeof(buffer), fp) != NULL)
X		if (*buffer == '.' || *buffer == '#')
X			parseline(buffer, fp);
X
X	fclose(fp);
X}
END_OF_FILE
if test 2639 -ne `wc -c <'cvtfont.c'`; then
    echo shar: \"'cvtfont.c'\" unpacked with wrong size!
fi
# end of 'cvtfont.c'
fi
if test -f 'waplfont.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'waplfont.c'\"
else
echo shar: Extracting \"'waplfont.c'\" \(20646 characters\)
sed "s/^X//" >'waplfont.c' <<'END_OF_FILE'
X#ifndef lint
Xstatic	char c_waplfont[] = "@(#)waplfont.c	1.0   08/10/89";
X#endif
X
X/*	Download an APL Character Set into the Wyse Terminals
X**	Author:  Victor Poon
X*/
X
X#include <stdio.h>
X
X#define	BANK	0			/* Start font load in bank # */
X#define	DELAY	75000			/* Delay between sending chars */
X
X					/* APL Character Set */
Xunsigned int	aplfont[256][16] = { 
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, /* 00 */
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, /* 16 */
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, /* 32 */
X{   0,  0, 24, 60, 60, 60, 24, 24, 24,  0, 24, 24,  0,  0,  0,  0 },
X{   0,102,102,102, 36,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,108,108,254,108,108,108,254,108,108,  0,  0,  0,  0 },
X{  24, 24,124,198,194,192,124,  6,  6,134,198,124, 24, 24,  0,  0 },
X{   0,  0,  0,  0,194,198, 12, 24, 48, 96,198,134,  0,  0,  0,  0 },
X{   0,  0, 56,108,108, 56,118,220,204,204,204,118,  0,  0,  0,  0 },
X{   0, 24, 24, 24, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0, 12, 24, 48, 48, 48, 48, 48, 48, 24, 12,  0,  0,  0,  0 },
X{   0,  0, 48, 24, 12, 12, 12, 12, 12, 12, 24, 48,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,102, 60,255, 60,102,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0, 24, 24,126, 24, 24,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 24, 24, 48,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,254,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 24,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  2,  6, 12, 24, 48, 96,192,128,  0,  0,  0,  0 },
X
X{   0,  0, 60,102,195,195,219,219,195,195,102, 60,  0,  0,  0,  0 }, /* 48 */
X{   0,  0, 24, 56,120, 24, 24, 24, 24, 24, 24,126,  0,  0,  0,  0 },
X{   0,  0,124,198,  6, 12, 24, 48, 96,192,198,254,  0,  0,  0,  0 },
X{   0,  0,124,198,  6,  6, 60,  6,  6,  6,198,124,  0,  0,  0,  0 },
X{   0,  0, 12, 28, 60,108,204,254, 12, 12, 12, 30,  0,  0,  0,  0 },
X{   0,  0,254,192,192,192,252,  6,  6,  6,198,124,  0,  0,  0,  0 },
X{   0,  0, 56, 96,192,192,252,198,198,198,198,124,  0,  0,  0,  0 },
X{   0,  0,254,198,  6,  6, 12, 24, 48, 48, 48, 48,  0,  0,  0,  0 },
X{   0,  0,124,198,198,198,124,198,198,198,198,124,  0,  0,  0,  0 },
X{   0,  0,124,198,198,198,126,  6,  6,  6, 12,120,  0,  0,  0,  0 },
X{   0,  0,  0,  0, 24, 24,  0,  0,  0, 24, 24,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0, 24, 24,  0,  0,  0, 24, 24, 48,  0,  0,  0,  0 },
X{   0,  0,  0,  6, 12, 24, 48, 96, 48, 24, 12,  6,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,126,  0,  0,126,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0, 96, 48, 24, 12,  6, 12, 24, 48, 96,  0,  0,  0,  0 },
X{   0,  0,124,198,198, 12, 24, 24, 24,  0, 24, 24,  0,  0,  0,  0 },
X
X{   0,  0,  0,124,198,198,222,222,222,220,192,124,  0,  0,  0,  0 }, /* 64 */
X{   0,  0, 16, 56,108,198,198,254,198,198,198,198,  0,  0,  0,  0 },
X{   0,  0,252,102,102,102,124,102,102,102,102,252,  0,  0,  0,  0 },
X{   0,  0, 60,102,194,192,192,192,192,194,102, 60,  0,  0,  0,  0 },
X{   0,  0,248,108,102,102,102,102,102,102,108,248,  0,  0,  0,  0 },
X{   0,  0,254,102, 98,104,120,104, 96, 98,102,254,  0,  0,  0,  0 },
X{   0,  0,254,102, 98,104,120,104, 96, 96, 96,240,  0,  0,  0,  0 },
X{   0,  0, 60,102,194,192,192,222,198,198,102, 58,  0,  0,  0,  0 },
X{   0,  0,198,198,198,198,254,198,198,198,198,198,  0,  0,  0,  0 },
X{   0,  0, 60, 24, 24, 24, 24, 24, 24, 24, 24, 60,  0,  0,  0,  0 },
X{   0,  0, 30, 12, 12, 12, 12, 12,204,204,204,120,  0,  0,  0,  0 },
X{   0,  0,230,102,102,108,120,120,108,102,102,230,  0,  0,  0,  0 },
X{   0,  0,240, 96, 96, 96, 96, 96, 96, 98,102,254,  0,  0,  0,  0 },
X{   0,  0,195,231,255,255,219,195,195,195,195,195,  0,  0,  0,  0 },
X{   0,  0,198,230,246,254,222,206,198,198,198,198,  0,  0,  0,  0 },
X{   0,  0,124,198,198,198,198,198,198,198,198,124,  0,  0,  0,  0 },
X
X{   0,  0,252,102,102,102,124, 96, 96, 96, 96,240,  0,  0,  0,  0 }, /* 80 */
X{   0,  0,124,198,198,198,198,198,198,214,222,124, 12, 14,  0,  0 },
X{   0,  0,252,102,102,102,124,108,102,102,102,230,  0,  0,  0,  0 },
X{   0,  0,124,198,198, 96, 56, 12,  6,198,198,124,  0,  0,  0,  0 },
X{   0,  0,255,219,153, 24, 24, 24, 24, 24, 24, 60,  0,  0,  0,  0 },
X{   0,  0,198,198,198,198,198,198,198,198,198,124,  0,  0,  0,  0 },
X{   0,  0,195,195,195,195,195,195,195,102, 60, 24,  0,  0,  0,  0 },
X{   0,  0,195,195,195,195,195,219,219,255,102,102,  0,  0,  0,  0 },
X{   0,  0,195,195,102, 60, 24, 24, 60,102,195,195,  0,  0,  0,  0 },
X{   0,  0,195,195,195,102, 60, 24, 24, 24, 24, 60,  0,  0,  0,  0 },
X{   0,  0,255,195,134, 12, 24, 48, 96,193,195,255,  0,  0,  0,  0 },
X{   0,  0, 60, 48, 48, 48, 48, 48, 48, 48, 48, 60,  0,  0,  0,  0 },
X{   0,  0,  0,128,192,224,112, 56, 28, 14,  6,  2,  0,  0,  0,  0 },
X{   0,  0, 60, 12, 12, 12, 12, 12, 12, 12, 12, 60,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0, 16, 56,108,198,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,  0,  0 },
X
X{  48, 48, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, /* 96 */
X{   0,  0,  0,  0,  0,120, 12,124,204,204,204,118,  0,  0,  0,  0 },
X{   0,  0,224, 96, 96,120,108,102,102,102,102,124,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,124,198,192,192,192,198,124,  0,  0,  0,  0 },
X{   0,  0, 28, 12, 12, 60,108,204,204,204,204,118,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,124,198,254,192,192,198,124,  0,  0,  0,  0 },
X{   0,  0, 56,108,100, 96,240, 96, 96, 96, 96,240,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,118,204,204,204,204,204,124, 12,204,120,  0 },
X{   0,  0,224, 96, 96,108,118,102,102,102,102,230,  0,  0,  0,  0 },
X{   0,  0, 24, 24,  0, 56, 24, 24, 24, 24, 24, 60,  0,  0,  0,  0 },
X{   0,  0,  6,  6,  0, 14,  6,  6,  6,  6,  6,  6,102,102, 60,  0 },
X{   0,  0,224, 96, 96,102,108,120,120,108,102,230,  0,  0,  0,  0 },
X{   0,  0, 56, 24, 24, 24, 24, 24, 24, 24, 24, 60,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,230,255,219,219,219,219,219,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,220,102,102,102,102,102,102,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,124,198,198,198,198,198,124,  0,  0,  0,  0 },
X
X{   0,  0,  0,  0,  0,220,102,102,102,102,102,124, 96, 96,240,  0 }, /* 112 */
X{   0,  0,  0,  0,  0,118,204,204,204,204,204,124, 12, 12, 30,  0 },
X{   0,  0,  0,  0,  0,220,118,102, 96, 96, 96,240,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,124,198, 96, 56, 12,198,124,  0,  0,  0,  0 },
X{   0,  0, 16, 48, 48,252, 48, 48, 48, 48, 54, 28,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,204,204,204,204,204,204,118,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,195,195,195,195,102, 60, 24,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,195,195,195,219,219,255,102,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,195,102, 60, 24, 60,102,195,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,198,198,198,198,198,198,126,  6, 12,248,  0 },
X{   0,  0,  0,  0,  0,254,204, 24, 48, 96,198,254,  0,  0,  0,  0 },
X{   0,  0, 14, 24, 24, 24,112, 24, 24, 24, 24, 14,  0,  0,  0,  0 },
X{   0,  0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0 },
X{   0,  0,112, 24, 24, 24, 14, 24, 24, 24, 24,112,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0, 96,146, 12,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0, 16, 40, 68,130,254,  0,  0,  0,  0,  0,  0,  0 },
X
X{   0,  0,  0,  0, 16, 40, 68,130,254,  0,  0,  0,  0,255,  0,  0 }, /* 128 */
X{   0,  0, 16, 56,108,198,198,254,198,198,198,198,  0,255,  0,  0 },
X{   0,  0,252,102,102,102,124,102,102,102,102,252,  0,255,  0,  0 },
X{   0,  0, 60,102,194,192,192,192,192,194,102, 60,  0,255,  0,  0 },
X{   0,  0,248,108,102,102,102,102,102,102,108,248,  0,255,  0,  0 },
X{   0,  0,254,102, 98,104,120,104, 96, 98,102,254,  0,255,  0,  0 },
X{   0,  0,254,102, 98,104,120,104, 96, 96, 96,240,  0,255,  0,  0 },
X{   0,  0, 60,102,194,192,192,222,198,198,102, 58,  0,255,  0,  0 },
X{   0,  0,198,198,198,198,254,198,198,198,198,198,  0,255,  0,  0 },
X{   0,  0, 60, 24, 24, 24, 24, 24, 24, 24, 24, 60,  0,255,  0,  0 },
X{   0,  0, 30, 12, 12, 12, 12, 12,204,204,204,120,  0,255,  0,  0 },
X{   0,  0,230,102,102,108,120,120,108,102,102,230,  0,255,  0,  0 },
X{   0,  0,240, 96, 96, 96, 96, 96, 96, 98,102,254,  0,255,  0,  0 },
X{   0,  0,195,231,255,255,219,195,195,195,195,195,  0,255,  0,  0 },
X{   0,  0,198,230,246,254,222,206,198,198,198,198,  0,255,  0,  0 },
X{   0,  0,124,198,198,198,198,198,198,198,198,124,  0,255,  0,  0 },
X
X{   0,  0,252,102,102,102,124, 96, 96, 96, 96,240,  0,255,  0,  0 }, /* 144 */
X{   0,  0,124,198,198,198,198,198,198,214,222,124, 12,255,  0,  0 },
X{   0,  0,252,102,102,102,124,108,102,102,102,230,  0,255,  0,  0 },
X{   0,  0,124,198,198, 96, 56, 12,  6,198,198,124,  0,255,  0,  0 },
X{   0,  0,255,219,153, 24, 24, 24, 24, 24, 24, 60,  0,255,  0,  0 },
X{   0,  0,198,198,198,198,198,198,198,198,198,124,  0,255,  0,  0 },
X{   0,  0,195,195,195,195,195,195,195,102, 60, 24,  0,255,  0,  0 },
X{   0,  0,195,195,195,195,195,219,219,255,102,102,  0,255,  0,  0 },
X{   0,  0,195,195,102, 60, 24, 24, 60,102,195,195,  0,255,  0,  0 },
X{   0,  0,195,195,195,102, 60, 24, 24, 24, 24, 60,  0,255,  0,  0 },
X{   0,  0,255,195,134, 12, 24, 48, 96,193,195,255,  0,255,  0,  0 },
X{   0, 24, 24,126,195,192,192,192,195,126, 24, 24,  0,  0,  0,  0 },
X{   0, 56,108,100, 96,240, 96, 96, 96, 96,230,252,  0,  0,  0,  0 },
X{   0,  0,254,130,130,130,130,130,130,130,130,254,  0,  0,  0,  0 },
X{   0,  0,254,146,146,146,130,130,130,130,130,254,  0,  0,  0,  0 },
X{   0,  0,254,130,146,130,254,254,130,146,130,254,  0,  0,  0,  0 },
X
X{   0,  0, 24, 60,126, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0 }, /* 160 */
X{   0,  0, 24, 24, 24, 24, 24, 24, 24,126, 60, 24,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0, 48, 96,254, 96, 48,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0, 24, 12,254, 12, 24,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0, 16, 16, 16, 16,124,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,124, 16, 16, 16, 16,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0, 64, 64,124, 64, 64,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  4,  4,124,  4,  4,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0, 16, 16, 56, 84, 84, 56, 16,254,  0,  0,  0,  0,  0 },
X{   0,  0,  0,254, 16, 56, 84, 84, 56, 16, 16,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  2,  4,  8,254, 32, 64,128,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,128, 64, 32,254,  8,  4,  2,  0,  0,  0,  0,  0 },
X{   0,  0, 16, 16, 16, 56, 84,146,254, 16, 16,  0,  0,  0,  0,  0 },
X{   0,  0, 16, 16,254,146, 84, 56, 16, 16, 16,  0,  0,  0,  0,  0 },
X{   0,  0,130, 68, 40, 16,  0,  0, 96,146, 12,  0,  0,  0,  0,  0 },
X{   0,  0, 16, 40, 68,130,  0,  0, 96,146, 12,  0,  0,  0,  0,  0 },
X
X{   0,  0,  0,  0,124,128,128,128,124,  0,  0,  0,  0,  0,  0,  0 }, /* 176 */
X{   0,  0,  0,  0,124,  2,  2,  2,124,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0, 68, 68, 68, 68, 68, 56,  0,  0,  0,  0,  0,  0,  0 },
X{  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 },
X{  24, 24, 24, 24, 24, 24, 24,248, 24, 24, 24, 24, 24, 24, 24, 24 },
X{  24, 24, 24, 24, 24,248, 24,248, 24, 24, 24, 24, 24, 24, 24, 24 },
X{  54, 54, 54, 54, 54, 54, 54,246, 54, 54, 54, 54, 54, 54, 54, 54 },
X{   0,  0,  0,  0,  0,  0,  0,254, 54, 54, 54, 54, 54, 54, 54, 54 },
X{   0,  0,  0,  0,  0,248, 24,248, 24, 24, 24, 24, 24, 24, 24, 24 },
X{  54, 54, 54, 54, 54,246,  6,246, 54, 54, 54, 54, 54, 54, 54, 54 },
X{  54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54 },
X{   0,  0,  0,  0,  0,254,  6,246, 54, 54, 54, 54, 54, 54, 54, 54 },
X{  54, 54, 54, 54, 54,246,  6,254,  0,  0,  0,  0,  0,  0,  0,  0 },
X{  54, 54, 54, 54, 54, 54, 54,254,  0,  0,  0,  0,  0,  0,  0,  0 },
X{  24, 24, 24, 24, 24,248, 24,248,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,248, 24, 24, 24, 24, 24, 24, 24, 24 },
X
X{  24, 24, 24, 24, 24, 24, 24, 31,  0,  0,  0,  0,  0,  0,  0,  0 }, /* 192 */
X{  24, 24, 24, 24, 24, 24, 24,255,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0,255, 24, 24, 24, 24, 24, 24, 24, 24 },
X{  24, 24, 24, 24, 24, 24, 24, 31, 24, 24, 24, 24, 24, 24, 24, 24 },
X{   0,  0,  0,  0,  0,  0,  0,255,  0,  0,  0,  0,  0,  0,  0,  0 },
X{  24, 24, 24, 24, 24, 24, 24,255, 24, 24, 24, 24, 24, 24, 24, 24 },
X{  24, 24, 24, 24, 24, 31, 24, 31, 24, 24, 24, 24, 24, 24, 24, 24 },
X{  54, 54, 54, 54, 54, 54, 54, 55, 54, 54, 54, 54, 54, 54, 54, 54 },
X{  54, 54, 54, 54, 54, 55, 48, 63,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0, 63, 48, 55, 54, 54, 54, 54, 54, 54, 54, 54 },
X{  54, 54, 54, 54, 54,247,  0,255,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,255,  0,247, 54, 54, 54, 54, 54, 54, 54, 54 },
X{  54, 54, 54, 54, 54, 55, 48, 55, 54, 54, 54, 54, 54, 54, 54, 54 },
X{   0,  0,  0,  0,  0,255,  0,255,  0,  0,  0,  0,  0,  0,  0,  0 },
X{  54, 54, 54, 54, 54,247,  0,247, 54, 54, 54, 54, 54, 54, 54, 54 },
X{  24, 24, 24, 24, 24,255,  0,255,  0,  0,  0,  0,  0,  0,  0,  0 },
X
X{  54, 54, 54, 54, 54, 54, 54,255,  0,  0,  0,  0,  0,  0,  0,  0 }, /* 208 */
X{   0,  0,  0,  0,  0,255,  0,255, 24, 24, 24, 24, 24, 24, 24, 24 },
X{   0,  0,  0,  0,  0,  0,  0,255, 54, 54, 54, 54, 54, 54, 54, 54 },
X{  54, 54, 54, 54, 54, 54, 54, 63,  0,  0,  0,  0,  0,  0,  0,  0 },
X{  24, 24, 24, 24, 24, 31, 24, 31,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0, 31, 24, 31, 24, 24, 24, 24, 24, 24, 24, 24 },
X{   0,  0,  0,  0,  0,  0,  0, 63, 54, 54, 54, 54, 54, 54, 54, 54 },
X{  54, 54, 54, 54, 54, 54, 54,255, 54, 54, 54, 54, 54, 54, 54, 54 },
X{  24, 24, 24, 24, 24,255, 24,255, 24, 24, 24, 24, 24, 24, 24, 24 },
X{  24, 24, 24, 24, 24, 24, 24,248,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,  0, 31, 24, 24, 24, 24, 24, 24, 24, 24 },
X{ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 },
X{   0,  0,  0,  0,  0,  0,  0,255,255,255,255,255,255,255,255,255 },
X{ 240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240 },
X{  15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 },
X{ 255,255,255,255,255,255,255,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X
X{   0,  0,  0,  0,  0,118,220,216,216,216,220,118,  0,  0,  0,  0 }, /* 224 */
X{   0,  0,  0,  0,  0,102,195,195,219,219,255,102,  0,  0,  0,  0 },
X{   0,  0,  0,  0, 48,  8,  8,  8,  8,  8,  6,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0, 56, 68, 68,120, 64, 64, 64,128,  0,  0,  0,  0 },
X{   0,  0,  0,  0, 68, 40, 16, 40, 68,  0,  0,  0,  0,  0,  0,  0 },
X{   0,254,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,124, 16, 16, 16,124,  0,  0,  0,  0,  0 },
X{   0, 96,146, 12,  0,254,130, 68, 40, 16,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0, 16, 56, 84,146,146,146, 84, 56, 16,  0,  0,  0,  0 },
X{   0,  0,  0,  0, 56, 68,130,254,130, 68, 56,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,146,124, 84,238, 84,124,146,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0, 56, 68,198,186,130,130,130,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,130, 68, 40, 16,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,184, 68,162,146,138, 68, 58,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0, 60, 64,120, 64, 60,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0, 56, 68, 68, 68, 68, 68,  0,  0,  0,  0,  0,  0,  0 },
X
X{   0,  0,  0,  0,254,  0,  0,254,  0,  0,254,  0,  0,  0,  0,  0 }, /* 240 */
X{   0,  0,  0,  2,254,  4,  8,254, 32, 64,254,128,  0,  0,  0,  0 },
X{   0,  0,  0, 48, 24, 12,  6, 12, 24, 48,  0,126,  0,  0,  0,  0 },
X{   0,  0,  0, 12, 24, 48, 96, 48, 24, 12,  0,126,  0,  0,  0,  0 },
X{   0,  0, 30, 30, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0 },
X{   0,  0, 24, 24, 24, 24, 24, 24, 24, 24, 30, 30,  0,  0,  0,  0 },
X{   0,  0,  0,  0, 24, 24,  0,126,  0, 24, 24,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  2,  4,254, 16,254, 64,128,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0, 56, 68, 68, 56,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0, 56, 68,130,130,130, 68, 56,  0,  0,  0,  0,  0 },
X{   0,  0,122,164,156,132,132,132,132,132,120,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0, 16, 56,124,254,124, 56, 16,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,  0,  0,254,  0,  0, 24,  8, 16,  0,  0,  0,  0 },
X{   0,102,102,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0, 68,  0,  0,  0, 96,146, 12,  0,  0,  0,  0,  0,  0,  0,  0 },
X{   0,  0,  0,  0,254,130, 68, 40, 16,  0,  0,  0,  0,  0,  0,  0 }
X};
X
X
X/*	Load Font Subroutine
X**
X**	This routine sends the escape codes for to define a character
X** in the Wyse 60 Terminals.  Unfortunately, the APL character set takes
X** up more than 128 positions of the ASCII table so two font banks must
X** be loaded.  The Wyse can store up to 4 banks of which two can be used
X** at any one given time.
X*/
Xfontload(delay)
Xint	delay;
X{
X	int	i,			/* Loop Counter */
X		bank,			/* Font Bank */
X		pos,			/* Character Position */
X		bits;			/* One line of bits for the char */
X
X				/* The Wyse 60 takes a second or */
X				/* two to clear the font banks */
X	printf("Clearing font bank %d and %d\n", BANK, BANK+1);
X	printf("\033c?%1d\033c?%1d", BANK, BANK+1);
X	sleep(2);
X
X	printf("Loading fonts\n");
X	for (bank = 0; bank<2; bank++) {
X		printf("Bank %d ", bank+BANK);
X
X		for (pos=0; pos<128; pos++) {
X			printf("\033cA%1d%02X", bank+BANK, pos);
X
X			for(bits=0; bits<16; bits++)
X				printf("%02X", aplfont[pos+bank*128][bits]);
X			printf("\031.");
X
X			fflush(stdout);
X			for (i=0; i<delay; i++)
X				;
X		}
X		printf("\n");
X	}
X}
X
X/*	Print Font Subroutine
X**
X**	This subroutines prints the font out on an ASCII display.
X** The a pound sign (#) denotes a bit/pixel which is on and a
X** period (.) denotes a bit/pixel is off.
X*/
Xfontprint()
X{
X	int	bits,			/* One line of bits for the char */
X		line,			/* Each line of 8 chars */
X		pos,			/* Character Position */
X		row;			/* Each char has 16 rows */
Xunsigned int	ch;			/* Temp storage character */
X
X	for (pos=0; pos<256; pos+=8) {
X
X		for (line=0; line<8; line++)
X			printf("%8d ", pos+line);
X		putchar('\n');
X
X		for (row=0; row<16; row++) {
X			for (line=pos; line<pos+8; line++) {
X				ch = aplfont[line][row];
X				for(bits=0; bits<8; bits++) {
X					if (ch & 0x80)
X						putchar('#');
X					else
X						putchar('.');
X					ch <<= 1;
X				}
X				putchar(' ');
X			}
X			putchar('\n');
X		}
X		putchar('\n');
X	}
X}
X
X/*	Usage - Help
X*/
Xusage(name)
Xchar	*name;
X{
X	printf("Usage: %s [-ps]\n", name);
X	exit(-1);
X}
X
X
X/*	Main Program
X*/
Xmain(argc, argv)
Xint	argc;
Xchar	**argv;
X{
X	switch (argc) {
X	case	1:			/* Load as fast as possible */
X		fontload(0);
X		break;
X
X	case	2:			/* Parse flags */
X		if (*argv[1] != '-')
X			usage(argv[0]);
X
X		switch (*(argv[1]+1)) {
X		case 'p':		/* Print out characters */
X			fontprint();
X			break;
X
X		case 's':		/* Time Delay for 9600 baud */
X			fontload(DELAY);
X			break;
X
X		default:		/* Print Usage message */
X			usage(argv[0]);
X		}
X		break;
X
X	default:
X		usage(argv[0]);
X	}
X}
END_OF_FILE
if test 20646 -ne `wc -c <'waplfont.c'`; then
    echo shar: \"'waplfont.c'\" unpacked with wrong size!
fi
# end of 'waplfont.c'
fi
echo shar: End of shell archive.
exit 0
-- 
Victor I. Poon		{acsm, lilink, polyof, sbcs}!kepler1!vipoon
Kepler Financial Management, Ltd.            vipoon@sbcs.sunysb.edu
It was the best of times, It was the worst of times, ...

vipoon@kepler1.UUCP (Victor I Poon) (08/15/89)

In article <150@kepler1.UUCP> vipoon@kepler1.UUCP (Victor I Poon) writes:
>In article <1070@levels.sait.edu.au> ccdn@levels.sait.edu.au (DAVID NEWALL) writes:
>>How can you download a font into a wyse 50?

	I take it back.  It seems that I was mistaken about the Wyse 50.
I've just recieved some specs from Wyse and the 50 doesn't have the 
"soft" font option that is in the Wyse 60.  Sorry.

Victor
-- 
Victor I. Poon		{acsm, lilink, polyof, sbcs}!kepler1!vipoon
Kepler Financial Management, Ltd.            vipoon@sbcs.sunysb.edu
It was the best of times, It was the worst of times, ...